summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-04-04 16:42:09 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-04-04 16:42:09 +0200
commitc4645ed6ce59027e4b7ea96b82c08573f60ae46e (patch)
treed05c722bc0835ef44ccdbd4cb34d33613b764d46 /ishtar_common
parent39cf99e33581f23e25f3bd29fc263b4ca4c42adb (diff)
downloadIshtar-c4645ed6ce59027e4b7ea96b82c08573f60ae46e.tar.bz2
Ishtar-c4645ed6ce59027e4b7ea96b82c08573f60ae46e.zip
Admin: previous / next button for types
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/admin.py79
-rw-r--r--ishtar_common/templates/admin/change_form.html39
2 files changed, 117 insertions, 1 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index 95115860a..b8f3df637 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -26,6 +26,7 @@ from ajax_select.fields import AutoCompleteSelectField, \
from django.conf import settings
from django.conf.urls import url
from django.contrib import admin
+from django.contrib.admin.views.main import ChangeList
from django.contrib.auth.admin import GroupAdmin, UserAdmin
from django.contrib.auth.models import Group, User
from django.contrib.contenttypes.models import ContentType
@@ -39,8 +40,9 @@ from django.db.models.fields.related import ForeignKey
from django.forms import BaseInlineFormSet
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
-from django.template.defaultfilters import slugify
+from django.utils.decorators import method_decorator
from django.utils.translation import ugettext_lazy as _
+from django.views.decorators.csrf import csrf_protect
from django import forms
@@ -57,6 +59,8 @@ from archaeological_finds import forms as find_forms, \
forms_treatments as treatment_forms
from archaeological_warehouse import forms as warehouse_forms
+csrf_protect_m = method_decorator(csrf_protect)
+
ISHTAR_FORMS = [common_forms, file_pdl_forms, file_forms, operation_forms,
context_record_forms, find_forms, treatment_forms,
@@ -254,9 +258,27 @@ class GlobalVarAdmin(admin.ModelAdmin):
admin_site.register(models.GlobalVar, GlobalVarAdmin)
+class ChangeListForChangeView(ChangeList):
+ def get_filters_params(self, params=None):
+ """
+ Get the current list queryset parameters from _changelist_filters
+ """
+ filtered_params = {}
+ lookup_params = super(
+ ChangeListForChangeView, self).get_filters_params(params)
+ if '_changelist_filters' in lookup_params:
+ params = lookup_params.pop('_changelist_filters')
+ for param in params.split("&"):
+ key, value = param.split("=")
+ filtered_params[key] = value
+ return filtered_params
+
+
class GeneralTypeAdmin(admin.ModelAdmin):
list_display = ['label', 'txt_idx', 'available', 'comment']
search_fields = ('label', 'txt_idx', 'comment',)
+ list_filter = ('available',)
+ save_on_top = True
actions = [export_as_csv_action()]
prepopulated_fields = {"txt_idx": ("label",)}
change_list_template = "admin/gen_change_list.html"
@@ -268,6 +290,61 @@ class GeneralTypeAdmin(admin.ModelAdmin):
]
return my_urls + urls
+ @csrf_protect_m
+ def get_changelist_queryset(self, request):
+ """
+ Get the changelist queryset to be used in the change view.
+ Used by previous and next button.
+ Mainly a copy from:
+ django/contrib/admin/options.py ModelAdmin->changelist_view
+ """
+ list_display = self.get_list_display(request)
+ list_display_links = self.get_list_display_links(request, list_display)
+ list_filter = self.get_list_filter(request)
+ search_fields = self.get_search_fields(request)
+ list_select_related = self.get_list_select_related(request)
+
+ cl = ChangeListForChangeView(
+ request, self.model, list_display,
+ list_display_links, list_filter, self.date_hierarchy,
+ search_fields, list_select_related, self.list_per_page,
+ self.list_max_show_all, self.list_editable, self,
+ )
+ return cl.get_queryset(request)
+
+ def change_view(self, request, object_id, form_url='', extra_context=None):
+ """
+ Next and previous button on the change view
+ """
+ if not extra_context:
+ extra_context = {}
+ ids = list(self.get_changelist_queryset(request).values('pk'))
+ previous, current_is_reached, first = None, False, None
+ extra_context['get_attr'] = ""
+ if request.GET:
+ extra_context['get_attr'] = "?" + request.GET.urlencode()
+ for v in ids:
+ pk = str(v['pk'])
+ if pk == object_id:
+ current_is_reached = True
+ if previous:
+ extra_context['previous_item'] = previous
+ elif current_is_reached:
+ extra_context['next_item'] = pk
+ break
+ else:
+ if not first:
+ first = pk
+ previous = pk
+ if 'previous_item' not in extra_context and \
+ 'next_item' not in extra_context and first:
+ # on modify current object do not match current criteria
+ # next is the first item
+ extra_context['next_item'] = first
+
+ return super(GeneralTypeAdmin, self).change_view(
+ request, object_id, form_url, extra_context)
+
def import_generic(self, request):
form = None
diff --git a/ishtar_common/templates/admin/change_form.html b/ishtar_common/templates/admin/change_form.html
new file mode 100644
index 000000000..f5c83faa6
--- /dev/null
+++ b/ishtar_common/templates/admin/change_form.html
@@ -0,0 +1,39 @@
+{% extends "admin/change_form.html" %}
+{% load i18n admin_urls static admin_list %}
+
+{% block extrahead %}
+{{ block.super }}
+<style>
+.object-tools a.disabled:link, .object-tools a.disabled:visited,
+.object-tools a.disabled:focus, .object-tools a.disabled:hover {
+ background: #ccc;
+ color: #eee;
+ pointer-events: none;
+}
+</style>
+{% endblock %}
+
+ {% block object-tools-items %}
+ <li>
+ {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
+ <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>
+ </li>
+ {% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %}
+ <li>{% if previous_item %}
+ <a href="{% url opts|admin_urlname:'change' previous_item %}{{get_attr}}">
+ {% trans "Previous" %}
+ </a>{% else %}
+ <a href="#" class="disabled">
+ {% trans "Previous" %}
+ </a>
+ {% endif %}</li>
+ <li>{% if next_item %}
+ <a href="{% url opts|admin_urlname:'change' next_item %}{{get_attr}}">
+ {% trans "Next" %}
+ </a>{% else %}
+ <a href="#" class="disabled">
+ {% trans "Next" %}
+ </a>
+ {% endif %}
+ </li>
+ {% endblock %}