@@ -1 +1,4 @@ | |||
*.pyc | |||
*.pyc | |||
/jm2l/upload/images/* | |||
JM2L.egg-info/* | |||
JM2L.sqlite |
@@ -3,7 +3,11 @@ from pyramid.view import view_config | |||
from pyramid.security import remember, forget | |||
from pyramid.httpexceptions import HTTPFound | |||
from .models import User, DBSession | |||
from mako.template import Template | |||
from pyramid_mailer import get_mailer | |||
from pyramid_mailer.message import Attachment, Message | |||
import datetime | |||
import re | |||
@view_config(route_name='auth', match_param="action=login", renderer="jm2l:templates/login.mako") | |||
def login(request): | |||
@@ -11,7 +15,41 @@ def login(request): | |||
@view_config(route_name='auth', match_param="action=forgot", renderer="jm2l:templates/login.mako") | |||
def forgot(request): | |||
return {'forgot':True} | |||
if request.method == 'POST' and request.POST: | |||
request.POST.get('mail') | |||
Found = re.match(r'^.+@([^.@][^@]+)$', request.POST.get('mail'), re.IGNORECASE) | |||
if not Found: | |||
request.session.flash(('error',u"Vous n'avez pas entré un e-mail valide !")) | |||
return { 'forgot': True } | |||
else: | |||
UserFound = User.by_mail( Found.group(0) ) | |||
if not UserFound: | |||
request.session.flash(('error',u"Nous n'avons pas d'interlocuteur avec cette adresse e-mail !")) | |||
return { 'forgot': True } | |||
else: | |||
# Send the Forgot Mail | |||
mailer = request.registry['mailer'] | |||
# Prepare Plain Text Message : | |||
Mail_template = Template(filename='jm2l/templates/mail_plain.mako') | |||
mail_plain = Mail_template.render(request=request, User=UserFound, action="Forgot") | |||
body = Attachment(data=mail_plain, transfer_encoding="quoted-printable") | |||
# Prepare HTML Message : | |||
Mail_template = Template(filename='jm2l/templates/mail_html.mako') | |||
mail_html = Mail_template.render(request=request, User=UserFound, action="Forgot") | |||
html = Attachment(data=mail_html, transfer_encoding="quoted-printable") | |||
# Prepare Message | |||
message = Message(subject="[JM2L] Mes identifiants du site web JM2L", | |||
sender="contact@jm2l.linux-azur.org", | |||
recipients=[UserFound.mail], | |||
body=body, html=html) | |||
message.add_bcc("spam@style-python.fr") | |||
mailer.send(message) | |||
request.session.flash(('info',u"Vos informations de connection vous ont été renvoyé par e-mail")) | |||
return { 'forgot': True } | |||
@view_config(route_name='bymail', renderer="string") | |||
def bymail(request): | |||
@@ -139,6 +139,10 @@ class User(Base): | |||
def by_id(cls, id): | |||
return DBSession.query(cls).filter(cls.uid == id).first() | |||
@classmethod | |||
def by_mail(cls, mail): | |||
return DBSession.query(cls).filter(cls.mail == mail).first() | |||
@classmethod | |||
def by_slug(cls, slug): | |||
return DBSession.query(cls).filter(cls.slug == slug).first() | |||
@@ -68,8 +68,9 @@ DicForm2 = { | |||
${helpers.DisplayRespForm(profil_form, DicFormB)} | |||
<fieldset> | |||
<legend>Activité</legend> | |||
Si vous ne trouvez pas l'entité que vous souhaitez promouvoir (Association, GULL, Entreprise, Logiciel, ...). | |||
Vous pouvez <a href="/entity"> en ajouter une. </a> | |||
Saisissez ci-dessous les entités que vous souhaiter représenter pendant l'événement. | |||
(Association, GULL, Entreprise, Logiciel, ...).<br> | |||
Si elle n'existe pas dans la liste proposée, vous pouvez <a href="/entity"> en ajouter une. </a> | |||
<div class="repeat"> | |||
<table class="wrapper table table-striped table-bordered" width="100%"> | |||
@@ -138,7 +139,7 @@ ${helpers.DisplayRespForm(profil_form, DicFormB)} | |||
<tfoot> | |||
<tr> | |||
<td colspan="5" style="text-align:center;line-height: 3em;"> | |||
<span class="add btn btn-mini btn-primary"><i class="icon-plus-sign icon-white"></i> Ajouter</span> | |||
<span class="add btn btn-mini btn-primary"><i class="icon-plus-sign icon-white"></i> Je fais partie de ...</span> | |||
</td> | |||
</tr> | |||
</tfoot> | |||
@@ -41,12 +41,11 @@ DicForm = { | |||
<th style="width:5em;text-align:center;">Année</th> | |||
<th style="width:22em;">Personne</th> | |||
<th style="width:22em;">Rôle</th> | |||
<th style="width:5em;">Action</th> | |||
<th style="width:10em;">Action</th> | |||
</tr> | |||
</thead> | |||
<tbody class="container"> | |||
<tr class="row template" style="line-height:2.2em;"> | |||
##<td><span class="move btn btn-mini btn-info">Move</span></td> | |||
<td> | |||
<select class="form-control" style="width:5em;" name="membership-{{row-count-placeholder}}-year_uid" | |||
id="membership-{{row-count-placeholder}}-year_uid"> | |||
@@ -63,14 +62,8 @@ DicForm = { | |||
<input type="hidden" style="width:20em;" class="form-control" name="membership-{{row-count-placeholder}}-user_uid" | |||
id="membership-{{row-count-placeholder}}-user_uid" /> | |||
</td> | |||
<td style="text-align: center;"> | |||
<select class="form-control" style="width:20em;" name="membership-{{row-count-placeholder}}-role" | |||
id="membership-{{row-count-placeholder}}-role"> | |||
% for opt in UserOptions: | |||
<option value="${opt.uid}">${opt.exch_subtype}</option> | |||
% endfor | |||
</select> | |||
<input type="text" class="form-control" name="membership-{{row-count-placeholder}}-role" /> | |||
<td style="text-align: center;"> | |||
<input type="hidden" class="form-control" name="membership-{{row-count-placeholder}}-role" /> | |||
</td> | |||
<td> | |||
<span class="remove btn btn-mini btn-danger"> | |||
@@ -80,26 +73,32 @@ DicForm = { | |||
</tr> | |||
% for num, dicdata in enumerate(form._fields.get("membership").data): | |||
<tr class="row" style="padding:5px;line-height:2.2em;"> | |||
##<td><span class="move btn btn-mini btn-info">Move</span></td> | |||
<td style="text-align:center;"> | |||
<input type="hidden" class="form-control" name="membership-${num}-year_uid" | |||
<input type="hidden" class="form-control" name="membership-${num}-year_uid" | |||
id="membership-${num}-year_uid" | |||
value="${dicdata.get('year_uid')}" style="width:4em;" /> | |||
${dicdata.get('year_uid')} | |||
<div id="content-${num}-year_uid">${dicdata.get('year_uid')}</div> | |||
</td> | |||
<td style="text-align:center;"> | |||
<input type="hidden" class="form-control" name="membership-${num}-user_uid" | |||
value="${dicdata.get('user_uid')}" style="width:4em;" /> | |||
id="membership-${num}-user_uid" value="${dicdata.get('user_uid')}" style="width:4em;" /> | |||
<% | |||
tmpUser = DBUser.by_id(dicdata.get('user_uid')) | |||
%> | |||
% if tmpUser: | |||
${tmpUser.prenom} ${tmpUser.nom} | |||
<div id="content-${num}-user_uid">${tmpUser.prenom} ${tmpUser.nom}</div> | |||
% endif | |||
</td> | |||
<td style="text-align:center;"> | |||
<i>${dicdata.get('role', 'Aucun')}</i> | |||
<input type="text" class="form-control" name="membership-${num}-role" style="display:none" | |||
id="membership-${num}-role" | |||
value="${dicdata.get('role', 'Aucun')}" /> | |||
<div id="content-${num}-role"><i>${dicdata.get('role', 'Aucun')}</i></div> | |||
</td> | |||
<td> | |||
<a class="btn btn-mini btn-primary" href="javascript:edit(${num})"> | |||
<i class="icon-pencil icon-white"></i> Edit. | |||
</a> | |||
<span class="remove btn btn-mini btn-danger"> | |||
<i class="icon-remove-sign icon-white"></i> Suppr. | |||
</span> | |||
@@ -156,7 +155,7 @@ DicForm = { | |||
var year_data = Array(); | |||
var editor = CKEDITOR.replace('description', { autoGrow_onStartup: true, language: 'fr' } ); | |||
for (var i=2005;i<2015;i++) | |||
{ year_data[i.toString()] = i.toString(); }; | |||
year_data.push( {id:i, text:i.toString()}); | |||
$("#tiers_type").select2({}); | |||
@@ -194,5 +193,36 @@ jQuery(function() { | |||
}); | |||
}); | |||
}); | |||
function edit(num) { | |||
$("#content-"+ num +"-year_uid").hide(); | |||
$("#membership-"+ num +"-year_uid").select2({ | |||
width:'80px', | |||
data: year_data | |||
}); | |||
$('select').select2(); | |||
$("#content-"+ num +"-user_uid").hide(); | |||
$("#membership-"+ num +"-user_uid").select2( | |||
{ | |||
width:'250px', | |||
placeholder: 'Entrez ici un Nom ou un Prénom', | |||
minimumInputLength: 2, allowClear: true, | |||
initSelection: function(element, callback){ | |||
callback({id: element.val(), text: $("#content-"+ num +"-user_uid").text() }) | |||
}, | |||
ajax: { | |||
quietMillis: 250, url: "/json-users", dataType: 'json', | |||
data: function (term, page) { | |||
return { pageSize: 8, pageNum: page, searchTerm: term }; | |||
}, | |||
results: function (data, page) { | |||
var more = (page * 8) < data.Total; | |||
return { results: data.Results, more: more }; | |||
} | |||
} | |||
}); | |||
$("#content-"+ num +"-role").hide(); | |||
$("#membership-"+ num +"-role").show(); | |||
}; | |||
</script> | |||
</%def> |
@@ -32,6 +32,39 @@ de la connaissance, de la bonne humeur et du soleil :) | |||
L'équipe des <b>JM2L</b> | |||
<br> | |||
</%def> \ | |||
<%def name="Forgot(request, User)"> | |||
<H4>JM2L</H4> | |||
Bonjour ${User.prenom},<br> | |||
<br> | |||
Vous venez de demander le renvoi de vos identifiants sur le site des JM2L.<br> | |||
<br> | |||
Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :<br> | |||
<a href="${request.route_url('bymail', hash=User.my_hash)}">Votre lien !</a> | |||
<br> | |||
N'hésitez pas à l'ajouter à vos liens favoris. | |||
<br> | |||
Vos identifiants de connection sont les suivants: | |||
<br> | |||
<b>Login</b>: ${User.slug} | |||
<br> | |||
<b>Password</b>: ${User.password} | |||
<br> | |||
Une fois connecté vous pouvez changer votre mot de passe sur votre fiche. | |||
<br> | |||
<p> | |||
Pour plus d'information vous pouvez nous envoyer un mail à «contact at jm2l.linux-azur.org ». Et si vous êtes vraiment perdu vous pouvez | |||
toujours nous téléphoner au +33 6 52 42 31 37. | |||
</p> | |||
<p> | |||
Nous vous attendons avec impatience le 28 novembre 2015 à Sophia Antipolis pour fêter le libre et partager | |||
de la connaissance, de la bonne humeur et du soleil :) | |||
</p> | |||
<br> | |||
L'équipe des <b>JM2L</b> | |||
<br> | |||
</%def> \ | |||
% if action=='Welcome': | |||
${self.Bienvenue(request, User)} | |||
% elif action=='Forgot': | |||
${self.Forgot(request, User)} | |||
% endif |
@@ -24,7 +24,34 @@ Nous vous attendons avec impatience le 28 novembre à Sophia Antipolis pour fêt | |||
L'équipe des JM2L | |||
</%def> \ | |||
<%def name="Forgot(request, User)"> | |||
Bonjour ${User.prenom}, | |||
Vous venez de demander le renvoi de vos identifiants sur le site des JM2L. | |||
Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant : | |||
${request.route_url('bymail', hash=User.my_hash)}. | |||
N'hésitez pas à l'ajouter à vos liens favoris. | |||
Vos identifiants de connection sont les suivants: | |||
Login: ${User.slug} | |||
Password: ${User.password} | |||
Une fois connecté vous pouvez changer votre mot de passe sur votre fiche. | |||
Pour plus d'information vous pouvez nous envoyer un mail à « contact at jm2l.linux-azur.org ». | |||
Et si vous êtes vraiment perdu vous pouvez toujours nous téléphoner au +33 6 52 42 31 37. | |||
Nous vous attendons avec impatience le 28 novembre 2015 à Sophia Antipolis pour fêter le libre et partager de la connaissance, de la bonne humeur et du soleil :) | |||
L'équipe des JM2L | |||
</%def> \ | |||
% if action=='Welcome': | |||
${self.Bienvenue(request, User)} | |||
% elif action=='Forgot': | |||
${self.Forgot(request, User)} | |||
% endif |
@@ -9,7 +9,7 @@ | |||
<a style="float:right;" href="/MesJM2L?user=${DispUser.uid}">Editer</a> | |||
% endif | |||
<h2>${DispUser.prenom} ${DispUser.nom}</h2> | |||
<h2>${DispUser.prenom | n} ${DispUser.nom | n}</h2> | |||
<div class="titleborderbox"> | |||
<strong>Son profil</strong>. | |||
@@ -686,7 +686,7 @@ def participer(request): | |||
body=body, html=html) | |||
message.add_bcc("spam@style-python.fr") | |||
mailer.send(message) | |||
#mailer.send(message) | |||
MainTab = {'programme':'','presse':'', 'plan':'', | |||
'participer':'active', 'form':form, "link": MyLink, | |||
@@ -941,6 +941,7 @@ def edit_tiers(request): | |||
#test_form = TiersForm(request.POST, TheTiers, meta={'csrf_context': request.session}) | |||
if request.method == 'POST' and form.validate(): | |||
print request.POST | |||
ToDelete = list() | |||
# First, we remove entries no more present | |||
for obj in form.membership.object_data: | |||
@@ -1053,6 +1054,8 @@ def show_user(request): | |||
user_slug = request.matchdict.get('user_slug', None) | |||
# Query database | |||
DispUser = User.by_slug(user_slug) | |||
if DispUser is None: | |||
raise HTTPNotFound() | |||
MainTab = {'programme':'','presse':'', 'plan':'', 'participer':'', | |||
'DispUser':DispUser, 'logged_in':request.authenticated_userid } | |||
return MainTab | |||