Bladeren bron

Enable generating reports as html and csv.

master
Asia Biega 13 jaren geleden
bovenliggende
commit
5f1aff6a71

+ 61
- 32
oscar/apps/analytics/reports.py Bestand weergeven

@@ -6,43 +6,57 @@ from django.template.defaultfilters import date
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 11
 ProductRecord = get_model('analytics', 'ProductRecord')
10 12
 UserRecord = get_model('analytics', 'UserRecord')
11 13
 
12 14
 
13
-class ProductReportGenerator(ReportGenerator):
14
-    
15
-    filename_template = 'product-analytics.csv'
16
-    code = 'product_analytics'
17
-    description = 'Product analytics'
18
-    
19
-    def generate(self, response):
15
+class ProductReportCSVFormatter(ReportCSVFormatter):
16
+    filename_template = 'conditional-offer-performance.csv'
17
+
18
+    def generate_csv(self, response, products):
20 19
         writer = csv.writer(response)
21 20
         header_row = ['Product',
22 21
                       'Views',
23 22
                       'Basket additions',
24 23
                       'Purchases',]
25 24
         writer.writerow(header_row)
26
-        
27
-        records = ProductRecord._default_manager.all()
28
-        for record in records:
29
-            row = [record.product, record.num_views, record.num_basket_additions, record.num_purchases]
25
+
26
+        for record in products:
27
+            row = [record.product,
28
+                   record.num_views,
29
+                   record.num_basket_additions,
30
+                   record.num_purchases]
30 31
             writer.writerow(row)
31
-            
32
+
33
+
34
+class ProductReportHTMLFormatter(ReportHTMLFormatter):
35
+    template = 'dashboard/reports/partials/product_report.html'
36
+
37
+
38
+class ProductReportGenerator(ReportGenerator):
39
+
40
+    code = 'product_analytics'
41
+    description = 'Product analytics'
42
+
43
+    formatters = {
44
+      'CSV_formatter': ProductReportCSVFormatter,
45
+      'HTML_formatter': ProductReportHTMLFormatter
46
+    }
47
+
48
+    def generate(self):
49
+        records = ProductRecord._default_manager.all()
50
+        return self.formatter.generate_response(records)
51
+
32 52
     def is_available_to(self, user):
33 53
         return user.is_staff
34
-    
35
-    def filename(self):
36
-        return self.filename_template
37
-    
38 54
 
39
-class UserReportGenerator(ReportGenerator):
40
-    
55
+
56
+class UserReportCSVFormatter(ReportCSVFormatter):
41 57
     filename_template = 'user-analytics.csv'
42
-    code = 'user_analytics'
43
-    description = 'User analytics'
44
-    
45
-    def generate(self, response):
58
+
59
+    def generate_csv(self, response, users):
46 60
         writer = csv.writer(response)
47 61
         header_row = ['Name',
48 62
                       'Date registered',
@@ -55,22 +69,37 @@ class UserReportGenerator(ReportGenerator):
55 69
                       'Date of last order',
56 70
                       ]
57 71
         writer.writerow(header_row)
58
-        
59
-        records = UserRecord._default_manager.select_related().all()
60
-        for record in records:
61
-            row = [record.user.get_full_name(), 
72
+
73
+        for record in users:
74
+            row = [record.user.get_full_name(),
62 75
                    self.format_date(record.user.date_joined),
63
-                   record.num_product_views, 
64
-                   record.num_basket_additions, 
76
+                   record.num_product_views,
77
+                   record.num_basket_additions,
65 78
                    record.num_orders,
66 79
                    record.num_order_lines,
67 80
                    record.num_order_items,
68 81
                    record.total_spent,
69 82
                    self.format_datetime(record.date_last_order)]
70 83
             writer.writerow(row)
71
-            
84
+
85
+
86
+class UserReportHTMLFormatter(ReportHTMLFormatter):
87
+    template = 'dashboard/reports/partials/user_report.html'
88
+
89
+
90
+class UserReportGenerator(ReportGenerator):
91
+
92
+    code = 'user_analytics'
93
+    description = 'User analytics'
94
+
95
+    formatters = {
96
+        'CSV_formatter': UserReportCSVFormatter,
97
+        'HTML_formatter': UserReportHTMLFormatter
98
+    }
99
+
100
+    def generate(self):
101
+        users = UserRecord._default_manager.select_related().all()
102
+        return self.formatter.generate_response(users)
103
+
72 104
     def is_available_to(self, user):
73 105
         return user.is_staff
74
-    
75
-    def filename(self):
76
-        return self.filename_template

+ 68
- 21
oscar/apps/basket/reports.py Bestand weergeven

@@ -4,19 +4,16 @@ from django.db.models import get_model
4 4
 
5 5
 from oscar.core.loading import get_class, get_classes
6 6
 ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
7
+ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
8
+ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
7 9
 Basket = get_model('basket', 'Basket')
8 10
 OPEN, SUBMITTED = get_classes('basket.models', ['OPEN', 'SUBMITTED'])
9 11
 
10 12
 
11
-class OpenBasketReportGenerator(ReportGenerator):
12
-    """
13
-    Report of baskets which haven't been submitted yet
14
-    """
13
+class OpenBasketReportCSVFormatter(ReportCSVFormatter):
15 14
     filename_template = 'open-baskets-%s-%s.csv'
16
-    code = 'open_baskets'
17
-    description = 'Open baskets'
18
-    
19
-    def generate(self, response):
15
+
16
+    def generate_csv(self, response, baskets):
20 17
         writer = csv.writer(response)
21 18
         header_row = ['User ID',
22 19
                       'Name',
@@ -29,31 +26,53 @@ class OpenBasketReportGenerator(ReportGenerator):
29 26
                       'Time since creation',
30 27
                      ]
31 28
         writer.writerow(header_row)
32
-        
33
-        baskets = Basket._default_manager.filter(status=OPEN)
29
+
34 30
         for basket in baskets:
35 31
             if basket.owner:
36 32
                 row = [basket.owner_id, basket.owner.get_full_name(), basket.owner.email,
37 33
                        basket.status, basket.num_lines,
38
-                       basket.num_items, basket.total_incl_tax, 
39
-                       self.format_datetime(basket.date_created), 
34
+                       basket.num_items, basket.total_incl_tax,
35
+                       self.format_datetime(basket.date_created),
40 36
                        basket.time_since_creation]
41 37
             else:
42 38
                 row = [basket.owner_id, None, None, basket.status, basket.num_lines,
43
-                       basket.num_items, basket.total_incl_tax, 
39
+                       basket.num_items, basket.total_incl_tax,
44 40
                        self.format_datetime(basket.date_created), basket.time_since_creation]
45 41
             writer.writerow(row)
46 42
 
43
+    def filename(self, **kwargs):
44
+        return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
47 45
 
48
-class SubmittedBasketReportGenerator(ReportGenerator):
46
+
47
+class OpenBasketReportHTMLFormatter(ReportHTMLFormatter):
48
+    template = 'dashboard/reports/partials/open_basket_report.html'
49
+
50
+
51
+class OpenBasketReportGenerator(ReportGenerator):
49 52
     """
50
-    Report of baskets that have been submitted
53
+    Report of baskets which haven't been submitted yet
51 54
     """
55
+    code = 'open_baskets'
56
+    description = 'Open baskets'
57
+
58
+    formatters = {
59
+        'CSV_formatter': OpenBasketReportCSVFormatter,
60
+        'HTML_formatter': OpenBasketReportHTMLFormatter
61
+    }
62
+
63
+    def generate(self):
64
+        additional_data = {
65
+            'start_date': self.start_date,
66
+            'end_date': self.end_date
67
+        }
68
+        baskets = Basket._default_manager.filter(status=OPEN)
69
+        return self.formatter.generate_response(baskets, **additional_data)
70
+
71
+
72
+class SubmittedBasketReportCSVFormatter(ReportCSVFormatter):
52 73
     filename_template = 'submitted_baskets-%s-%s.csv'
53
-    code = 'submitted_baskets'
54
-    description = 'Submitted baskets'
55
-    
56
-    def generate(self, response):
74
+
75
+    def generate_csv(self, response, baskets):
57 76
         writer = csv.writer(response)
58 77
         header_row = ['User ID',
59 78
                       'User',
@@ -65,8 +84,7 @@ class SubmittedBasketReportGenerator(ReportGenerator):
65 84
                       'Time between creation and submission',
66 85
                      ]
67 86
         writer.writerow(header_row)
68
-        
69
-        baskets = Basket._default_manager.filter(status=SUBMITTED)
87
+
70 88
         for basket in baskets:
71 89
             row = [basket.owner_id,
72 90
                    basket.owner,
@@ -77,3 +95,32 @@ class SubmittedBasketReportGenerator(ReportGenerator):
77 95
                    self.format_datetime(basket.date_created),
78 96
                    basket.time_before_submit]
79 97
             writer.writerow(row)
98
+
99
+    def filename(self, **kwargs):
100
+        return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
101
+
102
+
103
+class SubmittedBasketReportHTMLFormatter(ReportHTMLFormatter):
104
+    template = 'dashboard/reports/partials/submitted_basket_report.html'
105
+
106
+
107
+class SubmittedBasketReportGenerator(ReportGenerator):
108
+    """
109
+    Report of baskets that have been submitted
110
+    """
111
+    code = 'submitted_baskets'
112
+    description = 'Submitted baskets'
113
+
114
+    formatters = {
115
+        'CSV_formatter': SubmittedBasketReportCSVFormatter,
116
+        'HTML_formatter': SubmittedBasketReportHTMLFormatter
117
+    }
118
+
119
+    def generate(self):
120
+        additional_data = {
121
+            'start_date': self.start_date,
122
+            'end_date': self.end_date
123
+        }
124
+        baskets = Basket._default_manager.filter(status=SUBMITTED)
125
+        return self.formatter.generate_response(baskets, **additional_data)
126
+

+ 3
- 3
oscar/apps/dashboard/reports/forms.py Bestand weergeven

@@ -6,16 +6,16 @@ GeneratorRepository = get_class('dashboard.reports.utils', 'GeneratorRepository'
6 6
 
7 7
 class ReportForm(forms.Form):
8 8
     generators = GeneratorRepository().get_report_generators()
9
-    
9
+
10 10
     type_choices = []
11 11
     for generator in generators:
12 12
         type_choices.append((generator.code, generator.description))
13 13
     report_type = forms.ChoiceField(widget=forms.Select(), choices=type_choices)
14 14
     date_from = forms.DateField()
15 15
     date_to = forms.DateField()
16
-    
16
+    download = forms.BooleanField(required=False)
17
+
17 18
     def clean(self):
18 19
         if 'date_from' in self.cleaned_data and 'date_to' in self.cleaned_data and self.cleaned_data['date_from'] > self.cleaned_data['date_to']:
19 20
             raise forms.ValidationError("Your start date must be before your end date")
20 21
         return self.cleaned_data
21
-   

+ 32
- 6
oscar/apps/dashboard/reports/reports.py Bestand weergeven

@@ -1,38 +1,64 @@
1 1
 from django.template.defaultfilters import date
2
+from django.template import loader, Context
3
+from django.http import HttpResponse
2 4
 
3 5
 
4 6
 class ReportGenerator(object):
5 7
     """
6
-    Top-level class that needs to be subclassed to provide a 
8
+    Top-level class that needs to be subclassed to provide a
7 9
     report generator.
8 10
     """
9 11
     filename_template = 'report-%s-to-%s.csv'
10 12
     mimetype = 'text/csv'
11 13
     code = ''
12 14
     description = '<insert report description>'
13
-    
15
+
14 16
     def __init__(self, **kwargs):
15 17
         if 'start_date' in kwargs and 'end_date' in kwargs:
16 18
             self.start_date = kwargs['start_date']
17 19
             self.end_date = kwargs['end_date']
18
-    
20
+
21
+        self.formatter = self.formatters['%s_formatter' % kwargs['formatter']]()
22
+
19 23
     def generate(self, response):
20 24
         pass
21
- 
25
+
22 26
     def filename(self):
23 27
         """
24 28
         Returns the filename for this report
25 29
         """
26 30
         return self.filename_template % (self.start_date, self.end_date)
27
-    
31
+
28 32
     def is_available_to(self, user):
29 33
         """
30 34
         Checks whether this report is available to this user
31 35
         """
32 36
         return user.is_staff
33 37
 
38
+
39
+class ReportFormatter(object):
34 40
     def format_datetime(self, dt):
35 41
         return date(dt, 'DATETIME_FORMAT')
36 42
 
37 43
     def format_date(self, d):
38
-        return date(d, 'DATE_FORMAT')
44
+        return date(d, 'DATE_FORMAT')
45
+
46
+    def filename(self):
47
+        return self.filename_template
48
+
49
+
50
+class ReportCSVFormatter(ReportFormatter):
51
+
52
+    def generate_response(self, objects, **kwargs):
53
+        response = HttpResponse(mimetype='text/csv')
54
+        response['Content-Disposition'] = 'attachment; filename=%s' % self.filename(**kwargs)
55
+        self.generate_csv(response, objects)
56
+        return response
57
+
58
+
59
+class ReportHTMLFormatter(ReportFormatter):
60
+
61
+    def generate_response(self, objects, **kwargs):
62
+        template = loader.get_template(self.template)
63
+        ctx = Context({'objects': objects})
64
+        return template.render(ctx)

+ 4
- 4
oscar/apps/dashboard/reports/utils.py Bestand weergeven

@@ -8,7 +8,7 @@ VoucherReportGenerator = get_class('voucher.reports', 'VoucherReportGenerator')
8 8
 
9 9
 
10 10
 class GeneratorRepository(object):
11
-    
11
+
12 12
     generators = [OrderReportGenerator,
13 13
                   ProductReportGenerator,
14 14
                   UserReportGenerator,
@@ -19,11 +19,11 @@ class GeneratorRepository(object):
19 19
 
20 20
     def get_report_generators(self):
21 21
         return self.generators
22
-    
22
+
23 23
     def get_generator(self, code):
24 24
         for generator in self.generators:
25 25
             if generator.code == code:
26 26
                 return generator
27 27
         return None
28
-    
29
-    
28
+
29
+

+ 16
- 8
oscar/apps/dashboard/reports/views.py Bestand weergeven

@@ -9,7 +9,7 @@ GeneratorRepository = get_class('dashboard.reports.utils', 'GeneratorRepository'
9 9
 
10 10
 class IndexView(TemplateView):
11 11
     template_name = 'dashboard/reports/index.html'
12
-    
12
+
13 13
     def get(self, request, *args, **kwargs):
14 14
         if 'report_type' in request.GET:
15 15
             form = ReportForm(request.GET)
@@ -17,11 +17,14 @@ class IndexView(TemplateView):
17 17
                 generator = _get_generator(form)
18 18
                 if not generator.is_available_to(request.user):
19 19
                     return HttpResponseForbidden("You do not have access to this report")
20
-                
21
-                response = HttpResponse(mimetype=generator.mimetype)
22
-                response['Content-Disposition'] = 'attachment; filename=%s' % generator.filename()
23
-                generator.generate(response)
24
-                return response
20
+
21
+                report = generator.generate()
22
+
23
+                if form.cleaned_data['download']:
24
+                    return report
25
+                else:
26
+                    return TemplateResponse(request, self.template_name,
27
+                        {'form': form, 'report': report})
25 28
         else:
26 29
             form = ReportForm()
27 30
         return TemplateResponse(request, self.template_name, {'form': form})
@@ -34,5 +37,10 @@ def _get_generator(form):
34 37
     generator_cls = repo.get_generator(code)
35 38
     if not generator_cls:
36 39
         raise Http404()
37
-    return generator_cls(start_date=form.cleaned_data['date_from'], 
38
-                         end_date=form.cleaned_data['date_to'])
40
+
41
+    download = form.cleaned_data['download']
42
+    formatter = 'CSV' if download else 'HTML'
43
+
44
+    return generator_cls(start_date=form.cleaned_data['date_from'],
45
+                         end_date=form.cleaned_data['date_to'],
46
+                         formatter=formatter)

+ 26
- 8
oscar/apps/offer/reports.py Bestand weergeven

@@ -4,25 +4,43 @@ from django.db.models import get_model
4 4
 
5 5
 from oscar.core.loading import get_class
6 6
 ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
7
+ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
8
+ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
7 9
 ConditionalOffer = get_model('offer', 'ConditionalOffer')
8 10
 
9 11
 
10
-class OfferReportGenerator(ReportGenerator):
11
-    
12
+class OfferReportCSVFormatter(ReportCSVFormatter):
12 13
     filename_template = 'conditional-offer-performance.csv'
13
-    code = 'conditional-offers'
14
-    description = 'Offer performance'
15
-    
16
-    def generate(self, response):
14
+
15
+    def generate_csv(self, response, offers):
17 16
         writer = csv.writer(response)
18 17
         header_row = ['Offer',
19 18
                       'Total discount',
20 19
                      ]
21 20
         writer.writerow(header_row)
22
-        
23
-        for offer in ConditionalOffer._default_manager.all():
21
+
22
+        for offer in offers:
24 23
             row = [offer, offer.total_discount]
25 24
             writer.writerow(row)
26 25
 
26
+
27
+class OfferReportHTMLFormatter(ReportHTMLFormatter):
28
+    template = 'dashboard/reports/partials/offer_report.html'
29
+
30
+
31
+class OfferReportGenerator(ReportGenerator):
32
+
33
+    code = 'conditional-offers'
34
+    description = 'Offer performance'
35
+
36
+    formatters = {
37
+        'CSV_formatter': OfferReportCSVFormatter,
38
+        'HTML_formatter': OfferReportHTMLFormatter,
39
+    }
40
+
41
+    def generate(self):
42
+        offers = ConditionalOffer._default_manager.all()
43
+        return self.formatter.generate_response(offers)
44
+
27 45
     def filename(self):
28 46
         return self.filename_template

+ 38
- 12
oscar/apps/order/reports.py Bestand weergeven

@@ -1,23 +1,19 @@
1 1
 import csv
2 2
 
3 3
 from django.db.models import get_model
4
+from django.template.response import TemplateResponse
4 5
 
5 6
 from oscar.core.loading import get_class
6 7
 ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
8
+ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
9
+ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
7 10
 Order = get_model('order', 'Order')
8 11
 
9 12
 
10
-class OrderReportGenerator(ReportGenerator):
11
-    
13
+class OrderReportCSVFormatter(ReportCSVFormatter):
12 14
     filename_template = 'orders-%s-to-%s.csv'
13
-    code = 'order_report'
14
-    description = "Orders placed"
15
-    
16
-    def generate(self, response):
17
-        orders = Order._default_manager.filter(
18
-            date_placed__gte=self.start_date
19
-        ).filter(date_placed__lt=self.end_date)
20
-        
15
+
16
+    def generate_csv(self, response, orders):
21 17
         writer = csv.writer(response)
22 18
         header_row = ['Order number',
23 19
                       'User',
@@ -30,6 +26,36 @@ class OrderReportGenerator(ReportGenerator):
30 26
                    order.total_incl_tax,
31 27
                    self.format_datetime(order.date_placed)]
32 28
             writer.writerow(row)
33
-            
29
+
30
+    def filename(self, **kwargs):
31
+        return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
32
+
33
+
34
+class OrderReportHTMLFormatter(ReportHTMLFormatter):
35
+    template = 'dashboard/reports/partials/order_report.html'
36
+
37
+
38
+class OrderReportGenerator(ReportGenerator):
39
+
40
+    code = 'order_report'
41
+    description = "Orders placed"
42
+
43
+    formatters = {
44
+        'CSV_formatter': OrderReportCSVFormatter,
45
+        'HTML_formatter': OrderReportHTMLFormatter,
46
+    }
47
+
48
+    def generate(self):
49
+        orders = Order._default_manager.filter(
50
+            date_placed__gte=self.start_date
51
+        ).filter(date_placed__lt=self.end_date)
52
+
53
+        additional_data = {
54
+            'start_date': self.start_date,
55
+            'end_date': self.end_date
56
+        }
57
+
58
+        return self.formatter.generate_response(orders, **additional_data)
59
+
34 60
     def is_available_to(self, user):
35
-        return user.is_staff and user.has_perm('order.can_view')
61
+        return user.is_staff and user.has_perm('order.can_view')

+ 28
- 11
oscar/apps/voucher/reports.py Bestand weergeven

@@ -2,16 +2,15 @@ import csv
2 2
 
3 3
 from oscar.core.loading import import_module
4 4
 import_module('dashboard.reports.reports', ['ReportGenerator'], locals())
5
+import_module('dashboard.reports.reports', ['ReportCSVFormatter'], locals())
6
+import_module('dashboard.reports.reports', ['ReportHTMLFormatter'], locals())
5 7
 import_module('voucher.models', ['Voucher'], locals())
6 8
 
7 9
 
8
-class VoucherReportGenerator(ReportGenerator):
9
-    
10
+class VoucherReportCSVFormatter(ReportCSVFormatter):
10 11
     filename_template = 'voucher-performance.csv'
11
-    code = 'vouchers'
12
-    description = 'Voucher performance'
13
-    
14
-    def generate(self, response):
12
+
13
+    def generate_csv(self, response, vouchers):
15 14
         writer = csv.writer(response)
16 15
         header_row = ['Voucher code',
17 16
                       'Added to a basket',
@@ -19,11 +18,29 @@ class VoucherReportGenerator(ReportGenerator):
19 18
                       'Total discount',
20 19
                      ]
21 20
         writer.writerow(header_row)
22
-        
23
-        vouchers = Voucher._default_manager.all()
21
+
24 22
         for voucher in vouchers:
25
-            row = [voucher.code, voucher.num_basket_additions, voucher.num_orders, voucher.total_discount]
23
+            row = [voucher.code,
24
+                   voucher.num_basket_additions,
25
+                   voucher.num_orders,
26
+                   voucher.total_discount]
26 27
             writer.writerow(row)
27 28
 
28
-    def filename(self):
29
-        return self.filename_template
29
+
30
+class VoucherReportHTMLFormatter(ReportHTMLFormatter):
31
+    template = 'dashboard/reports/partials/voucher_report.html'
32
+
33
+
34
+class VoucherReportGenerator(ReportGenerator):
35
+
36
+    code = 'vouchers'
37
+    description = 'Voucher performance'
38
+
39
+    formatters = {
40
+        'CSV_formatter': VoucherReportCSVFormatter,
41
+        'HTML_formatter': VoucherReportHTMLFormatter
42
+    }
43
+
44
+    def generate(self):
45
+        vouchers = Voucher._default_manager.all()
46
+        return self.formatter.generate_response(vouchers)

+ 4
- 0
oscar/templates/dashboard/reports/index.html Bestand weergeven

@@ -31,5 +31,9 @@ Reports | {{ block.super }}
31 31
     </div>
32 32
 </form>
33 33
 
34
+{% if report %}
35
+    {{ report }}
36
+{% endif %}
37
+
34 38
 {% endblock dashboard_content %}
35 39
 

+ 14
- 0
oscar/templates/dashboard/reports/partials/offer_report.html Bestand weergeven

@@ -0,0 +1,14 @@
1
+{% load currency_filters %}
2
+
3
+<table class="table table-striped table-bordered">
4
+    <tr>
5
+        <th>Offer</th>
6
+        <th>Total discount</th>
7
+    </tr>
8
+    {% for offer in objects %}
9
+    <tr>
10
+        <td>{{ offer }}</td>
11
+        <td>{{ offer.total_discount }}</td>
12
+    </tr>
13
+    {% endfor %}
14
+</table>

+ 28
- 0
oscar/templates/dashboard/reports/partials/open_basket_report.html Bestand weergeven

@@ -0,0 +1,28 @@
1
+{% load currency_filters %}
2
+
3
+<table class="table table-striped table-bordered">
4
+    <tr>
5
+        <th>User ID</th>
6
+        <th>Name</th>
7
+        <th>Email</th>
8
+        <th>Basket status</th>
9
+        <th>Num lines</th>
10
+        <th>Num items</th>
11
+        <th>Value</th>
12
+        <th>Date of creation</th>
13
+        <th>Time since creation</th>
14
+    </tr>
15
+    {% for basket in objects %}
16
+    <tr>
17
+        <td>{{ basket.owner_id }}</td>
18
+        <td>{{ basket.owner.get_full_name }}</td>
19
+        <td>{{ basket.owner.email }}</td>
20
+        <td>{{ basket.status }}</td>
21
+        <td>{{ basket.num_lines }}</td>
22
+        <td>{{ basket.num_items }}</td>
23
+        <td>{{ basket.total_incl_tax }}</td>
24
+        <td>{{ basket.date_created }}</td>
25
+        <td>{{ basket.time_since_creation }}</td>
26
+    </tr>
27
+    {% endfor %}
28
+</table>

+ 24
- 0
oscar/templates/dashboard/reports/partials/order_report.html Bestand weergeven

@@ -0,0 +1,24 @@
1
+{% load currency_filters %}
2
+
3
+<table class="table table-striped table-bordered">
4
+    <tr>
5
+        <th></th>
6
+        <th>Order number</th>
7
+        <th>User</th>
8
+        <th>Total incl. tax</th>
9
+        <th>Date placed</th>
10
+        <th></th>
11
+    </tr>
12
+    {% for order in objects %}
13
+    <tr>
14
+        <td><input type="checkbox" name="selected_order" class="selected_order" value="{{ order.id }}"/>
15
+        <td>{{ order.number }}</td>
16
+        <td>{{ order.user }}</td>
17
+        <td>{{ order.total_incl_tax|currency }}</td>
18
+        <td>{{ order.date_placed }}</td>
19
+        <td>
20
+            <a class="btn btn-info" href="{% url dashboard:order-detail order.number %}">View</a>
21
+        </td>
22
+    </tr>
23
+    {% endfor %}
24
+</table>

+ 18
- 0
oscar/templates/dashboard/reports/partials/product_report.html Bestand weergeven

@@ -0,0 +1,18 @@
1
+{% load currency_filters %}
2
+
3
+<table class="table table-striped table-bordered">
4
+    <tr>
5
+        <th>Product</th>
6
+        <th>Views</th>
7
+        <th>Basket additions</th>
8
+        <th>Purchases</th>
9
+    </tr>
10
+    {% for product in objects %}
11
+    <tr>
12
+        <td>{{ product.product }}</td>
13
+        <td>{{ product.num_views }}</td>
14
+        <td>{{ product.num_basket_additions }}</td>
15
+        <td>{{ product.num_purchases }}</td>
16
+    </tr>
17
+    {% endfor %}
18
+</table>

+ 26
- 0
oscar/templates/dashboard/reports/partials/submitted_basket_report.html Bestand weergeven

@@ -0,0 +1,26 @@
1
+{% load currency_filters %}
2
+
3
+<table class="table table-striped table-bordered">
4
+    <tr>
5
+        <th>User ID</th>
6
+        <th>User</th>
7
+        <th>Basket status</th>
8
+        <th>Num lines</th>
9
+        <th>Num items</th>
10
+        <th>Value</th>
11
+        <th>Date created</th>
12
+        <th>Time between creation and submission</th>
13
+    </tr>
14
+    {% for basket in objects %}
15
+    <tr>
16
+        <td>{{ basket.owner_id }}</td>
17
+        <td>{{ basket.owner }}</td>
18
+        <td>{{ basket.status }}</td>
19
+        <td>{{ basket.num_lines }}</td>
20
+        <td>{{ basket.num_items }}</td>
21
+        <td>{{ basket.total_incl_tax }}</td>
22
+        <td>{{ basket.date_created }}</td>
23
+        <td>{{ basket.time_before_submit }}</td>
24
+    </tr>
25
+    {% endfor %}
26
+</table>

+ 28
- 0
oscar/templates/dashboard/reports/partials/user_report.html Bestand weergeven

@@ -0,0 +1,28 @@
1
+{% load currency_filters %}
2
+
3
+<table class="table table-striped table-bordered">
4
+    <tr>
5
+        <th>Name</th>
6
+        <th>Date registered</th>
7
+        <th>Product views</th>
8
+        <th>Basket additions</th>
9
+        <th>Orders</th>
10
+        <th>Order lines</th>
11
+        <th>Order items</th>
12
+        <th>Total spent</th>
13
+        <th>Date of last order</th>
14
+    </tr>
15
+    {% for user in objects %}
16
+    <tr>
17
+        <td>{{ user.user.get_full_name }}</td>
18
+        <td>{{ user.user.date_joined }}</td>
19
+        <td>{{ user.num_product_views }}</td>
20
+        <td>{{ user.num_basket_additions }}</td>
21
+        <td>{{ user.num_orders }}</td>
22
+        <td>{{ user.num_order_lines }}</td>
23
+        <td>{{ user.num_order_items }}</td>
24
+        <td>{{ user.total_spent }}</td>
25
+        <td>{% if user.date_last_order %}{{ user.date_last_order }}{% endif %}</td>
26
+    </tr>
27
+    {% endfor %}
28
+</table>

+ 18
- 0
oscar/templates/dashboard/reports/partials/voucher_report.html Bestand weergeven

@@ -0,0 +1,18 @@
1
+{% load currency_filters %}
2
+
3
+<table class="table table-striped table-bordered">
4
+    <tr>
5
+        <th>Voucher code</th>
6
+        <th>Added to a basket</th>
7
+        <th>Used in an order</th>
8
+        <th>Total discount</th>
9
+    </tr>
10
+    {% for voucher in objects %}
11
+    <tr>
12
+        <td>{{ voucher.code }}</td>
13
+        <td>{{ voucher.num_basket_additions }}</td>
14
+        <td>{{ voucher.num_orders }}</td>
15
+        <td>{{ voucher.total_discount }}</td>
16
+    </tr>
17
+    {% endfor %}
18
+</table>

Laden…
Annuleren
Opslaan