Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,11 @@ Here is a complete list of properties:
(Note that currently this is at odds with the parameter's name,
since the condition is that it is falsey, not that it is `None`).

- `exclude_if_empty`

Defaults to `False`. When set to true, this property will be excluded
from the JSON output when its value is None.

- `validators`

A single validator function or list of validator functions.
Expand Down
14 changes: 10 additions & 4 deletions jsonobject/base_properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,14 @@ def function_name(f):
def function_name(f):
return f.func_name


class JsonProperty(object):

default = None
type_config = None

def __init__(self, default=Ellipsis, name=None, choices=None,
required=False, exclude_if_none=False, validators=None,
verbose_name=None, type_config=None):
required=False, exclude_if_none=False, exclude_if_empty=False,
validators=None, verbose_name=None, type_config=None):
validators = validators or ()
self.name = name
if default is Ellipsis:
Expand All @@ -36,7 +35,10 @@ def __init__(self, default=Ellipsis, name=None, choices=None,
choice, _ = choice
self.choice_keys.append(choice)
self.required = required

self.exclude_if_empty = exclude_if_empty
self.exclude_if_none = exclude_if_none

self._validators = validators
self.verbose_name = verbose_name
if type_config:
Expand Down Expand Up @@ -93,7 +95,11 @@ def doc_type(self):
return self

def exclude(self, value):
return self.exclude_if_none and not value
if self.exclude_if_none:
return not value
if self.exclude_if_empty:
return self.empty(value)
return False

def empty(self, value):
return value is None
Expand Down
16 changes: 15 additions & 1 deletion test/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,20 @@ class Foo(JsonObject):
self.assertEqual(foo.to_json(), {'name': None})
self.assertEqual(foo._id, None)

def test_exclude_if_empty(self):
class Foo(JsonObject):
points = IntegerProperty(exclude_if_empty=True)
name = StringProperty()

foo = Foo()
self.assertEqual(foo.to_json(), {'name': None})
self.assertEqual(foo.points, None)
foo = Foo(points=0)
self.assertEqual(dict(foo), {'name': None, 'points': 0})
foo.points = None
self.assertEqual(foo.to_json(), {'name': None})
self.assertEqual(foo.points, None)

def test_descriptor(self):
class Desc(object):
def __get__(self, instance, owner):
Expand Down Expand Up @@ -669,7 +683,7 @@ def test_attribute_error(self):
class Foo(JsonObject):
pass
foo = Foo()

with self.assertRaises(AttributeError):
foo.hello

Expand Down