Coverage for src / mesh / views / viewmodel / submission_proxy.py: 93%
43 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-07-09 13:14 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-07-09 13:14 +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.viewmodel.model_proxy import RoleModelProxy
8from mesh.views.viewmodel.submission_version_proxy import SubmissionVersionProxy
10tracer = get_tracer(__name__)
13class SubmissionProxy(RoleModelProxy[Submission]):
14 """
15 Proxy for the `Submission` model with restricted data according to the user role.
16 """
18 model = Submission
20 def __init__(self, instance, role) -> None:
21 super().__init__(instance, role)
22 self.authors = instance.authors_censored
23 self.created_by = instance.created_by_censored
24 self.versions = [
25 SubmissionVersionProxy(version, self.role, submission_proxy=self)
26 for version in instance.versions_censored
27 ]
28 self.status = role.get_submission_status(instance)
29 self.current_version = instance.get_current_version()
30 self.review_summary = None
31 self.can_access_tooltip = False
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 self.submission_proxy.can_access_tooltip = self.role.can_access_submission(submission)
63 if (
64 self.role.can_access_submission(submission)
65 and submission.get_current_version()
66 and submission.state == SubmissionState.ON_REVIEW.value
67 ):
68 review_summary = build_review_summary(submission)
69 self.submission_proxy.review_summary = review_summary
71 return self.submission_proxy
73 def visit_journal_manager(self, submission: Submission, *args, **kwargs):
74 return self.visit_editor(submission, *args, **kwargs)
76 def visit_reviewer(self, submission: Submission, *args, **kwargs):
77 return self.submission_proxy