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
« prev ^ index » next coverage.py v7.7.0, created at 2025-04-28 07:45 +0000
1from __future__ import annotations
3from functools import cached_property
4from typing import TYPE_CHECKING
6from mesh.model.roles.role_handler import RoleVisitor
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
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
20class SubmissionProxy(RoleModelProxy):
21 """
22 Proxy for the `Submission` model with restricted data according to the user role.
23 """
25 model = Submission
26 _instance: Submission
28 def __eq__(self, other):
29 """Overrides the default implementation"""
30 if isinstance(other, Submission):
31 return self._instance == other
32 return self == other
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
40 @property
41 def authors_string(self):
42 if not self._role_handler.check_rights("can_access_submission_author", self._instance):
43 return "**** ****"
45 authors = self._instance.all_authors
46 return ", ".join([f"{a.first_name[0]}. {a.last_name}" for a in authors])
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)
53 return "**** ****"
55 @cached_property
56 def all_versions(
57 self,
58 ) -> list[model_proxy.submission_version_proxy.SubmissionVersionProxy]:
59 versions = self._instance.all_versions
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)
71 return allowed_versions
73 @property
74 def versions(self):
75 return self.all_versions
77 @cached_property
78 def status(self) -> SubmissionStatusData:
79 return self._role_handler.get_from_rights("get_submission_status", self._instance)
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 """
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)
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", "")
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")
103 return super().visit(role, submission, *args, **kwargs)
105 def visit_author(self, submission, *args, **kwargs):
106 return self.submission_proxy
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
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
121 return self.submission_proxy
123 def visit_journal_manager(self, submission, *args, **kwargs):
124 return self.visit_editor(submission, *args, **kwargs)
126 def visit_reviewer(self, submission, *args, **kwargs):
127 return self.submission_proxy