Skip to content

Commit 8f096cf

Browse files
authored
Merge pull request #9 from kckaiwei/master
adding support for manager class w/ test
2 parents 5930843 + 285dc1c commit 8f096cf

File tree

8 files changed

+120
-6
lines changed

8 files changed

+120
-6
lines changed

jsonate/json_encoder.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from django.db.models.query import ValuesQuerySet
1313

1414
from django.db.models.query import QuerySet
15-
from django.db.models import Model
15+
from django.db.models import Model, Manager
1616
from django.db.models.fields.related import ForeignKey
1717
from django.db.models.fields.files import FieldFile
1818

@@ -54,8 +54,9 @@ def jsonate_fields(model):
5454
fields = getattr(model._meta, 'jsonate_fields', all_fields)
5555

5656
serialize = set(fields).difference(set(excluded))
57-
58-
return tuple(field for field in model._meta.fields
57+
58+
# Getting all fields, including hidden fields as options
59+
return tuple(field for field in model._meta.get_fields()
5960
if field.name in serialize)
6061

6162
#########################
@@ -98,6 +99,10 @@ def map_queryset(obj):
9899
fields = jsonate_fields(obj.model)
99100
return obj.values(*[field.name for field in fields])
100101

102+
# Managers are typically hidden fields, and must be specified via meta fields
103+
@register_typemap(Manager)
104+
def map_manager(obj):
105+
return obj.get_queryset()
101106

102107
@register_typemap(Model)
103108
def map_model_instance(obj):

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='jsonate',
5-
version='0.5.0',
5+
version='0.5.1',
66

77
author='James Robert',
88
author_email='jiaaro@gmail.com',
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2018-09-14 13:41
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import jsonate.fields
7+
import test_app.models
8+
9+
10+
class Migration(migrations.Migration):
11+
12+
dependencies = [
13+
('test_app', '0003_withjsonatefieldexpectinglist'),
14+
]
15+
16+
operations = [
17+
migrations.CreateModel(
18+
name='MyModelWithRelation',
19+
fields=[
20+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21+
('name', models.CharField(max_length=100)),
22+
('many_to_many', models.ManyToManyField(related_name='many_to_my_model', to='test_app.MyModel')),
23+
],
24+
),
25+
migrations.AlterField(
26+
model_name='withjsonatefieldexpectinglist',
27+
name='some_json_data',
28+
field=jsonate.fields.JsonateField(default=[], validators=[test_app.models.validate_list]),
29+
),
30+
]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2018-09-14 13:43
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('test_app', '0004_auto_20180914_1341'),
13+
]
14+
15+
operations = [
16+
migrations.RemoveField(
17+
model_name='mymodelwithrelation',
18+
name='many_to_many',
19+
),
20+
migrations.AddField(
21+
model_name='mymodelwithrelation',
22+
name='many_to_many',
23+
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='many_to_my_model', to='test_app.MyModel'),
24+
preserve_default=False,
25+
),
26+
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2018-09-14 13:52
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('test_app', '0005_auto_20180914_1343'),
12+
]
13+
14+
operations = [
15+
migrations.RenameField(
16+
model_name='mymodelwithrelation',
17+
old_name='many_to_many',
18+
new_name='to_many',
19+
),
20+
]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2018-09-14 13:55
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('test_app', '0006_auto_20180914_1352'),
12+
]
13+
14+
operations = [
15+
migrations.RemoveField(
16+
model_name='mymodelwithrelation',
17+
name='to_many',
18+
),
19+
migrations.AddField(
20+
model_name='mymodelwithrelation',
21+
name='to_many',
22+
field=models.ManyToManyField(related_name='many_to_my_model', to='test_app.MyModel'),
23+
),
24+
]

test_project/test_app/models.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from jsonate.fields import JsonateField
99

1010
class MyModel(models.Model):
11-
foreign_key = models.ForeignKey(User)
11+
foreign_key = models.ForeignKey(User, on_delete=models.CASCADE)
1212
normal_field1 = models.CharField(max_length=25, default="field1")
1313
normal_field2 = models.CharField(max_length=25, default='field2')
1414

@@ -29,6 +29,10 @@ class MyModel(models.Model):
2929
class Meta(object):
3030
jsonate_exclude = ('sensitive_field1',)
3131

32+
class MyModelWithRelation(models.Model):
33+
name = models.CharField(max_length=100)
34+
to_many = models.ManyToManyField(MyModel, related_name="many_to_my_model")
35+
3236
class MyModelWithJsonateField(models.Model):
3337
some_name = models.CharField(max_length=255)
3438
some_json_data = JsonateField(null=True, blank=True)

test_project/test_app/tests.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from jsonate import jsonate
2020
from jsonate.django_ver import django_18
2121

22-
from .models import MyModel, MyModelWithJsonateField, WithJsonateFieldExpectingList
22+
from .models import MyModel, MyModelWithJsonateField, WithJsonateFieldExpectingList, MyModelWithRelation
2323

2424

2525
def destroy_media_folder(folder):
@@ -41,6 +41,9 @@ def setUp(self):
4141
self.model.file_field.save("text_file.txt", ContentFile("Any Old Content"))
4242
self.model.image_field.save("image_file.wbm", ContentFile('\x00\x00\x01\x01\x80'))
4343
self.model.save()
44+
self.related_model = MyModelWithRelation(name="related_model")
45+
self.related_model.save()
46+
self.related_model.to_many.add(self.model)
4447

4548
def tearDown(self):
4649
destroy_media_folder("files")
@@ -140,6 +143,8 @@ def test_basic_serialization(self):
140143
"file_field": "files/text_file.txt"
141144
}
142145

146+
self.assertJsonEqual(jsonate(self.model.many_to_my_model), [{"id": 1, "name": "related_model"}])
147+
143148
self.assertJsonEqual(jsonate(self.model), mymodel_data)
144149
self.assertJsonEqual(jsonate(MyModel.objects.all()), [mymodel_data])
145150

0 commit comments

Comments
 (0)