annotate libervia/web/pages/forums/view/page_meta.py @ 1644:8a09eea9003f default tip

doc (user): Add doc for forum feature: fix 463
author Goffi <goffi@goffi.org>
date Sat, 06 Sep 2025 17:28:07 +0200
parents c03297bb8d19
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1173
diff changeset
1 #!/usr/bin/env python3
1239
f511f8fbbf8a fixed shebangs
Goffi <goffi@goffi.org>
parents: 1220
diff changeset
2
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
3
1518
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
4 from libervia.web.server.constants import Const as C
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
5 from libervia.backend.core.i18n import _, D_
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
6 from libervia.backend.core.log import getLogger
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
7 from libervia.backend.tools.common import data_format
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1077
diff changeset
8
1145
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1124
diff changeset
9 log = getLogger(__name__)
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
10
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1173
diff changeset
11 name = "forum_view"
1427
eaf36fffcbdb pages (forums): better breadcrumbs
Goffi <goffi@goffi.org>
parents: 1426
diff changeset
12 label = D_("View")
1642
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
13 access = C.PAGES_ACCESS_PROFILE
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
14 template = "forum/view_messages.html"
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
15
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
16
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
17 def parse_url(self, request):
1642
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
18 self.get_path_args(request, ["service", "node", "item"], 3, service="jid")
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
19
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
20
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
21 def add_breadcrumb(self, request, breadcrumbs):
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
22 return None
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1077
diff changeset
23
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
24
1427
eaf36fffcbdb pages (forums): better breadcrumbs
Goffi <goffi@goffi.org>
parents: 1426
diff changeset
25 async def prepare_render(self, request):
1642
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
26 profile = self.get_profile(request) or C.SERVICE_PROFILE
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
27 data = self.get_r_data(request)
1642
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
28 parent_service, parent_node, parent_item_id = (
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
29 data["service"],
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
30 data["node"],
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
31 data["item"],
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
32 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
33 parent_item_data = data_format.deserialise(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
34 await self.host.bridge_call(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
35 "mb_get",
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
36 parent_service.userhost(),
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
37 parent_node,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
38 C.NO_LIMIT,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
39 [parent_item_id],
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
40 data_format.serialise({}),
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
41 profile,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
42 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
43 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
44 parent_item = parent_item_data["items"][0]
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
45 try:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
46 service_s = parent_item["comments"][0]["service"]
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
47 node = parent_item["comments"][0]["node"]
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
48 except (KeyError, IndexError) as e:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
49 log.warning(f"No comment node found {e}:\n{parent_item=}")
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
50 self.page_error(request, C.HTTP_SERVICE_UNAVAILABLE)
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
51 return
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
52
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
53 page_max = data.get("page_max", 20)
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
54 extra = self.get_pubsub_extra(request, page_max=page_max)
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
55 self.handle_search(request, extra)
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
56 if not self.use_cache(request):
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
57 extra[C.KEY_USE_CACHE] = False
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
58 blog_data = data_format.deserialise(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
59 await self.host.bridge_call(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
60 "mb_get",
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
61 service_s,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
62 node,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
63 C.NO_LIMIT,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
64 [],
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
65 data_format.serialise(extra),
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
66 profile,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
67 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
68 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
69 for parent_item in blog_data["items"]:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
70 try:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
71 comments_service = parent_item["comments"][0]["service"]
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
72 comments_node = parent_item["comments"][0]["node"]
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
73 except (KeyError, IndexError):
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
74 log.warning(f"Can't get comments node for item: {parent_item}")
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
75 continue
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
76 else:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
77 parent_item["http_url"] = self.get_page_by_name("forum_view").get_url(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
78 comments_service, comments_node
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
79 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
80 self.set_pagination(request, blog_data)
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
81 await self.fill_missing_identities(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
82 request, [i["author_jid"] for i in blog_data["items"]]
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
83 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
84
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
85 # We check if we are subscribed to the service.
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
86 try:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
87 subscriptions = data_format.deserialise(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
88 await self.host.bridge_call(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
89 "ps_subscriptions_get",
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
90 service_s,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
91 node,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
92 profile,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
93 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
94 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
95 except Exception as e:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
96 log.warning("Can't retrieve subscriptions, assuming that we are not subscribed.")
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
97 subscribed = False
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
98 else:
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
99 subscribed = any(s.get("state") == "subscribed" for s in subscriptions)
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
100
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
101 request.template_data.update(
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
102 {
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
103 "topic_title": parent_item["title"],
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
104 "service": service_s,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
105 "node": node,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
106 "blog_items": blog_data,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
107 "subscribed": subscribed,
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
108 }
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
109 )
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
110 self.expose_to_scripts(request, node=node, service=service_s, subscribed=subscribed)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1077
diff changeset
111
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
112
1426
4cf2b73e63aa pages (forums/view): use rich content to post a reply
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
113 async def on_data_post(self, request):
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
114 profile = self.get_profile(request)
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
115 if profile is None:
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
116 self.page_error(request, C.HTTP_FORBIDDEN)
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
117 type_ = self.get_posted_data(request, "type")
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1173
diff changeset
118 if type_ == "comment":
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
119 service, node, body = self.get_posted_data(request, ("service", "node", "body"))
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
120
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
121 if not body:
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
122 self.page_error(request, C.HTTP_BAD_REQUEST)
1639
301fe2f1a34a Update `mb_send` calls following changes in backend.
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
123 mb_data = {"service": service, "node": node, "content_rich": body}
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
124 try:
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
125 await self.host.bridge_call(
1642
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
126 "mb_send", data_format.serialise(mb_data), profile
c03297bb8d19 server, browser (forums): Redesign of the forum feature:
Goffi <goffi@goffi.org>
parents: 1639
diff changeset
127 )
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
128 except Exception as e:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1173
diff changeset
129 if "forbidden" in str(e):
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1427
diff changeset
130 self.page_error(request, 401)
1058
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
131 else:
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
132 raise e
2290b6ec3991 pages (forums): first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
133 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1173
diff changeset
134 log.warning(_("Unhandled data type: {}").format(type_))