ajout Dernières connexions pt

This commit is contained in:
2019-01-04 18:51:23 +01:00
parent 54fa91f288
commit 46c235cb2d
10 changed files with 89 additions and 65 deletions

View File

@@ -1,5 +1,6 @@
pyramid pyramid
pyramid_chameleon pyramid_chameleon
pyramid_mako==0.3.1
pyramid_debugtoolbar pyramid_debugtoolbar
pyramid_layout pyramid_layout
pyramid_mailer pyramid_mailer
@@ -11,6 +12,7 @@ waitress
mysqlclient mysqlclient
python-dateutil python-dateutil
docutils docutils
user-agents
[testing] [testing]
WebTest>=1.3.1 WebTest>=1.3.1

View File

@@ -50,10 +50,10 @@ def update_membre_mdp(request, login, password):
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}) execute_query(request, query, {'login': login, 'password': password})
def update_last_connection(request, login): def update_last_connection(request, login, ua_string):
"""Update last connection for 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(), ua_string=:ua_string WHERE cd_uti=:login;"
execute_query(request, query, {'login': login}) execute_query(request, query, {'login': login, 'ua_string': ua_string})
def update_membre(request, cd_uti, new_values): def update_membre(request, cd_uti, new_values):
# formater les champs # formater les champs

View File

@@ -26,3 +26,4 @@ def includeme(config):
config.add_route('orphans_de', '/orphans_de/{societe}') config.add_route('orphans_de', '/orphans_de/{societe}')
config.add_route('user_edit', '/user_edit/{cd_uti}') config.add_route('user_edit', '/user_edit/{cd_uti}')
config.add_route('users_list', '/users_list') config.add_route('users_list', '/users_list')
config.add_route('users_ua', '/users_ua')

View File

@@ -7,6 +7,10 @@
<a href="${request.application_url}/users_list"><span class="glyphicon glyphicon-user logo-primary"></span></a> <a href="${request.application_url}/users_list"><span class="glyphicon glyphicon-user logo-primary"></span></a>
<h4>UTILISATEURS</h4> <h4>UTILISATEURS</h4>
</div> </div>
<div class="col-sm-3">
<a href="${request.application_url}/users_ua"><span class="glyphicon glyphicon-log-in logo-primary"></span></a>
<h4>CONNEXIONS</h4>
</div>
<div class="col-sm-3"> <div class="col-sm-3">
<a href="${request.application_url}/dashboard"><span class="glyphicon glyphicon-dashboard logo-primary"></span></a> <a href="${request.application_url}/dashboard"><span class="glyphicon glyphicon-dashboard logo-primary"></span></a>
<h4>TABLEAU de BORD</h4> <h4>TABLEAU de BORD</h4>

View File

@@ -16,7 +16,6 @@
<th>Email</th> <th>Email</th>
<th>Agenda</th> <th>Agenda</th>
<th>Rôle</th> <th>Rôle</th>
<th>Dern cnx</th>
<th>Etat</th> <th>Etat</th>
</tr> </tr>
</thead> </thead>

View File

@@ -0,0 +1,46 @@
<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_ua" class="table table-striped table-bordered">
<thead>
<tr>
<th>Dern cnx</th>
<th>Login</th>
<th>Nom, Prénom</th>
<th>Appareil utilisé</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_ua').DataTable({
data: dataSet,
pageLength: 50,
bLengthChange: false,
language: {
url: 'https://cdn.datatables.net/plug-ins/1.10.16/i18n/French.json'
},
"order": [[ 0, "desc" ]]
});
});
</script>
</div><!-- content -->
</metal:block>

View File

@@ -20,6 +20,7 @@ from datetime import *
import hashlib import hashlib
from sqlalchemy.exc import DBAPIError from sqlalchemy.exc import DBAPIError
from ..security import groupfinder from ..security import groupfinder
from user_agents import parse
import json import json
@@ -181,10 +182,14 @@ def login(request):
if record : if record :
# mot de passe hash valide ? # mot de passe hash valide ?
if record.mdp == to_sha1(password): if record.mdp == to_sha1(password):
update_last_connection(request, login) # get user agent string from request
ua_string = request.user_agent
user_agent = parse(ua_string)
update_last_connection(request, login, str(user_agent))
# force le commit car il ne se fait pas automatiquement après l'update # force le commit car il ne se fait pas automatiquement après l'update
transaction.commit() transaction.commit()
headers = remember(request, login) headers = remember(request, login)
return HTTPFound(location=came_from, headers=headers) return HTTPFound(location=came_from, headers=headers)

View File

@@ -40,12 +40,7 @@ def users_list(request):
# construire la liste # construire la liste
liste=[] liste=[]
for item in items: 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: if item.actif == 0:
etat = 'Inactif' etat = 'Inactif'
else: else:
@@ -60,7 +55,7 @@ def users_list(request):
else: else:
role = 'Gestion' role = 'Gestion'
d = (item.CD_UTI, item.NOM, item.email, item.agenda, role, der_cnx_le, etat) d = (item.CD_UTI, item.NOM, item.email, item.agenda, role, etat)
liste.append(d) liste.append(d)
return { return {
@@ -68,6 +63,28 @@ def users_list(request):
'dt_data': json.dumps(liste), 'dt_data': json.dumps(liste),
} }
@view_config(route_name='users_ua', renderer='../templates/parametres/users_ua.pt', permission='manage')
def users_ua(request):
# lire les utilisateurs
items = get_member_by_id(request, '0')
# construire la liste
liste=[]
for item in items:
# utilisateur a au moins une connexion ?
if item.dern_cnx_le:
der_cnx_le = item.dern_cnx_le.strftime('%d/%m/%Y - %H:%M')
d = (der_cnx_le, item.CD_UTI, item.NOM, item.ua_string)
liste.append(d)
return {
'page_title': u'Liste des connexions',
'dt_data': json.dumps(liste),
}
@view_config(route_name='user_edit', renderer='../templates/parametres/user_edit.pt', permission='manage') @view_config(route_name='user_edit', renderer='../templates/parametres/user_edit.pt', permission='manage')
def user_edit(request): def user_edit(request):
cd_uti = request.matchdict['cd_uti'] cd_uti = request.matchdict['cd_uti']

View File

@@ -1,51 +0,0 @@
# uncomment the next import line to get print to show up or see early
# exceptions if there are errors then run
# python -m win32traceutil
# to see the output
#import win32traceutil
import win32serviceutil
PORT_TO_BIND = 9180
CONFIG_FILE = 'production.ini'
SERVER_NAME = 'gestion.entreprise-dumas.com'
SERVICE_NAME = "Pyramid_Service"
SERVICE_DISPLAY_NAME = "Pyramid Web Service"
SERVICE_DESCRIPTION = """Permet de laner l'application Pyramid comme un servcie."""
class PyWebService(win32serviceutil.ServiceFramework):
"""Python Web Service."""
_svc_name_ = SERVICE_NAME
_svc_display_name_ = SERVICE_DISPLAY_NAME
_svc_deps_ = None # sequence of service names on which this depends
# Only exists on Windows 2000 or later, ignored on Windows NT
_svc_description_ = SERVICE_DESCRIPTION
def SvcDoRun(self):
from cheroot import wsgi
from pyramid.paster import get_app
from pyramid.paster import setup_logging
import os, sys
path = os.path.dirname(os.path.abspath(__file__))
print(path)
os.chdir(path)
app = get_app(CONFIG_FILE)
setup_logging(CONFIG_FILE)
self.server = wsgi.Server(
('0.0.0.0', PORT_TO_BIND), app,
server_name=SERVER_NAME)
self.server.start()
def SvcStop(self):
self.server.stop()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(PyWebService)

View File

@@ -10,8 +10,8 @@ with open(os.path.join(here, 'CHANGES.txt')) as f:
requires = [ requires = [
'pyramid', 'pyramid',
# 'pyramid_jinja2',
'pyramid_chameleon', 'pyramid_chameleon',
'pyramid_mako==0.3.1', # bug dans pserve --reload
'pyramid_debugtoolbar', 'pyramid_debugtoolbar',
'pyramid_layout', 'pyramid_layout',
'pyramid_mailer', 'pyramid_mailer',
@@ -23,6 +23,7 @@ requires = [
'mysqlclient', 'mysqlclient',
'python-dateutil', 'python-dateutil',
'docutils', 'docutils',
'user-agents',
] ]
tests_require = [ tests_require = [