Преглед на файлове

Created new app for ranges

master
David Winterbottom преди 13 години
родител
ревизия
30134677a9

+ 1
- 0
oscar/__init__.py Целия файл

@@ -55,6 +55,7 @@ OSCAR_CORE_APPS = [
55 55
     'oscar.apps.dashboard.promotions',
56 56
     'oscar.apps.dashboard.catalogue',
57 57
     'oscar.apps.dashboard.offers',
58
+    'oscar.apps.dashboard.ranges',
58 59
 ]
59 60
 
60 61
 

+ 4
- 2
oscar/apps/dashboard/app.py Целия файл

@@ -9,6 +9,7 @@ from oscar.apps.dashboard.promotions.app import application as promotions_app
9 9
 from oscar.apps.dashboard.catalogue.app import application as catalogue_app
10 10
 from oscar.apps.dashboard.pages.app import application as pages_app
11 11
 from oscar.apps.dashboard.offers.app import application as offers_app
12
+from oscar.apps.dashboard.ranges.app import application as ranges_app
12 13
 from oscar.apps.dashboard import views
13 14
 
14 15
 
@@ -23,6 +24,7 @@ class DashboardApplication(Application):
23 24
     promotions_app = promotions_app
24 25
     pages_app = pages_app
25 26
     offers_app = offers_app
27
+    ranges_app = ranges_app
26 28
 
27 29
     def get_urls(self):
28 30
         urlpatterns = patterns('',
@@ -31,11 +33,11 @@ class DashboardApplication(Application):
31 33
             url(r'^reports/', include(self.reports_app.urls)),
32 34
             url(r'^orders/', include(self.orders_app.urls)),
33 35
             url(r'^users/', include(self.users_app.urls)),
34
-            url(r'^promotions/', include(self.promotions_app.urls)),
36
+            url(r'^content-blocks/', include(self.promotions_app.urls)),
35 37
             url(r'^pages/', include(self.pages_app.urls)),
36 38
             url(r'^offers/', include(self.offers_app.urls)),
39
+            url(r'^ranges/', include(self.ranges_app.urls)),
37 40
         )
38
-
39 41
         return self.post_process_urls(urlpatterns)
40 42
 
41 43
     def get_url_decorator(self, url_name):

+ 0
- 18
oscar/apps/dashboard/offers/app.py Целия файл

@@ -9,11 +9,6 @@ node = Node('Offers')
9 9
 node.add_child(Node('All offers', 'dashboard:offer-list'))
10 10
 register(node, 50)
11 11
 
12
-node = Node('Ranges')
13
-node.add_child(Node('All ranges', 'dashboard:range-list'))
14
-register(node, 55)
15
-
16
-
17 12
 class OffersDashboardApplication(Application):
18 13
     name = None
19 14
     list_view = views.OfferListView
@@ -25,12 +20,6 @@ class OffersDashboardApplication(Application):
25 20
     delete_view = views.OfferDeleteView
26 21
     detail_view = views.OfferDetailView
27 22
 
28
-    range_list_view = views.RangeListView
29
-    range_create_view = views.RangeCreateView
30
-    range_update_view = views.RangeUpdateView
31
-    range_delete_view = views.RangeDeleteView
32
-    range_products_view = views.RangeProductListView
33
-
34 23
     def get_urls(self):
35 24
         urlpatterns = patterns('',
36 25
             url(r'^$', self.list_view.as_view(), name='offer-list'),
@@ -48,13 +37,6 @@ class OffersDashboardApplication(Application):
48 37
             url(r'^(?P<pk>\d+)/delete/$', self.delete_view.as_view(), name='offer-delete'),
49 38
             # Stats
50 39
             url(r'^(?P<pk>\d+)/$', self.detail_view.as_view(), name='offer-detail'),
51
-            # Ranges
52
-            url(r'^ranges/$', self.range_list_view.as_view(), name='range-list'),
53
-            url(r'^ranges/create/$', self.range_create_view.as_view(), name='range-create'),
54
-            url(r'^ranges/(?P<pk>\d+)/$', self.range_update_view.as_view(), name='range-update'),
55
-            url(r'^ranges/(?P<pk>\d+)/delete/$', self.range_delete_view.as_view(), name='range-delete'),
56
-            url(r'^ranges/(?P<pk>\d+)/products/$',
57
-                self.range_products_view.as_view(), name='range-products'),
58 40
         )
59 41
         return self.post_process_urls(urlpatterns)
60 42
 

+ 0
- 23
oscar/apps/dashboard/offers/forms.py Целия файл

@@ -33,26 +33,3 @@ class PreviewForm(forms.Form):
33 33
 class OfferSearchForm(forms.Form):
34 34
     name = forms.CharField(required=False, label="Offer name")
35 35
     is_active = forms.BooleanField(required=False)
36
-
37
-
38
-def o():
39
-    product_title = forms.CharField(required=False, label="Product name")
40
-    product_id = forms.CharField(required=False, label="Product ID")
41
-
42
-    status_choices = (('', '---------'),) + tuple([(v, v) for v in Order.all_statuses()])
43
-    status = forms.ChoiceField(choices=status_choices, label="Status", required=False)
44
-
45
-    date_formats = ('%d/%m/%Y',)
46
-    date_from = forms.DateField(required=False, label="Date from", input_formats=date_formats)
47
-    date_to = forms.DateField(required=False, label="Date to", input_formats=date_formats)
48
-
49
-    voucher = forms.CharField(required=False, label="Voucher code")
50
-
51
-    method_choices = (('', '---------'),) + tuple([(src.code, src.name) for src in SourceType.objects.all()])
52
-    payment_method = forms.ChoiceField(label="Payment method", required=False,
53
-                                       choices=method_choices)
54
-
55
-    format_choices = (('html', 'HTML'),
56
-                      ('csv', 'CSV'),)
57
-    response_format = forms.ChoiceField(widget=forms.RadioSelect,
58
-            choices=format_choices, initial='html', label="Get results as")

+ 0
- 0
oscar/apps/dashboard/ranges/__init__.py Целия файл


+ 36
- 0
oscar/apps/dashboard/ranges/app.py Целия файл

@@ -0,0 +1,36 @@
1
+from django.conf.urls.defaults import patterns, url
2
+from django.contrib.admin.views.decorators import staff_member_required
3
+
4
+from oscar.core.application import Application
5
+from oscar.apps.dashboard.ranges import views
6
+from oscar.apps.dashboard.nav import register, Node
7
+
8
+node = Node('Ranges')
9
+node.add_child(Node('All ranges', 'dashboard:range-list'))
10
+register(node, 55)
11
+
12
+
13
+class RangeDashboardApplication(Application):
14
+    name = None
15
+
16
+    list_view = views.RangeListView
17
+    create_view = views.RangeCreateView
18
+    update_view = views.RangeUpdateView
19
+    delete_view = views.RangeDeleteView
20
+    products_view = views.RangeProductListView
21
+
22
+    def get_urls(self):
23
+        urlpatterns = patterns('',
24
+            url(r'^$', self.list_view.as_view(), name='range-list'),
25
+            url(r'^create/$', self.create_view.as_view(), name='range-create'),
26
+            url(r'^(?P<pk>\d+)/$', self.update_view.as_view(), name='range-update'),
27
+            url(r'^(?P<pk>\d+)/delete/$', self.delete_view.as_view(), name='range-delete'),
28
+            url(r'^(?P<pk>\d+)/products/$', self.products_view.as_view(), name='range-products'),
29
+        )
30
+        return self.post_process_urls(urlpatterns)
31
+
32
+    def get_url_decorator(self, url_name):
33
+        return staff_member_required
34
+
35
+
36
+application = RangeDashboardApplication()

+ 5
- 0
oscar/apps/dashboard/ranges/forms.py Целия файл

@@ -0,0 +1,5 @@
1
+from django import forms
2
+
3
+
4
+class RangeProductForm(forms.Form):
5
+    pass

+ 0
- 0
oscar/apps/dashboard/ranges/models.py Целия файл


+ 63
- 0
oscar/apps/dashboard/ranges/views.py Целия файл

@@ -0,0 +1,63 @@
1
+from django.views.generic import (ListView, DeleteView, CreateView, UpdateView)
2
+from django.db.models.loading import get_model
3
+from django.core.urlresolvers import reverse
4
+from django.contrib import messages
5
+from django.shortcuts import get_object_or_404
6
+
7
+from oscar.core.loading import get_classes
8
+
9
+Range = get_model('offer', 'Range')
10
+Product = get_model('catalogue', 'Product')
11
+RangeProductForm = get_classes('dashboard.ranges.forms', ['RangeProductForm'])
12
+
13
+
14
+class RangeListView(ListView):
15
+    model = Range
16
+    context_object_name = 'ranges'
17
+    template_name = 'dashboard/ranges/range_list.html'
18
+
19
+
20
+class RangeCreateView(CreateView):
21
+    model = Range
22
+    template_name = 'dashboard/ranges/range_form.html'
23
+
24
+    def get_success_url(self):
25
+        messages.success(self.request, "Range created")
26
+        return reverse('dashboard:range-list')
27
+
28
+
29
+class RangeUpdateView(UpdateView):
30
+    model = Range
31
+    template_name = 'dashboard/ranges/range_form.html'
32
+
33
+    def get_success_url(self):
34
+        messages.success(self.request, "Range updated")
35
+        return reverse('dashboard:range-list')
36
+
37
+
38
+class RangeDeleteView(DeleteView):
39
+    model = Range
40
+    template_name = 'dashboard/ranges/range_delete.html'
41
+    context_object_name = 'range'
42
+
43
+    def get_success_url(self):
44
+        messages.warning(self.request, "Range deleted")
45
+        return reverse('dashboard:range-list')
46
+
47
+
48
+class RangeProductListView(ListView):
49
+    model = Product
50
+    template_name = 'dashboard/ranges/range_product_list.html'
51
+    context_object_name = 'products'
52
+
53
+    def get(self, request, *args, **kwargs):
54
+        self.range = get_object_or_404(Range, id=self.kwargs['pk'])
55
+        return super(RangeProductListView, self).get(request, *args, **kwargs)
56
+
57
+    def get_queryset(self):
58
+        return self.range.included_products.all()
59
+
60
+    def get_context_data(self, **kwargs):
61
+        ctx = super(RangeProductListView, self).get_context_data(**kwargs)
62
+        ctx['range'] = self.range
63
+        return ctx

+ 36
- 0
oscar/templates/dashboard/ranges/range_delete.html Целия файл

@@ -0,0 +1,36 @@
1
+{% extends 'dashboard/layout.html' %}
2
+{% load currency_filters %}
3
+
4
+{% block title %}
5
+Delete range #{{ range.id }}? | Offer management | {{ block.super }}
6
+{% endblock %}
7
+
8
+{% block breadcrumbs %}
9
+<ul class="breadcrumb">
10
+    <li>
11
+        <a href="{% url dashboard:index %}">Dashboard</a>
12
+        <span class="divider">/</span>
13
+    </li>
14
+    <li>
15
+        <a href="{% url dashboard:offer-list %}">Offers</a>
16
+        <span class="divider">/</span>
17
+    </li>
18
+	<li class="active"><a href=".">Delete range #{{ range.id }}?</a></li>
19
+</ul>
20
+{% endblock %}
21
+
22
+{% block header %}
23
+<div class="page-header">
24
+	<h1>Delete range #{{ range.id }}?</h1>
25
+</div>
26
+{% endblock header %}
27
+
28
+{% block dashboard_content %}
29
+<form action="." method="post" class="">
30
+	{% csrf_token %}
31
+	<div class="form-actions">
32
+		<button class="btn btn-danger btn-large" type="submit">Delete</button> or
33
+		<a href="{% url dashboard:offer-list %}">cancel</a>
34
+	</div>
35
+</form>
36
+{% endblock dashboard_content %}

+ 39
- 0
oscar/templates/dashboard/ranges/range_form.html Целия файл

@@ -0,0 +1,39 @@
1
+{% extends 'dashboard/layout.html' %}
2
+{% load currency_filters %}
3
+
4
+{% block title %}
5
+Create range | Offer management | {{ block.super }}
6
+{% endblock %}
7
+
8
+{% block breadcrumbs %}
9
+<ul class="breadcrumb">
10
+    <li>
11
+        <a href="{% url dashboard:index %}">Dashboard</a>
12
+        <span class="divider">/</span>
13
+    </li>
14
+    <li>
15
+        <a href="{% url dashboard:offer-list %}">Offers</a>
16
+        <span class="divider">/</span>
17
+    </li>
18
+	<li class="active"><a href=".">Create range</a></li>
19
+</ul>
20
+{% endblock %}
21
+
22
+{% block header %}
23
+<div class="page-header">
24
+	<h1>Create range</h1>
25
+</div>
26
+{% endblock header %}
27
+
28
+{% block dashboard_content %}
29
+<form action="." method="post" class="">
30
+	{% csrf_token %}
31
+	{% include "partials/form_fields.html" with form=form %}
32
+	{% block form_actions %}
33
+	<div class="form-actions">
34
+		<button class="btn btn-primary btn-large" type="submit">Save</button> or
35
+		<a href="{% url dashboard:offer-list %}">cancel</a>
36
+	</div>
37
+	{% endblock form_actions %}
38
+</form>
39
+{% endblock dashboard_content %}

+ 58
- 0
oscar/templates/dashboard/ranges/range_list.html Целия файл

@@ -0,0 +1,58 @@
1
+{% extends 'dashboard/layout.html' %}
2
+{% load currency_filters %}
3
+
4
+{% block title %}
5
+Range management | {{ block.super }}
6
+{% endblock %}
7
+
8
+{% block breadcrumbs %}
9
+<ul class="breadcrumb">
10
+    <li>
11
+        <a href="{% url dashboard:index %}">Dashboard</a>
12
+        <span class="divider">/</span>
13
+    </li>
14
+    <li class="active"><a href=".">Range management</a></li>
15
+</ul>
16
+{% endblock %}
17
+
18
+{% block header %}
19
+<div class="page-header">
20
+    <h1>Range management</h1>
21
+</div>
22
+{% endblock header %}
23
+
24
+{% block dashboard_content %}
25
+
26
+	<p><a href="{% url dashboard:range-create %}" class="btn-large btn-primary">Create new range</a></p>
27
+
28
+	<div class="sub-header">
29
+		<h2>All ranges</h2>
30
+	</div>
31
+	{% if ranges.count %}
32
+		<table class="table table-striped table-bordered">
33
+			<tr>
34
+				<th>Name</th>
35
+				<th>Num products</th>
36
+				<th>Date created</th>
37
+				<th></th>
38
+			</tr>
39
+			{% for range in ranges %}
40
+			<tr>
41
+				<td>{{ range.name }}</td>
42
+				<td>{{ range.num_products|default:"-" }}</td>
43
+				<td>{{ range.date_created }}</td>
44
+				<td>
45
+					<a class="btn btn-primary" href="{% url dashboard:range-update range.id %}">Edit</a>
46
+					<a class="btn btn-primary" href="{% url dashboard:range-products range.id %}">Edit products</a>
47
+					<a class="btn btn-danger" href="{% url dashboard:range-delete range.id %}">Delete</a>
48
+				</td>
49
+			</tr>
50
+			{% endfor %}
51
+		</table>
52
+		{% if page_obj %}
53
+			{% include "catalogue/partials/pagination.html" %}
54
+		{% endif %}
55
+	{% else %}
56
+		<p>No ranges found.</p>
57
+	{% endif %}
58
+{% endblock dashboard_content %}

+ 58
- 0
oscar/templates/dashboard/ranges/range_product_list.html Целия файл

@@ -0,0 +1,58 @@
1
+{% extends 'dashboard/layout.html' %}
2
+{% load currency_filters %}
3
+
4
+{% block title %}
5
+Products in range {{ range.name }} | {{ block.super }}
6
+{% endblock %}
7
+
8
+{% block breadcrumbs %}
9
+<ul class="breadcrumb">
10
+    <li>
11
+        <a href="{% url dashboard:index %}">Dashboard</a>
12
+        <span class="divider">/</span>
13
+    </li>
14
+    <li>
15
+	<a href="{% url dashboard:range-update range.id %}">Range {{ range.name }}</a>
16
+        <span class="divider">/</span>
17
+    </li>
18
+	<li class="active"><a href=".">Products</a></li>
19
+</ul>
20
+{% endblock %}
21
+
22
+{% block header %}
23
+<div class="page-header">
24
+	<h1>Products in range {{ range.name }}</h1>
25
+</div>
26
+{% endblock header %}
27
+
28
+{% block dashboard_content %}
29
+	<div class="sub-header">
30
+		<h2>Products</h2>
31
+	</div>
32
+	{% if products.count %}
33
+		<form action="." method="post" class="order_table">
34
+			{% csrf_token %}
35
+			<table class="table table-striped table-bordered">
36
+				<tr>
37
+					<th>Title</th>
38
+					<th>Price</th>
39
+					<th></th>
40
+				</tr>
41
+				{% for product in products %}
42
+				<tr>
43
+					<td>{{ product.get_title }}</td>
44
+					<td>{{ product.stockrecord.price_incl_tax|currency }}</td>
45
+					<td>
46
+						<a class="btn btn-danger" href="">Remove</a>
47
+					</td>
48
+				</tr>
49
+				{% endfor %}
50
+			</table>
51
+			{% if page_obj %}
52
+				{% include "catalogue/partials/pagination.html" %}
53
+			{% endif %}
54
+		</form>
55
+	{% else %}
56
+		<p>No products found.</p>
57
+	{% endif %}
58
+{% endblock dashboard_content %}

Loading…
Отказ
Запис