Przeglądaj źródła

PEP8 fixes

master
David Winterbottom 13 lat temu
rodzic
commit
60c2c6cbb6

+ 1
- 1
Makefile Wyświetl plik

@@ -22,7 +22,7 @@ ci:
22 22
 	pip install -r requirements.txt
23 23
 	./runtests.py --with-coverage --with-xunit
24 24
 	coverage xml
25
-	flake8 oscar | perl -ple "s/: /: [E] /" | grep -v migrations > violations.txt
25
+	flake8 --ignore=W292 oscar | perl -ple "s/: /: [E] /" | grep -v migrations > violations.txt
26 26
 
27 27
 test:
28 28
 	./runtests.py

+ 1
- 0
oscar/apps/address/admin.py Wyświetl plik

@@ -1,6 +1,7 @@
1 1
 from django.contrib import admin
2 2
 from django.db.models import get_model
3 3
 
4
+
4 5
 class UserAddressAdmin(admin.ModelAdmin):
5 6
     exclude = ('search_text', 'hash')
6 7
     readonly_fields = ('num_orders',)

+ 1
- 1
oscar/apps/address/forms.py Wyświetl plik

@@ -8,4 +8,4 @@ class UserAddressForm(ModelForm):
8 8
 
9 9
     class Meta:
10 10
         model = UserAddress
11
-        exclude = ('user', 'num_orders', 'hash', 'search_text')
11
+        exclude = ('user', 'num_orders', 'hash', 'search_text')

+ 3
- 2
oscar/apps/address/models.py Wyświetl plik

@@ -1,4 +1,5 @@
1
-from oscar.apps.address.abstract_models import AbstractUserAddress, AbstractCountry
1
+from oscar.apps.address.abstract_models import (
2
+    AbstractUserAddress, AbstractCountry)
2 3
 
3 4
 
4 5
 class UserAddress(AbstractUserAddress):
@@ -6,4 +7,4 @@ class UserAddress(AbstractUserAddress):
6 7
 
7 8
 
8 9
 class Country(AbstractCountry):
9
-    pass
10
+    pass

+ 38
- 30
oscar/apps/analytics/abstract_models.py Wyświetl plik

@@ -7,21 +7,24 @@ from django.utils.translation import ugettext as _
7 7
 class AbstractProductRecord(models.Model):
8 8
     """
9 9
     A record of a how popular a product is.
10
-    
10
+
11 11
     This used be auto-merchandising to display the most popular
12 12
     products.
13 13
     """
14
-    
15
-    product = models.OneToOneField('catalogue.Product', verbose_name=_("Product"))
16
-    
14
+
15
+    product = models.OneToOneField(
16
+        'catalogue.Product', verbose_name=_("Product"))
17
+
17 18
     # Data used for generating a score
18 19
     num_views = models.PositiveIntegerField(_('Views'), default=0)
19
-    num_basket_additions = models.PositiveIntegerField(_('Basket Additions'), default=0)
20
-    num_purchases = models.PositiveIntegerField(_('Purchaes'), default=0, db_index=True)
21
-    
20
+    num_basket_additions = models.PositiveIntegerField(
21
+        _('Basket Additions'), default=0)
22
+    num_purchases = models.PositiveIntegerField(
23
+        _('Purchaes'), default=0, db_index=True)
24
+
22 25
     # Product score - used within search
23 26
     score = models.FloatField(_('Score'), default=0.00)
24
-    
27
+
25 28
     class Meta:
26 29
         abstract = True
27 30
         ordering = ['-num_purchases']
@@ -30,26 +33,33 @@ class AbstractProductRecord(models.Model):
30 33
 
31 34
     def __unicode__(self):
32 35
         return _("Record for '%s'") % self.product
33
-        
36
+
34 37
 
35 38
 class AbstractUserRecord(models.Model):
36 39
     """
37 40
     A record of a user's activity.
38 41
     """
39
-    
42
+
40 43
     user = models.OneToOneField('auth.User', verbose_name=_("User"))
41
-    
44
+
42 45
     # Browsing stats
43
-    num_product_views = models.PositiveIntegerField(_('Product Views'), default=0)
44
-    num_basket_additions = models.PositiveIntegerField(_('Basket Additions'), default=0)
45
-    
46
+    num_product_views = models.PositiveIntegerField(
47
+        _('Product Views'), default=0)
48
+    num_basket_additions = models.PositiveIntegerField(
49
+        _('Basket Additions'), default=0)
50
+
46 51
     # Order stats
47
-    num_orders = models.PositiveIntegerField(_('Orders'), default=0, db_index=True)
48
-    num_order_lines = models.PositiveIntegerField(_('Order Lines'), default=0, db_index=True)
49
-    num_order_items = models.PositiveIntegerField(_('Order Items'), default=0, db_index=True)
50
-    total_spent = models.DecimalField(_('Total Spent'), decimal_places=2, max_digits=12, default=Decimal('0.00'))
51
-    date_last_order = models.DateTimeField(_('Last Order Date'), blank=True, null=True)
52
-    
52
+    num_orders = models.PositiveIntegerField(
53
+        _('Orders'), default=0, db_index=True)
54
+    num_order_lines = models.PositiveIntegerField(
55
+        _('Order Lines'), default=0, db_index=True)
56
+    num_order_items = models.PositiveIntegerField(
57
+        _('Order Items'), default=0, db_index=True)
58
+    total_spent = models.DecimalField(_('Total Spent'), decimal_places=2,
59
+                                      max_digits=12, default=Decimal('0.00'))
60
+    date_last_order = models.DateTimeField(
61
+        _('Last Order Date'), blank=True, null=True)
62
+
53 63
     class Meta:
54 64
         abstract = True
55 65
         verbose_name = _('User Record')
@@ -57,34 +67,32 @@ class AbstractUserRecord(models.Model):
57 67
 
58 68
 
59 69
 class AbstractUserProductView(models.Model):
60
-    
70
+
61 71
     user = models.ForeignKey('auth.User', verbose_name=_("User"))
62 72
     product = models.ForeignKey('catalogue.Product', verbose_name=_("Product"))
63 73
     date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)
64
-     
74
+
65 75
     class Meta:
66 76
         abstract = True
67 77
         verbose_name = _('Basket')
68 78
         verbose_name_plural = _('Baskets')
69 79
 
70
-
71 80
     def __unicode__(self):
72 81
         return _("%(user)s viewed '%(product)s'") % {
73
-            'user':self.user, 'product':self.product}
74
-             
82
+            'user': self.user, 'product': self.product}
83
+
75 84
 
76 85
 class AbstractUserSearch(models.Model):
77
-    
86
+
78 87
     user = models.ForeignKey('auth.User', verbose_name=_("User"))
79 88
     query = models.CharField(_("Search term"), max_length=255, db_index=True)
80 89
     date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)
81
-     
90
+
82 91
     class Meta:
83 92
         abstract = True
84 93
         verbose_name_plural = _("User search queries")
85
-        
94
+
86 95
     def __unicode__(self):
87 96
         return _("%(user)s searched for '%(query)s'") % {
88 97
             'user': self.user,
89
-            'query': self.query
90
-        }
98
+            'query': self.query}

+ 9
- 5
oscar/apps/analytics/admin.py Wyświetl plik

@@ -3,18 +3,22 @@ from django.db.models import get_model
3 3
 
4 4
 
5 5
 class ProductRecordAdmin(admin.ModelAdmin):
6
-    list_display = ('product', 'num_views', 'num_basket_additions', 'num_purchases')
7
-    
6
+    list_display = ('product', 'num_views', 'num_basket_additions',
7
+                    'num_purchases')
8
+
8 9
 
9 10
 class UserProductViewAdmin(admin.ModelAdmin):
10 11
     list_display = ('user', 'product', 'date_created')
11 12
 
12 13
 
13 14
 class UserRecordAdmin(admin.ModelAdmin):
14
-    list_display = ('user', 'num_product_views', 'num_basket_additions', 'num_orders', 'total_spent', 'date_last_order')
15
+    list_display = ('user', 'num_product_views', 'num_basket_additions',
16
+                    'num_orders', 'total_spent', 'date_last_order')
15 17
 
16 18
 
17
-admin.site.register(get_model('analytics', 'productrecord'), ProductRecordAdmin)
19
+admin.site.register(get_model('analytics', 'productrecord'),
20
+                    ProductRecordAdmin)
18 21
 admin.site.register(get_model('analytics', 'userrecord'), UserRecordAdmin)
19 22
 admin.site.register(get_model('analytics', 'usersearch'))
20
-admin.site.register(get_model('analytics', 'userproductview'), UserProductViewAdmin)
23
+admin.site.register(get_model('analytics', 'userproductview'),
24
+                    UserProductViewAdmin)

+ 3
- 2
oscar/apps/analytics/models.py Wyświetl plik

@@ -1,5 +1,6 @@
1
-from oscar.apps.analytics.abstract_models import (AbstractProductRecord, AbstractUserRecord,
2
-                                                  AbstractUserProductView, AbstractUserSearch)
1
+from oscar.apps.analytics.abstract_models import (
2
+    AbstractProductRecord, AbstractUserRecord,
3
+    AbstractUserProductView, AbstractUserSearch)
3 4
 
4 5
 
5 6
 class ProductRecord(AbstractProductRecord):

+ 38
- 19
oscar/apps/analytics/receivers.py Wyświetl plik

@@ -16,58 +16,71 @@ order_placed = get_class('order.signals', 'order_placed')
16 16
 
17 17
 logger = logging.getLogger('oscar.analytics')
18 18
 
19
+
19 20
 def _record_product_view(product):
20 21
     try:
21
-        record,_ = ProductRecord.objects.get_or_create(product=product)
22
+        record, __ = ProductRecord.objects.get_or_create(product=product)
22 23
         record.num_views += 1
23 24
         record.save()
24 25
     except IntegrityError:
25
-        # get_or_create sometimes fails due to MySQL's weird transactions, fail silently
26
-        logger.error("IntegrityError on ProductRecord.objects.get_or_create(product=product)")
27
-    
26
+        # get_or_create sometimes fails due to MySQL's weird transactions, fail
27
+        # silently
28
+        logger.error("IntegrityError on ProductRecord.objects."
29
+                     "get_or_create(product=product)")
30
+
31
+
28 32
 def _record_user_product_view(user, product):
29 33
     if user.is_authenticated():
30 34
         # Update user record
31 35
         try:
32
-            record,_ = UserRecord.objects.get_or_create(user=user)
36
+            record, __ = UserRecord.objects.get_or_create(user=user)
33 37
             record.num_product_views += 1
34 38
             record.save()
35 39
         except IntegrityError:
36
-            logger.error("IntegrityError on UserRecord.objects.get_or_create(user=user)")
37
-        
40
+            logger.error("IntegrityError on UserRecord.objects."
41
+                         "get_or_create(user=user)")
42
+
38 43
         # Add user product view record
39 44
         UserProductView.objects.create(product=product, user=user)
40 45
 
46
+
41 47
 def _record_basket_addition(product):
42 48
     try:
43
-        record,_ = ProductRecord.objects.get_or_create(product=product)
49
+        record, __ = ProductRecord.objects.get_or_create(product=product)
44 50
         record.num_basket_additions += 1
45 51
         record.save()
46 52
     except IntegrityError:
47
-        logger.error("IntegrityError on ProductRecord.objects.get_or_create(product=product)")
48
-    
53
+        logger.error("IntegrityError on ProductRecord.objects."
54
+                     "get_or_create(product=product)")
55
+
56
+
49 57
 def _record_user_basket_addition(user, product):
50 58
     if user.is_authenticated():
51 59
         try:
52
-            record,_ = UserRecord.objects.get_or_create(user=user)
60
+            record, __ = UserRecord.objects.get_or_create(user=user)
53 61
             record.num_basket_additions += 1
54 62
             record.save()
55 63
         except IntegrityError:
56
-            logger.error("IntegrityError on UserRecord.objects.get_or_create(user=user)")
64
+            logger.error("IntegrityError on UserRecord.objects."
65
+                         "get_or_create(user=user)")
66
+
57 67
 
58 68
 def _record_products_in_order(order):
59 69
     for line in order.lines.all():
60 70
         try:
61
-            record,_ = ProductRecord.objects.get_or_create(product=line.product)
71
+            record, __ = ProductRecord.objects.get_or_create(
72
+                product=line.product)
62 73
             record.num_purchases += line.quantity
63 74
             record.save()
64 75
         except IntegrityError:
65
-            logger.error("IntegrityError on ProductRecord.objects.get_or_create(product=product)")
76
+            logger.error("IntegrityError on ProductRecord.objects."
77
+                         "get_or_create(product=product)")
78
+
66 79
 
67 80
 def _record_user_order(user, order):
68 81
     if user.is_authenticated():
69 82
         try:
70
-            record,_ = UserRecord.objects.get_or_create(user=user)
83
+            record, __ = UserRecord.objects.get_or_create(user=user)
71 84
             record.num_orders += 1
72 85
             record.num_order_lines += order.num_lines
73 86
             record.num_order_items += order.num_items
@@ -75,7 +88,9 @@ def _record_user_order(user, order):
75 88
             record.date_last_order = order.date_placed
76 89
             record.save()
77 90
         except IntegrityError:
78
-            logger.error("IntegrityError on UserRecord.objects.get_or_create(user=user)")
91
+            logger.error("IntegrityError on UserRecord.objects."
92
+                         "get_or_create(user=user)")
93
+
79 94
 
80 95
 def _record_user_product_search(user, query):
81 96
     if user.is_authenticated():
@@ -83,20 +98,24 @@ def _record_user_product_search(user, query):
83 98
 
84 99
 # Receivers
85 100
 
101
+
86 102
 @receiver(product_viewed)
87 103
 def receive_product_view(sender, product, user, **kwargs):
88 104
     _record_product_view(product)
89 105
     _record_user_product_view(user, product)
90
-    
106
+
107
+
91 108
 @receiver(product_search)
92 109
 def receive_product_search(sender, query, user, **kwargs):
93 110
     _record_user_product_search(user, query)
94
-    
111
+
112
+
95 113
 @receiver(basket_addition)
96 114
 def receive_basket_addition(sender, product, user, **kwargs):
97 115
     _record_basket_addition(product)
98 116
     _record_user_basket_addition(user, product)
99
-    
117
+
118
+
100 119
 @receiver(order_placed)
101 120
 def receive_order_placed(sender, order, user, **kwargs):
102 121
     _record_products_in_order(order)

+ 7
- 8
oscar/apps/analytics/reports.py Wyświetl plik

@@ -6,8 +6,10 @@ from django.utils.translation import ugettext_lazy as _
6 6
 from oscar.core.loading import get_class
7 7
 
8 8
 ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
9
-ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
10
-ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
9
+ReportCSVFormatter = get_class('dashboard.reports.reports',
10
+                               'ReportCSVFormatter')
11
+ReportHTMLFormatter = get_class('dashboard.reports.reports',
12
+                                'ReportHTMLFormatter')
11 13
 ProductRecord = get_model('analytics', 'ProductRecord')
12 14
 UserRecord = get_model('analytics', 'UserRecord')
13 15
 
@@ -41,8 +43,7 @@ class ProductReportGenerator(ReportGenerator):
41 43
 
42 44
     formatters = {
43 45
         'CSV_formatter': ProductReportCSVFormatter,
44
-        'HTML_formatter': ProductReportHTMLFormatter
45
-    }
46
+        'HTML_formatter': ProductReportHTMLFormatter}
46 47
 
47 48
     def report_description(self):
48 49
         return self.description
@@ -68,8 +69,7 @@ class UserReportCSVFormatter(ReportCSVFormatter):
68 69
                       _('Order lines'),
69 70
                       _('Order items'),
70 71
                       _('Total spent'),
71
-                      _('Date of last order')
72
-                      ]
72
+                      _('Date of last order')]
73 73
         writer.writerow(header_row)
74 74
 
75 75
         for record in users:
@@ -95,8 +95,7 @@ class UserReportGenerator(ReportGenerator):
95 95
 
96 96
     formatters = {
97 97
         'CSV_formatter': UserReportCSVFormatter,
98
-        'HTML_formatter': UserReportHTMLFormatter
99
-    }
98
+        'HTML_formatter': UserReportHTMLFormatter}
100 99
 
101 100
     def generate(self):
102 101
         users = UserRecord._default_manager.select_related().all()

+ 11
- 10
oscar/apps/analytics/scores.py Wyświetl plik

@@ -6,36 +6,38 @@ Product = get_model('catalogue', 'Product')
6 6
 
7 7
 
8 8
 class Calculator(object):
9
-    
9
+
10 10
     # Map of field name to weight
11 11
     weights = {'num_views': 1,
12 12
                'num_basket_additions': 3,
13 13
                'num_purchases': 5}
14
-    
14
+
15 15
     def __init__(self, logger):
16 16
         self.logger = logger
17 17
         self.cursor = connection.cursor()
18
-    
18
+
19 19
     def run(self):
20 20
         self.calculate_scores()
21 21
         self.update_product_models()
22
-        
22
+
23 23
     def calculate_scores(self):
24 24
         self.logger.info("Calculating product scores")
25
-        
25
+
26 26
         # Build the "SET ..." part of the SQL statement
27
-        weighted_sum = " + ".join(["%s*`%s`" % (weight, field) for field, weight in self.weights.items()])
28
-        
27
+        weighted_sum = " + ".join(
28
+            ["%s*`%s`" % (weight, field) for field, weight
29
+             in self.weights.items()])
30
+
29 31
         ctx = {'table': ProductRecord._meta.db_table,
30 32
                'weighted_total': weighted_sum,
31 33
                'total_weight': sum(self.weights.values())}
32
-        sql = '''UPDATE `%(table)s` 
34
+        sql = '''UPDATE `%(table)s`
33 35
                  SET score = %(weighted_total)s / %(total_weight)s''' % ctx
34 36
 
35 37
         self.logger.debug(sql)
36 38
         self.cursor.execute(sql)
37 39
         transaction.commit_unless_managed()
38
-        
40
+
39 41
     def update_product_models(self):
40 42
         self.logger.info("Updating product records")
41 43
         qs = ProductRecord.objects.all()
@@ -43,4 +45,3 @@ class Calculator(object):
43 45
             record.product.score = record.score
44 46
             record.product.save()
45 47
         self.logger.info("Updated scores for %d products" % qs.count())
46
-        

+ 79
- 48
oscar/apps/basket/abstract_models.py Wyświetl plik

@@ -14,7 +14,8 @@ from oscar.templatetags.currency_filters import currency
14 14
 # Basket statuses
15 15
 # - Frozen is for when a basket is in the process of being submitted
16 16
 #   and we need to prevent any changes to it.
17
-OPEN, MERGED, SAVED, FROZEN, SUBMITTED = ("Open", "Merged", "Saved", "Frozen", "Submitted")
17
+OPEN, MERGED, SAVED, FROZEN, SUBMITTED = (
18
+    "Open", "Merged", "Saved", "Frozen", "Submitted")
18 19
 
19 20
 
20 21
 class AbstractBasket(models.Model):
@@ -22,7 +23,8 @@ class AbstractBasket(models.Model):
22 23
     Basket object
23 24
     """
24 25
     # Baskets can be anonymously owned (which are merged if the user signs in)
25
-    owner = models.ForeignKey('auth.User', related_name='baskets', null=True, verbose_name=_("Owner"))
26
+    owner = models.ForeignKey('auth.User', related_name='baskets',
27
+                              null=True, verbose_name=_("Owner"))
26 28
     STATUS_CHOICES = (
27 29
         (OPEN, _("Open - currently active")),
28 30
         (MERGED, _("Merged - superceded by another basket")),
@@ -30,12 +32,15 @@ class AbstractBasket(models.Model):
30 32
         (FROZEN, _("Frozen - the basket cannot be modified")),
31 33
         (SUBMITTED, _("Submitted - has been ordered at the checkout")),
32 34
     )
33
-    status = models.CharField(_("Status"), max_length=128, default=OPEN, choices=STATUS_CHOICES)
34
-    vouchers = models.ManyToManyField('voucher.Voucher', null=True, verbose_name=_("Vouchers"))
35
+    status = models.CharField(_("Status"), max_length=128, default=OPEN,
36
+                              choices=STATUS_CHOICES)
37
+    vouchers = models.ManyToManyField('voucher.Voucher', null=True,
38
+                                      verbose_name=_("Vouchers"))
35 39
 
36 40
     date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)
37 41
     date_merged = models.DateTimeField(_("Date Merged"), null=True, blank=True)
38
-    date_submitted = models.DateTimeField(_("Date Submitted"), null=True, blank=True)
42
+    date_submitted = models.DateTimeField(_("Date Submitted"), null=True,
43
+                                          blank=True)
39 44
 
40 45
     class Meta:
41 46
         abstract = True
@@ -55,15 +60,18 @@ class AbstractBasket(models.Model):
55 60
         self.exempt_from_tax = False
56 61
 
57 62
     def __unicode__(self):
58
-        return _(u"%(status)s basket (owner: %(owner)s, lines: %(num_lines)d)") % {
59
-            'status': self.status, 'owner': self.owner, 'num_lines': self.num_lines}
63
+        return _(
64
+            u"%(status)s basket (owner: %(owner)s, lines: %(num_lines)d)") % {
65
+                'status': self.status,
66
+                'owner': self.owner,
67
+                'num_lines': self.num_lines}
60 68
 
61 69
     def all_lines(self):
62 70
         """
63 71
         Return a cached set of basket lines.
64 72
 
65
-        This is important for offers as they alter the line models and you don't
66
-        want to reload them from the DB.
73
+        This is important for offers as they alter the line models and you
74
+        don't want to reload them from the DB.
67 75
         """
68 76
         if self.id is None:
69 77
             return query.EmptyQuerySet(model=self.__class__)
@@ -77,12 +85,13 @@ class AbstractBasket(models.Model):
77 85
             total_basket_quantity = self.num_items
78 86
             max_allowed = basket_threshold - total_basket_quantity
79 87
             if qty > max_allowed:
80
-                return False, _("Due to technical limitations we are not able "
81
-                                "to ship more than %(threshold)d items in one order."
82
-                                " Your basket currently has %(basket)d items.") % {
83
-                                        'threshold': basket_threshold,
84
-                                        'basket': total_basket_quantity,
85
-                                    }
88
+                return False, _(
89
+                    "Due to technical limitations we are not able "
90
+                    "to ship more than %(threshold)d items in one order."
91
+                    " Your basket currently has %(basket)d items.") % {
92
+                        'threshold': basket_threshold,
93
+                        'basket': total_basket_quantity,
94
+                    }
86 95
         return True, None
87 96
 
88 97
     # ============
@@ -101,7 +110,8 @@ class AbstractBasket(models.Model):
101 110
         Add a product to the basket
102 111
 
103 112
         The 'options' list should contains dicts with keys 'option' and 'value'
104
-        which link the relevant product.Option model and string value respectively.
113
+        which link the relevant product.Option model and string value
114
+        respectively.
105 115
         """
106 116
         if options is None:
107 117
             options = []
@@ -112,8 +122,8 @@ class AbstractBasket(models.Model):
112 122
         # product (eg T-shirts with different personalisations)
113 123
         line_ref = self._create_line_reference(product, options)
114 124
 
115
-        # Determine price to store (if one exists).  It is only stored for audit
116
-        # and sometimes caching.
125
+        # Determine price to store (if one exists).  It is only stored for
126
+        # audit and sometimes caching.
117 127
         price_excl_tax, price_incl_tax = None, None
118 128
         if product.has_stockrecord:
119 129
             stockrecord = product.stockrecord
@@ -121,11 +131,12 @@ class AbstractBasket(models.Model):
121 131
                 price_excl_tax = getattr(stockrecord, 'price_excl_tax', None)
122 132
                 price_incl_tax = getattr(stockrecord, 'price_incl_tax', None)
123 133
 
124
-        line, created = self.lines.get_or_create(line_reference=line_ref,
125
-                                                 product=product,
126
-                                                 defaults={'quantity': quantity,
127
-                                                           'price_excl_tax': price_excl_tax,
128
-                                                           'price_incl_tax': price_incl_tax})
134
+        line, created = self.lines.get_or_create(
135
+            line_reference=line_ref,
136
+            product=product,
137
+            defaults={'quantity': quantity,
138
+                      'price_excl_tax': price_excl_tax,
139
+                      'price_incl_tax': price_incl_tax})
129 140
         if created:
130 141
             for option_dict in options:
131 142
                 line.attributes.create(option=option_dict['option'],
@@ -168,11 +179,13 @@ class AbstractBasket(models.Model):
168 179
             line.basket = self
169 180
             line.save()
170 181
         else:
171
-            # Line already exists - assume the max quantity is correct and delete the old
182
+            # Line already exists - assume the max quantity is correct and
183
+            # delete the old
172 184
             if add_quantities:
173 185
                 existing_line.quantity += line.quantity
174 186
             else:
175
-                existing_line.quantity = max(existing_line.quantity, line.quantity)
187
+                existing_line.quantity = max(existing_line.quantity,
188
+                                             line.quantity)
176 189
             existing_line.save()
177 190
             line.delete()
178 191
 
@@ -316,8 +329,8 @@ class AbstractBasket(models.Model):
316 329
     @property
317 330
     def grouped_voucher_discounts(self):
318 331
         """
319
-        Return discounts from vouchers but grouped so that a voucher which links
320
-        to multiple offers is aggregated into one object.
332
+        Return discounts from vouchers but grouped so that a voucher which
333
+        links to multiple offers is aggregated into one object.
321 334
         """
322 335
         voucher_discounts = {}
323 336
         for discount in self.voucher_discounts:
@@ -347,7 +360,8 @@ class AbstractBasket(models.Model):
347 360
     @property
348 361
     def num_items(self):
349 362
         """Return number of items"""
350
-        return reduce(lambda num,line: num+line.quantity, self.all_lines(), 0)
363
+        return reduce(
364
+            lambda num, line: num + line.quantity, self.all_lines(), 0)
351 365
 
352 366
     @property
353 367
     def num_items_without_discount(self):
@@ -395,24 +409,29 @@ class AbstractLine(models.Model):
395 409
     """
396 410
     A line of a basket (product and a quantity)
397 411
     """
398
-    basket = models.ForeignKey('basket.Basket', related_name='lines', verbose_name=_("Basket"))
412
+    basket = models.ForeignKey('basket.Basket', related_name='lines',
413
+                               verbose_name=_("Basket"))
399 414
 
400 415
     # This is to determine which products belong to the same line
401 416
     # We can't just use product.id as you can have customised products
402 417
     # which should be treated as separate lines.  Set as a
403 418
     # SlugField as it is included in the path for certain views.
404
-    line_reference = models.SlugField(_("Line Reference"), max_length=128, db_index=True)
419
+    line_reference = models.SlugField(_("Line Reference"), max_length=128,
420
+                                      db_index=True)
405 421
 
406
-    product = models.ForeignKey('catalogue.Product', related_name='basket_lines', verbose_name=_("Product"))
422
+    product = models.ForeignKey(
423
+        'catalogue.Product', related_name='basket_lines',
424
+        verbose_name=_("Product"))
407 425
     quantity = models.PositiveIntegerField(_('Quantity'), default=1)
408 426
 
409 427
     # We store the unit price incl tax of the product when it is first added to
410
-    # the basket.  This allows us to tell if a product has changed price since a
411
-    # person first added it to their basket.
412
-    price_excl_tax = models.DecimalField(_('Price excl. Tax'), decimal_places=2, max_digits=12,
413
-                                         null=True)
414
-    price_incl_tax = models.DecimalField(_('Price incl. Tax'), decimal_places=2, max_digits=12,
415
-                                         null=True)
428
+    # the basket.  This allows us to tell if a product has changed price since
429
+    # a person first added it to their basket.
430
+    price_excl_tax = models.DecimalField(
431
+        _('Price excl. Tax'), decimal_places=2, max_digits=12,
432
+        null=True)
433
+    price_incl_tax = models.DecimalField(
434
+        _('Price incl. Tax'), decimal_places=2, max_digits=12, null=True)
416 435
     # Track date of first addition
417 436
     date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)
418 437
 
@@ -428,13 +447,18 @@ class AbstractLine(models.Model):
428 447
         verbose_name_plural = _('Basket lines')
429 448
 
430 449
     def __unicode__(self):
431
-        return _(u"%(basket)s, Product '%(product)s', quantity %(quantity)d") % {
432
-            'basket': self.basket, 'product': self.product, 'quantity': self.quantity}
450
+        return _(
451
+            u"%(basket)s, Product '%(product)s', quantity %(quantity)d") % {
452
+                'basket': self.basket,
453
+                'product': self.product,
454
+                'quantity': self.quantity}
433 455
 
434 456
     def save(self, *args, **kwargs):
435 457
         """Saves a line or deletes if it's quanity is 0"""
436 458
         if self.basket.status not in (OPEN, SAVED):
437
-            raise PermissionDenied(_("You cannot modify a %s basket") % self.basket.status.lower())
459
+            raise PermissionDenied(
460
+                _("You cannot modify a %s basket") % (
461
+                    self.basket.status.lower(),))
438 462
         if self.quantity == 0:
439 463
             return self.delete(*args, **kwargs)
440 464
         super(AbstractLine, self).save(*args, **kwargs)
@@ -471,17 +495,21 @@ class AbstractLine(models.Model):
471 495
         """
472 496
         prices = []
473 497
         if not self.has_discount:
474
-            prices.append((self.unit_price_incl_tax, self.unit_price_excl_tax, self.quantity))
498
+            prices.append((self.unit_price_incl_tax, self.unit_price_excl_tax,
499
+                           self.quantity))
475 500
         else:
476 501
             # Need to split the discount among the affected quantity
477 502
             # of products.
478
-            item_incl_tax_discount = self._discount / int(self._affected_quantity)
503
+            item_incl_tax_discount = (
504
+                self._discount / int(self._affected_quantity))
479 505
             item_excl_tax_discount = item_incl_tax_discount * self._tax_ratio
480 506
             prices.append((self.unit_price_incl_tax - item_incl_tax_discount,
481 507
                            self.unit_price_excl_tax - item_excl_tax_discount,
482 508
                            self._affected_quantity))
483 509
             if self.quantity_without_discount:
484
-                prices.append((self.unit_price_incl_tax, self.unit_price_excl_tax, self.quantity_without_discount))
510
+                prices.append((self.unit_price_incl_tax,
511
+                               self.unit_price_excl_tax,
512
+                               self.quantity_without_discount))
485 513
         return prices
486 514
 
487 515
     # =======
@@ -594,14 +622,16 @@ class AbstractLine(models.Model):
594 622
 
595 623
         current_price_incl_tax = self.product.stockrecord.price_incl_tax
596 624
         if current_price_incl_tax > self.price_incl_tax:
597
-            msg = u"The price of '%(product)s' has increased from %(old_price)s " \
598
-                  u"to %(new_price)s since you added it to your basket"
625
+            msg = (
626
+                u"The price of '%(product)s' has increased from %(old_price)s "
627
+                u"to %(new_price)s since you added it to your basket")
599 628
             return _(msg) % {'product': self.product.get_title(),
600 629
                              'old_price': currency(self.price_incl_tax),
601 630
                              'new_price': currency(current_price_incl_tax)}
602 631
         if current_price_incl_tax < self.price_incl_tax:
603
-            msg = u"The price of '%(product)s' has decreased from %(old_price)s " \
604
-                  u"to %(new_price)s since you added it to your basket"
632
+            msg = (
633
+                u"The price of '%(product)s' has decreased from %(old_price)s "
634
+                u"to %(new_price)s since you added it to your basket")
605 635
             return _(msg) % {'product': self.product.get_title(),
606 636
                              'old_price': currency(self.price_incl_tax),
607 637
                              'new_price': currency(current_price_incl_tax)}
@@ -611,7 +641,8 @@ class AbstractLineAttribute(models.Model):
611 641
     """
612 642
     An attribute of a basket line
613 643
     """
614
-    line = models.ForeignKey('basket.Line', related_name='attributes', verbose_name=_("Line"))
644
+    line = models.ForeignKey('basket.Line', related_name='attributes',
645
+                             verbose_name=_("Line"))
615 646
     option = models.ForeignKey('catalogue.Option', verbose_name=_("Option"))
616 647
     value = models.CharField(_("Value"), max_length=255)
617 648
 

+ 7
- 4
oscar/apps/basket/app.py Wyświetl plik

@@ -18,11 +18,14 @@ class BasketApplication(Application):
18 18
         urlpatterns = patterns('',
19 19
             url(r'^$', self.summary_view.as_view(), name='summary'),
20 20
             url(r'^add/$', self.add_view.as_view(), name='add'),
21
-            url(r'^vouchers/add/$', self.add_voucher_view.as_view(), name='vouchers-add'),
22
-            url(r'^vouchers/(?P<pk>\d+)/remove/$', self.remove_voucher_view.as_view(), name='vouchers-remove'),
23
-            url(r'^saved/$', login_required(self.saved_view.as_view()), name='saved'),
21
+            url(r'^vouchers/add/$', self.add_voucher_view.as_view(),
22
+                name='vouchers-add'),
23
+            url(r'^vouchers/(?P<pk>\d+)/remove/$',
24
+                self.remove_voucher_view.as_view(), name='vouchers-remove'),
25
+            url(r'^saved/$', login_required(self.saved_view.as_view()),
26
+                name='saved'),
24 27
         )
25 28
         return self.post_process_urls(urlpatterns)
26 29
 
27 30
 
28
-application = BasketApplication()
31
+application = BasketApplication()

+ 30
- 23
oscar/apps/basket/forms.py Wyświetl plik

@@ -12,7 +12,8 @@ Product = get_model('catalogue', 'product')
12 12
 
13 13
 
14 14
 class BasketLineForm(forms.ModelForm):
15
-    save_for_later = forms.BooleanField(initial=False, required=False, label=_('Save for Later'))
15
+    save_for_later = forms.BooleanField(initial=False, required=False,
16
+                                        label=_('Save for Later'))
16 17
 
17 18
     def clean_quantity(self):
18 19
         qty = self.cleaned_data['quantity']
@@ -21,8 +22,8 @@ class BasketLineForm(forms.ModelForm):
21 22
         return qty
22 23
 
23 24
     def check_max_allowed_quantity(self, qty):
24
-        is_quantity_allowed, reason = self.instance.basket.is_quantity_allowed(qty)
25
-        if not is_quantity_allowed:
25
+        is_allowed, reason = self.instance.basket.is_quantity_allowed(qty)
26
+        if not is_allowed:
26 27
             raise forms.ValidationError(reason)
27 28
 
28 29
     def check_permission(self, qty):
@@ -34,15 +35,18 @@ class BasketLineForm(forms.ModelForm):
34 35
 
35 36
     class Meta:
36 37
         model = Line
37
-        exclude = ('basket', 'product', 'line_reference', 'price_excl_tax', 'price_incl_tax')
38
+        exclude = ('basket', 'product', 'line_reference',
39
+                   'price_excl_tax', 'price_incl_tax')
38 40
 
39 41
 
40 42
 class SavedLineForm(forms.ModelForm):
41
-    move_to_basket = forms.BooleanField(initial=False, required=False, label=_('Move to Basket'))
43
+    move_to_basket = forms.BooleanField(initial=False, required=False,
44
+                                        label=_('Move to Basket'))
42 45
 
43 46
     class Meta:
44 47
         model = Line
45
-        exclude = ('basket', 'product', 'line_reference', 'quantity', 'price_excl_tax', 'price_incl_tax')
48
+        exclude = ('basket', 'product', 'line_reference', 'quantity',
49
+                   'price_excl_tax', 'price_incl_tax')
46 50
 
47 51
     def __init__(self, user, basket, *args, **kwargs):
48 52
         self.user = user
@@ -58,8 +62,8 @@ class SavedLineForm(forms.ModelForm):
58 62
         else:
59 63
             desired_qty = self.instance.quantity + line.quantity
60 64
 
61
-        is_available, reason = self.instance.product.is_purchase_permitted(user=self.user,
62
-                                                                           quantity=desired_qty)
65
+        is_available, reason = self.instance.product.is_purchase_permitted(
66
+            user=self.user, quantity=desired_qty)
63 67
         if not is_available:
64 68
             raise forms.ValidationError(reason)
65 69
         return cleaned_data
@@ -73,8 +77,8 @@ class BaseSavedLineFormSet(BaseModelFormSet):
73 77
         super(BaseSavedLineFormSet, self).__init__(*args, **kwargs)
74 78
 
75 79
     def _construct_form(self, i, **kwargs):
76
-        return super(BaseSavedLineFormSet, self)._construct_form(i, user=self.user,
77
-                                                             basket=self.basket, **kwargs)
80
+        return super(BaseSavedLineFormSet, self)._construct_form(
81
+            i, user=self.user, basket=self.basket, **kwargs)
78 82
 
79 83
 
80 84
 SavedLineFormSet = modelformset_factory(Line, form=SavedLineForm,
@@ -86,7 +90,7 @@ class BasketVoucherForm(forms.Form):
86 90
     code = forms.CharField(max_length=128, label=_('Code'))
87 91
 
88 92
     def __init__(self, *args, **kwargs):
89
-        return super(BasketVoucherForm, self).__init__(*args,**kwargs)
93
+        return super(BasketVoucherForm, self).__init__(*args, **kwargs)
90 94
 
91 95
     def clean_code(self):
92 96
         return self.cleaned_data['code'].strip().upper()
@@ -101,7 +105,8 @@ class ProductSelectionForm(forms.Form):
101 105
         try:
102 106
             return Product.objects.get(pk=id)
103 107
         except Product.DoesNotExist:
104
-            raise forms.ValidationError(_("This product is not available for purchase"))
108
+            raise forms.ValidationError(
109
+                _("This product is not available for purchase"))
105 110
 
106 111
 
107 112
 class AddToBasketForm(forms.Form):
@@ -137,8 +142,8 @@ class AddToBasketForm(forms.Form):
137 142
         else:
138 143
             desired_qty = qty + line.quantity
139 144
 
140
-        is_available, reason = product.is_purchase_permitted(user=self.user,
141
-                                                             quantity=desired_qty)
145
+        is_available, reason = product.is_purchase_permitted(
146
+            user=self.user, quantity=desired_qty)
142 147
         if not is_available:
143 148
             raise forms.ValidationError(reason)
144 149
         return self.cleaned_data
@@ -152,8 +157,8 @@ class AddToBasketForm(forms.Form):
152 157
             if qty > max_allowed:
153 158
                 raise forms.ValidationError(
154 159
                     _("Due to technical limitations we are not able to ship"
155
-                      " more than %(threshold)d items in one order. Your basket"
156
-                      " currently has %(basket)d items.") % {
160
+                      " more than %(threshold)d items in one order. Your"
161
+                      " basket currently has %(basket)d items.") % {
157 162
                             'threshold': basket_threshold,
158 163
                             'basket': total_basket_quantity,
159 164
                     })
@@ -170,26 +175,28 @@ class AddToBasketForm(forms.Form):
170 175
                 attr_summary = variant.attribute_summary()
171 176
                 if attr_summary:
172 177
                     attr_summary = "(%s)" % attr_summary
173
-                summary = u"%s %s - %s" % (variant.get_title(), attr_summary,
174
-                                           currency(variant.stockrecord.price_incl_tax))
178
+                summary = u"%s %s - %s" % (
179
+                    variant.get_title(), attr_summary,
180
+                    currency(variant.stockrecord.price_incl_tax))
175 181
                 choices.append((variant.id, summary))
176 182
         self.fields['product_id'] = forms.ChoiceField(choices=tuple(choices),
177 183
                                                       label=_("Variant"))
178 184
 
179 185
     def _create_product_fields(self, item):
180
-        u"""Add the product option fields."""
186
+        """Add the product option fields."""
181 187
         for option in item.options:
182 188
             self._add_option_field(item, option)
183 189
 
184 190
     def _add_option_field(self, item, option):
185
-        u"""
191
+        """
186 192
         Creates the appropriate form field for the product option.
187 193
 
188
-        This is designed to be overridden so that specific widgets can be used for
189
-        certain types of options.
194
+        This is designed to be overridden so that specific widgets can be used
195
+        for certain types of options.
190 196
         """
191 197
         self.fields[option.code] = forms.CharField()
192 198
 
193 199
 
194 200
 class SimpleAddToBasketForm(AddToBasketForm):
195
-    quantity = forms.IntegerField(initial=1, min_value=1, widget=forms.HiddenInput, label=_('Quantity'))
201
+    quantity = forms.IntegerField(
202
+        initial=1, min_value=1, widget=forms.HiddenInput, label=_('Quantity'))

+ 10
- 6
oscar/apps/basket/managers.py Wyświetl plik

@@ -2,25 +2,29 @@ from django.db import models
2 2
 
3 3
 
4 4
 class OpenBasketManager(models.Manager):
5
-    u"""For searching/creating OPEN baskets only."""
5
+    """For searching/creating OPEN baskets only."""
6 6
     status_filter = "Open"
7 7
 
8 8
     def get_query_set(self):
9
-        return super(OpenBasketManager, self).get_query_set().filter(status=self.status_filter)
9
+        return super(OpenBasketManager, self).get_query_set().filter(
10
+            status=self.status_filter)
10 11
 
11 12
     def get_or_create(self, **kwargs):
12
-        return self.get_query_set().get_or_create(status=self.status_filter, **kwargs)
13
+        return self.get_query_set().get_or_create(
14
+            status=self.status_filter, **kwargs)
13 15
 
14 16
 
15 17
 class SavedBasketManager(models.Manager):
16
-    u"""For searching/creating SAVED baskets only."""
18
+    """For searching/creating SAVED baskets only."""
17 19
     status_filter = "Saved"
18 20
 
19 21
     def get_query_set(self):
20
-        return super(SavedBasketManager, self).get_query_set().filter(status=self.status_filter)
22
+        return super(SavedBasketManager, self).get_query_set().filter(
23
+            status=self.status_filter)
21 24
 
22 25
     def create(self, **kwargs):
23 26
         return self.get_query_set().create(status=self.status_filter, **kwargs)
24 27
 
25 28
     def get_or_create(self, **kwargs):
26
-        return self.get_query_set().get_or_create(status=self.status_filter, **kwargs)
29
+        return self.get_query_set().get_or_create(
30
+            status=self.status_filter, **kwargs)

+ 7
- 5
oscar/apps/basket/middleware.py Wyświetl plik

@@ -20,8 +20,8 @@ class BasketMiddleware(object):
20 20
 
21 21
     def get_basket(self, request):
22 22
         manager = Basket.open
23
-        cookie_basket = self.get_cookie_basket(settings.OSCAR_BASKET_COOKIE_OPEN,
24
-                                               request, manager)
23
+        cookie_basket = self.get_cookie_basket(
24
+            settings.OSCAR_BASKET_COOKIE_OPEN, request, manager)
25 25
 
26 26
         if hasattr(request, 'user') and request.user.is_authenticated():
27 27
             # Signed-in user: if they have a cookie basket too, it means
@@ -39,7 +39,8 @@ class BasketMiddleware(object):
39 39
 
40 40
             if cookie_basket:
41 41
                 self.merge_baskets(basket, cookie_basket)
42
-                request.cookies_to_delete.append(settings.OSCAR_BASKET_COOKIE_OPEN)
42
+                request.cookies_to_delete.append(
43
+                    settings.OSCAR_BASKET_COOKIE_OPEN)
43 44
         elif cookie_basket:
44 45
             # Anonymous user with a basket tied to the cookie
45 46
             basket = cookie_basket
@@ -68,7 +69,8 @@ class BasketMiddleware(object):
68 69
         if hasattr(request, 'basket') and request.basket.id > 0 \
69 70
             and not request.user.is_authenticated() \
70 71
             and settings.OSCAR_BASKET_COOKIE_OPEN not in request.COOKIES:
71
-            cookie = "%s_%s" % (request.basket.id, self.get_basket_hash(request.basket.id))
72
+            cookie = "%s_%s" % (
73
+                request.basket.id, self.get_basket_hash(request.basket.id))
72 74
             response.set_cookie(settings.OSCAR_BASKET_COOKIE_OPEN,
73 75
                                 cookie,
74 76
                                 max_age=settings.OSCAR_BASKET_COOKIE_LIFETIME,
@@ -110,4 +112,4 @@ class BasketMiddleware(object):
110 112
             Applicator().apply(request, basket)
111 113
 
112 114
     def get_basket_hash(self, basket_id):
113
-        return str(zlib.crc32(str(basket_id)+settings.SECRET_KEY))
115
+        return str(zlib.crc32(str(basket_id) + settings.SECRET_KEY))

+ 5
- 4
oscar/apps/basket/models.py Wyświetl plik

@@ -1,5 +1,6 @@
1
-from oscar.apps.basket.abstract_models import (AbstractBasket, AbstractLine, AbstractLineAttribute,
2
-                                               OPEN, MERGED, SAVED, SUBMITTED)
1
+from oscar.apps.basket.abstract_models import (
2
+    AbstractBasket, AbstractLine, AbstractLineAttribute,
3
+    OPEN, MERGED, SAVED, SUBMITTED)
3 4
 
4 5
 
5 6
 class InvalidBasketLineError(Exception):
@@ -9,10 +10,10 @@ class InvalidBasketLineError(Exception):
9 10
 class Basket(AbstractBasket):
10 11
     pass
11 12
 
12
-    
13
+
13 14
 class Line(AbstractLine):
14 15
     pass
15 16
 
16 17
 
17 18
 class LineAttribute(AbstractLineAttribute):
18
-    pass
19
+    pass

+ 19
- 16
oscar/apps/basket/reports.py Wyświetl plik

@@ -5,8 +5,10 @@ from django.utils.translation import gettext_lazy as _
5 5
 from oscar.core.loading import get_class, get_classes
6 6
 
7 7
 ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
8
-ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
9
-ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
8
+ReportCSVFormatter = get_class('dashboard.reports.reports',
9
+                               'ReportCSVFormatter')
10
+ReportHTMLFormatter = get_class('dashboard.reports.reports',
11
+                                'ReportHTMLFormatter')
10 12
 Basket = get_model('basket', 'Basket')
11 13
 OPEN, SUBMITTED = get_classes('basket.models', ['OPEN', 'SUBMITTED'])
12 14
 
@@ -30,19 +32,23 @@ class OpenBasketReportCSVFormatter(ReportCSVFormatter):
30 32
 
31 33
         for basket in baskets:
32 34
             if basket.owner:
33
-                row = [basket.owner_id, basket.owner.get_full_name(), basket.owner.email,
35
+                row = [basket.owner_id, basket.owner.get_full_name(),
36
+                       basket.owner.email,
34 37
                        basket.status, basket.num_lines,
35 38
                        basket.num_items, basket.total_incl_tax,
36 39
                        self.format_datetime(basket.date_created),
37 40
                        basket.time_since_creation]
38 41
             else:
39
-                row = [basket.owner_id, None, None, basket.status, basket.num_lines,
40
-                       basket.num_items, basket.total_incl_tax,
41
-                       self.format_datetime(basket.date_created), basket.time_since_creation]
42
+                row = [basket.owner_id, None, None, basket.status,
43
+                       basket.num_lines, basket.num_items,
44
+                       basket.total_incl_tax,
45
+                       self.format_datetime(basket.date_created),
46
+                       basket.time_since_creation]
42 47
             writer.writerow(row)
43 48
 
44 49
     def filename(self, **kwargs):
45
-        return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
50
+        return self.filename_template % (kwargs['start_date'],
51
+                                         kwargs['end_date'])
46 52
 
47 53
 
48 54
 class OpenBasketReportHTMLFormatter(ReportHTMLFormatter):
@@ -58,14 +64,12 @@ class OpenBasketReportGenerator(ReportGenerator):
58 64
 
59 65
     formatters = {
60 66
         'CSV_formatter': OpenBasketReportCSVFormatter,
61
-        'HTML_formatter': OpenBasketReportHTMLFormatter
62
-    }
67
+        'HTML_formatter': OpenBasketReportHTMLFormatter}
63 68
 
64 69
     def generate(self):
65 70
         additional_data = {
66 71
             'start_date': self.start_date,
67
-            'end_date': self.end_date
68
-        }
72
+            'end_date': self.end_date}
69 73
         baskets = Basket._default_manager.filter(status=OPEN)
70 74
         return self.formatter.generate_response(baskets, **additional_data)
71 75
 
@@ -98,7 +102,8 @@ class SubmittedBasketReportCSVFormatter(ReportCSVFormatter):
98 102
             writer.writerow(row)
99 103
 
100 104
     def filename(self, **kwargs):
101
-        return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
105
+        return self.filename_template % (kwargs['start_date'],
106
+                                         kwargs['end_date'])
102 107
 
103 108
 
104 109
 class SubmittedBasketReportHTMLFormatter(ReportHTMLFormatter):
@@ -114,13 +119,11 @@ class SubmittedBasketReportGenerator(ReportGenerator):
114 119
 
115 120
     formatters = {
116 121
         'CSV_formatter': SubmittedBasketReportCSVFormatter,
117
-        'HTML_formatter': SubmittedBasketReportHTMLFormatter
118
-    }
122
+        'HTML_formatter': SubmittedBasketReportHTMLFormatter}
119 123
 
120 124
     def generate(self):
121 125
         additional_data = {
122 126
             'start_date': self.start_date,
123
-            'end_date': self.end_date
124
-        }
127
+            'end_date': self.end_date}
125 128
         baskets = Basket._default_manager.filter(status=SUBMITTED)
126 129
         return self.formatter.generate_response(baskets, **additional_data)

Ładowanie…
Anuluj
Zapisz