* peut remplacer % dans les filtres, c'est plus simple
[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
ef44a84b
TN
11from objetsql import ObjetSQL, ObjetSQLInconnuError
12from utils import dict_fetchone, coda2rest
30e64411 13
ef44a84b 14class Document(ObjetSQL):
30e64411
TN
15 """objet document CODA (demlog, comlog, demdep... ils ont tous le même format)"""
16 accept_like_filters = [ 'code', 'demandeur', 'approbateur', 'code_service', 'statut', 'fournisseur', 'statut' ]
17 def __init__(self, environ, code_document='%', prefix_template='document'):
ef44a84b 18 super(Document, self).__init__(environ)
30e64411
TN
19 self.code_document = code_document
20 self.prefix_template = prefix_template
10a46ce2 21 # TODO : voir si on peut faire le filtrage dans "objetsql"
30e64411
TN
22 # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where
23 sqlwhere = []
24 for filter in self.accept_like_filters:
25 if filter in self.filters:
26 or_list = []
27 for v in self.filters[filter]:
9c4084a5 28 or_list.append("%s like '%s'" % (filter,v.replace('*','%')))
30e64411
TN
29 sqlwhere.append('(' + ' or '.join(or_list) + ')')
30 # TODO : ajouter filtres min_*/max_*, avant/apres dans ce sqlwhere
31 self.sqlwhere = ''
32 for f in sqlwhere:
33 self.sqlwhere += ' and ' + f
9c4084a5 34 # filtrage : valeur en cas de limite ("top n" en ODBC), 100 maxi
30e64411 35 if 'limite' in self.filters:
9c4084a5 36 self.sqllimit = min( int(self.filters['limite'][0]), 100 )
30e64411 37 else:
9c4084a5 38 self.sqllimit = 30
30e64411
TN
39 # filtrage : si aucun statut n'est spécifié, on prend "statut like non%"
40 if not 'statut' in self.filters:
41 self.sqlwhere += " and (statut like 'non%') "
42 # TODO : ajouter filtres tri_asc/tri_desc
43 self.sqlorder = ''
44
45 def _get_index(self, code):
46 """renvoie une liste de documents"""
47 # connexion a la base de données
48 cursor = self.cursor()
49 # extraction des données
50 cursor.execute("select top %d * from auf_v_acces_demcom where (code like '%s') %s order by date_modif desc" % ( self.sqllimit, code, self.sqlwhere ) )
51 items = []
52 while 1:
53 item = dict_fetchone( cursor )
54 if item == None: break
55 item['code_rest'] = coda2rest(item['code'])
56 items.append(item)
57 index = {}
58 index['code'] = code
59 index['filtres'] = self.filters
60 index['documents'] = items
61 return index
62
63 def _get_details(self,code,id):
64 """renvoie la liste des détails pour un document"""
65 details = []
66 cursor = self.cursor()
67 cursor.execute("select * from auf_v_acces_dtls_demcom where (code like '%s') and (numero = %d)" % (code, id))
68 while 1:
69 detail = dict_fetchone(cursor)
70 if detail == None: break
71 details.append(detail)
72 return details
73
74 def _get_document(self,code,id):
75 """renvoie un document"""
76 cursor = self.cursor()
77 cursor.execute("select top 1 * from auf_v_acces_demcom where (code like '%s') and (numero = %d) %s" % (code, id, self.sqlwhere))
78 document = dict_fetchone(cursor)
79 if document == None:
ef44a84b 80 raise ObjetSQLInconnuError('document')
30e64411
TN
81 document['code_rest'] = coda2rest( document['code'] )
82 document['details'] = self._get_details( code,id )
83 return document
84
85 def index(self):
86 """renvoie une liste de documents formatée"""
87 template = self.template('%s-index' % self.prefix_template) # préparation du modèle
88 index = self._get_index( self.code_document ) # extraction des documents concernés
89 output = template.render( index ) # formattage via le modèle
90 return self.outputformat, output
91
92 def show(self):
93 """renvoie un document formaté"""
94 # return 'txt', '%s' % self.environ # pour debug
95 id = int(self.environ['wsgiorg.routing_args'][1]['id'])
96 template = self.template( self.prefix_template )
97 document = self._get_document( self.code_document, id )
98 output = template.render( document )
99 return self.outputformat, output
100
10a46ce2
TN
101#
102# les classes filles précisent le code_document
103#
104
ef44a84b 105class dem(Document):
30e64411
TN
106 def __init__(self, environ):
107 super(dem, self).__init__(environ, code_document = 'DEM-%')
108
ef44a84b 109class com(Document):
30e64411
TN
110 def __init__(self, environ):
111 super(com, self).__init__(environ, code_document = 'COM-%')
112
ef44a84b 113class demlog(Document):
30e64411
TN
114 def __init__(self, environ):
115 super(demlog, self).__init__(environ, code_document = 'DEM-LOG-AUF')
116
ef44a84b 117class comlog(Document):
30e64411
TN
118 def __init__(self, environ):
119 super(comlog, self).__init__(environ, code_document = 'COM-LOG-AUF')
120
ef44a84b 121class demdep(Document):
30e64411
TN
122 def __init__(self, environ):
123 super(demdep, self).__init__(environ, code_document = 'DEM-DEP-AUF')
124
ef44a84b 125class comdep(Document):
30e64411
TN
126 def __init__(self, environ):
127 super(comdep, self).__init__(environ, code_document = 'COM-DEP-AUF')
128
ef44a84b 129class dempub(Document):
30e64411
TN
130 def __init__(self, environ):
131 super(dempub, self).__init__(environ, code_document = 'DEM-PUB-AUF')
132
ef44a84b 133class compub(Document):
30e64411
TN
134 def __init__(self, environ):
135 super(compub, self).__init__(environ, code_document = 'COM-PUB-AUF')
136
ef44a84b 137class comsre(Document):
30e64411
TN
138 def __init__(self, environ):
139 # on distingue comsre et comsrexxx (avec xxx = implantation)
140 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
141 super(comsre, self).__init__(environ, code_document = 'COM-SRE-%s' % impl)
142
ef44a84b 143class comare(Document):
30e64411
TN
144 def __init__(self, environ):
145 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
146 super(comare, self).__init__(environ, code_document = 'COM-ARE-%s' % impl)
147
ef44a84b 148class comxre(Document):
30e64411
TN
149 def __init__(self, environ):
150 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
151 super(comxre, self).__init__(environ, code_document = 'COM-%%RE-%s' % impl)
152