mirror of
https://github.com/jazzband/django-categories.git
synced 2026-03-16 22:30:24 +00:00
Added an active flag for models
This commit is contained in:
parent
bc7fa900a2
commit
3e8a10ad4e
4 changed files with 125 additions and 2 deletions
|
|
@ -78,12 +78,12 @@ class CategoryAdminForm(forms.ModelForm):
|
|||
|
||||
class CategoryAdmin(TreeEditor, admin.ModelAdmin):
|
||||
form = CategoryAdminForm
|
||||
list_display = ('name', 'alternate_title', )
|
||||
list_display = ('name', 'alternate_title', 'active')
|
||||
search_fields = ('name', 'alternate_title', )
|
||||
prepopulated_fields = {'slug': ('name',)}
|
||||
fieldsets = (
|
||||
(None, {
|
||||
'fields': ('parent', 'name', 'thumbnail')
|
||||
'fields': ('parent', 'name', 'thumbnail', 'active')
|
||||
}),
|
||||
('Meta Data', {
|
||||
'fields': ('alternate_title', 'alternate_url', 'description',
|
||||
|
|
@ -95,6 +95,29 @@ class CategoryAdmin(TreeEditor, admin.ModelAdmin):
|
|||
'classes': ('collapse',),
|
||||
}),
|
||||
)
|
||||
|
||||
actions = ['activate', 'deactivate']
|
||||
|
||||
def deactivate(self, request, queryset):
|
||||
"""
|
||||
Set active to False for selected items
|
||||
"""
|
||||
for item in queryset:
|
||||
if item.active:
|
||||
item.active = False
|
||||
item.save()
|
||||
deactivate.short_description = "Deactivate selected categories and their children"
|
||||
|
||||
def activate(self, request, queryset):
|
||||
"""
|
||||
Set active to True for selected items
|
||||
"""
|
||||
for item in queryset:
|
||||
if not item.active:
|
||||
item.active = True
|
||||
item.save()
|
||||
activate.short_description = "Activate selected categories and their children"
|
||||
|
||||
if RELATION_MODELS:
|
||||
inlines = [InlineCategoryRelation,]
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding field 'Category.active'
|
||||
db.add_column('categories_category', 'active', self.gf('django.db.models.fields.BooleanField')(default=True), keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting field 'Category.active'
|
||||
db.delete_column('categories_category', 'active')
|
||||
|
||||
|
||||
models = {
|
||||
'categories.category': {
|
||||
'Meta': {'ordering': "('tree_id', 'lft')", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Category'},
|
||||
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'alternate_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}),
|
||||
'alternate_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
|
||||
'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
|
||||
'meta_extra': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
|
||||
'meta_keywords': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'order': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['categories.Category']"}),
|
||||
'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
|
||||
'thumbnail': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
|
||||
'thumbnail_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'thumbnail_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
|
||||
},
|
||||
'categories.categoryrelation': {
|
||||
'Meta': {'object_name': 'CategoryRelation'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
|
||||
'relation_type': ('django.db.models.fields.CharField', [], {'max_length': "'200'", 'null': 'True', 'blank': 'True'}),
|
||||
'story': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['categories.Category']"})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['categories']
|
||||
|
|
@ -14,6 +14,16 @@ from settings import (RELATION_MODELS, RELATIONS, THUMBNAIL_UPLOAD_PATH,
|
|||
|
||||
STORAGE = get_storage_class(THUMBNAIL_STORAGE)
|
||||
|
||||
class CategoryManager(models.Manager):
|
||||
"""
|
||||
A manager that adds an "active()" method for all active categories
|
||||
"""
|
||||
def active(self):
|
||||
"""
|
||||
Only categories that are active
|
||||
"""
|
||||
return self.get_query_set().filter(active=True)
|
||||
|
||||
class Category(MPTTModel):
|
||||
parent = models.ForeignKey('self',
|
||||
blank=True,
|
||||
|
|
@ -49,6 +59,9 @@ class Category(MPTTModel):
|
|||
blank=True,
|
||||
default="",
|
||||
help_text="(Advanced) Any additional HTML to be placed verbatim in the <head>")
|
||||
active = models.BooleanField(default=True)
|
||||
|
||||
objects = CategoryManager()
|
||||
|
||||
@property
|
||||
def short_title(self):
|
||||
|
|
@ -88,6 +101,10 @@ class Category(MPTTModel):
|
|||
self.thumbnail_width = width
|
||||
self.thumbnail_height = height
|
||||
|
||||
for item in self.get_descendants():
|
||||
if item.active != self.active:
|
||||
item.active = self.active
|
||||
item.save()
|
||||
super(Category, self).save(*args, **kwargs)
|
||||
|
||||
class Meta:
|
||||
|
|
|
|||
23
categories/tests/manager.py
Normal file
23
categories/tests/manager.py
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# test active returns only active items
|
||||
import unittest, os
|
||||
from categories.models import Category
|
||||
from categories.management.commands.import_categories import Command
|
||||
from django.core.management.base import CommandError
|
||||
|
||||
class CategoryManagerTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def testActive(self):
|
||||
"""
|
||||
Should raise an exception.
|
||||
"""
|
||||
all_count = Category.objects.all().count()
|
||||
self.assertEqual(Category.objects.active().count(), all_count)
|
||||
|
||||
cat1 = Category.objects.get(name='Category 1')
|
||||
cat1.active = False
|
||||
cat1.save()
|
||||
|
||||
active_count = all_count - cat1.get_descendants(True).count()
|
||||
self.assertEqual(Category.objects.active().count(), active_count)
|
||||
Loading…
Reference in a new issue