django-constance/constance/admin.py

145 lines
5.2 KiB
Python
Raw Normal View History

from datetime import datetime, date, time
from decimal import Decimal
2010-08-23 15:23:38 +00:00
from operator import itemgetter
2010-08-23 14:18:44 +00:00
2010-11-10 03:07:53 +00:00
from django import forms
from django.contrib import admin, messages
2010-11-10 03:07:53 +00:00
from django.contrib.admin import widgets
from django.contrib.admin.options import csrf_protect_m
2012-09-03 00:27:32 +00:00
from django.conf.urls import patterns, url
from django.core.exceptions import PermissionDenied
2010-08-23 14:18:44 +00:00
from django.forms import fields
2010-11-10 03:07:53 +00:00
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from django.utils.formats import localize
2011-08-17 09:25:26 +00:00
from django.utils.translation import ugettext as _
2010-08-23 12:49:54 +00:00
from constance import config, settings
2010-08-23 12:49:54 +00:00
2010-09-03 14:18:17 +00:00
NUMERIC_WIDGET = forms.TextInput(attrs={'size': 10})
2010-08-23 12:49:54 +00:00
INTEGER_LIKE = (fields.IntegerField, {'widget': NUMERIC_WIDGET})
2012-06-13 11:22:31 +00:00
STRING_LIKE = (fields.CharField, {'widget': forms.Textarea(attrs={'rows': 3}), 'required': False})
2010-08-23 14:18:44 +00:00
FIELDS = {
bool: (fields.BooleanField, {'required': False}),
int: INTEGER_LIKE,
long: INTEGER_LIKE,
2010-09-03 14:18:17 +00:00
Decimal: (fields.DecimalField, {'widget': NUMERIC_WIDGET}),
str: STRING_LIKE,
unicode: STRING_LIKE,
datetime: (fields.DateTimeField, {'widget': widgets.AdminSplitDateTime}),
date: (fields.DateField, {'widget': widgets.AdminDateWidget}),
time: (fields.TimeField, {'widget': widgets.AdminTimeWidget}),
2010-09-03 14:18:17 +00:00
float: (fields.FloatField, {'widget': NUMERIC_WIDGET}),
2010-08-23 14:18:44 +00:00
}
class ConstanceForm(forms.Form):
def __init__(self, *args, **kwargs):
super(ConstanceForm, self).__init__(*args, **kwargs)
for name, (default, help_text) in settings.CONFIG.items():
field_class, kwargs = FIELDS[type(default)]
self.fields[name] = field_class(label=name, **kwargs)
2010-08-23 14:18:44 +00:00
2010-08-23 14:40:01 +00:00
def save(self):
for name in self.cleaned_data:
setattr(config, name, self.cleaned_data[name])
2010-08-23 14:18:44 +00:00
2010-08-23 12:49:54 +00:00
class ConstanceAdmin(admin.ModelAdmin):
2010-11-10 03:10:49 +00:00
def get_urls(self):
2010-08-23 12:49:54 +00:00
info = self.model._meta.app_label, self.model._meta.module_name
2010-11-10 03:10:49 +00:00
return patterns('',
2010-08-23 12:49:54 +00:00
url(r'^$',
2010-11-10 03:10:49 +00:00
self.admin_site.admin_view(self.changelist_view),
name='%s_%s_changelist' % info
),
2011-09-21 14:24:15 +00:00
url(r'^$',
self.admin_site.admin_view(self.changelist_view),
name='%s_%s_add' % info
),
2010-08-23 12:49:54 +00:00
)
2010-11-10 03:10:49 +00:00
@csrf_protect_m
def changelist_view(self, request, extra_context=None):
# First load a mapping between config name and default value
if not self.has_change_permission(request, None):
raise PermissionDenied
default_initial = ((name, default)
for name, (default, help_text) in settings.CONFIG.iteritems())
# Then update the mapping with actually values from the backend
initial = dict(default_initial,
**dict(config._backend.mget(settings.CONFIG.keys())))
form = ConstanceForm(initial=initial)
2010-08-23 14:40:01 +00:00
if request.method == 'POST':
form = ConstanceForm(request.POST)
if form.is_valid():
form.save()
# In django 1.5 this can be replaced with self.message_user
messages.add_message(
request,
messages.SUCCESS,
_('Live settings updated successfully.'),
)
return HttpResponseRedirect('.')
2010-08-23 12:49:54 +00:00
context = {
'config': [],
'title': _('Constance config'),
2010-08-23 12:49:54 +00:00
'app_label': 'constance',
'opts': Config._meta,
2010-08-23 14:18:44 +00:00
'form': form,
2010-08-25 11:16:58 +00:00
'media': self.media + form.media,
2010-08-23 12:49:54 +00:00
}
for name, (default, help_text) in settings.CONFIG.iteritems():
# First try to load the value from the actual backend
value = initial.get(name)
# Then if the returned value is None, get the default
if value is None:
value = getattr(config, name)
2010-08-23 12:49:54 +00:00
context['config'].append({
'name': name,
'default': localize(default),
'help_text': _(help_text),
'value': localize(value),
'modified': value != default,
2010-08-23 14:18:44 +00:00
'form_field': form[name]
2010-08-23 12:49:54 +00:00
})
2010-08-23 15:23:38 +00:00
context['config'].sort(key=itemgetter('name'))
2010-11-10 03:10:49 +00:00
context_instance = RequestContext(request, current_app=self.admin_site.name)
return render_to_response('admin/constance/change_list.html',
context, context_instance=context_instance)
2010-08-23 12:49:54 +00:00
def has_add_permission(self, *args, **kwargs):
return False
def has_delete_permission(self, *args, **kwargs):
return False
def has_change_permission(self, request, obj=None):
if settings.SUPERUSER_ONLY:
return request.user.is_superuser
else:
return super(ConstanceAdmin, self).has_change_permission(request, obj)
2010-08-23 12:49:54 +00:00
class Config(object):
class Meta(object):
app_label = 'constance'
model_name = module_name = 'config'
2010-08-23 12:49:54 +00:00
verbose_name_plural = 'config'
2010-11-10 03:12:39 +00:00
get_ordered_objects = lambda x: False
2011-02-23 15:39:58 +00:00
abstract = False
2013-01-19 16:27:35 +00:00
swapped = False
def get_change_permission(self):
return 'change_%s' % self.model_name
2010-08-23 12:49:54 +00:00
_meta = Meta()
admin.site.register([Config], ConstanceAdmin)