Просмотр исходного кода

Stopped using null=True on CharFields

null=True is only useful for a few edge cases where one wants to
separate between '' and None.  If null=True was found, it was removed.
If blank=True was not set already, it was set instead.  If default=None
was set, it was removed (defaulting to '').

I then grepped the source code for tests 'is None' and 'is not None',
and checked the instances where default=None was set.

Fixes #584
master
Maik Hoepfel 12 лет назад
Родитель
Сommit
44da815651

+ 198
- 0
oscar/apps/dashboard/ranges/migrations/0002_auto__chg_field_rangeproductfileupload_error_message.py Просмотреть файл

@@ -0,0 +1,198 @@
1
+# -*- coding: utf-8 -*-
2
+import datetime
3
+from south.db import db
4
+from south.v2 import SchemaMigration
5
+from django.db import models
6
+
7
+
8
+class Migration(SchemaMigration):
9
+
10
+    def forwards(self, orm):
11
+
12
+        # Changing field 'RangeProductFileUpload.error_message'
13
+        db.alter_column('ranges_rangeproductfileupload', 'error_message', self.gf('django.db.models.fields.CharField')(default='', max_length=255))
14
+
15
+    def backwards(self, orm):
16
+
17
+        # Changing field 'RangeProductFileUpload.error_message'
18
+        db.alter_column('ranges_rangeproductfileupload', 'error_message', self.gf('django.db.models.fields.CharField')(max_length=255, null=True))
19
+
20
+    models = {
21
+        'auth.group': {
22
+            'Meta': {'object_name': 'Group'},
23
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
24
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
25
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
26
+        },
27
+        'auth.permission': {
28
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
29
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
30
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
31
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
32
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
33
+        },
34
+        'auth.user': {
35
+            'Meta': {'object_name': 'User'},
36
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
37
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
38
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
39
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
40
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
41
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
42
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
43
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
44
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
45
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
46
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
47
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
48
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
49
+        },
50
+        'catalogue.attributeentity': {
51
+            'Meta': {'object_name': 'AttributeEntity'},
52
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
53
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
54
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'}),
55
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'entities'", 'to': "orm['catalogue.AttributeEntityType']"})
56
+        },
57
+        'catalogue.attributeentitytype': {
58
+            'Meta': {'object_name': 'AttributeEntityType'},
59
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
60
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
61
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'})
62
+        },
63
+        'catalogue.attributeoption': {
64
+            'Meta': {'object_name': 'AttributeOption'},
65
+            'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'options'", 'to': "orm['catalogue.AttributeOptionGroup']"}),
66
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
67
+            'option': ('django.db.models.fields.CharField', [], {'max_length': '255'})
68
+        },
69
+        'catalogue.attributeoptiongroup': {
70
+            'Meta': {'object_name': 'AttributeOptionGroup'},
71
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
72
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
73
+        },
74
+        'catalogue.category': {
75
+            'Meta': {'ordering': "['full_name']", 'object_name': 'Category'},
76
+            'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
77
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
78
+            'full_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
79
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
80
+            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
81
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
82
+            'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
83
+            'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
84
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'})
85
+        },
86
+        'catalogue.option': {
87
+            'Meta': {'object_name': 'Option'},
88
+            'code': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
89
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
90
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
91
+            'type': ('django.db.models.fields.CharField', [], {'default': "'Required'", 'max_length': '128'})
92
+        },
93
+        'catalogue.product': {
94
+            'Meta': {'ordering': "['-date_created']", 'object_name': 'Product'},
95
+            'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.ProductAttribute']", 'through': "orm['catalogue.ProductAttributeValue']", 'symmetrical': 'False'}),
96
+            'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Category']", 'through': "orm['catalogue.ProductCategory']", 'symmetrical': 'False'}),
97
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
98
+            'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
99
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
100
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
101
+            'is_discountable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
102
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'variants'", 'null': 'True', 'to': "orm['catalogue.Product']"}),
103
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ProductClass']", 'null': 'True'}),
104
+            'product_options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
105
+            'rating': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
106
+            'recommended_products': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Product']", 'symmetrical': 'False', 'through': "orm['catalogue.ProductRecommendation']", 'blank': 'True'}),
107
+            'related_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'relations'", 'blank': 'True', 'to': "orm['catalogue.Product']"}),
108
+            'score': ('django.db.models.fields.FloatField', [], {'default': '0.0', 'db_index': 'True'}),
109
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
110
+            'status': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}),
111
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
112
+            'upc': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'})
113
+        },
114
+        'catalogue.productattribute': {
115
+            'Meta': {'ordering': "['code']", 'object_name': 'ProductAttribute'},
116
+            'code': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
117
+            'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeEntityType']", 'null': 'True', 'blank': 'True'}),
118
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
119
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
120
+            'option_group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOptionGroup']", 'null': 'True', 'blank': 'True'}),
121
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attributes'", 'null': 'True', 'to': "orm['catalogue.ProductClass']"}),
122
+            'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
123
+            'type': ('django.db.models.fields.CharField', [], {'default': "'text'", 'max_length': '20'})
124
+        },
125
+        'catalogue.productattributevalue': {
126
+            'Meta': {'object_name': 'ProductAttributeValue'},
127
+            'attribute': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ProductAttribute']"}),
128
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
129
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attribute_values'", 'to': "orm['catalogue.Product']"}),
130
+            'value_boolean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
131
+            'value_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
132
+            'value_entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeEntity']", 'null': 'True', 'blank': 'True'}),
133
+            'value_float': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
134
+            'value_integer': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
135
+            'value_option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOption']", 'null': 'True', 'blank': 'True'}),
136
+            'value_richtext': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
137
+            'value_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
138
+        },
139
+        'catalogue.productcategory': {
140
+            'Meta': {'ordering': "['-is_canonical']", 'object_name': 'ProductCategory'},
141
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Category']"}),
142
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
143
+            'is_canonical': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
144
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
145
+        },
146
+        'catalogue.productclass': {
147
+            'Meta': {'ordering': "['name']", 'object_name': 'ProductClass'},
148
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
149
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
150
+            'options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
151
+            'requires_shipping': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
152
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
153
+            'track_stock': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
154
+        },
155
+        'catalogue.productrecommendation': {
156
+            'Meta': {'object_name': 'ProductRecommendation'},
157
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
158
+            'primary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'primary_recommendations'", 'to': "orm['catalogue.Product']"}),
159
+            'ranking': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}),
160
+            'recommendation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
161
+        },
162
+        'contenttypes.contenttype': {
163
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
164
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
165
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
166
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
167
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
168
+        },
169
+        'offer.range': {
170
+            'Meta': {'object_name': 'Range'},
171
+            'classes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'classes'", 'blank': 'True', 'to': "orm['catalogue.ProductClass']"}),
172
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
173
+            'excluded_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'excludes'", 'blank': 'True', 'to': "orm['catalogue.Product']"}),
174
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
175
+            'included_categories': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'includes'", 'blank': 'True', 'to': "orm['catalogue.Category']"}),
176
+            'included_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'includes'", 'blank': 'True', 'to': "orm['catalogue.Product']"}),
177
+            'includes_all_products': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
178
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
179
+            'proxy_class': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
180
+        },
181
+        'ranges.rangeproductfileupload': {
182
+            'Meta': {'ordering': "('-date_uploaded',)", 'object_name': 'RangeProductFileUpload'},
183
+            'date_processed': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
184
+            'date_uploaded': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
185
+            'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
186
+            'filepath': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
187
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
188
+            'num_duplicate_skus': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
189
+            'num_new_skus': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
190
+            'num_unknown_skus': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
191
+            'range': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'file_uploads'", 'to': "orm['offer.Range']"}),
192
+            'size': ('django.db.models.fields.PositiveIntegerField', [], {}),
193
+            'status': ('django.db.models.fields.CharField', [], {'default': "'Pending'", 'max_length': '32'}),
194
+            'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
195
+        }
196
+    }
197
+
198
+    complete_apps = ['ranges']

+ 1
- 1
oscar/apps/dashboard/ranges/models.py Просмотреть файл

@@ -21,7 +21,7 @@ class RangeProductFileUpload(models.Model):
21 21
         (PROCESSED, PROCESSED),
22 22
     )
23 23
     status = models.CharField(_("Status"), max_length=32, choices=choices, default=PENDING)
24
-    error_message = models.CharField(_("Error Message"), max_length=255, null=True)
24
+    error_message = models.CharField(_("Error Message"), max_length=255, blank=True)
25 25
 
26 26
     # Post-processing audit fields
27 27
     date_processed = models.DateTimeField(_("Date Processed"), null=True)

+ 193
- 0
oscar/apps/offer/migrations/0020_auto__chg_field_benefit_type__chg_field_conditionaloffer_description.py Просмотреть файл

@@ -0,0 +1,193 @@
1
+# -*- coding: utf-8 -*-
2
+import datetime
3
+from south.db import db
4
+from south.v2 import SchemaMigration
5
+from django.db import models
6
+
7
+
8
+class Migration(SchemaMigration):
9
+
10
+    def forwards(self, orm):
11
+
12
+        # Changing field 'Benefit.type'
13
+        db.alter_column('offer_benefit', 'type', self.gf('django.db.models.fields.CharField')(default='', max_length=128))
14
+
15
+        # Changing field 'ConditionalOffer.description'
16
+        db.alter_column('offer_conditionaloffer', 'description', self.gf('django.db.models.fields.TextField')(default=''))
17
+
18
+    def backwards(self, orm):
19
+
20
+        # Changing field 'Benefit.type'
21
+        db.alter_column('offer_benefit', 'type', self.gf('django.db.models.fields.CharField')(max_length=128, null=True))
22
+
23
+        # Changing field 'ConditionalOffer.description'
24
+        db.alter_column('offer_conditionaloffer', 'description', self.gf('django.db.models.fields.TextField')(null=True))
25
+
26
+    models = {
27
+        'catalogue.attributeentity': {
28
+            'Meta': {'object_name': 'AttributeEntity'},
29
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
30
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
31
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'}),
32
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'entities'", 'to': "orm['catalogue.AttributeEntityType']"})
33
+        },
34
+        'catalogue.attributeentitytype': {
35
+            'Meta': {'object_name': 'AttributeEntityType'},
36
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
37
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
38
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'})
39
+        },
40
+        'catalogue.attributeoption': {
41
+            'Meta': {'object_name': 'AttributeOption'},
42
+            'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'options'", 'to': "orm['catalogue.AttributeOptionGroup']"}),
43
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
44
+            'option': ('django.db.models.fields.CharField', [], {'max_length': '255'})
45
+        },
46
+        'catalogue.attributeoptiongroup': {
47
+            'Meta': {'object_name': 'AttributeOptionGroup'},
48
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
49
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
50
+        },
51
+        'catalogue.category': {
52
+            'Meta': {'ordering': "['full_name']", 'object_name': 'Category'},
53
+            'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
54
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
55
+            'full_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
56
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
57
+            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
58
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
59
+            'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
60
+            'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
61
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'})
62
+        },
63
+        'catalogue.option': {
64
+            'Meta': {'object_name': 'Option'},
65
+            'code': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
66
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
67
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
68
+            'type': ('django.db.models.fields.CharField', [], {'default': "'Required'", 'max_length': '128'})
69
+        },
70
+        'catalogue.product': {
71
+            'Meta': {'ordering': "['-date_created']", 'object_name': 'Product'},
72
+            'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.ProductAttribute']", 'through': "orm['catalogue.ProductAttributeValue']", 'symmetrical': 'False'}),
73
+            'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Category']", 'through': "orm['catalogue.ProductCategory']", 'symmetrical': 'False'}),
74
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
75
+            'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
76
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
77
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
78
+            'is_discountable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
79
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'variants'", 'null': 'True', 'to': "orm['catalogue.Product']"}),
80
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ProductClass']", 'null': 'True'}),
81
+            'product_options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
82
+            'rating': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
83
+            'recommended_products': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Product']", 'symmetrical': 'False', 'through': "orm['catalogue.ProductRecommendation']", 'blank': 'True'}),
84
+            'related_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'relations'", 'blank': 'True', 'to': "orm['catalogue.Product']"}),
85
+            'score': ('django.db.models.fields.FloatField', [], {'default': '0.0', 'db_index': 'True'}),
86
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
87
+            'status': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}),
88
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
89
+            'upc': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'})
90
+        },
91
+        'catalogue.productattribute': {
92
+            'Meta': {'ordering': "['code']", 'object_name': 'ProductAttribute'},
93
+            'code': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
94
+            'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeEntityType']", 'null': 'True', 'blank': 'True'}),
95
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
96
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
97
+            'option_group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOptionGroup']", 'null': 'True', 'blank': 'True'}),
98
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attributes'", 'null': 'True', 'to': "orm['catalogue.ProductClass']"}),
99
+            'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
100
+            'type': ('django.db.models.fields.CharField', [], {'default': "'text'", 'max_length': '20'})
101
+        },
102
+        'catalogue.productattributevalue': {
103
+            'Meta': {'object_name': 'ProductAttributeValue'},
104
+            'attribute': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ProductAttribute']"}),
105
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
106
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attribute_values'", 'to': "orm['catalogue.Product']"}),
107
+            'value_boolean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
108
+            'value_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
109
+            'value_entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeEntity']", 'null': 'True', 'blank': 'True'}),
110
+            'value_float': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
111
+            'value_integer': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
112
+            'value_option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOption']", 'null': 'True', 'blank': 'True'}),
113
+            'value_richtext': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
114
+            'value_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
115
+        },
116
+        'catalogue.productcategory': {
117
+            'Meta': {'ordering': "['-is_canonical']", 'object_name': 'ProductCategory'},
118
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Category']"}),
119
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
120
+            'is_canonical': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
121
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
122
+        },
123
+        'catalogue.productclass': {
124
+            'Meta': {'ordering': "['name']", 'object_name': 'ProductClass'},
125
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
126
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
127
+            'options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
128
+            'requires_shipping': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
129
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
130
+            'track_stock': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
131
+        },
132
+        'catalogue.productrecommendation': {
133
+            'Meta': {'object_name': 'ProductRecommendation'},
134
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
135
+            'primary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'primary_recommendations'", 'to': "orm['catalogue.Product']"}),
136
+            'ranking': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}),
137
+            'recommendation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
138
+        },
139
+        'offer.benefit': {
140
+            'Meta': {'object_name': 'Benefit'},
141
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
142
+            'max_affected_items': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
143
+            'proxy_class': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
144
+            'range': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['offer.Range']", 'null': 'True', 'blank': 'True'}),
145
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
146
+            'value': ('oscar.models.fields.PositiveDecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'})
147
+        },
148
+        'offer.condition': {
149
+            'Meta': {'object_name': 'Condition'},
150
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
151
+            'proxy_class': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
152
+            'range': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['offer.Range']", 'null': 'True', 'blank': 'True'}),
153
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
154
+            'value': ('oscar.models.fields.PositiveDecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'})
155
+        },
156
+        'offer.conditionaloffer': {
157
+            'Meta': {'ordering': "['-priority']", 'object_name': 'ConditionalOffer'},
158
+            'benefit': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['offer.Benefit']"}),
159
+            'condition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['offer.Condition']"}),
160
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
161
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
162
+            'end_datetime': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
163
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
164
+            'max_basket_applications': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
165
+            'max_discount': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
166
+            'max_global_applications': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
167
+            'max_user_applications': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
168
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
169
+            'num_applications': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
170
+            'num_orders': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
171
+            'offer_type': ('django.db.models.fields.CharField', [], {'default': "'Site'", 'max_length': '128'}),
172
+            'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
173
+            'redirect_url': ('oscar.models.fields.ExtendedURLField', [], {'max_length': '200', 'blank': 'True'}),
174
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '128', 'unique': 'True', 'null': 'True'}),
175
+            'start_datetime': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
176
+            'status': ('django.db.models.fields.CharField', [], {'default': "'Open'", 'max_length': '64'}),
177
+            'total_discount': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '12', 'decimal_places': '2'})
178
+        },
179
+        'offer.range': {
180
+            'Meta': {'object_name': 'Range'},
181
+            'classes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'classes'", 'blank': 'True', 'to': "orm['catalogue.ProductClass']"}),
182
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
183
+            'excluded_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'excludes'", 'blank': 'True', 'to': "orm['catalogue.Product']"}),
184
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
185
+            'included_categories': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'includes'", 'blank': 'True', 'to': "orm['catalogue.Category']"}),
186
+            'included_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'includes'", 'blank': 'True', 'to': "orm['catalogue.Product']"}),
187
+            'includes_all_products': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
188
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
189
+            'proxy_class': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
190
+        }
191
+    }
192
+
193
+    complete_apps = ['offer']

+ 2
- 4
oscar/apps/offer/models.py Просмотреть файл

@@ -45,8 +45,7 @@ class ConditionalOffer(models.Model):
45 45
         _("Name"), max_length=128, unique=True,
46 46
         help_text=_("This is displayed within the customer's basket"))
47 47
     slug = models.SlugField(_("Slug"), max_length=128, unique=True, null=True)
48
-    description = models.TextField(
49
-        _("Description"), blank=True, null=True,
48
+    description = models.TextField(_("Description"), blank=True,
50 49
         help_text=_("This is displayed on the offer browsing page"))
51 50
 
52 51
     # Offers come in a few different types:
@@ -508,8 +507,7 @@ class Benefit(models.Model):
508 507
         (SHIPPING_PERCENTAGE, _("Discount is a percentage off of the shipping cost")),
509 508
     )
510 509
     type = models.CharField(
511
-        _("Type"), max_length=128, choices=TYPE_CHOICES, null=True,
512
-        blank=True)
510
+        _("Type"), max_length=128, choices=TYPE_CHOICES, blank=True)
513 511
 
514 512
     # The value to use with the designated type.  This can be either an integer
515 513
     # (eg for multibuy) or a decimal (eg an amount) which is slightly

+ 187
- 0
oscar/apps/payment/migrations/0002_auto__chg_field_source_reference__chg_field_source_label__chg_field_tr.py Просмотреть файл

@@ -0,0 +1,187 @@
1
+# -*- coding: utf-8 -*-
2
+import datetime
3
+from south.db import db
4
+from south.v2 import SchemaMigration
5
+from django.db import models
6
+
7
+
8
+class Migration(SchemaMigration):
9
+
10
+    def forwards(self, orm):
11
+
12
+        # Changing field 'Source.reference'
13
+        db.alter_column('payment_source', 'reference', self.gf('django.db.models.fields.CharField')(default='', max_length=128))
14
+
15
+        # Changing field 'Source.label'
16
+        db.alter_column('payment_source', 'label', self.gf('django.db.models.fields.CharField')(default='', max_length=128))
17
+
18
+        # Changing field 'Transaction.status'
19
+        db.alter_column('payment_transaction', 'status', self.gf('django.db.models.fields.CharField')(default='', max_length=128))
20
+
21
+        # Changing field 'Transaction.reference'
22
+        db.alter_column('payment_transaction', 'reference', self.gf('django.db.models.fields.CharField')(default='', max_length=128))
23
+
24
+        # Changing field 'Bankcard.partner_reference'
25
+        db.alter_column('payment_bankcard', 'partner_reference', self.gf('django.db.models.fields.CharField')(default='', max_length=255))
26
+
27
+    def backwards(self, orm):
28
+
29
+        # Changing field 'Source.reference'
30
+        db.alter_column('payment_source', 'reference', self.gf('django.db.models.fields.CharField')(max_length=128, null=True))
31
+
32
+        # Changing field 'Source.label'
33
+        db.alter_column('payment_source', 'label', self.gf('django.db.models.fields.CharField')(max_length=128, null=True))
34
+
35
+        # Changing field 'Transaction.status'
36
+        db.alter_column('payment_transaction', 'status', self.gf('django.db.models.fields.CharField')(max_length=128, null=True))
37
+
38
+        # Changing field 'Transaction.reference'
39
+        db.alter_column('payment_transaction', 'reference', self.gf('django.db.models.fields.CharField')(max_length=128, null=True))
40
+
41
+        # Changing field 'Bankcard.partner_reference'
42
+        db.alter_column('payment_bankcard', 'partner_reference', self.gf('django.db.models.fields.CharField')(max_length=255, null=True))
43
+
44
+    models = {
45
+        'address.country': {
46
+            'Meta': {'ordering': "('-is_highlighted', 'name')", 'object_name': 'Country'},
47
+            'is_highlighted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
48
+            'is_shipping_country': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
49
+            'iso_3166_1_a2': ('django.db.models.fields.CharField', [], {'max_length': '2', 'primary_key': 'True'}),
50
+            'iso_3166_1_a3': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'db_index': 'True'}),
51
+            'iso_3166_1_numeric': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'db_index': 'True'}),
52
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
53
+            'printable_name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
54
+        },
55
+        'auth.group': {
56
+            'Meta': {'object_name': 'Group'},
57
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
58
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
59
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
60
+        },
61
+        'auth.permission': {
62
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
63
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
64
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
65
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
66
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
67
+        },
68
+        'auth.user': {
69
+            'Meta': {'object_name': 'User'},
70
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
71
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
72
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
73
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
74
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
75
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
76
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
77
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
78
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
79
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
80
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
81
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
82
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
83
+        },
84
+        'contenttypes.contenttype': {
85
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
86
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
87
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
88
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
89
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
90
+        },
91
+        'order.billingaddress': {
92
+            'Meta': {'object_name': 'BillingAddress'},
93
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['address.Country']"}),
94
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
95
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
96
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
97
+            'line1': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
98
+            'line2': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
99
+            'line3': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
100
+            'line4': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
101
+            'postcode': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}),
102
+            'search_text': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
103
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
104
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'})
105
+        },
106
+        'order.order': {
107
+            'Meta': {'ordering': "['-date_placed']", 'object_name': 'Order'},
108
+            'basket_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
109
+            'billing_address': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['order.BillingAddress']", 'null': 'True', 'blank': 'True'}),
110
+            'date_placed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
111
+            'guest_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
112
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
113
+            'number': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
114
+            'shipping_address': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['order.ShippingAddress']", 'null': 'True', 'blank': 'True'}),
115
+            'shipping_excl_tax': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
116
+            'shipping_incl_tax': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
117
+            'shipping_method': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
118
+            'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
119
+            'status': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
120
+            'total_excl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
121
+            'total_incl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
122
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'orders'", 'null': 'True', 'to': "orm['auth.User']"})
123
+        },
124
+        'order.shippingaddress': {
125
+            'Meta': {'object_name': 'ShippingAddress'},
126
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['address.Country']"}),
127
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
128
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
129
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
130
+            'line1': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
131
+            'line2': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
132
+            'line3': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
133
+            'line4': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
134
+            'notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
135
+            'phone_number': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
136
+            'postcode': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}),
137
+            'search_text': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
138
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
139
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'})
140
+        },
141
+        'payment.bankcard': {
142
+            'Meta': {'object_name': 'Bankcard'},
143
+            'card_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
144
+            'expiry_date': ('django.db.models.fields.DateField', [], {}),
145
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
146
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
147
+            'number': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
148
+            'partner_reference': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
149
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'bankcards'", 'to': "orm['auth.User']"})
150
+        },
151
+        'payment.source': {
152
+            'Meta': {'object_name': 'Source'},
153
+            'amount_allocated': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '12', 'decimal_places': '2'}),
154
+            'amount_debited': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '12', 'decimal_places': '2'}),
155
+            'amount_refunded': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '12', 'decimal_places': '2'}),
156
+            'currency': ('django.db.models.fields.CharField', [], {'default': "'GBP'", 'max_length': '12'}),
157
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
158
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
159
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sources'", 'to': "orm['order.Order']"}),
160
+            'reference': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
161
+            'source_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['payment.SourceType']"})
162
+        },
163
+        'payment.sourcetype': {
164
+            'Meta': {'object_name': 'SourceType'},
165
+            'code': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
166
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
167
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
168
+        },
169
+        'payment.transaction': {
170
+            'Meta': {'object_name': 'Transaction'},
171
+            'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
172
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
173
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
174
+            'reference': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
175
+            'source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transactions'", 'to': "orm['payment.Source']"}),
176
+            'status': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
177
+            'txn_type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'})
178
+        },
179
+        'sites.site': {
180
+            'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
181
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
182
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
183
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
184
+        }
185
+    }
186
+
187
+    complete_apps = ['payment']

+ 5
- 6
oscar/apps/payment/models.py Просмотреть файл

@@ -25,8 +25,8 @@ class Transaction(models.Model):
25 25
     txn_type = models.CharField(_("Type"), max_length=128, blank=True)
26 26
 
27 27
     amount = models.DecimalField(_("Amount"), decimal_places=2, max_digits=12)
28
-    reference = models.CharField(_("Reference"), max_length=128, null=True)
29
-    status = models.CharField(_("Status"), max_length=128, null=True)
28
+    reference = models.CharField(_("Reference"), max_length=128, blank=True)
29
+    status = models.CharField(_("Status"), max_length=128, blank=True)
30 30
     date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)
31 31
 
32 32
     def __unicode__(self):
@@ -67,11 +67,10 @@ class Source(models.Model):
67 67
 
68 68
     # Reference number for this payment source.  This is often used to look up
69 69
     # a transaction model for a particular payment partner.
70
-    reference = models.CharField(_("Reference"), max_length=128,
71
-                                 blank=True, null=True)
70
+    reference = models.CharField(_("Reference"), max_length=128, blank=True)
72 71
 
73 72
     # A customer-friendly label for the source, eg XXXX-XXXX-XXXX-1234
74
-    label = models.CharField(_("Label"), max_length=128, blank=True, null=True)
73
+    label = models.CharField(_("Label"), max_length=128, blank=True)
75 74
 
76 75
     # A dictionary of submission data that is stored as part of the
77 76
     # checkout process, where we need to pass an instance of this class around
@@ -193,7 +192,7 @@ class Bankcard(models.Model):
193 192
 
194 193
     # For payment partners who are storing the full card details for us
195 194
     partner_reference = models.CharField(
196
-        _("Partner Reference"), max_length=255, null=True, blank=True)
195
+        _("Partner Reference"), max_length=255, blank=True)
197 196
 
198 197
     class Meta:
199 198
         verbose_name = _("Bankcard")

+ 278
- 0
oscar/apps/promotions/migrations/0002_auto__chg_field_keywordpromotion_filter__chg_field_image_link_url__chg.py Просмотреть файл

@@ -0,0 +1,278 @@
1
+# -*- coding: utf-8 -*-
2
+import datetime
3
+from south.db import db
4
+from south.v2 import SchemaMigration
5
+from django.db import models
6
+
7
+
8
+class Migration(SchemaMigration):
9
+
10
+    def forwards(self, orm):
11
+
12
+        # Changing field 'KeywordPromotion.filter'
13
+        db.alter_column('promotions_keywordpromotion', 'filter', self.gf('django.db.models.fields.CharField')(default='', max_length=200))
14
+
15
+        # Changing field 'Image.link_url'
16
+        db.alter_column('promotions_image', 'link_url', self.gf('oscar.models.fields.ExtendedURLField')(default='', max_length=200))
17
+
18
+        # Changing field 'AutomaticProductList.description'
19
+        db.alter_column('promotions_automaticproductlist', 'description', self.gf('django.db.models.fields.TextField')(default=''))
20
+
21
+        # Changing field 'AutomaticProductList.link_text'
22
+        db.alter_column('promotions_automaticproductlist', 'link_text', self.gf('django.db.models.fields.CharField')(default='', max_length=255))
23
+
24
+        # Changing field 'SingleProduct.description'
25
+        db.alter_column('promotions_singleproduct', 'description', self.gf('django.db.models.fields.TextField')(default=''))
26
+
27
+        # Changing field 'RawHTML.display_type'
28
+        db.alter_column('promotions_rawhtml', 'display_type', self.gf('django.db.models.fields.CharField')(default='', max_length=128))
29
+
30
+        # Changing field 'HandPickedProductList.description'
31
+        db.alter_column('promotions_handpickedproductlist', 'description', self.gf('django.db.models.fields.TextField')(default=''))
32
+
33
+        # Changing field 'HandPickedProductList.link_text'
34
+        db.alter_column('promotions_handpickedproductlist', 'link_text', self.gf('django.db.models.fields.CharField')(default='', max_length=255))
35
+
36
+    def backwards(self, orm):
37
+
38
+        # Changing field 'KeywordPromotion.filter'
39
+        db.alter_column('promotions_keywordpromotion', 'filter', self.gf('django.db.models.fields.CharField')(max_length=200, null=True))
40
+
41
+        # Changing field 'Image.link_url'
42
+        db.alter_column('promotions_image', 'link_url', self.gf('oscar.models.fields.ExtendedURLField')(max_length=200, null=True))
43
+
44
+        # Changing field 'AutomaticProductList.description'
45
+        db.alter_column('promotions_automaticproductlist', 'description', self.gf('django.db.models.fields.TextField')(null=True))
46
+
47
+        # Changing field 'AutomaticProductList.link_text'
48
+        db.alter_column('promotions_automaticproductlist', 'link_text', self.gf('django.db.models.fields.CharField')(max_length=255, null=True))
49
+
50
+        # Changing field 'SingleProduct.description'
51
+        db.alter_column('promotions_singleproduct', 'description', self.gf('django.db.models.fields.TextField')(null=True))
52
+
53
+        # Changing field 'RawHTML.display_type'
54
+        db.alter_column('promotions_rawhtml', 'display_type', self.gf('django.db.models.fields.CharField')(max_length=128, null=True))
55
+
56
+        # Changing field 'HandPickedProductList.description'
57
+        db.alter_column('promotions_handpickedproductlist', 'description', self.gf('django.db.models.fields.TextField')(null=True))
58
+
59
+        # Changing field 'HandPickedProductList.link_text'
60
+        db.alter_column('promotions_handpickedproductlist', 'link_text', self.gf('django.db.models.fields.CharField')(max_length=255, null=True))
61
+
62
+    models = {
63
+        'catalogue.attributeentity': {
64
+            'Meta': {'object_name': 'AttributeEntity'},
65
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
66
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
67
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'}),
68
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'entities'", 'to': "orm['catalogue.AttributeEntityType']"})
69
+        },
70
+        'catalogue.attributeentitytype': {
71
+            'Meta': {'object_name': 'AttributeEntityType'},
72
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
73
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
74
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'})
75
+        },
76
+        'catalogue.attributeoption': {
77
+            'Meta': {'object_name': 'AttributeOption'},
78
+            'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'options'", 'to': "orm['catalogue.AttributeOptionGroup']"}),
79
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
80
+            'option': ('django.db.models.fields.CharField', [], {'max_length': '255'})
81
+        },
82
+        'catalogue.attributeoptiongroup': {
83
+            'Meta': {'object_name': 'AttributeOptionGroup'},
84
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
85
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
86
+        },
87
+        'catalogue.category': {
88
+            'Meta': {'ordering': "['full_name']", 'object_name': 'Category'},
89
+            'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
90
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
91
+            'full_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
92
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
93
+            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
94
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
95
+            'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
96
+            'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
97
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'})
98
+        },
99
+        'catalogue.option': {
100
+            'Meta': {'object_name': 'Option'},
101
+            'code': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
102
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
103
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
104
+            'type': ('django.db.models.fields.CharField', [], {'default': "'Required'", 'max_length': '128'})
105
+        },
106
+        'catalogue.product': {
107
+            'Meta': {'ordering': "['-date_created']", 'object_name': 'Product'},
108
+            'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.ProductAttribute']", 'through': "orm['catalogue.ProductAttributeValue']", 'symmetrical': 'False'}),
109
+            'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Category']", 'through': "orm['catalogue.ProductCategory']", 'symmetrical': 'False'}),
110
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
111
+            'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
112
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
113
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
114
+            'is_discountable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
115
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'variants'", 'null': 'True', 'to': "orm['catalogue.Product']"}),
116
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ProductClass']", 'null': 'True'}),
117
+            'product_options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
118
+            'rating': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
119
+            'recommended_products': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Product']", 'symmetrical': 'False', 'through': "orm['catalogue.ProductRecommendation']", 'blank': 'True'}),
120
+            'related_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'relations'", 'blank': 'True', 'to': "orm['catalogue.Product']"}),
121
+            'score': ('django.db.models.fields.FloatField', [], {'default': '0.0', 'db_index': 'True'}),
122
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
123
+            'status': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}),
124
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
125
+            'upc': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'})
126
+        },
127
+        'catalogue.productattribute': {
128
+            'Meta': {'ordering': "['code']", 'object_name': 'ProductAttribute'},
129
+            'code': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
130
+            'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeEntityType']", 'null': 'True', 'blank': 'True'}),
131
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
132
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
133
+            'option_group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOptionGroup']", 'null': 'True', 'blank': 'True'}),
134
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attributes'", 'null': 'True', 'to': "orm['catalogue.ProductClass']"}),
135
+            'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
136
+            'type': ('django.db.models.fields.CharField', [], {'default': "'text'", 'max_length': '20'})
137
+        },
138
+        'catalogue.productattributevalue': {
139
+            'Meta': {'object_name': 'ProductAttributeValue'},
140
+            'attribute': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ProductAttribute']"}),
141
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
142
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attribute_values'", 'to': "orm['catalogue.Product']"}),
143
+            'value_boolean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
144
+            'value_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
145
+            'value_entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeEntity']", 'null': 'True', 'blank': 'True'}),
146
+            'value_float': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
147
+            'value_integer': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
148
+            'value_option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.AttributeOption']", 'null': 'True', 'blank': 'True'}),
149
+            'value_richtext': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
150
+            'value_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
151
+        },
152
+        'catalogue.productcategory': {
153
+            'Meta': {'ordering': "['-is_canonical']", 'object_name': 'ProductCategory'},
154
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Category']"}),
155
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
156
+            'is_canonical': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
157
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
158
+        },
159
+        'catalogue.productclass': {
160
+            'Meta': {'ordering': "['name']", 'object_name': 'ProductClass'},
161
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
162
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
163
+            'options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
164
+            'requires_shipping': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
165
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
166
+            'track_stock': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
167
+        },
168
+        'catalogue.productrecommendation': {
169
+            'Meta': {'object_name': 'ProductRecommendation'},
170
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
171
+            'primary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'primary_recommendations'", 'to': "orm['catalogue.Product']"}),
172
+            'ranking': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}),
173
+            'recommendation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
174
+        },
175
+        'contenttypes.contenttype': {
176
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
177
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
178
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
179
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
180
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
181
+        },
182
+        'promotions.automaticproductlist': {
183
+            'Meta': {'object_name': 'AutomaticProductList'},
184
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
185
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
186
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
187
+            'link_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
188
+            'link_url': ('oscar.models.fields.ExtendedURLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
189
+            'method': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
190
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
191
+            'num_products': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '4'})
192
+        },
193
+        'promotions.handpickedproductlist': {
194
+            'Meta': {'object_name': 'HandPickedProductList'},
195
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
196
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
197
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
198
+            'link_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
199
+            'link_url': ('oscar.models.fields.ExtendedURLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
200
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
201
+            'products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['catalogue.Product']", 'null': 'True', 'through': "orm['promotions.OrderedProduct']", 'blank': 'True'})
202
+        },
203
+        'promotions.image': {
204
+            'Meta': {'object_name': 'Image'},
205
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
206
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
207
+            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
208
+            'link_url': ('oscar.models.fields.ExtendedURLField', [], {'max_length': '200', 'blank': 'True'}),
209
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
210
+        },
211
+        'promotions.keywordpromotion': {
212
+            'Meta': {'object_name': 'KeywordPromotion'},
213
+            'clicks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
214
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
215
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
216
+            'display_order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
217
+            'filter': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
218
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
219
+            'keyword': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
220
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
221
+            'position': ('django.db.models.fields.CharField', [], {'max_length': '100'})
222
+        },
223
+        'promotions.multiimage': {
224
+            'Meta': {'object_name': 'MultiImage'},
225
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
226
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
227
+            'images': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['promotions.Image']", 'null': 'True', 'blank': 'True'}),
228
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
229
+        },
230
+        'promotions.orderedproduct': {
231
+            'Meta': {'ordering': "('display_order',)", 'object_name': 'OrderedProduct'},
232
+            'display_order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
233
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
234
+            'list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['promotions.HandPickedProductList']"}),
235
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
236
+        },
237
+        'promotions.orderedproductlist': {
238
+            'Meta': {'ordering': "('display_order',)", 'object_name': 'OrderedProductList', '_ormbases': ['promotions.HandPickedProductList']},
239
+            'display_order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
240
+            'handpickedproductlist_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['promotions.HandPickedProductList']", 'unique': 'True', 'primary_key': 'True'}),
241
+            'tabbed_block': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tabs'", 'to': "orm['promotions.TabbedBlock']"})
242
+        },
243
+        'promotions.pagepromotion': {
244
+            'Meta': {'object_name': 'PagePromotion'},
245
+            'clicks': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
246
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
247
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
248
+            'display_order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
249
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
250
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
251
+            'page_url': ('oscar.models.fields.ExtendedURLField', [], {'max_length': '128', 'db_index': 'True'}),
252
+            'position': ('django.db.models.fields.CharField', [], {'max_length': '100'})
253
+        },
254
+        'promotions.rawhtml': {
255
+            'Meta': {'object_name': 'RawHTML'},
256
+            'body': ('django.db.models.fields.TextField', [], {}),
257
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
258
+            'display_type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
259
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
260
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
261
+        },
262
+        'promotions.singleproduct': {
263
+            'Meta': {'object_name': 'SingleProduct'},
264
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
265
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
266
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
267
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
268
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Product']"})
269
+        },
270
+        'promotions.tabbedblock': {
271
+            'Meta': {'object_name': 'TabbedBlock'},
272
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
273
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
274
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
275
+        }
276
+    }
277
+
278
+    complete_apps = ['promotions']

+ 8
- 8
oscar/apps/promotions/models.py Просмотреть файл

@@ -68,7 +68,7 @@ class KeywordPromotion(LinkedPromotion):
68 68
 
69 69
     # We allow an additional filter which will let search query matches
70 70
     # be restricted to different parts of the site.
71
-    filter = models.CharField(_("Filter"), max_length=200, blank=True, null=True)
71
+    filter = models.CharField(_("Filter"), max_length=200, blank=True)
72 72
 
73 73
     def get_link(self):
74 74
         return reverse('promotions:keyword-click', kwargs={'keyword_promotion_id': self.id})
@@ -140,8 +140,7 @@ class RawHTML(AbstractPromotion):
140 140
     # if a different width container is required).  This isn't always
141 141
     # required.
142 142
     display_type = models.CharField(
143
-        _("Display type"), max_length=128,
144
-        blank=True, null=True,
143
+        _("Display type"), max_length=128, blank=True,
145 144
         help_text=_("This can be used to have different types of HTML blocks (eg different widths)"))
146 145
     body = models.TextField(_("HTML"))
147 146
     date_created = models.DateTimeField(auto_now_add=True)
@@ -163,8 +162,9 @@ class Image(AbstractPromotion):
163 162
     """
164 163
     _type = 'Image'
165 164
     name = models.CharField(_("Name"), max_length=128)
166
-    link_url = ExtendedURLField(_('Link URL'), blank=True, null=True, help_text=_("""This is
167
-        where this promotion links to"""))
165
+    link_url = ExtendedURLField(
166
+        _('Link URL'), blank=True,
167
+        help_text=_('This is where this promotion links to'))
168 168
     image = models.ImageField(_('Image'), upload_to=settings.OSCAR_PROMOTION_FOLDER)
169 169
     date_created = models.DateTimeField(auto_now_add=True)
170 170
 
@@ -199,7 +199,7 @@ class SingleProduct(AbstractPromotion):
199 199
     _type = 'Single product'
200 200
     name = models.CharField(_("Name"), max_length=128)
201 201
     product = models.ForeignKey('catalogue.Product')
202
-    description = models.TextField(_("Description"), null=True, blank=True)
202
+    description = models.TextField(_("Description"), blank=True)
203 203
     date_created = models.DateTimeField(auto_now_add=True)
204 204
 
205 205
     def __unicode__(self):
@@ -219,9 +219,9 @@ class AbstractProductList(AbstractPromotion):
219 219
     of products.
220 220
     """
221 221
     name = models.CharField(_("Title"), max_length=255)
222
-    description = models.TextField(_("Description"), null=True, blank=True)
222
+    description = models.TextField(_("Description"), blank=True)
223 223
     link_url = ExtendedURLField(_('Link URL'), blank=True, null=True)
224
-    link_text = models.CharField(_("Link text"), max_length=255, blank=True, null=True)
224
+    link_text = models.CharField(_("Link text"), max_length=255, blank=True)
225 225
     date_created = models.DateTimeField(auto_now_add=True)
226 226
 
227 227
     class Meta:

Загрузка…
Отмена
Сохранить