respect object with only changed redirect slugs in changeset view and count

This commit is contained in:
Laura Klünder 2017-06-29 13:20:35 +02:00
parent defd7b1da3
commit 51f589835b
2 changed files with 31 additions and 8 deletions

View file

@ -4,7 +4,6 @@ from operator import attrgetter
from django.apps import apps from django.apps import apps
from django.conf import settings from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.db import models from django.db import models
from django.db.models import Max, Q from django.db.models import Max, Q
from django.urls import reverse from django.urls import reverse
@ -178,6 +177,10 @@ class ChangeSet(models.Model):
model_objects[pk] = self.get_created_object(model, pk, allow_deleted=True)._obj model_objects[pk] = self.get_created_object(model, pk, allow_deleted=True)._obj
objects[model] = model_objects objects[model] = model_objects
# add LocationSlug objects as their correct model
for pk, obj in objects.get(LocationSlug, {}).items():
objects.setdefault(obj.__class__, {})[pk] = obj
return objects return objects
""" """
@ -246,13 +249,22 @@ class ChangeSet(models.Model):
@property @property
def changed_objects_count(self): def changed_objects_count(self):
""" """
Get the number of changed objects. Does not need a query if cache is already filled. Get the number of changed objects.
""" """
if self.changed_objects is None: self.fill_changes_cache()
location_redirect_type = ContentType.objects.get_for_model(LocationRedirect) count = 0
return self.relevant_changed_objects().exclude(content_type=location_redirect_type).count() changed_locationslug_pks = set()
for model, objects in self.changed_objects.items():
if issubclass(model, LocationSlug):
if model == LocationRedirect:
continue
changed_locationslug_pks.update(objects.keys())
count += len(objects)
return sum((len(objects) for model, objects in self.changed_objects.items() if model != LocationRedirect)) changed_locationslug_pks ^= set(obj.updated_fields['target']
for obj in self.changed_objects.get(LocationRedirect, {}).values())
count += len(changed_locationslug_pks)
return count
@property @property
def count_display(self): def count_display(self):

View file

@ -1,3 +1,4 @@
from itertools import chain
from operator import itemgetter from operator import itemgetter
from django.conf import settings from django.conf import settings
@ -56,7 +57,17 @@ def changeset_detail(request, pk):
redirect_list = (removed_redirects if changed_object.deleted else added_redirects) redirect_list = (removed_redirects if changed_object.deleted else added_redirects)
redirect_list.setdefault(values['target'], []).append(values['slug']) redirect_list.setdefault(values['target'], []).append(values['slug'])
for model, changed_objects in changeset.changed_objects.items(): redirect_changed_objects = []
for pk in set(added_redirects.keys()) | set(removed_redirects.keys()):
obj = objects[LocationSlug][pk]
model = obj.__class__
try:
changeset.changed_objects[model][pk]
except KeyError:
redirect_changed_objects.append((model, {pk: changeset.get_changed_object(obj)}))
for model, changed_objects in chain(changeset.changed_objects.items(), redirect_changed_objects):
if model == LocationRedirect: if model == LocationRedirect:
continue continue
@ -87,7 +98,7 @@ def changeset_detail(request, pk):
'title': obj.title if getattr(obj, 'titles', None) else None, 'title': obj.title if getattr(obj, 'titles', None) else None,
'changes': changes, 'changes': changes,
'edit_url': edit_url, 'edit_url': edit_url,
'order': changed_object.created, 'order': (changed_object.deleted and changed_object.is_created, not changed_object.is_created),
} }
changed_objects_data.append(changed_object_data) changed_objects_data.append(changed_object_data)