Coverage for src/mesh/views/forms/submission_forms.py: 68%
72 statements
« prev ^ index » next coverage.py v7.9.0, created at 2025-09-10 11:20 +0000
« prev ^ index » next coverage.py v7.9.0, created at 2025-09-10 11:20 +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"]
118class SubmissionAuthorForm(MeshFormMixin, forms.ModelForm):
119 custom_display = "inline"
120 submission: Submission
122 class Meta:
123 model = SubmissionAuthor
124 fields = ["first_name", "last_name", "email", "corresponding"]
126 def __init__(self, *args, **kwargs):
127 self.submission = kwargs.pop("submission")
128 super().__init__(*args, **kwargs)
130 def clean_email(self) -> str:
131 """
132 Enforce unique author e-mail per submission.
133 """
134 email = self.cleaned_data["email"]
135 if self.submission.authors.filter(email=email).exists(): # type:ignore
136 raise ValidationError(_("There's already an author with the provided e-mail."))
137 return email
140class SubmissionConfirmForm(MeshFormMixin, forms.Form):
141 custom_display = "inline"
143 confirm = forms.BooleanField(label=_("Confirm"), required=True)
146class SubmissionDeleteForm(MeshFormMixin, forms.Form):
147 custom_display = "inline"
149 confirm = forms.BooleanField(label=_("Confirm"), required=True)
152class JournalSectionForm(MeshFormMixin, forms.ModelForm):
153 class Meta:
154 model = JournalSection
155 fields = ["name", "parent"]
157 def __init__(self, *args, **kwargs):
158 parents = kwargs.pop("_parents")
159 super().__init__(*args, **kwargs)
160 self.fields["parent"].queryset = parents