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

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_ABSTRACT_CKEDITOR_CONFIG, 

15 SUBMISSION_NAME_CKEDITOR_CONFIG, 

16) 

17 

18from .base_forms import FileModelForm, MeshFormMixin, SubmittableModelForm 

19from .fields import CKEditorFormField, FileField 

20 

21 

22class SubmissionEditForm(MeshFormMixin, forms.ModelForm): 

23 name = CKEditorFormField(editor_config=SUBMISSION_NAME_CKEDITOR_CONFIG) 

24 abstract = CKEditorFormField(editor_config=SUBMISSION_ABSTRACT_CKEDITOR_CONFIG) 

25 

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 

33 

34 journal_sections = JournalSection.objects.exists() 

35 if not journal_sections: 

36 del self.fields["journal_section"] 

37 

38 

39class SubmissionCreateForm(SubmissionEditForm): 

40 class Meta: 

41 model = Submission 

42 fields = ["journal_section", "name", "abstract", "author_agreement"] 

43 

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

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

46 

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

48 self.fields["name"].label = "Title" 

49 

50 

51class SubmissionUpdateForm(SubmissionEditForm): 

52 class Meta: 

53 model = Submission 

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

55 

56 

57class SubmissionVersionForm(SubmittableModelForm, FileModelForm): 

58 custom_display = "inline" 

59 

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

61 

62 additional_files = FileField( 

63 required=False, 

64 label=_("Additional files"), 

65 allow_multiple_selected=True, 

66 model_class=SubmissionAdditionalFile, 

67 ) 

68 

69 class Meta: 

70 model = SubmissionVersion 

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

72 

73 

74class SubmissionAuthorForm(MeshFormMixin, forms.ModelForm): 

75 custom_display = "inline" 

76 submission: Submission 

77 

78 class Meta: 

79 model = SubmissionAuthor 

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

81 

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

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

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

85 

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 

94 

95 

96class SubmissionConfirmForm(MeshFormMixin, forms.Form): 

97 custom_display = "inline" 

98 

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

100 

101 

102class JournalSectionForm(MeshFormMixin, forms.ModelForm): 

103 class Meta: 

104 model = JournalSection 

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

106 

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

108 parents = kwargs.pop("_parents") 

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

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