cache changed_objects_data in changeset view

This commit is contained in:
Laura Klünder 2017-07-06 00:18:43 +02:00
parent c85bd98faf
commit 2c053e3d0f
2 changed files with 33 additions and 18 deletions

View file

@ -412,15 +412,20 @@ class ChangeSet(models.Model):
{'num': self.changed_objects_count}) {'num': self.changed_objects_count})
@property @property
def updates_cache_key(self): def last_update_cache_key(self):
last_update = self.created if self.last_update_id is None else self.last_update.datetime last_update = self.created if self.last_update_id is None else self.last_update.datetime
return (int_to_base36(self.last_update_id or 0)+'_'+int_to_base36(int(make_naive(last_update).timestamp()))) return (int_to_base36(self.last_update_id or 0)+'_'+int_to_base36(int(make_naive(last_update).timestamp())))
@property @property
def changes_cache_key(self): def last_change_cache_key(self):
last_change = self.created if self.last_change_id is None else self.last_change.datetime last_change = self.created if self.last_change_id is None else self.last_change.datetime
return (int_to_base36(self.last_change_id or 0)+'_'+int_to_base36(int(make_naive(last_change).timestamp()))) return (int_to_base36(self.last_change_id or 0)+'_'+int_to_base36(int(make_naive(last_change).timestamp())))
@property
def cache_key_by_changes(self):
return ':'.join(('editor:changeset_view_data', str(self.pk),
MapUpdate.cache_key(), self.last_change_cache_key))
def get_absolute_url(self): def get_absolute_url(self):
if self.pk is None: if self.pk is None:
return '' return ''

View file

@ -3,10 +3,12 @@ from operator import itemgetter
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.core.cache import cache
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.utils.text import format_lazy
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from c3nav.editor.forms import ChangeSetForm, RejectForm from c3nav.editor.forms import ChangeSetForm, RejectForm
@ -16,7 +18,7 @@ from c3nav.editor.views.base import sidebar_view
from c3nav.mapdata.models.locations import LocationRedirect, LocationSlug from c3nav.mapdata.models.locations import LocationRedirect, LocationSlug
@sidebar_view(select_related=('last_update', 'last_state_update', 'author')) @sidebar_view(select_related=('last_update', 'last_state_update', 'last_change', 'author'))
def changeset_detail(request, pk): def changeset_detail(request, pk):
changeset = request.changeset changeset = request.changeset
active = True active = True
@ -156,6 +158,24 @@ def changeset_detail(request, pk):
'obj_title': changeset.title, 'obj_title': changeset.title,
}) })
ctx = {
'changeset': changeset,
'can_edit': can_edit,
'can_delete': can_delete,
'can_propose': changeset.can_propose(request),
'can_unpropose': changeset.can_unpropose(request),
'can_start_review': changeset.can_start_review(request),
'can_end_review': changeset.can_end_review(request),
'can_unreject': changeset.can_unreject(request),
'active': active,
}
cache_key = changeset.cache_key_by_changes
changed_objects_data = cache.get(cache_key)
if changed_objects_data:
ctx['changed_objects'] = changed_objects_data
return render(request, 'editor/changeset.html', ctx)
changeset.fill_changes_cache(include_deleted_created=True) changeset.fill_changes_cache(include_deleted_created=True)
objects = changeset.get_objects() objects = changeset.get_objects()
@ -188,7 +208,7 @@ def changeset_detail(request, pk):
for pk, changed_object in changed_objects.items(): for pk, changed_object in changed_objects.items():
obj = objects[model][pk] obj = objects[model][pk]
obj_desc = _('%(model)s #%(id)s') % {'model': obj.__class__._meta.verbose_name, 'id': pk} obj_desc = format_lazy(_('{model} #{id}'), model=obj.__class__._meta.verbose_name, id=pk)
if is_created_pk(pk): if is_created_pk(pk):
obj_still_exists = pk in changeset.created_objects.get(obj.__class__, ()) obj_still_exists = pk in changeset.created_objects.get(obj.__class__, ())
else: else:
@ -244,7 +264,7 @@ def changeset_detail(request, pk):
else: else:
if name.startswith('title_'): if name.startswith('title_'):
lang = name[6:] lang = name[6:]
field_title = _('Title (%(lang)s)') % {'lang': dict(settings.LANGUAGES).get(lang, lang)} field_title = format_lazy(_('Title ({lang})'), lang=dict(settings.LANGUAGES).get(lang, lang))
field_value = str(value) field_value = str(value)
if field_value: if field_value:
obj.titles[lang] = field_value obj.titles[lang] = field_value
@ -269,7 +289,7 @@ def changeset_detail(request, pk):
}) })
if not field_value: if not field_value:
change_data.update({ change_data.update({
'title': _('remove %(field_title)s') % {'field_title': field_title}, 'title': format_lazy(_('remove {field_title}'), field_title=field_title),
}) })
else: else:
change_data.update({ change_data.update({
@ -318,18 +338,8 @@ def changeset_detail(request, pk):
changed_objects_data = sorted(changed_objects_data, key=itemgetter('order')) changed_objects_data = sorted(changed_objects_data, key=itemgetter('order'))
ctx = { cache.set(cache_key, changed_objects_data, 300)
'changeset': changeset, ctx['changed_objects'] = changed_objects_data
'can_edit': can_edit,
'can_delete': can_delete,
'can_propose': changeset.can_propose(request),
'can_unpropose': changeset.can_unpropose(request),
'can_start_review': changeset.can_start_review(request),
'can_end_review': changeset.can_end_review(request),
'can_unreject': changeset.can_unreject(request),
'active': active,
'changed_objects': changed_objects_data,
}
return render(request, 'editor/changeset.html', ctx) return render(request, 'editor/changeset.html', ctx)