Files
vapemap/app/stores/admin.py

171 lines
6.5 KiB
Python

from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.shortcuts import render_to_response
from django import forms
from django.db import transaction
from django.db.models import Count
from django.contrib import admin
from django.contrib.contenttypes.generic import GenericStackedInline
from .models import Chain, Store, Address, Brand, ClaimRequest, Link, LinkType, County, Country
class LinkInlineAdmin(GenericStackedInline):
model = Link
ct_field = 'object_type'
class ChainAdmin(admin.ModelAdmin):
list_filter = ['active']
list_display = ['name']
prepopulated_fields = {"slug": ("name",)}
search_fields = ['name']
inlines = [
LinkInlineAdmin,
]
class StoreAdmin(admin.ModelAdmin):
list_filter = ['chain', 'active']
list_display = ['name', 'store_type', 'active']
prepopulated_fields = {"slug": ("name",)}
search_fields = ['name']
inlines = [
LinkInlineAdmin,
]
actions = ['add_brand', 'set_chain']
class AddBrandForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
brand = forms.ModelChoiceField(Brand.objects)
def add_brand(self, request, queryset):
form = None
if 'apply' in request.POST:
form = self.AddBrandForm(request.POST)
if form.is_valid():
count = queryset.count()
brand = form.cleaned_data['brand']
with transaction.commit_on_success():
for store in queryset:
store.brands.add(brand)
if count > 1:
plural = 's'
else:
plural = ''
self.message_user(request, "Successfully added %s to %d store%s." % (brand, count, plural))
return HttpResponseRedirect(request.get_full_path())
if not form:
form = self.AddBrandForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
return render_to_response('admin/add_brand.html', {'stores': queryset, 'brand_form': form }, RequestContext(request))
add_brand.short_description = "Add brand to the selected stores"
class SetChainForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
chain = forms.ModelChoiceField(Chain.objects)
def set_chain(self, request, queryset):
form = None
if 'apply' in request.POST:
form = self.SetChainForm(request.POST)
if form.is_valid():
count = queryset.count()
chain = form.cleaned_data['chain']
with transaction.commit_on_success():
for store in queryset:
store.chain = chain
store.save()
if count > 1:
plural = 's'
else:
plural = ''
self.message_user(request, "Successfully set %d store%s to %s." % (count, plural, chain))
return HttpResponseRedirect(request.get_full_path())
if not form:
form = self.SetChainForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
return render_to_response('admin/set_chain.html', {'stores': queryset, 'chain_form': form }, RequestContext(request))
set_chain.short_description = "Set the selected store's chain"
class ClaimAdmin(admin.ModelAdmin):
list_filter = ['status']
list_display = ['generic_obj', 'user', 'status', 'note']
actions = ['approve_request']
def approve_request(self, request, queryset):
qs = queryset.filter(status=ClaimRequest.CLAIM_STATUS_PENDING)
for obj in qs:
obj.status = ClaimRequest.CLAIM_STATUS_APPROVED
target = obj.generic_obj
target.editor = obj.user
target.save()
obj.save()
if qs.count() == 1:
message_bit = "1 request was"
else:
message_bit = "%s requests were" % qs.count()
self.message_user(request, "%s successfully approved." % message_bit)
approve_request.short_description = 'Approve selected requests.'
class CountyAdmin(admin.ModelAdmin):
list_display = ['pk', 'name', 'country', 'address_count']
actions = ['set_country']
def address_count(self, obj):
return obj.address_count
address_count.admin_order_field = 'address_count'
def queryset(self, request):
qs = super(CountyAdmin, self).queryset(request)
return qs.annotate(address_count=Count('addresses'))
class SetCountryForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
country = forms.ModelChoiceField(Country.objects)
def set_country(self, request, queryset):
form = None
if 'apply' in request.POST:
form = self.SetCountryForm(request.POST)
if form.is_valid():
country = form.cleaned_data['country']
with transaction.commit_on_success():
for county in queryset:
county.country = country
county.save()
self.message_user(request, "Successfully set %d counties to %s." % (queryset.count(), country))
return HttpResponseRedirect(request.get_full_path())
if not form:
form = self.SetCountryForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
return render_to_response('admin/set_country.html', {'stores': queryset, 'country_form': form}, RequestContext(request))
set_country.short_description = "Set the selected county's country"
class CountryAdmin(admin.ModelAdmin):
list_display = ['pk', 'name', 'address_count', 'county_count']
def address_count(self, obj):
return obj.address_count
address_count.admin_order_field = 'address_count'
def county_count(self, obj):
return obj.county_count
county_count.admin_order_field = 'county_count'
def queryset(self, request):
qs = super(CountryAdmin, self).queryset(request)
return qs.annotate(address_count=Count('addresses'), county_count=Count('counties'))
admin.site.register(Chain, ChainAdmin)
admin.site.register(Store, StoreAdmin)
admin.site.register(Address, admin.ModelAdmin)
admin.site.register(Brand, admin.ModelAdmin)
admin.site.register(ClaimRequest, ClaimAdmin)
admin.site.register(LinkType, admin.ModelAdmin)
admin.site.register(County, CountyAdmin)
admin.site.register(Country, CountryAdmin)