don't store created pks as int

This commit is contained in:
Laura Klünder 2017-06-22 22:47:22 +02:00
parent c6ed3105b0
commit f1854c8b66
4 changed files with 21 additions and 26 deletions

View file

@ -65,14 +65,12 @@ class Change(models.Model):
@property
def obj_pk(self) -> typing.Union[int, str]:
if self._set_object is not None:
return self._set_object.pk
if self.existing_object_pk is not None:
return self.existing_object_pk
if self.created_object_id is not None:
return 'c'+str(self.created_object_id)
if self.action == 'create':
return 'c' + str(self.pk)
return 'c'+str(self.pk)
raise TypeError('existing_model_pk or created_object have to be set.')
def other_changes(self):

View file

@ -167,33 +167,33 @@ class ChangeSet(models.Model):
self._last_change_pk = change.pk
model = change.model_class
pk = change.obj_pk
if change.action == 'create':
new = {}
self.created_objects.setdefault(model, {})[change.pk] = new
self.ever_created_objects.setdefault(model, {})[change.pk] = new
self.created_objects.setdefault(model, {})[pk] = new
self.ever_created_objects.setdefault(model, {})[pk] = new
return
elif change.action == 'delete':
if change.existing_object_pk is not None:
self.deleted_existing.setdefault(model, set()).add(change.existing_object_pk)
if not is_created_pk(pk):
self.deleted_existing.setdefault(model, set()).add(pk)
else:
self.created_objects[model].pop(change.created_object_id)
self.m2m_added.get(model, {}).pop('c'+str(change.created_object_id), None)
self.m2m_removed.get(model, {}).pop('c'+str(change.created_object_id), None)
self.created_objects[model].pop(pk)
self.m2m_added.get(model, {}).pop(pk, None)
self.m2m_removed.get(model, {}).pop(pk, None)
return
pk = change.obj_pk
name = change.field_name
if change.action == 'restore':
if change.existing_object_pk is None:
self.created_objects[model][change.created_object_id].pop(name, None)
if is_created_pk(pk):
self.created_objects[model][pk].pop(name, None)
else:
self.updated_existing.setdefault(model, {}).setdefault(pk, {}).pop(name, None)
value = json.loads(change.field_value)
if change.action == 'update':
if change.existing_object_pk is None:
self.created_objects[model][change.created_object_id][name] = value
if is_created_pk(pk):
self.created_objects[model][pk][name] = value
else:
self.updated_existing.setdefault(model, {}).setdefault(pk, {})[name] = value
@ -274,9 +274,6 @@ class ChangeSet(models.Model):
:param allow_deleted: return created objects that have already been deleted (needs get_history=True)
:return: a wrapped model instance
"""
if is_created_pk(pk):
pk = pk[1:]
pk = int(pk)
self.parse_changes()
if issubclass(model, ModelWrapper):
model = model._obj
@ -293,9 +290,9 @@ class ChangeSet(models.Model):
model, data = objects[0]
obj = model()
obj.pk = 'c' + str(pk)
obj.pk = pk
if hasattr(model._meta.pk, 'related_model'):
setattr(obj, model._meta.pk.related_model._meta.pk.attname, obj.pk)
setattr(obj, model._meta.pk.related_model._meta.pk.attname, pk)
obj._state.adding = False
for name, value in data.items():

View file

@ -85,7 +85,7 @@ def group_changes(changeset, can_edit=False, show_history=False):
if is_created_pk(pk):
if show_history:
obj_desc = _('%s (created)') % obj_desc
obj_still_exists = int(pk[1:]) in changeset.created_objects[obj.__class__]
obj_still_exists = pk in changeset.created_objects[obj.__class__]
else:
obj_still_exists = pk not in changeset.deleted_existing.get(obj.__class__, ())

View file

@ -470,12 +470,12 @@ class BaseQueryWrapper(BaseWrapper):
if not segments:
# if the check is just 'pk' or the name or the name of the primary key, return the mathing object
if is_created_pk(filter_value):
return Q(pk__in=()), set([int(filter_value[1:])])
return Q(pk__in=()), set([filter_value])
return q, set()
elif segments == ['in']:
# if the check is 'pk__in' it's nearly as easy
return (Q(pk__in=tuple(pk for pk in filter_value if not is_created_pk(pk))),
set(int(pk[1:]) for pk in filter_value if is_created_pk(pk)))
set(pk for pk in filter_value if is_created_pk(pk)))
# check if we are filtering by a foreign key field
if isinstance(class_value, ForwardManyToOneDescriptor):
@ -579,7 +579,7 @@ class BaseQueryWrapper(BaseWrapper):
q |= Q(pk__in=tuple(pk for pk in r_added_pks if not is_created_pk(pk)))
# get created groups that were added to any of the spaces
created_pks = set(int(pk[1:]) for pk in r_added_pks if is_created_pk(pk))
created_pks = set(pk for pk in r_added_pks if is_created_pk(pk))
return q, created_pks
@ -601,11 +601,11 @@ class BaseQueryWrapper(BaseWrapper):
if is_created_pk(filter_value):
pks = add_pks
return (Q(pk__in=(pk for pk in pks if not is_created_pk(pk))),
set(int(pk[1:]) for pk in pks if is_created_pk(pk)))
set(pk for pk in pks if is_created_pk(pk)))
return (((q & ~Q(pk__in=(pk for pk in remove_pks if not is_created_pk(pk)))) |
Q(pk__in=(pk for pk in add_pks if not is_created_pk(pk)))),
set(int(pk[1:]) for pk in add_pks if is_created_pk(pk)))
set(pk for pk in add_pks if is_created_pk(pk)))
# sorry, no reverse lookup
raise NotImplementedError