Coverage for src / mesh / views / forms / submission_forms.py: 72%
75 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-03-10 09:11 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-03-10 09:11 +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_NAME_CKEDITOR_CONFIG,
15)
17from .base_forms import FileModelForm, MeshFormMixin, SubmittableModelForm
18from .fields import CKEditorFormField, FileField
21class SubmissionEditForm(MeshFormMixin, forms.ModelForm):
22 # name = CKEditorFormField(editor_config=SUBMISSION_NAME_CKEDITOR_CONFIG)
23 # abstract = CKEditorFormField(editor_config=SUBMISSION_ABSTRACT_CKEDITOR_CONFIG)
25 def __init__(self, *args, **kwargs):
26 """
27 Remove the `journal_section` field if there's no JournalSection.
28 """
29 super().__init__(*args, **kwargs)
30 if "journal_section" not in self.fields:
31 return
33 journal_sections = JournalSection.objects.exists()
34 if not journal_sections:
35 del self.fields["journal_section"]
38class SubmissionCreateForm(SubmissionEditForm):
39 custom_display = "inline"
41 # name = CKEditorFormField(editor_config=SUBMISSION_NAME_CKEDITOR_CONFIG)
42 # abstract = CKEditorFormField(editor_config=SUBMISSION_ABSTRACT_CKEDITOR_CONFIG)
43 preprint_id = forms.CharField(
44 label=_("Preprint id"),
45 max_length=1024,
46 widget=forms.TextInput(
47 attrs={
48 "placeholder": "(Optional) Enter the id of your preprint: DOI (10...), HAL (hal-...) or arXiv (arXiv:...)"
49 }
50 ),
51 required=False,
52 )
54 class Meta:
55 model = Submission
56 fields = ["journal_section"]
59class SubmissionEditArticleMetadataForm(SubmissionEditForm):
60 # Somehow, we need to declare a CKEditorFormField for the ckeditor fields in VueJS to work (?)
61 name = CKEditorFormField(editor_config=SUBMISSION_NAME_CKEDITOR_CONFIG)
63 # abstract = CKEditorFormField(editor_config=SUBMISSION_ABSTRACT_CKEDITOR_CONFIG)
65 class Meta:
66 model = Submission
67 fields = ["journal_section", "name", "abstract"]
69 def __init__(self, *args, **kwargs):
70 super().__init__(*args, **kwargs)
71 self.with_vuejs = True
74class SubmissionInfoForm(SubmissionEditForm):
75 # # first_name/last_name/email of a suggested reviewer
76 # reviewer_first_name = forms.CharField(
77 # label=_("First name"),
78 # max_length=150,
79 # required=False,
80 # )
81 # reviewer_last_name = forms.CharField(
82 # label=_("Last name"),
83 # max_length=150,
84 # required=False,
85 # )
86 # reviewer_email = forms.EmailField(
87 # label=_("E-mail address"),
88 # required=True,
89 # )
91 class Meta:
92 model = Submission
93 fields = ["journal_section", "author_agreement"]
95 def __init__(self, *args, **kwargs):
96 super().__init__(*args, **kwargs)
98 self.fields["author_agreement"].required = True
101class SubmissionVersionForm(SubmittableModelForm, FileModelForm):
102 custom_display = "inline"
104 main_file = FileField(required=True, label=_("Main file"), model_class=SubmissionMainFile)
106 additional_files = FileField(
107 required=False,
108 label=_("Additional files"),
109 allow_multiple_selected=True,
110 model_class=SubmissionAdditionalFile,
111 )
113 class Meta:
114 model = SubmissionVersion
115 fields = ["main_file", "additional_files"]
117 def __init__(self, *args, submission=None, **kwargs):
118 self.submission = submission
119 super().__init__(*args, **kwargs)
122class SubmissionAuthorForm(MeshFormMixin, forms.ModelForm):
123 custom_display = "inline"
124 submission: Submission
126 class Meta:
127 model = SubmissionAuthor
128 fields = ["first_name", "last_name", "email", "corresponding"]
130 def __init__(self, *args, **kwargs):
131 self.submission = kwargs.pop("submission")
132 super().__init__(*args, **kwargs)
134 def clean_email(self) -> str:
135 """
136 Enforce unique author e-mail per submission.
137 """
138 email = self.cleaned_data["email"]
139 if self.submission.authors.filter(email=email).exists():
140 raise ValidationError(_("There's already an author with the provided e-mail."))
141 return email
144class SubmissionConfirmForm(MeshFormMixin, forms.Form):
145 custom_display = "inline"
147 confirm = forms.BooleanField(label=_("Confirm"), required=True)
150class SubmissionDeleteForm(MeshFormMixin, forms.Form):
151 custom_display = "inline"
153 confirm = forms.BooleanField(label=_("Confirm"), required=True)
156class JournalSectionForm(MeshFormMixin, forms.ModelForm):
157 class Meta:
158 model = JournalSection
159 fields = ["name", "parent"]
161 def __init__(self, *args, **kwargs):
162 parents = kwargs.pop("_parents")
163 super().__init__(*args, **kwargs)
164 self.fields["parent"].queryset = parents