cache changed_objects_data in changeset view
This commit is contained in:
parent
c85bd98faf
commit
2c053e3d0f
2 changed files with 33 additions and 18 deletions
|
@ -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 ''
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue