Browse Source

Initial commit

Matthias Vogelgesang 9 years ago
commit
f0e6a5d83a
4 changed files with 148 additions and 0 deletions
  1. 2 0
      .gitignore
  2. 61 0
      dm.py
  3. 21 0
      log.ini.template
  4. 64 0
      reco.py

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+log.ini
+*.pyc

+ 61 - 0
dm.py

@@ -0,0 +1,61 @@
+import requests
+from xml.etree import ElementTree
+from requests_oauthlib import OAuth1
+
+
+BASE_URL = 'http://kitdm.anka.kit.edu:8080/KITDM/rest'
+KEY = 'secret'
+SECRET = 'secret'
+TOKEN = 'KeQL6nNBv8qsnFVb'
+TOKEN_SECRET = '6JyJaO5TrkMK92dU'
+
+
+class Error(Exception):
+    pass
+
+
+class PermissionError(Error):
+    pass
+
+
+class NotFoundError(Error):
+    pass
+
+
+class ArbitraryError(Error):
+    pass
+
+
+class Object(object):
+    def __init__(self, root):
+        self.identifier = root.find('./entities/entity/digitalObjectIdentifier').text
+        self.note = root.find('./entities/entity/note').text
+
+
+class Client(object):
+    def __init__(self, base_url=BASE_URL, key=KEY, secret=SECRET,
+                 token=TOKEN, token_secret=TOKEN_SECRET):
+        self.auth = OAuth1(KEY, SECRET, TOKEN, TOKEN_SECRET)
+        self.base_url = base_url
+
+    def get_object_ids(self, limit=None, since=None):
+        results = '?results={}'.format(limit) if limit else ''
+        url = '{}/basemetadata/digitalObjects/{}'.format(self.base_url, results)
+        root = self.get_response(url)
+        return (int(e.text) for e in root.findall('./entities/entity/baseId'))
+
+    def get_object(self, oid):
+        url = '{}/basemetadata/digitalObjects/{}'.format(self.base_url, oid)
+        return Object(self.get_response(url))
+
+    def get_response(self, url):
+        response = requests.get(url, auth=self.auth)
+
+        if response.status_code == 403:
+            raise PermissionError()
+        elif response.status_code == 404:
+            raise NotFoundError()
+        elif response.status_code != 200:
+            raise ArbitraryError()
+
+        return ElementTree.fromstring(response.text)

+ 21 - 0
log.ini.template

@@ -0,0 +1,21 @@
+[loggers]
+keys=root
+
+[handlers]
+keys=default
+
+[formatters]
+keys=default
+
+[logger_root]
+level=INFO
+handlers=default
+
+[handler_default]
+class=StreamHandler
+args=(sys.stdout,)
+formatter=default
+
+[formatter_default]
+format=[%(asctime)s %(levelname)s] %(message)s
+datefmt=%Y-%m-%dT%H:%M

+ 64 - 0
reco.py

@@ -0,0 +1,64 @@
+import os
+import dm
+import datetime
+import logging
+import logging.config
+import xdg.BaseDirectory
+
+APP_NAME = 'recofoo'
+LOG_INI = 'log.ini'
+
+DATA_PATH = xdg.BaseDirectory.save_data_path(APP_NAME)
+CONFIG_PATH = xdg.BaseDirectory.save_config_path(APP_NAME)
+TIMESTAMP_PATH = os.path.join(DATA_PATH, 'timestamp')
+
+
+def get_last_timestamp():
+    if not os.path.exists(TIMESTAMP_PATH):
+        return datetime.datetime.min
+
+    with open(TIMESTAMP_PATH) as f:
+        time = f.read()
+        return datetime.datetime.strptime(time, '%Y-%m-%dT%H:%M:%S')
+
+
+def update_timestamp(timestamp):
+    with open(TIMESTAMP_PATH, 'w') as f:
+        f.write(timestamp.strftime('%Y-%m-%dT%H:%M:%S'))
+
+
+def configure_logging():
+    config_path = os.path.join(CONFIG_PATH, LOG_INI)
+    log_path = LOG_INI if os.path.exists(LOG_INI) else None
+
+    if not log_path:
+        log_path = config_path if os.path.exists(config_path) else None
+
+    if log_path:
+        logging.config.fileConfig(log_path)
+    else:
+        logging.basicConfig(level=logging.INFO)
+
+
+class Application(object):
+    def __init__(self):
+        self.client = dm.Client()
+        self.log = logging.getLogger(APP_NAME)
+
+    def run(self):
+        last_update = get_last_timestamp()
+
+        for oid in self.client.get_object_ids(since=last_update):
+            self.reconstruct(oid)
+
+        now = datetime.datetime.now()
+        update_timestamp(now)
+
+    def reconstruct(self, oid):
+        obj = self.client.get_object(oid)
+        self.log.info("Reconstructing {}".format(obj.identifier))
+
+
+if __name__ == '__main__':
+    configure_logging()
+    Application().run()