Mercurial > libervia-web
annotate src/pages/tickets/new/page_meta.py @ 995:f88325b56a6a
server: dynamic pages first draft:
/!\ new dependency: autobahn
This patch introduce server part of dynamic pages.
Dynamic pages use websockets to establish constant connection with a Libervia page, allowing to receive real time data or update it.
The feature is activated by specifying "dynamic = true" in the page.
Once activated, page can implement "on_data" method which will be called when data are sent by the page.
To send data the other way, the page can use request.sendData.
The new "registerSignal" method allows to use an "on_signal" method to be called each time given signal is received, with automatic (and optional) filtering on profile.
New renderPartial and renderAndUpdate method allow to append new HTML elements to the dynamic page.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 03 Jan 2018 01:10:12 +0100 |
parents | 1d1a6c91961f |
children | 296bda6b7ed0 |
rev | line source |
---|---|
967 | 1 #!/usr/bin/env python2.7 |
2 # -*- coding: utf-8 -*- | |
3 | |
4 from libervia.server.constants import Const as C | |
5 from twisted.internet import defer | |
6 from sat.tools.common import template_xmlui | |
7 from sat.core.log import getLogger | |
8 log = getLogger('pages/ticket') | |
9 """ticket handling pages""" | |
10 | |
973
2e75dc986e03
pages (tickets): URLs for list and new are set in the template for the whole subhierarchy
Goffi <goffi@goffi.org>
parents:
971
diff
changeset
|
11 name = u'tickets_new' |
967 | 12 access = C.PAGES_ACCESS_PROFILE |
13 template = u"ticket/create.html" | |
14 | |
15 | |
16 @defer.inlineCallbacks | |
17 def prepare_render(self, request): | |
18 data = self.getRData(request) | |
973
2e75dc986e03
pages (tickets): URLs for list and new are set in the template for the whole subhierarchy
Goffi <goffi@goffi.org>
parents:
971
diff
changeset
|
19 template_data = request.template_data |
967 | 20 service, node = data.get(u'service', u''), data.get(u'node', u'') |
21 profile = self.getProfile(request) | |
22 schema = yield self.host.bridge.ticketsSchemaGet(service.full(), node, profile) | |
23 data['schema'] = schema | |
24 # following fields are handled in backend | |
982
a78169c1bf77
pages (tickets/new): added reporter_jid in ignore list (if needed, it is filled in backend)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
25 ignore = ('reporter', 'reporter_jid', 'reporter_email', 'created', 'updated', 'comments_uri', 'status', 'milestone', 'priority') |
967 | 26 xmlui_obj = template_xmlui.create(self.host, schema, ignore=ignore) |
971
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
27 try: |
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
28 # small trick to get a one line text input instead of the big textarea |
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
29 xmlui_obj.widgets[u'labels'].type = u'string' |
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
30 except KeyError: |
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
31 pass |
973
2e75dc986e03
pages (tickets): URLs for list and new are set in the template for the whole subhierarchy
Goffi <goffi@goffi.org>
parents:
971
diff
changeset
|
32 template_data[u'new_ticket_xmlui'] = xmlui_obj |
967 | 33 |
34 @defer.inlineCallbacks | |
35 def on_data_post(self, request): | |
36 data = self.getRData(request) | |
37 service = data['service'] | |
38 node = data['node'] | |
39 posted_data = self.getAllPostedData(request) | |
977
d0de2a98e852
pages (tickets/new): refuse data if body is not set
Goffi <goffi@goffi.org>
parents:
976
diff
changeset
|
40 if not posted_data['title'] or not posted_data['body']: |
970
bc28b9068f91
page(tickets/new): refuse request if title is not set
Goffi <goffi@goffi.org>
parents:
969
diff
changeset
|
41 self.pageError(request, C.HTTP_BAD_REQUEST) |
971
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
42 try: |
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
43 posted_data['labels'] = [l.strip() for l in posted_data['labels'][0].split(',')] |
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
44 except (KeyError, IndexError): |
6e966ef8d69f
page(tickets/new): use string instead of textbox for labels, and use comma to split them
Goffi <goffi@goffi.org>
parents:
970
diff
changeset
|
45 pass |
967 | 46 profile = self.getProfile(request) |
989
1d1a6c91961f
pages (tickets/new): renamed bridge method to follow backend change.
Goffi <goffi@goffi.org>
parents:
982
diff
changeset
|
47 yield self.host.bridge.ticketSet(service.full(), node, posted_data, u'', u'', {}, profile) |
967 | 48 # we don't want to redirect to creation page on success, but to tickets list |
968
4d37b23777c3
pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents:
967
diff
changeset
|
49 data['post_redirect_page'] = (self.getPageByName(u'tickets_list'), |
4d37b23777c3
pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents:
967
diff
changeset
|
50 service.full(), |
4d37b23777c3
pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents:
967
diff
changeset
|
51 node or u'@') |