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="%s" width="570" height="711" seamless="seamless"></iframe>" % url |
61 embed = "<iframe src="%s" width="570" height="711" seamless="seamless"></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)) |