Coverage for src / mesh / views / viewmodel / submission_proxy.py: 93%
45 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
1from opentelemetry.trace import get_tracer
3from mesh.models.orm.submission_models import Submission, SubmissionState
4from mesh.models.roles.visitor import RoleVisitor
5from mesh.views.components.button import build_submission_actions
6from mesh.views.components.review_summary import build_review_summary
7from mesh.views.components.submission_tooltip import build_submission_tooltip
8from mesh.views.viewmodel.model_proxy import RoleModelProxy
9from mesh.views.viewmodel.submission_version_proxy import SubmissionVersionProxy
11tracer = get_tracer(__name__)
14class SubmissionProxy(RoleModelProxy[Submission]):
15 """
16 Proxy for the `Submission` model with restricted data according to the user role.
17 """
19 model = Submission
21 def __init__(self, instance, role) -> None:
22 super().__init__(instance, role)
23 self.authors = instance.authors_censored
24 self.created_by = instance.created_by_censored
25 self.versions = [
26 SubmissionVersionProxy(version, self.role, submission_proxy=self)
27 for version in instance.versions_censored
28 ]
29 self.status = role.get_submission_status(instance)
30 self.current_version = instance.get_current_version()
31 self.review_summary = None
33 def __eq__(self, other):
34 """Overrides the default implementation"""
35 if isinstance(other, self.model):
36 return self._instance == other
37 return self == other
40class BuildSubmissionProxyVisitor(RoleVisitor[SubmissionProxy]):
41 """
42 Returns a SubmissionProxy based on the role
43 Augments the interface with widgets to be displayed according to the role (ex: ReviewSummary)
44 """
46 def visit(self, submission: Submission, *args, row_id=None, **kwargs):
47 self.submission_proxy = SubmissionProxy(submission, self.role)
48 self.submission_proxy.row_id = row_id
49 kwargs["reload_id"] = row_id
50 self.submission_proxy.action_lists = build_submission_actions(
51 submission, self.role, *args, **kwargs
52 )
53 self.submission_proxy.all_logs = submission.log_messages_censored
55 return super().visit(submission, *args, **kwargs)
57 def visit_author(self, submission: Submission, *args, **kwargs):
58 return self.submission_proxy
60 def visit_editor(self, submission: Submission, *args, **kwargs):
61 if self.role.can_access_submission(submission):
62 tooltip = build_submission_tooltip(submission)
63 self.submission_proxy.tooltip = tooltip
65 if (
66 self.role.can_access_submission(submission)
67 and submission.get_current_version()
68 and submission.state == SubmissionState.ON_REVIEW.value
69 ):
70 review_summary = build_review_summary(submission)
71 self.submission_proxy.review_summary = review_summary
73 return self.submission_proxy
75 def visit_journal_manager(self, submission: Submission, *args, **kwargs):
76 return self.visit_editor(submission, *args, **kwargs)
78 def visit_reviewer(self, submission: Submission, *args, **kwargs):
79 return self.submission_proxy