134 lines
4.9 KiB
Python

from django.shortcuts import render, get_object_or_404, redirect, resolve_url
from markdown2 import markdown
from datetime import datetime
from urllib.parse import urlparse
from . import models, forms
from .decorators import check_allowed
from base64 import b64decode
import logging
logger = logging.getLogger(__name__)
def forbidden(request):
return render(request, 'interface/forbidden.html', {})
def register(request):
request.ensemble_id = request.session.get('ensemble')
registered = request.session.setdefault('registered', {})
if request.method == "POST":
form = forms.CodeForm(request.POST)
if form.is_valid():
data = form.cleaned_data
try:
ensemble = models.Ensemble.objects.get(code=data['code'].replace('-', ''))
if ensemble.passphrase == data['passphrase']:
request.session['ensemble'] = ensemble.pk
registered[ensemble.code] = ensemble.pk
return redirect('my_projects')
except models.Ensemble.DoesNotExist:
form.add_error(None, "Incorrect code or passphrase")
else:
form = forms.CodeForm(initial=request.GET)
current = models.Ensemble.objects.filter(pk__in=registered.values())
return render(request, 'interface/register.html', {'form': form, 'current': current})
@check_allowed
def my_projects(request):
ensemble = get_object_or_404(models.Ensemble, pk=request.ensemble_id)
context = {'ensemble': ensemble}
return render(request, 'interface/project_list.html', context)
@check_allowed
def project_page(request, project_id):
project = get_object_or_404(models.Project, pk=project_id, ensemble_id=request.ensemble_id)
context = {'project': project}
return render(request, 'interface/project.html', context)
@check_allowed
def wiki_page(request, project_id, wiki_id):
wiki = get_object_or_404(models.WikiPage, pk=wiki_id, project=project_id, project__ensemble=request.ensemble_id)
context = {'project': wiki.project, 'wiki': wiki, 'wiki_html': markdown(wiki.markdown)}
return render(request, 'interface/wiki.html', context)
@check_allowed
def create_submission(request, project_id):
project = get_object_or_404(models.Project, pk=project_id, ensemble=request.ensemble_id)
if request.method == 'POST':
form = forms.SubmissionForm(request.POST)
if form.is_valid():
s = form.save(commit=False)
s.project_id = project_id
s.save()
# cache details for next time
request.session['name'] = s.name
request.session['instrument'] = s.instrument
return redirect('submission', project_id=project_id, submission_id=s.pk)
else:
initial = { k: request.session.get(k) for k in ('name', 'instrument') }
form = forms.SubmissionForm(initial=initial)
context = {'project': project, 'form': form}
return render(request, 'interface/submission_create.html', context)
@check_allowed
def submission(request, project_id, submission_id):
project = get_object_or_404(models.Project, pk=project_id, ensemble=request.ensemble_id)
submission = project.all_submissions.get(pk=submission_id)
if submission.complete:
context = {'project': project, 'submission': submission}
if request.user.is_authenticated:
context['download'] = submission.presigned_url()
return render(request, 'interface/submission_detail.html', context)
# Need to do an upload
redirect = request.build_absolute_uri(resolve_url('complete_submission', project_id=project.pk, submission_id=submission.pk))
key = submission.key_template()
upload = project.presigned_post(key,
fields={'success_action_redirect': redirect},
conditions=[["starts-with", "$success_action_redirect", ""]])
# need an additional presigned without the redirect for ajax submission
ajax_post = project.presigned_post(key)
context = {'upload': upload, 'ajax_post': ajax_post, 'project': project, 'submission': submission}
return render(request, 'interface/submission_upload.html', context)
@check_allowed
def cancel_submission(request, project_id, submission_id):
project = get_object_or_404(models.Project, pk=project_id, ensemble=request.ensemble_id)
submission = project.all_submissions.get(pk=submission_id)
submission.delete()
return redirect('project', project_id=project_id)
@check_allowed
def complete_submission(request, project_id, submission_id):
project = get_object_or_404(models.Project, pk=project_id, ensemble=request.ensemble_id)
s = project.all_submissions.get(pk=submission_id)
s.complete = True
uri = urlparse(request.GET['location'])
s.key = uri.path[1:]
s.save()
return redirect('submission', project_id=project_id, submission_id=submission_id)