annotate src/server/blog.py @ 917:86563d6c83b0

server: Libervia pages: - introduce new LiberviaPage which are easy to create web pages tailored for SàT architecture. They are expected to be the cornerstone of the future of Libervia. - webpages paths reflected by files paths in src/pages directory (directory should be changeable in the future) - if a pages subdirectory as a page_meta.py file, it is a webpage, same for sub-subdirectories and so on - page_meta.py variable are used to instanciate the resource. Check __init__ docstring for details - access is set with a page_meta.py variable (only public for now), and subdirectories access are restricted by parent directory ones. - callables in page_meta.py get 2 arguments: the LiberviaPage resource instance, and the request - callables there can use Deferred (or not) - LiberviaPage has a couple of helper method to e.g. parse URL or return an error
author Goffi <goffi@goffi.org>
date Sun, 05 Mar 2017 23:56:31 +0100
parents e9bb7257d051
children 67a59552f3e3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/python
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
3
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
4 # Libervia: a Salut à Toi frontend
818
f8a7a046ff9c copyright update
Goffi <goffi@goffi.org>
parents: 786
diff changeset
5 # Copyright (C) 2011-2016 Jérôme Poisson <goffi@goffi.org>
f8a7a046ff9c copyright update
Goffi <goffi@goffi.org>
parents: 786
diff changeset
6 # Copyright (C) 2013-2016 Adrien Cossa <souliane@mailoo.org>
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
7
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
8 # This program is free software: you can redistribute it and/or modify
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
11 # (at your option) any later version.
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
12
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
13 # This program is distributed in the hope that it will be useful,
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
16 # GNU Affero General Public License for more details.
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
17
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 331
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
20
586
3eb3a2c0c011 browser and server side: uses RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 487
diff changeset
21 from sat.core.i18n import _, D_
847
330db23d4a44 server (blog): call fixXHTMLLinks on XHTML content
souliane <souliane@mailoo.org>
parents: 831
diff changeset
22 from sat_frontends.tools.strings import addURLToText, fixXHTMLLinks
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
23 from sat.core.log import getLogger
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
24 log = getLogger(__name__)
898
2d15b484ca33 blog, browser: updated imports to reflect renaming of common.py to common/data_format.py
Goffi <goffi@goffi.org>
parents: 896
diff changeset
25 from sat.tools.common import data_format
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
26 from sat.tools import xml_tools
728
9d35d75566fb server_side (blog): clean error message when unknown profile is requested
souliane <souliane@mailoo.org>
parents: 727
diff changeset
27 from dbus.exceptions import DBusException
388
893451e35686 server_side: display blog banner if it is defined
souliane <souliane@mailoo.org>
parents: 375
diff changeset
28 from twisted.internet import defer
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from twisted.web import server
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from twisted.web.resource import Resource
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
31 from twisted.words.protocols.jabber.jid import JID
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
32 from twisted.words.xish import domish
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
33 from jinja2 import Environment, PackageLoader
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
34 from datetime import datetime
388
893451e35686 server_side: display blog banner if it is defined
souliane <souliane@mailoo.org>
parents: 375
diff changeset
35 import re
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
36 import os
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
37 import sys
884
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
38 import urlparse
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
39 import urllib
229
e632f77c4219 bridge: asyncGetParamA takes a security_limit argument
souliane <souliane@mailoo.org>
parents: 228
diff changeset
40
588
c8cca1a373dd server_side: static blog: convert \n in raw text message to <br/>
souliane <souliane@mailoo.org>
parents: 586
diff changeset
41 from libervia.server.html_tools import sanitizeHtml, convertNewLinesToXHTML
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 446
diff changeset
42 from libervia.server.constants import Const as C
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 446
diff changeset
43
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
44 NS_ATOM = 'http://www.w3.org/2005/Atom'
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
45 PARAMS_TO_GET = (C.STATIC_BLOG_PARAM_TITLE, C.STATIC_BLOG_PARAM_BANNER, C.STATIC_BLOG_PARAM_KEYWORDS, C.STATIC_BLOG_PARAM_DESCRIPTION)
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
46 re_strip_empty_div = re.compile(r"<div ?/>|<div> *?</div>")
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
47
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
48 # TODO: chech disco features and use max_items when RSM is not available
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
49 # FIXME: Deferred are not used
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
50 # FIXME: change navigation links handling, this is is fragile
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
51 # TODO: refactorise this
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
52
827
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
53
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
54 def getDefaultQueryData(request):
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
55 """Return query data which must be present in all links
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
56
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
57 @param request(twisted.web.http.Request): request instance comming from render
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
58 @return (dict): a dict with values as expected by urllib.urlencode
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
59 """
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
60 default_query_data = {}
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
61 try:
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
62 default_query_data['tag'] = request.extra_dict['mam_filter_{}'.format(C.MAM_FILTER_CATEGORY)].encode('utf-8')
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
63 except KeyError:
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
64 pass
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
65 return default_query_data
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
66
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
67
827
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
68 def _quote(value):
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
69 """Quote a value for use in url
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
70
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
71 @param value(unicode): value to quote
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
72 @return (str): quoted value
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
73 """
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
74 return urllib.quote(value.encode('utf-8'), '')
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
75
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
76
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
77 def _unquote(quoted_value):
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
78 """Unquote a value coming from url
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
79
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
80 @param unquote_value(str): value to unquote
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
81 @return (unicode): unquoted value
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
82 """
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
83 assert not isinstance(quoted_value, unicode)
827
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
84 return urllib.unquote(quoted_value).decode('utf-8')
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
85
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
86
893
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
87 def _urlencode(query):
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
88 """Same as urllib.urlencode, but use '&amp;' instead of '&'"""
896
06ead60cbfe0 blog: no unicode here we said!
Goffi <goffi@goffi.org>
parents: 895
diff changeset
89 return '&amp;'.join(["{}={}".format(urllib.quote_plus(str(k)), urllib.quote_plus(str(v)))
893
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
90 for k,v in query.iteritems()])
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
91
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
92
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
93 class TemplateProcessor(object):
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
94
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
95 THEME = 'default'
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
96
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
97 def __init__(self, host):
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
98 self.host = host
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
99
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
100 # add Libervia's themes directory to the python path
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
101 sys.path.append(os.path.dirname(os.path.normpath(self.host.themes_dir)))
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
102 themes = os.path.basename(os.path.normpath(self.host.themes_dir))
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
103 self.env = Environment(loader=PackageLoader(themes, self.THEME))
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
104
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
105 def useTemplate(self, request, tpl, data=None):
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
106 theme_url = os.path.join('/', C.THEMES_URL, self.THEME)
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
107
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
108 data_ = {'images': os.path.join(theme_url, 'images'),
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
109 'styles': os.path.join(theme_url, 'styles'),
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
110 }
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
111 if data:
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
112 data_.update(data)
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
113
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
114 template = self.env.get_template('{}.html'.format(tpl))
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
115 return template.render(**data_).encode('utf-8')
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
116
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
117
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
118 class MicroBlog(Resource, TemplateProcessor):
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
119 isLeaf = True
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
120
243
63e9b680d3e7 browser_side, blog: better PEP8 compliance
souliane <souliane@mailoo.org>
parents: 229
diff changeset
121 def __init__(self, host):
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
122 self.host = host
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
123 Resource.__init__(self)
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
124 TemplateProcessor.__init__(self, host)
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 900
diff changeset
125 self.host.bridge.register_signal('entityDataUpdated', self.entityDataUpdatedHandler)
484
ae86b32b959c server side (blog): manage our own avatars cache because existing entity data are not updated
souliane <souliane@mailoo.org>
parents: 483
diff changeset
126 self.avatars_cache = {}
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
127 self.waiting_deferreds = {}
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
128
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
129 def entityDataUpdatedHandler(self, entity_s, key, value, dummy):
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
130 """Retrieve the avatar we've been waiting for and fires the callback.
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
131
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
132 @param entity_s (str): JID of the contact
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
133 @param key (str): entity data key
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
134 @param value (str): entity data value
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
135 @param dummy (str): that would be C.SERVICE_PROFILE
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
136 """
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
137 if key != "avatar":
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
138 return
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
139 log.debug(_(u"Received a new avatar for entity %s") % entity_s)
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
140
887
dd2273617eb7 server (blog): fixes displaying default avatar
souliane <souliane@mailoo.org>
parents: 886
diff changeset
141 url = os.path.join(C.AVATARS_DIR, value) if value else ""
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
142 self.avatars_cache[entity_s] = url
749
7168a9873dde server_side (blog): fixes avatar callback
souliane <souliane@mailoo.org>
parents: 747
diff changeset
143 try:
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
144 self.waiting_deferreds.pop(entity_s).callback(url)
749
7168a9873dde server_side (blog): fixes avatar callback
souliane <souliane@mailoo.org>
parents: 747
diff changeset
145 except KeyError:
7168a9873dde server_side (blog): fixes avatar callback
souliane <souliane@mailoo.org>
parents: 747
diff changeset
146 pass
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
147
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
148 def getAvatarURL(self, pub_jid):
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
149 """Return avatar of a jid if in cache, else ask for it.
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
150
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
151 @param pub_jid (JID): publisher JID
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
152 @return: deferred avatar URL (unicode)
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
153 """
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
154 bare_jid_s = pub_jid.userhost()
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
155 try:
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
156 url = self.avatars_cache[bare_jid_s]
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
157 except KeyError:
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
158 self.avatars_cache[bare_jid_s] = '' # avoid to request the vcard several times
916
e9bb7257d051 server (blog): fixed static blog generation:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
159 # self.host.bridge.getCard(bare_jid_s, C.SERVICE_PROFILE)
e9bb7257d051 server (blog): fixed static blog generation:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
160 self.host.bridge.avatarGet(bare_jid_s, True, True, C.SERVICE_PROFILE)
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
161 d = defer.Deferred()
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
162 self.waiting_deferreds[bare_jid_s] = d
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
163 return d
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
164 return defer.succeed(url if url else C.DEFAULT_AVATAR_URL)
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
165
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
166 def render_GET(self, request):
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
167 if not request.postpath or len(request.postpath) > 2:
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
168 return self.useTemplate(request, "static_blog_error", {'message': "You must indicate a nickname"})
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
169
827
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
170 prof_requested = _unquote(request.postpath[0])
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
171
728
9d35d75566fb server_side (blog): clean error message when unknown profile is requested
souliane <souliane@mailoo.org>
parents: 727
diff changeset
172 try:
915
e9e9d9d893a8 server: renamed getProfileName to profileNameGet following core change and new conventions.
Goffi <goffi@goffi.org>
parents: 914
diff changeset
173 prof_found = self.host.bridge.profileNameGet(prof_requested)
728
9d35d75566fb server_side (blog): clean error message when unknown profile is requested
souliane <souliane@mailoo.org>
parents: 727
diff changeset
174 except DBusException:
9d35d75566fb server_side (blog): clean error message when unknown profile is requested
souliane <souliane@mailoo.org>
parents: 727
diff changeset
175 prof_found = None
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
176 if not prof_found or prof_found == C.SERVICE_PROFILE:
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
177 return self.useTemplate(request, "static_blog_error", {'message': "Invalid nickname"})
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
178
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
179 d = defer.Deferred()
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
180 # TODO: jid caching
747
efbd28b3438e static blog: fixed bad use of JID
Goffi <goffi@goffi.org>
parents: 746
diff changeset
181 self.host.bridge.asyncGetParamA('JabberID', 'Connection', 'value', profile_key=prof_found, callback=d.callback, errback=d.errback)
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
182 d.addCallback(self.render_gotJID, request, prof_found)
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
183 return server.NOT_DONE_YET
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
184
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
185 def render_gotJID(self, pub_jid_s, request, profile):
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
186 pub_jid = JID(pub_jid_s)
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
187
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
188 request.extra_dict = {} # will be used for RSM and MAM
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
189 self.parseURLParams(request)
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
190 if request.item_id:
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
191 # FIXME: this part seems useless
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
192 # we want a specific item
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
193 # item_ids = [request.item_id]
825
a3e888ac4964 server (blog): removed another max_items
Goffi <goffi@goffi.org>
parents: 824
diff changeset
194 # max_items = 1
a3e888ac4964 server (blog): removed another max_items
Goffi <goffi@goffi.org>
parents: 824
diff changeset
195 max_items = 0 # FIXME
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
196 else:
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
197 # max_items = int(request.extra_dict['rsm_max']) # FIXME
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
198 max_items = 0
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
199 # TODO: use max_items only when RSM is not available
586
3eb3a2c0c011 browser and server side: uses RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 487
diff changeset
200
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
201 if request.atom:
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
202 request.extra_dict.update(request.mam_extra)
882
d3d2b97aa12c blog (atom): removed hard ATOM_MAX_ITEMS value as it need to be used with MAM, may come back in the future
Goffi <goffi@goffi.org>
parents: 881
diff changeset
203 self.getAtom(pub_jid, max_items, request.extra_dict, request.extra_comments_dict, request, profile)
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
204
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
205 elif request.item_id:
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
206 # we can't merge mam_extra now because we'll use item_ids
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
207 self.getItemById(pub_jid, request.item_id, request.extra_dict,
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
208 request.extra_comments_dict, request, profile)
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
209 else:
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
210 request.extra_dict.update(request.mam_extra)
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
211 self.getItems(pub_jid, max_items, request.extra_dict,
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
212 request.extra_comments_dict, request, profile)
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
213
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
214 ## URL parsing
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
215
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
216 def parseURLParams(self, request):
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
217 """Parse the request URL parameters.
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
218
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
219 @param request: HTTP request
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
220 """
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
221 if len(request.postpath) > 1:
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
222 if request.postpath[1] == 'atom.xml': # return the atom feed
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
223 request.atom = True
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
224 request.item_id = None
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
225 else:
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
226 request.atom = False
827
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
227 request.item_id = _unquote(request.postpath[1])
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
228 else:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
229 request.item_id = None
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
230 request.atom = False
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
231
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
232 self.parseURLParamsRSM(request)
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
233 # XXX: request.display_single is True when only one blog post is visible
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
234 request.display_single = (request.item_id is not None) or int(request.extra_dict['rsm_max']) == 1
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
235 self.parseURLParamsCommentsRSM(request)
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
236 self.parseURLParamsMAM(request)
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
237
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
238 def parseURLParamsRSM(self, request):
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
239 """Parse RSM request data from the URL parameters for main items
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
240
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
241 fill request.extra_dict accordingly
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
242 @param request: HTTP request
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
243 """
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
244 if request.item_id: # XXX: item_id and RSM are not compatible
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
245 return
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
246 try:
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
247 rsm_max = int(request.args['max'][0])
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
248 if rsm_max > C.STATIC_RSM_MAX_LIMIT:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
249 log.warning(u"Request with rsm_max over limit ({})".format(rsm_max))
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
250 rsm_max = C.STATIC_RSM_MAX_LIMIT
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
251 request.extra_dict['rsm_max'] = unicode(rsm_max)
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
252 except (ValueError, KeyError):
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
253 request.extra_dict['rsm_max'] = unicode(C.STATIC_RSM_MAX_DEFAULT)
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
254 try:
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
255 request.extra_dict['rsm_index'] = request.args['index'][0]
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
256 except (ValueError, KeyError):
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
257 try:
829
c1000ea40e6c server (blog): fixed unicode handling for query args
Goffi <goffi@goffi.org>
parents: 828
diff changeset
258 request.extra_dict['rsm_before'] = request.args['before'][0].decode('utf-8')
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
259 except KeyError:
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
260 try:
829
c1000ea40e6c server (blog): fixed unicode handling for query args
Goffi <goffi@goffi.org>
parents: 828
diff changeset
261 request.extra_dict['rsm_after'] = request.args['after'][0].decode('utf-8')
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
262 except KeyError:
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
263 pass
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
264
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
265 def parseURLParamsCommentsRSM(self, request):
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
266 """Parse RSM request data from the URL parameters for comments
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
267
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
268 fill request.extra_dict accordingly
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
269 @param request: HTTP request
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
270 """
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
271 request.extra_comments_dict = {}
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
272 if request.display_single:
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
273 try:
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
274 rsm_max = int(request.args['comments_max'][0])
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
275 if rsm_max > C.STATIC_RSM_MAX_LIMIT:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
276 log.warning(u"Request with rsm_max over limit ({})".format(rsm_max))
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
277 rsm_max = C.STATIC_RSM_MAX_LIMIT
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
278 request.extra_comments_dict['rsm_max'] = unicode(rsm_max)
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
279 except (ValueError, KeyError):
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
280 request.extra_comments_dict['rsm_max'] = unicode(C.STATIC_RSM_MAX_COMMENTS_DEFAULT)
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
281 else:
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
282 request.extra_comments_dict['rsm_max'] = "0"
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
283
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
284 def parseURLParamsMAM(self, request):
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
285 """Parse MAM request data from the URL parameters for main items
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
286
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
287 fill request.extra_dict accordingly
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
288 @param request: HTTP request
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
289 """
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
290 # XXX: we use a separate dict for MAM as the filters are not used
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
291 # when display_single is set (because it then use item_ids which
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
292 # can't be used with MAM), but it is still used in this case
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
293 # for navigation links.
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
294 request.mam_extra = {}
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
295 try:
829
c1000ea40e6c server (blog): fixed unicode handling for query args
Goffi <goffi@goffi.org>
parents: 828
diff changeset
296 request.mam_extra['mam_filter_{}'.format(C.MAM_FILTER_CATEGORY)] = request.args['tag'][0].decode('utf-8')
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
297 except KeyError:
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
298 pass
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
299
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
300 ## Items retrieval
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
301
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
302 def getItemById(self, pub_jid, item_id, extra_dict, extra_comments_dict, request, profile):
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
303 """
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
304
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
305 @param pub_jid (jid.JID): publisher JID
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
306 @param item_id(unicode): ID of the item to retrieve
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
307 @param extra_dict (dict): extra configuration for initial items only
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
308 @param extra_comments_dict (dict): extra configuration for comments only
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
309 @param request: HTTP request
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
310 @param profile
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
311 """
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
312
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
313 def gotItems(items):
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
314 items, metadata = items
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
315 item = items[0] # assume there's only one item
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
316
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
317 def gotMetadata(result):
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
318 dummy, rsm_metadata = result
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
319 try:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
320 metadata['rsm_count'] = rsm_metadata['rsm_count']
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
321 except KeyError:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
322 pass
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
323 try:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
324 metadata['rsm_index'] = unicode(int(rsm_metadata['rsm_index'])-1)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
325 except KeyError:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
326 pass
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
327
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
328 metadata['rsm_first'] = metadata['rsm_last'] = item["id"]
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
329
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
330 def gotComments(comments):
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
331 # at this point we can merge mam dict
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
332 request.extra_dict.update(request.mam_extra)
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
333 # build the items as self.getItems would do it (and as self.renderHTML expects them to be)
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
334 comments = [(item['comments_service'], item['comments_node'], "", comments[0], comments[1])]
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
335 self.renderHTML([(item, comments)], metadata, request, pub_jid, profile)
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
336
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
337 # get the comments
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
338 # max_comments = int(extra_comments_dict['rsm_max']) # FIXME
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
339 max_comments = 0
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
340 # TODO: use max_comments only when RSM is not available
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
341 self.host.bridge.mbGet(item['comments_service'], item['comments_node'], max_comments, [],
826
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
342 extra_comments_dict, C.SERVICE_PROFILE,
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
343 callback=gotComments,
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
344 errback=lambda failure: self.renderError(failure, request, pub_jid))
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
345
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
346 # XXX: retrieve RSM information related to the main item. We can't do it while
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
347 # retrieving the item, because item_ids and rsm should not be used together.
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
348 self.host.bridge.mbGet(pub_jid.userhost(), '', 0, [],
826
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
349 {"rsm_max": "1", "rsm_after": item["id"]}, C.SERVICE_PROFILE,
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
350 callback=gotMetadata,
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
351 errback=lambda failure: self.renderError(failure, request, pub_jid))
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
352
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
353 # get the main item
826
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
354 self.host.bridge.mbGet(pub_jid.userhost(), '', 0, [item_id],
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
355 extra_dict, C.SERVICE_PROFILE,
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
356 callback=gotItems,
70939916dc80 server (blog): added unhandler errback in getItemById
Goffi <goffi@goffi.org>
parents: 825
diff changeset
357 errback=lambda failure: self.renderError(failure, request, pub_jid))
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
358
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
359 def getItems(self, pub_jid, max_items, extra_dict, extra_comments_dict, request, profile):
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
360 """
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
361
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
362 @param pub_jid (jid.JID): publisher JID
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
363 @param max_items(int): maximum number of item to get, C.NO_LIMIT for no limit
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
364 @param extra_dict (dict): extra configuration for initial items only
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
365 @param extra_comments_dict (dict): extra configuration for comments only
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
366 @param request: HTTP request
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
367 @param profile
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
368 """
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
369 def getResultCb(data, rt_session):
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
370 remaining, results = data
824
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
371 # we have requested one node only
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
372 assert remaining == 0
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
373 assert len(results) == 1
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
374 service, node, failure, items, metadata = results[0]
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
375 if failure:
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
376 self.renderError(failure, request, pub_jid)
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
377 else:
d990ae5612df server (blog): better handling of mbGetFromManyWithCommentsRTResult in getItems
Goffi <goffi@goffi.org>
parents: 823
diff changeset
378 self.renderHTML(items, metadata, request, pub_jid, profile)
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
379
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
380 def getResult(rt_session):
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
381 self.host.bridge.mbGetFromManyWithCommentsRTResult(rt_session, C.SERVICE_PROFILE,
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
382 callback=lambda data: getResultCb(data, rt_session),
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
383 errback=lambda failure: self.renderError(failure, request, pub_jid))
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
384
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
385 # max_comments = int(extra_comments_dict['rsm_max']) # FIXME
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
386 max_comments = 0
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
387 # TODO: use max_comments only when RSM is not available
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
388 self.host.bridge.mbGetFromManyWithComments(C.JID, [pub_jid.userhost()], max_items,
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
389 max_comments, extra_dict, extra_comments_dict,
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
390 C.SERVICE_PROFILE, callback=getResult)
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
391
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
392 def getAtom(self, pub_jid, max_items, extra_dict, extra_comments_dict, request, profile):
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
393 """
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
394
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
395 @param pub_jid (jid.JID): publisher JID
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
396 @param max_items(int): maximum number of item to get, C.NO_LIMIT for no limit
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
397 @param extra_dict (dict): extra configuration for initial items only
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
398 @param extra_comments_dict (dict): extra configuration for comments only
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
399 @param request: HTTP request
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
400 @param profile
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
401 """
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
402 def gotItems(data):
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
403 # Generate a clean atom feed with uri linking to this blog
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
404 # from microblog data
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
405 items, metadata= data
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
406 feed_elt = domish.Element((NS_ATOM, u'feed'))
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
407 title = _(u"{user}'s blog").format(user=profile)
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
408 feed_elt.addElement(u'title', content=title)
884
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
409
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
410 # to construct base blog url, we use base_url_ext if given by user
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
411 # and complete unknown parts with what we find in request's url
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
412 url_path = request.URLPath()
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
413 ext_data = self.host.base_url_ext_data
889
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
414 if request.requestHeaders.hasHeader('x-forwarded-host'):
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
415 # we are behing a proxy
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
416 # we fill proxy_scheme and proxy_netloc value
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
417 proxy_host = request.requestHeaders.getRawHeaders('x-forwarded-host')[0]
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
418 try:
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
419 proxy_server = request.requestHeaders.getRawHeaders('x-forwarded-server')[0]
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
420 except TypeError:
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
421 # no x-forwarded-server found, we use proxy_host
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
422 proxy_netloc = proxy_host
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
423 else:
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
424 # if the proxy host has a port, we use it with server name
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
425 proxy_port = urlparse.urlsplit('//{}'.format(proxy_host)).port
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
426 proxy_netloc = '{}:{}'.format(proxy_server, proxy_port) if proxy_port is not None else proxy_server
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
427 proxy_netloc = proxy_netloc.decode('utf-8')
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
428 try:
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
429 proxy_scheme = request.requestHeaders.getRawHeaders('x-forwarded-proto')[0].decode('utf-8')
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
430 except TypeError:
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
431 proxy_scheme = None
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
432 else:
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
433 proxy_scheme, proxy_netloc = None, None
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
434
884
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
435 base_blog_url = urlparse.urlunsplit((
889
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
436 ext_data.scheme or proxy_scheme or url_path.scheme.decode('utf-8'),
2b091322c6cb blog (atom feed): handle proxy headers like x-forwarded-host to adjust absolute URL in atom feed
Goffi <goffi@goffi.org>
parents: 887
diff changeset
437 ext_data.netloc or proxy_netloc or url_path.netloc.decode('utf-8'),
884
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
438 u'{}blog/{user}'.format(ext_data.path or u'/', user=profile),
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
439 '',
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 882
diff changeset
440 ''))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
441
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
442 # atom link
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
443 link_feed_elt = feed_elt.addElement('link')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
444 link_feed_elt['href'] = u'{base}/atom.xml'.format(base=base_blog_url)
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
445 link_feed_elt['type'] = u'application/atom+xml'
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
446 link_feed_elt['rel'] = u'self'
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
447
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
448 # blog link
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
449 link_blog_elt = feed_elt.addElement('link')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
450 link_blog_elt['rel'] = u'alternate'
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
451 link_blog_elt['type'] = u'text/html'
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
452 link_blog_elt['href'] = base_blog_url
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
453
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
454 # blog link XMPP uri
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
455 blog_xmpp_uri = metadata['uri']
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
456 link_blog_elt = feed_elt.addElement('link')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
457 link_blog_elt['rel'] = u'alternate'
892
bf2af257e18b blog: changed xmpp: alternate links MIME type for application/atom+xml
Goffi <goffi@goffi.org>
parents: 891
diff changeset
458 link_blog_elt['type'] = u'application/atom+xml'
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
459 link_blog_elt['href'] = blog_xmpp_uri
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
460
886
fe4d8dfaaa65 blog: OK, OK, I forgot the _quote method, it's better now :)
Goffi <goffi@goffi.org>
parents: 885
diff changeset
461 feed_elt.addElement('id', content=_quote(blog_xmpp_uri))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
462 updated_unix = max([float(item['updated']) for item in items])
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
463 updated_dt = datetime.fromtimestamp(updated_unix)
890
dc27e29b7c22 blog (atom feed): fixed forgotten content keyword, resulting in content published as namespace
Goffi <goffi@goffi.org>
parents: 889
diff changeset
464 feed_elt.addElement(u'updated', content=u'{}Z'.format(updated_dt.isoformat("T")))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
465
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
466 for item in items:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
467 entry_elt = feed_elt.addElement(u'entry')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
468
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
469 # Title
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
470 try:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
471 title = item['title']
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
472 except KeyError:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
473 # for microblog (without title), we use an abstract of content as title
900
f82b97d9ca5f server (blog): use unicode character for ellispsis in atom feed's microblog title
Goffi <goffi@goffi.org>
parents: 899
diff changeset
474 title = u'{}…'.format(u' '.join(item['content'][:70].split()))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
475 entry_elt.addElement(u'title', content=title)
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
476
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
477 # HTTP link
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
478 http_link_elt = entry_elt.addElement(u'link')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
479 http_link_elt['rel'] = u'alternate'
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
480 http_link_elt['type'] = u'text/html'
886
fe4d8dfaaa65 blog: OK, OK, I forgot the _quote method, it's better now :)
Goffi <goffi@goffi.org>
parents: 885
diff changeset
481 http_link_elt['href'] = u'{base}/{quoted_id}'.format(base=base_blog_url, quoted_id=_quote(item['id']))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
482 # XMPP link
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
483 xmpp_link_elt = entry_elt.addElement(u'link')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
484 xmpp_link_elt['rel'] = u'alternate'
894
e4e278255c9a blog: changed MIME type for xmpp: link, forgotten in rev dc27e29b7c22
Goffi <goffi@goffi.org>
parents: 893
diff changeset
485 xmpp_link_elt['type'] = u'application/atom+xml'
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
486 xmpp_link_elt['href'] = u'{blog_uri};item={item_id}'.format(blog_uri=blog_xmpp_uri, item_id=item['id'])
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
487
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
488 # date metadata
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
489 entry_elt.addElement(u'id', content=item['atom_id'])
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
490 updated = datetime.fromtimestamp(float(item['updated']))
890
dc27e29b7c22 blog (atom feed): fixed forgotten content keyword, resulting in content published as namespace
Goffi <goffi@goffi.org>
parents: 889
diff changeset
491 entry_elt.addElement(u'updated', content=u'{}Z'.format(updated.isoformat("T")))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
492 published = datetime.fromtimestamp(float(item['published']))
890
dc27e29b7c22 blog (atom feed): fixed forgotten content keyword, resulting in content published as namespace
Goffi <goffi@goffi.org>
parents: 889
diff changeset
493 entry_elt.addElement(u'published', content=u'{}Z'.format(published.isoformat("T")))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
494
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
495 # author metadata
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
496 author_elt = entry_elt.addElement(u'author')
890
dc27e29b7c22 blog (atom feed): fixed forgotten content keyword, resulting in content published as namespace
Goffi <goffi@goffi.org>
parents: 889
diff changeset
497 author_elt.addElement('name', content=item.get('author', profile))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
498 try:
890
dc27e29b7c22 blog (atom feed): fixed forgotten content keyword, resulting in content published as namespace
Goffi <goffi@goffi.org>
parents: 889
diff changeset
499 author_elt.addElement('uri', content=u'xmpp:{}'.format(item['author_jid']))
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
500 except KeyError:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
501 pass
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
502 try:
890
dc27e29b7c22 blog (atom feed): fixed forgotten content keyword, resulting in content published as namespace
Goffi <goffi@goffi.org>
parents: 889
diff changeset
503 author_elt.addElement('email', content=item['author_email'])
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
504 except KeyError:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
505 pass
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
506
899
bc3a3e804a7a blog(atom): added categories (tags) in Atom feed
Goffi <goffi@goffi.org>
parents: 898
diff changeset
507 # categories
bc3a3e804a7a blog(atom): added categories (tags) in Atom feed
Goffi <goffi@goffi.org>
parents: 898
diff changeset
508 for tag in data_format.dict2iter("tag", item):
bc3a3e804a7a blog(atom): added categories (tags) in Atom feed
Goffi <goffi@goffi.org>
parents: 898
diff changeset
509 category_elt = entry_elt.addElement(u"category")
bc3a3e804a7a blog(atom): added categories (tags) in Atom feed
Goffi <goffi@goffi.org>
parents: 898
diff changeset
510 category_elt["term"] = tag
bc3a3e804a7a blog(atom): added categories (tags) in Atom feed
Goffi <goffi@goffi.org>
parents: 898
diff changeset
511
879
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
512 # content
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
513 try:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
514 content_xhtml = item['content_xhtml']
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
515 except KeyError:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
516 content_elt = entry_elt.addElement('content', content='content')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
517 content_elt['type'] = 'text'
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
518 else:
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
519 content_elt = entry_elt.addElement('content')
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
520 content_elt['type'] = 'xhtml'
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
521 content_elt.addChild(xml_tools.ElementParser()(content_xhtml, namespace=C.NS_XHTML))
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
522
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
523 atom_feed = u'<?xml version="1.0" encoding="utf-8"?>\n{}'.format(feed_elt.toXml())
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
524 self.renderAtomFeed(atom_feed, request),
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
525
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
526 self.host.bridge.mbGet(pub_jid.userhost(), '', max_items, [], extra_dict, C.SERVICE_PROFILE, callback=gotItems)
2e0e9cf9efb4 blog (atom feed): fixed atom handling:
Goffi <goffi@goffi.org>
parents: 855
diff changeset
527
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
528 ## rendering
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
529
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
530 def _updateDict(self, value, dict_, key):
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
531 dict_[key] = value
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
532
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
533 def _getImageParams(self, options, key, default, alt):
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
534 """regexp from http://answers.oreilly.com/topic/280-how-to-validate-urls-with-regular-expressions/"""
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
535 url = options[key] if key in options else ''
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
536 regexp = r"^(https?|ftp)://[a-z0-9-]+(\.[a-z0-9-]+)+(/[\w-]+)*/[\w-]+\.(gif|png|jpg)$"
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
537 if re.match(regexp, url):
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
538 url = url
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
539 else:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
540 url = default
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
541 return BlogImage(url, alt)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
542
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
543 def renderError(self, failure, request, pub_jid):
891
14e611e38b67 server (blog): set HTTP status code to 500 on renderError
Goffi <goffi@goffi.org>
parents: 890
diff changeset
544 request.setResponseCode(500)
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
545 request.write(self.useTemplate(request, "static_blog_error", {'message': "Can't access requested data"}))
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
546 request.finish()
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
547
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
548 def renderHTML(self, items, metadata, request, pub_jid, profile):
441
63017904c4d4 server_side: static blog retrieve page's title, meta description and keywords from the parameters
souliane <souliane@mailoo.org>
parents: 436
diff changeset
549 """Retrieve the user parameters before actually rendering the static blog
586
3eb3a2c0c011 browser and server side: uses RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 487
diff changeset
550
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
551 @param items(list[tuple(dict, list)]): same as in self._renderHTML
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
552 @param metadata(dict): original node metadata
389
2d782349b88a server_side: display blog comments when you click on a main item header or title
souliane <souliane@mailoo.org>
parents: 388
diff changeset
553 @param request: HTTP request
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
554 @param pub_jid (JID): publisher JID
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
555 @param profile (unicode): %(doc_profile)s
389
2d782349b88a server_side: display blog comments when you click on a main item header or title
souliane <souliane@mailoo.org>
parents: 388
diff changeset
556 """
441
63017904c4d4 server_side: static blog retrieve page's title, meta description and keywords from the parameters
souliane <souliane@mailoo.org>
parents: 436
diff changeset
557 d_list = []
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
558 options = {}
441
63017904c4d4 server_side: static blog retrieve page's title, meta description and keywords from the parameters
souliane <souliane@mailoo.org>
parents: 436
diff changeset
559
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
560 d = self.getAvatarURL(pub_jid)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
561 d.addCallback(self._updateDict, options, 'avatar')
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
562 d.addErrback(self.renderError, request, pub_jid)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
563 d_list.append(d)
441
63017904c4d4 server_side: static blog retrieve page's title, meta description and keywords from the parameters
souliane <souliane@mailoo.org>
parents: 436
diff changeset
564
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
565 for param_name in PARAMS_TO_GET:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
566 d = defer.Deferred()
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
567 self.host.bridge.asyncGetParamA(param_name, C.STATIC_BLOG_KEY, 'value', C.SERVER_SECURITY_LIMIT, profile, callback=d.callback, errback=d.errback)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
568 d.addCallback(self._updateDict, options, param_name)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
569 d.addErrback(self.renderError, request, pub_jid)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
570 d_list.append(d)
441
63017904c4d4 server_side: static blog retrieve page's title, meta description and keywords from the parameters
souliane <souliane@mailoo.org>
parents: 436
diff changeset
571
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
572 dlist_d = defer.DeferredList(d_list)
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
573 dlist_d.addCallback(lambda dummy: self._renderHTML(items, metadata, options, request, pub_jid))
388
893451e35686 server_side: display blog banner if it is defined
souliane <souliane@mailoo.org>
parents: 375
diff changeset
574
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
575 def _renderHTML(self, items, metadata, options, request, pub_jid):
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
576 """Actually render the static blog.
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
577
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
578 If mblog_data is a list of dict, we are missing the comments items so we just
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
579 display the main items. If mblog_data is a list of couple, each couple is
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
580 associating a main item data with the list of its comments, so we render all.
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
581 @param items(list[tuple(dict, list)]): list of 2-tuple with
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
582 - item(dict): item microblog data
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
583 - comments_list(list[tuple]): list of 5-tuple with
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
584 - service (unicode): pubsub service where the comments node is
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
585 - node (unicode): comments node
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
586 - failure (unicode): empty in case of success, else error message
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
587 - comments(list[dict]): list of microblog data
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
588 - comments_metadata(dict): metadata of the comment node
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
589 @param metadata(dict): original node metadata
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
590 @param options: dict defining the blog's parameters
388
893451e35686 server_side: display blog banner if it is defined
souliane <souliane@mailoo.org>
parents: 375
diff changeset
591 @param request: the HTTP request
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
592 @param pub_jid (JID): publisher JID
388
893451e35686 server_side: display blog banner if it is defined
souliane <souliane@mailoo.org>
parents: 375
diff changeset
593 """
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
594 if not isinstance(options, dict):
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
595 options = {}
727
3bd097380da7 server side (blog): fixes displaying the avatar
souliane <souliane@mailoo.org>
parents: 726
diff changeset
596 user = sanitizeHtml(pub_jid.user)
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
597 base_url = os.path.join('/blog/',user)
441
63017904c4d4 server_side: static blog retrieve page's title, meta description and keywords from the parameters
souliane <souliane@mailoo.org>
parents: 436
diff changeset
598
483
0bbbef1d53a8 server side (blog): use user's avatar a the blog's favicon + small refactorization
souliane <souliane@mailoo.org>
parents: 481
diff changeset
599 def getOption(key):
726
e949b7c7ed9c server side (blog): fixes unicode error
souliane <souliane@mailoo.org>
parents: 725
diff changeset
600 return sanitizeHtml(options[key]) if key in options else ''
441
63017904c4d4 server_side: static blog retrieve page's title, meta description and keywords from the parameters
souliane <souliane@mailoo.org>
parents: 436
diff changeset
601
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
602 avatar = os.path.normpath('/{}'.format(getOption('avatar')))
702
d94feb0d849e server_side: give a better look to the static blog
souliane <souliane@mailoo.org>
parents: 694
diff changeset
603 title = getOption(C.STATIC_BLOG_PARAM_TITLE) or user
893
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
604 query_data = _urlencode(getDefaultQueryData(request)).decode('utf-8')
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
605
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
606 xmpp_uri = metadata['uri']
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
607 if len(items) == 1:
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
608 # FIXME: that's really not a good way to get item id
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
609 # this must be changed after static blog refactorisation
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
610 item_id = items[0][0]['id']
886
fe4d8dfaaa65 blog: OK, OK, I forgot the _quote method, it's better now :)
Goffi <goffi@goffi.org>
parents: 885
diff changeset
611 xmpp_uri+=u";item={}".format(_quote(item_id))
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
612
855
de17f7313cbe server (blog): fixed atom feed link
Goffi <goffi@goffi.org>
parents: 854
diff changeset
613 data = {'url_base': base_url,
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
614 'xmpp_uri': xmpp_uri,
855
de17f7313cbe server (blog): fixed atom feed link
Goffi <goffi@goffi.org>
parents: 854
diff changeset
615 'url_query': u'?{}'.format(query_data) if query_data else '' ,
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
616 'keywords': getOption(C.STATIC_BLOG_PARAM_KEYWORDS),
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
617 'description': getOption(C.STATIC_BLOG_PARAM_DESCRIPTION),
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
618 'title': title,
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
619 'favicon': avatar,
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
620 'banner_img': self._getImageParams(options, C.STATIC_BLOG_PARAM_BANNER, avatar, title)
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
621 }
586
3eb3a2c0c011 browser and server side: uses RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 487
diff changeset
622
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
623 data['navlinks'] = NavigationLinks(request, items, metadata, base_url)
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
624 data['messages'] = []
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
625 for item in items:
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
626 item, comments_list = item
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
627 comments, comments_count = [], 0
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
628 for node_comments in comments_list:
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
629 comments.extend(node_comments[3])
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
630 try:
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
631 comments_count += int(node_comments[4]['rsm_count'])
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
632 except KeyError:
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
633 pass
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
634 data['messages'].append(BlogMessage(request, base_url, item, comments, comments_count))
586
3eb3a2c0c011 browser and server side: uses RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 487
diff changeset
635
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
636 request.write(self.useTemplate(request, 'static_blog', data))
10
c28a4840e1a8 server: microblog resource
Goffi <goffi@goffi.org>
parents:
diff changeset
637 request.finish()
243
63e9b680d3e7 browser_side, blog: better PEP8 compliance
souliane <souliane@mailoo.org>
parents: 229
diff changeset
638
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
639 def renderAtomFeed(self, feed, request):
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
640 request.write(feed.encode('utf-8'))
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
641 request.finish()
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
642
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
643
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
644 class NavigationLinks(object):
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
645
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
646 def __init__(self, request, items, metadata, base_url):
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
647 """Build the navigation links.
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
648
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
649 @param items (list): list of items
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
650 @param metadata (dict): rsm data
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
651 @param base_url (unicode): the base URL for this user's blog
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
652 @return: dict
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
653 """
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
654 # FIXME: this code must be refactorized, it is fragile
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
655 # and difficult to maintain
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
656
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
657 # query data which must be present in all links
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
658 default_query_data = getDefaultQueryData(request)
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
659
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
660 # which links we need to display
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
661 if request.display_single:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
662 links = ('later_message', 'older_message')
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
663 # key must exist when using the template
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
664 self.later_messages = self.older_messages = ''
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
665 else:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
666 links = ('later_messages', 'older_messages')
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
667 self.later_message = self.older_message = ''
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
668
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
669 # now we set the links according to RSM
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
670 for key in links:
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
671 query_data = default_query_data.copy()
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
672
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
673 if key.startswith('later_message'):
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
674 try:
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
675 index = int(metadata['rsm_index'])
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
676 except (KeyError, ValueError):
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
677 pass
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
678 else:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
679 if index == 0:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
680 # we don't show this link on first page
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
681 setattr(self, key, '')
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
682 continue
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
683 try:
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
684 query_data['before'] = metadata['rsm_first'].encode('utf-8')
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
685 except KeyError:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
686 pass
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
687 else:
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
688 try:
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
689 index = int(metadata['rsm_index'])
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
690 count = int(metadata.get('rsm_count'))
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
691 except (KeyError, ValueError):
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
692 # XXX: if we don't have index or count, we can't know if we
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
693 # are on the last page or not
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
694 pass
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
695 else:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
696 # if we have index, we don't show the after link
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
697 # on the last page
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
698 if index + len(items) >= count:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
699 setattr(self, key, '')
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
700 continue
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
701 try:
880
ccbad50e1426 blog, themes(default): added <link> element referencing xmpp: uri of the item
Goffi <goffi@goffi.org>
parents: 879
diff changeset
702 query_data['after'] = metadata['rsm_last'].encode('utf-8')
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
703 except KeyError:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
704 pass
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
705
708
e9a6cbb924e6 server_side: fixes static blog navigation links
souliane <souliane@mailoo.org>
parents: 705
diff changeset
706 if request.display_single:
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
707 query_data['max'] = 1
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
708
893
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
709 link = "{}?{}".format(base_url, _urlencode(query_data))
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
710 setattr(self, key, BlogLink(link, key, key.replace('_', ' ')))
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
711
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
713 class BlogImage(object):
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
714
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
715 def __init__(self, url_, alt):
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
716 self.url = url_
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
717 self.alt = alt
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
718
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
719
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
720 class BlogLink(object):
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
721
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
722 def __init__(self, url_, style, text):
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
723 self.url = url_
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
724 self.style = style
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
725 self.text = text
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
726
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
727
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
728 class BlogMessage(object):
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
729
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
730 def __init__(self, request, base_url, entry, comments=None, comments_count=0):
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
731 """
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
732
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
733 @param request: HTTP request
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
734 @param base_url (unicode): the base URL
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
735 @param entry(dict): item microblog data
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
736 @param comments(list[dict]): list of microblog data
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
737 @param comments_count (int): total number of comments
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
738 """
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
739 if comments is None:
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
740 comments = []
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
741 timestamp = float(entry.get('published', 0))
746
25984ca4aef2 server side: special handling of Connection/JabberID and Connection/autoconnect parameter which has needed by QuickApp but restricted by security limit
Goffi <goffi@goffi.org>
parents: 743
diff changeset
742
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
743 # FIXME: for now we assume that the comments' depth is only 1
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
744 is_comment = not entry.get('comments', False)
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
745
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
746 self.date = datetime.fromtimestamp(timestamp)
725
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
747 self.type = "comment" if is_comment else "main_item"
c1abaa91a121 server (blog): update to the new mechanism in XEP-0277 + improvement:
souliane <souliane@mailoo.org>
parents: 717
diff changeset
748 self.style = 'mblog_comment' if is_comment else ''
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
749 self.content = self.getText(entry, 'content')
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
750
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
751 if is_comment:
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
752 self.author = (_(u"from {}").format(entry['author']))
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
753 else:
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
754 self.author = '&nbsp;'
827
f1fc7245b910 server (blog): moved _quote and _unquote to module functions, and use them in BlogMessage.url
Goffi <goffi@goffi.org>
parents: 826
diff changeset
755 self.url = "{}/{}".format(base_url, _quote(entry['id']))
828
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
756 query_data = getDefaultQueryData(request)
0c824ebe9d87 server (blog): implemented tag/category filtering:
Goffi <goffi@goffi.org>
parents: 827
diff changeset
757 if query_data:
893
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
758 self.url += '?{}'.format(_urlencode(query_data))
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
759 self.title = self.getText(entry, 'title')
898
2d15b484ca33 blog, browser: updated imports to reflect renaming of common.py to common/data_format.py
Goffi <goffi@goffi.org>
parents: 896
diff changeset
760 self.tags = [sanitizeHtml(tag) for tag in data_format.dict2iter('tag', entry)]
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
761
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
762 count_text = lambda count: D_(u'comments') if count > 1 else D_(u'comment')
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
763
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
764 self.comments_text = u"{} {}".format(comments_count, count_text(comments_count))
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
765
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
766 delta = comments_count - len(comments)
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
767 if request.display_single and delta > 0:
893
298fbe562060 blog: escape "&" when encoding URL, so they can be used without escaping in the HTML template
Goffi <goffi@goffi.org>
parents: 892
diff changeset
768 prev_url = "{}?{}".format(self.url, _urlencode({'comments_max': comments_count}))
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
769 prev_text = D_(u"show {count} previous {comments}").format(
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
770 count = delta, comments = count_text(delta))
712
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
771 self.all_comments_link = BlogLink(prev_url, "comments_link", prev_text)
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
772
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
773 if comments:
bf562fb9c273 server_side: use Jinja2 template engine for static blog
souliane <souliane@mailoo.org>
parents: 708
diff changeset
774 self.comments = [BlogMessage(request, base_url, comment) for comment in comments]
704
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
775
5319110a862c server_side: static blog uses the default template
souliane <souliane@mailoo.org>
parents: 702
diff changeset
776 def getText(self, entry, key):
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
777 try:
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
778 xhtml = entry['{}_xhtml'.format(key)]
823
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
779 except KeyError:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
780 try:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
781 processor = addURLToText if key.startswith('content') else sanitizeHtml
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
782 return convertNewLinesToXHTML(processor(entry[key]))
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
783 except KeyError:
027139763511 server (blog): cleaning & improvments:
Goffi <goffi@goffi.org>
parents: 818
diff changeset
784 return None
854
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
785 else:
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
786 # FIXME: empty <div /> elements provoke rendering issue
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
787 # this regex is a temporary workadound, need more investigation
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
788 xhtml = re_strip_empty_div.sub("", xhtml)
0dfb76b13115 server (blog): fixes:
Goffi <goffi@goffi.org>
parents: 847
diff changeset
789 return fixXHTMLLinks(xhtml)