ajout filtre json ; systeme de template dans .py a part
[restcoda.git] / document.py
CommitLineData
30e64411
TN
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
10a46ce2
TN
4#
5# Classes pour les documents DEM-* et COM-*
6#
ef44a84b 7# Ces documents ont tous les même format. On créé donc une classe "Document"
10a46ce2
TN
8# générique, qui sera hérité. Chaque classe fille précisera le code du document.
9#
10
65f02320 11from objet import Objet, ObjetInconnu
ef44a84b 12from utils import dict_fetchone, coda2rest
f60ed9f0
TN
13# pour l'annee du budget
14from datetime import datetime
30e64411 15
65f02320 16class Document(Objet):
30e64411
TN
17 """objet document CODA (demlog, comlog, demdep... ils ont tous le même format)"""
18 accept_like_filters = [ 'code', 'demandeur', 'approbateur', 'code_service', 'statut', 'fournisseur', 'statut' ]
19 def __init__(self, environ, code_document='%', prefix_template='document'):
ef44a84b 20 super(Document, self).__init__(environ)
30e64411
TN
21 self.code_document = code_document
22 self.prefix_template = prefix_template
b417907c
TN
23 # filtrage : si aucun statut n'est spécifié, on prend "statut like non%"
24 if self.sqlwhere != '': self.sqlwhere = ' and ' + self.sqlwhere
30e64411
TN
25
26 def _get_index(self, code):
27 """renvoie une liste de documents"""
28 # connexion a la base de données
29 cursor = self.cursor()
30 # extraction des données
65f02320
TN
31 # statut par defaut : non-autorisé
32 if not 'statut' in self.filters:
774afbd9 33 self.sqlwhere = " and (statut = 'non-autorise') " + self.sqlwhere
924e2f0a 34 self.filters['status'] = ['non-autorise']
6264cb94
TN
35 request = "select top %d * from auf_v_acces_demcom where (code like '%s') %s order by date_modif desc" % ( self.sqllimit, code, self.sqlwhere )
36 cursor.execute( request )
30e64411
TN
37 items = []
38 while 1:
39 item = dict_fetchone( cursor )
40 if item == None: break
41 item['code_rest'] = coda2rest(item['code'])
42 items.append(item)
43 index = {}
44 index['code'] = code
30e64411 45 index['documents'] = items
924e2f0a
TN
46 index['nombre_documents'] = len(items)
47 index['limite_documents'] = self.sqllimit
48 index['filtres'] = self.filters
6264cb94 49 index['requete_sql'] = request
30e64411
TN
50 return index
51
f60ed9f0 52 def _get_details(self,code,numero):
30e64411
TN
53 """renvoie la liste des détails pour un document"""
54 details = []
55 cursor = self.cursor()
f60ed9f0 56 request = "select * from auf_v_acces_dtls_demcom where (code = '%s') and (numero = '%s')" % (code, numero)
6264cb94 57 cursor.execute( request )
30e64411
TN
58 while 1:
59 detail = dict_fetchone(cursor)
60 if detail == None: break
61 details.append(detail)
62 return details
63
f60ed9f0
TN
64 def _get_liaisons(self,code,numero):
65 """renvoie la liste des demandes sources d'une commande ou des commandes issues d'une demande"""
f60ed9f0
TN
66 cursor = self.cursor()
67 if code[:3] == 'DEM':
68 request = "select code,numero from auf_v_acces_dtls_demcom where source_code = '%s' and source_numero = '%s' group by code,numero"
69 else:
8e670226 70 request = "select source_code as code, source_numero as numero from auf_v_acces_dtls_demcom where code = '%s' and numero = '%s' group by source_code,source_numero"
f60ed9f0 71 cursor.execute( request % (code, numero ) )
8e670226 72 liaisons = []
f60ed9f0
TN
73 while 1:
74 liaison = dict_fetchone(cursor)
75 if liaison == None: break
8e670226
TN
76 if liaison['code'] == None: break # cas d'un document sans liaison
77 liaison['code_rest'] = coda2rest(liaison['code'])
f60ed9f0
TN
78 liaisons.append(liaison)
79 return liaisons
80
81 def _get_budget(self,code_service,annee):
82 """renvoie les données du budget du code_service"""
83 cursor = self.cursor()
84 request = "select top 1 * from auf_budget where projet_poste = '%s' and annee = %d" % ( code_service[:6] , annee )
85 cursor.execute( request )
86 budget = dict_fetchone(cursor)
87 if budget == None:
88 budget = { 'projet_poste': '0000XX', 'projet': 'Inconnu', 'poste':'Inconnu', 'annee': annee }
89 budget['date_interrogation'] = datetime.today()
90 return budget
91
92 def _get_document(self,code,numero):
30e64411
TN
93 """renvoie un document"""
94 cursor = self.cursor()
f60ed9f0 95 request = "select top 1 * from auf_v_acces_demcom where (code like '%s') and (numero = %d) %s" % (code, numero, self.sqlwhere)
6264cb94 96 cursor.execute( request )
30e64411
TN
97 document = dict_fetchone(cursor)
98 if document == None:
65f02320 99 raise ObjetInconnu('document')
924e2f0a 100 # TODO : declencher une autre exception ObjetNonUnique si plusieurs résultats ?
6264cb94 101 document['requete_sql'] = request
f60ed9f0
TN
102 document['code_rest'] = coda2rest( document['code'] )
103 document['details'] = self._get_details( document['code'], document['numero'] )
104 document['liaisons'] = self._get_liaisons( document['code'], document['numero'] )
105 if isinstance( document['date_modif'], datetime ):
106 annee = document['date_modif'].year
107 else:
108 annee = datetime.today().year
109 document['budget'] = self._get_budget( document['code_service'], annee )
110 # TODO : ajouter budget (a l'heure de la demande)
30e64411
TN
111 return document
112
113 def index(self):
114 """renvoie une liste de documents formatée"""
115 template = self.template('%s-index' % self.prefix_template) # préparation du modèle
116 index = self._get_index( self.code_document ) # extraction des documents concernés
117 output = template.render( index ) # formattage via le modèle
118 return self.outputformat, output
119
120 def show(self):
121 """renvoie un document formaté"""
122 # return 'txt', '%s' % self.environ # pour debug
f60ed9f0 123 numero = int(self.environ['wsgiorg.routing_args'][1]['id'])
30e64411 124 template = self.template( self.prefix_template )
f60ed9f0 125 document = self._get_document( self.code_document, numero )
30e64411
TN
126 output = template.render( document )
127 return self.outputformat, output
128
10a46ce2
TN
129#
130# les classes filles précisent le code_document
131#
132
ef44a84b 133class dem(Document):
30e64411
TN
134 def __init__(self, environ):
135 super(dem, self).__init__(environ, code_document = 'DEM-%')
136
ef44a84b 137class com(Document):
30e64411
TN
138 def __init__(self, environ):
139 super(com, self).__init__(environ, code_document = 'COM-%')
140
ef44a84b 141class demlog(Document):
30e64411
TN
142 def __init__(self, environ):
143 super(demlog, self).__init__(environ, code_document = 'DEM-LOG-AUF')
144
ef44a84b 145class comlog(Document):
30e64411
TN
146 def __init__(self, environ):
147 super(comlog, self).__init__(environ, code_document = 'COM-LOG-AUF')
148
ef44a84b 149class demdep(Document):
30e64411
TN
150 def __init__(self, environ):
151 super(demdep, self).__init__(environ, code_document = 'DEM-DEP-AUF')
152
ef44a84b 153class comdep(Document):
30e64411
TN
154 def __init__(self, environ):
155 super(comdep, self).__init__(environ, code_document = 'COM-DEP-AUF')
156
ef44a84b 157class dempub(Document):
30e64411
TN
158 def __init__(self, environ):
159 super(dempub, self).__init__(environ, code_document = 'DEM-PUB-AUF')
160
ef44a84b 161class compub(Document):
30e64411
TN
162 def __init__(self, environ):
163 super(compub, self).__init__(environ, code_document = 'COM-PUB-AUF')
164
ef44a84b 165class comsre(Document):
30e64411
TN
166 def __init__(self, environ):
167 # on distingue comsre et comsrexxx (avec xxx = implantation)
168 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
169 super(comsre, self).__init__(environ, code_document = 'COM-SRE-%s' % impl)
170
ef44a84b 171class comare(Document):
30e64411
TN
172 def __init__(self, environ):
173 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
174 super(comare, self).__init__(environ, code_document = 'COM-ARE-%s' % impl)
175
ef44a84b 176class comxre(Document):
30e64411
TN
177 def __init__(self, environ):
178 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
179 super(comxre, self).__init__(environ, code_document = 'COM-%%RE-%s' % impl)
180