Skip to content

Commit

Permalink
Initial model instance has all initial fields unknown
Browse files Browse the repository at this point in the history
  • Loading branch information
matllubos committed Nov 4, 2018
1 parent c45f9a1 commit 8fc30ab
Showing 1 changed file with 31 additions and 3 deletions.
34 changes: 31 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,20 @@ class DynamicChangedFields(ChangedFields):
"""

def __init__(self, instance):
super(DynamicChangedFields, self).__init__(self._get_instance_dict(instance))
super().__init__(
self._get_unknown_dict(instance) if instance._state.adding else self._get_instance_dict(instance)
)
self.instance = instance

def _get_unknown_dict(self, instance):
return unknown_model_fields_to_dict(
instance, fields=(field.name for field in instance._meta.fields)
)

def _get_instance_dict(self, instance):
return model_to_dict(instance, fields=(field.name for field in instance._meta.fields))
return model_to_dict(
instance, fields=(field.name for field in instance._meta.fields)
)

@property
def current_values(self):
Expand All @@ -159,7 +187,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 8fc30ab

Please sign in to comment.