diff --git a/mondumas/models/agenda.py b/mondumas/models/agenda.py index 4341cf4..c61c4fc 100644 --- a/mondumas/models/agenda.py +++ b/mondumas/models/agenda.py @@ -26,39 +26,6 @@ def get_users_agenda(request): results = request.dbsession.execute(query).fetchall() return results -def get_dossier_by_no(request,nodossier): - societe = nodossier[0:2] - no_id = nodossier[3:] - query = """ -SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM dem_devis d -INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli -INNER JOIN p_cabinet a ON d.cabinet = a.code -INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp -where d.societe = '%s' and d.no_id=%s;""" % (societe, no_id); - results = request.dbsession.execute(query).first() - return results - -def get_dossier_rdv_by_no(request,nodossier, nolig): - societe = nodossier[0:2] - no_id = nodossier[3:] - - if nolig == '0': - query = "SELECT * FROM dem_lig where societe = '%s' and no_id=%s;" % (societe, no_id) - results = request.dbsession.execute(query).fetchall() - else: - query = "SELECT * FROM dem_lig where societe = '%s' and no_id=%s and nolig=%s;" % (societe, no_id, nolig) - results = request.dbsession.execute(query).first() - - return results - -def get_documents_byChantier(request,nodossier): - societe = nodossier[0:2] - no_id = nodossier[3:] - - query = "CALL spGET_DOSSIERS_byNumeo('%s',%s);" % (societe, no_id) - results = request.dbsession.execute(query).fetchall() - return results - def get_rendez_vous(request, itc): d = datetime.now() d = d - dateutil.relativedelta.relativedelta(months=3) @@ -66,7 +33,7 @@ def get_rendez_vous(request, itc): datedeb = d.strftime('%Y-%m-01') # lire les rdv de l'ITC - query = """SELECT CONCAT(l.societe,"-",l.no_id) as nodossier, l.rdv_debut, l.rdv_fin, e.c_nom, e.c_ville FROM dem_lig l + query = """SELECT CONCAT(l.societe,"-",l.no_id) as nodossier, l.nolig, l.rdv_debut, l.rdv_fin, e.c_nom, e.c_ville FROM dem_lig l INNER JOIN dem_devis e ON l.societe=e.societe AND l.no_id=e.no_id WHERE l.datevi >= :datedeb AND l.liste=:itc ORDER BY l.datevi, l.heurevi """ @@ -80,20 +47,27 @@ def delete_rdv(request, nodossier, nolig): query = "DELETE FROM dem_lig where societe = '%s' and no_id=%s and nolig=%s;" % (societe, no_id, nolig) execute_query(request, query, {}) -def update_rdv(request, nodossier, nolig, comment, commentvi, date_rdv): +def update_rdv(request, nodossier, nolig, new_values): societe = nodossier[0:2] no_id = nodossier[3:] - # formater les champs - ddate = datetime.strptime(date_rdv, '%d-%m-%Y %H:%M') - datevi = ddate.strftime("%Y-%m-%d") - heurevi = date_rdv[-5:] - auj = date.today().strftime("%Y-%m-%d") + # formater date et heure de visite + if new_values['rdv_debut']: + ddate = datetime.strptime(new_values['rdv_debut'], '%d-%m-%Y %H:%M') + new_values['DATEVI'] = ddate.strftime("%Y-%m-%d") + new_values['HEUREVI'] = ddate.strftime("%H:%M") - if nolig == '0': - query = "INSERT INTO dem_devis SET societe='%s',no_id=%s,date='%s',datevi='%s',heurevi='%s',comment='%s',commentvi='%s'" % (societe, no_id,auj,datevi, heurevi, comment, commentvi) - else: - query = "UPDATE dem_ligs SET datevi='%s', heurevi='%s', comment='%s', commentvi='%s' where societe = '%s' and no_id=%s and nolig=%s;" % (datevi, heurevi, comment, commentvi, societe, no_id, nolig) + del new_values['rdv_debut'] + s = '' + for param in new_values.keys(): + if s: + s += ",%s=:%s" % (param, param) + else: + s = "%s=:%s" % (param, param) - execute_query(request, query, {}) + new_values['societe'] = societe + new_values['no_id'] = no_id + new_values['nolig'] = nolig + query = "UPDATE dem_lig SET %s WHERE societe = :societe AND NO_ID = :no_id AND NOLIG = :nolig ;" % s + execute_query(request, query, new_values) diff --git a/mondumas/models/default.py b/mondumas/models/default.py index 32c02da..8586ff1 100644 --- a/mondumas/models/default.py +++ b/mondumas/models/default.py @@ -87,3 +87,57 @@ def get_chantiers_byName(request, societe, name, tous): results = request.dbsession.execute(query).fetchall() return results +def get_dossier_by_no(request,nodossier): + societe = nodossier[0:2] + no_id = nodossier[3:] + query = """ +SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM dem_devis d +INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli +INNER JOIN p_cabinet a ON d.cabinet = a.code +INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp +where d.societe = '%s' and d.no_id=%s;""" % (societe, no_id); + results = request.dbsession.execute(query).first() + return results + +def get_dossier_rdv_by_no(request,nodossier, nolig): + societe = nodossier[0:2] + no_id = nodossier[3:] + + if nolig == '0': + query = "SELECT * FROM dem_lig where societe = '%s' and no_id=%s;" % (societe, no_id) + results = request.dbsession.execute(query).fetchall() + else: + query = "SELECT * FROM dem_lig where societe = '%s' and no_id=%s and nolig=%s;" % (societe, no_id, nolig) + results = request.dbsession.execute(query).first() + + return results + +def get_documents_byChantier(request,nodossier): + societe = nodossier[0:2] + no_id = nodossier[3:] + + query = "CALL spGET_DOSSIERS_byNumeo('%s',%s);" % (societe, no_id) + results = request.dbsession.execute(query).fetchall() + return results + +def update_suivi(request, nodossier, nolig, new_values): + societe = nodossier[0:2] + no_id = nodossier[3:] + + new_values['societe'] = societe + new_values['NO_ID'] = no_id + s = '' + for param in new_values.keys(): + if s: + s += ",%s=:%s" % (param, param) + else: + s = "%s=:%s" % (param, param) + + if nolig == '0': + query = "INSERT INTO dem_lig SET %s" % s + else: + new_values['nolig'] = nolig + query = "UPDATE dem_lig SET %s WHERE societe = :societe AND NO_ID = :no_id AND NOLIG = :nolig ;" % s + + execute_query(request, query, new_values) + diff --git a/mondumas/routes.py b/mondumas/routes.py index d762dea..6791447 100644 --- a/mondumas/routes.py +++ b/mondumas/routes.py @@ -1,16 +1,21 @@ def includeme(config): config.add_static_view('static', 'static', cache_max_age=3600) - config.add_route('home', '/') - config.add_route('agenda', '/agenda') - config.add_route('planning', '/planning') - config.add_route('chantier_lookup', '/chantier_lookup') - config.add_route('changer_mdp', '/changer_mdp') - config.add_route('dossier_view', '/dossier_view/{nodossier}') + # agenda + config.add_route('agenda', '/agenda/{date}') + config.add_route('planning', '/planning/{date}') config.add_route('rdv_edit','/rdv_edit/{nodossier}/{nolig}') + # default + config.add_route('home', '/') + config.add_route('changer_mdp', '/changer_mdp') + config.add_route('dossier_lookup', '/chantier_lookup') + config.add_route('dossier_select', '/dossier_select/{date}') + config.add_route('dossier_selected', '/dossier_selected/{goto}/{date}/{nodossier}') + config.add_route('dossier_view', '/dossier_view/{nodossier}') config.add_route('envoyer_mdp', '/envoyer_mdp') config.add_route('login', '/login') config.add_route('logout', '/logout') config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}') + config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}') # parametres config.add_route('parametres', '/parametres') config.add_route('dashboard', '/dashboard') diff --git a/mondumas/templates/agenda/agenda.pt b/mondumas/templates/agenda/agenda.pt index ff577bc..fd2216c 100644 --- a/mondumas/templates/agenda/agenda.pt +++ b/mondumas/templates/agenda/agenda.pt @@ -1,14 +1,12 @@
-
+
-
-
-
- +
+ +
+ +
+
-

- RDV Peinture  - RDV Menuiserie  - RDV Plomberie  - RDV Plomberie  -

+
+ +
+ + +
+
- -
-
+
+


+

+ RDV Peinture  + RDV Menuiserie  + RDV Plomberie  + RDV Plomberie  +


- +
diff --git a/mondumas/templates/agenda/planning.pt b/mondumas/templates/agenda/planning.pt index d86b583..ac06b0b 100644 --- a/mondumas/templates/agenda/planning.pt +++ b/mondumas/templates/agenda/planning.pt @@ -1,38 +1,29 @@
-
+
-
-
- -
-

- RDV Peinture  - RDV Menuiserie  - RDV Plomberie  - RDV Plomberie  -

-
-
-
-


+

+ RDV Peinture  + RDV Menuiserie  + RDV Plomberie  + RDV Plomberie  +


- +
+
+ + +
+
diff --git a/mondumas/templates/security.py b/mondumas/templates/security.py deleted file mode 100644 index c27e419..0000000 --- a/mondumas/templates/security.py +++ /dev/null @@ -1,11 +0,0 @@ -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) diff --git a/mondumas/views/agenda.py b/mondumas/views/agenda.py index 99415f9..f77ea65 100644 --- a/mondumas/views/agenda.py +++ b/mondumas/views/agenda.py @@ -26,79 +26,69 @@ from ..models.default import * @view_config(route_name='rdv_edit', renderer='../templates/agenda/rdv_edit.pt', permission='view') def rdv_edit(request): + + logged_in = request.authenticated_userid nodossier = request.matchdict['nodossier'] nolig = request.matchdict['nolig'] url = request.route_url("rdv_edit", nodossier=nodossier, nolig=nolig) message = '' - if nolig == '0': - # nouveau - comment = '' - commentvi = '' - date_rdv = datetime.now() - page_title= 'Nouveau rendez-vous' - else: - # lire le rendez-vous - rdv = get_dossier_rdv_by_no(request, nodossier, nolig) - if not rdv: - request.session.flash(u"Rendez-vous non trouvé : %s" % nodossier, 'warning') - return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier)) + # lire le rendez-vous + rdv = get_dossier_rdv_by_no(request, nodossier, nolig) + if not rdv: + request.session.flash(u"Rendez-vous non trouvé : %s" % nodossier, 'warning') + return HTTPFound(location=request.route_url('agenda', date='today')) - comment = rdv.COMMENT - commentvi = rdv.COMMENTVI - date_rdv = rdv.rdv_debut - page_title= u"Modification du rdv du %s" % (rdv.rdv_debut.strftime('%d-%m-%Y %H:%M')) + page_title= u"Modification du rdv du %s" % (rdv.rdv_debut.strftime('%d-%m-%Y %H:%M')) if 'form.submitted' in request.params: - comment = request.params['comment'] - commentvi = request.params['commentvi'] - date_rdv = request.params['date_rdv'] + new_values = {} + for param, db_value in rdv.items(): + if param in request.params and request.params[param] != db_value: + new_values[param] = request.params[param] - update_rdv(request, nodossier, nolig, comment, commentvi, date_rdv) - request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success') - return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier)) + if new_values: + new_values['USERMAJ'] = logged_in.upper() + + update_rdv(request, nodossier, nolig, new_values) + request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success') + + return HTTPFound(location=request.route_url('agenda', date=rdv.rdv_debut.strftime('%Y-%m-%d'))) if 'form.deleted' in request.params: delete_rdv(request, nodossier, nolig) request.session.flash(u"Le rendez-vous a été supprimé avec succès.", 'success') - return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier)) + return HTTPFound(location=request.route_url('agenda', date=rdv.rdv_debut.strftime('%Y-%m-%d'))) return { 'page_title': page_title, 'url': url, 'nodossier': nodossier, 'nolig': nolig, - 'comment': comment, - 'commentvi': commentvi, - 'date_rdv': date_rdv, + 'rdv': rdv, 'message': message, } -@view_config(route_name='dossier_view', renderer='../templates/agenda/dossier_view.pt', permission='view') -def dossier_view(request): - nodossier = request.matchdict['nodossier'] - url = request.route_url("dossier_view", nodossier=nodossier) - - dossier = get_dossier_by_no(request, nodossier) - if dossier is None: - request.session.flash(u"Le dossier no %s est introuvable" % (nodossier), 'danger') - return HTTPFound(location=request.route_url("chantier_lookup")) - # lire tous le suivi du dossier - details = get_dossier_rdv_by_no(request, nodossier, '0') - # lire toutes les dossiers du chantiers - documents = get_documents_byChantier(request, nodossier) - return { - 'page_title': u"Dossier : %s" % (nodossier), - 'nodossier': nodossier, - 'dossier': dossier, - 'details': details, - 'documents': documents, - } - - @view_config(route_name='agenda', renderer='../templates/agenda/agenda.pt', permission='view') def agenda(request): + + message = '' + # récupérer les paramètres de l'appel de la view + datePlan = request.matchdict['date'] logged_in = request.authenticated_userid + + if datePlan == 'today': + datePlan = date.today().strftime('%Y-%m-%d') + url = request.route_url('planning', date=datePlan) + url_select = request.route_url('dossier_select', date=datePlan) + + # recall code et nom élève + if 'mem_nodossier' in request.session: + mem_nodossier = request.session['mem_nodossier'] + mem_nomdossier = request.session['mem_nomdossier'] + else: + mem_nodossier = 'Aucun' + mem_nomdossier = u'dossier sélectionné' # liste des users avec agenda agendas = get_users_agenda(request) @@ -132,12 +122,13 @@ def agenda(request): json_event = { 'title': row.c_nom, + 'description': row.c_ville.capitalize(), 'start': row.rdv_debut.strftime('%Y-%m-%d %H:%M:%S'), 'end': row.rdv_fin.strftime('%Y-%m-%d %H:%M:%S'), 'allDay': False, 'color': color, 'textColor': 'Black', - 'url': 'dossier_view/%s' % (row.nodossier), + 'url': '/rdv_edit/%s/%s' % (row.nodossier, row.nolig), } events.append(json_event) @@ -147,12 +138,15 @@ def agenda(request): 'fullcalendar_events': json.dumps(events), 'agendas': agendas, 'agenda': agenda, + 'message': message, + 'mem_nodossier': mem_nodossier, + 'mem_nomdossier': mem_nomdossier, + 'url_select': url_select, } @view_config(route_name='planning', renderer='../templates/agenda/planning.pt', permission='view') def planning(request): - logged_in = request.authenticated_userid - + # construire la liste des ressources # {"id":"a","title":"Auditorium A"} ressources = [] @@ -169,10 +163,7 @@ def planning(request): events = [] for user in users: rows = get_rendez_vous(request, user.CD_UTI) - for row in rows: - event_url = 'dossier_view/%s' % (row.nodossier) - event_title = row.c_nom - + for row in rows: # déterminer la couleur de l'event selon la societe societe = row.nodossier[0:2] if societe == "PE": @@ -186,14 +177,14 @@ def planning(request): json_event = { 'resourceId': user.CD_UTI, - 'title': event_title, + 'title': row.c_nom, 'description': row.c_ville.capitalize(), 'start': row.rdv_debut.strftime('%Y-%m-%d %H:%M:%S'), 'end': row.rdv_fin.strftime('%Y-%m-%d %H:%M:%S'), 'allDay': False, 'color': color, 'textColor': 'Black', - 'url': event_url, + 'url': '/dossier_view/%s' % (row.nodossier), } events.append(json_event) diff --git a/mondumas/views/default.py b/mondumas/views/default.py index 5d97fef..d00fb95 100644 --- a/mondumas/views/default.py +++ b/mondumas/views/default.py @@ -25,6 +25,7 @@ from ..security import groupfinder import json from ..models.default import * +from ..models.agenda import * def to_decimal(x): import decimal @@ -52,14 +53,14 @@ def to_percent(x): return (u"%.2f " % x).replace('.', ',') + "%" -@view_config(route_name='home', renderer='../templates/home.pt', permission='view') +@view_config(route_name='home', renderer='../templates/default/home.pt', permission='view') def home(request): return { 'page_title': 'Bienvenue', 'project': 'mondumas', } -@view_config(route_name='envoyer_mdp', renderer='../templates/envoyer_mdp.pt') +@view_config(route_name='envoyer_mdp', renderer='../templates/default/envoyer_mdp.pt') def envoyer_mdp(request): url = request.route_url('envoyer_mdp') message = u'' @@ -92,7 +93,7 @@ Le lien suivant vous dirigera vers une page où vous pourrez ré-initialiser vot 'message': message, } -@view_config(route_name='changer_mdp', renderer='../templates/changer_mdp.pt', permission='view') +@view_config(route_name='changer_mdp', renderer='../templates/default/changer_mdp.pt', permission='view') def changer_mdp(request): url = request.route_url('changer_mdp') logged_in = request.authenticated_userid @@ -117,7 +118,7 @@ def changer_mdp(request): 'message': message, } -@view_config(route_name='redefinir_mdp', renderer='../templates/redefinir_mdp.pt') +@view_config(route_name='redefinir_mdp', renderer='../templates/default/redefinir_mdp.pt') def redefinir_mdp(request): lien = request.matchdict["lien"] url = request.route_url('redefinir_mdp', lien=lien) @@ -144,7 +145,7 @@ def redefinir_mdp(request): } -@view_config(route_name='login', renderer='../templates/login.pt', permission='view') +@view_config(route_name='login', renderer='../templates/default/login.pt', permission='view') @forbidden_view_config(renderer='../templates/login.pt') def login(request): @@ -213,11 +214,20 @@ gestion.entreprise-dumas.com mailer.send_immediately(message) -@view_config(route_name='chantier_lookup', renderer='../templates/chantier_lookup.pt', permission='view') -def chantier_lookup(request): +@view_config(route_name='dossier_lookup', renderer='../templates/default/dossier_lookup.pt', permission='view') +@view_config(route_name='dossier_select', renderer='../templates/default/dossier_lookup.pt', permission='view') +def dossier_lookup(request): - # recherche chantier - url = request.route_url('chantier_lookup') + if 'dossier_select' in request.current_route_path() : + # récupérer les paramètres de l'appel de la view + datePlan = request.matchdict['date'] + # sélectionner dossier -> goto planning + goto_url = '/dossier_selected/agenda/%s/' % datePlan + url = request.route_url('dossier_select', date=datePlan) + else: + # recherche dossier -> goto fiche dossier + goto_url = '/dossier_selected/dossier_view/%s/' % date.today().strftime('%Y-%m-%d') + url = request.route_url('dossier_lookup') message = u'' societes = ['PE','ME','PL','PO','CD'] @@ -225,6 +235,7 @@ def chantier_lookup(request): liste=[] name = u'' cb_tous = "non" + if 'form.submitted' in request.params: name = request.params['name'] societe = request.params['societe'] @@ -246,6 +257,7 @@ def chantier_lookup(request): return { 'page_title': u"Rechercher un chantier", 'url': url, + 'goto_url': goto_url, 'message': message, 'dt_data': json.dumps(liste), 'societes': societes, @@ -253,3 +265,97 @@ def chantier_lookup(request): 'name': name, 'cb_tous': cb_tous, } + +@view_config(route_name='dossier_view', renderer='../templates/default/dossier_view.pt', permission='view') +def dossier_view(request): + nodossier = request.matchdict['nodossier'] + url = request.route_url("dossier_view", nodossier=nodossier) + + dossier = get_dossier_by_no(request, nodossier) + if dossier is None: + request.session.flash(u"Le dossier no %s est introuvable" % (nodossier), 'danger') + return HTTPFound(location=request.route_url("chantier_lookup")) + # lire tous le suivi du dossier + details = get_dossier_rdv_by_no(request, nodossier, '0') + # lire toutes les dossiers du chantiers + documents = get_documents_byChantier(request, nodossier) + return { + 'page_title': u"Dossier : %s" % (nodossier), + 'nodossier': nodossier, + 'dossier': dossier, + 'details': details, + 'documents': documents, + } + +@view_config(route_name='dossier_selected', permission='view') +def dossier_selected(request): + + # récupérer les paramètres de l'appel de la view + goto = request.matchdict['goto'] + datePlan = request.matchdict['date'] + nodossier = request.matchdict['nodossier'] + + # fiche dossier + dossier = get_dossier_by_no(request, nodossier) + # memorize nodossier et nom dossier + request.session['mem_nodossier'] = nodossier + request.session['mem_nomdossier'] = dossier.C_NOM + if goto == 'dossier_view': + return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier)) + else: + return HTTPFound(location=request.route_url('agenda', date=datePlan)) + +@view_config(route_name='suivi_edit', renderer='../templates/default/suivi_edit.pt', permission='view') +def suivi_edit(request): + + logged_in = request.authenticated_userid + nodossier = request.matchdict['nodossier'] + nolig = request.matchdict['nolig'] + url = request.route_url("suivi_edit", nodossier=nodossier, nolig=nolig) + + message = '' + if nolig == '0': + # nouveau + suivi = {} + suivi['COMMENT'] = '' + suivi['COMMENTVI'] = '' + suivi['USERMAJ'] = logged_in.upper() + suivi['DATEMAJ'] = datetime.now() + page_title= 'Nouveau suivi' + else: + # lire le suivi + suivi = get_dossier_rdv_by_no(request, nodossier, nolig) + if not suivi: + request.session.flash(u"Suivi non trouvé : %s" % nodossier, 'warning') + return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier)) + + page_title= u"Modification du suivi %s" % (nolig) + + if 'form.submitted' in request.params: + new_values = {} + for param, db_value in suivi.items(): + if param in request.params and request.params[param] != db_value: + new_values[param] = request.params[param] + + if new_values: + new_values['USERMAJ'] = logged_in.upper() + new_values['DATE'] = date.today() + + update_suivi(request, nodossier, nolig, new_values) + request.session.flash(u"Le suivi a été mis à jour avec succès.", 'success') + + return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier)) + + if 'form.deleted' in request.params: + delete_rdv(request, nodossier, nolig) + request.session.flash(u"Le suivi a été supprimé avec succès.", 'success') + return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier)) + + return { + 'page_title': page_title, + 'url': url, + 'nodossier': nodossier, + 'nolig': nolig, + 'suivi': suivi, + 'message': message, + } diff --git a/mondumas/views/notfound.py b/mondumas/views/notfound.py index c1225f1..3a50f21 100644 --- a/mondumas/views/notfound.py +++ b/mondumas/views/notfound.py @@ -1,7 +1,7 @@ # -*- coding: utf8 -*- from pyramid.view import notfound_view_config -@notfound_view_config(renderer='../templates/404.pt') +@notfound_view_config(renderer='../templates/default/404.pt') def notfound_view(request): request.response.status = 404 return {