backoffice/listings: add minimal JSON export (#6642)

also move JSONEncoder to qommon.misc
This commit is contained in:
Thomas NOËL 2015-03-24 23:06:59 +01:00
parent dcfc3d1c98
commit 96aa0d897c
3 changed files with 29 additions and 9 deletions

View File

@ -45,6 +45,8 @@ from wcs.forms.backoffice import FormDefUI
import wcs.admin.forms
import wcs.admin.workflows
from wcs.api import get_user_from_api_query_string
try:
import xlwt
@ -492,7 +494,7 @@ class FakeField(object):
return [element]
class FormPage(Directory):
_q_exports = ['', 'csv', 'stats', 'xls', 'ods', 'pending', 'export']
_q_exports = ['', 'csv', 'stats', 'xls', 'ods', 'json', 'pending', 'export']
def __init__(self, component):
try:
@ -954,6 +956,21 @@ class FormPage(Directory):
response.set_header('content-disposition', 'attachment; filename=%s.ods' % self.formdef.url_name)
return exporter.output.getvalue()
def json(self):
get_response().set_content_type('application/json')
user = get_user_from_api_query_string() or get_request().user
selected_filter = self.get_filter_from_query()
query = get_request().form.get('q')
items, total_count = FormDefUI(self.formdef).get_listing_items(
selected_filter, user=user, query=query)
output = [{'id': filled.id,
'url': filled.get_url(backoffice=True),
'receipt_time': filled.receipt_time,
'last_update_time': filled.last_update_time} for filled in items]
return json.dumps(output,
cls=misc.JSONEncoder,
encoding=get_publisher().site_charset)
def get_stats_sidebar(self):
get_response().add_javascript(['jquery.js'])
DateWidget.prepare_javascript()

View File

@ -91,13 +91,6 @@ def get_json_dict(fields, data):
new_data[field.varname] = value
return new_data
class JSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, time.struct_time):
return qommon.strftime.strftime('%Y-%m-%dT%H:%M:%S', obj)
# Let the base class default method raise the TypeError
return json.JSONEncoder.default(self, obj)
class Evolution(object):
who = None
@ -546,7 +539,7 @@ class FormData(StorableObject):
data['workflow']['data'] = self.workflow_data
return json.dumps(data,
cls=JSONEncoder,
cls=qommon.misc.JSONEncoder,
encoding=get_publisher().site_charset)
def feed_session(self):

View File

@ -22,12 +22,14 @@ import httplib
import urllib
import socket
import base64
import json
from quixote import get_publisher, get_session
from quixote.html import htmltext
from qommon import get_cfg, get_logger, ezt
from qommon.errors import ConnectionError
import qommon.strftime
import strftime
@ -502,3 +504,11 @@ def indent_xml(elem, level=0):
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
return elem
class JSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, time.struct_time):
return qommon.strftime.strftime('%Y-%m-%dT%H:%M:%S', obj)
# Let the base class default method raise the TypeError
return json.JSONEncoder.default(self, obj)