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
« prev ^ index » next coverage.py v7.13.1, created at 2026-03-10 09:11 +0000
1from __future__ import annotations
3from typing import TYPE_CHECKING
5from mesh.model.roles.role_handler import RoleVisitor
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
14# Require for type hint with __future__.annotations
15if TYPE_CHECKING:
16 from ...model.submission_status import SubmissionStatusData
19class SubmissionProxy(RoleModelProxy):
20 """
21 Proxy for the `Submission` model with restricted data according to the user role.
22 """
24 model = Submission
25 _instance: Submission
27 def __eq__(self, other):
28 """Overrides the default implementation"""
29 if isinstance(other, Submission):
30 return self._instance == other
31 return self == other
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
39 @property
40 def authors_string(self):
41 if not self._role_handler.check_rights("can_access_submission_author", self._instance):
42 return "**** ****"
44 authors = self._instance.all_authors
45 return ", ".join([f"{a.first_name[0]}. {a.last_name}" for a in authors])
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)
52 return "**** ****"
54 @property
55 def all_versions(
56 self,
57 ) -> list[model_proxy.submission_version_proxy.SubmissionVersionProxy]:
58 versions = self._instance.all_versions
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)
70 return allowed_versions
72 @property
73 def versions(self):
74 return self.all_versions
76 @property
77 def status(self) -> SubmissionStatusData:
78 return self._role_handler.get_from_rights("get_submission_status", self._instance)
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 """
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)
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", "")
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")
102 return super().visit(role, submission, *args, **kwargs)
104 def visit_author(self, submission, *args, **kwargs):
105 return self.submission_proxy
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
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
120 return self.submission_proxy
122 def visit_journal_manager(self, submission, *args, **kwargs):
123 return self.visit_editor(submission, *args, **kwargs)
125 def visit_reviewer(self, submission, *args, **kwargs):
126 return self.submission_proxy