Projet

Général

Profil

Télécharger (19,3 ko) Statistiques
| Branche: | Tag: | Révision:

root / auquotidien / modules / root.py @ fd36f89b

1 3f5b2572 Frédéric Péters
import urllib.parse
2
3 42df9640 Frédéric Péters
from quixote import get_publisher, get_response, get_request, redirect, get_session
4 32ba0ff4 Frédéric Péters
from quixote.directory import Directory
5 8eaaa2b5 Frédéric Péters
from quixote.html import TemplateIO, htmltext
6 4ee9f1b4 Frédéric Péters
7 3e037e2e Frédéric Péters
from wcs.qommon import _
8 54d5565e Frédéric Péters
from wcs.qommon.misc import get_variadic_url, simplify
9 37532a71 Frédéric Péters
10 4ee9f1b4 Frédéric Péters
import os
11 76dabe9a Jérôme Schneider
import re
12 f0db9c17 Jérôme Schneider
import string
13 3cb413c5 Frédéric Péters
14 b5e52696 Frédéric Péters
try:
15
    import lasso
16
except ImportError:
17
    pass
18 4ee9f1b4 Frédéric Péters
19 05c98e5f Frédéric Péters
import wcs
20
import wcs.root
21 3e037e2e Frédéric Péters
from wcs import qommon
22 a9ee9454 Nicolas ROCHE
from wcs.forms.root import RootDirectory as FormsRootDirectory
23 3c45b4bd Frédéric Péters
from wcs.qommon import N_, get_cfg, get_logger
24 3e037e2e Frédéric Péters
from wcs.qommon import template
25
from wcs.qommon import errors
26
from wcs.qommon.form import *
27
from wcs.qommon import logger
28 c1b8f5f3 Frédéric Péters
from wcs.roles import logged_users_role
29 05c98e5f Frédéric Péters
30 3e037e2e Frédéric Péters
from wcs.qommon import emails
31
from wcs.qommon.sms import SMS
32 05c98e5f Frédéric Péters
from wcs.categories import Category
33 bab7506a Frédéric Péters
from wcs.formdef import FormDef
34 b255cad1 Thomas NOEL
from wcs.data_sources import NamedDataSource
35 3e037e2e Frédéric Péters
from wcs.qommon.tokens import Token
36
from wcs.qommon.admin.emails import EmailsDirectory
37 5f2a9813 Frédéric Péters
from wcs.qommon.admin.texts import TextsDirectory
38 05c98e5f Frédéric Péters
39 3e037e2e Frédéric Péters
from .myspace import MyspaceDirectory
40 3be7cfa9 Frédéric Péters
41 a673a665 Frédéric Péters
import wcs.forms.root
42
from wcs.workflows import Workflow
43 74828398 Frédéric Péters
from wcs.forms.preview import PreviewDirectory
44 a673a665 Frédéric Péters
45 3e037e2e Frédéric Péters
from .saml2 import Saml2Directory
46 42c14444 Frédéric Péters
47 05c98e5f Frédéric Péters
OldRootDirectory = wcs.root.RootDirectory
48
49 3e037e2e Frédéric Péters
import wcs.qommon.ident.password
50
import wcs.qommon.ident.idp
51 e5c0a39d Frédéric Péters
52 9d071a47 Frédéric Péters
53 818bc7c2 Frédéric Péters
def category_get_homepage_position(self):
54
    if hasattr(self, 'homepage_position') and self.homepage_position:
55
        return self.homepage_position
56 aeda4490 Frédéric Péters
    if self.url_name == 'consultations':
57
        return '2nd'
58
    return '1st'
59 2663e08e Frédéric Péters
60
61 818bc7c2 Frédéric Péters
Category.get_homepage_position = category_get_homepage_position
62 a673a665 Frédéric Péters
63 2663e08e Frédéric Péters
64 fc4cb69d Frédéric Péters
def category_get_limit(self):
65
    if hasattr(self, 'limit') and self.limit is not None:
66
        return self.limit
67 743e9b84 Frédéric Péters
    return 7
68 2663e08e Frédéric Péters
69
70 fc4cb69d Frédéric Péters
Category.get_limit = category_get_limit
71
72 f91cae66 Frédéric Péters
Category.TEXT_ATTRIBUTES = ['name', 'url_name', 'description', 'homepage_position']
73
Category.INT_ATTRIBUTES = ['position', 'limit']
74
75 b7a2808c Frédéric Péters
OldRegisterDirectory = wcs.root.RegisterDirectory
76
77 2663e08e Frédéric Péters
78 b7a2808c Frédéric Péters
class AlternateRegisterDirectory(OldRegisterDirectory):
79
    def _q_traverse(self, path):
80
        get_response().filter['bigdiv'] = 'new_member'
81
        return OldRegisterDirectory._q_traverse(self, path)
82
83 8eaaa2b5 Frédéric Péters
    def _q_index(self):
84 93b7c686 Frédéric Péters
        get_logger().info('register')
85 0f477ab9 Frédéric Péters
        ident_methods = get_cfg('identification', {}).get('methods', [])
86
87
        if len(ident_methods) == 0:
88
            idps = get_cfg('idp', {})
89
            if len(idps) == 0:
90
                return template.error_page(_('Authentication subsystem is not yet configured.'))
91 2663e08e Frédéric Péters
            ident_methods = ['idp']  # fallback to old behaviour; saml.
92 0f477ab9 Frédéric Péters
93
        if len(ident_methods) == 1:
94
            method = ident_methods[0]
95 ffffccd8 Frédéric Péters
        else:
96
            method = 'password'
97 0f477ab9 Frédéric Péters
98 3e037e2e Frédéric Péters
        return wcs.qommon.ident.register(method)
99 b7a2808c Frédéric Péters
100 2663e08e Frédéric Péters
101 b7a2808c Frédéric Péters
OldLoginDirectory = wcs.root.LoginDirectory
102
103 2663e08e Frédéric Péters
104 b7a2808c Frédéric Péters
class AlternateLoginDirectory(OldLoginDirectory):
105
    def _q_traverse(self, path):
106
        get_response().filter['bigdiv'] = 'member'
107
        return OldLoginDirectory._q_traverse(self, path)
108
109 8eaaa2b5 Frédéric Péters
    def _q_index(self):
110 b6daa136 Frédéric Péters
        get_logger().info('login')
111
        ident_methods = get_cfg('identification', {}).get('methods', [])
112
113 8a93af11 Jérôme Schneider
        if get_request().form.get('ReturnUrl'):
114 15327599 Frédéric Péters
            get_request().form['next'] = get_request().form.pop('ReturnUrl')
115 8a93af11 Jérôme Schneider
116
        if 'IsPassive' in get_request().form and 'idp' in ident_methods:
117
            # if isPassive is given in query parameters, we restrict ourselves
118
            # to saml login.
119
            ident_methods = ['idp']
120
121 e5c0a39d Frédéric Péters
        if len(ident_methods) > 1 and 'idp' in ident_methods:
122
            # if there is more than one identification method, and there is a
123
            # possibility of SSO, if we got there as a consequence of an access
124
            # unauthorized url on admin/ or backoffice/, then idp auth method
125
            # is chosen forcefully.
126 15327599 Frédéric Péters
            after_url = get_request().form.get('next')
127 e5c0a39d Frédéric Péters
            if after_url:
128 a21e96d6 Frédéric Péters
                root_url = get_publisher().get_root_url()
129 364be777 Frédéric Péters
                after_path = urllib.parse.urlparse(after_url)[2]
130 2663e08e Frédéric Péters
                after_path = after_path[len(root_url) :]
131
                if after_path.startswith(str('admin')) or after_path.startswith(str('backoffice')):
132 e5c0a39d Frédéric Péters
                    ident_methods = ['idp']
133
134 b6daa136 Frédéric Péters
        # don't display authentication system choice
135 e5c0a39d Frédéric Péters
        if len(ident_methods) == 1:
136
            method = ident_methods[0]
137
            try:
138 3e037e2e Frédéric Péters
                return wcs.qommon.ident.login(method)
139 e5c0a39d Frédéric Péters
            except KeyError:
140
                get_logger().error('failed to login with method %s' % method)
141
                return errors.TraversalError()
142
143
        if sorted(ident_methods) == ['idp', 'password']:
144 8eaaa2b5 Frédéric Péters
            r = TemplateIO(html=True)
145 816b457b Frédéric Péters
            get_response().breadcrumb.append(('login', _('Login')))
146 e5c0a39d Frédéric Péters
            identities_cfg = get_cfg('identities', {})
147 2663e08e Frédéric Péters
            form = Form(enctype='multipart/form-data', id='login-form', use_tokens=False)
148 e5c0a39d Frédéric Péters
            if identities_cfg.get('email-as-username', False):
149 2663e08e Frédéric Péters
                form.add(StringWidget, 'username', title=_('Email'), size=25, required=True)
150 e5c0a39d Frédéric Péters
            else:
151 2663e08e Frédéric Péters
                form.add(StringWidget, 'username', title=_('Username'), size=25, required=True)
152
            form.add(PasswordWidget, 'password', title=_('Password'), size=25, required=True)
153 e5c0a39d Frédéric Péters
            form.add_submit('submit', _('Connect'))
154
            if form.is_submitted() and not form.has_errors():
155 3e037e2e Frédéric Péters
                tmp = wcs.qommon.ident.password.MethodDirectory().login_submit(form)
156 e5c0a39d Frédéric Péters
                if not form.has_errors():
157
                    return tmp
158
159 8eaaa2b5 Frédéric Péters
            r += htmltext('<div id="login-password">')
160
            r += get_session().display_message()
161
            r += form.render()
162 b6daa136 Frédéric Péters
163 f311c7dc Frédéric Péters
            base_url = get_publisher().get_root_url()
164 8eaaa2b5 Frédéric Péters
            r += htmltext('<p><a href="%sident/password/forgotten">%s</a></p>') % (
165 2663e08e Frédéric Péters
                base_url,
166
                _('Forgotten password ?'),
167
            )
168 e5c0a39d Frédéric Péters
169 8eaaa2b5 Frédéric Péters
            r += htmltext('</div>')
170 e5c0a39d Frédéric Péters
171
            # XXX: this part only supports a single IdP
172 8eaaa2b5 Frédéric Péters
            r += htmltext('<div id="login-sso">')
173
            r += TextsDirectory.get_html_text('aq-sso-text')
174 2663e08e Frédéric Péters
            form = Form(enctype='multipart/form-data', action='%sident/idp/login' % base_url)
175 e5c0a39d Frédéric Péters
            form.add_hidden('method', 'idp')
176
            for kidp, idp in get_cfg('idp', {}).items():
177 2663e08e Frédéric Péters
                p = lasso.Provider(
178
                    lasso.PROVIDER_ROLE_IDP,
179
                    misc.get_abs_path(idp['metadata']),
180
                    misc.get_abs_path(idp.get('publickey')),
181
                    None,
182
                )
183 e5c0a39d Frédéric Péters
                form.add_hidden('idp', p.providerId)
184
                break
185
            form.add_submit('submit', _('Connect'))
186 8eaaa2b5 Frédéric Péters
187
            r += form.render()
188
            r += htmltext('</div>')
189 e5c0a39d Frédéric Péters
190
            get_request().environ['REQUEST_METHOD'] = 'GET'
191
192 2663e08e Frédéric Péters
            r += htmltext(
193
                """<script type="text/javascript">
194 e5c0a39d Frédéric Péters
              document.getElementById('login-form')['username'].focus();
195 2663e08e Frédéric Péters
            </script>"""
196
            )
197 8eaaa2b5 Frédéric Péters
            return r.getvalue()
198 e5c0a39d Frédéric Péters
        else:
199
            return OldLoginDirectory._q_index(self)
200 32ba0ff4 Frédéric Péters
201
202 974e8f3c Frédéric Péters
OldIdentDirectory = wcs.root.IdentDirectory
203 2663e08e Frédéric Péters
204
205 974e8f3c Frédéric Péters
class AlternateIdentDirectory(OldIdentDirectory):
206
    def _q_traverse(self, path):
207
        get_response().filter['bigdiv'] = 'member'
208
        return OldIdentDirectory._q_traverse(self, path)
209
210
211 74828398 Frédéric Péters
class AlternatePreviewDirectory(PreviewDirectory):
212
    def _q_traverse(self, path):
213
        get_response().filter['bigdiv'] = 'rub_service'
214
        return super(AlternatePreviewDirectory, self)._q_traverse(path)
215
216
217 05c98e5f Frédéric Péters
class AlternateRootDirectory(OldRootDirectory):
218 2663e08e Frédéric Péters
    _q_exports = [
219
        '',
220
        'admin',
221
        'backoffice',
222
        'forms',
223
        'login',
224
        'logout',
225
        'saml',
226
        'register',
227
        'ident',
228
        'afterjobs',
229
        'myspace',
230
        'services',
231
        'categories',
232
        'user',
233
        ('tmp-upload', 'tmp_upload'),
234
        'json',
235
        '__version__',
236
        'roles',
237
        'api',
238
        'code',
239
        'fargo',
240
        'tryauth',
241
        'auth',
242
        'preview',
243
        ('reload-top', 'reload_top'),
244
        'static',
245
        ('i18n.js', 'i18n_js'),
246
        'actions',
247
    ]
248 32ba0ff4 Frédéric Péters
249 b7a2808c Frédéric Péters
    register = AlternateRegisterDirectory()
250
    login = AlternateLoginDirectory()
251 974e8f3c Frédéric Péters
    ident = AlternateIdentDirectory()
252 9c91e126 Frédéric Péters
    myspace = MyspaceDirectory()
253 42c14444 Frédéric Péters
    saml = Saml2Directory()
254 f632025f Frédéric Péters
    code = wcs.forms.root.TrackingCodesDirectory()
255 74828398 Frédéric Péters
    preview = AlternatePreviewDirectory()
256 05c98e5f Frédéric Péters
257 6084fafc Frédéric Péters
    def get_substitution_variables(self):
258 d20d0549 Frédéric Péters
        return {'links': ''}
259 6084fafc Frédéric Péters
260 a673a665 Frédéric Péters
    def _q_traverse(self, path):
261 c7c7c03b Frédéric Péters
        self.feed_substitution_parts()
262 78d76e15 Thomas Noël
263 a673a665 Frédéric Péters
        response = get_response()
264
        if not hasattr(response, 'filter'):
265
            response.filter = {}
266 6084fafc Frédéric Péters
267 7104f0af Frédéric Péters
        response.filter['auquotidien'] = True
268 46f212ea Frédéric Péters
        if not path or (path[0] not in ('api', 'backoffice') and not get_request().is_json()):
269 e3abbabb Frédéric Péters
            # api & backoffice have no use for a side box
270 a604135e Frédéric Péters
            response.filter['gauche'] = lambda x: self.box_side(path)
271 6084fafc Frédéric Péters
        get_publisher().substitutions.feed(self)
272
273 2663e08e Frédéric Péters
        response.breadcrumb = [('', _('Home'))]
274 a3f1a639 Frédéric Péters
275
        if not self.admin:
276
            self.admin = get_publisher().admin_directory_class()
277
278
        if not self.backoffice:
279
            self.backoffice = get_publisher().backoffice_directory_class()
280
281 4ab604a8 Frédéric Péters
        return super()._q_traverse(path)
282 a673a665 Frédéric Péters
283 99e8cf1c Frédéric Péters
    def json(self):
284
        return FormsRootDirectory().json()
285 a673a665 Frédéric Péters
286 7bd6e6b6 Frédéric Péters
    def categories(self):
287
        return FormsRootDirectory().categories()
288
289 8eaaa2b5 Frédéric Péters
    def _q_index(self):
290 8a2a071e Frédéric Péters
        if get_request().is_json():
291 99e8cf1c Frédéric Péters
            return FormsRootDirectory().json()
292
293 59b3ffe6 Frédéric Péters
        root_url = get_publisher().get_root_url()
294 78631659 Frédéric Péters
        if get_request().user and get_request().user.anonymous and get_request().user.lasso_dump:
295 59b3ffe6 Frédéric Péters
            return redirect('%smyspace/new' % root_url)
296 b863d18f Frédéric Péters
297 683adbfb Frédéric Péters
        redirect_url = get_cfg('misc', {}).get('homepage-redirect-url')
298
        if redirect_url:
299 2663e08e Frédéric Péters
            return redirect(
300
                misc.get_variadic_url(redirect_url, get_publisher().substitutions.get_context_variables())
301
            )
302 683adbfb Frédéric Péters
303 32ba0ff4 Frédéric Péters
        template.html_top()
304 8eaaa2b5 Frédéric Péters
        r = TemplateIO(html=True)
305 8c6e929c Frédéric Péters
        get_response().filter['is_index'] = True
306 05c98e5f Frédéric Péters
307 8eaaa2b5 Frédéric Péters
        r += htmltext('<div id="centre">')
308
        r += self.box_services(position='1st')
309
        r += htmltext('</div>')
310
        r += htmltext('<div id="droite">')
311
        r += self.myspace_snippet()
312
        r += self.box_services(position='2nd')
313
        r += self.consultations()
314
        r += htmltext('</div>')
315 b08ecb38 Frédéric Péters
316 a014cc08 Frédéric Péters
        user = get_request().user
317
        if user and user.can_go_in_backoffice():
318
            get_response().filter['backoffice'] = True
319
320 8eaaa2b5 Frédéric Péters
        return r.getvalue()
321
322
    def services(self):
323 dd7508b5 Frédéric Péters
        template.html_top()
324 9d59704c Frédéric Péters
        get_response().filter['bigdiv'] = 'rub_service'
325 2663e08e Frédéric Péters
        return self.box_services(level=2)
326 dd7508b5 Frédéric Péters
327 8eaaa2b5 Frédéric Péters
    def box_services(self, level=3, position=None):
328 05c98e5f Frédéric Péters
        ## Services
329 c1b8f5f3 Frédéric Péters
        if get_request().user and get_request().user.roles:
330
            accepted_roles = get_request().user.roles
331
        else:
332
            accepted_roles = []
333
334 2663e08e Frédéric Péters
        cats = Category.select(order_by='name')
335 aeda4490 Frédéric Péters
        cats = [x for x in cats if x.url_name != 'consultations']
336 46c896b9 Frédéric Péters
        Category.sort_by_position(cats)
337 dfe32f4f Frédéric Péters
338 2663e08e Frédéric Péters
        all_formdefs = FormDef.select(
339
            lambda x: not x.is_disabled() or x.disabled_redirection, order_by='name'
340
        )
341 dfe32f4f Frédéric Péters
342 aeda4490 Frédéric Péters
        if position:
343
            t = self.display_list_of_formdefs(
344 2663e08e Frédéric Péters
                [x for x in cats if x.get_homepage_position() == position], all_formdefs, accepted_roles
345
            )
346 aeda4490 Frédéric Péters
        else:
347
            t = self.display_list_of_formdefs(cats, all_formdefs, accepted_roles)
348
349
        if not t:
350
            return
351
352 8eaaa2b5 Frédéric Péters
        r = TemplateIO(html=True)
353
354 aeda4490 Frédéric Péters
        if position == '2nd':
355 8eaaa2b5 Frédéric Péters
            r += htmltext('<div id="services-2nd">')
356 aeda4490 Frédéric Péters
        else:
357 8eaaa2b5 Frédéric Péters
            r += htmltext('<div id="services">')
358 aeda4490 Frédéric Péters
        if level == 2:
359 8eaaa2b5 Frédéric Péters
            r += htmltext('<h2>%s</h2>') % _('Services')
360 aeda4490 Frédéric Péters
        else:
361 8eaaa2b5 Frédéric Péters
            r += htmltext('<h3>%s</h3>') % _('Services')
362 aeda4490 Frédéric Péters
363 2c1e65a4 Frédéric Péters
        if 'auquotidien-welcome-in-services' in get_response().filter.get('keywords', []):
364 0cc2a15b Frédéric Péters
            homepage_text = TextsDirectory.get_html_text('aq-home-page')
365
            if homepage_text:
366 8eaaa2b5 Frédéric Péters
                r += htmltext('<div id="home-page-intro">')
367
                r += homepage_text
368
                r += htmltext('</div>')
369 9f803542 Frédéric Péters
370 8eaaa2b5 Frédéric Péters
        r += htmltext('<ul>')
371
        r += t
372
        r += htmltext('</ul>')
373 aeda4490 Frédéric Péters
374 8eaaa2b5 Frédéric Péters
        r += htmltext('</div>')
375
        return r.getvalue()
376 aeda4490 Frédéric Péters
377 8eaaa2b5 Frédéric Péters
    def display_list_of_formdefs(self, cats, all_formdefs, accepted_roles):
378
        r = TemplateIO(html=True)
379 46c896b9 Frédéric Péters
        for category in cats:
380 05c98e5f Frédéric Péters
            if category.url_name == 'consultations':
381 b08ecb38 Frédéric Péters
                self.consultations_category = category
382 05c98e5f Frédéric Péters
                continue
383 bb495a1f Frédéric Péters
            formdefs = [x for x in all_formdefs if str(x.category_id) == str(category.id)]
384 1eaca06e Thomas Noël
            formdefs_advertise = []
385 c1b8f5f3 Frédéric Péters
386
            for formdef in formdefs[:]:
387 2663e08e Frédéric Péters
                if formdef.is_disabled():  # is a redirection
388 1eaca06e Thomas Noël
                    continue
389 c1b8f5f3 Frédéric Péters
                if not formdef.roles:
390
                    continue
391
                if not get_request().user:
392 1eaca06e Thomas Noël
                    if formdef.always_advertise:
393
                        formdefs_advertise.append(formdef)
394 c1b8f5f3 Frédéric Péters
                    formdefs.remove(formdef)
395
                    continue
396
                if logged_users_role().id in formdef.roles:
397
                    continue
398
                for q in accepted_roles:
399
                    if q in formdef.roles:
400
                        break
401 eac4c202 Frédéric Péters
                else:
402 1eaca06e Thomas Noël
                    if formdef.always_advertise:
403
                        formdefs_advertise.append(formdef)
404 eac4c202 Frédéric Péters
                    formdefs.remove(formdef)
405 c1b8f5f3 Frédéric Péters
406 1eaca06e Thomas Noël
            if not formdefs and not formdefs_advertise:
407 c1b8f5f3 Frédéric Péters
                continue
408
409 78e14232 Frédéric Péters
            keywords = {}
410
            for formdef in formdefs:
411
                for keyword in formdef.keywords_list:
412
                    keywords[keyword] = True
413
414
            r += htmltext('<li id="category-%s" data-keywords="%s">') % (
415 2663e08e Frédéric Péters
                category.url_name,
416
                ' '.join(keywords),
417
            )
418 8eaaa2b5 Frédéric Péters
            r += htmltext('<strong>')
419
            r += htmltext('<a href="%s/">') % category.url_name
420
            r += category.name
421
            r += htmltext('</a></strong>\n')
422 c410b015 Frédéric Péters
            r += category.get_description_html_text()
423 8eaaa2b5 Frédéric Péters
            r += htmltext('<ul>')
424 fc4cb69d Frédéric Péters
            limit = category.get_limit()
425
            for formdef in formdefs[:limit]:
426 78e14232 Frédéric Péters
                r += htmltext('<li data-keywords="%s">') % ' '.join(formdef.keywords_list)
427 94ca5a2e Frédéric Péters
                classes = []
428
                if formdef.is_disabled() and formdef.disabled_redirection:
429
                    classes.append('redirection')
430
                r += htmltext('<a class="%s" href="%s/%s/">%s</a>') % (
431 2663e08e Frédéric Péters
                    ' '.join(classes),
432
                    category.url_name,
433
                    formdef.url_name,
434
                    formdef.name,
435
                )
436 8eaaa2b5 Frédéric Péters
                r += htmltext('</li>\n')
437 1eaca06e Thomas Noël
            if len(formdefs) < limit:
438 2663e08e Frédéric Péters
                for formdef in formdefs_advertise[: limit - len(formdefs)]:
439 7012efed Frédéric Péters
                    r += htmltext('<li class="required-authentication">')
440 2663e08e Frédéric Péters
                    r += htmltext('<a href="%s/%s/">%s</a>') % (
441
                        category.url_name,
442
                        formdef.url_name,
443
                        formdef.name,
444
                    )
445 96418969 Thomas NOEL
                    r += htmltext('<span> (%s)</span>') % _('authentication required')
446 8eaaa2b5 Frédéric Péters
                    r += htmltext('</li>\n')
447 2663e08e Frédéric Péters
            if (len(formdefs) + len(formdefs_advertise)) > limit:
448
                r += htmltext('<li class="all-forms"><a href="%s/" title="%s">%s</a></li>') % (
449
                    category.url_name,
450
                    _('Access to all forms of the "%s" category') % category.name,
451
                    _('Access to all forms in this category'),
452
                )
453 8eaaa2b5 Frédéric Péters
            r += htmltext('</ul>')
454
            r += htmltext('</li>\n')
455 05c98e5f Frédéric Péters
456 8eaaa2b5 Frédéric Péters
        return r.getvalue()
457
458
    def consultations(self):
459 aeda4490 Frédéric Péters
        cats = [x for x in Category.select() if x.url_name == 'consultations']
460
        if not cats:
461
            return
462
        consultations_category = cats[0]
463 2663e08e Frédéric Péters
        formdefs = FormDef.select(
464
            lambda x: (
465
                str(x.category_id) == str(consultations_category.id)
466
                and (not x.is_disabled() or x.disabled_redirection)
467
            ),
468
            order_by='name',
469
        )
470 aeda4490 Frédéric Péters
        if not formdefs:
471 cc5eac8c Frédéric Péters
            return
472 05c98e5f Frédéric Péters
        ## Consultations
473 8eaaa2b5 Frédéric Péters
        r = TemplateIO(html=True)
474
        r += htmltext('<div id="consultations">')
475
        r += htmltext('<h3>%s</h3>') % _('Consultations')
476 c410b015 Frédéric Péters
        r += consultations_category.get_description_html_text()
477 8eaaa2b5 Frédéric Péters
        r += htmltext('<ul>')
478 05c98e5f Frédéric Péters
        for formdef in formdefs:
479 8eaaa2b5 Frédéric Péters
            r += htmltext('<li>')
480 2663e08e Frédéric Péters
            r += htmltext('<a href="%s/%s/">%s</a>') % (
481
                consultations_category.url_name,
482
                formdef.url_name,
483
                formdef.name,
484
            )
485 8eaaa2b5 Frédéric Péters
            r += htmltext('</li>')
486
        r += htmltext('</ul>')
487
        r += htmltext('</div>')
488
        return r.getvalue()
489
490
    def box_side(self, path):
491
        r = TemplateIO(html=True)
492 5374ecec Frédéric Péters
        root_url = get_publisher().get_root_url()
493
494 2663e08e Frédéric Péters
        if (
495
            path == ['']
496
            and 'include-tracking-code-form' in get_response().filter.get('keywords', [])
497
            and self.has_anonymous_access_codes()
498
        ):
499 dd9903d6 Frédéric Péters
            r += htmltext('<form id="follow-form" action="%scode/load">') % root_url
500
            r += htmltext('<h3>%s</h3>') % _('Tracking code')
501
            r += htmltext('<input size="12" name="code" placeholder="%s"/>') % _('ex: RPQDFVCD')
502
            r += htmltext('<input type="submit" value="%s"/>') % _('Load')
503 8eaaa2b5 Frédéric Péters
            r += htmltext('</form>')
504 fd55417e Thomas NOEL
505 2663e08e Frédéric Péters
        cats = Category.select(order_by='name')
506 818bc7c2 Frédéric Péters
        cats = [x for x in cats if x.url_name != 'consultations' and x.get_homepage_position() == 'side']
507 aeda4490 Frédéric Péters
        Category.sort_by_position(cats)
508
        if cats:
509 8eaaa2b5 Frédéric Péters
            r += htmltext('<div id="side-services">')
510
            r += htmltext('<h3>%s</h3>') % _('Services')
511
            r += htmltext('<ul>')
512 aeda4490 Frédéric Péters
            for cat in cats:
513 8eaaa2b5 Frédéric Péters
                r += htmltext('<li><a href="%s/">%s</a></li>') % (cat.url_name, cat.name)
514
            r += htmltext('</ul>')
515
            r += htmltext('</div>')
516 aeda4490 Frédéric Péters
517 0dbaad0c Frédéric Péters
        v = r.getvalue()
518
        if v:
519
            r = TemplateIO(html=True)
520
            r += htmltext('<div id="sidebox">')
521
            r += v
522
            r += htmltext('</div>')
523
            return r.getvalue()
524
525
        return None
526 07975eba Frédéric Péters
527 fd55417e Thomas NOEL
    def has_anonymous_access_codes(self):
528 dd9903d6 Frédéric Péters
        return any((x for x in FormDef.select() if x.enable_tracking_codes))
529 fd55417e Thomas NOEL
530 8eaaa2b5 Frédéric Péters
    def myspace_snippet(self):
531
        r = TemplateIO(html=True)
532
        r += htmltext('<div id="myspace">')
533
        r += htmltext('<h3>%s</h3>') % _('My Space')
534
        r += htmltext('<ul>')
535 0c7d90c5 Frédéric Péters
        if get_request().user and not get_request().user.anonymous:
536 2663e08e Frédéric Péters
            r += htmltext('  <li><a href="myspace/" id="member">%s</a></li>') % _(
537
                'Access to your personal space'
538
            )
539 8eaaa2b5 Frédéric Péters
            r += htmltext('  <li><a href="logout" id="logout">%s</a></li>') % _('Logout')
540 0c7d90c5 Frédéric Péters
        else:
541 8eaaa2b5 Frédéric Péters
            r += htmltext('  <li><a href="register/" id="inscr">%s</a></li>') % _('Registration')
542
            r += htmltext('  <li><a href="login/" id="login">%s</a></li>') % _('Login')
543
        r += htmltext('</ul>')
544
        r += htmltext('</div>')
545
        return r.getvalue()
546 6122f5dc Frédéric Péters
547 05c98e5f Frédéric Péters
548 38f6e2aa Frédéric Péters
from qommon.publisher import get_publisher_class
549 2663e08e Frédéric Péters
550 b1c812cb Frédéric Péters
get_publisher_class().root_directory_class = AlternateRootDirectory
551 69e8d81d Frédéric Péters
get_publisher_class().after_login_url = 'myspace/'
552 04000f05 Frédéric Péters
get_publisher_class().use_sms_feature = True
553 8efa60ca Frédéric Péters
554
555 2663e08e Frédéric Péters
TextsDirectory.register(
556
    'aq-sso-text',
557
    N_('Connecting with Identity Provider'),
558
    default=N_(
559
        '''<h3>Connecting with Identity Provider</h3>
560 e5c0a39d Frédéric Péters
<p>You can also use your identity provider to connect.
561 2663e08e Frédéric Péters
</p>'''
562
    ),
563
)
564 0009f81f Frédéric Péters
565 2663e08e Frédéric Péters
TextsDirectory.register('aq-home-page', N_('Home Page'), wysiwyg=True)