diff -r 175826fb5b42 -r 658561ea9e65 annot-server/webapp/admin.py --- 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("Lien :

Code embed :" % (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))