From acf6b47c31ddc5de1671fb6353827bcf93c3a544 Mon Sep 17 00:00:00 2001 From: Kresten Laust Date: Wed, 15 Jan 2025 10:28:26 +0100 Subject: [PATCH] stregreport: Add all categories to overview (#532) * Add method to convert category into product IDs * Replace hardcoded values in template and views Removed product IDs, and removed the wet HTML with templating. * Pythonic * Fix black * Rename report-menu entries * Reorder sales reporting menu entries by usefulness * Remove unnecessary check * Add documentation to fjule_party * fixup! Add documentation to fjule_party * Move local variables to clarify use in template * Revert "Pythonic" This reverts commit aac3ee0858963b69a746cb2f987d56b078ff7842. * Test stregreport category ranks --- stregreport/tests.py | 32 +++++++ stregreport/urls.py | 2 +- stregreport/views.py | 59 +++---------- .../admin/stregsystem/report/ranks.html | 84 ++----------------- .../templates/shared_report_lists.html | 8 +- 5 files changed, 55 insertions(+), 130 deletions(-) diff --git a/stregreport/tests.py b/stregreport/tests.py index 29646a46..e2d16c00 100644 --- a/stregreport/tests.py +++ b/stregreport/tests.py @@ -6,6 +6,8 @@ from stregreport.models import BreadRazzia from freezegun import freeze_time +from stregsystem.models import Category + class ParseIdStringTests(TestCase): def test_parse_id_string_success(self): @@ -26,6 +28,36 @@ def test_parse_id_string_unicode(self): self.assertSequenceEqual([11, 13], res) +class CategoryRankReportTests(TestCase): + fixtures = ["initial_data"] + + def setUp(self): + Category.objects.all().delete() + + def test_no_categories(self): + self.client.login(username="tester", password="treotreo") + response = self.client.get(reverse("report_categoryranks"), {}, follow=True) + + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed("admin/stregsystem/report/ranks.html") + + self.assertEqual(len(response.context['stat_lists']), 0) + + def test_single_category_shown(self): + self.client.login(username="tester", password="treotreo") + catA = Category.objects.create(name="Category A") + catA.save() + + response = self.client.get(reverse("report_categoryranks"), {}, follow=True) + + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed("admin/stregsystem/report/ranks.html") + + stat_lists = response.context['stat_lists'] + + self.assertEqual(stat_lists[0][0], catA.name) + + class SalesReportTests(TestCase): fixtures = ["initial_data"] diff --git a/stregreport/urls.py b/stregreport/urls.py index da36a6c4..9ace114c 100644 --- a/stregreport/urls.py +++ b/stregreport/urls.py @@ -34,7 +34,7 @@ re_path(r'^admin/stregsystem/razzia/wizard_guide/$', views.razzia_wizard), re_path(r'^admin/stregsystem/razzia/wizard/$', views.razzia_view, name="razzia_view"), re_path(r'^admin/stregsystem/report/sales/$', views.sales, name="salesreporting"), - re_path(r'^admin/stregsystem/report/ranks/$', views.ranks), + re_path(r'^admin/stregsystem/report/ranks/$', views.ranks, name="report_categoryranks"), re_path(r'^admin/stregsystem/report/daily/$', views.daily), re_path(r'^admin/stregsystem/report/ranks/(?P\d+)$', views.ranks), re_path(r'^admin/stregsystem/report/$', views.reports), diff --git a/stregreport/views.py b/stregreport/views.py index 2766b9ee..319e0afe 100644 --- a/stregreport/views.py +++ b/stregreport/views.py @@ -303,61 +303,24 @@ def sales_product(request, ids, from_time, to_time, error=None): # both at 10 o'clock @permission_required("stregsystem.access_sales_reports") def ranks_for_year(request, year): - if year <= 1900 or year > 9999: - return render(request, 'admin/stregsystem/report/error_ranksnotfound.html', locals()) - milk = [2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 24, 25, 43, 44, 45, 1865] - caffeine = [11, 12, 30, 34, 37, 1787, 1790, 1791, 1795, 1799, 1800, 1803, 1804, 1837, 1864] - beer = [ - 13, - 14, - 29, - 42, - 47, - 54, - 65, - 66, - 1773, - 1776, - 1777, - 1779, - 1780, - 1783, - 1793, - 1794, - 1807, - 1808, - 1809, - 1820, - 1822, - 1840, - 1844, - 1846, - 1847, - 1853, - 1855, - 1856, - 1858, - 1859, - ] - coffee = [32, 35, 36, 39] - vitamin = [1850, 1851, 1852, 1863, 1880] - FORMAT = '%d/%m/%Y kl. %H:%M' - last_year = year - 1 - next_year = year + 1 from_time = fjule_party(year - 1) to_time = fjule_party(year) + kr_stat_list = sale_money_rank(from_time, to_time) - beer_stat_list = sale_product_rank(beer, from_time, to_time) - caffeine_stat_list = sale_product_rank(caffeine, from_time, to_time) - milk_stat_list = sale_product_rank(milk, from_time, to_time) - coffee_stat_list = sale_product_rank(coffee, from_time, to_time) - vitamin_stat_list = sale_product_rank(vitamin, from_time, to_time) + + stat_lists = [] + for cat in Category.objects.all(): + stat_lists.append((cat.name, sale_product_rank(get_product_ids_from_category(cat), from_time, to_time))) + from_time_string = from_time.strftime(FORMAT) to_time_string = to_time.strftime(FORMAT) current_date = timezone.now() show_next_year = year < current_date.year is_ongoing = current_date > from_time and current_date <= to_time + last_year = year - 1 + next_year = year + 1 + return render(request, 'admin/stregsystem/report/ranks.html', locals()) @@ -383,6 +346,10 @@ def sale_money_rank(from_time, to_time, rank_limit=10): return stat_list +def get_product_ids_from_category(category): + return category.product_set.values_list('id', flat=True) + + # year of the last fjuleparty def last_fjule_party_year(): current_date = timezone.now() diff --git a/stregsystem/templates/admin/stregsystem/report/ranks.html b/stregsystem/templates/admin/stregsystem/report/ranks.html index 610ba10e..e05eaa8d 100644 --- a/stregsystem/templates/admin/stregsystem/report/ranks.html +++ b/stregsystem/templates/admin/stregsystem/report/ranks.html @@ -15,17 +15,18 @@

Rangeringer for {{year}}

{% endif %}
-
+ {% for stat_list in stat_lists %} +
- + - {% for stat in beer_stat_list %} + {% for stat in stat_list.1 %} @@ -34,82 +35,7 @@

Rangeringer for {{year}}

{% endfor %}
Øl{{stat_list.0}}
# Bruger Antal
{{forloop.counter}} {{stat.username}}
-
- - - - - - - - - - {% for stat in caffeine_stat_list %} - - - - - - {% endfor %} -
Koffein
#BrugerAntal
{{forloop.counter}}{{stat.username}}{{stat.sale__count}}
-
-
- - - - - - - - - - {% for stat in milk_stat_list %} - - - - - - {% endfor %} -
Mælkeprodukter
#BrugerAntal
{{forloop.counter}}{{stat.username}}{{stat.sale__count}}
-
-
- - - - - - - - - - {% for stat in coffee_stat_list %} - - - - - - {% endfor %} -
Kaffe
#BrugerAntal
{{forloop.counter}}{{stat.username}}{{stat.sale__count}}
-
-
- - - - - - - - - - {% for stat in vitamin_stat_list %} - - - - - - {% endfor %} -
Vitaminvand
#BrugerAntal
{{forloop.counter}}{{stat.username}}{{stat.sale__count}}
-
+ {% endfor %}
diff --git a/stregsystem/templates/shared_report_lists.html b/stregsystem/templates/shared_report_lists.html index 660ba6f2..c2dad27b 100644 --- a/stregsystem/templates/shared_report_lists.html +++ b/stregsystem/templates/shared_report_lists.html @@ -6,22 +6,22 @@
- + - + - + - +
{% blocktrans with app.name as name %}Rapporter{% endblocktrans %}
Købs- og forbrugsrangeringerDaglig omsætning    
SalgsrapporteringerKategorirangeringer    
Daglig rapporteringBruger køb i udvalgte kategorier    
Bruger køb i kategorierSalgsrapporteringer for udvalgte produkter