diff -r 926f0426ce78 -r e27c3c1c57f1 annot-server/webapp/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/annot-server/webapp/admin.py Mon Oct 20 01:31:33 2014 +0200 @@ -0,0 +1,102 @@ +# +# See LICENCE for detail +# Copyright (c) 2014 IRI +# + +import json +import urllib + +from flask.ext.admin import Admin +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 +from flask.ext.admin.model.form import InlineFormAdmin, converts + +from jinja2 import Markup + +from wtforms import fields + +import database +import models +import config +from webapp import app + +admin = Admin(app) + + +def build_ldt_url(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.categories_json \ + or not isinstance(model.categories_json, dict) \ + or not getattr(config,'LDT_PLATFORM_BASE_URL',None): + return '' + + 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"],"keywords": [ c["label"] ], "color" : c["color"] }) + + base_url = getattr(config,'LDT_PLATFORM_BASE_URL','') + "/ldt/embediframe/?" + url_query_params = {'project_id': model.project_id, 'polemic': 'all', 'polemics_list': json.dumps(output, separators=(',',':'))} + + url = base_url + urllib.urlencode(url_query_params) + + return Markup("%s" % (url,url[:80]+"...")) + + +class EventView(ModelView): + column_searchable_list = ('code', 'label') + column_list = ('code', 'label', 'start_date', 'active') + column_filters = ('code', 'label', 'start_date', 'active') + form_create_rules = ('code', 'label', 'description', 'start_date') + inline_models = (models.EventSession,) + #form_edit_rules = ('label', 'description', 'start_date', 'active', 'code') + + def __init__(self, session, **kwargs): + super(EventView, self).__init__(models.Event, session, **kwargs) + + +class DictToJSONField(fields.TextAreaField): + def process_data(self, value): + if value is None: + value = {} + + self.data = json.dumps(value, indent=2) + + def process_formdata(self, valuelist): + if valuelist: + self.data = json.loads(valuelist[0]) + else: + self.data = '{}' + +class JsonAdminConverter(AdminModelConverter): + @converts('JSON') + def conv_JSON(self, field_args, **extra): + return DictToJSONField(**field_args) + +class EventSessionView(ModelView): + + 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_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 ''} + + model_form_converter=JsonAdminConverter + + def __init__(self, session, **kwargs): + super(EventSessionView, self).__init__(models.EventSession, session, **kwargs) + + + +admin.add_view(EventView(database.db_session)) +admin.add_view(EventSessionView(database.db_session))