annot-server/webapp/admin.py
changeset 66 658561ea9e65
parent 64 2f5d0e9fe7b5
child 67 7db9c7ec691a
--- a/annot-server/webapp/admin.py	Sat Oct 25 05:41:51 2014 +0200
+++ b/annot-server/webapp/admin.py	Sat Oct 25 05:43:01 2014 +0200
@@ -4,11 +4,14 @@
 #
 
 import json
+import logging
+from StringIO import StringIO
 import urllib
 
 from dateutil.tz import tzutc
 
-from flask.ext.admin import Admin
+from flask import url_for, render_template, request
+from flask.ext.admin import Admin, BaseView, expose
 from flask.ext.admin.contrib.sqla import ModelView
 from flask.ext.admin.contrib.sqla.form import AdminModelConverter
 from flask.ext.admin.contrib.sqla.filters import BooleanEqualFilter
@@ -19,9 +22,10 @@
 from wtforms import fields
 from wtforms.ext.dateutil import fields as dateutil_fields
 
+import config
 import database
 import models
-import config
+import utils
 from webapp import app
 
 admin = Admin(app)
@@ -41,10 +45,6 @@
     output = []
 
     for c in model.categories_json.get("categories",[]):
-        #if "subcategories" in c and len(c["subcategories"])>0:
-        #    for sc in c["subcategories"]:
-        #        output.append({"name": sc["code"],"keywords": [ sc["label"] ], "color" : sc["color"] })
-        #else:
         output.append({"name": c["code"] if "code" in c else "","keywords": [ c["label"] ], "color" : c["color"] })
 
     base_url = getattr(config,'LDT_PLATFORM_BASE_URL','') + "/ldt/embediframe/?"
@@ -62,6 +62,21 @@
 
     return Markup("<a href=\"%s\" target=\"_blank\">Lien</a> :<br/><input value=\"%s\"/><br/>Code embed :<input value=\"%s\"/>" % (url, url, embed))
 
+def build_sync_form(view, context, model, name):
+    # `view` is current administrative view
+    # `context` is instance of jinja2.runtime.Context
+    # `model` is model instance
+    # `name` is property name
+    if not model.project_id \
+        or not model.start_ts \
+        or not getattr(config,'LDT_PLATFORM_BASE_URL',None):
+        return ''
+
+    url = url_for('eventsessionview.sync')
+
+    return Markup(render_template('admin/sync_form.html', model=model, url=url))
+
+
 class StartTSField(dateutil_fields.DateTimeField):
     def __init__(self, *args, **kwargs):
         if 'display_format' not in kwargs:
@@ -118,9 +133,13 @@
     column_default_sort = ( models.Event.code, True)
     column_sortable_list = (('event', models.Event.code),)
     column_auto_select_related = True
-    column_list = ('event', 'project_id', 'order', 'categories_json', 'url')
+    column_list = ('event', 'project_id', 'order', 'categories_json', 'url', 'sync')
     column_filters = ('event',)
-    column_formatters = {'url': build_ldt_url, 'categories_json': lambda v, c, m, p: json.dumps(m.categories_json)[:80] if m.categories_json else ''}
+    column_formatters = {
+        'sync': build_sync_form,
+        'url': build_ldt_url,
+        'categories_json': lambda v, c, m, p: json.dumps(m.categories_json)[:80] if m.categories_json else ''
+    }
     form_overrides = { "start_ts": StartTSField, }
     form_widget_args = {
         'categories_json': {
@@ -140,6 +159,41 @@
     def __init__(self, session, **kwargs):
         super(EventSessionView, self).__init__(models.EventSession, session, **kwargs)
 
+    @expose("/sync/",methods=('POST', ))
+    def sync(self):
+        event_session = database.db_session.query(models.EventSession).filter_by(id=int(request.form['event_session_id'])).first()
+
+        if not event_session:
+            abort(404)
+
+        stream = StringIO()
+        handler = logging.StreamHandler(stream)
+        logger = logging.getLogger('sync_logger')
+        logger.setLevel(logging.DEBUG)
+        for h in logger.handlers:
+            logger.removeHandler(h)
+        logger.addHandler(handler)
+
+        sync_args = {
+            'start_date'   : event_session.start_ts,
+            'duration'     : event_session.duration or None,
+            'events'       : [event_session.event.code],
+            'channels'     : [utils.AnnotationsSynchronizer.DEFAULT_ANNOTATION_CHANNEL],
+            'project_id'   : event_session.project_id,
+            'annot_url'    : url_for('annotationapi0.annotationapi', _external=True),
+            'post_param'   : getattr(config, 'SYNC_POST_PARAM', {}),
+            'base_url'     : getattr(config, 'LDT_PLATFORM_BASE_URL', "http://ldt.iri.centrepompidou.fr/ldtplatform/"),
+            'replace'      : True,
+            'merge'        : False,
+            'batch_size'   : 500,
+            'logger'       : logger,
+        }
+
+        sync = utils.AnnotationsSynchronizer(**sync_args)
+        sync.export_annotations()
+        logs = [ line for line in stream.getvalue().split("\n")]
+
+        return self.render('admin/sync_event_session.html', event_session=event_session, sync_args=repr(sync_args), logs=logs)
 
 
 admin.add_view(EventView(database.db_session))