factorisation gestion des filtres
[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 objetsql import ObjetSQL, ObjetSQLInconnuError
12 from utils import dict_fetchone, coda2rest
13
14 class Document(ObjetSQL):
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'):
18 super(Document, self).__init__(environ)
19 self.code_document = code_document
20 self.prefix_template = prefix_template
21 # filtrage : si aucun statut n'est spécifié, on prend "statut like non%"
22 if self.sqlwhere != '': self.sqlwhere = ' and ' + self.sqlwhere
23 if not 'statut' in self.filters:
24 self.sqlwhere = " and (statut like 'non%') " + 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 request = "select top %d * from auf_v_acces_demcom where (code like '%s') %s order by date_modif desc" % ( self.sqllimit, code, self.sqlwhere )
32 cursor.execute( request )
33 items = []
34 while 1:
35 item = dict_fetchone( cursor )
36 if item == None: break
37 item['code_rest'] = coda2rest(item['code'])
38 items.append(item)
39 index = {}
40 index['code'] = code
41 index['filtres'] = self.filters
42 index['documents'] = items
43 index['requete_sql'] = request
44 return index
45
46 def _get_details(self,code,id):
47 """renvoie la liste des détails pour un document"""
48 details = []
49 cursor = self.cursor()
50 request = "select * from auf_v_acces_dtls_demcom where (code like '%s') and (numero = %d)" % (code, id)
51 cursor.execute( request )
52 while 1:
53 detail = dict_fetchone(cursor)
54 if detail == None: break
55 details.append(detail)
56 return details
57
58 def _get_document(self,code,id):
59 """renvoie un document"""
60 cursor = self.cursor()
61 request = "select top 1 * from auf_v_acces_demcom where (code like '%s') and (numero = %d) %s" % (code, id, self.sqlwhere)
62 cursor.execute( request )
63 document = dict_fetchone(cursor)
64 if document == None:
65 raise ObjetSQLInconnuError('document')
66 document['code_rest'] = coda2rest( document['code'] )
67 document['details'] = self._get_details( code,id )
68 document['requete_sql'] = request
69 return document
70
71 def index(self):
72 """renvoie une liste de documents formatée"""
73 template = self.template('%s-index' % self.prefix_template) # préparation du modèle
74 index = self._get_index( self.code_document ) # extraction des documents concernés
75 output = template.render( index ) # formattage via le modèle
76 return self.outputformat, output
77
78 def show(self):
79 """renvoie un document formaté"""
80 # return 'txt', '%s' % self.environ # pour debug
81 id = int(self.environ['wsgiorg.routing_args'][1]['id'])
82 template = self.template( self.prefix_template )
83 document = self._get_document( self.code_document, id )
84 output = template.render( document )
85 return self.outputformat, output
86
87 #
88 # les classes filles précisent le code_document
89 #
90
91 class dem(Document):
92 def __init__(self, environ):
93 super(dem, self).__init__(environ, code_document = 'DEM-%')
94
95 class com(Document):
96 def __init__(self, environ):
97 super(com, self).__init__(environ, code_document = 'COM-%')
98
99 class demlog(Document):
100 def __init__(self, environ):
101 super(demlog, self).__init__(environ, code_document = 'DEM-LOG-AUF')
102
103 class comlog(Document):
104 def __init__(self, environ):
105 super(comlog, self).__init__(environ, code_document = 'COM-LOG-AUF')
106
107 class demdep(Document):
108 def __init__(self, environ):
109 super(demdep, self).__init__(environ, code_document = 'DEM-DEP-AUF')
110
111 class comdep(Document):
112 def __init__(self, environ):
113 super(comdep, self).__init__(environ, code_document = 'COM-DEP-AUF')
114
115 class dempub(Document):
116 def __init__(self, environ):
117 super(dempub, self).__init__(environ, code_document = 'DEM-PUB-AUF')
118
119 class compub(Document):
120 def __init__(self, environ):
121 super(compub, self).__init__(environ, code_document = 'COM-PUB-AUF')
122
123 class comsre(Document):
124 def __init__(self, environ):
125 # on distingue comsre et comsrexxx (avec xxx = implantation)
126 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
127 super(comsre, self).__init__(environ, code_document = 'COM-SRE-%s' % impl)
128
129 class comare(Document):
130 def __init__(self, environ):
131 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
132 super(comare, self).__init__(environ, code_document = 'COM-ARE-%s' % impl)
133
134 class comxre(Document):
135 def __init__(self, environ):
136 impl = environ['wsgiorg.routing_args'][1].get('impl','%')
137 super(comxre, self).__init__(environ, code_document = 'COM-%%RE-%s' % impl)
138