Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

registry fieldsets in admin panel #81

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions categories/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from .settings import RELATION_MODELS, JAVASCRIPT_URL, REGISTER_ADMIN
from .models import Category
from .base import CategoryBaseAdminForm, CategoryBaseAdmin
from .settings import MODEL_REGISTRY
from .settings import MODEL_REGISTRY, FIELD_REGISTRY


class NullTreeNodeChoiceField(forms.ModelChoiceField):
Expand All @@ -32,6 +32,7 @@ class InlineCategoryRelation(GenericCollectionTabularInline):
class CategoryAdminForm(CategoryBaseAdminForm):
class Meta:
model = Category
fields = "__all__"

def clean_alternate_title(self):
if self.instance is None or not self.cleaned_data['alternate_title']:
Expand Down Expand Up @@ -67,20 +68,23 @@ class Media:
if REGISTER_ADMIN:
admin.site.register(Category, CategoryAdmin)

model_regs = []
for key, value in MODEL_REGISTRY.items():
for model in value:
model_regs.append(model)

for model, modeladmin in admin.site._registry.items():
if model in MODEL_REGISTRY.values() and modeladmin.fieldsets:
fieldsets = getattr(modeladmin, 'fieldsets', ())
fields = [cat.split('.')[2] for cat in MODEL_REGISTRY if MODEL_REGISTRY[cat] == model]
# check each field to see if already defined
for cat in fields:
for k, v in fieldsets:
if cat in v['fields']:
fields.remove(cat)
if model in model_regs and modeladmin.fieldsets:
fieldsets = tuple(getattr(modeladmin, 'fieldsets', ()))
fields = [cat.split('.')[2] for cat in FIELD_REGISTRY if model in MODEL_REGISTRY[cat.split('.')[0]]]

# if there are any fields left, add them under the categories fieldset
if len(fields) > 0:
admin.site.unregister(model)
admin.site.register(model, type('newadmin', (modeladmin.__class__,), {
'fieldsets': fieldsets + (('Categories', {
'fields': fields
fieldsets += (('Categories', {
'fields': tuple(fields)
}),)

admin.site.register(model, type('newadmin', (modeladmin.__class__,), {
'fieldsets': fieldsets
}))
16 changes: 16 additions & 0 deletions categories/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
"""

from django.contrib import admin
from django.http import HttpResponse
from django.db import models
from django import forms
from django.utils.encoding import force_unicode
from django.utils.translation import ugettext as _
from django.utils.html import escape

from mptt.models import MPTTModel
from mptt.fields import TreeForeignKey
Expand Down Expand Up @@ -119,6 +121,9 @@ def clean(self):
"item to a descendant."))
return self.cleaned_data

class Meta:
exclude = []


class CategoryBaseAdmin(TreeEditor, admin.ModelAdmin):
form = CategoryBaseAdminForm
Expand All @@ -128,6 +133,17 @@ class CategoryBaseAdmin(TreeEditor, admin.ModelAdmin):

actions = ['activate', 'deactivate']

def response_add(self, request, obj, post_url_continue='../%s/'):
"""
Overriding to force the widget to update tree in customized function
this function dismissAddAnotherPopupTree should be specified in change_form.html (extrahead block)
"""
resp = super(CategoryBaseAdmin, self).response_add(request, obj, post_url_continue)
if request.POST.has_key("_popup") and request.GET.has_key("tree"):
return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopupTree(window, "%s", "%s", "%s");</script>' % \
(escape(obj._get_pk_val()), escape(obj.short_title), escape(obj.parent.pk) if obj.parent is not None else ""))
return resp

def get_actions(self, request):
actions = super(CategoryBaseAdmin, self).get_actions(request)
if 'delete_selected' in actions:
Expand Down
10 changes: 5 additions & 5 deletions categories/editor/tree_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ def get_ordering(self, request=None, queryset=None):
else:
return []

def get_query_set(self, *args, **kwargs):
qs = super(TreeChangeList, self).get_query_set(*args, **kwargs).order_by('tree_id', 'lft')
def get_queryset(self, *args, **kwargs):
qs = super(TreeChangeList, self).get_queryset(*args, **kwargs).order_by('tree_id', 'lft')
return qs


Expand Down Expand Up @@ -171,7 +171,7 @@ def old_changelist_view(self, request, extra_context=None):
# Try to look up an action first, but if this isn't an action the POST
# will fall through to the bulk edit check, below.
if actions and request.method == 'POST':
response = self.response_action(request, queryset=cl.get_query_set())
response = self.response_action(request, queryset=cl.get_queryset())
if response:
return response

Expand Down Expand Up @@ -276,11 +276,11 @@ def changelist_view(self, request, extra_context=None, *args, **kwargs):
else:
return self.old_changelist_view(request, extra_context)

def queryset(self, request):
def get_queryset(self, request):
"""
Returns a QuerySet of all model instances that can be edited by the
admin site. This is used by changelist_view.
"""
qs = self.model._default_manager.get_query_set()
qs = self.model._default_manager.get_queryset()
qs.__class__ = TreeEditorQuerySet
return qs
10 changes: 10 additions & 0 deletions categories/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,16 @@ def get_absolute_url(self):
ancestors = list(self.get_ancestors()) + [self, ]
return prefix + '/'.join([force_unicode(i.slug) for i in ancestors]) + '/'

# for ads
def get_ads_url(self):
return reverse('category-ads', args=[self.parent.slug, self.slug])

# for ads
def get_parent_list_url(self):
if self.parent:
return reverse('category-list', args=[self.parent.slug])
return reverse('category-list', args=[self.slug])

if RELATION_MODELS:
def get_related_content_type(self, content_type):
"""
Expand Down