Coverage for src / mesh / views / views_comments.py: 31%

64 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-08-27 14:14 +0000

1from datetime import datetime 

2 

3from django.contrib import messages 

4from django.contrib.auth.mixins import LoginRequiredMixin 

5from django.core.exceptions import PermissionDenied 

6from django.http import JsonResponse 

7from django.shortcuts import get_object_or_404, redirect 

8from django.urls import reverse 

9from django.views import View 

10from django.views.generic import TemplateView 

11from ptf.url_utils import format_url_with_params 

12 

13from mesh.crud.discussion import ( 

14 create_comment, 

15 delete_comment, 

16 edit_comment, 

17 get_comment, 

18 get_comments, 

19 remove_inbox_item, 

20 update_date_last_seen, 

21) 

22from mesh.models.orm import Comment, Discussion 

23from mesh.views.forms.comment_form import CommentForm 

24 

25 

26class DiscussionCommentsView(LoginRequiredMixin, TemplateView): 

27 # template_name = "mesh/submission/comments/article_comments.html" 

28 template_name = "mesh/submission/comment/discussion_thread.html" 

29 

30 def get_context_data(self, **kwargs): 

31 context = super().get_context_data(**kwargs) 

32 

33 discussion = get_object_or_404(Discussion, pk=kwargs["discussion_pk"]) 

34 submission_pk = kwargs["submission_pk"] 

35 discussion_pk = discussion.pk 

36 

37 if not self.request.current_role.can_access_discussion(discussion): 

38 raise PermissionDenied 

39 

40 context["ordered_comments"] = get_comments( 

41 discussion=discussion, user=self.request.user, role=self.request.current_role 

42 ) 

43 update_date_last_seen(discussion=discussion, user=self.request.user) 

44 remove_inbox_item(user=self.request.user, discussion=discussion) 

45 

46 submit_base_url = reverse( 

47 "mesh:submit_comment", 

48 kwargs={"submission_pk": submission_pk, "discussion_pk": discussion.pk}, 

49 ) 

50 redirect_url = self.request.GET.get("redirect_url", self.request.path) 

51 params = {"redirect_url": redirect_url, "pk": discussion_pk, "form_prefix": "default"} 

52 context["default_comment_form"] = { 

53 "author_name": self.request.user.get_full_name(), 

54 "date_submitted": datetime.now(), 

55 "submit_url": format_url_with_params(submit_base_url, params), 

56 "form_prefix": "default", 

57 "form": CommentForm(prefix="default", initial={"pk": discussion_pk}), 

58 } 

59 context["is_user_oidc_authenticated"] = True 

60 return context 

61 

62 

63class MeshCommentSubmitView(LoginRequiredMixin, View): 

64 def post(self, request, *args, **kwargs): 

65 discussion = get_object_or_404(Discussion, pk=kwargs["discussion_pk"]) 

66 

67 if not self.request.current_role.can_access_discussion(discussion): 

68 raise PermissionDenied 

69 

70 form_prefix = request.GET.get("form_prefix", "default") 

71 comment_pk = request.POST.get(f"{form_prefix}-comment_pk") or None 

72 comment_form = CommentForm(request.POST, prefix=form_prefix) 

73 if not comment_form.is_valid(): 

74 messages.error(request, "Le formulaire est invalide.") 

75 return redirect( 

76 request.GET.get("redirect_url") 

77 or reverse("mesh:submission_detail", kwargs={"pk": discussion.submission_id}) 

78 ) 

79 

80 data = comment_form.cleaned_data 

81 content = data["content"] 

82 parent_pk = data.get("parent") or None 

83 

84 if comment_pk: # edit comment 

85 comment = get_comment(discussion, comment_pk) 

86 if self.request.current_role.can_edit_comment(comment): 

87 edit_comment( 

88 comment_pk=comment_pk, 

89 discussion=discussion, 

90 content=content, 

91 user=request.user, 

92 ) 

93 return JsonResponse({"ok": True}) 

94 return JsonResponse({"ok": False, "error": "forbidden"}, status=403) 

95 else: # create comment 

96 parent = None 

97 if parent_pk: 

98 parent = get_object_or_404(Comment, pk=parent_pk, discussion=discussion) 

99 

100 create_comment( 

101 discussion=discussion, 

102 content=content, 

103 parent=parent, 

104 user=request.user, 

105 ) 

106 return JsonResponse({"ok": True}) 

107 

108 

109class MeshCommentDeleteView(LoginRequiredMixin, View): 

110 def post(self, request, *args, **kwargs): 

111 discussion = get_object_or_404(Discussion, pk=kwargs["discussion_pk"]) 

112 comment = get_object_or_404(Comment, pk=kwargs["comment_pk"], discussion=discussion) 

113 

114 if delete_comment( 

115 discussion=discussion, 

116 comment=comment, 

117 user=self.request.user, 

118 role=self.request.current_role, 

119 ): 

120 comment.refresh_from_db() 

121 return JsonResponse({"ok": True}) 

122 return JsonResponse({"ok": False, "error": "forbidden"}, status=403)