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

1import logging 

2 

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 

15 

16from baibu.users.consent import consent_required 

17from baibu.users.models import ConsentRecord 

18 

19from .forms import SubmissionForm 

20from .forms import language_choices 

21from .models import Submission 

22from .services import DuplicateSubmissionError 

23from .services import create_submission 

24 

25logger = logging.getLogger(__name__) 

26 

27 

28def _consent_required(view): 

29 return consent_required(ConsentRecord.Tier.EVAL_ONLY, scope=settings.SUBMISSION_CONSENT_SCOPE)(view) 

30 

31 

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}) 

54 

55 

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}) 

64 

65 

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")