annot-server/webapp/admin.py
author ymh <ymh.work@gmail.com>
Sat, 25 Oct 2014 00:22:48 +0200
changeset 63 289049253263
parent 62 b1f7ab026ddb
child 64 2f5d0e9fe7b5
permissions -rw-r--r--
reindroduce the start_ts in the eventsession iline view

#
# See LICENCE for detail
# Copyright (c) 2014 IRI
#

import json
import urllib

from dateutil.tz import tzutc

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
from wtforms.ext.dateutil import fields as dateutil_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"] if "code" in c else "","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', 
                        'polemic__max_elements': 200, 
                        'createannotation': True,
                        'createannotation_polemics': False,
                        'tag_titles': "",
                        'polemics_list': json.dumps(output, separators=(',',':'))}

    url = base_url + urllib.urlencode(url_query_params)

    embed = "<iframe src=&quot;%s&quot; width=&quot;570&quot; height=&quot;711&quot; seamless=&quot;seamless&quot;></iframe>" % url

    return Markup("<a href=\"%s\" target=\"_blank\">Lien</a> :<br/><input value=\"%s\"/><br/>Code embed :<input value=\"%s\"/>" % (url, url, embed))

class StartTSField(dateutil_fields.DateTimeField):
    def __init__(self, *args, **kwargs):
        if 'display_format' not in kwargs:
            kwargs['display_format']='iso'
        super(StartTSField, self).__init__(*args, **kwargs)

    def _value(self):
        if self.raw_data:
            return ' '.join(self.raw_data)
        elif self.display_format == 'iso':
            return self.data and self.data.isoformat() or ''
        else:
            return self.data and self.data.strftime(self.display_format) or ''

    def process_formdata(self, valuelist):
        super(StartTSField, self).process_formdata(valuelist)
        if self.data and self.data.tzinfo is None:
            self.data = self.data.replace(tzinfo=tzutc())


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_overrides': { "start_ts": StartTSField, },}})]

    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 = None


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 ''}
    form_overrides = { "start_ts": StartTSField, }
    form_widget_args = {
        'categories_json': {
            'rows': 10,
            'class': 'input-xlarge'
        },
        'start_ts': {
            'class': 'input-xlarge'
        },
        'project_id': {
            'class': 'input-xlarge'
        }
    }

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