From f1854c8b6680c87e6f9ff7c4967c4e729c8eecc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 22 Jun 2017 22:47:22 +0200 Subject: [PATCH] don't store created pks as int --- src/c3nav/editor/models/change.py | 4 +--- src/c3nav/editor/models/changeset.py | 31 +++++++++++++--------------- src/c3nav/editor/views/changes.py | 2 +- src/c3nav/editor/wrappers.py | 10 ++++----- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/c3nav/editor/models/change.py b/src/c3nav/editor/models/change.py index 143f4cc5..8477b5e4 100644 --- a/src/c3nav/editor/models/change.py +++ b/src/c3nav/editor/models/change.py @@ -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): diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index 57eeab71..f4c08618 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -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(): diff --git a/src/c3nav/editor/views/changes.py b/src/c3nav/editor/views/changes.py index 177e2514..5df6228b 100644 --- a/src/c3nav/editor/views/changes.py +++ b/src/c3nav/editor/views/changes.py @@ -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__, ()) diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index d50a4e29..c34f6ba1 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -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