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)