--- 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))