menu principal
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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 |
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
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> Accueil</a></li>
|
||||
<!--
|
||||
<li tal:condition="python: layout.isAdmin()">
|
||||
<a href="${request.application_url}/gestionnaire"><span class="glyphicon glyphicon-eye-open"></span> 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>
|
||||
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> Accueil</a></li>
|
||||
<li><a href="${request.application_url}/actifs"><span class="glyphicon glyphicon-list-alt"></span> 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">×</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">×</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 - <a href="http://www.entreprise-dumas.com/" target="_blank">Entreprise Dumas</a></p>
|
||||
<p>© 2017 - <a href="http://www.entreprise-dumas.com/" target="_blank">caotek.fr</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div metal:define-slot="additional_scripts" />
|
||||
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user