This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
ifef-registration/extra/modules/root.ptl

247 lines
10 KiB
Plaintext
Raw Normal View History

2010-04-22 14:31:31 +02:00
from qommon import get_cfg, get_logger
from quixote import redirect, get_session
from authentic.form import *
from quixote.html import htmltext
import qommon.errors as errors
import qommon.template as template
import authentic.identities as identities
2010-04-22 14:31:31 +02:00
import authentic.root
2010-04-27 16:20:06 +02:00
import authentic.publisher
import authentic.admin.configuration as configuration
import urllib2
import captcha
from callback import BatchJob, XmlRpcAction
import lasso
import authentic.misc as misc
schema = (('PART_EMP', _('Particulier-employeur')),
(_('Salarie du Particulier-employeur'),
('SAL_EMP_INS', _('inscrit')),
('SAL_EMP_NONINS', _('pas inscrit en formation'))),
(_('Assistante(e) maternel(le)'),
('ASS_MAT_INS', _('inscrit')),
('ASS_MAT_NOINS', _('pas inscrit en formation'))),
(_('Formateur ou directeur d\'un organisme de formation'),
('FOF_LAB', _('''labellise par l'Institut-Fepem''')),
('FOF_SOUH_LAB', _('souhaitant etre labellise')),
('FOF_NOLAB', _('pas encore labellise'))),
('FC_SOUH_PART', _('Formateur consultant souhaitant entrer dans la communaute')),
(_('Salarie d\'un organisme public, d\'une association ou d\'une organisation'),
('SOP_PART', _('partenaire de l\'Institut-Fepem')),
('SOP_SOUH_PART', _('souhaitant devenir partenaire')),
('SOP_NOPART', _('pas encore partenaire'))),
('PRO_FOR', _('Un professionnel de la formation')),
('PERS_PRO_FAM', _('Une personne interessee par le sujet de la professionnalisation de l\'emploi familial')))
def check_classification(classification):
# Check classification
classification_ok = False
for q in schema:
if isinstance(q[1], tuple):
for r in q[1:]:
if r[0] == classification:
classification_ok = True
break
else:
if q[0] == classification:
classification_ok = True
break
if classification_ok:
break
return classification_ok
2010-04-27 16:20:06 +02:00
class IfefRootDirectory(authentic.root.RootDirectory):
_q_exports = authentic.root.RootDirectory._q_exports + [ 'register2' ]
def _q_traverse(self, path):
request = get_request()
if request.form and request.form.get('service'):
service = request.form['service']
get_session().service = service
request.service = service
return super(IfefRootDirectory, self)._q_traverse(path)
def register2 (self):
return self.register(version=2)
def register (self, version=1):
2010-04-27 16:20:06 +02:00
identities_cfg = get_cfg('identities', {})
session = get_session()
2010-04-27 16:20:06 +02:00
if not identities_cfg.get('creation') in ('self', 'moderated'):
raise errors.TraversalError()
form = Form(enctype="multipart/form-data")
fields = identities.get_store_class().fields
keys = []
if getattr(session, 'service', None):
keys = get_cfg('providers',{}).get(session.service, {}) \
.get('registration_fields')
if keys:
fields = [ field for field in fields \
if field.key in keys ]
for field in fields:
2010-04-27 16:20:06 +02:00
if getattr(field, str('on_register'), True):
field.add_to_form(form) and None
2010-06-23 16:03:21 +02:00
has_email = 'email' in [x.key for x in identities.get_store_class().fields]
2010-04-27 16:20:06 +02:00
if not has_email or not identities_cfg.get('email-as-username', False):
form.add(ValidatedStringWidget, "username", title=_("Username"),
size=30,
hint=_('''C'est cet identifiant qui vous permettra de \
vous connecter au portail de l'IFEF. Il peut contenir seulement des lettres et des chiffres.'''),
required=True, regex=identities.get_store().username_regex)
2010-04-27 16:20:06 +02:00
passwords_cfg = configuration.get_configuration('passwords')
if passwords_cfg.get('can_change') and not passwords_cfg.get('generate'):
2010-04-27 16:20:06 +02:00
form.add(PasswordWidget, "password", title=_("Password"), size=30, required=True)
else:
form.add(HtmlWidget, htmltext('<p>%s</p>') % _('A password will be mailed to you.'))
classification = get_request().form.get('classification')
if classification:
if not check_classification(classification):
classification = None
if version == 1:
s='<label><p><em>%s:</em></p></label><select name="classification" size="18">' % _('Vous etes')
for q in schema:
if isinstance(q[1], tuple):
s += '<optgroup label="%s">' % q[0]
for r in q[1:]:
code, text = r
if code == classification:
selected = 'selected="1"'
else:
selected = ''
s += '<option %s value="%s">%s</option>\n' % (selected, code, text)
s += '</optgroup>\n'
else:
code, text = q
if code == classification:
selected = 'selected="1"'
else:
selected = ''
s += '<option %s value="%s">%s</option>\n' % (selected, code, text)
s += '</select>'
else:
s='<label><p><em>%s:</em></p></label><cite style="display: block; margin: 1em; font-size: 70%%">' % _('Vous etes')
for i, q in enumerate(schema):
if isinstance(q, tuple):
s += '<p>%s' % q[0]
for j, q in enumerate(q[1:]):
s += '<input id="s%s-%s" value="%s-%s" type="radio" name="RadioGroup">%s</input>' % (i, j, i, j, q)
s += '</p>\n'
2010-04-27 16:20:06 +02:00
else:
s += '<p><input id="s%s" value="%s" type="radio" name="RadioGroup">%s</input></p>' % (i, i, q)
s+='</cite>'
if get_request().get_method() == 'POST' and not classification:
form.set_error('username', ' ')
form.add(HtmlWidget, 'erreur', htmltext('<div class="error"><strong>%s</strong></div>') % _('Vous devez choisir une classification'))
elif get_request().get_method() == 'GET':
get_request().form = {}
form.add(HtmlWidget, 'classification', htmltext(s))
# domain name: fepem
re_captcha_public_key = '6LcIULoSAAAAAIbUohbBeHCcUeWAt74sjvjK6w5W'
re_captcha_private_key = '6LcIULoSAAAAADfaFk2E9x9G2FgpSsnNIfUV1rlS'
re_captcha = '''
<script type="text/javascript">
RecaptchaOptions = { "theme" : "white", "lang" : "fr" };
</script>
<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=%(pkey)s">
</script>
<noscript>
<iframe src="http://api.recaptcha.net/noscript?k=%(pkey)s"
height="300" width="500" frameborder="0"></iframe><br>
<textarea name="recaptcha_challenge_field" rows="3" cols="40">
</textarea>
<input type="hidden" name="recaptcha_response_field"
value="manual_challenge">
</noscript>''' % { 'pkey' : re_captcha_public_key }
identities_configuration = configuration.get_configuration('identities')
form.add(HtmlWidget, htmltext('<p id="conditions">%s</p>' %
identities_configuration.get('condition_utilisation')))
form.add(CheckboxWidget, 'validation',
title=htmltext(N_('''J'accepte les conditions d'utilisation''')),
required = True)
if 0:
form.add(HtmlWidget, htmltext(re_captcha))
form.add_captcha()
form.add(HtmlWidget, htmltext('<p id="cnil">%s</p>' %
identities_configuration.get('cnil_text')))
2010-04-27 16:20:06 +02:00
form.add_submit("submit", _("Submit"))
form.add_submit("cancel", _("Cancel"))
request = get_request()
if 0 and request.form and \
request.form.has_key('recaptcha_challenge_field') and \
request.form.has_key('recaptcha_response_field'):
print captcha.submit(request.form['recaptcha_challenge_field'],
request.form['recaptcha_response_field'],
re_captcha_private_key, request.environ['REMOTE_ADDR'])
2010-04-27 16:20:06 +02:00
if form.get_submit() == 'cancel':
return redirect('.')
if form.is_submitted():
if not form.has_errors():
try:
return self.register_submit(form)
except authentic.root.RegistrationError:
pass
2010-04-27 16:20:06 +02:00
template.html_top(_('Registration'))
get_response().breadcrumb.append( ('register', _('Registration')) )
vars = {
'register_form': str(form.render())
}
return template.process_template(
str(authentic.root.TextsDirectory.get_html_text('register')), vars)
def pre_registration_callback(self, identity):
identity.userClass = [ 'GRAND.PUBLIC' ]
2010-04-27 16:20:06 +02:00
identity.name = identity.givenName + ' ' + identity.sn
def registration_callback(self, identity):
email = identity.email
uid = identity.accounts[0].username
classification = get_request().form['classification']
action = XmlRpcAction.create_ldap_classification(uid, email, classification)
get_response().add_after_job('''Send registration to Neogia, email = %r,\
classification = %r''' % (email, classification), BatchJob(action))
2010-04-27 16:20:06 +02:00
def get_idp_sso_list [html] (self):
if not get_cfg('providers', {}).items():
return ''
'<ul>'
for klp, lp in get_cfg('providers', {}).items():
if lp['role'] == lasso.PROVIDER_ROLE_IDP:
continue # only allows initiated login to service providers
if lp.get('idp_initiated_sso', True) is False:
continue
try:
provider, label = misc.get_provider_and_label(klp)
except KeyError:
continue
if hasattr(provider, str('getProtocolConformance')) and \
provider.getProtocolConformance() == lasso.PROTOCOL_SAML_2_0:
url = 'saml/sp/%s/login' % klp
else:
url = 'liberty/sp/%s/login' % klp
'<li class="%s"><a href="%s">%s</a></li>' % (
klp,
url, htmltext(_('Log on %s') % label))
'</ul>'
2010-04-27 16:20:06 +02:00
from qommon.publisher import get_publisher_class
get_publisher_class().root_directory_class = IfefRootDirectory