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