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
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-27 14:14 +0000
1from datetime import datetime
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
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
26class DiscussionCommentsView(LoginRequiredMixin, TemplateView):
27 # template_name = "mesh/submission/comments/article_comments.html"
28 template_name = "mesh/submission/comment/discussion_thread.html"
30 def get_context_data(self, **kwargs):
31 context = super().get_context_data(**kwargs)
33 discussion = get_object_or_404(Discussion, pk=kwargs["discussion_pk"])
34 submission_pk = kwargs["submission_pk"]
35 discussion_pk = discussion.pk
37 if not self.request.current_role.can_access_discussion(discussion):
38 raise PermissionDenied
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)
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
63class MeshCommentSubmitView(LoginRequiredMixin, View):
64 def post(self, request, *args, **kwargs):
65 discussion = get_object_or_404(Discussion, pk=kwargs["discussion_pk"])
67 if not self.request.current_role.can_access_discussion(discussion):
68 raise PermissionDenied
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 )
80 data = comment_form.cleaned_data
81 content = data["content"]
82 parent_pk = data.get("parent") or None
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)
100 create_comment(
101 discussion=discussion,
102 content=content,
103 parent=parent,
104 user=request.user,
105 )
106 return JsonResponse({"ok": True})
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)
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)