premier commit
authorThomas NOEL <thomas@new-dev.(none)>
Wed, 2 Jul 2008 17:51:12 +0000 (13:51 -0400)
committerThomas NOEL <thomas.noel@auf.org>
Wed, 2 Jul 2008 17:51:12 +0000 (13:51 -0400)
document-index.rss [new file with mode: 0644]
document.txt [new file with mode: 0644]
document.xml [new file with mode: 0644]
rest.wsgi [new file with mode: 0644]

diff --git a/document-index.rss b/document-index.rss
new file mode 100644 (file)
index 0000000..6c29352
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<rss version="2.0">
+
+<channel>
+        <title>documents CODA {{ code }}</title>
+        <link>http://intranet.auf/</link>
+       <description>les derniers documents CODA de type {{ code }}</description>
+       <language>fr</language>
+                       
+{% for d in documents %}
+<item>
+     <title>{{d.code }} {{d.numero | int}} de {{d.demandeur}} pour {{d.approbateur}} : {{d.total}} {{d.devise}} sur {{ d.code_service }}</title>
+     <link>http://bacasable.auf/rest/{{d.code_rest}}/{{d.numero | int}}?format=txt</link>
+     <guid>http://bacasable.auf/rest/{{d.code_rest}}/{{d.numero | int}}</guid>
+     <description>fournisseur {{ d.fournisseur }}</description>
+     <pubDate>{{ d.date_modif }}</pubDate>
+</item>
+{% endfor %}
+
+</channel>
+</rss>
+
diff --git a/document.txt b/document.txt
new file mode 100644 (file)
index 0000000..f01578c
--- /dev/null
@@ -0,0 +1,48 @@
+Document CODA {{code }} {{ numero }}
+
+Statut: {{ statut }}
+
+Demandeur   : {{ demandeur }}
+Approbateur : {{ approbateur }}
+Créé le     : {{ date_creation }} (mise à jour {{ date_modif }})
+
+Valeur totale : {{ total }} {{ devise }}
+Code service  : {{ code_service }}
+
+Fournisseur   : {{ fournisseur }}
+
+Commentaires  :
+{{commentaires}}
+
+Adresse de livraison :
+{{ livraison_destination}}
+{{ livraison_addresse1 }}
+{{ livraison_addresse2 }}
+{{ livraison_addresse3 }}
+{{ livraison_addresse4 }}
+{{ livraison_addresse5 }}
+{{ livraison_addresse6 }}
+C.P. {{ livraison_code_postal }}
+Tél. : {{ livraison_telephone }}
+Tlc. : {{ livraison_telecopie }}
+
+Implantation payeuse : {{ implantation_payeuse }}
+
+Adresse de facturation :
+{{ facturation_destination}}
+{{ facturation_addresse1 }}
+{{ facturation_addresse2 }}
+{{ facturation_addresse3 }}
+{{ facturation_addresse4 }}
+{{ facturation_addresse5 }}
+{{ facturation_addresse6 }}
+C.P. {{ facturation_code_postal }}
+Tél. : {{ facturation_telephone }}
+Tlc. : {{ facturation_telecopie }}
+
+Détails : {% for detail in details %}
+({{ detail.ligne }}) {{ detail.code_article }} : {{ detail.description_article }}
+    quantité : {{ detail.quantite }} prix unitaire : {{ detail.prix_unitaire }}
+    total : {{ detail.valeur_ligne }} (taxes : {{ detail.taxe }})
+{% endfor %}
+
diff --git a/document.xml b/document.xml
new file mode 100644 (file)
index 0000000..01e17ba
--- /dev/null
@@ -0,0 +1,54 @@
+<{{ code_rest }}>
+  <numero>{{ numero }}</numero>
+  <statut>{{ statut }}</statut>
+  <demandeur>{{ demandeur }}</demandeur>
+  <approbateur>{{ approbateur }}</approbateur>
+  <date.modification>{{ date_modif }}</date.modification>
+  <date.creation>{{ date_creation }}</date.creation>
+  <valeur>{{ total }}</valeur>
+  <devise>{{ devise }}</devise>
+  <imputation>{{ code_service }}</imputation>
+  <fournisseur>{{ fournisseur }}</fournisseur>
+  <commentaires>{{commentaires}}</commentaires>
+  <livraison>
+    <adresse>{{ livraison_destination}}
+{{ livraison_addresse1 }}
+{{ livraison_addresse2 }}
+{{ livraison_addresse3 }}
+{{ livraison_addresse4 }}
+{{ livraison_addresse5 }}
+{{ livraison_addresse6 }}
+{{ livraison_code_postal }}
+    </adresse>
+    <telephone>{{ livraison_telephone }}</telephone>
+    <telecopie>{{ livraison_telecopie }}</telecopie>
+  </livraison>
+  <impl.payeuse>{{ implantation_payeuse }}</impl.payeuse>
+  <facturation>
+    <adresse>{{ facturation_destination}}
+{{ facturation_addresse1 }}
+{{ facturation_addresse2 }}
+{{ facturation_addresse3 }}
+{{ facturation_addresse4 }}
+{{ facturation_addresse5 }}
+{{ facturation_addresse6 }}
+{{ facturation_code_postal }}
+    </adresse>
+    <telephone>{{ facturation_telephone }}</telephone>
+    <telecopie>{{ facturation_telecopie }}</telecopie>
+  </facturation>
+  <details>
+  {% for detail in details %}
+    <detail>
+       <ligne>{{ detail.ligne }}</ligne>
+       <code>{{ detail.code_article }}</code>
+       <description>{{ detail.description_article }}</description>
+       <quantite>{{ detail.quantite }}</quantite>
+       <pu>{{ detail.prix_unitaire }}</pu>
+       <taxe>{{ detail.taxe }}</taxe>
+       <total>{{ detail.valeur_ligne }}</total>
+     </detail>
+   {% endfor %}
+  </details>
+</{{ code_rest }}>
+
diff --git a/rest.wsgi b/rest.wsgi
new file mode 100644 (file)
index 0000000..b6a0ce4
--- /dev/null
+++ b/rest.wsgi
@@ -0,0 +1,124 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import sys, traceback
+
+from routes import Mapper
+from cgi import parse_qs
+
+from pymssql import connect
+from jinja import Environment, FileSystemLoader
+from jinja.filters import stringfilter
+
+import re 
+p = re.compile('(dem|com)-(...)-auf',re.IGNORECASE)
+
+def coda2rest(value):
+    m = p.search(value)
+    if m == None: return value
+    return m.group(1).lower() + m.group(2).lower()
+
+@stringfilter
+def do_coda2rest(value):
+    return coda2rest(value)
+
+formats = { 'xml': 'application/xml', 'html': 'text/html', 'txt': 'text/plain', 'json': 'application/json', 'rss': 'application/rss+xml' }
+
+mapper = Mapper()
+mapper.connect(':controller/')
+mapper.connect(':controller/:id', action='get')
+mapper.connect(':controller/:action/:id')
+mapper.create_regs(['document','demlog','comlog'])
+
+class objetsql(object):
+    def __init__(self, environ):
+        self.bd = connect(host='10.36.0.240',user='log_lec',password='123soap8',database='prodprocurement')
+       self.cursor = self.bd.cursor()
+       self.jinja = Environment(loader=FileSystemLoader('/home/thomas/public_html/'))
+       self.jinja.filters['coda2rest'] = do_coda2rest
+       self.environ = environ
+        if (self.environ['org.auf.filters'].has_key('format')):
+           self.outputformat=self.environ['org.auf.filters']['format'][0]
+       else:
+           self.outputformat='xml'
+          
+class document(objetsql):
+    def __init__(self, environ, code_document='%', basename_template='document'):
+        super(document, self).__init__(environ)
+        self.code_document = code_document
+        self.basename_template = basename_template
+
+    def index(self):
+       self.cursor.execute("select top 30 * from auf_v_acces_demcom where code like '%s' order by date_modif desc" % (self.code_document))
+       documents={}
+       documents['code'] = self.code_document
+       documents_liste=[]
+       while 1:
+           document = dict_fetchone(self.cursor)
+           if document == None: break
+           document['code_rest'] = coda2rest(document['code'])
+           documents_liste.append(document)
+       documents['documents'] = documents_liste
+       template = self.jinja.get_template('%s-index.%s' % (self.basename_template, self.outputformat))
+       output = template.render(documents)
+       return self.outputformat, output
+
+    def get(self):
+        id = int(self.environ['org.auf.routes']['id'])
+        self.cursor.execute("select top 1 * from auf_v_acces_demcom where code like '%s' and numero = %d" % (self.code_document, id))
+        document = dict_fetchone(self.cursor)
+       if document == None:
+           raise "document inexistant"
+       document['code_rest'] = coda2rest(document['code'])
+        details = []
+        self.cursor.execute("select * from auf_v_acces_dtls_demcom where code like '%s' and numero = %d" % (self.code_document, id))
+        while 1:
+            detail = dict_fetchone(self.cursor)
+            if detail == None: break
+            details.append(detail)
+        document['details']=details
+        template = self.jinja.get_template('%s.%s' % (self.basename_template, self.outputformat))
+        output = template.render(document)
+       return self.outputformat, output
+
+class demlog(document):
+    def __init__(self, environ):
+        super(demlog, self).__init__(environ, code_document = 'DEM-LOG-AUF')
+
+class comlog(document):
+    def __init__(self, environ):
+        super(comlog, self).__init__(environ, code_document = 'COM-LOG-AUF')
+
+def application(environ, start_response):
+    """sera lancée par mod_wsgi"""
+    results = mapper.match(environ['PATH_INFO'])
+    filters = parse_qs(environ['QUERY_STRING'])
+    environ['org.auf.routes'] = results
+    environ['org.auf.filters'] = filters
+    try:
+        target_class = globals()[results['controller']]
+       method_name = results['action']
+       if environ['REQUEST_METHOD'] != 'GET':
+            method_name = environ['REQUEST_METHOD'] + '_' + method_name
+        method = getattr(target_class,method_name)
+        type, output = method(target_class(environ))
+       start_response("200 OK", [('Content-type', formats[type])])
+        return output.encode('utf-8')
+    except:
+        start_response("404 NOT FOUND", [('Content-type', 'text/plain')])
+        return 'erreur lors du traitement\n%s: %s\n%s' % ( sys.exc_info()[0] , sys.exc_info()[1] , traceback.format_exc())
+
+
+# utilitaires
+def dict_fetchone(cursor):
+    """Renvoie le resultat d'un fetchone dans un dictionnaire"""
+    result = cursor.fetchone()
+    if result == None: return None
+    result_dict = {}
+    for i in range(len(result)):
+        if isinstance( result[i], str ):
+           result_dict[cursor.description[i][0]] = result[i].decode('iso-8859-1')
+       else:
+            result_dict[cursor.description[i][0]] = result[i]
+    return result_dict
+