Pārlūkot izejas kodu

Save a shipping code against the order

This allows different shipping methods to be handled more consistently
in multilingual sites, where same shipping method will be saved with
different names.

Fixes #850
master
David Winterbottom 12 gadus atpakaļ
vecāks
revīzija
6a7dd23434

+ 3
- 0
oscar/apps/order/abstract_models.py Parādīt failu

@@ -60,6 +60,9 @@ class AbstractOrder(models.Model):
60 60
     shipping_method = models.CharField(
61 61
         _("Shipping method"), max_length=128, null=True, blank=True)
62 62
 
63
+    # Identifies shipping code
64
+    shipping_code = models.CharField(blank=True, max_length=128, default="")
65
+
63 66
     # Use this field to indicate that an order is on hold / awaiting payment
64 67
     status = models.CharField(
65 68
         _("Status"), max_length=100, null=True, blank=True)

+ 397
- 0
oscar/apps/order/migrations/0017_auto__add_field_order_shipping_code.py Parādīt failu

@@ -0,0 +1,397 @@
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
+        # Adding field 'Order.shipping_code'
12
+        db.add_column(u'order_order', 'shipping_code',
13
+                      self.gf('django.db.models.fields.CharField')(default='', max_length=128, blank=True),
14
+                      keep_default=False)
15
+
16
+
17
+    def backwards(self, orm):
18
+        # Deleting field 'Order.shipping_code'
19
+        db.delete_column(u'order_order', 'shipping_code')
20
+
21
+
22
+    models = {
23
+        u'address.country': {
24
+            'Meta': {'ordering': "('-display_order', 'name')", 'object_name': 'Country'},
25
+            'display_order': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
26
+            'is_shipping_country': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
27
+            'iso_3166_1_a2': ('django.db.models.fields.CharField', [], {'max_length': '2', 'primary_key': 'True'}),
28
+            'iso_3166_1_a3': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'db_index': 'True'}),
29
+            'iso_3166_1_numeric': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'db_index': 'True'}),
30
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
31
+            'printable_name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
32
+        },
33
+        u'auth.group': {
34
+            'Meta': {'object_name': 'Group'},
35
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
36
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
37
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
38
+        },
39
+        u'auth.permission': {
40
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
41
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
42
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
43
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
44
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
45
+        },
46
+        u'auth.user': {
47
+            'Meta': {'object_name': 'User'},
48
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
49
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
50
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
51
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
52
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
53
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
54
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
55
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
56
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
57
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
58
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
59
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
60
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
61
+        },
62
+        u'catalogue.attributeentity': {
63
+            'Meta': {'object_name': 'AttributeEntity'},
64
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
65
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
66
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'}),
67
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'entities'", 'to': u"orm['catalogue.AttributeEntityType']"})
68
+        },
69
+        u'catalogue.attributeentitytype': {
70
+            'Meta': {'object_name': 'AttributeEntityType'},
71
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
72
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
73
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'})
74
+        },
75
+        u'catalogue.attributeoption': {
76
+            'Meta': {'object_name': 'AttributeOption'},
77
+            'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'options'", 'to': u"orm['catalogue.AttributeOptionGroup']"}),
78
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
79
+            'option': ('django.db.models.fields.CharField', [], {'max_length': '255'})
80
+        },
81
+        u'catalogue.attributeoptiongroup': {
82
+            'Meta': {'object_name': 'AttributeOptionGroup'},
83
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
84
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
85
+        },
86
+        u'catalogue.category': {
87
+            'Meta': {'ordering': "['full_name']", 'object_name': 'Category'},
88
+            'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
89
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
90
+            'full_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
91
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
92
+            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
93
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
94
+            'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
95
+            'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
96
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'})
97
+        },
98
+        u'catalogue.option': {
99
+            'Meta': {'object_name': 'Option'},
100
+            'code': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
101
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
102
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
103
+            'type': ('django.db.models.fields.CharField', [], {'default': "'Required'", 'max_length': '128'})
104
+        },
105
+        u'catalogue.product': {
106
+            'Meta': {'ordering': "['-date_created']", 'object_name': 'Product'},
107
+            'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['catalogue.ProductAttribute']", 'through': u"orm['catalogue.ProductAttributeValue']", 'symmetrical': 'False'}),
108
+            'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['catalogue.Category']", 'through': u"orm['catalogue.ProductCategory']", 'symmetrical': 'False'}),
109
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
110
+            'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
111
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
112
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
113
+            'is_discountable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
114
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'variants'", 'null': 'True', 'to': u"orm['catalogue.Product']"}),
115
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'products'", 'null': 'True', 'to': u"orm['catalogue.ProductClass']"}),
116
+            'product_options': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
117
+            'rating': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
118
+            'recommended_products': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['catalogue.Product']", 'symmetrical': 'False', 'through': u"orm['catalogue.ProductRecommendation']", 'blank': 'True'}),
119
+            'related_products': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'relations'", 'blank': 'True', 'to': u"orm['catalogue.Product']"}),
120
+            'score': ('django.db.models.fields.FloatField', [], {'default': '0.0', 'db_index': 'True'}),
121
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
122
+            'status': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}),
123
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
124
+            'upc': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'})
125
+        },
126
+        u'catalogue.productattribute': {
127
+            'Meta': {'ordering': "['code']", 'object_name': 'ProductAttribute'},
128
+            'code': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
129
+            'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.AttributeEntityType']", 'null': 'True', 'blank': 'True'}),
130
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
131
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
132
+            'option_group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.AttributeOptionGroup']", 'null': 'True', 'blank': 'True'}),
133
+            'product_class': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attributes'", 'null': 'True', 'to': u"orm['catalogue.ProductClass']"}),
134
+            'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
135
+            'type': ('django.db.models.fields.CharField', [], {'default': "'text'", 'max_length': '20'})
136
+        },
137
+        u'catalogue.productattributevalue': {
138
+            'Meta': {'object_name': 'ProductAttributeValue'},
139
+            'attribute': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.ProductAttribute']"}),
140
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
141
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attribute_values'", 'to': u"orm['catalogue.Product']"}),
142
+            'value_boolean': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
143
+            'value_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
144
+            'value_entity': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.AttributeEntity']", 'null': 'True', 'blank': 'True'}),
145
+            'value_float': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
146
+            'value_integer': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
147
+            'value_option': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.AttributeOption']", 'null': 'True', 'blank': 'True'}),
148
+            'value_richtext': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
149
+            'value_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
150
+        },
151
+        u'catalogue.productcategory': {
152
+            'Meta': {'ordering': "['-is_canonical']", 'object_name': 'ProductCategory'},
153
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Category']"}),
154
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
155
+            'is_canonical': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
156
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Product']"})
157
+        },
158
+        u'catalogue.productclass': {
159
+            'Meta': {'ordering': "['name']", 'object_name': 'ProductClass'},
160
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
161
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
162
+            'options': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['catalogue.Option']", 'symmetrical': 'False', 'blank': 'True'}),
163
+            'requires_shipping': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
164
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
165
+            'track_stock': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
166
+        },
167
+        u'catalogue.productrecommendation': {
168
+            'Meta': {'object_name': 'ProductRecommendation'},
169
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
170
+            'primary': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'primary_recommendations'", 'to': u"orm['catalogue.Product']"}),
171
+            'ranking': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}),
172
+            'recommendation': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Product']"})
173
+        },
174
+        u'contenttypes.contenttype': {
175
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
176
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
177
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
178
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
179
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
180
+        },
181
+        u'customer.communicationeventtype': {
182
+            'Meta': {'object_name': 'CommunicationEventType'},
183
+            'category': ('django.db.models.fields.CharField', [], {'default': "u'Order related'", 'max_length': '255'}),
184
+            'code': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
185
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
186
+            'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
187
+            'email_body_html_template': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
188
+            'email_body_template': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
189
+            'email_subject_template': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
190
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
191
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
192
+            'sms_template': ('django.db.models.fields.CharField', [], {'max_length': '170', 'blank': 'True'})
193
+        },
194
+        u'order.billingaddress': {
195
+            'Meta': {'object_name': 'BillingAddress'},
196
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['address.Country']"}),
197
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
198
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
199
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
200
+            'line1': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
201
+            'line2': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
202
+            'line3': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
203
+            'line4': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
204
+            'postcode': ('oscar.models.fields.UppercaseCharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}),
205
+            'search_text': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
206
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
207
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'})
208
+        },
209
+        u'order.communicationevent': {
210
+            'Meta': {'ordering': "['-date_created']", 'object_name': 'CommunicationEvent'},
211
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
212
+            'event_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['customer.CommunicationEventType']"}),
213
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
214
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'communication_events'", 'to': u"orm['order.Order']"})
215
+        },
216
+        u'order.line': {
217
+            'Meta': {'object_name': 'Line'},
218
+            'est_dispatch_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
219
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
220
+            'line_price_before_discounts_excl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
221
+            'line_price_before_discounts_incl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
222
+            'line_price_excl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
223
+            'line_price_incl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
224
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['order.Order']"}),
225
+            'partner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'order_lines'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['partner.Partner']"}),
226
+            'partner_line_notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
227
+            'partner_line_reference': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
228
+            'partner_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
229
+            'partner_sku': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
230
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Product']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
231
+            'quantity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
232
+            'status': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
233
+            'stockrecord': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['partner.StockRecord']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
234
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
235
+            'unit_cost_price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
236
+            'unit_price_excl_tax': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
237
+            'unit_price_incl_tax': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
238
+            'unit_retail_price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
239
+            'upc': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'})
240
+        },
241
+        u'order.lineattribute': {
242
+            'Meta': {'object_name': 'LineAttribute'},
243
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
244
+            'line': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attributes'", 'to': u"orm['order.Line']"}),
245
+            'option': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'line_attributes'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['catalogue.Option']"}),
246
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
247
+            'value': ('django.db.models.fields.CharField', [], {'max_length': '255'})
248
+        },
249
+        u'order.lineprice': {
250
+            'Meta': {'ordering': "('id',)", 'object_name': 'LinePrice'},
251
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
252
+            'line': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'prices'", 'to': u"orm['order.Line']"}),
253
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'line_prices'", 'to': u"orm['order.Order']"}),
254
+            'price_excl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
255
+            'price_incl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
256
+            'quantity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
257
+            'shipping_excl_tax': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
258
+            'shipping_incl_tax': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'})
259
+        },
260
+        u'order.order': {
261
+            'Meta': {'ordering': "['-date_placed']", 'object_name': 'Order'},
262
+            'basket_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
263
+            'billing_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['order.BillingAddress']", 'null': 'True', 'blank': 'True'}),
264
+            'currency': ('django.db.models.fields.CharField', [], {'default': "'GBP'", 'max_length': '12'}),
265
+            'date_placed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
266
+            'guest_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
267
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
268
+            'number': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
269
+            'shipping_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['order.ShippingAddress']", 'null': 'True', 'blank': 'True'}),
270
+            'shipping_code': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}),
271
+            'shipping_excl_tax': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
272
+            'shipping_incl_tax': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
273
+            'shipping_method': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
274
+            'site': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['sites.Site']"}),
275
+            'status': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
276
+            'total_excl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
277
+            'total_incl_tax': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
278
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'orders'", 'null': 'True', 'to': u"orm['auth.User']"})
279
+        },
280
+        u'order.orderdiscount': {
281
+            'Meta': {'object_name': 'OrderDiscount'},
282
+            'amount': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
283
+            'category': ('django.db.models.fields.CharField', [], {'default': "'Basket'", 'max_length': '64'}),
284
+            'frequency': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
285
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
286
+            'message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
287
+            'offer_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
288
+            'offer_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'db_index': 'True'}),
289
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'discounts'", 'to': u"orm['order.Order']"}),
290
+            'voucher_code': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'db_index': 'True'}),
291
+            'voucher_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'})
292
+        },
293
+        u'order.ordernote': {
294
+            'Meta': {'object_name': 'OrderNote'},
295
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
296
+            'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
297
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
298
+            'message': ('django.db.models.fields.TextField', [], {}),
299
+            'note_type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
300
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notes'", 'to': u"orm['order.Order']"}),
301
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'})
302
+        },
303
+        u'order.paymentevent': {
304
+            'Meta': {'ordering': "['-date_created']", 'object_name': 'PaymentEvent'},
305
+            'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
306
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
307
+            'event_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['order.PaymentEventType']"}),
308
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
309
+            'lines': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['order.Line']", 'through': u"orm['order.PaymentEventQuantity']", 'symmetrical': 'False'}),
310
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payment_events'", 'to': u"orm['order.Order']"}),
311
+            'reference': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
312
+            'shipping_event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payment_events'", 'null': 'True', 'to': u"orm['order.ShippingEvent']"})
313
+        },
314
+        u'order.paymenteventquantity': {
315
+            'Meta': {'object_name': 'PaymentEventQuantity'},
316
+            'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'line_quantities'", 'to': u"orm['order.PaymentEvent']"}),
317
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
318
+            'line': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payment_event_quantities'", 'to': u"orm['order.Line']"}),
319
+            'quantity': ('django.db.models.fields.PositiveIntegerField', [], {})
320
+        },
321
+        u'order.paymenteventtype': {
322
+            'Meta': {'ordering': "('name',)", 'object_name': 'PaymentEventType'},
323
+            'code': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
324
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
325
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'})
326
+        },
327
+        u'order.shippingaddress': {
328
+            'Meta': {'object_name': 'ShippingAddress'},
329
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['address.Country']"}),
330
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
331
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
332
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
333
+            'line1': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
334
+            'line2': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
335
+            'line3': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
336
+            'line4': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
337
+            'notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
338
+            'phone_number': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
339
+            'postcode': ('oscar.models.fields.UppercaseCharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}),
340
+            'search_text': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
341
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
342
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'})
343
+        },
344
+        u'order.shippingevent': {
345
+            'Meta': {'ordering': "['-date_created']", 'object_name': 'ShippingEvent'},
346
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
347
+            'event_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['order.ShippingEventType']"}),
348
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
349
+            'lines': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'shipping_events'", 'symmetrical': 'False', 'through': u"orm['order.ShippingEventQuantity']", 'to': u"orm['order.Line']"}),
350
+            'notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
351
+            'order': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'shipping_events'", 'to': u"orm['order.Order']"})
352
+        },
353
+        u'order.shippingeventquantity': {
354
+            'Meta': {'object_name': 'ShippingEventQuantity'},
355
+            'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'line_quantities'", 'to': u"orm['order.ShippingEvent']"}),
356
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
357
+            'line': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'shipping_event_quantities'", 'to': u"orm['order.Line']"}),
358
+            'quantity': ('django.db.models.fields.PositiveIntegerField', [], {})
359
+        },
360
+        u'order.shippingeventtype': {
361
+            'Meta': {'ordering': "('name',)", 'object_name': 'ShippingEventType'},
362
+            'code': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
363
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
364
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
365
+        },
366
+        u'partner.partner': {
367
+            'Meta': {'object_name': 'Partner'},
368
+            'code': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
369
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
370
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
371
+            'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'partners'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['auth.User']"})
372
+        },
373
+        u'partner.stockrecord': {
374
+            'Meta': {'unique_together': "(('partner', 'partner_sku'),)", 'object_name': 'StockRecord'},
375
+            'cost_price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
376
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
377
+            'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
378
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
379
+            'low_stock_threshold': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
380
+            'num_allocated': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
381
+            'num_in_stock': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
382
+            'partner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'stockrecords'", 'to': u"orm['partner.Partner']"}),
383
+            'partner_sku': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
384
+            'price_currency': ('django.db.models.fields.CharField', [], {'default': "'GBP'", 'max_length': '12'}),
385
+            'price_excl_tax': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
386
+            'price_retail': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
387
+            'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'stockrecords'", 'to': u"orm['catalogue.Product']"})
388
+        },
389
+        u'sites.site': {
390
+            'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
391
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
392
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
393
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
394
+        }
395
+    }
396
+
397
+    complete_apps = ['order']

+ 2
- 1
oscar/apps/order/utils.py Parādīt failu

@@ -108,7 +108,8 @@ class OrderCreator(object):
108 108
                       'total_excl_tax': total.excl_tax,
109 109
                       'shipping_incl_tax': shipping_method.charge_incl_tax,
110 110
                       'shipping_excl_tax': shipping_method.charge_excl_tax,
111
-                      'shipping_method': shipping_method.name}
111
+                      'shipping_method': shipping_method.name,
112
+                      'shipping_code': shipping_method.code}
112 113
         if shipping_address:
113 114
             order_data['shipping_address'] = shipping_address
114 115
         if billing_address:

+ 5
- 1
oscar/templates/oscar/dashboard/orders/order_detail.html Parādīt failu

@@ -382,9 +382,13 @@
382 382
                     <table class="table table-striped table-bordered table-hover">
383 383
                         <tbody>
384 384
                             <tr>
385
-                                <th>{% trans "Method" %}</th>
385
+                                <th>{% trans "Method name" %}</th>
386 386
                                 <td>{{ order.shipping_method }}</td>
387 387
                             </tr>
388
+                            <tr>
389
+                                <th>{% trans "Method code" %}</th>
390
+                                <td>{{ order.shipping_code|upper }}</td>
391
+                            </tr>
388 392
                             <tr>
389 393
                                 <th>{% trans "Charge (incl tax)" %}</th>
390 394
                                 <td>{{ order.shipping_incl_tax|currency:order.currency }}</td>

+ 7
- 0
tests/integration/order/creator_tests.py Parādīt failu

@@ -57,6 +57,13 @@ class TestSuccessfulOrderCreation(TestCase):
57 57
     def tearDown(self):
58 58
         Order.objects.all().delete()
59 59
 
60
+    def test_saves_shipping_code(self):
61
+        add_product(self.basket, D('12.00'))
62
+        free_method = Free()
63
+        order = place_order(self.creator, basket=self.basket,
64
+                            order_number='1234', shipping_method=free_method)
65
+        self.assertEqual(order.shipping_code, free_method.code)
66
+
60 67
     def test_creates_order_and_line_models(self):
61 68
         add_product(self.basket, D('12.00'))
62 69
         place_order(self.creator, basket=self.basket, order_number='1234')

Notiek ielāde…
Atcelt
Saglabāt