mirror of
https://github.com/jazzband/django-categories.git
synced 2026-05-05 14:14:46 +00:00
Removed unused code files
This commit is contained in:
parent
1e546b6309
commit
6693d8dad3
3 changed files with 0 additions and 343 deletions
|
|
@ -1,4 +0,0 @@
|
|||
#from feincms.admin.item_editor import ItemEditor, ItemEditorForm
|
||||
from tree_editor import TreeEditor, ajax_editable_boolean, \
|
||||
ajax_editable_boolean_cell, django_boolean_icon
|
||||
from splitpane_editor import SplitPaneEditor
|
||||
|
|
@ -1,200 +0,0 @@
|
|||
import re
|
||||
|
||||
from django import forms, template
|
||||
from django.contrib import admin
|
||||
from django.contrib.admin import helpers
|
||||
from django.contrib.admin.util import unquote
|
||||
from django.db.models import loading
|
||||
from django.forms.formsets import all_valid
|
||||
from django.forms.models import modelform_factory, inlineformset_factory
|
||||
from django.http import HttpResponseRedirect, Http404
|
||||
from django.shortcuts import render_to_response
|
||||
from django.utils.encoding import force_unicode
|
||||
from django.utils.functional import curry
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
import settings
|
||||
|
||||
FRONTEND_EDITING_MATCHER = re.compile(r'(\d+)/(\w+)/(\d+)')
|
||||
|
||||
|
||||
class ItemEditorForm(forms.ModelForm):
|
||||
region = forms.CharField(widget=forms.HiddenInput())
|
||||
ordering = forms.IntegerField(widget=forms.HiddenInput())
|
||||
|
||||
|
||||
class ItemEditor(admin.ModelAdmin):
|
||||
"""
|
||||
This ModelAdmin class needs an attribute:
|
||||
|
||||
show_on_top::
|
||||
A list of fields which should be displayed at the top of the form.
|
||||
This does not need to (and should not) include ``template''
|
||||
"""
|
||||
|
||||
def _formfield_callback(self, request):
|
||||
if settings.DJANGO10_COMPAT:
|
||||
# This should compare for Django SVN before [9761] (From 2009-01-16),
|
||||
# but I don't care that much. Doesn't work with git checkouts anyway, so...
|
||||
return self.formfield_for_dbfield
|
||||
else:
|
||||
return curry(self.formfield_for_dbfield, request=request)
|
||||
|
||||
def _frontend_editing_view(self, request, cms_id, content_type, content_id):
|
||||
"""
|
||||
This view is used strictly for frontend editing -- it is not used inside the
|
||||
standard administration interface.
|
||||
"""
|
||||
|
||||
try:
|
||||
model_cls = loading.get_model(self.model._meta.app_label, content_type)
|
||||
obj = model_cls.objects.get(parent=cms_id, id=content_id)
|
||||
except:
|
||||
raise Http404
|
||||
|
||||
form_class_base = getattr(model_cls, 'item_editor_form', ItemEditorForm)
|
||||
|
||||
ModelForm = modelform_factory(model_cls,
|
||||
exclude=('parent', 'region', 'ordering'),
|
||||
form=form_class_base,
|
||||
formfield_callback=self._formfield_callback(request=request))
|
||||
|
||||
# we do not want to edit these two fields in the frontend editing mode; we are
|
||||
# strictly editing single content blocks there.
|
||||
# We have to remove them from the form because we explicitly redefined them in
|
||||
# the ItemEditorForm definition above. Just using exclude is not enough.
|
||||
del ModelForm.base_fields['region']
|
||||
del ModelForm.base_fields['ordering']
|
||||
|
||||
if request.method == 'POST':
|
||||
# The prefix is used to replace the formset identifier from the ItemEditor
|
||||
# interface. Customization of the form is easily possible through either matching
|
||||
# the prefix (frontend editing) or the formset identifier (ItemEditor) as it is
|
||||
# done in the richtext and mediafile init.html item editor includes.
|
||||
form = ModelForm(request.POST, instance=obj, prefix=content_type)
|
||||
|
||||
if form.is_valid():
|
||||
obj = form.save()
|
||||
|
||||
return render_to_response('admin/editor/editor_done.html', {
|
||||
'content': obj.render(request=request),
|
||||
'identifier': obj.fe_identifier(),
|
||||
'MEDIA_PATH': settings.MEDIA_PATH,
|
||||
'MEDIA_HOTLINKING': settings.MEDIA_HOTLINKING,
|
||||
})
|
||||
else:
|
||||
form = ModelForm(instance=obj, prefix=content_type)
|
||||
|
||||
return render_to_response('admin/editor/editor.html', {
|
||||
'frontend_editing': True,
|
||||
'title': _('Change %s') % force_unicode(model_cls._meta.verbose_name),
|
||||
'object': obj,
|
||||
'form': form,
|
||||
'is_popup': True,
|
||||
'media': self.media,
|
||||
'MEDIA_PATH': settings.MEDIA_PATH,
|
||||
'MEDIA_HOTLINKING': settings.MEDIA_HOTLINKING,
|
||||
}, context_instance=template.RequestContext(request,
|
||||
processors=self.model.item_editor_context_processors))
|
||||
|
||||
def change_view(self, request, object_id, extra_context=None):
|
||||
self.model._needs_content_types()
|
||||
|
||||
# Recognize frontend editing requests
|
||||
# This is done here so that the developer does not need to add additional entries to
|
||||
# urls.py or something...
|
||||
res = FRONTEND_EDITING_MATCHER.search(object_id)
|
||||
|
||||
if res:
|
||||
return self._frontend_editing_view(request, res.group(1), res.group(2), res.group(3))
|
||||
|
||||
ModelForm = modelform_factory(self.model, exclude=('parent',),
|
||||
formfield_callback=self._formfield_callback(request=request),
|
||||
form=self.form)
|
||||
|
||||
# generate a formset type for every concrete content type
|
||||
inline_formset_types = [(
|
||||
content_type,
|
||||
inlineformset_factory(self.model, content_type, extra=1,
|
||||
form=getattr(content_type, 'item_editor_form', ItemEditorForm),
|
||||
formfield_callback=self._formfield_callback(request=request))
|
||||
) for content_type in self.model._editor_content_types]
|
||||
|
||||
opts = self.model._meta
|
||||
try:
|
||||
obj = self.model._default_manager.get(pk=unquote(object_id))
|
||||
except self.model.DoesNotExist:
|
||||
raise Http404
|
||||
|
||||
if not self.has_change_permission(request, obj):
|
||||
raise PermissionDenied
|
||||
|
||||
if request.method == 'POST':
|
||||
model_form = ModelForm(request.POST, request.FILES, instance=obj)
|
||||
|
||||
inline_formsets = [
|
||||
formset_class(request.POST, request.FILES, instance=obj,
|
||||
prefix=content_type.__name__.lower())
|
||||
for content_type, formset_class in inline_formset_types]
|
||||
|
||||
if model_form.is_valid() and all_valid(inline_formsets):
|
||||
model_form.save()
|
||||
for formset in inline_formsets:
|
||||
formset.save()
|
||||
|
||||
msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
|
||||
if request.POST.has_key("_continue"):
|
||||
self.message_user(request, msg + ' ' + _("You may edit it again below."))
|
||||
return HttpResponseRedirect('.')
|
||||
elif request.POST.has_key('_addanother'):
|
||||
self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
|
||||
return HttpResponseRedirect("../add/")
|
||||
else:
|
||||
self.message_user(request, msg)
|
||||
return HttpResponseRedirect("../")
|
||||
else:
|
||||
model_form = ModelForm(instance=obj)
|
||||
inline_formsets = [
|
||||
formset_class(instance=obj, prefix=content_type.__name__.lower())
|
||||
for content_type, formset_class in inline_formset_types]
|
||||
|
||||
# Prepare mapping of content types to their prettified names
|
||||
content_types = []
|
||||
for content_type in self.model._editor_content_types:
|
||||
content_name = content_type._meta.verbose_name
|
||||
content_types.append((content_name, content_type.__name__.lower()))
|
||||
|
||||
context = {}
|
||||
|
||||
if hasattr(self.model, '_editor_templates'):
|
||||
if 'template_key' not in self.show_on_top:
|
||||
self.show_on_top = ['template_key'] + list(self.show_on_top)
|
||||
|
||||
context['available_templates'] = self.model._editor_templates
|
||||
|
||||
context.update({
|
||||
'title': _('Change %s') % force_unicode(opts.verbose_name),
|
||||
'opts': opts,
|
||||
'object': obj,
|
||||
'object_form': model_form,
|
||||
'inline_formsets': inline_formsets,
|
||||
'content_types': content_types,
|
||||
'top_fields': [model_form[field] for field in self.show_on_top],
|
||||
'settings_fields': [field for field in model_form if field.name not in self.show_on_top],
|
||||
'media': self.media + model_form.media,
|
||||
'errors': helpers.AdminErrorList(model_form, inline_formsets),
|
||||
'MEDIA_PATH': settings.MEDIA_PATH,
|
||||
'MEDIA_HOTLINKING': settings.MEDIA_HOTLINKING,
|
||||
})
|
||||
|
||||
return self.render_item_editor(request, obj, context)
|
||||
|
||||
def render_item_editor(self, request, object, context):
|
||||
opts = self.model._meta
|
||||
return render_to_response([
|
||||
'admin/editor/%s/%s/item_editor.html' % (opts.app_label, opts.object_name.lower()),
|
||||
'admin/editor/%s/item_editor.html' % opts.app_label,
|
||||
'admin/editor/item_editor.html',
|
||||
], context, context_instance=template.RequestContext(request,
|
||||
processors=self.model.item_editor_context_processors))
|
||||
|
||||
|
|
@ -1,139 +0,0 @@
|
|||
from django import template
|
||||
from django.conf import settings as django_settings
|
||||
from django.contrib import admin
|
||||
from django.contrib.admin.util import unquote
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.db import connection, models
|
||||
from django.http import HttpResponseRedirect, HttpResponse, Http404
|
||||
from django.shortcuts import render_to_response
|
||||
from django.utils import simplejson
|
||||
from django.utils.encoding import force_unicode, smart_unicode
|
||||
from django.utils.text import capfirst
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
import settings
|
||||
|
||||
|
||||
class SplitPaneEditor(admin.ModelAdmin):
|
||||
|
||||
# This can be replaced dynamically with another condition if the need
|
||||
# should arise. Using AJAX if the tree node count exceeds 25 tries to
|
||||
# be a sane default only, nothing more.
|
||||
delayed_tree_loading = lambda self: self.model._tree_manager.count() > 25
|
||||
|
||||
def changelist_view(self, request, extra_context=None):
|
||||
if 'mptt' not in django_settings.INSTALLED_APPS:
|
||||
# mptt_tags is needed to build the nested tree for the tree view
|
||||
raise ImproperlyConfigured, 'You have to add \'mptt\' to INSTALLED_APPS to use the SplitPaneEditor'
|
||||
|
||||
if not self.has_change_permission(request, None):
|
||||
raise PermissionDenied
|
||||
|
||||
if request.is_ajax():
|
||||
cmd = request.REQUEST.get('__cmd')
|
||||
if cmd == 'move_node':
|
||||
return self._move_node(request)
|
||||
elif cmd == 'subtree':
|
||||
return self._subtree_view(request)
|
||||
|
||||
return HttpResponse('Oops. AJAX request not understood.')
|
||||
|
||||
if '_tree' in request.GET:
|
||||
# Left frame
|
||||
return self._tree_view(request)
|
||||
elif '_blank' in request.GET:
|
||||
# Default content for right frame (if the user is not editing
|
||||
# any items currently)
|
||||
return self._blank_view(request)
|
||||
elif 'pop' in request.GET:
|
||||
# Delegate to default implementation for raw_id_fields etc
|
||||
return super(SplitPaneEditor, self).changelist_view(request, extra_context)
|
||||
|
||||
return render_to_response('admin/feincms/splitpane_editor.html')
|
||||
|
||||
def _tree_view(self, request):
|
||||
# XXX the default manager isn't guaranteed to have a method
|
||||
# named "active" at all...
|
||||
try:
|
||||
inactive_nodes = self.model._default_manager.exclude(
|
||||
id__in=self.model._default_manager.active()).values_list('id', flat=True)
|
||||
except AttributeError:
|
||||
inactive_nodes = []
|
||||
|
||||
opts = self.model._meta
|
||||
|
||||
context = {
|
||||
'opts': opts,
|
||||
'root_path': self.admin_site.root_path,
|
||||
'inactive_nodes': ', '.join('#item%d' % i for i in inactive_nodes),
|
||||
'MEDIA_PATH': settings.MEDIA_PATH,
|
||||
}
|
||||
|
||||
if self.delayed_tree_loading():
|
||||
context['object_list'] = self.model._tree_manager.root_nodes()
|
||||
else:
|
||||
context['object_list'] = self.model._tree_manager.all()
|
||||
context['full_object_list'] = True
|
||||
|
||||
return render_to_response([
|
||||
'admin/feincms/%s/%s/splitpane_editor_tree.html' % (opts.app_label, opts.object_name.lower()),
|
||||
'admin/feincms/%s/splitpane_editor_tree.html' % opts.app_label,
|
||||
'admin/feincms/splitpane_editor_tree.html',
|
||||
], context, context_instance=template.RequestContext(request))
|
||||
|
||||
def _subtree_view(self, request):
|
||||
parent = self.model._default_manager.get(pk=request.GET.get('parent'))
|
||||
return render_to_response('admin/feincms/splitpane_editor_tree_subtree.html', {
|
||||
'object_list': parent.get_children(),
|
||||
})
|
||||
|
||||
def _blank_view(self, request):
|
||||
opts = self.model._meta
|
||||
|
||||
return render_to_response('admin/feincms/splitpane_editor_blank.html', {
|
||||
'has_add_permission': self.has_add_permission(request),
|
||||
'root_path': self.admin_site.root_path,
|
||||
'title': capfirst(opts.verbose_name_plural),
|
||||
'opts': opts,
|
||||
}, context_instance=template.RequestContext(request))
|
||||
|
||||
def _move_node(self, request):
|
||||
destination_id = int(request.POST.get('destination'))
|
||||
source_id = int(request.POST.get('source'))
|
||||
position = int(request.POST.get('position'))
|
||||
|
||||
if destination_id == 0:
|
||||
siblings = self.model._tree_manager.root_nodes()
|
||||
else:
|
||||
parent = self.model._tree_manager.get(pk=destination_id)
|
||||
siblings = parent.get_children()
|
||||
|
||||
source = self.model._tree_manager.get(pk=source_id)
|
||||
|
||||
if siblings.count() == 0:
|
||||
# This can only happen when destination != 0
|
||||
# Insert dragged element as new (and only) child
|
||||
self.model._tree_manager.move_node(source, parent, 'last-child')
|
||||
elif position == 0:
|
||||
sibling = siblings[0]
|
||||
if sibling != source:
|
||||
# Only do something if item was not dragged to the same place
|
||||
# as it was before
|
||||
self.model._tree_manager.move_node(source, siblings[0], 'left')
|
||||
else:
|
||||
sibling = siblings[position - 1]
|
||||
if source in siblings[:position]:
|
||||
# The item is a direct sibling of its former position. If the
|
||||
# item's place was somewhere before its new place, we have to
|
||||
# adjust the position slightly
|
||||
self.model._tree_manager.move_node(source, siblings[position], 'right')
|
||||
else:
|
||||
# Otherwise, add it to the right of the target node. This
|
||||
# works for last childs too
|
||||
self.model._tree_manager.move_node(source, siblings[position - 1], 'right')
|
||||
|
||||
# Ensure that model save has been run
|
||||
source = self.model._tree_manager.get(pk=source_id)
|
||||
source.save()
|
||||
|
||||
return HttpResponse('OK')
|
||||
Loading…
Reference in a new issue