Mercurial > libervia-web
comparison libervia/web/pages/lists/view_item/page_meta.py @ 1518:eb00d593801d
refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 02 Jun 2023 16:49:28 +0200 |
parents | libervia/pages/lists/view_item/page_meta.py@106bae41f5c8 |
children |
comparison
equal
deleted
inserted
replaced
1517:b8ed9726525b | 1518:eb00d593801d |
---|---|
1 #!/usr/bin/env python3 | |
2 | |
3 from twisted.words.protocols.jabber import jid | |
4 from libervia.backend.core.i18n import _, D_ | |
5 from libervia.backend.tools.common import template_xmlui | |
6 from libervia.backend.tools.common import uri | |
7 from libervia.backend.tools.common import data_format | |
8 from libervia.backend.core.log import getLogger | |
9 from libervia.frontends.bridge.bridge_frontend import BridgeException | |
10 from libervia.web.server.constants import Const as C | |
11 from libervia.web.server.utils import SubPage | |
12 from libervia.web.server import session_iface | |
13 | |
14 log = getLogger(__name__) | |
15 | |
16 | |
17 name = "list_view" | |
18 access = C.PAGES_ACCESS_PUBLIC | |
19 template = "list/item.html" | |
20 | |
21 | |
22 def parse_url(self, request): | |
23 self.get_path_args(request, ["service", "node", "item_id"], service="jid", node="@") | |
24 data = self.get_r_data(request) | |
25 if data["item_id"] is None: | |
26 log.warning(_("no list item id specified")) | |
27 self.page_error(request, C.HTTP_BAD_REQUEST) | |
28 | |
29 | |
30 def add_breadcrumb(self, request, breadcrumbs): | |
31 data = self.get_r_data(request) | |
32 list_url = self.get_page_by_name("lists").get_url(data["service"].full(), | |
33 data.get("node") or "@") | |
34 breadcrumbs.append({ | |
35 "label": D_("List"), | |
36 "url": list_url | |
37 }) | |
38 breadcrumbs.append({ | |
39 "label": D_("Item"), | |
40 }) | |
41 | |
42 | |
43 async def prepare_render(self, request): | |
44 data = self.get_r_data(request) | |
45 template_data = request.template_data | |
46 session = self.host.get_session_data(request, session_iface.IWebSession) | |
47 service, node, item_id = ( | |
48 data.get("service", ""), | |
49 data.get("node", ""), | |
50 data["item_id"], | |
51 ) | |
52 namespace = node or self.host.ns_map["tickets"] | |
53 node = await self.host.bridge_call("ps_schema_submitted_node_get", namespace) | |
54 | |
55 profile = self.get_profile(request) | |
56 if profile is None: | |
57 profile = C.SERVICE_PROFILE | |
58 | |
59 list_raw = await self.host.bridge_call( | |
60 "list_get", | |
61 service.full() if service else "", | |
62 node, | |
63 C.NO_LIMIT, | |
64 [item_id], | |
65 "", | |
66 data_format.serialise({"labels_as_list": C.BOOL_TRUE}), | |
67 profile, | |
68 ) | |
69 list_items, __ = data_format.deserialise(list_raw, type_check=list) | |
70 list_item = [template_xmlui.create(self.host, x) for x in list_items][0] | |
71 template_data["item"] = list_item | |
72 try: | |
73 comments_uri = list_item.widgets["comments_uri"].value | |
74 except KeyError: | |
75 pass | |
76 else: | |
77 if comments_uri: | |
78 uri_data = uri.parse_xmpp_uri(comments_uri) | |
79 template_data["comments_node"] = comments_node = uri_data["node"] | |
80 template_data["comments_service"] = comments_service = uri_data["path"] | |
81 try: | |
82 comments = data_format.deserialise(await self.host.bridge_call( | |
83 "mb_get", comments_service, comments_node, C.NO_LIMIT, [], | |
84 data_format.serialise({}), profile | |
85 )) | |
86 except BridgeException as e: | |
87 if e.classname == 'NotFound' or e.condition == 'item-not-found': | |
88 log.warning( | |
89 _("Can't find comment node at [{service}] {node!r}") | |
90 .format(service=comments_service, node=comments_node) | |
91 ) | |
92 else: | |
93 raise e | |
94 else: | |
95 template_data["comments"] = comments | |
96 template_data["login_url"] = self.get_page_redirect_url(request) | |
97 self.expose_to_scripts( | |
98 request, | |
99 comments_node=comments_node, | |
100 comments_service=comments_service, | |
101 ) | |
102 | |
103 if session.connected: | |
104 # we activate modification action (edit, delete) only if user is the publisher or | |
105 # the node owner | |
106 publisher = jid.JID(list_item.widgets["publisher"].value) | |
107 is_publisher = publisher.userhostJID() == session.jid.userhostJID() | |
108 affiliation = None | |
109 if not is_publisher: | |
110 affiliation = await self.host.get_affiliation(request, service, node) | |
111 if is_publisher or affiliation == "owner": | |
112 self.expose_to_scripts( | |
113 request, | |
114 pubsub_service = service.full(), | |
115 pubsub_node = node, | |
116 pubsub_item = item_id, | |
117 ) | |
118 template_data["can_modify"] = True | |
119 template_data["url_list_item_edit"] = self.get_url_by_path( | |
120 SubPage("list_edit"), | |
121 service.full(), | |
122 node or "@", | |
123 item_id, | |
124 ) | |
125 | |
126 # we add xmpp: URI | |
127 uri_args = {'path': service.full()} | |
128 uri_args['node'] = node | |
129 if item_id: | |
130 uri_args['item'] = item_id | |
131 template_data['xmpp_uri'] = uri.build_xmpp_uri('pubsub', **uri_args) | |
132 | |
133 | |
134 async def on_data_post(self, request): | |
135 type_ = self.get_posted_data(request, "type") | |
136 if type_ == "comment": | |
137 blog_page = self.get_page_by_name("blog_view") | |
138 await blog_page.on_data_post(self, request) | |
139 else: | |
140 log.warning(_("Unhandled data type: {}").format(type_)) |