Coverage for baibu/submissions/views.py: 100%
55 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-10-06 13:07 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-10-06 13:07 +0000
1import logging
3from django.conf import settings
4from django.contrib import messages
5from django.contrib.auth.decorators import login_required
6from django.http import HttpRequest
7from django.http import HttpResponse
8from django.shortcuts import get_object_or_404
9from django.shortcuts import redirect
10from django.shortcuts import render
11from django.utils.translation import gettext_lazy as _
12from django.views.decorators.cache import cache_control
13from django.views.decorators.http import require_http_methods
14from django.views.decorators.http import require_POST
16from baibu.users.consent import consent_required
17from baibu.users.models import ConsentRecord
19from .forms import SubmissionForm
20from .forms import language_choices
21from .models import Submission
22from .services import DuplicateSubmissionError
23from .services import create_submission
25logger = logging.getLogger(__name__)
28def _consent_required(view):
29 return consent_required(ConsentRecord.Tier.EVAL_ONLY, scope=settings.SUBMISSION_CONSENT_SCOPE)(view)
32@login_required
33@_consent_required
34@cache_control(private=True, no_store=True)
35@require_http_methods(["GET", "POST"])
36def submission_create(request: HttpRequest) -> HttpResponse:
37 form = SubmissionForm(request.POST or None)
38 if request.method == "POST" and form.is_valid():
39 try:
40 create_submission(
41 user=request.user,
42 raw_text=form.cleaned_data["text"],
43 language_code=form.cleaned_data["language_code"],
44 )
45 except DuplicateSubmissionError:
46 form.add_error("text", _("This text has already been submitted."))
47 except Exception:
48 logger.exception("Could not store a submission")
49 form.add_error(None, _("We could not save your writing just now. Please try again later."))
50 else:
51 messages.success(request, _("Thank you. Your writing was received and will be checked shortly."))
52 return redirect("submissions:list")
53 return render(request, "submissions/create.html", {"form": form})
56@login_required
57@cache_control(private=True, no_store=True)
58def submission_list(request: HttpRequest) -> HttpResponse:
59 names = dict(language_choices())
60 submissions = list(Submission.objects.filter(user=request.user))
61 for submission in submissions:
62 submission.language_name = names.get(submission.language_code, submission.language_code)
63 return render(request, "submissions/list.html", {"submissions": submissions})
66@login_required
67@require_POST
68def submission_delete(request: HttpRequest, pk) -> HttpResponse:
69 submission = get_object_or_404(Submission, pk=pk, user=request.user)
70 submission.delete()
71 messages.success(request, _("Your submission was deleted."))
72 return redirect("submissions:list")