Enhanced json encoder, available in AjaxCommandsMixin
This commit is contained in:
parent
66b77f37ae
commit
eb06fdcece
|
@ -54,7 +54,7 @@
|
|||
{% endif %}
|
||||
|
||||
<head>
|
||||
<h2 class="header-title">{% block title %}{{ title }}{% endblock %}</h3>
|
||||
<h2 class="header-title">{% block title %}{{ title }}{% endblock %}</h2>
|
||||
</head>
|
||||
|
||||
<div class="main-content">
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
from django import forms
|
||||
from django import template
|
||||
from django.conf import settings
|
||||
from django.template.loader import render_to_string
|
||||
from django.urls import reverse
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
@ -11,7 +9,6 @@ def base_form_field(field, css=None, container_class='', add_another_url=None, f
|
|||
if field.is_hidden:
|
||||
return str(field)
|
||||
|
||||
|
||||
classes = field.field.widget.attrs.get('class', '').split(' ')
|
||||
classes.append('form-control')
|
||||
if css:
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
import datetime
|
||||
import json
|
||||
|
||||
from django.test import TestCase
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from model_bakery import baker
|
||||
|
||||
from gas import utils
|
||||
|
||||
|
||||
class UtilsTestCase(TestCase):
|
||||
def test_jsonencoder(self):
|
||||
users = baker.make('auth.User', _quantity=3)
|
||||
now = datetime.datetime.now()
|
||||
today = datetime.date.today()
|
||||
data = {
|
||||
'now': now,
|
||||
'today': today,
|
||||
'users': User.objects.all().values_list('pk', flat=True),
|
||||
'lazy_string': _('lazy'),
|
||||
}
|
||||
|
||||
dumped_data = json.dumps(data, cls=utils.JSONEncoder)
|
||||
recovered_data = json.loads(dumped_data)
|
||||
|
||||
self.assertEqual(
|
||||
recovered_data['now'],
|
||||
now.strftime('%Y-%m-%d %H:%M')
|
||||
)
|
||||
self.assertEqual(
|
||||
recovered_data['today'],
|
||||
today.strftime('%Y-%m-%d')
|
||||
)
|
||||
self.assertEqual(
|
||||
len(recovered_data['users']),
|
||||
3,
|
||||
)
|
||||
self.assertEqual(
|
||||
set(recovered_data['users']),
|
||||
set(user.pk for user in users),
|
||||
)
|
||||
self.assertEqual(
|
||||
recovered_data['lazy_string'], 'lazy',
|
||||
)
|
|
@ -1,4 +1,5 @@
|
|||
import json
|
||||
import datetime
|
||||
|
||||
from django import forms
|
||||
from django.contrib.auth.models import User
|
||||
|
@ -68,6 +69,34 @@ class AjaxCommandTestCase(TestCase):
|
|||
response = post_view(request)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_custom_json_encoder(self):
|
||||
class CustomEncoder(json.JSONEncoder):
|
||||
def default(self, obj):
|
||||
if isinstance(obj, datetime.datetime):
|
||||
return 'datetime'
|
||||
if isinstance(obj, datetime.date):
|
||||
return 'date'
|
||||
return json.JSONEncoder.default(self, obj)
|
||||
|
||||
class SampleAjaxView(gviews.AjaxCommandsMixin, View):
|
||||
def do_test(self):
|
||||
return self.render_json({
|
||||
'now': datetime.datetime.now(),
|
||||
'today': datetime.date.today(),
|
||||
}, encoder=CustomEncoder)
|
||||
|
||||
view = SampleAjaxView.as_view()
|
||||
request_factory = RequestFactory()
|
||||
|
||||
# Command with corresponding "do_" method
|
||||
request = request_factory.post('some_url', {
|
||||
'command': 'test',
|
||||
})
|
||||
response = view(request)
|
||||
data = json.loads(response.content)
|
||||
self.assertEqual(data['now'], 'datetime')
|
||||
self.assertEqual(data['today'], 'date')
|
||||
|
||||
|
||||
class GASMixinTestCase(TestCase):
|
||||
def setUp(self):
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
import datetime
|
||||
import json
|
||||
|
||||
from django.db.models import QuerySet
|
||||
from django.utils.functional import Promise
|
||||
|
||||
|
||||
class JSONEncoder(json.JSONEncoder):
|
||||
def default(self, obj):
|
||||
if isinstance(obj, datetime.datetime):
|
||||
return obj.strftime('%Y-%m-%d %H:%M')
|
||||
if isinstance(obj, datetime.date):
|
||||
return obj.strftime('%Y-%m-%d')
|
||||
if isinstance(obj, QuerySet):
|
||||
return list(obj)
|
||||
if isinstance(obj, Promise):
|
||||
return str(obj)
|
||||
return json.JSONEncoder.default(self, obj)
|
|
@ -13,6 +13,7 @@ from django.utils.translation import gettext_lazy as _
|
|||
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
|
||||
|
||||
from . import gas_settings
|
||||
from . import utils
|
||||
|
||||
|
||||
class AjaxCommandsMixin:
|
||||
|
@ -27,8 +28,10 @@ class AjaxCommandsMixin:
|
|||
handler = getattr(super(), 'post', self.http_method_not_allowed)
|
||||
return handler(request, *args, **kwargs)
|
||||
|
||||
def render_json(self, data):
|
||||
return HttpResponse(json.dumps(data), content_type='application/json')
|
||||
def render_json(self, data, encoder=utils.JSONEncoder):
|
||||
return HttpResponse(
|
||||
json.dumps(data, indent=2, cls=encoder),
|
||||
content_type='application/json')
|
||||
|
||||
|
||||
class GASMixin:
|
||||
|
|
Loading…
Reference in New Issue