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