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')

112
db_mesavoirs.sql Normal file
View File

@@ -0,0 +1,112 @@
-- MySQL dump 10.13 Distrib 5.7.17, for Win64 (x86_64)
--
-- Host: localhost Database: bd_mesavoirs
-- ------------------------------------------------------
-- Server version 5.7.19-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `members`
--
DROP TABLE IF EXISTS `members`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `members` (
`email` varchar(55) NOT NULL,
`nom` varchar(45) DEFAULT 'UTILISATEUR 000',
`prenom` varchar(45) DEFAULT NULL,
`mdp` varchar(128) DEFAULT NULL,
`mdp_oublie` varchar(128) DEFAULT NULL,
`mdp_oublie_date` datetime DEFAULT NULL,
`acces` varchar(25) DEFAULT 'MEMBRE',
`expire_le` datetime DEFAULT NULL,
`cree_le` datetime DEFAULT NULL,
`modif_le` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`dern_cnx_le` datetime DEFAULT NULL,
PRIMARY KEY (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Liste des Membres';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `members`
--
LOCK TABLES `members` WRITE;
/*!40000 ALTER TABLE `members` DISABLE KEYS */;
INSERT INTO `members` VALUES ('ctphuoc@gmail.com','CAO ','Thien phuoc','a12ecaa430207687ad18a72564609d4f313184bd',NULL,NULL,'ADMIN',NULL,NULL,'2017-07-22 16:32:11','2017-07-22 16:41:34'),('toa.armorial@gmail.com','CAO ','Thien-an',NULL,NULL,NULL,'ADMIN',NULL,'2017-07-22 17:18:51','2017-07-22 16:32:11',NULL);
/*!40000 ALTER TABLE `members` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`127.0.0.1`*/ /*!50003 TRIGGER `bd_mesavoirs`.`members_BEFORE_INSERT` BEFORE INSERT ON `members` FOR EACH ROW
BEGIN
set NEW.cree_le = NOW();
set NEW.modif_le = NOW();
SET NEW.nom = UCASE(NEW.nom);
SET NEW.prenom = CONCAT( UCASE(LEFT(NEW.prenom,1)), LCASE(SUBSTRING(NEW.prenom,2)));
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `bd_mesavoirs`.`members_BEFORE_UPDATE` BEFORE UPDATE ON `members` FOR EACH ROW
BEGIN
SET NEW.nom = UCASE(NEW.nom);
SET NEW.prenom = CONCAT( UCASE(LEFT(NEW.prenom,1)), LCASE(SUBSTRING(NEW.prenom,2)));
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Dumping events for database 'bd_mesavoirs'
--
--
-- Dumping routines for database 'bd_mesavoirs'
--
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2017-07-22 18:35:29