Coverage for src / mesh / views / model_proxy / submission_proxy.py: 66%

71 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-03-10 09:11 +0000

1from __future__ import annotations 

2 

3from typing import TYPE_CHECKING 

4 

5from mesh.model.roles.role_handler import RoleVisitor 

6 

7from ...models.submission_models import Submission, SubmissionState 

8from ...views import model_proxy 

9from ...views.components.review_summary import build_review_summary 

10from ...views.components.submission_tooltip import build_submission_tooltip 

11from ..components.button import build_submission_actions 

12from .model_proxy import RoleModelProxy 

13 

14# Require for type hint with __future__.annotations 

15if TYPE_CHECKING: 

16 from ...model.submission_status import SubmissionStatusData 

17 

18 

19class SubmissionProxy(RoleModelProxy): 

20 """ 

21 Proxy for the `Submission` model with restricted data according to the user role. 

22 """ 

23 

24 model = Submission 

25 _instance: Submission 

26 

27 def __eq__(self, other): 

28 """Overrides the default implementation""" 

29 if isinstance(other, Submission): 

30 return self._instance == other 

31 return self == other 

32 

33 @property 

34 def authors(self): 

35 if not self._role_handler.check_rights("can_access_submission_author", self._instance): 

36 return None 

37 return self._instance.all_authors 

38 

39 @property 

40 def authors_string(self): 

41 if not self._role_handler.check_rights("can_access_submission_author", self._instance): 

42 return "**** ****" 

43 

44 authors = self._instance.all_authors 

45 return ", ".join([f"{a.first_name[0]}. {a.last_name}" for a in authors]) 

46 

47 @property 

48 def created_by(self): 

49 if self._role_handler.check_rights("can_access_submission_author", self._instance): 

50 return str(self._instance.created_by) 

51 

52 return "**** ****" 

53 

54 @property 

55 def all_versions( 

56 self, 

57 ) -> list[model_proxy.submission_version_proxy.SubmissionVersionProxy]: 

58 versions = self._instance.all_versions 

59 

60 allowed_versions = [] 

61 for version in versions: 

62 if self._role_handler.check_rights("can_access_version", version): 

63 submission_version_proxy = ( 

64 model_proxy.submission_version_proxy.SubmissionVersionProxy( 

65 version, self._role_handler 

66 ) 

67 ) 

68 allowed_versions.append(submission_version_proxy) 

69 

70 return allowed_versions 

71 

72 @property 

73 def versions(self): 

74 return self.all_versions 

75 

76 @property 

77 def status(self) -> SubmissionStatusData: 

78 return self._role_handler.get_from_rights("get_submission_status", self._instance) 

79 

80 

81class BuildSubmissionProxyVisitor(RoleVisitor): 

82 """ " 

83 Returns a SubmissionProxy based on the role 

84 Augments the interface with widgets to be displayed according to the role (ex: ReviewSummary) 

85 """ 

86 

87 def __init__(self, role_handler, *args, **kwargs): 

88 # self.display_as_btn = kwargs.pop("display_as_btn", True) 

89 # self.reload_page = kwargs.pop("reload_page", False) 

90 super().__init__(role_handler, *args, **kwargs) 

91 

92 def visit(self, role, submission, *args, **kwargs): 

93 self.submission_proxy = SubmissionProxy(submission, self.role_handler) 

94 self.submission_proxy.row_id = kwargs.get("row_id", "") 

95 

96 kwargs["reload_id"] = kwargs.get("row_id", "") 

97 self.submission_proxy.action_lists = build_submission_actions( 

98 submission, self.role_handler, *args, **kwargs 

99 ) 

100 self.submission_proxy.all_logs = submission.log_messages.order_by("-date_created") 

101 

102 return super().visit(role, submission, *args, **kwargs) 

103 

104 def visit_author(self, submission, *args, **kwargs): 

105 return self.submission_proxy 

106 

107 def visit_editor(self, submission, *args, **kwargs): 

108 if self.role_handler.check_rights("can_access_submission", submission): 

109 tooltip = build_submission_tooltip(submission) 

110 self.submission_proxy.tooltip = tooltip 

111 

112 if ( 

113 self.role_handler.check_rights("can_access_submission", submission) 

114 and submission.current_version 

115 and submission.state == SubmissionState.ON_REVIEW.value 

116 ): 

117 review_summary = build_review_summary(submission) 

118 self.submission_proxy.review_summary = review_summary 

119 

120 return self.submission_proxy 

121 

122 def visit_journal_manager(self, submission, *args, **kwargs): 

123 return self.visit_editor(submission, *args, **kwargs) 

124 

125 def visit_reviewer(self, submission, *args, **kwargs): 

126 return self.submission_proxy