added users_list.pt and user_edit.pt

This commit is contained in:
2017-05-22 15:00:26 +02:00
parent fb01cd1437
commit 8ae79cb808
13 changed files with 404 additions and 101 deletions

View File

@@ -22,7 +22,7 @@ def execute_query(request, query, params):
def get_users_actifs(request,cd_uti):
if cd_uti =='':
query = "SELECT * FROM p_users WHERE agenda IS NOT NULL ORDER BY NOM"
query = "SELECT * FROM p_users WHERE agenda <> 0 ORDER BY NOM"
results = request.dbsession.execute(query).fetchall()
else:
query = "SELECT * FROM p_users WHERE cd_uti = :cd_uti;"
@@ -122,53 +122,3 @@ def update_rdv(request, nodossier, nolig, comment, commentvi, date_rdv):
execute_query(request, query, {})
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 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

@@ -25,9 +25,13 @@ def get_member_by_mdp_oublie(request, lien):
return results
def get_member_by_id(request, mbr_id):
# lire le membres par son identifianr
query = """SELECT * FROM p_users WHERE CD_UTI=:mbr_id;"""
results = request.dbsession.execute(query, {'mbr_id': mbr_id}).first()
if mbr_id == '0':
query = "SELECT * FROM P_USERS ORDER BY cd_uti"
results = request.dbsession.execute(query).fetchall()
else:
# lire le membres par son identifianr
query = """SELECT * FROM p_users WHERE CD_UTI=:mbr_id;"""
results = request.dbsession.execute(query, {'mbr_id': mbr_id}).first()
return results
def update_membre_mdp_oublie(request, login):
@@ -43,16 +47,37 @@ def update_membre_mdp_oublie(request, login):
def update_membre_mdp(request, login, password):
"""Update password for member login"""
query = "UPDATE p_users SET mdp = SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE CD_UTI=: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})
def update_last_connection(request, login):
"""Update last connection for login """
query = "UPDATE p_users SET dern_cnx_le=NOW() WHERE CD_UTI=:login;"
query = "UPDATE p_users SET dern_cnx_le=NOW() WHERE cd_uti=:login;"
execute_query(request, query, {'login': login})
def get_members_by_last_connection(request, ):
# lire les donnees de l'eleve
query = "SELECT * FROM p_users WHERE dern_cnx_le IS NOT NULL ORDER BY dern_cnx_le DESC"
results = request.dbsession.execute(query, ).fetchall()
return results
def update_membre(request, cd_uti, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'nom':
new_values['nom'] = new_values['nom'].upper()
if param == 'access':
' ne prend que le 1er caractère'
new_values['access'] = new_values['access'][0]
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if cd_uti == '0':
query = "INSERT INTO p_users SET %s" % s
else:
new_values['cd_uti'] = cd_uti
query = "UPDATE p_users SET %s WHERE cd_uti = :cd_uti;" % s
execute_query(request, query, new_values)
def delete_membre(request, cd_uti):
query = "DELETE FROM p_users WHERE cd_uti = :cd_uti ;"
execute_query(request, query, {'cd_uti': cd_uti})

View File

@@ -12,7 +12,7 @@ def dropdown_menu_panel(context, request):
return { 'logged_in': '' }
else:
member = get_member_by_id(request, logged_in)
fullname = member.NOM
fullname = member.nom
email = member.email
if member.access == 9:
logged_in_fonction = 'Administrateur'

View File

@@ -6,7 +6,8 @@ def includeme(config):
config.add_route('dossier_view', '/dossier_view/{nodossier}')
config.add_route('rdv_edit','/rdv_edit/{nodossier}/{nolig}')
config.add_route('envoyer_mdp', '/envoyer_mdp')
config.add_route('last_connected', '/last_connected')
config.add_route('user_edit', '/user_edit/{cd_uti}')
config.add_route('users_list', '/users_list')
config.add_route('login', '/login')
config.add_route('logout', '/logout')
config.add_route('planning', '/planning')

View File

@@ -0,0 +1,74 @@
/**
* This plug-in for DataTables represents the ultimate option in extensibility
* for sorting date / time strings correctly. It uses
* [Moment.js](http://momentjs.com) to create automatic type detection and
* sorting plug-ins for DataTables based on a given format. This way, DataTables
* will automatically detect your temporal information and sort it correctly.
*
* For usage instructions, please see the DataTables blog
* post that [introduces it](//datatables.net/blog/2014-12-18).
*
* @name Ultimate Date / Time sorting
* @summary Sort date and time in any format using Moment.js
* @author [Allan Jardine](//datatables.net)
* @depends DataTables 1.10+, Moment.js 1.7+
*
* @example
* $.fn.dataTable.moment( 'HH:mm MMM D, YY' );
* $.fn.dataTable.moment( 'dddd, MMMM Do, YYYY' );
*
* $('#example').DataTable();
*/
(function (factory) {
if (typeof define === "function" && define.amd) {
define(["jquery", "moment", "datatables.net"], factory);
} else {
factory(jQuery, moment);
}
}(function ($, moment) {
$.fn.dataTable.moment = function ( format, locale ) {
var types = $.fn.dataTable.ext.type;
// Add type detection
types.detect.unshift( function ( d ) {
if ( d ) {
// Strip HTML tags and newline characters if possible
if ( d.replace ) {
d = d.replace(/(<.*?>)|(\r?\n|\r)/g, '');
}
// Strip out surrounding white space
d = $.trim( d );
}
// Null and empty values are acceptable
if ( d === '' || d === null ) {
return 'moment-'+format;
}
return moment( d, format, locale, true ).isValid() ?
'moment-'+format :
null;
} );
// Add sorting method - use an integer for the sorting
types.order[ 'moment-'+format+'-pre' ] = function ( d ) {
if ( d ) {
// Strip HTML tags and newline characters if possible
if ( d.replace ) {
d = d.replace(/(<.*?>)|(\r?\n|\r)/g, '');
}
// Strip out surrounding white space
d = $.trim( d );
}
return d === '' || d === null ?
-Infinity :
parseInt( moment( d, format, locale, true ).format( 'x' ), 10 );
};
};
}));

File diff suppressed because one or more lines are too long

View File

@@ -18,9 +18,9 @@
<br />
<div class="row well" tal:condition="layout.isAdmin">
<div class="col-sm-3">
<a href="${request.application_url}/last_connected">
<span class="glyphicon glyphicon-log-in logo-small"></span><br />
<h4>Derniers connectés</h4></a>
<a href="${request.application_url}/users_list">
<span class="glyphicon glyphicon-user logo-small"></span><br />
<h4>UTILISATEURS</h4></a>
</div>
</div> <!-- row 2 -->
<br />

View File

@@ -1,26 +0,0 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div tal:condition="items">
<table class="table table-striped table-bordered">
<tr>
<th>Date</th>
<th>Code</th>
<th>Nom</th>
<th>email</th>
</tr>
<tr tal:repeat="item items">
<td tal:content="python:item.dern_cnx_le.strftime('%d/%m/%Y %H:%M')" />
<td align="left" tal:content="item.CD_UTI" />
<td align="left" tal:content="item.NOM" />
<td align="left" tal:content="item.email" />
</tr>
</table>
</div>
</div><!-- content -->
</metal:block>

View File

@@ -12,7 +12,7 @@
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/fullcalendar.min.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.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/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">
@@ -23,14 +23,15 @@
<!-- 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/moment.js/2.17.1/locale/fr.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/fullcalendar.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/locale/fr.js"></script>
<!-- Bootstrap Datepicker plugin -->
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>
<!-- Datatable
<!-- 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>
-->
<script src="${request.static_url('mondumas:static/dist/datatable/datetime-moment.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>

View File

@@ -0,0 +1,11 @@
from .models.default import get_member_by_id
def groupfinder(userid, request):
member = get_member_by_id(request, userid)
if member:
# Roles administrateur ?
if member.access == 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,110 @@
<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="user_edit-form" class="form-horizontal" action="${url}" method="post" tal:condition="individu"
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="cd_uti">Identifiant</label>
<div class="col-xs-2">
<input class="form-control" type="text" id="cd_uti" name="cd_uti" value="${individu.cd_uti}"
placeholder="10 caractères maximum"
data-fv-notempty="true"
data-fv-notempty-message="L'identifiant est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="3"
data-fv-stringlength-message="3 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Nom et prénom</label>
<div class="col-xs-5">
<input class="form-control" type="text" id="intitule" name="nom" value="${individu.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="25"
data-fv-stringlength-message="25 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Email</label>
<div class="col-xs-5">
<input class="form-control" type="text" name="email"
value="${individu.email}" placeholder="55 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="control-label col-xs-2" for="access">Accès</label>
<div class="col-xs-2">
<select class="form-control" id="access" name="access">
<optgroup tal:repeat="item access">
<option value="${item}" tal:attributes="selected individu.access==item[0] and 'selected' or None">${item}</option>
</optgroup>
</select>
</div>
</div>
<div class="form-group">
<div class="col-xs-offset-2 col-xs-7 checkbox">
<label><input type="checkbox" name="agenda" value="individu.agenda" id="agenda"
tal:attributes="checked individu.agenda <> 0 and 'checked' or None">Gérer son agenda
</label>
</div>
</div>
<div class="form-group">
<div class="col-xs-offset-2 col-xs-7 checkbox">
<label><input type="checkbox" name="actif" value="individu.actif" id="actif"
tal:attributes="checked individu.actif <> 0 and 'checked' or None">La fiche est active
</label>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="access">Dernière modif</label>
<div class="col-xs-7">
<p class="form-control-static">${individu.modif_le.strftime('%d/%m/%Y - %H:%M')}</p>
</div>
</div>
<div class="form-group">
<div class="col-xs-offset-2 col-xs-7 checkbox">
<p class="form-control-static">La fiche est active</p>
</div>
</div>
<br />
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">
<div class="form-group">
<a class="btn btn-default" href="${request.application_url}/users_list"><span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
<button class="btn btn-warning" type="submit" name="form.deleted"
tal:condition="individu.cd_uti > 0">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
</div>
</div>
</div>
</form>
<br />
<br />
</div> <!-- row -->
<script>
$(document).ready(function() {
$('#user_edit-form').formValidation();
$('form input').on('keypress', function(e) {
return e.which !== 13;
});
});
</script>
</div>
</metal:block>

View File

@@ -0,0 +1,63 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<p>
<a href="${request.application_url}/" class="btn btn-default" role="button">
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<a href="${request.application_url}/user_edit/0" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouveau utilisateur</a>
</p>
<table id="users_list" class="table table-striped table-bordered">
<thead>
<tr>
<th>Login</th>
<th>Nom, Prénom</th>
<th>Email</th>
<th>Agenda</th>
<th>Rôle</th>
<th>Dern cnx</th>
<th>Etat</th>
</tr>
</thead>
</table>
<br />
<br />
<script type="text/javascript">
var dataSet = ${dt_data};
$(document).ready(function() {
$.fn.dataTable.moment('DD/MM/YYYY - HH:mm');
$('#users_list').DataTable({
data: dataSet,
pageLength: 50,
bLengthChange: false,
columnDefs: [
{ "targets": 0,
"render": function (data, type, full, meta) {
// ajouter un link vers le formulaire
return '<a href="/user_edit/' + data + '">' + data + '</a>';
},
},
{ "targets": 3,
"render": function (data, type, full, meta) {
if (data != 0) {
return '<span class="glyphicon glyphicon-calendar"></span>';
}
else {
return '';
}
},
}
]
});
});
</script>
</div><!-- content -->
</metal:block>

View File

@@ -126,7 +126,7 @@ def redefinir_mdp(request):
if 'form.submitted' in request.params:
login = request.params["login"]
mdp = request.params["new_password1"]
if login == membre.CD_UTI:
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'))
@@ -181,15 +181,42 @@ def login(request):
'message': message,
}
@view_config(route_name='last_connected', renderer='../templates/last_connected.pt', permission='manage')
def last_connected(request):
items = get_members_by_last_connection(request)
@view_config(route_name='users_list', renderer='../templates/users_list.pt', permission='manage')
def users_list(request):
# lire les utilisateurs
items = get_member_by_id(request, '0')
# construire la liste
liste=[]
for item in items:
if item.dern_cnx_le:
der_cnx_le = item.dern_cnx_le.strftime('%d/%m/%Y - %H:%M')
else:
der_cnx_le = ""
if item.actif == 0:
etat = 'Inactif'
else:
etat = ''
if item.access == 0:
role = ''
elif item.access == 8:
role = 'Compta'
elif item.access == 9:
role = 'Admin'
else:
role = 'Gestion'
d = (item.cd_uti, item.nom, item.email, item.agenda, role, der_cnx_le, etat)
liste.append(d)
return {
'page_title': u"Derniers connectés",
'items': items,
'page_title': u'Liste des utilisateurs',
'dt_data': json.dumps(liste),
}
@view_config(route_name='logout')
def logout(request):
request.session.invalidate()
@@ -217,3 +244,63 @@ gestion.entreprise-dumas.com
mailer = get_mailer(request)
mailer.send_immediately(message)
@view_config(route_name='user_edit', renderer='../templates/user_edit.pt', permission='manage')
def user_edit(request):
cd_uti = request.matchdict['cd_uti']
url = request.route_url('user_edit', cd_uti=cd_uti)
message = ''
access = ["0 | Production", "5 | Gestion", u"8 | Comptabilité", "9 | Administration"]
if cd_uti == '0':
# nouveau
individu = {}
individu['cd_uti'] = 0
individu['nom'] = ''
individu['email'] = ''
individu['access'] = '0 | Production'
individu['actif'] = 1
individu['agenda'] = 0
page_title= 'Nouvelle Fiche'
else:
# lire la fiche de l'individu
individu = get_member_by_id(request, cd_uti)
if not individu:
request.session.flash(u"Utilisateur non trouvé : %s" % cd_uti, 'warning')
return HTTPFound(location=request.route_url('users_list'))
page_title= u"Fiche de %s" %(individu.nom)
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in individu.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
# actif coché ?
if 'actif' in request.params:
new_values['actif'] = 1
else:
new_values['actif'] = 0
# agenda coché ?
if 'agenda' in request.params:
new_values['agenda'] = 1
else:
new_values['agenda'] = 0
if new_values:
update_membre(request, cd_uti, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('users_list'))
if 'form.deleted' in request.params:
delete_membre(request, cd_uti)
request.session.flash(u"La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('users_list'))
return {
'page_title': page_title,
'url': url,
'individu': individu,
'access': access,
'message': message,
}