Progres SEP
authorCyril Robert <Cyril Robert crobert@inverse.ca>
Fri, 26 Feb 2010 17:13:17 +0000 (12:13 -0500)
committerCyril Robert <Cyril Robert crobert@inverse.ca>
Fri, 26 Feb 2010 17:13:17 +0000 (12:13 -0500)
.gitignore [new file with mode: 0644]
Apps/auf_sep/harvest/harvest.py
Apps/auf_sep/harvest/harvesters/pmb/export.py
Apps/auf_sep/sep/io.py
Apps/auf_sep/setup.py
Apps/auf_sep/storage/json.py

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..e0b4a78
--- /dev/null
@@ -0,0 +1,19 @@
+# All compiled binaries..
+*.pyc
+*.pyo
+
+# Fichier temporaires:
+*~
+\#*#
+.*.swp
+
+# Ignore merged stuff
+*.orig
+*.rej
+
+# Configuration du projet - par environnement
+conf.py
+django.wsgi
+
+# les évaluations passées en PDF
+evaluation/docs/*
index 0fa37d8..4aa65f3 100644 (file)
@@ -2,11 +2,19 @@ import sys
 
 sys.path.append ("../")
 from conf import RESOURCES
+from sep.io import SEP
 
 
-for name in RESOURCES.keys ():
-    options = RESOURCES[name]
-    module = 'harvesters.%s.%s' % (options['type'], options['acces'])
-    __import__ (module)
-    harvester = sys.modules[module]
-    nodes = harvester.harvest (options)
+if __name__ == "__main__":
+    sep = SEP ()
+
+    for name in RESOURCES.keys ():
+        print "Import:", name
+        options = RESOURCES[name]
+        module = 'harvesters.%s.%s' % (options['type'], options['acces'])
+        __import__ (module)
+        harvester = sys.modules[module]
+        nodes = harvester.harvest (options)
+        print "Ajout de", len(nodes), "references"
+        for node in nodes:
+            sep.add (node)
index d60940d..6516dec 100644 (file)
@@ -29,15 +29,16 @@ def findtext (node, tag):
 def harvest (options):
     c = PmbClient ()
     c.connect (options['host'])
+    login_script = options['base_url'] + "main.php"
+    export_script = options['base_url'] + "admin/convert/start_export.php"
 
     params = {'user': options['username'], 
             'password': options['password'], 
             'database': options['db']}
-    c.login (params, options['login_script'])
+    c.login (params, login_script)
 
     params = {'export_type': '14', 'lender': 'x'}
-    content = c.export (params, options['export_script'])
-    print content
+    content = c.export (params, export_script)
 
     root = etree.XML (content)
     article_nodes = root.findall (".//notice")
@@ -63,8 +64,8 @@ def harvest (options):
             #else:
             #    print c.tag, "ignoré"
 
-        meta[URL] = "http://%s/%s/catalog.php?id=%s" % \
-                (options['host'], 'pmb', meta[IDENTIFIER])
+        meta[URI] = "http://%s%scatalog.php?id=%s" % \
+                (options['host'], options['base_url'], meta[IDENTIFIER])
         nodes.append (meta)
     return nodes
 
index 3f41966..7890109 100644 (file)
@@ -3,11 +3,12 @@ from exceptions import Exception
 import sys
 sys.path.append ("../")
 import conf
+from globals import *
 
 
 class SEP:
     backend = None
-    required_methods = ['open', 'close', 'add', 'delete', 'search']
+    required_methods = ['open', 'close', 'add', 'delete', 'search', 'update']
 
     def __init__ (self):
         # Charge le backend de stockage
@@ -31,24 +32,32 @@ class SEP:
     def __del__ (self):
         self.backend.close ()
 
-#############
-# API privé
-
 
 #############
 # API public
-    def search (self, id = None, searchstring = None):
-        return self.backend.search (id, searchstring)
+    def search (self, id = None, q = None):
+        return self.backend.search (id, q)
+
+    def get (self, id):
+        return self.backend.get (id)
 
-    def add (self, id, metadata):
-        self.backend.add (id, metadata)
+    def add (self, metadata):
+        exists = self.search (q = {URI: metadata[URI]})
+        if len (exists) > 0:
+            id = exists[0]
+            return self.update (id, metadata)
+        else:
+            return self.backend.add (metadata)
 
     def delete (self, id):
         self.backend.delete (id)
 
+    # Pas vraiment besoin d'etre public, mais bon
     def update (self, id, metadata):
-        self.remove (id)
-        self.add (id, metadata)
+        if len (self.search (id = id)) > 0:
+            self.backend.update (id, metadata)
+        else:
+            raise Exception ("Objet inexistant")
 
 
 
index 487d1e6..a78276e 100644 (file)
@@ -18,5 +18,5 @@ setup(
         package_dir={'auf_sep': '.',},
         include_package_data=True,
         zip_safe=False,
-        install_requires=["lovely.jsonrpc",],
+        install_requires=[],
         )
index 54c3813..327450e 100644 (file)
@@ -1,9 +1,16 @@
 # -*- encoding: utf-8 -*-
 import os
 import simplejson as json
+import sys
+sys.path.append ("../")
+from globals import *
 
 ####
 # Attention: pas efficace
+#
+# Trucs a faire pour l'optimiser:
+#  - Ajouter un index par url, trié
+#  - Ajouter un index (full inverted) pour les champs texte
 
 INDEX_NAME = 'index.json'
 DATA_FMT = '%s.json'
@@ -29,6 +36,7 @@ class Backend:
     data = {}
     needs_write = False
     remove = []
+    last_index = 0
 
     def __init__ (self, options):
         self.options = options
@@ -46,9 +54,11 @@ class Backend:
             index = File (ip, 'r').read ()
             for id in index:
                 fp = os.path.join (p, DATA_FMT % id)
-                self.data[id] = File (fp, 'r').read ()
-                self.data[id]['needs_write'] = False
-            #print self.data
+                meta = File (fp, 'r').read ()
+                meta['needs_write'] = False
+                self.data[id] = meta
+                if id > self.last_index:
+                    self.last_index = id
 
     def close (self):
         if self.needs_write:
@@ -61,7 +71,7 @@ class Backend:
                     os.remove (fp)
 
             # Ecrit l'index
-            File(os.path.join(p, INDEX_NAME), 'w').write(self.data.keys().sort())
+            File(os.path.join(p, INDEX_NAME), 'w').write(self.data.keys ())
 
             # Ecrit les données
             for id in self.data.keys ():
@@ -71,19 +81,47 @@ class Backend:
                     fp = os.path.join (p, DATA_FMT % id)
                     File (fp, 'w').write (record)
 
-    def add (self, id, metadata):
-        self.data[id] = metadata
-        self.data[id]['needs_write'] = True
+    def add (self, metadata):
+        self.last_index += 1
+        metadata['needs_write'] = True
+        self.data[self.last_index] = metadata
+        self.needs_write = True
+        return self.last_index
 
     def delete (self, id):
+        self.needs_write = True
         del (self.data[id])
         self.remove.append (id)
 
-    def search (self, id, searchstring):
+    def update (self, id, metadata):
+        metadata['needs_write'] = True
+        self.needs_write = True
+        del(self.data[id])
+        self.data[id] = metadata
+
+    def get (self, id):
         rc = None
+        if id in self.data.keys ():
+            rc = self.data[id]
+        return rc
+
+    def search (self, id, q):
+        rc = []
 
         if id is not None and id in self.data.keys():
-            rc = self.data[id]
+            rc.append (id)
+
+        elif q is not None:
+            rc = self.data.keys ()
+
+            # Incomplet
+            url = q.get (URI)
+            if url:
+                rr = []
+                for k in rc:
+                    if self.data[k][URI] == url:
+                        rr.append(k)
+                rc = rr
 
         return rc