annot-server/webapp/admin.py
changeset 66 658561ea9e65
parent 64 2f5d0e9fe7b5
child 67 7db9c7ec691a
equal deleted inserted replaced
65:175826fb5b42 66:658561ea9e65
     2 # See LICENCE for detail
     2 # See LICENCE for detail
     3 # Copyright (c) 2014 IRI
     3 # Copyright (c) 2014 IRI
     4 #
     4 #
     5 
     5 
     6 import json
     6 import json
       
     7 import logging
       
     8 from StringIO import StringIO
     7 import urllib
     9 import urllib
     8 
    10 
     9 from dateutil.tz import tzutc
    11 from dateutil.tz import tzutc
    10 
    12 
    11 from flask.ext.admin import Admin
    13 from flask import url_for, render_template, request
       
    14 from flask.ext.admin import Admin, BaseView, expose
    12 from flask.ext.admin.contrib.sqla import ModelView
    15 from flask.ext.admin.contrib.sqla import ModelView
    13 from flask.ext.admin.contrib.sqla.form import AdminModelConverter
    16 from flask.ext.admin.contrib.sqla.form import AdminModelConverter
    14 from flask.ext.admin.contrib.sqla.filters import BooleanEqualFilter
    17 from flask.ext.admin.contrib.sqla.filters import BooleanEqualFilter
    15 from flask.ext.admin.model.form import InlineFormAdmin, converts
    18 from flask.ext.admin.model.form import InlineFormAdmin, converts
    16 
    19 
    17 from jinja2 import Markup
    20 from jinja2 import Markup
    18 
    21 
    19 from wtforms import fields
    22 from wtforms import fields
    20 from wtforms.ext.dateutil import fields as dateutil_fields
    23 from wtforms.ext.dateutil import fields as dateutil_fields
    21 
    24 
       
    25 import config
    22 import database
    26 import database
    23 import models
    27 import models
    24 import config
    28 import utils
    25 from webapp import app
    29 from webapp import app
    26 
    30 
    27 admin = Admin(app)
    31 admin = Admin(app)
    28 
    32 
    29 
    33 
    39         return ''
    43         return ''
    40 
    44 
    41     output = []
    45     output = []
    42 
    46 
    43     for c in model.categories_json.get("categories",[]):
    47     for c in model.categories_json.get("categories",[]):
    44         #if "subcategories" in c and len(c["subcategories"])>0:
       
    45         #    for sc in c["subcategories"]:
       
    46         #        output.append({"name": sc["code"],"keywords": [ sc["label"] ], "color" : sc["color"] })
       
    47         #else:
       
    48         output.append({"name": c["code"] if "code" in c else "","keywords": [ c["label"] ], "color" : c["color"] })
    48         output.append({"name": c["code"] if "code" in c else "","keywords": [ c["label"] ], "color" : c["color"] })
    49 
    49 
    50     base_url = getattr(config,'LDT_PLATFORM_BASE_URL','') + "/ldt/embediframe/?"
    50     base_url = getattr(config,'LDT_PLATFORM_BASE_URL','') + "/ldt/embediframe/?"
    51     url_query_params = {'project_id': model.project_id,
    51     url_query_params = {'project_id': model.project_id,
    52                         'polemic': 'all',
    52                         'polemic': 'all',
    60 
    60 
    61     embed = "<iframe src=&quot;%s&quot; width=&quot;570&quot; height=&quot;711&quot; seamless=&quot;seamless&quot;></iframe>" % url
    61     embed = "<iframe src=&quot;%s&quot; width=&quot;570&quot; height=&quot;711&quot; seamless=&quot;seamless&quot;></iframe>" % url
    62 
    62 
    63     return Markup("<a href=\"%s\" target=\"_blank\">Lien</a> :<br/><input value=\"%s\"/><br/>Code embed :<input value=\"%s\"/>" % (url, url, embed))
    63     return Markup("<a href=\"%s\" target=\"_blank\">Lien</a> :<br/><input value=\"%s\"/><br/>Code embed :<input value=\"%s\"/>" % (url, url, embed))
    64 
    64 
       
    65 def build_sync_form(view, context, model, name):
       
    66     # `view` is current administrative view
       
    67     # `context` is instance of jinja2.runtime.Context
       
    68     # `model` is model instance
       
    69     # `name` is property name
       
    70     if not model.project_id \
       
    71         or not model.start_ts \
       
    72         or not getattr(config,'LDT_PLATFORM_BASE_URL',None):
       
    73         return ''
       
    74 
       
    75     url = url_for('eventsessionview.sync')
       
    76 
       
    77     return Markup(render_template('admin/sync_form.html', model=model, url=url))
       
    78 
       
    79 
    65 class StartTSField(dateutil_fields.DateTimeField):
    80 class StartTSField(dateutil_fields.DateTimeField):
    66     def __init__(self, *args, **kwargs):
    81     def __init__(self, *args, **kwargs):
    67         if 'display_format' not in kwargs:
    82         if 'display_format' not in kwargs:
    68             kwargs['display_format']='iso'
    83             kwargs['display_format']='iso'
    69         super(StartTSField, self).__init__(*args, **kwargs)
    84         super(StartTSField, self).__init__(*args, **kwargs)
   116 class EventSessionView(ModelView):
   131 class EventSessionView(ModelView):
   117 
   132 
   118     column_default_sort = ( models.Event.code, True)
   133     column_default_sort = ( models.Event.code, True)
   119     column_sortable_list = (('event', models.Event.code),)
   134     column_sortable_list = (('event', models.Event.code),)
   120     column_auto_select_related = True
   135     column_auto_select_related = True
   121     column_list = ('event', 'project_id', 'order', 'categories_json', 'url')
   136     column_list = ('event', 'project_id', 'order', 'categories_json', 'url', 'sync')
   122     column_filters = ('event',)
   137     column_filters = ('event',)
   123     column_formatters = {'url': build_ldt_url, 'categories_json': lambda v, c, m, p: json.dumps(m.categories_json)[:80] if m.categories_json else ''}
   138     column_formatters = {
       
   139         'sync': build_sync_form,
       
   140         'url': build_ldt_url,
       
   141         'categories_json': lambda v, c, m, p: json.dumps(m.categories_json)[:80] if m.categories_json else ''
       
   142     }
   124     form_overrides = { "start_ts": StartTSField, }
   143     form_overrides = { "start_ts": StartTSField, }
   125     form_widget_args = {
   144     form_widget_args = {
   126         'categories_json': {
   145         'categories_json': {
   127             'rows': 10,
   146             'rows': 10,
   128             'class': 'input-xlarge'
   147             'class': 'input-xlarge'
   138     model_form_converter=JsonAdminConverter
   157     model_form_converter=JsonAdminConverter
   139 
   158 
   140     def __init__(self, session, **kwargs):
   159     def __init__(self, session, **kwargs):
   141         super(EventSessionView, self).__init__(models.EventSession, session, **kwargs)
   160         super(EventSessionView, self).__init__(models.EventSession, session, **kwargs)
   142 
   161 
       
   162     @expose("/sync/",methods=('POST', ))
       
   163     def sync(self):
       
   164         event_session = database.db_session.query(models.EventSession).filter_by(id=int(request.form['event_session_id'])).first()
       
   165 
       
   166         if not event_session:
       
   167             abort(404)
       
   168 
       
   169         stream = StringIO()
       
   170         handler = logging.StreamHandler(stream)
       
   171         logger = logging.getLogger('sync_logger')
       
   172         logger.setLevel(logging.DEBUG)
       
   173         for h in logger.handlers:
       
   174             logger.removeHandler(h)
       
   175         logger.addHandler(handler)
       
   176 
       
   177         sync_args = {
       
   178             'start_date'   : event_session.start_ts,
       
   179             'duration'     : event_session.duration or None,
       
   180             'events'       : [event_session.event.code],
       
   181             'channels'     : [utils.AnnotationsSynchronizer.DEFAULT_ANNOTATION_CHANNEL],
       
   182             'project_id'   : event_session.project_id,
       
   183             'annot_url'    : url_for('annotationapi0.annotationapi', _external=True),
       
   184             'post_param'   : getattr(config, 'SYNC_POST_PARAM', {}),
       
   185             'base_url'     : getattr(config, 'LDT_PLATFORM_BASE_URL', "http://ldt.iri.centrepompidou.fr/ldtplatform/"),
       
   186             'replace'      : True,
       
   187             'merge'        : False,
       
   188             'batch_size'   : 500,
       
   189             'logger'       : logger,
       
   190         }
       
   191 
       
   192         sync = utils.AnnotationsSynchronizer(**sync_args)
       
   193         sync.export_annotations()
       
   194         logs = [ line for line in stream.getvalue().split("\n")]
       
   195 
       
   196         return self.render('admin/sync_event_session.html', event_session=event_session, sync_args=repr(sync_args), logs=logs)
   143 
   197 
   144 
   198 
   145 admin.add_view(EventView(database.db_session))
   199 admin.add_view(EventView(database.db_session))
   146 admin.add_view(EventSessionView(database.db_session))
   200 admin.add_view(EventSessionView(database.db_session))