Skip to content

Commit

Permalink
Merge e362679 into c45f9a1
Browse files Browse the repository at this point in the history
  • Loading branch information
matllubos committed Nov 4, 2018
2 parents c45f9a1 + e362679 commit 845cc8c
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions chamber/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from chamber.exceptions import PersistenceException
from chamber.patch import Options
from chamber.shortcuts import change_and_save, change, bulk_change_and_save
from chamber.utils.decorators import singleton

from .fields import * # NOQA exposing classes and functions as a module API
from .signals import dispatcher_post_save, dispatcher_pre_save
Expand Down Expand Up @@ -44,6 +45,24 @@ def field_to_dict(field, instance):
else field.value_from_object(instance))


@singleton
class UnknownSingleton:

def __repr__(self):
return 'unknown'

Unknown = UnknownSingleton()


def unknown_model_fields_to_dict(instance, fields=None, exclude=None):

return {
field.name: Unknown
for field in chain(instance._meta.concrete_fields, instance._meta.many_to_many) # pylint: disable=W0212
if not should_exclude_field(field, fields, exclude)
}


def model_to_dict(instance, fields=None, exclude=None):
"""
The same implementation as django model_to_dict but editable fields are allowed
Expand Down Expand Up @@ -139,11 +158,13 @@ class DynamicChangedFields(ChangedFields):
"""

def __init__(self, instance):
super(DynamicChangedFields, self).__init__(self._get_instance_dict(instance))
super().__init__(self._get_instance_dict(instance))
self.instance = instance

def _get_instance_dict(self, instance):
return model_to_dict(instance, fields=(field.name for field in instance._meta.fields))
return (unknown_model_fields_to_dict if instance._state.adding else model_to_dict)(
instance, fields=(field.name for field in instance._meta.fields)
)

@property
def current_values(self):
Expand All @@ -159,7 +180,7 @@ class StaticChangedFields(ChangedFields):
"""

def __init__(self, initial_dict, current_dict):
super(StaticChangedFields, self).__init__(initial_dict)
super().__init__(initial_dict)
self._current_dict = current_dict

@property
Expand Down

0 comments on commit 845cc8c

Please sign in to comment.