respect object with only changed redirect slugs in changeset view and count
This commit is contained in:
parent
defd7b1da3
commit
51f589835b
2 changed files with 31 additions and 8 deletions
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue