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