diff --git a/MANIFEST.in b/MANIFEST.in index 56cee85..9eec67d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ include LICENSE.rst include README.rst recursive-include shop_simplecategories/templates * +recursive-include shop_simplecategories/locale * diff --git a/shop_simplecategories/admin.py b/shop_simplecategories/admin.py index 5e6b34d..b2a7ef3 100644 --- a/shop_simplecategories/admin.py +++ b/shop_simplecategories/admin.py @@ -4,6 +4,10 @@ from shop_simplecategories.models import Category from django import forms from django.utils.translation import ugettext_lazy as _ +from sorl.thumbnail.admin.current import AdminImageWidget +from sorl.thumbnail.fields import ImageField +from django.db.models import ManyToManyField +from shop.models import Product class ProductWithCategoryForm(forms.ModelForm): categories = forms.ModelMultipleChoiceField( @@ -32,5 +36,31 @@ def save(self, commit=True): return product +class CategoryAdminForm(forms.ModelForm): + class Meta(object): + model = Category -admin.site.register(Category) \ No newline at end of file + products = forms.ModelMultipleChoiceField( + queryset = Product.objects.all(), + required=False, + widget=FilteredSelectMultiple( + verbose_name=_('products'), + is_stacked=False + ) + ) + +class CategoryAdmin(admin.ModelAdmin): + fieldsets = [ + ['', {'fields': ['name', 'slug', 'parent_category', 'order', 'image']}], + [_('Products'), {'fields': ['products'], 'classes': ('collapse',)}], + [_('Description'), {'fields': ['description'], 'classes': ('collapse',)}] + ] + list_display = ['admin_thumbnail', 'name', 'parent_category', 'order'] + list_editable = ['order'] + formfield_overrides = { + ImageField: {'widget': AdminImageWidget}, + } + form = CategoryAdminForm + prepopulated_fields = {'slug': ['name']} + +admin.site.register(Category, CategoryAdmin) \ No newline at end of file diff --git a/shop_simplecategories/cms_app.py b/shop_simplecategories/cms_app.py new file mode 100644 index 0000000..67aa61d --- /dev/null +++ b/shop_simplecategories/cms_app.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from django.utils.translation import ugettext_lazy as _ + +class ShopCategoriesApp(CMSApp): + name = _("Shop categories App") + urls = ["shop_simplecategories.urls"] + +apphook_pool.register(ShopCategoriesApp) \ No newline at end of file diff --git a/shop_simplecategories/context_processors.py b/shop_simplecategories/context_processors.py new file mode 100644 index 0000000..40f1bd7 --- /dev/null +++ b/shop_simplecategories/context_processors.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +__author__ = 'zeus' + +from models import Category + +def root_categories(request): + return {'ROOT_CATEGORIES': Category.objects.filter(parent_category=None)} \ No newline at end of file diff --git a/shop_simplecategories/locale/ru/LC_MESSAGES/django.mo b/shop_simplecategories/locale/ru/LC_MESSAGES/django.mo index 4c098c5..348991b 100644 Binary files a/shop_simplecategories/locale/ru/LC_MESSAGES/django.mo and b/shop_simplecategories/locale/ru/LC_MESSAGES/django.mo differ diff --git a/shop_simplecategories/locale/ru/LC_MESSAGES/django.po b/shop_simplecategories/locale/ru/LC_MESSAGES/django.po index 173a71f..98612d2 100644 --- a/shop_simplecategories/locale/ru/LC_MESSAGES/django.po +++ b/shop_simplecategories/locale/ru/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-23 14:04+0400\n" +"POT-Creation-Date: 2011-06-30 11:36+0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,22 +18,48 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: models.py:22 -msgid "category" -msgstr "категория" - -#: models.py:23 +#: admin.py:17 models.py:33 msgid "categories" msgstr "категрии" -#: models.py:31 -msgid "Parent category" -msgstr "Родительская категория" +#: admin.py:47 +msgid "products" +msgstr "Продукты" -#: models.py:36 +#: admin.py:55 models.py:46 msgid "Products" msgstr "Продукты" -#: models.py:38 +#: admin.py:56 +msgid "Description" +msgstr "Описание" + +#: cms_app.py:9 +#, fuzzy +msgid "Shop categories App" +msgstr "категории" + +#: models.py:32 +msgid "category" +msgstr "категория" + +#: models.py:41 +msgid "Parent category" +msgstr "Родительская категория" + +#: models.py:48 msgid "Ordering" msgstr "Порядок" + +#: models.py:49 +msgid "Cover" +msgstr "Обложка" + +#: models.py:77 +msgid "Thumbnail" +msgstr "Миниатюра" + +#: simplecategories_plugins/cms_plugins.py:14 +#: simplecategories_plugins/models.py:12 +msgid "Categories" +msgstr "Категории" diff --git a/shop_simplecategories/migrations/0003_addimage.py b/shop_simplecategories/migrations/0003_addimage.py new file mode 100644 index 0000000..ab70be8 --- /dev/null +++ b/shop_simplecategories/migrations/0003_addimage.py @@ -0,0 +1,52 @@ +# 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.image' + db.add_column('shop_simplecategories_category', 'image', self.gf('sorl.thumbnail.fields.ImageField')(max_length=100, null=True, blank=True), keep_default=False) + + + def backwards(self, orm): + + # Deleting field 'Category.image' + db.delete_column('shop_simplecategories_category', 'image') + + + models = { + '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'}) + }, + 'shop.product': { + 'Meta': {'object_name': 'Product'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_shop.product_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), + 'unit_price': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '12', 'decimal_places': '2'}) + }, + 'shop_simplecategories.category': { + 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'parent_category': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['shop_simplecategories.Category']"}), + 'products': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'categories'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['shop.Product']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}) + } + } + + complete_apps = ['shop_simplecategories'] diff --git a/shop_simplecategories/migrations/0004_add_description.py b/shop_simplecategories/migrations/0004_add_description.py new file mode 100644 index 0000000..e0d5edd --- /dev/null +++ b/shop_simplecategories/migrations/0004_add_description.py @@ -0,0 +1,53 @@ +# 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.description' + db.add_column('shop_simplecategories_category', 'description', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) + + + def backwards(self, orm): + + # Deleting field 'Category.description' + db.delete_column('shop_simplecategories_category', 'description') + + + models = { + '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'}) + }, + 'shop.product': { + 'Meta': {'object_name': 'Product'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_shop.product_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), + 'unit_price': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '12', 'decimal_places': '2'}) + }, + 'shop_simplecategories.category': { + 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'parent_category': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['shop_simplecategories.Category']"}), + 'products': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'categories'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['shop.Product']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}) + } + } + + complete_apps = ['shop_simplecategories'] diff --git a/shop_simplecategories/models.py b/shop_simplecategories/models.py index 9c9e57a..e1a1a94 100644 --- a/shop_simplecategories/models.py +++ b/shop_simplecategories/models.py @@ -3,20 +3,41 @@ from django.db import models from shop.models.productmodel import Product from django.utils.translation import ugettext_lazy as _ +from sorl.thumbnail import ImageField, get_thumbnail +from sorl.thumbnail.helpers import ThumbnailError +from django.conf import settings +import uuid +import os class CategoryManager(models.Manager): def root_categories(self): return self.filter(parent_category__isnull=True) +def get_file_path(instance, filename): + ext = filename.split('.')[-1] + filename = "%s.%s" % (uuid.uuid4(), ext) + return os.path.join(getattr(settings, 'CATEGORY_IMAGE_UPLOAD_TO', 'categories/'), filename) + +def rec(arr): + output = [] + for i in arr: + output.append(i) + if hasattr(i, 'sub_categories'): + subs = rec(i.sub_categories) + i.IN = True + subs[-1].OUT = True + output += subs + return output + class Category(models.Model): - ''' + """ This should be a node in a tree (mptt?) structure representing categories of products. Ideally, this should be usable as a tag cloud too (tags are just categories that are not in a tree structure). The display logic should be handle on a per-site basis - ''' + """ class Meta(object): verbose_name = _("category") @@ -36,7 +57,10 @@ class Meta(object): verbose_name=_('Products'), ) order = models.IntegerField(verbose_name=_('Ordering'), default=0) + image = ImageField(verbose_name=_('Cover'), upload_to=get_file_path, null=True, blank=True) objects = CategoryManager() + + description = models.TextField(blank=True, null=True) def __unicode__(self): return self.name @@ -45,11 +69,54 @@ def get_absolute_url(self): return reverse('category_detail', args=[self.slug]) def get_products(self): - ''' + """ Gets the products belonging to this category (not recursively) - ''' + """ return self.products.all() def get_child_categories(self): return Category.objects.filter(parent_category=self) + def get_parents_as_tree(self, max_depth=10, add_childrens=False): + root_cats = [] + if add_childrens: + root_cats = list(Category.objects.filter(parent_category=self)) + current_category = self + while max_depth: + max_depth -= 1 + if max_depth <=0: + break + # Collect siblings + level_categories = list( + Category.objects.filter(parent_category=current_category.parent_category) + ) + # Set active level + for c in level_categories: + if current_category == c: + c.active = True + if root_cats: + c.sub_categories = root_cats + break + root_cats = level_categories + if not current_category.parent_category: + break + current_category = current_category.parent_category + return root_cats + + def get_parents_as_list(self, max_depth=10): + return rec(self.get_parents_as_tree(max_depth)) + + def get_tree_as_list(self, max_depth=10): + return rec(self.get_parents_as_tree(add_childrens=True)) + + def admin_thumbnail(self): + try: + return '' % get_thumbnail(self.image, '50x50', crop='center').url + except IOError: + return 'IOError' + except ThumbnailError, ex: + return 'ThumbnailError, %s' % ex.message + + admin_thumbnail.short_description = _('Thumbnail') + admin_thumbnail.allow_tags = True + diff --git a/shop_simplecategories/simplecategories_plugins/__init__.py b/shop_simplecategories/simplecategories_plugins/__init__.py new file mode 100644 index 0000000..04ccd4b --- /dev/null +++ b/shop_simplecategories/simplecategories_plugins/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +__author__ = 'zeus' + \ No newline at end of file diff --git a/shop_simplecategories/simplecategories_plugins/cms_plugins.py b/shop_simplecategories/simplecategories_plugins/cms_plugins.py new file mode 100644 index 0000000..7727a6e --- /dev/null +++ b/shop_simplecategories/simplecategories_plugins/cms_plugins.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +__author__ = 'zeus' + + +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool +from models import CategoriesPlugin +from django.utils.translation import ugettext_lazy as _ + +class CategoryPlugin(CMSPluginBase): + model = CategoriesPlugin + name = _('Categories') + render_template = "cms/plugins/categories.html" + text_enabled = True + + def render(self, context, instance, placeholder): + context.update({'category_list': instance.categories.all()}) + return context + +plugin_pool.register_plugin(CategoryPlugin) diff --git a/shop_simplecategories/simplecategories_plugins/migrations/0001_initial.py b/shop_simplecategories/simplecategories_plugins/migrations/0001_initial.py new file mode 100644 index 0000000..92af139 --- /dev/null +++ b/shop_simplecategories/simplecategories_plugins/migrations/0001_initial.py @@ -0,0 +1,91 @@ +# 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 model 'CategoriesPlugin' + db.create_table('cmsplugin_categoriesplugin', ( + ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), + )) + db.send_create_signal('simplecategories_plugins', ['CategoriesPlugin']) + + # Adding M2M table for field categories on 'CategoriesPlugin' + db.create_table('simplecategories_plugins_categoriesplugin_categories', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('categoriesplugin', models.ForeignKey(orm['simplecategories_plugins.categoriesplugin'], null=False)), + ('category', models.ForeignKey(orm['shop_simplecategories.category'], null=False)) + )) + db.create_unique('simplecategories_plugins_categoriesplugin_categories', ['categoriesplugin_id', 'category_id']) + + + def backwards(self, orm): + + # Deleting model 'CategoriesPlugin' + db.delete_table('cmsplugin_categoriesplugin') + + # Removing M2M table for field categories on 'CategoriesPlugin' + db.delete_table('simplecategories_plugins_categoriesplugin_categories') + + + models = { + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + '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'}) + }, + 'shop.product': { + 'Meta': {'object_name': 'Product'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_shop.product_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), + 'unit_price': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '12', 'decimal_places': '2'}) + }, + 'shop_simplecategories.category': { + 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'parent_category': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['shop_simplecategories.Category']"}), + 'products': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'categories'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['shop.Product']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}) + }, + 'simplecategories_plugins.categoriesplugin': { + 'Meta': {'object_name': 'CategoriesPlugin', 'db_table': "'cmsplugin_categoriesplugin'", '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['shop_simplecategories.Category']", 'symmetrical': 'False'}), + 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}) + } + } + + complete_apps = ['simplecategories_plugins'] diff --git a/shop_simplecategories/simplecategories_plugins/migrations/__init__.py b/shop_simplecategories/simplecategories_plugins/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/shop_simplecategories/simplecategories_plugins/models.py b/shop_simplecategories/simplecategories_plugins/models.py new file mode 100644 index 0000000..faa9be8 --- /dev/null +++ b/shop_simplecategories/simplecategories_plugins/models.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +__author__ = 'zeus' + +from cms.models import CMSPlugin +from django.db import models +from shop_simplecategories.models import Category +from django.utils.translation import ugettext_lazy as _ + +class CategoriesPlugin(CMSPlugin): + categories = models.ManyToManyField(Category, verbose_name=_('Categories')) \ No newline at end of file diff --git a/shop_simplecategories/templates/cms/plugins/categories.html b/shop_simplecategories/templates/cms/plugins/categories.html new file mode 100644 index 0000000..ee1ca63 --- /dev/null +++ b/shop_simplecategories/templates/cms/plugins/categories.html @@ -0,0 +1,5 @@ +{% for category in category_list %} + {% with category as object %} + {% include "shop_simplecategories/category_preview.html" %} + {% endwith %} +{% endfor %} \ No newline at end of file diff --git a/shop_simplecategories/templates/shop_simplecategories/category_list.html b/shop_simplecategories/templates/shop_simplecategories/category_list.html index e4e83a8..37741f8 100644 --- a/shop_simplecategories/templates/shop_simplecategories/category_list.html +++ b/shop_simplecategories/templates/shop_simplecategories/category_list.html @@ -1,7 +1,7 @@ -

Categories list

-{% for object in object_list %} +{% load thumbnail %} -{{object.name}}
-{{object.slug}} +

Categories list

+{% for object in object_list %} + {% include "shop_simplecategories/category_preview.html" %} {% endfor %} \ No newline at end of file diff --git a/shop_simplecategories/templates/shop_simplecategories/category_preview.html b/shop_simplecategories/templates/shop_simplecategories/category_preview.html new file mode 100644 index 0000000..5faeba2 --- /dev/null +++ b/shop_simplecategories/templates/shop_simplecategories/category_preview.html @@ -0,0 +1,13 @@ +{% load thumbnail %} + \ No newline at end of file diff --git a/shop_simplecategories/urls.py b/shop_simplecategories/urls.py index 69a5006..e512c2d 100644 --- a/shop_simplecategories/urls.py +++ b/shop_simplecategories/urls.py @@ -11,7 +11,7 @@ ShopListView.as_view(model=Category), name='category_list' ), - url(r'^/(?P[0-9A-Za-z-_.//]+)/$', + url(r'^(?P[0-9A-Za-z-_.//]+)/$', CategoryDetailView.as_view(), name='category_detail' ),