menu principal

This commit is contained in:
CAO Thien-An
2017-07-22 18:37:51 +02:00
parent bd128102c2
commit 3841d34eab
11 changed files with 221 additions and 112 deletions

View File

@@ -1,11 +1,12 @@
# -*- coding: utf8 -*-
from pyramid_layout.layout import layout_config
from pyramid.security import authenticated_userid
from .security import groupfinder
from views.default import (
to_euro,
to_percent,
to_decimal,
to_percent,
to_decimal,
)
from pyramid.security import authenticated_userid
@layout_config(template='templates/layouts/global_layout.pt')
class GlobalLayout(object):

View File

@@ -61,16 +61,13 @@ def update_membre(request, email, new_values):
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 email == '':
if email == 'new':
query = "INSERT INTO members SET %s" % s
else:
new_values['email'] = email

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -3,26 +3,6 @@
<div class="container-fluid text-center">
<br />
<div class="row">
<div class="col-sm-3">
<a href="${request.application_url}/agenda">
<span class="glyphicon glyphicon-calendar logo-small"></span><br />
<h4>MON AGENDA</h4></a>
</div>
<div class="col-sm-3">
<a href="${request.application_url}/planning">
<span class="glyphicon glyphicon-calendar logo-small"></span><br />
<h4>PLANNING</h4></a>
</div>
</div> <!-- row 1 -->
<br />
<div class="row well" tal:condition="layout.isAdmin">
<div class="col-sm-3">
<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 />
<br />
</div>

View File

@@ -1,71 +1,67 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:tal="http://xml.zope.org/namespaces/tal"
lang="fr">
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:tal="http://xml.zope.org/namespaces/tal"
lang="fr">
<head>
<title>${page_title}</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" />
<title>${page_title}</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" />
<!-- Bootstrap core + Plug-ins CSS -->
<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('caotek_mesavoirs:static/dist/datatable/dataTables.bootstrap.css')}" rel="stylesheet" media="all">
<link href="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/css/formValidation.min.css')}" rel="stylesheet">
<!-- Custom CSS -->
<link href="${request.static_url('caotek_mesavoirs:static/css/style.less')}" type="text/css" rel="stylesheet/less">
<!-- Bootstrap core + Plug-ins CSS -->
<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('caotek_mesavoirs:static/dist/datatable/dataTables.bootstrap.css')}" rel="stylesheet" media="all">
<link href="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/css/formValidation.min.css')}" rel="stylesheet">
<!-- Custom CSS -->
<link href="${request.static_url('caotek_mesavoirs:static/css/style.less')}" type="text/css" rel="stylesheet/less">
<!-- Bootstrap + jQuery JavaScript plugins) -->
<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>
<!-- Bootstrap + jQuery JavaScript plugins) -->
<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>
<!-- 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 -->
<script src="${request.static_url('caotek_mesavoirs:static/dist/datatable/jquery.dataTables.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/datatable/dataTables.bootstrap.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/datatable/datetime-moment.js')}"></script>
<!-- FormValidation plugin -->
<script src="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/js/formValidation.min.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/js/framework/bootstrap.min.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/js/language/fr_FR.js')}" type="text/javascript"></script>
<!-- Less -->
<script src="${request.static_url('caotek_mesavoirs:static/dist/less-1.5.0.min.js')}" type="text/javascript"></script>
<!-- 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 -->
<script src="${request.static_url('caotek_mesavoirs:static/dist/datatable/jquery.dataTables.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/datatable/dataTables.bootstrap.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/datatable/datetime-moment.js')}"></script>
<!-- FormValidation plugin -->
<script src="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/js/formValidation.min.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/js/framework/bootstrap.min.js')}"></script>
<script src="${request.static_url('caotek_mesavoirs:static/dist/formvalidation/js/language/fr_FR.js')}" type="text/javascript"></script>
<!-- Less -->
<script src="${request.static_url('caotek_mesavoirs:static/dist/less-1.5.0.min.js')}" type="text/javascript"></script>
</head>
<body>
<!-- HEADER -->
<nav id="mainnav" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="${request.application_url}" alt="Accueil">
<img src="${request.static_url('caotek_mesavoirs:static/img/logo.png')}" class="logo" /></a>
&nbsp;Entreprise DUMAS
</div>
<div class="collapse navbar-collapse" id="myNavbar" tal:condition="not layout.isAnonymous()">
<ul class="nav navbar-nav navbar-right">
<li>
<a href="${request.application_url}"><span class="glyphicon glyphicon-home"></span>&nbsp;Accueil</a></li>
<!--
<li tal:condition="python: layout.isAdmin()">
<a href="${request.application_url}/gestionnaire"><span class="glyphicon glyphicon-eye-open"></span>&nbsp;Gestionnaire</a></li>
-->
${panel('dropdown_menu_panel')}
</ul>
</div>
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="${request.application_url}" alt="Accueil">
<img src="${request.static_url('caotek_mesavoirs:static/img/logo.png')}" class="logo" /></a>
&nbsp;MES AVOIRS
</div>
<div class="collapse navbar-collapse" id="myNavbar" tal:condition="not layout.isAnonymous()">
<ul class="nav navbar-nav navbar-right">
<li><a href="${request.application_url}"><span class="glyphicon glyphicon-home"></span>&nbsp;Accueil</a></li>
<li><a href="${request.application_url}/actifs"><span class="glyphicon glyphicon-list-alt"></span>&nbsp;Actifs</a></li>
${panel('dropdown_menu_panel')}
</ul>
</div>
</div>
</nav>
@@ -74,32 +70,32 @@
<br />
<div class="container">
<h1>${page_title}</h1>
<br />
<br />
<div id="messages" tal:attributes="class request.is_xhr and 'ajax-replace' or None">
<div tal:repeat="queue ('', 'info', 'success', 'warning', 'danger')"
tal:omit-tag="">
<div class="alert alert-${queue or 'info'}"
tal:define="messages request.session.pop_flash(queue)"
tal:condition="messages"
tal:repeat="message messages">
<button type="button" class="close" data-dismiss="alert">&times;</button>
${structure:message}
</div>
tal:omit-tag="">
<div class="alert alert-${queue or 'info'}"
tal:define="messages request.session.pop_flash(queue)"
tal:condition="messages"
tal:repeat="message messages">
<button type="button" class="close" data-dismiss="alert">&times;</button>
${structure:message}
</div>
</div>
</div>
<div metal:define-slot="content" />
<br />
<br />
<div metal:define-slot="content" />
<br />
<br />
</div>
<div id="footer">
<div class="well">
<p>© 2017&nbsp;-&nbsp;<a href="http://www.entreprise-dumas.com/" target="_blank">Entreprise Dumas</a></p>
<p>&copy; 2017&nbsp;-&nbsp;<a href="http://www.entreprise-dumas.com/" target="_blank">caotek.fr</a></p>
</div>
</div>
<div metal:define-slot="additional_scripts" />
</body>
</body>
</html>

View File

@@ -13,22 +13,32 @@
<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"
<input class="form-control" type="text" name="email"
value="${membre.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="intitule">Nom et prénom</label>
<label class="control-label col-xs-2" for="intitule">Nom</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="25"
data-fv-stringlength-message="25 caractères maximum" />
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="intitule">Prénom</label>
<div class="col-xs-5">
<input class="form-control" type="text" id="intitule" name="prenom" value="${membre.prenom}"
data-fv-notempty="true"
data-fv-notempty-message="Le prenom est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
@@ -44,7 +54,7 @@
<div class="form-group">
<label class="control-label col-xs-2">Dernière modif.</label>
<div class="col-xs-7">
<p class="form-control-static">${membre.modif_le.strftime('%d/%m/%Y - %H:%M')}</p>
<p class="form-control-static" tal:condition="membre.modif_le">${membre.modif_le.strftime('%d/%m/%Y - %H:%M')}</p>
</div>
</div>
<div class="form-group">

View File

@@ -4,8 +4,8 @@
<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>
<a href="${request.application_url}/user_edit/new" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouveau membre</a>
</p>
<table id="users_list" class="table table-striped table-bordered">

View File

@@ -9,6 +9,7 @@
<li class="divider"></li>
<li><a href="${request.application_url}/changer_mdp">Changer mon mot de passe</a></li>
<li tal:condition="layout.isAdmin()"><a href="${request.application_url}/users_list">Gestion des membres</a></li>
<li class="divider"></li>
<li><a href="${request.application_url}/logout">

View File

@@ -22,6 +22,9 @@ import hashlib
from sqlalchemy.exc import DBAPIError
from ..security import groupfinder
from ..models.members import (
get_member_by_email,
)
import json
@@ -50,9 +53,15 @@ def to_percent(x):
@view_config(route_name='home', renderer='../templates/home.pt', permission='view')
def home(request):
logged_in = authenticated_userid(request)
# lire la fiche du membre
membre = get_member_by_email(request, logged_in)
if not membre:
request.session.flash(u"Utilisateur non trouvé : %s" % logged_in, 'warning')
return HTTPFound(location=request.route_url('/home'))
return {
'page_title': 'Bienvenue',
'project': 'mondumas',
'page_title': u"%s %s" % (membre.prenom, membre.nom),
}

View File

@@ -170,7 +170,7 @@ def users_list(request):
expire_le = ''
d = (item.nom, item.email, item.acces, der_cnx_le, expire_le)
d = (item.nom + " " + item.prenom, item.email, item.acces, der_cnx_le, expire_le)
liste.append(d)
return {
@@ -197,15 +197,18 @@ def user_edit(request):
message = ''
acces_list = ["ADMIN", "MEMBRE"]
if email == '0':
if email == 'new':
# nouveau
membre = {}
membre['email'] = ''
membre['nom'] = ''
membre['prenom'] = ''
membre['acces'] = 'MEMBRE'
membre['modif_le'] = None
membre['expire_le'] = None
page_title= 'Nouveau membre'
else:
# lire la fiche de l'membre
# lire la fiche du membre
membre = get_member_by_email(request, email)
if not membre:
request.session.flash(u"Utilisateur non trouvé : %s" % email, 'warning')