-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Turn Category.full_name into a property
We historically stored the name of the category and it's ancestors as full_name. I'm removing that as: - It's only used in search indexes, and hence a needless performance optimisation and denormalisation. - It makes for yet another thing to think about when updating the category tree. - It gets messy when using e.g. django-modeltranslation to translate categories.
- Loading branch information
1 parent
fe358ac
commit 6f2119f
Showing
6 changed files
with
179 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
src/oscar/apps/catalogue/migrations/0002_auto_20150217_1221.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# -*- coding: utf-8 -*- | ||
from __future__ import unicode_literals | ||
|
||
from django.db import models, migrations | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
('catalogue', '0001_initial'), | ||
] | ||
|
||
operations = [ | ||
migrations.AlterModelOptions( | ||
name='category', | ||
options={'ordering': ['path'], 'verbose_name': 'Category', 'verbose_name_plural': 'Categories'}, | ||
), | ||
migrations.RemoveField( | ||
model_name='category', | ||
name='full_name', | ||
), | ||
] | ||
This comment has been minimized.
Sorry, something went wrong. |
142 changes: 142 additions & 0 deletions
142
src/oscar/apps/catalogue/south_migrations/0027_auto__del_field_category_full_name.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
# -*- coding: utf-8 -*- | ||
from south.utils import datetime_utils as datetime | ||
from south.db import db | ||
from south.v2 import SchemaMigration | ||
from django.db import models | ||
|
||
|
||
class Migration(SchemaMigration): | ||
|
||
def forwards(self, orm): | ||
# Deleting field 'Category.full_name' | ||
db.delete_column(u'catalogue_category', 'full_name') | ||
|
||
|
||
def backwards(self, orm): | ||
|
||
# User chose to not deal with backwards NULL issues for 'Category.full_name' | ||
raise RuntimeError("Cannot reverse this migration. 'Category.full_name' and its values cannot be restored.") | ||
|
||
# The following code is provided here to aid in writing a correct migration # Adding field 'Category.full_name' | ||
db.add_column(u'catalogue_category', 'full_name', | ||
self.gf('django.db.models.fields.CharField')(max_length=255, db_index=True), | ||
keep_default=False) | ||
|
||
|
||
models = { | ||
'catalogue.attributeoption': { | ||
'Meta': {'object_name': 'AttributeOption'}, | ||
'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'options'", 'to': "orm['catalogue.AttributeOptionGroup']"}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'option': ('django.db.models.fields.CharField', [], {'max_length': '255'}) | ||
}, | ||
'catalogue.attributeoptiongroup': { | ||
'Meta': {'object_name': 'AttributeOptionGroup'}, | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) | ||
}, | ||
'catalogue.category': { | ||
'Meta': {'ordering': "['path']", 'object_name': 'Category'}, | ||
'depth': ('django.db.models.fields.PositiveIntegerField', [], {}), | ||
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), | ||
'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), | ||
'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}) | ||
}, | ||
'catalogue.option': { | ||
'Meta': {'object_name': 'Option'}, | ||
'code': ('oscar.models.fields.autoslugfield.AutoSlugField', [], {'allow_duplicates': 'False', 'max_length': '128', 'separator': "u'-'", 'blank': 'True', 'unique': 'True', 'populate_from': "'name'", 'overwrite': 'False'}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
'type': ('django.db.models.fields.CharField', [], {'default': "'Required'", 'max_length': '128'}) | ||
}, | ||
'catalogue.product': { | ||
'Meta': {'ordering': "['-date_created']", 'object_name': 'Product'}, | ||
'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.ProductAttribute']", 'through': "orm['catalogue.ProductAttributeValue']", 'symmetrical': 'False'}), | ||
'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Category']", 'through': "orm['catalogue.ProductCategory']", 'symmetrical': 'False'}), | ||
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), | ||
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'is_discountable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Product']"}), | ||
'product_class': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'products'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['catalogue.ProductClass']"}), | ||
'product_options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}), | ||
'rating': ('django.db.models.fields.FloatField', [], {'null': 'True'}), | ||
'recommended_products': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Product']", 'symmetrical': 'False', 'through': "orm['catalogue.ProductRecommendation']", 'blank': 'True'}), | ||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}), | ||
'structure': ('django.db.models.fields.CharField', [], {'default': "'standalone'", 'max_length': '10'}), | ||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
'upc': ('oscar.models.fields.NullCharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}) | ||
}, | ||
'catalogue.productattribute': { | ||
'Meta': {'ordering': "['code']", 'object_name': 'ProductAttribute'}, | ||
'code': ('django.db.models.fields.SlugField', [], {'max_length': '128'}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
'option_group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOptionGroup']", 'null': 'True', 'blank': 'True'}), | ||
'product_class': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attributes'", 'null': 'True', 'to': "orm['catalogue.ProductClass']"}), | ||
'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
'type': ('django.db.models.fields.CharField', [], {'default': "'text'", 'max_length': '20'}) | ||
}, | ||
'catalogue.productattributevalue': { | ||
'Meta': {'unique_together': "(('attribute', 'product'),)", 'object_name': 'ProductAttributeValue'}, | ||
'attribute': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ProductAttribute']"}), | ||
'entity_content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), | ||
'entity_object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attribute_values'", 'to': "orm['catalogue.Product']"}), | ||
'value_boolean': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), | ||
'value_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), | ||
'value_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
'value_float': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), | ||
'value_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
'value_integer': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
'value_option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOption']", 'null': 'True', 'blank': 'True'}), | ||
'value_richtext': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), | ||
'value_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) | ||
}, | ||
'catalogue.productcategory': { | ||
'Meta': {'ordering': "['product', 'category']", 'unique_together': "(('product', 'category'),)", 'object_name': 'ProductCategory'}, | ||
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Category']"}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"}) | ||
}, | ||
'catalogue.productclass': { | ||
'Meta': {'ordering': "['name']", 'object_name': 'ProductClass'}, | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
'options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}), | ||
'requires_shipping': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
'slug': ('oscar.models.fields.autoslugfield.AutoSlugField', [], {'allow_duplicates': 'False', 'max_length': '128', 'separator': "u'-'", 'blank': 'True', 'unique': 'True', 'populate_from': "'name'", 'overwrite': 'False'}), | ||
'track_stock': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) | ||
}, | ||
'catalogue.productimage': { | ||
'Meta': {'ordering': "['display_order']", 'unique_together': "(('product', 'display_order'),)", 'object_name': 'ProductImage'}, | ||
'caption': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), | ||
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
'display_order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'original': ('django.db.models.fields.files.ImageField', [], {'max_length': '255'}), | ||
'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'images'", 'to': "orm['catalogue.Product']"}) | ||
}, | ||
'catalogue.productrecommendation': { | ||
'Meta': {'ordering': "['primary', '-ranking']", 'unique_together': "(('primary', 'recommendation'),)", 'object_name': 'ProductRecommendation'}, | ||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'primary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'primary_recommendations'", 'to': "orm['catalogue.Product']"}), | ||
'ranking': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}), | ||
'recommendation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"}) | ||
}, | ||
u'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'}), | ||
u'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 = ['catalogue'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
I'd consider renaming the file to have a more meaningful name. Django 1.8 has
--name
to do that from the commandline, so it's normal for a migration to have a manually set name.