Mercurial > libervia-web
annotate libervia/pages/files/list/page_meta.py @ 1319:6e2821e78489
pages: render HTTP_NOT_FOUND page on `item-not-found` bridge error.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 01 Aug 2020 16:47:24 +0200 |
parents | d0575e9abf7d |
children | 009542289bc9 |
rev | line source |
---|---|
1216 | 1 #!/usr/bin/env python3 |
1239 | 2 |
1290
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
3 import json |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
4 import os |
1313
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
5 from pathlib import Path |
1290
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
6 from sat.core.i18n import _ |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
7 from sat.core.log import getLogger |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
8 from sat.tools.common import uri |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
9 from sat_frontends.bridge.bridge_frontend import BridgeException |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 from libervia.server.constants import Const as C |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
11 from libervia.server import session_iface |
1069
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
12 from libervia.server import pages_tools |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
13 |
1145
29eb15062416
pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents:
1124
diff
changeset
|
14 log = getLogger(__name__) |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 """files handling pages""" |
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
1216 | 17 name = "files_list" |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 access = C.PAGES_ACCESS_PROFILE |
1216 | 19 template = "file/overview.html" |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
21 |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 def parse_url(self, request): |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
23 self.getPathArgs(request, ["service", "*path"], min_args=1, service="jid", path="") |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
24 |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 |
1290
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
26 async def prepare_render(self, request): |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 data = self.getRData(request) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
28 thumb_limit = data.get("thumb_limit", 300) |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 template_data = request.template_data |
1216 | 30 service, path_elts = data["service"], data["path"] |
1313
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
31 path = Path('/', *path_elts) |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 profile = self.getProfile(request) or C.SERVICE_PROFILE |
1316
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
33 session_data = self.host.getSessionData( |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
34 request, session_iface.ISATSession |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
35 ) |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
1290
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
37 try: |
1313
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
38 files_data = await self.host.bridgeCall( |
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
39 "FISList", service.full(), str(path), {}, profile) |
1290
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
40 except BridgeException as e: |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
41 if e.condition == 'item-not-found': |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
42 log.debug( |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
43 f'"item-not-found" received for {path} at {service}, this may indicate ' |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
44 f'that the location is new') |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
45 files_data = [] |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
46 else: |
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
47 raise e |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 for file_data in files_data: |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
49 try: |
1216 | 50 extra_raw = file_data["extra"] |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
51 except KeyError: |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
52 pass |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
53 else: |
1216 | 54 file_data["extra"] = json.loads(extra_raw) if extra_raw else {} |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
55 dir_path = path_elts + [file_data["name"]] |
1216 | 56 if file_data["type"] == C.FILE_TYPE_DIRECTORY: |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 page = self |
1216 | 58 elif file_data["type"] == C.FILE_TYPE_FILE: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
59 page = self.getPageByName("files_view") |
1069
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
60 |
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
61 ## thumbnails ## |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
62 try: |
1216 | 63 thumbnails = file_data["extra"]["thumbnails"] |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
64 if not thumbnails: |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
65 raise KeyError |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
66 except KeyError: |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
67 pass |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
68 else: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
69 thumbnails.sort(key=lambda t: t["size"]) |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
70 thumb = thumbnails[0] |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
71 for thumb_data in thumbnails: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
72 if thumb_data["size"][0] > thumb_limit: |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
73 break |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
74 thumb = thumb_data |
1216 | 75 if "url" in thumb: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
76 file_data["thumb_url"] = thumb["url"] |
1216 | 77 elif "id" in thumb: |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
78 try: |
1290
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
79 thumb_path = await self.host.bridgeCall( |
1216 | 80 "bobGetFile", service.full(), thumb["id"], profile |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
81 ) |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
82 except Exception as e: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
83 log.warning( |
1216 | 84 _("Can't retrieve thumbnail: {reason}").format(reason=e) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
85 ) |
1067
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
86 else: |
808ec98de8b3
pages (files/list): retrieve thumbnail:
Goffi <goffi@goffi.org>
parents:
1064
diff
changeset
|
87 filename = os.path.basename(thumb_path) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
88 file_data["thumb_url"] = os.path.join( |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
89 session_data.cache_dir, filename |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
90 ) |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 else: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
92 raise ValueError( |
1216 | 93 "unexpected file type: {file_type}".format(file_type=file_data["type"]) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
94 ) |
1216 | 95 file_data["url"] = page.getURL(service.full(), *dir_path) |
1069
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
96 |
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
97 ## comments ## |
1216 | 98 comments_url = file_data.get("comments_url") |
1069
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
99 if comments_url: |
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
100 parsed_url = uri.parseXMPPUri(comments_url) |
1216 | 101 comments_service = file_data["comments_service"] = parsed_url["path"] |
102 comments_node = file_data["comments_node"] = parsed_url["node"] | |
1069
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
103 try: |
1216 | 104 comments_count = file_data["comments_count"] = int( |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
105 file_data["comments_count"] |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
106 ) |
1069
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
107 except KeyError: |
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
108 comments_count = None |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
109 if comments_count and data.get("retrieve_comments", False): |
1290
ee984eefc787
pages (files/list): return empty list of files when `item-not-found` is received
Goffi <goffi@goffi.org>
parents:
1289
diff
changeset
|
110 file_data["comments"] = await pages_tools.retrieveComments( |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
111 self, comments_service, comments_node, profile=profile |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1069
diff
changeset
|
112 ) |
1069
2dab7692eae7
pages (files/list): comments handling + size parameters:
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
113 |
1313
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
114 # parent dir affiliation |
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
115 # TODO: some caching? What if affiliation changes? |
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
116 |
1316
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
117 affiliations = await self.host.bridgeCall( |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
118 "FISAffiliationsGet", service.full(), "", str(path), profile |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
119 ) |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
120 directory_affiliation = affiliations.get(session_data.jid.userhost()) |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
121 if directory_affiliation == "owner": |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
122 # we need to transtype dict items to str because with some bridges (D-Bus) |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
123 # we have a specific type which can't be exposed |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
124 self.exposeToScripts( |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
125 request, |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
126 affiliations={str(e): str(a) for e, a in affiliations.items()} |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
127 ) |
1313
12aa95eeb409
pages (files/list): set `directory_affiliation` template data:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
128 |
1316
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
129 template_data["directory_affiliation"] = directory_affiliation |
1216 | 130 template_data["files_data"] = files_data |
131 template_data["path"] = path | |
1316
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
132 self.exposeToScripts( |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
133 request, |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
134 directory_affiliation=str(directory_affiliation), |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
135 files_service=service.full(), |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
136 files_path=str(path), |
d0575e9abf7d
pages (files/list): use new `FISAffiliationsGet` to get `directory_affiliation`
Goffi <goffi@goffi.org>
parents:
1313
diff
changeset
|
137 ) |
1064
abc5d545dbaa
pages (files): files sharing first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 if path_elts: |
1216 | 139 template_data["parent_url"] = self.getURL(service.full(), *path_elts[:-1]) |