ajouter agenda.pt en fullcalendar

This commit is contained in:
2017-03-10 15:23:47 +01:00
parent 0e7b015d20
commit 6612b0b81b
21 changed files with 534 additions and 627 deletions

View File

@@ -18,7 +18,7 @@ pyramid.includes =
pyramid_mailer pyramid_mailer
pyramid_tm pyramid_tm
sqlalchemy.url = mysql://root:phuoc@localhost/bd_tinhdo?charset=utf8 sqlalchemy.url = mysql://root:phuoc@localhost/bddevfac?charset=utf8
mondumas.admin_email = ctphuoc@bbox.fr mondumas.admin_email = ctphuoc@bbox.fr

151
mondumas/models/agenda.py Normal file
View File

@@ -0,0 +1,151 @@
# -*- coding: utf8 -*-
from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import (
ZopeTransactionExtension,
mark_changed
)
import datetime
import dateutil.relativedelta
import transaction
def execute_query(request, query, params):
"""Execute query and mark session as changed"""
request.dbsession.execute(query, params)
mark_changed(request.dbsession)
transaction.commit()
def get_agendas(request,code):
if code =='':
query = "SELECT * FROM p_agenda where actif = 1 order by code;"
results = request.dbsession.execute(query).fetchall()
else:
query = "SELECT * FROM p_agenda where code = :code;"
results = request.dbsession.execute(query, {'code': code}).first()
return results
def get_rendez_vous(request, itc):
d = datetime.datetime.today()
d = d - dateutil.relativedelta.relativedelta(months=2)
# début du mois M-2
datedeb = d.strftime('%Y-%m-01')
# lire les rdv de l'ITC
query = """
(SELECT CONCAT(l.societe,"-OS-",l.no_id) as nodossier, l.rdv_debut, l.rdv_fin, e.c_nom FROM ordres_lig l
INNER JOIN ordres e ON l.societe=e.societe AND l.no_id=e.no_id
WHERE l.datevi >= :datedeb AND l.liste=:itc ORDER BY l.datevi, l.heurevi)
UNION
(SELECT CONCAT(l.societe,"-DD-",l.no_id) as nodossier, l.rdv_debut, l.rdv_fin, e.c_nom FROM dem_lig l
INNER JOIN dem_devis e ON l.societe=e.societe AND l.no_id=e.no_id
WHERE l.datevi >= :datedeb AND l.liste=:itc ORDER BY l.datevi, l.heurevi)
UNION
(SELECT CONCAT(l.societe,"-RD-",l.no_id) as nodossier, l.rdv_debut, l.rdv_fin, e.c_nom FROM rdvous_lig l
INNER JOIN rdvous e ON l.societe=e.societe AND l.no_id=e.no_id
WHERE l.datevi >= :datedeb AND l.liste=:itc ORDER BY l.datevi, l.heurevi);
"""
results = request.dbsession.execute(query, {'datedeb': datedeb, 'itc': itc}).fetchall()
return results
def delete_don(request, mbr_id, don_id):
query = "DELETE FROM mbr_dons WHERE mbr_id = :mbr_id and don_id = :don_id;"
execute_query(request, query, {'mbr_id': mbr_id, 'don_id': don_id})
def update_don(request, mbr_id, don_id, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'date':
ddate = datetime.strptime(new_values['date'], '%d/%m/%Y')
new_values['date'] = ddate.strftime("%Y/%m/%d")
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if don_id == '0':
new_values['mbr_id'] = mbr_id
query = "INSERT INTO mbr_dons SET %s" % s
else:
new_values['mbr_id'] = mbr_id
new_values['don_id'] = don_id
query = "UPDATE mbr_dons SET %s WHERE mbr_id = :mbr_id and don_id = :don_id;" % s
execute_query(request, query, new_values)
def update_journal(request, jnl, no_id, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'date':
ddate = datetime.strptime(new_values['date'], '%d/%m/%Y')
new_values['date'] = ddate.strftime("%Y/%m/%d")
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if no_id == '0':
if jnl == 'C':
query = "INSERT INTO jnl_caisse SET %s" % s
else:
query = "INSERT INTO jnl_caisse SET %s" % s
else:
new_values['no_id'] = no_id
if jnl == 'C':
query = "UPDATE jnl_caisse SET %s WHERE no_id = :no_id;" % s
else:
query = "UPDATE jnl_banque SET %s WHERE no_id = :no_id;" % s
execute_query(request, query, new_values)
def delete_membre(request, mbr_id):
query = "DELETE FROM membres WHERE mbr_id = :mbr_id ;"
execute_query(request, query, {'mbr_id': mbr_id})
def insert_gift_to_account(request, libelle_esp, libelle_chq):
import pdb;pdb.set_trace()
# genere une écriture dans le journal de caisse pour les espèces
query = "SELECT sum(montant) as total FROM mbr_dons where valide_le IS NULL and mode='ESPECE';"
result = request.dbsession.execute(query).first()
if result.total > 0:
query = """INSERT INTO jnl_caisse (date, compte, libelle, recette, valide_le)
VALUES (CURRENT_DATE, '7540', :libelle_esp, :total_esp, CURRENT_DATE);"""
execute_query(request, query, {'libelle_esp': libelle_esp, 'total_esp': result.total})
# genere une écriture dans le journal de banque pour les chèques
query = "SELECT sum(montant) as total FROM mbr_dons where valide_le IS NULL and mode='CHEQUE';"
result = request.dbsession.execute(query).first()
if result.total > 0:
query = """INSERT INTO jnl_banque (date, compte, libelle, recette, valide_le)
VALUES (CURRENT_DATE, '7540', :libelle_chq, :total_chq, CURRENT_DATE);"""
execute_query(request, query, {'libelle_chq': libelle_chq, 'total_chq': result.total})
# valider les dons
query = "UPDATE mbr_dons SET valide_le = CURRENT_DATE WHERE valide_le IS NULL;"
execute_query(request, query, {})
def update_membre(request, mbr_id, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'nom':
new_values['nom'] = new_values['nom'].upper()
if param == 'ville':
new_values['ville'] = new_values['ville'].upper()
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if mbr_id == '0':
query = "INSERT INTO membres SET %s" % s
else:
new_values['mbr_id'] = mbr_id
query = "UPDATE membres SET %s WHERE mbr_id = :mbr_id;" % s
execute_query(request, query, new_values)

View File

@@ -19,135 +19,17 @@ def execute_query(request, query, params):
mark_changed(request.dbsession) mark_changed(request.dbsession)
transaction.commit() transaction.commit()
def get_comptes(request, type):
if type == 'recette':
query = "SELECT * FROM p_comptes where no_compte like '7%' order by no_compte;"
else:
query = "SELECT * FROM p_comptes where no_compte like '6%' order by no_compte;"
results = request.dbsession.execute(query).fetchall()
return results
def get_member_by_mdp_oublie(request, lien): def get_member_by_mdp_oublie(request, lien):
query = "SELECT * FROM membres WHERE mdp_oublie=:lien;" query = "SELECT * FROM p_users WHERE mdp_oublie=:lien;"
results = request.dbsession.execute(query, {'lien':lien}).first() results = request.dbsession.execute(query, {'lien':lien}).first()
return results return results
def get_member_by_email(request, email):
# lire le membres par son email
query = """SELECT * FROM membres WHERE email=:email;"""
results = request.dbsession.execute(query, {'email': email}).first()
return results
def get_member_by_id(request, mbr_id): def get_member_by_id(request, mbr_id):
# lire le membres par son identifianr # lire le membres par son identifianr
query = """SELECT * FROM membres WHERE mbr_id=:mbr_id;""" query = """SELECT * FROM p_users WHERE CD_UTI=:mbr_id;"""
results = request.dbsession.execute(query, {'mbr_id': mbr_id}).first() results = request.dbsession.execute(query, {'mbr_id': mbr_id}).first()
return results return results
def get_membres(request):
# lire les membres
query = """SELECT * FROM membres order by nom, prenom;"""
results = request.dbsession.execute(query).fetchall()
return results
def delete_don(request, mbr_id, don_id):
query = "DELETE FROM mbr_dons WHERE mbr_id = :mbr_id and don_id = :don_id;"
execute_query(request, query, {'mbr_id': mbr_id, 'don_id': don_id})
def update_don(request, mbr_id, don_id, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'date':
ddate = datetime.strptime(new_values['date'], '%d/%m/%Y')
new_values['date'] = ddate.strftime("%Y/%m/%d")
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if don_id == '0':
new_values['mbr_id'] = mbr_id
query = "INSERT INTO mbr_dons SET %s" % s
else:
new_values['mbr_id'] = mbr_id
new_values['don_id'] = don_id
query = "UPDATE mbr_dons SET %s WHERE mbr_id = :mbr_id and don_id = :don_id;" % s
execute_query(request, query, new_values)
def update_journal(request, jnl, no_id, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'date':
ddate = datetime.strptime(new_values['date'], '%d/%m/%Y')
new_values['date'] = ddate.strftime("%Y/%m/%d")
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if no_id == '0':
if jnl == 'C':
query = "INSERT INTO jnl_caisse SET %s" % s
else:
query = "INSERT INTO jnl_caisse SET %s" % s
else:
new_values['no_id'] = no_id
if jnl == 'C':
query = "UPDATE jnl_caisse SET %s WHERE no_id = :no_id;" % s
else:
query = "UPDATE jnl_banque SET %s WHERE no_id = :no_id;" % s
execute_query(request, query, new_values)
def delete_membre(request, mbr_id):
query = "DELETE FROM membres WHERE mbr_id = :mbr_id ;"
execute_query(request, query, {'mbr_id': mbr_id})
def insert_gift_to_account(request, libelle_esp, libelle_chq):
import pdb;pdb.set_trace()
# genere une écriture dans le journal de caisse pour les espèces
query = "SELECT sum(montant) as total FROM mbr_dons where valide_le IS NULL and mode='ESPECE';"
result = request.dbsession.execute(query).first()
if result.total > 0:
query = """INSERT INTO jnl_caisse (date, compte, libelle, recette, valide_le)
VALUES (CURRENT_DATE, '7540', :libelle_esp, :total_esp, CURRENT_DATE);"""
execute_query(request, query, {'libelle_esp': libelle_esp, 'total_esp': result.total})
# genere une écriture dans le journal de banque pour les chèques
query = "SELECT sum(montant) as total FROM mbr_dons where valide_le IS NULL and mode='CHEQUE';"
result = request.dbsession.execute(query).first()
if result.total > 0:
query = """INSERT INTO jnl_banque (date, compte, libelle, recette, valide_le)
VALUES (CURRENT_DATE, '7540', :libelle_chq, :total_chq, CURRENT_DATE);"""
execute_query(request, query, {'libelle_chq': libelle_chq, 'total_chq': result.total})
# valider les dons
query = "UPDATE mbr_dons SET valide_le = CURRENT_DATE WHERE valide_le IS NULL;"
execute_query(request, query, {})
def update_membre(request, mbr_id, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'nom':
new_values['nom'] = new_values['nom'].upper()
if param == 'ville':
new_values['ville'] = new_values['ville'].upper()
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if mbr_id == '0':
query = "INSERT INTO membres SET %s" % s
else:
new_values['mbr_id'] = mbr_id
query = "UPDATE membres SET %s WHERE mbr_id = :mbr_id;" % s
execute_query(request, query, new_values)
def update_membre_mdp_oublie(request, login): def update_membre_mdp_oublie(request, login):
import base64 import base64
import uuid import uuid
@@ -155,12 +37,12 @@ def update_membre_mdp_oublie(request, login):
# get a UUID - URL safe, Base64 # get a UUID - URL safe, Base64
r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes) r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)
r_uuid = r_uuid.replace('=', '') r_uuid = r_uuid.replace('=', '')
query = "UPDATE membres SET mdp_oublie=:r_uuid, mdp_oublie_date=now() WHERE email=:login;" query = "UPDATE p_users SET mdp_oublie=:r_uuid, mdp_oublie_date=now() WHERE CD_UTI=:login;"
execute_query(request, query, {'r_uuid':r_uuid, 'login':login}) execute_query(request, query, {'r_uuid':r_uuid, 'login':login})
return r_uuid return r_uuid
def update_membre_mdp(request, login, password): def update_membre_mdp(request, login, password):
"""Update password for member login""" """Update password for member login"""
query = "UPDATE membres SET mdp = SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE email=:login;" query = "UPDATE p_users SET mdp = SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE CD_UTI=:login;"
execute_query(request, query, {'login': login, 'password': password}) execute_query(request, query, {'login': login, 'password': password})

View File

@@ -3,7 +3,7 @@ from pyramid_layout.panel import panel_config
from pyramid.security import authenticated_userid from pyramid.security import authenticated_userid
from .security import groupfinder from .security import groupfinder
from .models.default import get_member_by_email from .models.default import get_member_by_id
@panel_config(name='dropdown_menu_panel', renderer='templates/panels/dropdown_menu_panel.pt') @panel_config(name='dropdown_menu_panel', renderer='templates/panels/dropdown_menu_panel.pt')
def dropdown_menu_panel(context, request): def dropdown_menu_panel(context, request):
@@ -11,14 +11,14 @@ def dropdown_menu_panel(context, request):
if logged_in is None: if logged_in is None:
return { 'logged_in': '' } return { 'logged_in': '' }
else: else:
member = get_member_by_email(request, logged_in) member = get_member_by_id(request, logged_in)
fullname = '%s %s' % (member.nom, member.prenom) fullname = member.NOM
no_id = member.mbr_id email = member.email
return { return {
'logged_in': logged_in, 'logged_in': logged_in,
'logged_in_name': fullname, 'logged_in_name': fullname,
'logged_in_id': no_id, 'logged_in_email': email,
} }

View File

@@ -1,18 +1,11 @@
def includeme(config): def includeme(config):
config.add_static_view('static', 'static', cache_max_age=3600) config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/') config.add_route('home', '/')
config.add_route('jnl_banque', '/banque_jnl') config.add_route('agenda', '/agenda')
config.add_route('jnl_caisse', '/caisse_jnl') config.add_route('changer_mdp', '/changer_mdp')
config.add_route('jnl_credit', '/jnl_credit/{jnl}/{no_id}') config.add_route('dossier_view', '/dossier_view/{mbr_id}')
config.add_route('jnl_debit', '/jnl_debit/{jnl}/{no_id}')
config.add_route('envoyer_mdp', '/envoyer_mdp') config.add_route('envoyer_mdp', '/envoyer_mdp')
config.add_route('gift_edit', '/gift_edit/{mbr_id}/{don_id}')
config.add_route('gift_list', '/gift_list')
config.add_route('login', '/login') config.add_route('login', '/login')
config.add_route('logout', '/logout') config.add_route('logout', '/logout')
config.add_route('member_edit', '/member_edit/{mbr_id}')
config.add_route('member_view', '/member_view/{mbr_id}')
config.add_route('members', '/members')
config.add_route('members_adr', '/members_adr')
config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}') config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}')

View File

@@ -1,12 +1,12 @@
from .models.default import get_member_by_email from .models.default import get_member_by_id
def groupfinder(userid, request): def groupfinder(userid, request):
member = get_member_by_email(request, userid) member = get_member_by_id(request, userid)
if member: if member:
mbr_id = member.mbr_id mbr_id = member.CD_UTI
# Chi hay Phuoc ? # Chi hay Phuoc ?
if mbr_id == 8 or mbr_id == 9: if mbr_id == 8 or mbr_id == 9:
return ['group:administrators'] return ['group:administrators']
else: else:
return [] # it means that userid is logged in (it returns None if userid isn't logged in) return [] # it means that userid is logged in (it returns None if userid isn't logged in)

View File

@@ -0,0 +1 @@
!function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):"object"==typeof exports?module.exports=e(require("jquery"),require("moment")):e(jQuery,moment)}(function(e,r){!function(){var e=r.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})});

View File

@@ -0,0 +1,53 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div class="container">
<div class="form-group">
<div class="row">
<div class="col-md-2">
<a class="btn btn-primary" role="button" href="/home">
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
</div>
<form method="POST" id="frm">
<div class="col-md-3">
<select class="form-control" id="agenda" name="agenda" onChange="$('#frm').submit()">
<optgroup tal:repeat="item agendas">
<option value="${item.code}" tal:attributes="selected agenda==item.code and 'selected' or None">${item.nom}</option>
</optgroup>
</select>
</div>
</form>
<div class="col-md-5">
<p>
<span class="label label-danger">RDV Peinture</span>&nbsp;<span class="label label-warning">RDV Menuiserie</span>&nbsp;
<span class="label label-success">RDV Plomberiee</span>&nbsp;<span class="label label-info">RDV Polynet</span>&nbsp;
</p>
</div>
</div>
</div>
</div>
<br />
<div class="container">
<div id="calendar"></div>
</div>
<br />
<br />
<script>
$(document).ready(function() {
$('#calendar').fullCalendar({
locale: 'fr',
header: {
left: 'agendaDay agendaWeek month',
center: 'prev title next',
right: 'today'
},
events:${fullcalendar_events},
});
});
</script>
</div><!-- content -->
</metal:block>

View File

@@ -0,0 +1,57 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
<div class="row">
<div class="col-xs-3">
<form id="change-password-form" action="${url}" method="post" tal:condition="member"
data-fv-framework="bootstrap"
data-fv-icon-valid="glyphicon glyphicon-ok"
data-fv-icon-invalid="glyphicon glyphicon-remove"
data-fv-icon-validating="glyphicon glyphicon-refresh">
<div class="form-group">
<label class="control-label" for="old_password">Mot de passe actuel</label>
<input class="form-control" type="password" size="10" name="old_password"
data-fv-notempty="true"
data-fv-notempty-message="Le mot de passe est obligatoire" />
</div>
<div class="form-group">
<label class="control-label" for="new_password1">Nouveau mot de passe</label>
<input class="form-control" type="password" size="10" name="new_password1"
data-fv-notempty="true"
data-fv-notempty-message="Le mot de passe est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-min="6"
data-fv-stringlength-message="Le mot de passe doit avoir au moins 6 charactères" />
</div>
<div class="form-group">
<label class="control-label" for="new_password2">Confirmer le mot de passe</label>
<input class="form-control" type="password" size="10" name="new_password2"
data-fv-identical="true"
data-fv-identical-field="new_password1"
data-fv-identical-message="Le mot de passe et sa confirmation ne sont pas identiques" />
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit" name="form.submitted">Changer le mot de passe</button>
</div>
</form>
</div>
</div> <!-- row -->
<script>
$(document).ready(function() {
$('#change-password-form').formValidation();
$('form input').on('keypress', function(e) {
return e.which !== 13;
});
});
</script>
</div>
</metal:block>

View File

@@ -6,18 +6,18 @@
<div class="row col-md-6 well"> <div class="row col-md-6 well">
<p> <p>
Vì lý do an toàn, mật khẩu của bạn đã được mã hóa và không thể lấy lại. Hãy điền email vào bên phía dưới để tiến hành đặt lại mật khẩu mới. Pour des raisons de sécurité, nous gardons votre mot de passe chiffré, et nous ne pouvons pas vous l'envoyer.
</p> Si vous souhaitez ré-initialiser votre mot de passe, remplissez le formulaire ci-dessous et nous vous enverrons un email pour démarrer la phase de ré-initialisation de votre mot de passe. </p>
<br /> <br />
<form id="email_login-form" role="form" action="${url}" method="post"> <form id="email_login-form" role="form" action="${url}" method="post">
<div class="form-group"> <div class="form-group">
<label class="control-label" for="login">Email đăng nhập của tôi</label> <label class="control-label" for="login">Mon identifiant</label>
<div> <div>
<input class="form-control" type="text" size="20" id="login" name="login" value="" /> <input class="form-control" type="text" size="20" id="login" name="login" value="" />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<button class="btn btn-primary" type="submit" name="form.submitted" value="Envoyer">Gởi đi</button> <button class="btn btn-primary" type="submit" name="form.submitted" value="Envoyer">Envoyer</button>
</div> </div>
</form> </form>
</div><!-- row --> </div><!-- row -->

View File

@@ -5,9 +5,9 @@
<br /> <br />
<div class="row"> <div class="row">
<div class="col-sm-3"> <div class="col-sm-3">
<a href="${request.application_url}/members"> <a href="${request.application_url}/agenda">
<span class="glyphicon glyphicon-user logo-small"></span><br /> <span class="glyphicon glyphicon-calendar logo-small"></span><br />
<h4>DANH SÁCH</h4></a> <h4>AGENDA</h4></a>
</div> </div>
</div> <!-- row 1 --> </div> <!-- row 1 -->
<br /> <br />

View File

@@ -10,7 +10,8 @@
<!-- Bootstrap core + Plug-ins CSS --> <!-- Bootstrap core + Plug-ins CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link href="${request.static_url('mondumas:static/dist/datatable/dataTables.bootstrap.css')}" rel="stylesheet" media="all"> <link href="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/fullcalendar.min.css" rel="stylesheet">
<!-- link href="${request.static_url('mondumas:static/dist/datatable/dataTables.bootstrap.css')}" rel="stylesheet" media="all" -->
<link href="${request.static_url('mondumas:static/dist/formvalidation/css/formValidation.min.css')}" rel="stylesheet"> <link href="${request.static_url('mondumas:static/dist/formvalidation/css/formValidation.min.css')}" rel="stylesheet">
<!-- Custom CSS --> <!-- Custom CSS -->
<link href="${request.static_url('mondumas:static/css/style.less')}" type="text/css" rel="stylesheet/less"> <link href="${request.static_url('mondumas:static/css/style.less')}" type="text/css" rel="stylesheet/less">
@@ -19,9 +20,14 @@
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<!-- Datatable --> <!-- Bootstrap Fullcalendar plugin -->
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/fullcalendar.min.js"></script>
<script src="${request.static_url('mondumas:static/dist/fullcalendar/fr.js')}"></script>
<!-- Datatable
<script src="${request.static_url('mondumas:static/dist/datatable/jquery.dataTables.js')}"></script> <script src="${request.static_url('mondumas:static/dist/datatable/jquery.dataTables.js')}"></script>
<script src="${request.static_url('mondumas:static/dist/datatable/dataTables.bootstrap.js')}"></script> <script src="${request.static_url('mondumas:static/dist/datatable/dataTables.bootstrap.js')}"></script>
-->
<!-- FormValidation plugin --> <!-- FormValidation plugin -->
<script src="${request.static_url('mondumas:static/dist/formvalidation/js/formValidation.min.js')}"></script> <script src="${request.static_url('mondumas:static/dist/formvalidation/js/formValidation.min.js')}"></script>
<script src="${request.static_url('mondumas:static/dist/formvalidation/js/framework/bootstrap.min.js')}"></script> <script src="${request.static_url('mondumas:static/dist/formvalidation/js/framework/bootstrap.min.js')}"></script>
@@ -85,7 +91,7 @@
<div id="footer"> <div id="footer">
<div class="well"> <div class="well">
<p>© 2017&nbsp;-&nbsp;<a href="http://pagode-tinhdo.blogspot.fr/" target="_blank">Pagode Tịnh Độ</a></p> <p>© 2017&nbsp;-&nbsp;<a href="http://www.entreprise-dumas.com/" target="_blank">Entreprise Dumas</a></p>
</div> </div>
</div> </div>

View File

@@ -11,31 +11,29 @@
data-fv-icon-invalid="glyphicon glyphicon-remove" data-fv-icon-invalid="glyphicon glyphicon-remove"
data-fv-icon-validating="glyphicon glyphicon-refresh"> data-fv-icon-validating="glyphicon glyphicon-refresh">
<h3>Đăng nhập</h3> <h3>Se connecter</h3>
<input type="hidden" name="came_from" value="${came_from}"/> <input type="hidden" name="came_from" value="${came_from}"/>
<div class="form-group"> <div class="form-group">
<input class="form-control" type="text" name="login" value="${login}" <input class="form-control" type="text" name="login" value="${login}"
placeholder="Email" placeholder="Identifiant"
data-fv-notempty="true" data-fv-notempty="true"
data-fv-notempty-message="Xin bạn nhập email" data-fv-notempty-message="L'identifiant est obligatoire" />
data-fv-emailaddress="true"
data-fv-emailaddress-message="Địa chỉ email không hợp lệ" />
</div> </div>
<div class="form-group"> <div class="form-group">
<input class="form-control" type="password" name="password" value="" <input class="form-control" type="password" name="password" value=""
placeholder="Mt khẩu" placeholder="Mot de passe"
data-fv-notempty="true" data-fv-notempty="true"
data-fv-notempty-message="Xin bạn nhập mật khẩu"> data-fv-notempty-message="Le mot de passe est obligatoire">
</div> </div>
<div class="form-group"> <div class="form-group">
<button class="btn btn-primary" type="submit" name="form.submitted">Đăng nhập</button> <button class="btn btn-primary" type="submit" name="form.submitted">Se connecter</button>
&nbsp;&nbsp; &nbsp;&nbsp;
</div> </div>
<p class="help-block"> <p class="help-block">
<a href="/envoyer_mdp">Quên mật khẩu ?</a> <a href="/envoyer_mdp">Mot de passe oublié ?</a>
</p> </p>
</form> </form>
</div> </div>

View File

@@ -1,163 +0,0 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
<br />
<div class="row">
<form id="empl_edit-form" class="form-horizontal" action="${url}" method="post" tal:condition="membre"
data-fv-framework="bootstrap"
data-fv-icon-valid="glyphicon glyphicon-ok"
data-fv-icon-invalid="glyphicon glyphicon-remove"
data-fv-icon-validating="glyphicon glyphicon-refresh">
<div class="form-group">
<label class="control-label col-xs-2" for="secteur">Xưng hô</label>
<div class="col-xs-2">
<select class="form-control" id="civilite" name="civilite">
<optgroup tal:repeat="item civilites">
<option value="${item}" tal:attributes="selected membre.civilite==item and 'selected' or None">${item}</option>
</optgroup>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Họ</label>
<div class="col-xs-5">
<input class="form-control" type="text" id="intitule" name="nom" value="${membre.nom}"
placeholder="30 caractères maximum"
data-fv-notempty="true"
data-fv-notempty-message="Le nom est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="30"
data-fv-stringlength-message="30 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Tên</label>
<div class="col-xs-5">
<input class="form-control" type="text" id="intitule" name="prenom" value="${membre.prenom}"
placeholder="30 caractères maximum"
data-fv-notempty="true"
data-fv-notempty-message="Le prénom est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="30"
data-fv-stringlength-message="30 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Địa chỉ</label>
<div class="col-xs-5">
<input class="form-control" type="text" id="adresse" name="adresse" value="${membre.adresse}"
data-fv-stringlength="true"
data-fv-stringlength-max="50"
data-fv-stringlength-message="50 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Địa chỉ 2</label>
<div class="col-xs-5">
<input class="form-control" type="text" id="adresse2" name="adresse2" value="${membre.adresse2}"
data-fv-stringlength="true"
data-fv-stringlength-max="50"
data-fv-stringlength-message="50 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Mã Bđ - Thành phố</label>
<div class="col-xs-2">
<input class="form-control" type="text" id="cp" name="cp" value="${membre.cp}"
data-fv-stringlength="true"
data-fv-stringlength-max="50"
data-fv-stringlength-message="50 caractères maximum" />
</div>
<div class="col-xs-5">
<input class="form-control" type="text" id="ville" name="ville" value="${membre.ville}"
data-fv-stringlength="true"
data-fv-stringlength-max="50"
data-fv-stringlength-message="50 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Điện thoai</label>
<div class="col-xs-2">
<input class="form-control" type="text" id="tel_fixe" name="tel_fixe" value="${membre.tel_fixe}"
placeholder="Téléphone fixe"
data-fv-stringlength="true"
data-fv-stringlength-max="50"
data-fv-stringlength-message="50 caractères maximum" />
</div>
<div class="col-xs-2">
<input class="form-control" type="text" id="tel_mobile" name="tel_mobile" value="${membre.tel_mobile}"
placeholder="Téléphone mobile"
data-fv-stringlength="true"
data-fv-stringlength-max="50"
data-fv-stringlength-message="50 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Địa chỉ email</label>
<div class="col-xs-5">
<input class="form-control" type="text" name="email"
value="${membre.email}" placeholder="50 caractères maximum"
data-fv-emailaddress="true"
data-fv-emailaddress-message="L'adresse email n'est pas valide" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Pháp danh</label>
<div class="col-xs-5">
<input class="form-control" type="text" name="phap_danh"
value="${membre.phap_danh}" placeholder="50 caractères maximum"
data-fv-stringlength-max="50"
data-fv-stringlength-message="50 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="notes">Ghi chú</label>
<div class="col-xs-5">
<textarea class="form-control" rows="6" cols="40" id="texte" name="notes"
data-fv-stringlength="true"
data-fv-stringlength-max="30000"
data-fv-stringlength-message="30000 caractères maximum">${membre.notes}
</textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="statut">Tình trạng</label>
<div class="col-xs-2">
<select class="form-control" id="etat" name="etat">
<optgroup tal:repeat="item etats">
<option value="${item}" tal:attributes="selected membre.statut==item and 'selected' or None">${item}</option>
</optgroup>
</select>
</div>
</div>
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">
<div class="form-group">
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Lưu</button>
<button class="btn btn-warning" type="submit" name="form.deleted"
tal:condition="python: membre.mbr_id > 0">
<span class="glyphicon glyphicon-remove"></span> Xóa</button>
<a class="btn btn-default" href="${request.application_url}/empl_list"><span class="glyphicon glyphicon-arrow-left"></span> Trở lại</a>
</div>
</div>
</div>
</form>
<br />
<br />
<br />
</div> <!-- row -->
<script>
$(document).ready(function() {
$('#empl_edit-form').formValidation();
$('form input').on('keypress', function(e) {
return e.which !== 13;
});
});
</script>
</div>
</metal:block>

View File

@@ -1,83 +0,0 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<p><a class="btn btn-success" role="button" href="${request.route_url('member_edit', mbr_id=0)}">
<span class="glyphicon glyphicon-plus"></span> Thêm HV</a></p>
<table id="members" class="table table-striped table-bordered">
<thead>
<tr>
<th>Nom Prénom</th>
<th>Civ.</th>
<th>Email</th>
<th>Ville</th>
<th>Statut</th>
<th>Pháp danh</th>
<th>Etat</th>
<th>No ID</th>
</tr>
</thead>
</table>
<script type="text/javascript">
var dataSet = ${dt_data};
$(document).ready(function() {
$('#members').DataTable({
data: dataSet,
pageLength: 100,
// traduction en français de l'interface
language: {
processing: "Traitement en cours...",
search: "Rechercher&nbsp;:",
lengthMenu: "Afficher _MENU_ &eacute;l&eacute;ments",
info: "Affichage de l'&eacute;lement _START_ &agrave; _END_ sur _TOTAL_ &eacute;l&eacute;ments",
infoEmpty: "Affichage de l'&eacute;lement 0 &agrave; 0 sur 0 &eacute;l&eacute;ments",
infoFiltered: "(filtr&eacute; de _MAX_ &eacute;l&eacute;ments au total)",
infoPostFix: "",
loadingRecords: "Chargement en cours...",
zeroRecords: "Aucun &eacute;l&eacute;ment &agrave; afficher",
emptyTable: "Aucune donnée disponible dans le tableau",
paginate: {
first: "Premier",
previous: "Pr&eacute;c&eacute;dent",
next: "Suivant",
last: "Dernier"
},
aria: {
sortAscending: ": activer pour trier la colonne par ordre croissant",
sortDescending: ": activer pour trier la colonne par ordre décroissant"
}
},
columnDefs: [
{ className: "text-center", "targets": [5,6] },
{ "targets": 7,
"render": function (data, type, full, meta) {
// ajouter un link vers le formulaire
return '<a class="btn btn-primary btn-sm" role="button" href="/member_view/' +
data + '"><span class="glyphicon glyphicon-chevron-right"></span> ' + data + '</a>';
},
},
{ "targets": 4,
"render": function (data, type, full, meta) {
// colorier la cellule en rouge ou vert selon son contenu
if (parseInt(data) > 10) {
return '<span class="text-danger">' + data + '</span>';
}
else {
return '<span class="text-success">' + data + '</span>';
}
},
}
]
});
});
</script>
<br>
<br>
</div><!-- content -->
</metal:block>

View File

@@ -1,29 +0,0 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div class="form-group">
<div class="row">
<form method="POST" id="frm">
<div class="col-md-3">
<select class="form-control" id="valide" name="valide" onChange="$('#frm').submit()">
<optgroup tal:repeat="item types">
<option value="${item}" tal:attributes="selected type==item and 'selected' or None">${item}</option>
</optgroup>
</select>
</div>
</form>
</div>
</div>
<br />
<p>Tổng cộng : <span class="text-right text-danger">${total}</span></p>
<div class="row">
<ul tal:repeat="adr adresses">
${adr.email},<br />
</ul
</div>
</div><!-- content -->
</metal:block>

View File

@@ -3,10 +3,13 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li class="dropdown-header"> <li class="dropdown-header">
${logged_in}<br /> ${logged_in_email}<br />
Numéro ID : ${logged_in_id} Identifiant : ${logged_in}
</li> </li>
<li class="divider"></li>
<li><a href="${request.application_url}/changer_mdp">Changer mon mot de passe</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a href="${request.application_url}/logout"> <li><a href="${request.application_url}/logout">
<span class="glyphicon glyphicon-off"></span>&nbsp;Se déconnecter</a></li> <span class="glyphicon glyphicon-off"></span>&nbsp;Se déconnecter</a></li>

View File

@@ -12,26 +12,23 @@
<div id="change-password" class="col-md-6 well"> <div id="change-password" class="col-md-6 well">
<div class="form-group"> <div class="form-group">
<label class="control-label" for="login">Email đăng nhập</label> <label class="control-label" for="login">Mon identifiant</label>
<input class="form-control" type="text" name="login" <input class="form-control" type="text" name="login"
placeholder="Email"
data-fv-notempty="true" data-fv-notempty="true"
data-fv-notempty-message="Xin bạn nhập email" data-fv-notempty-message="Veuillez saisir votre identifiant" />
data-fv-emailaddress="true"
data-fv-emailaddress-message="Địa chỉ email không hợp lệ" />
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label" for="new_password1">Mật khẩu mới</label> <label class="control-label" for="new_password1">Nouveau mot de passe</label>
<input class="form-control" type="password" size="10" id="new_password1" name="new_password1" /> <input class="form-control" type="password" size="10" id="new_password1" name="new_password1" />
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label" for="new_password2">Nhập lại mt khẩu</label> <label class="control-label" for="new_password2">Confirmer le mot de passe</label>
<input class="form-control" type="password" size="10" id="new_password2" name="new_password2" <input class="form-control" type="password" size="10" id="new_password2" name="new_password2"
value="" /> value="" />
</div> </div>
<button class="btn btn-primary" type="submit" name="form.submitted" value="Changer le mot de passe">Đặt mật khẩu</button> <button class="btn btn-primary" type="submit" name="form.submitted" value="Changer le mot de passe">Envoyer</button>
</div> </div>
</form> </form>
</div> <!-- row --> </div> <!-- row -->

168
mondumas/views/agenda.py Normal file
View File

@@ -0,0 +1,168 @@
# -*- coding: utf8 -*-
from pyramid.response import Response
from pyramid.renderers import render, get_renderer
from pyramid.view import (
view_config,
forbidden_view_config,
)
from pyramid.security import (
authenticated_userid,
remember,
forget,
)
from pyramid.httpexceptions import (
HTTPFound,
HTTPNotFound,
HTTPForbidden,
)
from pyramid_mailer import get_mailer
from pyramid_mailer.message import Message, Attachment
from datetime import *
import hashlib
from sqlalchemy.exc import DBAPIError
from ..security import groupfinder
import json
from ..models.agenda import *
from ..models.default import *
@view_config(route_name='member_edit', renderer='../templates/agenda/member_edit.pt', permission='view')
def member_edit(request):
mbr_id = request.matchdict['mbr_id']
url = request.route_url("member_edit", mbr_id=mbr_id)
message = ''
civilites = ["M.","M.Mme","Mme"]
etats = [u"Actif",u"Décédé",u"NPAI"]
if mbr_id == '0':
# nouveau
membre = {}
membre['mbr_id'] = 0
membre['civilite'] = 'Mme'
membre['nom'] = ''
membre['prenom'] = ''
membre['adresse'] = ''
membre['adresse2'] = ''
membre['cp'] = ''
membre['ville'] = ''
membre['email'] = ''
membre['tel_fixe'] = ''
membre['tel_mobile'] = ''
membre['phap_danh'] = '0'
membre['notes'] = ''
membre['etat'] = 'Actif'
membre['statut'] = 'HV'
page_title= 'Nouvelle Fiche'
else:
# lire la fiche de l'membre
membre = get_member_by_id(request, mbr_id)
if not membre:
request.session.flash(u"Membre non trouvé : %s" % id, 'warning')
return HTTPFound(location=request.route_url('members'))
page_title= u"Modification de la fiche no %s" %(membre.mbr_id)
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in membre.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
if new_values:
update_membre(request, mbr_id, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
if mbr_id == '0':
return HTTPFound(location=request.route_url('members'))
else:
return HTTPFound(location=request.route_url('member_view', mbr_id=mbr_id))
if 'form.deleted' in request.params:
delete_membre(request, mbr_id)
request.session.flash(u"La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('members'))
return {
'page_title': page_title,
'url': url,
'membre': membre,
'etats': etats,
'civilites': civilites,
'message': message,
}
@view_config(route_name='member_view', renderer='../templates/agenda/member_view.pt', permission='view')
def member_view(request):
mbr_id = request.matchdict['mbr_id']
url = request.route_url("member_view", mbr_id=mbr_id)
member = get_member_by_id(request, mbr_id)
if member is None:
request.session.flash(u"La fiche no %s est introuvable" % (mbr_id), 'danger')
return HTTPFound(location=request.route_url("members"))
# lire tous les dons du membre
dons = get_dons_by_mbr(request, mbr_id, 0)
return {
'page_title': u"[#%s] : %s %s" % (mbr_id, member.nom, member.prenom),
'member': member,
'dons': dons,
}
@view_config(route_name='agenda', renderer='../templates/agenda/agenda.pt')
def agenda(request):
logged_in = authenticated_userid(request)
member = get_member_by_id(request, logged_in)
if member:
agenda = member.agenda
if not agenda:
agenda = 'J'
else:
agenda = 'J'
# lire les différents AGENDAS
agendas = get_agendas(request,'')
# prendre en compte les paramètres de saisie
if 'agenda' in request.params:
agenda = request.params["agenda"]
personne = get_agendas(request,agenda)
rows = get_rendez_vous(request, agenda)
page_title = u"Agenda de %s" % personne.nom
# construire la liste des events
events = []
for row in rows:
event_url = 'agenda_event/%s' % (row.nodossier)
event_title = row.c_nom
# déterminer la couleur de l'event selon la societe
societe = row.nodossier[0:2]
if societe == "PE":
color = "#ff4444" # rouge danger
elif societe == "PL":
color = "#00C851" # vert success
elif societe == "PL":
color = "#33b5e5" # bleu info
else:
color = "#ffbb33" # orange warning
json_event = {
'title': event_title,
'start': row.rdv_debut.strftime('%Y-%m-%d %H:%M:%S'),
'end': row.rdv_fin.strftime('%Y-%m-%d %H:%M:%S'),
'allDay': False,
'color': color,
'url': event_url,
}
events.append(json_event)
return {
'page_title': page_title,
'fullcalendar_events': json.dumps(events),
'agendas': agendas,
'agenda': agenda,
}

View File

@@ -64,31 +64,56 @@ def envoyer_mdp(request):
if 'form.submitted' in request.params: if 'form.submitted' in request.params:
login = request.params['login'] login = request.params['login']
member = get_member_by_email(request, login) member = get_member_by_id(request, login)
if member: if member:
# Fabrication du corps du email_passwordMessage # Fabrication du corps du email_passwordMessage
lien = update_membre_mdp_oublie(request, login) lien = update_membre_mdp_oublie(request, login)
body = u""" body = u"""
Liên kết này cho phép bạn đặt lại mt khẩu của mình tại <tinhdo.caotek.fr> : Le lien suivant vous dirigera vers une page où vous pourrez ré-initialiser votre mot de passe d'accès à « mon.entreprise-dumas.com » :
%s %s
Liên kết này có hiệu lực trong vòng 7 ngày. (Ce lien est valide pendant 168 heures.)
""" % (request.route_url('redefinir_mdp', lien=lien)) """ % (request.route_url('redefinir_mdp', lien=lien))
envoyerMail(request, member.email, u"Yêu cầu đặt lại mt khẩu", body) envoyerMail(request, member.email, u"Demande de ré-initialisation du mot de passe", body)
request.session.flash(u"Xác nhận đặt lại mt khẩu đã được gửi đến : %s." % member.email) request.session.flash(u"Votre demande de ré-initialisation de mot de passe vous a été envoyée à %s." % member.email)
return HTTPFound(location=request.route_url('login')) return HTTPFound(location=request.route_url('login'))
else: else:
message = u"Email đăng nhập không tìm thấy." message = u"Le mot de passe fourni est incorrect."
return {
'page_title': u"Changer mon mot de passe",
'url': url,
'message': message,
}
@view_config(route_name='changer_mdp', renderer='../templates/changer_mdp.pt', permission='view')
def changer_mdp(request):
url = request.route_url('changer_mdp')
logged_in = authenticated_userid(request)
message = ''
member = get_member_by_id(request, logged_in)
if member:
if 'form.submitted' in request.params:
old_password = request.params['old_password']
new_password = request.params['new_password1']
if member.mdp == hashlib.sha1(old_password).hexdigest():
update_membre_mdp(request, logged_in, new_password)
request.session.flash(u"Votre mot de passe a été mis à jour avec succès.")
return HTTPFound(location=request.route_url('home'))
else:
message = u"Le mot de passe actuel n'est pas correct."
return { return {
'page_title': u"Quên mật khẩu ?", 'page_title': u"Changer mon mot de passe",
'url': url, 'url': url,
'message': message, 'member': member,
} 'message': message,
}
@view_config(route_name='redefinir_mdp', renderer='../templates/redefinir_mdp.pt') @view_config(route_name='redefinir_mdp', renderer='../templates/redefinir_mdp.pt')
def redefinir_mdp(request): def redefinir_mdp(request):
@@ -101,18 +126,18 @@ def redefinir_mdp(request):
if 'form.submitted' in request.params: if 'form.submitted' in request.params:
login = request.params["login"] login = request.params["login"]
mdp = request.params["new_password1"] mdp = request.params["new_password1"]
if login == membre.email: if login == membre.CD_UTI:
update_membre_mdp(request, membre.email, mdp) update_membre_mdp(request, login, mdp)
request.session.flash(u"Mật khẩu của bạn đã được thay đổi.", 'success') request.session.flash(u"Votre mot de passe a été modifié avec succès.", 'success')
return HTTPFound(location=request.route_url('login')) return HTTPFound(location=request.route_url('login'))
else: else:
request.session.flash(u"Email và liên kết không khớp với nhau.", 'danger') request.session.flash(u"Identifiant incorrect.", 'danger')
return HTTPFound(location=request.route_url('login')) return HTTPFound(location=request.route_url('login'))
else: else:
request.session.flash(u"Liên kết không còn giá trị.", 'danger') request.session.flash(u"Le lien n'est plus valable.", 'warning')
return HTTPFound(location=request.route_url('login')) return HTTPFound(location=request.route_url('login'))
return { return {
'page_title': u"Đặt lại mt khẩu", 'page_title': u"Définissez votre mot de passe",
'url': url, 'url': url,
} }
@@ -135,14 +160,14 @@ def login(request):
if 'form.submitted' in request.params: if 'form.submitted' in request.params:
login = request.params['login'] login = request.params['login']
password = request.params['password'] password = request.params['password']
record = get_member_by_email(request, login) record = get_member_by_id(request, login)
if record : if record :
password_hash = hashlib.sha1(password).hexdigest() # mot de passe hash valide ?
if record.mdp == password_hash: if record.mdp == hashlib.sha1(password).hexdigest():
headers = remember(request, login) headers = remember(request, login)
return HTTPFound(location=came_from, headers=headers) return HTTPFound(location=came_from, headers=headers)
message = u"Email mt khẫu không ăn khớp. Đăng nhập không thành công." message = u"Email et mot de passe invalides. La connexion a échoué."
return { return {
'page_title': u"", 'page_title': u"",
@@ -152,61 +177,6 @@ def login(request):
'message': message, 'message': message,
} }
@view_config(route_name='gift_edit', renderer='../templates/gift_edit.pt', permission='view')
def gift_edit(request):
mbr_id = request.matchdict['mbr_id']
don_id = request.matchdict['don_id']
url = request.route_url("gift_edit", mbr_id=mbr_id, don_id=don_id)
# lire la fiche de l'membre
membre = get_member_by_id(request, mbr_id)
message = ''
types = ["DON MANUEL","COTISATION"]
modes = [u"ESPECE",u"CHEQUE"]
if don_id == '0':
# nouveau
don = {}
don['mbr_id'] = str(mbr_id)
don['don_id'] = '0'
don['date'] = date.today()
don['type'] = 'DON MANUEL'
don['mode'] = 'ESPECE'
don['montant'] = 0
don['valide_le'] = ''
page_title= 'Nouveau don'
else:
# lire le don
don = get_dons_by_mbr(request, mbr_id, don_id)
if not don:
request.session.flash(u"Don non trouvé : %s" % don_id, 'danger')
return HTTPFound(location=request.route_url('member_view', mbr_id=mbr_id))
page_title= u"Modification du don no %s" % (don.don_id)
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in don.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
if new_values:
update_don(request, mbr_id, don_id, new_values)
request.session.flash(u"Le don a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('member_view', mbr_id=mbr_id))
if 'form.deleted' in request.params:
delete_don(request, mbr_id, don_id)
request.session.flash(u"Le don a été supprimé avec succès.", 'success')
return HTTPFound(location=request.route_url('member_view', mbr_id=mbr_id))
return {
'page_title': page_title,
'url': url,
'mbr_nom': '%s %s' % (membre.nom, membre.prenom),
'don': don,
'types': types,
'modes': modes,
'message': message,
}
@view_config(route_name='logout') @view_config(route_name='logout')
def logout(request): def logout(request):
@@ -217,115 +187,18 @@ def logout(request):
headers=headers) headers=headers)
@view_config(route_name='member_edit', renderer='../templates/member_edit.pt', permission='view')
def member_edit(request):
mbr_id = request.matchdict['mbr_id']
url = request.route_url("member_edit", mbr_id=mbr_id)
message = ''
civilites = ["M.","M.Mme","Mme"]
etats = [u"Actif",u"Décédé",u"NPAI"]
if mbr_id == '0':
# nouveau
membre = {}
membre['mbr_id'] = 0
membre['civilite'] = 'Mme'
membre['nom'] = ''
membre['prenom'] = ''
membre['adresse'] = ''
membre['adresse2'] = ''
membre['cp'] = ''
membre['ville'] = ''
membre['email'] = ''
membre['tel_fixe'] = ''
membre['tel_mobile'] = ''
membre['phap_danh'] = '0'
membre['notes'] = ''
membre['etat'] = 'Actif'
membre['statut'] = 'HV'
page_title= 'Nouvelle Fiche'
else:
# lire la fiche de l'membre
membre = get_member_by_id(request, mbr_id)
if not membre:
request.session.flash(u"Membre non trouvé : %s" % id, 'warning')
return HTTPFound(location=request.route_url('members'))
page_title= u"Modification de la fiche no %s" %(membre.mbr_id)
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in membre.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
if new_values:
update_membre(request, mbr_id, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
if mbr_id == '0':
return HTTPFound(location=request.route_url('members'))
else:
return HTTPFound(location=request.route_url('member_view', mbr_id=mbr_id))
if 'form.deleted' in request.params:
delete_membre(request, mbr_id)
request.session.flash(u"La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('members'))
return {
'page_title': page_title,
'url': url,
'membre': membre,
'etats': etats,
'civilites': civilites,
'message': message,
}
@view_config(route_name='member_view', renderer='../templates/member_view.pt', permission='view')
def member_view(request):
mbr_id = request.matchdict['mbr_id']
url = request.route_url("member_view", mbr_id=mbr_id)
member = get_member_by_id(request, mbr_id)
if member is None:
request.session.flash(u"La fiche no %s est introuvable" % (mbr_id), 'danger')
return HTTPFound(location=request.route_url("members"))
# lire tous les dons du membre
dons = get_dons_by_mbr(request, mbr_id, 0)
return {
'page_title': u"[#%s] : %s %s" % (mbr_id, member.nom, member.prenom),
'member': member,
'dons': dons,
}
@view_config(route_name='members', renderer='../templates/members.pt', permission='view')
def members(request):
items = get_membres(request)
liste=[]
for item in items:
full_name = u'%s, %s ' % (item.nom, item.prenom)
d = (full_name, item.civilite, item.email, item.ville, item.statut, item.phap_danh, item.etat, item.mbr_id)
liste.append(d)
return {
"page_title": u"Danh sách",
'dt_data': json.dumps(liste),
}
def envoyerMail(request, destinataire, objet, corps): def envoyerMail(request, destinataire, objet, corps):
body = u""" body = u"""
%s %s
Thân mến, Cordialement,
https://tinhdo.caotek.fr mon.entreprise-dumas.com
""" % (corps) """ % (corps)
message = Message(subject=u"[tinh-do] %s" % objet, message = Message(subject=u"[Ent. Duams] %s" % objet,
sender=request.registry.settings['mondumas.admin_email'], sender=request.registry.settings['mondumas.admin_email'],
body=body) body=body)
message.add_recipient(destinataire) message.add_recipient(destinataire)