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

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)
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):
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()
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):
# 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()
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):
import base64
import uuid
@@ -155,12 +37,12 @@ def update_membre_mdp_oublie(request, login):
# get a UUID - URL safe, Base64
r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)
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})
return r_uuid
def update_membre_mdp(request, login, password):
"""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})

View File

@@ -3,7 +3,7 @@ from pyramid_layout.panel import panel_config
from pyramid.security import authenticated_userid
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')
def dropdown_menu_panel(context, request):
@@ -11,14 +11,14 @@ def dropdown_menu_panel(context, request):
if logged_in is None:
return { 'logged_in': '' }
else:
member = get_member_by_email(request, logged_in)
fullname = '%s %s' % (member.nom, member.prenom)
no_id = member.mbr_id
member = get_member_by_id(request, logged_in)
fullname = member.NOM
email = member.email
return {
'logged_in': logged_in,
'logged_in_name': fullname,
'logged_in_id': no_id,
'logged_in_email': email,
}

View File

@@ -1,18 +1,11 @@
def includeme(config):
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/')
config.add_route('jnl_banque', '/banque_jnl')
config.add_route('jnl_caisse', '/caisse_jnl')
config.add_route('jnl_credit', '/jnl_credit/{jnl}/{no_id}')
config.add_route('jnl_debit', '/jnl_debit/{jnl}/{no_id}')
config.add_route('agenda', '/agenda')
config.add_route('changer_mdp', '/changer_mdp')
config.add_route('dossier_view', '/dossier_view/{mbr_id}')
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('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}')

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):
member = get_member_by_email(request, userid)
member = get_member_by_id(request, userid)
if member:
mbr_id = member.mbr_id
# Chi hay Phuoc ?
if mbr_id == 8 or mbr_id == 9:
return ['group:administrators']
else:
return [] # it means that userid is logged in (it returns None if userid isn't logged in)
if member:
mbr_id = member.CD_UTI
# Chi hay Phuoc ?
if mbr_id == 8 or mbr_id == 9:
return ['group:administrators']
else:
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">
<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.
</p>
Pour des raisons de sécurité, nous gardons votre mot de passe chiffré, et nous ne pouvons pas vous l'envoyer.
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 />
<form id="email_login-form" role="form" action="${url}" method="post">
<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>
<input class="form-control" type="text" size="20" id="login" name="login" value="" />
</div>
</div>
<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>
</form>
</div><!-- row -->

View File

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

View File

@@ -10,7 +10,8 @@
<!-- Bootstrap core + Plug-ins 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">
<!-- Custom CSS -->
<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="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/dataTables.bootstrap.js')}"></script>
-->
<!-- 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/framework/bootstrap.min.js')}"></script>
@@ -85,7 +91,7 @@
<div id="footer">
<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>

View File

@@ -11,31 +11,29 @@
data-fv-icon-invalid="glyphicon glyphicon-remove"
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}"/>
<div class="form-group">
<input class="form-control" type="text" name="login" value="${login}"
placeholder="Email"
placeholder="Identifiant"
data-fv-notempty="true"
data-fv-notempty-message="Xin bạn nhập email"
data-fv-emailaddress="true"
data-fv-emailaddress-message="Địa chỉ email không hợp lệ" />
data-fv-notempty-message="L'identifiant est obligatoire" />
</div>
<div class="form-group">
<input class="form-control" type="password" name="password" value=""
placeholder="Mt khẩu"
placeholder="Mot de passe"
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 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;
</div>
<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>
</form>
</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">
<li class="dropdown-header">
${logged_in}<br />
Numéro ID : ${logged_in_id}
${logged_in_email}<br />
Identifiant : ${logged_in}
</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><a href="${request.application_url}/logout">
<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 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"
placeholder="Email"
data-fv-notempty="true"
data-fv-notempty-message="Xin bạn nhập email"
data-fv-emailaddress="true"
data-fv-emailaddress-message="Địa chỉ email không hợp lệ" />
data-fv-notempty-message="Veuillez saisir votre identifiant" />
</div>
<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" />
</div>
<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"
value="" />
</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>
</form>
</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:
login = request.params['login']
member = get_member_by_email(request, login)
member = get_member_by_id(request, login)
if member:
# Fabrication du corps du email_passwordMessage
lien = update_membre_mdp_oublie(request, login)
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
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))
envoyerMail(request, member.email, u"Yêu cầu đặt lại mt khẩu", body)
request.session.flash(u"Xác nhận đặt lại mt khẩu đã được gửi đến : %s." % member.email)
envoyerMail(request, member.email, u"Demande de ré-initialisation du mot de passe", body)
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'))
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 {
'page_title': u"Quên mật khẩu ?",
'url': url,
'message': message,
}
'page_title': u"Changer mon mot de passe",
'url': url,
'member': member,
'message': message,
}
@view_config(route_name='redefinir_mdp', renderer='../templates/redefinir_mdp.pt')
def redefinir_mdp(request):
@@ -101,18 +126,18 @@ def redefinir_mdp(request):
if 'form.submitted' in request.params:
login = request.params["login"]
mdp = request.params["new_password1"]
if login == membre.email:
update_membre_mdp(request, membre.email, mdp)
request.session.flash(u"Mật khẩu của bạn đã được thay đổi.", 'success')
if login == membre.CD_UTI:
update_membre_mdp(request, login, mdp)
request.session.flash(u"Votre mot de passe a été modifié avec succès.", 'success')
return HTTPFound(location=request.route_url('login'))
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'))
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 {
'page_title': u"Đặt lại mt khẩu",
'page_title': u"Définissez votre mot de passe",
'url': url,
}
@@ -135,14 +160,14 @@ def login(request):
if 'form.submitted' in request.params:
login = request.params['login']
password = request.params['password']
record = get_member_by_email(request, login)
record = get_member_by_id(request, login)
if record :
password_hash = hashlib.sha1(password).hexdigest()
if record.mdp == password_hash:
# mot de passe hash valide ?
if record.mdp == hashlib.sha1(password).hexdigest():
headers = remember(request, login)
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 {
'page_title': u"",
@@ -152,61 +177,6 @@ def login(request):
'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')
def logout(request):
@@ -217,115 +187,18 @@ def logout(request):
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):
body = u"""
%s
Thân mến,
https://tinhdo.caotek.fr
Cordialement,
mon.entreprise-dumas.com
""" % (corps)
message = Message(subject=u"[tinh-do] %s" % objet,
message = Message(subject=u"[Ent. Duams] %s" % objet,
sender=request.registry.settings['mondumas.admin_email'],
body=body)
message.add_recipient(destinataire)