ajouter agenda.pt en fullcalendar
This commit is contained in:
@@ -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
151
mondumas/models/agenda.py
Normal 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)
|
||||
|
||||
@@ -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})
|
||||
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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}')
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
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
|
||||
mbr_id = member.CD_UTI
|
||||
# Chi hay Phuoc ?
|
||||
if mbr_id == 8 or mbr_id == 9:
|
||||
return ['group:administrators']
|
||||
|
||||
1
mondumas/static/dist/fullcalendar/fr.js
vendored
Normal file
1
mondumas/static/dist/fullcalendar/fr.js
vendored
Normal 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"})});
|
||||
53
mondumas/templates/agenda/agenda.pt
Normal file
53
mondumas/templates/agenda/agenda.pt
Normal 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> <span class="label label-warning">RDV Menuiserie</span>
|
||||
<span class="label label-success">RDV Plomberiee</span> <span class="label label-info">RDV Polynet</span>
|
||||
</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>
|
||||
|
||||
|
||||
57
mondumas/templates/changer_mdp.pt
Normal file
57
mondumas/templates/changer_mdp.pt
Normal 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>
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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 />
|
||||
|
||||
@@ -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 - <a href="http://pagode-tinhdo.blogspot.fr/" target="_blank">Pagode Tịnh Độ</a></p>
|
||||
<p>© 2017 - <a href="http://www.entreprise-dumas.com/" target="_blank">Entreprise Dumas</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -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="Mật 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>
|
||||
|
||||
</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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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 :",
|
||||
lengthMenu: "Afficher _MENU_ éléments",
|
||||
info: "Affichage de l'élement _START_ à _END_ sur _TOTAL_ éléments",
|
||||
infoEmpty: "Affichage de l'élement 0 à 0 sur 0 éléments",
|
||||
infoFiltered: "(filtré de _MAX_ éléments au total)",
|
||||
infoPostFix: "",
|
||||
loadingRecords: "Chargement en cours...",
|
||||
zeroRecords: "Aucun élément à afficher",
|
||||
emptyTable: "Aucune donnée disponible dans le tableau",
|
||||
paginate: {
|
||||
first: "Premier",
|
||||
previous: "Précé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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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> Se déconnecter</a></li>
|
||||
|
||||
@@ -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 mật 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
168
mondumas/views/agenda.py
Normal 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,
|
||||
}
|
||||
|
||||
@@ -64,29 +64,54 @@ 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 mật 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 mật khẩu", body)
|
||||
request.session.flash(u"Xác nhận đặt lại mật 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 ?",
|
||||
'page_title': u"Changer mon mot de passe",
|
||||
'url': url,
|
||||
'member': member,
|
||||
'message': message,
|
||||
}
|
||||
|
||||
@@ -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 mật 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 và mật 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)
|
||||
|
||||
Reference in New Issue
Block a user