Coverage for src/mesh/views/forms/submission_forms.py: 65%
62 statements
« prev ^ index » next coverage.py v7.7.0, created at 2025-04-28 07:45 +0000
« prev ^ index » next coverage.py v7.7.0, created at 2025-04-28 07:45 +0000
1from django import forms
2from django.core.exceptions import ValidationError
3from django.utils.translation import gettext_lazy as _
5from mesh.models.journal_models import JournalSection
6from mesh.models.submission_models import (
7 Submission,
8 SubmissionAdditionalFile,
9 SubmissionAuthor,
10 SubmissionMainFile,
11 SubmissionVersion,
12)
13from mesh.views.components.ckeditor_config import (
14 SUBMISSION_ABSTRACT_CKEDITOR_CONFIG,
15 SUBMISSION_NAME_CKEDITOR_CONFIG,
16)
18from .base_forms import FileModelForm, MeshFormMixin, SubmittableModelForm
19from .fields import CKEditorFormField, FileField
22class SubmissionEditForm(MeshFormMixin, forms.ModelForm):
23 name = CKEditorFormField(editor_config=SUBMISSION_NAME_CKEDITOR_CONFIG)
24 abstract = CKEditorFormField(editor_config=SUBMISSION_ABSTRACT_CKEDITOR_CONFIG)
26 def __init__(self, *args, **kwargs):
27 """
28 Remove the `journal_section` field if there's no JournalSection.
29 """
30 super().__init__(*args, **kwargs)
31 if "journal_section" not in self.fields:
32 return
34 journal_sections = JournalSection.objects.exists()
35 if not journal_sections:
36 del self.fields["journal_section"]
39class SubmissionCreateForm(SubmissionEditForm):
40 class Meta:
41 model = Submission
42 fields = ["journal_section", "name", "abstract", "author_agreement"]
44 def __init__(self, *args, **kwargs):
45 super().__init__(*args, **kwargs)
47 self.fields["author_agreement"].required = True
48 self.fields["name"].label = "Title"
51class SubmissionUpdateForm(SubmissionEditForm):
52 class Meta:
53 model = Submission
54 fields = ["journal_section", "name", "abstract"]
57class SubmissionVersionForm(SubmittableModelForm, FileModelForm):
58 custom_display = "inline"
60 main_file = FileField(required=True, label=_("Main file"), model_class=SubmissionMainFile)
62 additional_files = FileField(
63 required=False,
64 label=_("Additional files"),
65 allow_multiple_selected=True,
66 model_class=SubmissionAdditionalFile,
67 )
69 class Meta:
70 model = SubmissionVersion
71 fields = ["main_file", "additional_files"]
74class SubmissionAuthorForm(MeshFormMixin, forms.ModelForm):
75 custom_display = "inline"
76 submission: Submission
78 class Meta:
79 model = SubmissionAuthor
80 fields = ["first_name", "last_name", "email", "corresponding"]
82 def __init__(self, *args, **kwargs):
83 self.submission = kwargs.pop("submission")
84 super().__init__(*args, **kwargs)
86 def clean_email(self) -> str:
87 """
88 Enforce unique author e-mail per submission.
89 """
90 email = self.cleaned_data["email"]
91 if self.submission.authors.filter(email=email).exists(): # type:ignore
92 raise ValidationError(_("There's already an author with the provided e-mail."))
93 return email
96class SubmissionConfirmForm(MeshFormMixin, forms.Form):
97 custom_display = "inline"
99 confirm = forms.BooleanField(label=_("Confirm"), required=True)
102class JournalSectionForm(MeshFormMixin, forms.ModelForm):
103 class Meta:
104 model = JournalSection
105 fields = ["name", "parent"]
107 def __init__(self, *args, **kwargs):
108 parents = kwargs.pop("_parents")
109 super().__init__(*args, **kwargs)
110 self.fields["parent"].queryset = parents