annot-server/webapp/admin.py
changeset 43 e27c3c1c57f1
child 51 7792f095d94a
equal deleted inserted replaced
42:926f0426ce78 43:e27c3c1c57f1
       
     1 #
       
     2 # See LICENCE for detail
       
     3 # Copyright (c) 2014 IRI
       
     4 #
       
     5 
       
     6 import json
       
     7 import urllib
       
     8 
       
     9 from flask.ext.admin import Admin
       
    10 from flask.ext.admin.contrib.sqla import ModelView
       
    11 from flask.ext.admin.contrib.sqla.form import AdminModelConverter
       
    12 from flask.ext.admin.contrib.sqla.filters import BooleanEqualFilter
       
    13 from flask.ext.admin.model.form import InlineFormAdmin, converts
       
    14 
       
    15 from jinja2 import Markup
       
    16 
       
    17 from wtforms import fields
       
    18 
       
    19 import database
       
    20 import models
       
    21 import config
       
    22 from webapp import app
       
    23 
       
    24 admin = Admin(app)
       
    25 
       
    26 
       
    27 def build_ldt_url(view, context, model, name):
       
    28     # `view` is current administrative view
       
    29     # `context` is instance of jinja2.runtime.Context
       
    30     # `model` is model instance
       
    31     # `name` is property name
       
    32     if not model.project_id \
       
    33         or not model.categories_json \
       
    34         or not isinstance(model.categories_json, dict) \
       
    35         or not getattr(config,'LDT_PLATFORM_BASE_URL',None):
       
    36         return ''
       
    37 
       
    38     output = []
       
    39 
       
    40     for c in model.categories_json.get("categories",[]):
       
    41         if "subcategories" in c and len(c["subcategories"])>0:
       
    42             for sc in c["subcategories"]:
       
    43                 output.append({"name": sc["code"],"keywords": [ sc["label"] ], "color" : sc["color"] })
       
    44         else:
       
    45             output.append({"name": c["code"],"keywords": [ c["label"] ], "color" : c["color"] })
       
    46 
       
    47     base_url = getattr(config,'LDT_PLATFORM_BASE_URL','') + "/ldt/embediframe/?"
       
    48     url_query_params = {'project_id': model.project_id, 'polemic': 'all', 'polemics_list': json.dumps(output, separators=(',',':'))}
       
    49 
       
    50     url = base_url + urllib.urlencode(url_query_params)
       
    51 
       
    52     return Markup("<a href=\"%s\" target=\"_blank\">%s</a>" % (url,url[:80]+"..."))
       
    53 
       
    54 
       
    55 class EventView(ModelView):
       
    56     column_searchable_list = ('code', 'label')
       
    57     column_list = ('code', 'label', 'start_date', 'active')
       
    58     column_filters = ('code', 'label', 'start_date', 'active')
       
    59     form_create_rules = ('code', 'label', 'description', 'start_date')
       
    60     inline_models = (models.EventSession,)
       
    61     #form_edit_rules = ('label', 'description', 'start_date', 'active', 'code')
       
    62 
       
    63     def __init__(self, session, **kwargs):
       
    64         super(EventView, self).__init__(models.Event, session, **kwargs)
       
    65 
       
    66 
       
    67 class DictToJSONField(fields.TextAreaField):
       
    68     def process_data(self, value):
       
    69         if value is None:
       
    70             value = {}
       
    71 
       
    72         self.data = json.dumps(value, indent=2)
       
    73 
       
    74     def process_formdata(self, valuelist):
       
    75         if valuelist:
       
    76             self.data = json.loads(valuelist[0])
       
    77         else:
       
    78             self.data = '{}'
       
    79 
       
    80 class JsonAdminConverter(AdminModelConverter):
       
    81     @converts('JSON')
       
    82     def conv_JSON(self, field_args, **extra):
       
    83         return DictToJSONField(**field_args)
       
    84 
       
    85 class EventSessionView(ModelView):
       
    86 
       
    87     column_default_sort = ( models.Event.code, True)
       
    88     column_sortable_list = (('event', models.Event.code),)
       
    89     column_auto_select_related = True
       
    90     column_list = ('event', 'project_id', 'order', 'categories_json', 'url')
       
    91     column_filters = ('event',)
       
    92     column_formatters = {'url': build_ldt_url, 'categories_json': lambda v, c, m, p: json.dumps(m.categories_json)[:80] if m.categories_json else ''}
       
    93 
       
    94     model_form_converter=JsonAdminConverter
       
    95 
       
    96     def __init__(self, session, **kwargs):
       
    97         super(EventSessionView, self).__init__(models.EventSession, session, **kwargs)
       
    98 
       
    99 
       
   100 
       
   101 admin.add_view(EventView(database.db_session))
       
   102 admin.add_view(EventSessionView(database.db_session))