backoffice/listings: add minimal JSON export (#6642)
also move JSONEncoder to qommon.misc
This commit is contained in:
parent
dcfc3d1c98
commit
96aa0d897c
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue