RESTfulisation
authorThomas NOEL <thomas@new-dev.(none)>
Thu, 3 Jul 2008 00:22:54 +0000 (20:22 -0400)
committerThomas NOEL <thomas.noel@auf.org>
Thu, 3 Jul 2008 00:22:54 +0000 (20:22 -0400)
document-index.json [new file with mode: 0644]
document-index.rss
document.html [new file with mode: 0644]
document.xml
rest.wsgi

diff --git a/document-index.json b/document-index.json
new file mode 100644 (file)
index 0000000..f0559da
--- /dev/null
@@ -0,0 +1,3 @@
+
+{{ documents | jsonencode }}
+
index 6c29352..6ae85ba 100644 (file)
@@ -10,7 +10,7 @@
 {% 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>
+     <link>http://bacasable.auf/rest/{{d.code_rest}}/{{d.numero | int}}.txt</link>
      <guid>http://bacasable.auf/rest/{{d.code_rest}}/{{d.numero | int}}</guid>
      <description>fournisseur {{ d.fournisseur }}</description>
      <pubDate>{{ d.date_modif }}</pubDate>
diff --git a/document.html b/document.html
new file mode 100644 (file)
index 0000000..5f07ff3
--- /dev/null
@@ -0,0 +1,2 @@
+<pre>{{ debug()|e }}</pre>
+
index 01e17ba..66cc9ea 100644 (file)
@@ -9,15 +9,15 @@
   <devise>{{ devise }}</devise>
   <imputation>{{ code_service }}</imputation>
   <fournisseur>{{ fournisseur }}</fournisseur>
-  <commentaires>{{commentaires}}</commentaires>
+  <commentaires>{{ commentaires | e }}</commentaires>
   <livraison>
-    <adresse>{{ livraison_destination}}
-{{ livraison_addresse1 }}
-{{ livraison_addresse2 }}
-{{ livraison_addresse3 }}
-{{ livraison_addresse4 }}
-{{ livraison_addresse5 }}
-{{ livraison_addresse6 }}
+    <adresse>{{ livraison_destination | e }}
+{{ livraison_addresse1 | e }}
+{{ livraison_addresse2 | e }}
+{{ livraison_addresse3 | e }}
+{{ livraison_addresse4 | e }}
+{{ livraison_addresse5 | e }}
+{{ livraison_addresse6 | e }}
 {{ livraison_code_postal }}
     </adresse>
     <telephone>{{ livraison_telephone }}</telephone>
   </livraison>
   <impl.payeuse>{{ implantation_payeuse }}</impl.payeuse>
   <facturation>
-    <adresse>{{ facturation_destination}}
-{{ facturation_addresse1 }}
-{{ facturation_addresse2 }}
-{{ facturation_addresse3 }}
-{{ facturation_addresse4 }}
-{{ facturation_addresse5 }}
-{{ facturation_addresse6 }}
+    <adresse>{{ facturation_destination | e }}
+{{ facturation_addresse1 | e }}
+{{ facturation_addresse2 | e }}
+{{ facturation_addresse3 | e }}
+{{ facturation_addresse4 | e }}
+{{ facturation_addresse5 | e }}
+{{ facturation_addresse6 | e }}
 {{ facturation_code_postal }}
     </adresse>
     <telephone>{{ facturation_telephone }}</telephone>
@@ -42,7 +42,7 @@
     <detail>
        <ligne>{{ detail.ligne }}</ligne>
        <code>{{ detail.code_article }}</code>
-       <description>{{ detail.description_article }}</description>
+       <description>{{ detail.description_article | e }}</description>
        <quantite>{{ detail.quantite }}</quantite>
        <pu>{{ detail.prix_unitaire }}</pu>
        <taxe>{{ detail.taxe }}</taxe>
index 5b6b4ff..dc3a572 100644 (file)
--- a/rest.wsgi
+++ b/rest.wsgi
@@ -7,9 +7,10 @@ import sys, traceback
 sys.path.append('/home/thomas/public_html/')
 import rest_config
 
-# pour savoir quel objet interroger : Routes et analyse de query_string
+# pour savoir quel objet interroger : Routes
 from routes import Mapper
 from routes.middleware import RoutesMiddleware
+# et analyse de query_string (TODO: etudier parse au lieu de cgi)
 from cgi import parse_qs
 
 # pour chercher les données sur MS-SQL
@@ -19,33 +20,36 @@ from pymssql import connect
 from jinja import Environment, FileSystemLoader
 from jinja.filters import stringfilter
 
-# systeme de cache : beaker
-from beaker.middleware import CacheMiddleware
+# TODO systeme de cache : beaker
+# from beaker.middleware import CacheMiddleware
 
 # formats de sortie autorisés, et content-type correspondant
 # formats = { 'xml': 'application/xml', 'html': 'text/html', 'txt': 'text/plain', 'json': 'application/json', 'rss': 'application/rss+xml' }
 formats = { 'xml': 'application/xml', 'html': 'text/html', 'txt': 'text/plain', 'json': 'text/plain', 'rss': 'application/rss+xml' }
 
-# les routes
+# les routes RESTful (cf http://routes.groovie.org/manual.html#restful-services)
 mapper = Mapper()
-mapper.connect(':controller/')
-mapper.connect(':controller/:id', action='get')
-mapper.connect(':controller/:action/:id')
-mapper.create_regs(['document','demlog','comlog'])
+mapper.resource('demlog','demlog')
+mapper.resource('comlog','comlog')
+mapper.resource('demdep','demdep')
+mapper.resource('comdep','comdep')
+mapper.resource('dempub','dempub')
+mapper.resource('compub','compub')
+# TODO à étudier pour permettre les comarexxx
+mapper.resource('comare','comare')
+mapper.resource('comsra','comsre')
 
-# objet de base : dispose d'un accès à MS-SQL (lire les données) et d'un accès à jinja (rendu des données)
 class objetsql(object):
+    """objet de base : dispose d'un accès à MS-SQL (lire les données) et d'un accès à jinja (rendu des données)"""
     def __init__(self, environ):
         self.bd = connect(host=rest_config.host,user=rest_config.user,password=rest_config.password,database=rest_config.database)
        self.cursor = self.bd.cursor()
        self.jinja = Environment(loader=FileSystemLoader('/home/thomas/public_html/'))
        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'
+        self.outputformat = environ['wsgiorg.routing_args'][1].get('format','xml')
 
 class document(objetsql):
+    """objet document CODA (demlog, comlog, demdep... ils ont tous le même format)"""
     def __init__(self, environ, code_document='%', basename_template='document'):
         super(document, self).__init__(environ)
         self.code_document = code_document
@@ -66,7 +70,7 @@ class document(objetsql):
        output = template.render(documents)
        return self.outputformat, output
 
-    def get(self):
+    def show(self):
         id = int(self.environ['wsgiorg.routing_args'][1]['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)
@@ -92,6 +96,32 @@ class comlog(document):
     def __init__(self, environ):
         super(comlog, self).__init__(environ, code_document = 'COM-LOG-AUF')
 
+class demdep(document):
+    def __init__(self, environ):
+        super(demdep, self).__init__(environ, code_document = 'DEM-DEP-AUF')
+
+class comdep(document):
+    def __init__(self, environ):
+        super(comdep, self).__init__(environ, code_document = 'COM-DEP-AUF')
+
+class dempub(document):
+    def __init__(self, environ):
+        super(dempub, self).__init__(environ, code_document = 'DEM-PUB-AUF')
+
+class compub(document):
+    def __init__(self, environ):
+        super(compub, self).__init__(environ, code_document = 'COM-PUB-AUF')
+
+# TODO : voir la possibilité d'appel de comsre/sn1.rss
+class comsre(document):
+    def __init__(self, environ):
+        super(comsre, self).__init__(environ, code_document = 'COM-SRE-%')
+
+class comare(document):
+    def __init__(self, environ):
+        super(comare, self).__init__(environ, code_document = 'COM-ARE-%')
+
+
 def dispatcher(environ, start_response):
     """sera lancée par mod_wsgi"""
     if environ.has_key('QUERY_STRING'):
@@ -102,8 +132,6 @@ def dispatcher(environ, start_response):
     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])])
@@ -114,7 +142,10 @@ def dispatcher(environ, start_response):
 
 application = RoutesMiddleware( dispatcher, mapper)
 
-# utilitaires
+
+#
+# petits utilitaires
+#
 def dict_fetchone(cursor):
     """Renvoie le resultat d'un fetchone dans un dictionnaire"""
     result = cursor.fetchone()