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