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,
+    )