diff --git a/src/backoffice/templates/index.html b/src/backoffice/templates/index.html
index bc9710cc..c121fe43 100644
--- a/src/backoffice/templates/index.html
+++ b/src/backoffice/templates/index.html
@@ -34,6 +34,14 @@
Manage Proposals
Use this view to manage SpeakerProposals and EventProposals
+
+ Merchandise Orders
+ Use this view to look at Merchandise Orders
+
+
+ Merchandise To Order
+ Use this view to generate a list of merchandise that needs to be ordered
+
diff --git a/src/backoffice/templates/merchandise_to_order.html b/src/backoffice/templates/merchandise_to_order.html
new file mode 100644
index 00000000..bbf6a6b2
--- /dev/null
+++ b/src/backoffice/templates/merchandise_to_order.html
@@ -0,0 +1,44 @@
+{% extends 'base.html' %}
+{% load commonmark %}
+{% load static from staticfiles %}
+{% load imageutils %}
+{% block extra_head %}
+
+
+{% endblock extra_head %}
+{% block content %}
+
+
Merchandise To Order
+
+ This is a list of merchandise to order from our supplier
+
+
+ This table shows all different merchandise that needs to be ordered
+
+
+
+
+
+
+
+ Merchandise Type
+ Quantity
+
+
+
+ {% for key, val in merchandise.items %}
+
+ {{ key }}
+ {{ val }}
+
+ {% endfor %}
+
+
+
+
+
+{% endblock content %}
diff --git a/src/backoffice/templates/orders_merchandise.html b/src/backoffice/templates/orders_merchandise.html
new file mode 100644
index 00000000..dcaf94be
--- /dev/null
+++ b/src/backoffice/templates/orders_merchandise.html
@@ -0,0 +1,51 @@
+{% extends 'base.html' %}
+{% load commonmark %}
+{% load static from staticfiles %}
+{% load imageutils %}
+{% block extra_head %}
+
+
+{% endblock extra_head %}
+{% block content %}
+
+
Merchandise Orders
+
+ Use this view to look at merchandise orders.
+
+ This table shows all OrderProductRelations which are Merchandise (not including handed out, unpaid, cancelled and refunded orders). The table is initally sorted by order ID but the sorting can be changed by clicking the column headlines (if javascript is enabled).
+
+
+
+
+
+
+
+ Order
+ User
+ Email
+ OPR Id
+ Product
+ Quantity
+
+
+
+ {% for productrel in orderproductrelation_list %}
+
+ Order #{{ productrel.order.id }}
+ {{ productrel.order.user }}
+ {{ productrel.order.user.email }}
+ {{ productrel.id }}
+ {{ productrel.product.name }}
+ {{ productrel.quantity }}
+
+ {% endfor %}
+
+
+
+
+
+{% endblock content %}
diff --git a/src/backoffice/urls.py b/src/backoffice/urls.py
index 58da109d..f48cced5 100644
--- a/src/backoffice/urls.py
+++ b/src/backoffice/urls.py
@@ -10,6 +10,8 @@ urlpatterns = [
path('badge_handout/', BadgeHandoutView.as_view(), name='badge_handout'),
path('ticket_checkin/', TicketCheckinView.as_view(), name='ticket_checkin'),
path('public_credit_names/', ApproveNamesView.as_view(), name='public_credit_names'),
+ path('merchandise_orders/', MerchandiseOrdersView.as_view(), name='merchandise_orders'),
+ path('merchandise_to_order/', MerchandiseToOrderView.as_view(), name='merchandise_to_order'),
path('manage_proposals/', include([
path('', ManageProposalsView.as_view(), name='manage_proposals'),
path('speakers//', SpeakerProposalManageView.as_view(), name='speakerproposal_manage'),
diff --git a/src/backoffice/views.py b/src/backoffice/views.py
index 7f057728..06af7073 100644
--- a/src/backoffice/views.py
+++ b/src/backoffice/views.py
@@ -5,14 +5,12 @@ from django.views.generic import TemplateView, ListView
from django.views.generic.edit import UpdateView
from django.shortcuts import redirect
from django.urls import reverse
-from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
+from django.utils import timezone
from shop.models import OrderProductRelation
from tickets.models import ShopTicket, SponsorTicket, DiscountTicket
from profiles.models import Profile
-from camps.models import Camp
-from camps.mixins import CampViewMixin
from program.models import SpeakerProposal, EventProposal
from .mixins import BackofficeViewMixin
@@ -26,12 +24,14 @@ class BackofficeIndexView(BackofficeViewMixin, TemplateView):
class ProductHandoutView(BackofficeViewMixin, ListView):
template_name = "product_handout.html"
- queryset = OrderProductRelation.objects.filter(
- handed_out=False,
- order__paid=True,
- order__refunded=False,
- order__cancelled=False
- ).order_by('order')
+
+ def get_queryset(self, **kwargs):
+ return OrderProductRelation.objects.filter(
+ handed_out=False,
+ order__paid=True,
+ order__refunded=False,
+ order__cancelled=False
+ ).order_by('order')
class BadgeHandoutView(BackofficeViewMixin, ListView):
@@ -123,3 +123,48 @@ class EventProposalManageView(ProposalManageView):
model = EventProposal
template_name = "manage_eventproposal.html"
+
+class MerchandiseOrdersView(BackofficeViewMixin, ListView):
+ template_name = "orders_merchandise.html"
+
+ def get_queryset(self, **kwargs):
+ camp_prefix = 'BornHack {}'.format(timezone.now().year)
+
+ return OrderProductRelation.objects.filter(
+ handed_out=False,
+ order__paid=True,
+ order__refunded=False,
+ order__cancelled=False,
+ product__category__name='Merchandise',
+ ).filter(
+ product__name__startswith=camp_prefix
+ ).order_by('order')
+
+
+class MerchandiseToOrderView(BackofficeViewMixin, TemplateView):
+ template_name = "merchandise_to_order.html"
+
+ def get_context_data(self, **kwargs):
+ camp_prefix = 'BornHack {}'.format(timezone.now().year)
+
+ order_relations = OrderProductRelation.objects.filter(
+ handed_out=False,
+ order__paid=True,
+ order__refunded=False,
+ order__cancelled=False,
+ product__category__name='Merchandise',
+ ).filter(
+ product__name__startswith=camp_prefix
+ )
+
+ merchandise_orders = {}
+ for relation in order_relations:
+ try:
+ quantity = merchandise_orders[relation.product.name] + relation.quantity
+ merchandise_orders[relation.product.name] = quantity
+ except KeyError:
+ merchandise_orders[relation.product.name] = relation.quantity
+
+ context = super().get_context_data(**kwargs)
+ context['merchandise'] = merchandise_orders
+ return context