Enhanced json encoder, available in AjaxCommandsMixin
This commit is contained in:
		
							parent
							
								
									66b77f37ae
								
							
						
					
					
						commit
						eb06fdcece
					
				|  | @ -54,7 +54,7 @@ | ||||||
|             {% endif %} |             {% endif %} | ||||||
| 
 | 
 | ||||||
|             <head> |             <head> | ||||||
|                 <h2 class="header-title">{% block title %}{{ title }}{% endblock %}</h3> |                 <h2 class="header-title">{% block title %}{{ title }}{% endblock %}</h2> | ||||||
|             </head> |             </head> | ||||||
| 
 | 
 | ||||||
|             <div class="main-content"> |             <div class="main-content"> | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| from django import forms | from django import forms | ||||||
| from django import template | from django import template | ||||||
| from django.conf import settings |  | ||||||
| from django.template.loader import render_to_string | from django.template.loader import render_to_string | ||||||
| from django.urls import reverse |  | ||||||
| 
 | 
 | ||||||
| register = template.Library() | 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: |     if field.is_hidden: | ||||||
|         return str(field) |         return str(field) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     classes = field.field.widget.attrs.get('class', '').split(' ') |     classes = field.field.widget.attrs.get('class', '').split(' ') | ||||||
|     classes.append('form-control') |     classes.append('form-control') | ||||||
|     if css: |     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 json | ||||||
|  | import datetime | ||||||
| 
 | 
 | ||||||
| from django import forms | from django import forms | ||||||
| from django.contrib.auth.models import User | from django.contrib.auth.models import User | ||||||
|  | @ -68,6 +69,34 @@ class AjaxCommandTestCase(TestCase): | ||||||
|         response = post_view(request) |         response = post_view(request) | ||||||
|         self.assertEqual(response.status_code, 200) |         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): | class GASMixinTestCase(TestCase): | ||||||
|     def setUp(self): |     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 django.views.generic import ListView, CreateView, UpdateView, DeleteView | ||||||
| 
 | 
 | ||||||
| from . import gas_settings | from . import gas_settings | ||||||
|  | from . import utils | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class AjaxCommandsMixin: | class AjaxCommandsMixin: | ||||||
|  | @ -27,8 +28,10 @@ class AjaxCommandsMixin: | ||||||
|             handler = getattr(super(), 'post', self.http_method_not_allowed) |             handler = getattr(super(), 'post', self.http_method_not_allowed) | ||||||
|             return handler(request, *args, **kwargs) |             return handler(request, *args, **kwargs) | ||||||
| 
 | 
 | ||||||
|     def render_json(self, data): |     def render_json(self, data, encoder=utils.JSONEncoder): | ||||||
|         return HttpResponse(json.dumps(data), content_type='application/json') |         return HttpResponse( | ||||||
|  |             json.dumps(data, indent=2, cls=encoder), | ||||||
|  |             content_type='application/json') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class GASMixin: | class GASMixin: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue