django-constance/constance/admin.py

119 lines
3.9 KiB
Python
Raw Normal View History

2010-08-23 15:23:38 +00:00
from operator import itemgetter
2010-11-10 03:07:53 +00:00
from time import time
2010-08-23 14:18:44 +00:00
2010-11-10 03:07:53 +00:00
from django import forms
2010-08-23 12:49:54 +00:00
from django.contrib import admin
2010-11-10 03:07:53 +00:00
from django.contrib.admin import widgets
from django.contrib.admin.options import csrf_protect_m
from django.conf import settings
2010-08-23 12:49:54 +00:00
from django.conf.urls.defaults import patterns, url
2010-08-23 14:40:01 +00:00
from django.core.urlresolvers import reverse
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.functional import update_wrapper
from django.utils.formats import localize
from django.utils.translation import ugettext_lazy as _
2010-08-23 12:49:54 +00:00
from constance import config
2010-09-03 14:18:17 +00:00
NUMERIC_WIDGET = forms.TextInput(attrs={'size': 10})
2010-08-23 12:49:54 +00:00
2010-08-23 14:18:44 +00:00
FIELDS = {
bool: (fields.BooleanField, {'required': False}),
2010-09-03 14:18:17 +00:00
int: (fields.IntegerField, {'widget': NUMERIC_WIDGET}),
long: (fields.IntegerField, {'widget': NUMERIC_WIDGET}),
Decimal: (fields.DecimalField, {'widget': NUMERIC_WIDGET}),
str: (fields.CharField, {'widget': forms.TextInput(attrs={'size': 25})}),
2010-08-25 11:16:58 +00:00
datetime: (fields.DateTimeField, {'widget': AdminSplitDateTime}),
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.CONSTANCE_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):
@property
def urls(self):
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.module_name
urlpatterns = patterns('',
url(r'^$',
wrap(self.changelist_view),
name='%s_%s_changelist' % info),
)
return urlpatterns
def changelist_view(self, request):
2010-08-23 14:40:01 +00:00
form = ConstanceForm(
initial=dict( (name, getattr(config, name)) for name in settings.CONSTANCE_CONFIG)
)
if request.method == 'POST':
form = ConstanceForm(request.POST)
if form.is_valid():
form.save()
self.message_user(request, 'Live settings updated successfully.')
return HttpResponseRedirect('#')
2010-08-23 12:49:54 +00:00
context = {
'config': [],
'root_path': self.admin_site.root_path,
'title': 'Live settings',
'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
}
2010-08-23 14:18:44 +00:00
for name, (default, help_text) in settings.CONSTANCE_CONFIG.items():
2010-08-23 12:49:54 +00:00
context['config'].append({
'name': name,
'default': default,
'help_text': help_text,
'value': getattr(config, name),
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-08-23 14:18:44 +00:00
2010-08-23 12:49:54 +00:00
return render_to_response(
'admin/constance/change_list.html',
context,
context_instance=RequestContext(request)
)
def has_add_permission(self, *args, **kwargs):
return False
def has_delete_permission(self, *args, **kwargs):
return False
def has_change_permission(self, *args, **kwargs):
return True
class Config(object):
class Meta(object):
app_label = 'constance'
module_name = 'config'
verbose_name_plural = 'config'
2010-08-25 11:16:58 +00:00
get_ordered_objects = lambda x: True
2010-08-23 12:49:54 +00:00
_meta = Meta()
admin.site.register([Config], ConstanceAdmin)