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

1from opentelemetry.trace import get_tracer 

2 

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 

10 

11tracer = get_tracer(__name__) 

12 

13 

14class SubmissionProxy(RoleModelProxy[Submission]): 

15 """ 

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

17 """ 

18 

19 model = Submission 

20 

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 

32 

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 

38 

39 

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 """ 

45 

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 

54 

55 return super().visit(submission, *args, **kwargs) 

56 

57 def visit_author(self, submission: Submission, *args, **kwargs): 

58 return self.submission_proxy 

59 

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 

64 

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 

72 

73 return self.submission_proxy 

74 

75 def visit_journal_manager(self, submission: Submission, *args, **kwargs): 

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

77 

78 def visit_reviewer(self, submission: Submission, *args, **kwargs): 

79 return self.submission_proxy