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