Pārlūkot izejas kodu

Refactored product app to provide a ProductApplication which contains all the url patterns, this makes it possible to extend its functionality without requiring the import_modules trick. Using Django's existing get_model method where needed.

master
Andrew Ingram 14 gadus atpakaļ
vecāks
revīzija
cc956cd804

+ 21
- 0
oscar/apps/product/__init__.py Parādīt failu

@@ -0,0 +1,21 @@
1
+from django.conf.urls.defaults import patterns, url, include        
2
+from oscar.core.application import Application
3
+from oscar.apps.product.views import ItemDetailView, ItemClassListView, ProductListView
4
+
5
+
6
+class ProductApplication(Application):
7
+    name = 'products'
8
+    detail_view = ItemDetailView
9
+    class_list_view = ItemClassListView
10
+    list_view = ProductListView
11
+
12
+    def get_urls(self):
13
+        urlpatterns = patterns('',
14
+            url(r'^$', self.list_view.as_view(), name='list'),
15
+            url(r'^(?P<item_class_slug>[\w-]+)/$', self.class_list_view.as_view(), name='class-list'),            
16
+            url(r'^(?P<item_class_slug>[\w-]+)/(?P<item_slug>[\w-]*)-(?P<item_id>\d+)/$', self.detail_view.as_view(), name='detail'),
17
+        )
18
+        return urlpatterns
19
+
20
+
21
+application = ProductApplication()

+ 3
- 2
oscar/apps/product/abstract_models.py Parādīt failu

@@ -38,8 +38,9 @@ class AbstractItemClass(models.Model):
38 38
             self.slug= slugify(self.name)
39 39
         super(AbstractItemClass, self).save(*args, **kwargs)
40 40
 
41
+    @models.permalink
41 42
     def get_absolute_url(self):
42
-        return reverse('oscar-product-item-class', kwargs={'item_class_slug': self.slug})
43
+        return ('products:class-list', (), {'item_class_slug': self.slug})
43 44
 
44 45
     def __unicode__(self):
45 46
         return self.name
@@ -185,7 +186,7 @@ class AbstractItem(models.Model):
185 186
     @models.permalink
186 187
     def get_absolute_url(self):
187 188
         u"""Return a product's absolute url"""
188
-        return ('oscar-product-item', (), {
189
+        return ('products:detail', (), {
189 190
             'item_class_slug': self.get_item_class().slug, 
190 191
             'item_slug': self.slug,
191 192
             'item_id': self.id})

+ 0
- 11
oscar/apps/product/urls.py Parādīt failu

@@ -1,11 +0,0 @@
1
-from django.conf.urls.defaults import *
2
-
3
-from oscar.core.decorators import class_based_view
4
-from oscar.core.loading import import_module
5
-import_module('product.views', ['ItemDetailView', 'ProductListView', 'ItemClassListView'], locals())
6
-
7
-urlpatterns = patterns('oscar.product.views',
8
-    url(r'(?P<item_class_slug>[\w-]+)/(?P<item_slug>[\w-]*)-(?P<item_id>\d+)/$', ItemDetailView.as_view(), name='oscar-product-item'),
9
-    url(r'(?P<item_class_slug>[\w-]+)/$', ItemClassListView.as_view(), name='oscar-product-item-class'),
10
-    url(r'^$', ProductListView.as_view(), name='oscar-products'),
11
-)

+ 9
- 6
oscar/apps/product/views.py Parādīt failu

@@ -9,11 +9,14 @@ from django.template.response import TemplateResponse
9 9
 
10 10
 from oscar.core.loading import import_module
11 11
 
12
-product_models = import_module('product.models', ['Item', 'ItemClass'])
13 12
 product_signals = import_module('product.signals', ['product_viewed', 'product_search'])
14 13
 basket_forms = import_module('basket.forms', ['FormFactory'])
15 14
 history_helpers = import_module('customer.history_helpers', ['receive_product_view'])
16 15
 
16
+from django.db.models import get_model
17
+
18
+item_model = get_model('product','item')
19
+item_class_model = get_model('product', 'itemclass')
17 20
 
18 21
 class ItemDetailView(DetailView):
19 22
     u"""View a single product."""
@@ -41,7 +44,7 @@ class ItemDetailView(DetailView):
41 44
         
42 45
         We cache the object as this method gets called twice."""
43 46
         if not self._item:
44
-            self._item = get_object_or_404(product_models.Item, pk=self.kwargs['item_id'])
47
+            self._item = get_object_or_404(item_model, pk=self.kwargs['item_id'])
45 48
         return self._item
46 49
     
47 50
     def get_context_data(self, **kwargs):
@@ -60,8 +63,8 @@ class ItemClassListView(ListView):
60 63
     paginate_by = 20
61 64
 
62 65
     def get_queryset(self):
63
-        item_class = get_object_or_404(product_models.ItemClass, slug=self.kwargs['item_class_slug'])
64
-        return product_models.Item.browsable.filter(item_class=item_class)
66
+        item_class = get_object_or_404(item_class_model, slug=self.kwargs['item_class_slug'])
67
+        return item_model.browsable.filter(item_class=item_class)
65 68
 
66 69
 
67 70
 class ProductListView(ListView):
@@ -84,9 +87,9 @@ class ProductListView(ListView):
84 87
             # Send signal to record the view of this product
85 88
             product_signals.product_search.send(sender=self, query=q, user=self.request.user)
86 89
             
87
-            return product_models.Item.browsable.filter(title__icontains=q)
90
+            return item_model.browsable.filter(title__icontains=q)
88 91
         else:
89
-            return product_models.Item.browsable.all()
92
+            return item_model.browsable.all()
90 93
         
91 94
     def get_context_data(self, **kwargs):
92 95
         context = super(ProductListView, self).get_context_data(**kwargs)

+ 15
- 0
oscar/core/application.py Parādīt failu

@@ -0,0 +1,15 @@
1
+class Application(object):
2
+    name = None
3
+    
4
+    def __init__(self, app_name=None):
5
+        self.app_name = app_name
6
+    
7
+    def get_urls(self):
8
+        u"""
9
+        Return the url patterns for this app, MUST be implemented in the subclass
10
+        """
11
+        pass
12
+    
13
+    @property
14
+    def urls(self):
15
+        return self.get_urls(), self.app_name, self.name

+ 3
- 1
oscar/urls.py Parādīt failu

@@ -1,8 +1,10 @@
1 1
 from django.conf.urls.defaults import *
2 2
 from django.conf import settings
3 3
 
4
+from oscar.apps.product import application as products_app
5
+
4 6
 urlpatterns = patterns('',
5
-    (r'product/', include('oscar.apps.product.urls')),
7
+    (r'products/', include(products_app.urls)),
6 8
     (r'basket/', include('oscar.apps.basket.urls')),
7 9
     (r'checkout/', include('oscar.apps.checkout.urls')),
8 10
     (r'order-management/', include('oscar.apps.order_management.urls')),

Notiek ielāde…
Atcelt
Saglabāt