add ETag to editor
This commit is contained in:
parent
85a0993799
commit
7a2ecb60ed
4 changed files with 31 additions and 7 deletions
|
@ -685,7 +685,13 @@ class ChangeSet(models.Model):
|
|||
|
||||
@property
|
||||
def cache_key_by_changes(self):
|
||||
return ':'.join(('editor:changeset', str(self.pk), MapUpdate.current_cache_key(), self.last_change_cache_key))
|
||||
return 'editor:changeset:' + self.raw_cache_key_by_changes
|
||||
|
||||
@property
|
||||
def raw_cache_key_by_changes(self):
|
||||
if self.pk is None:
|
||||
return MapUpdate.current_cache_key()
|
||||
return ':'.join((str(self.pk), MapUpdate.current_cache_key(), self.last_change_cache_key))
|
||||
|
||||
def get_absolute_url(self):
|
||||
if self.pk is None:
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
from functools import wraps
|
||||
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.http import HttpResponseNotModified, HttpResponseRedirect
|
||||
from django.shortcuts import render
|
||||
from django.views.decorators.cache import never_cache
|
||||
|
||||
from c3nav.editor.models import ChangeSet
|
||||
from c3nav.mapdata.models.access import AccessPermission
|
||||
|
||||
|
||||
def sidebar_view(func=None, select_related=None):
|
||||
|
@ -17,13 +18,22 @@ def sidebar_view(func=None, select_related=None):
|
|||
def with_ajax_check(request, *args, **kwargs):
|
||||
request.changeset = ChangeSet.get_for_request(request, select_related)
|
||||
|
||||
if request.is_ajax() or 'ajax' in request.GET:
|
||||
request.META.pop('HTTP_IF_NONE_MATCH', None)
|
||||
|
||||
response = func(request, *args, **kwargs)
|
||||
if request.is_ajax() or 'ajax' in request.GET:
|
||||
if isinstance(response, HttpResponseRedirect):
|
||||
return render(request, 'editor/redirect.html', {'target': response['location']})
|
||||
response.write(render(request, 'editor/fragment_nav.html', {}).content)
|
||||
if not isinstance(response, HttpResponseNotModified):
|
||||
response.write(render(request, 'editor/fragment_nav.html', {}).content)
|
||||
return response
|
||||
if isinstance(response, HttpResponseRedirect):
|
||||
return response
|
||||
return render(request, 'editor/map.html', {'content': response.content})
|
||||
return never_cache(with_ajax_check)
|
||||
|
||||
|
||||
def etag_func(request, *args, **kwargs):
|
||||
return (request.changeset.raw_cache_key_by_changes + ':' +
|
||||
AccessPermission.cache_key_for_request(request, with_update=False))
|
||||
|
|
|
@ -7,9 +7,10 @@ from django.db import models
|
|||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.urls import reverse
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.views.decorators.http import etag
|
||||
|
||||
from c3nav.editor.forms import GraphEdgeSettingsForm, GraphEditorActionForm, GraphEditorSettingsForm
|
||||
from c3nav.editor.views.base import sidebar_view
|
||||
from c3nav.editor.views.base import etag_func, sidebar_view
|
||||
|
||||
|
||||
def child_model(request, model: typing.Union[str, models.Model], kwargs=None, parent=None):
|
||||
|
@ -30,6 +31,7 @@ def child_model(request, model: typing.Union[str, models.Model], kwargs=None, pa
|
|||
|
||||
|
||||
@sidebar_view
|
||||
@etag(etag_func)
|
||||
def main_index(request):
|
||||
Level = request.changeset.wrap_model('Level')
|
||||
return render(request, 'editor/index.html', {
|
||||
|
@ -46,6 +48,7 @@ def main_index(request):
|
|||
|
||||
|
||||
@sidebar_view
|
||||
@etag(etag_func)
|
||||
def level_detail(request, pk):
|
||||
Level = request.changeset.wrap_model('Level')
|
||||
qs = Level.objects.filter(Level.q_for_request(request))
|
||||
|
@ -66,6 +69,7 @@ def level_detail(request, pk):
|
|||
|
||||
|
||||
@sidebar_view
|
||||
@etag(etag_func)
|
||||
def space_detail(request, level, pk):
|
||||
Space = request.changeset.wrap_model('Space')
|
||||
qs = Space.objects.filter(Space.q_for_request(request))
|
||||
|
@ -84,6 +88,7 @@ def space_detail(request, level, pk):
|
|||
|
||||
|
||||
@sidebar_view
|
||||
@etag(etag_func)
|
||||
def edit(request, pk=None, model=None, level=None, space=None, on_top_of=None, explicit_edit=False):
|
||||
model = request.changeset.wrap_model(model)
|
||||
related_name = model._meta.default_related_name
|
||||
|
@ -272,6 +277,7 @@ def edit(request, pk=None, model=None, level=None, space=None, on_top_of=None, e
|
|||
|
||||
|
||||
@sidebar_view
|
||||
@etag(etag_func)
|
||||
def list_objects(request, model=None, level=None, space=None, explicit_edit=False):
|
||||
if not request.resolver_match.url_name.endswith('.list'):
|
||||
raise ValueError('url_name does not end with .list')
|
||||
|
@ -401,6 +407,7 @@ def connect_nodes(request, active_node, clicked_node, edge_settings_form, graph_
|
|||
|
||||
|
||||
@sidebar_view
|
||||
@etag(etag_func)
|
||||
def graph_edit(request, level=None, space=None):
|
||||
Level = request.changeset.wrap_model('Level')
|
||||
Space = request.changeset.wrap_model('Space')
|
||||
|
@ -557,6 +564,7 @@ def graph_edit(request, level=None, space=None):
|
|||
|
||||
|
||||
@sidebar_view
|
||||
@etag(etag_func)
|
||||
def graph_editing_settings_view(request):
|
||||
ctx: dict = {
|
||||
'closemodal': False,
|
||||
|
|
|
@ -66,9 +66,9 @@ class AccessPermission(models.Model):
|
|||
return set(access_restriction_ids)
|
||||
|
||||
@classmethod
|
||||
def cache_key_for_request(cls, request):
|
||||
return '%s:%s' % (
|
||||
MapUpdate.current_cache_key(),
|
||||
def cache_key_for_request(cls, request, with_update=True):
|
||||
return (
|
||||
((MapUpdate.current_cache_key()+':') if with_update else '') +
|
||||
','.join(str(i) for i in sorted(AccessPermission.get_for_request(request)) or '0')
|
||||
)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue