315 lines
12 KiB
Python
315 lines
12 KiB
Python
# -*- coding: utf8 -*-
|
|
from pyramid.response import Response
|
|
from pyramid.renderers import render, get_renderer
|
|
from pyramid.view import (
|
|
view_config,
|
|
forbidden_view_config,
|
|
)
|
|
from pyramid.security import (
|
|
remember,
|
|
forget,
|
|
)
|
|
from pyramid.httpexceptions import (
|
|
HTTPFound,
|
|
HTTPNotFound,
|
|
HTTPForbidden,
|
|
)
|
|
from pyramid_mailer import get_mailer
|
|
from pyramid_mailer.message import Message, Attachment
|
|
from datetime import *
|
|
|
|
from sqlalchemy.exc import DBAPIError
|
|
from ..security import groupfinder
|
|
|
|
import os
|
|
import uuid
|
|
import shutil
|
|
|
|
from ..views.default import *
|
|
from ..models.default import *
|
|
from ..models.dossier import *
|
|
|
|
@view_config(route_name='dossier_lookup', renderer='../templates/dossier/dossier_lookup.pt', permission='view')
|
|
@view_config(route_name='dossier_select', renderer='../templates/dossier/dossier_lookup.pt', permission='view')
|
|
def dossier_lookup(request):
|
|
|
|
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']
|
|
societe = 'PE'
|
|
liste=[]
|
|
name = u''
|
|
cb_tous = "non"
|
|
|
|
if 'form.submitted' in request.params:
|
|
name = request.params['name']
|
|
societe = request.params['societe']
|
|
# si afficher tous les fiches ?
|
|
if 'cb_tous' in request.params:
|
|
cb_tous = "oui"
|
|
chantiers = get_chantiers_byName(request, societe, name, True)
|
|
else:
|
|
cb_tous = "non"
|
|
chantiers = get_chantiers_byName(request, societe, name, False)
|
|
if len(chantiers) == 0:
|
|
message = u"Chantier non trouvé : %s" % name
|
|
# construire la liste
|
|
for item in chantiers:
|
|
d = ('%s-%s' % (societe, item.numero),item.date.strftime('%d-%m-%Y'), item.nomcli, item.chantier, to_euro(item.montant),
|
|
item.nosin, item.status)
|
|
liste.append(d)
|
|
|
|
return {
|
|
'page_title': u"Rechercher un chantier",
|
|
'url': url,
|
|
'goto_url': goto_url,
|
|
'message': message,
|
|
'dt_data': json.dumps(liste),
|
|
'societes': societes,
|
|
'societe': societe,
|
|
'name': name,
|
|
'cb_tous': cb_tous,
|
|
}
|
|
|
|
@view_config(route_name='dossier_view', renderer='../templates/dossier/dossier_view.pt', permission='view')
|
|
def dossier_view(request):
|
|
nodossier = request.matchdict['nodossier']
|
|
societe = nodossier[0:2]
|
|
|
|
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("dossier_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)
|
|
# lire toutes les dossiers similaires
|
|
similaires = get_similaires_byChantier(request, dossier.societe, dossier.C_NOM, dossier.C_ADR, dossier.C_CP, dossier.C_VILLE)
|
|
# lire tous les documents attachés
|
|
docs_attaches = get_docs_attaches(request, 'DOCS_ATTACHES', nodossier)
|
|
# select background color according to society
|
|
bg_color = "bg-%s" % societe
|
|
|
|
return {
|
|
'page_title': u"Dossier : %s" % (nodossier),
|
|
'nodossier': nodossier,
|
|
'dossier': dossier,
|
|
'details': details,
|
|
'documents': documents,
|
|
'similaires': similaires,
|
|
'docs_attaches': docs_attaches,
|
|
'docs_url': request.static_url(request.registry.settings['mondumas.devfac_url']),
|
|
'bg_color': bg_color,
|
|
}
|
|
|
|
@view_config(route_name='devis_view', renderer='../templates/dossier/devis_view.pt', permission='view')
|
|
def devis_view(request):
|
|
nodossier = request.matchdict['nodossier']
|
|
societe = nodossier[0:2]
|
|
url = request.route_url("devis_view", nodossier=nodossier)
|
|
|
|
type_doc = nodossier[3:5]
|
|
if type_doc == 'DE':
|
|
page_title = u"Devis no : %s" % (nodossier)
|
|
elif type_doc == 'FA':
|
|
page_title = u"Facture no : %s" % (nodossier)
|
|
else:
|
|
page_title = u"Proforma no : %s" % (nodossier)
|
|
|
|
dossier = get_devis_by_no(request, nodossier)
|
|
if dossier is None:
|
|
request.session.flash(u"Le document no %s est introuvable" % (nodossier), 'danger')
|
|
return HTTPFound(location=request.route_url("dossier_lookup"))
|
|
# lire tous les lignes du devis
|
|
details = get_devis_lig_by_no(request, nodossier)
|
|
# select background color according to society
|
|
bg_color = "bg-%s" % societe
|
|
|
|
return {
|
|
'page_title': page_title,
|
|
'nodossier': nodossier,
|
|
'dossier': dossier,
|
|
'details': details,
|
|
'bg_color': bg_color,
|
|
}
|
|
|
|
@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'] = '%s %s' % (dossier.C_QUALITE, 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/dossier/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['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,
|
|
'logged_in': logged_in,
|
|
'url': url,
|
|
'nodossier': nodossier,
|
|
'nolig': nolig,
|
|
'suivi': suivi,
|
|
'message': message,
|
|
}
|
|
|
|
@view_config(route_name='dossier_edit', renderer='../templates/dossier/dossier_edit.pt', permission='view')
|
|
def dossier_edit(request):
|
|
logged_in = request.authenticated_userid
|
|
nodossier = request.matchdict['nodossier']
|
|
url = request.route_url('dossier_edit', nodossier=nodossier)
|
|
|
|
dossier = get_dossier_by_no(request, nodossier)
|
|
if not dossier:
|
|
request.session.flash(u"Le dossier no %s est introuvable" % (nodossier), 'danger')
|
|
return HTTPFound(location=request.route_url('dossier_lookup'))
|
|
|
|
if 'form.submitted' in request.params:
|
|
new_values = {}
|
|
for param, db_value in dossier.items():
|
|
if param in request.params and request.params[param] != db_value:
|
|
new_values[param] = request.params[param]
|
|
|
|
if new_values:
|
|
update_dossier(request, nodossier, new_values)
|
|
request.session.flash(u"Le dossier a été mis à jour avec succès.", 'success')
|
|
return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier))
|
|
|
|
return {
|
|
'page_title': u"Modifier le dossier : %s" % nodossier,
|
|
'url': url,
|
|
'dossier': dossier,
|
|
'nodossier': nodossier,
|
|
}
|
|
|
|
@view_config(route_name='upload_doc', renderer='../templates/dossier/upload_doc.pt', permission='view')
|
|
def upload_doc(request):
|
|
logged_in = request.authenticated_userid
|
|
nodossier = request.matchdict['nodossier']
|
|
societe = nodossier[0:2]
|
|
nochantier = nodossier[3:]
|
|
|
|
url = request.route_url("upload_doc", nodossier=nodossier)
|
|
message = ""
|
|
|
|
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("dossier_lookup"))
|
|
|
|
# lire tous les documents attachés
|
|
docs_attaches = get_docs_attaches(request, 'DOCS_ATTACHES', nodossier)
|
|
|
|
if 'form.submitted' in request.params:
|
|
# récupère le fichier lui-même
|
|
input_file = request.POST['filename'].file
|
|
# récupère son nom
|
|
input_name = request.POST['filename'].filename
|
|
# récupère son extension
|
|
input_ext = input_name.split('.')[-1]
|
|
|
|
# controler l'extension
|
|
ext_allowed = ['jpeg','jpg','png','pdf']
|
|
if input_ext.lower() not in ext_allowed :
|
|
request.session.flash("Le format de ce fichier n'est pas valide. Téléchargement impossible.", 'warning')
|
|
else:
|
|
# récupère le nom du fichier et ajouter le no de dossier
|
|
filename = '%s-DD%s-%s' % (societe, nochantier, request.POST['filename'].filename)
|
|
|
|
file_path = os.path.join('%s/%s' % (request.registry.settings['mondumas.devfac_dir'],societe), filename)
|
|
# We first write to a temporary file to prevent incomplete files
|
|
temp_file_path = file_path + '~'
|
|
|
|
# Finally write the data to a temporary file
|
|
input_file.seek(0)
|
|
with open(temp_file_path, 'wb') as output_file:
|
|
shutil.copyfileobj(input_file, output_file)
|
|
|
|
# controler la taille du fichier < 4 Mo
|
|
filesize = round(os.path.getsize(temp_file_path) / 1024)
|
|
if filesize > 4096 :
|
|
os.remove(temp_file_path)
|
|
request.session.flash("La taille de ce fichier dépasse la limite autorisée. Téléchargement impossible.", 'warning')
|
|
else:
|
|
# Now that we know the file has been fully saved to disk move it into place.
|
|
os.rename(temp_file_path, file_path)
|
|
|
|
insert_dossier_attaches(request, nodossier, filename, '%s Ko' % str(filesize), logged_in.upper())
|
|
request.session.flash('%s : Ce fichier est téléchargé avec succès.' % input_name, 'success')
|
|
|
|
return {
|
|
'page_title': u"Télécharger un document",
|
|
'url': url,
|
|
'nodossier': nodossier,
|
|
'dossier': dossier,
|
|
'docs_attaches': docs_attaches,
|
|
'docs_url': request.static_url(request.registry.settings['mondumas.devfac_url']),
|
|
}
|
|
|