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

1from django import forms 

2from django.core.exceptions import ValidationError 

3from django.utils.translation import gettext_lazy as _ 

4 

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) 

16 

17from .base_forms import FileModelForm, MeshFormMixin, SubmittableModelForm 

18from .fields import CKEditorFormField, FileField 

19 

20 

21class SubmissionEditForm(MeshFormMixin, forms.ModelForm): 

22 # name = CKEditorFormField(editor_config=SUBMISSION_NAME_CKEDITOR_CONFIG) 

23 # abstract = CKEditorFormField(editor_config=SUBMISSION_ABSTRACT_CKEDITOR_CONFIG) 

24 

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 

32 

33 journal_sections = JournalSection.objects.exists() 

34 if not journal_sections: 

35 del self.fields["journal_section"] 

36 

37 

38class SubmissionCreateForm(SubmissionEditForm): 

39 custom_display = "inline" 

40 

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 ) 

53 

54 class Meta: 

55 model = Submission 

56 fields = ["journal_section"] 

57 

58 

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) 

62 

63 # abstract = CKEditorFormField(editor_config=SUBMISSION_ABSTRACT_CKEDITOR_CONFIG) 

64 

65 class Meta: 

66 model = Submission 

67 fields = ["journal_section", "name", "abstract"] 

68 

69 def __init__(self, *args, **kwargs): 

70 super().__init__(*args, **kwargs) 

71 self.with_vuejs = True 

72 

73 

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

90 

91 class Meta: 

92 model = Submission 

93 fields = ["journal_section", "author_agreement"] 

94 

95 def __init__(self, *args, **kwargs): 

96 super().__init__(*args, **kwargs) 

97 

98 self.fields["author_agreement"].required = True 

99 

100 

101class SubmissionVersionForm(SubmittableModelForm, FileModelForm): 

102 custom_display = "inline" 

103 

104 main_file = FileField(required=True, label=_("Main file"), model_class=SubmissionMainFile) 

105 

106 additional_files = FileField( 

107 required=False, 

108 label=_("Additional files"), 

109 allow_multiple_selected=True, 

110 model_class=SubmissionAdditionalFile, 

111 ) 

112 

113 class Meta: 

114 model = SubmissionVersion 

115 fields = ["main_file", "additional_files"] 

116 

117 

118class SubmissionAuthorForm(MeshFormMixin, forms.ModelForm): 

119 custom_display = "inline" 

120 submission: Submission 

121 

122 class Meta: 

123 model = SubmissionAuthor 

124 fields = ["first_name", "last_name", "email", "corresponding"] 

125 

126 def __init__(self, *args, **kwargs): 

127 self.submission = kwargs.pop("submission") 

128 super().__init__(*args, **kwargs) 

129 

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 

138 

139 

140class SubmissionConfirmForm(MeshFormMixin, forms.Form): 

141 custom_display = "inline" 

142 

143 confirm = forms.BooleanField(label=_("Confirm"), required=True) 

144 

145 

146class SubmissionDeleteForm(MeshFormMixin, forms.Form): 

147 custom_display = "inline" 

148 

149 confirm = forms.BooleanField(label=_("Confirm"), required=True) 

150 

151 

152class JournalSectionForm(MeshFormMixin, forms.ModelForm): 

153 class Meta: 

154 model = JournalSection 

155 fields = ["name", "parent"] 

156 

157 def __init__(self, *args, **kwargs): 

158 parents = kwargs.pop("_parents") 

159 super().__init__(*args, **kwargs) 

160 self.fields["parent"].queryset = parents