annot-server/webapp/admin.py
changeset 43 e27c3c1c57f1
child 51 7792f095d94a
--- /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("<a href=\"%s\" target=\"_blank\">%s</a>" % (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))