diff options
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 |
commit | c4645ed6ce59027e4b7ea96b82c08573f60ae46e (patch) | |
tree | d05c722bc0835ef44ccdbd4cb34d33613b764d46 /ishtar_common/admin.py | |
parent | 39cf99e33581f23e25f3bd29fc263b4ca4c42adb (diff) | |
download | Ishtar-c4645ed6ce59027e4b7ea96b82c08573f60ae46e.tar.bz2 Ishtar-c4645ed6ce59027e4b7ea96b82c08573f60ae46e.zip |
Admin: previous / next button for types
Diffstat (limited to 'ishtar_common/admin.py')
-rw-r--r-- | ishtar_common/admin.py | 79 |
1 files changed, 78 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 |