Mercurial > libervia-web
diff libervia/pages/lists/view/page_meta.py @ 1387:a84383c659b4
lists: creation, invitation, item deletion:
this big patch includes:
- reorganisation of pages for consistency, discovery is now the main list page, and list
overview is now in `view` while item view is moved to `view_item`
- lists from lists of interest are now shown in discovery page
- list deletion from discory page
- list can now be created, using templates now available from backend
- invitation manager can now be used from list overview
- list item can now be deleted from `view_item`
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 20 Feb 2021 14:07:22 +0100 |
parents | libervia/pages/lists/page_meta.py@e3e303a30a74 |
children | ac4173fff71d |
line wrap: on
line diff
--- a/libervia/pages/lists/view/page_meta.py Sat Feb 20 13:58:42 2021 +0100 +++ b/libervia/pages/lists/view/page_meta.py Sat Feb 20 14:07:22 2021 +0100 @@ -1,103 +1,89 @@ #!/usr/bin/env python3 - -from libervia.server.constants import Const as C -from sat.core.i18n import _ -from libervia.server.utils import SubPage -from libervia.server import session_iface -from twisted.words.protocols.jabber import jid from sat.tools.common import template_xmlui -from sat.tools.common import uri +from sat.tools.common import data_objects from sat.tools.common import data_format from sat.core.log import getLogger +from sat_frontends.bridge.bridge_frontend import BridgeException +from libervia.server.constants import Const as C log = getLogger(__name__) - -name = "list_view" +name = "lists" access = C.PAGES_ACCESS_PUBLIC -template = "list/item.html" +template = "list/overview.html" def parse_url(self, request): - try: - item_id = self.nextPath(request) - except IndexError: - log.warning(_("no list item id specified")) - self.pageError(request, C.HTTP_BAD_REQUEST) - + self.getPathArgs(request, ["service", "node"], service="jid") data = self.getRData(request) - data["list_item_id"] = item_id + service, node = data["service"], data["node"] + if node is None: + self.HTTPRedirect(request, self.getPageByName("lists_disco").url) + if node == "@": + node = data["node"] = "" + template_data = request.template_data + template_data["url_list_items"] = self.getURL(service.full(), node or "@") + template_data["url_list_new"] = self.getPageByName("list_new").getURL( + service.full(), node or "@") async def prepare_render(self, request): data = self.getRData(request) template_data = request.template_data - session = self.host.getSessionData(request, session_iface.ISATSession) - service, node, list_item_id = ( - data.get("service", ""), - data.get("node", ""), - data["list_item_id"], - ) - profile = self.getProfile(request) + service, node = data["service"], data["node"] + profile = self.getProfile(request) or C.SERVICE_PROFILE - if profile is None: - profile = C.SERVICE_PROFILE + self.checkCache(request, C.CACHE_PUBSUB, service=service, node=node, short="tickets") + + extra = self.getPubsubExtra(request) + extra["labels_as_list"] = C.BOOL_TRUE + self.handleSearch(request, extra) list_raw = await self.host.bridgeCall( "listGet", service.full() if service else "", node, C.NO_LIMIT, - [list_item_id], + [], "", - {"labels_as_list": C.BOOL_TRUE}, + extra, profile, ) - list_items, metadata = data_format.deserialise(list_raw, type_check=list) - list_item = [template_xmlui.create(self.host, x) for x in list_items][0] - template_data["item"] = list_item - comments_uri = list_item.widgets["comments_uri"].value - if comments_uri: - uri_data = uri.parseXMPPUri(comments_uri) - template_data["comments_node"] = comments_node = uri_data["node"] - template_data["comments_service"] = comments_service = uri_data["path"] - comments = data_format.deserialise(await self.host.bridgeCall( - "mbGet", comments_service, comments_node, C.NO_LIMIT, [], {}, profile - )) - - template_data["comments"] = comments - template_data["login_url"] = self.getPageRedirectURL(request) + if profile != C.SERVICE_PROFILE: + try: + affiliations = await self.host.bridgeCall( + "psNodeAffiliationsGet", + service.full() if service else "", + node, + profile + ) + except BridgeException as e: + log.warning(f"Can't get affiliations for node {node!r} at {service}: {e}") + template_data["owner"] = False + else: + is_owner = affiliations.get(self.getJid(request).userhost()) == 'owner' + template_data["owner"] = is_owner + if is_owner: + self.exposeToScripts( + request, + affiliations={str(e): str(a) for e, a in affiliations.items()} + ) + else: + template_data["owner"] = False - if session.connected: - # we set edition URL only if user is the publisher or the node owner - publisher = jid.JID(list_item.widgets["publisher"].value) - is_publisher = publisher.userhostJID() == session.jid.userhostJID() - affiliation = None - if not is_publisher: - node = node or self.host.ns_map["tickets"] - affiliation = await self.host.getAffiliation(request, service, node) - if is_publisher or affiliation == "owner": - template_data["url_list_item_edit"] = self.getURLByPath( - SubPage("lists"), - service.full(), - node or "@", - SubPage("list_edit"), - list_item_id, - ) - - # we add xmpp: URI - uri_args = {'path': service.full()} - uri_args['node'] = node or self.host.ns_map["tickets"] - if list_item_id: - uri_args['item'] = list_item_id - template_data['xmpp_uri'] = uri.buildXMPPUri('pubsub', **uri_args) - - -async def on_data_post(self, request): - type_ = self.getPostedData(request, "type") - if type_ == "comment": - blog_page = self.getPageByName("blog_view") - await blog_page.on_data_post(self, request) - else: - log.warning(_("Unhandled data type: {}").format(type_)) + list_items, metadata = data_format.deserialise(list_raw, type_check=list) + template_data["list_items"] = [ + template_xmlui.create(self.host, x) for x in list_items + ] + view_url = self.getPageByName('list_view').getURL(service.full(), node or '@') + template_data["on_list_item_click"] = data_objects.OnClick( + url=f"{view_url}/{{item.id}}" + ) + self.setPagination(request, metadata) + self.exposeToScripts( + request, + lists_ns=self.host.ns_map["tickets"], + pubsub_service=service.full(), + pubsub_node=node, + )