annot-server/webapp/admin.py
author cavaliet
Mon, 20 Oct 2014 15:00:19 +0200
changeset 47 33002744dbbd
parent 43 e27c3c1c57f1
child 51 7792f095d94a
permissions -rw-r--r--
Merge with 8d2fb4ec85d780422af207a1e8425d82921eef1e

#
# 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))