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

74 statements  

« prev     ^ index     » next       coverage.py v7.7.0, created at 2025-04-28 07:45 +0000

1from __future__ import annotations 

2 

3from functools import cached_property 

4from typing import TYPE_CHECKING 

5 

6from mesh.model.roles.role_handler import RoleVisitor 

7 

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

9from ...views import model_proxy 

10from ...views.components.review_summary import build_review_summary 

11from ...views.components.submission_tooltip import build_submission_tooltip 

12from ..components.button import build_submission_actions 

13from .model_proxy import RoleModelProxy 

14 

15# Require for type hint with __future__.annotations 

16if TYPE_CHECKING: 16 ↛ 17line 16 didn't jump to line 17 because the condition on line 16 was never true

17 from ...model.submission_status import SubmissionStatusData 

18 

19 

20class SubmissionProxy(RoleModelProxy): 

21 """ 

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

23 """ 

24 

25 model = Submission 

26 _instance: Submission 

27 

28 def __eq__(self, other): 

29 """Overrides the default implementation""" 

30 if isinstance(other, Submission): 

31 return self._instance == other 

32 return self == other 

33 

34 @property 

35 def authors(self): 

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

37 return None 

38 return self._instance.all_authors 

39 

40 @property 

41 def authors_string(self): 

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

43 return "**** ****" 

44 

45 authors = self._instance.all_authors 

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

47 

48 @property 

49 def created_by(self): 

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

51 return str(self._instance.created_by) 

52 

53 return "**** ****" 

54 

55 @cached_property 

56 def all_versions( 

57 self, 

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

59 versions = self._instance.all_versions 

60 

61 allowed_versions = [] 

62 for version in versions: 

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

64 submission_version_proxy = ( 

65 model_proxy.submission_version_proxy.SubmissionVersionProxy( 

66 version, self._role_handler 

67 ) 

68 ) 

69 allowed_versions.append(submission_version_proxy) 

70 

71 return allowed_versions 

72 

73 @property 

74 def versions(self): 

75 return self.all_versions 

76 

77 @cached_property 

78 def status(self) -> SubmissionStatusData: 

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

80 

81 

82class BuildSubmissionProxyVisitor(RoleVisitor): 

83 """ " 

84 Returns a SubmissionProxy based on the role 

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

86 """ 

87 

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

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

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

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

92 

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

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

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

96 

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

98 self.submission_proxy.action_lists = build_submission_actions( 

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

100 ) 

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

102 

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

104 

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

106 return self.submission_proxy 

107 

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

109 if self.role_handler.check_rights("can_access_submission", submission): 109 ↛ 113line 109 didn't jump to line 113 because the condition on line 109 was always true

110 tooltip = build_submission_tooltip(submission) 

111 self.submission_proxy.tooltip = tooltip 

112 

113 if ( 113 ↛ 118line 113 didn't jump to line 118 because the condition on line 113 was never true

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

115 and submission.current_version 

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

117 ): 

118 review_summary = build_review_summary(submission) 

119 self.submission_proxy.review_summary = review_summary 

120 

121 return self.submission_proxy 

122 

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

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

125 

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

127 return self.submission_proxy