-
{{ code.friend_code }}
+
{{ code.friend_code }}
{% if user.default_friend_code and code.id == user.default_friend_code.id %}
Default
{% endif %}
diff --git a/theme/templates/trades/trade_offer_all_list.html b/theme/templates/trades/trade_offer_all_list.html
new file mode 100644
index 0000000..e77608c
--- /dev/null
+++ b/theme/templates/trades/trade_offer_all_list.html
@@ -0,0 +1,44 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block title %}All Trade Offers{% endblock title %}
+
+{% block content %}
+
+
+
+
+
+
+ All Trade Offers
+ {% if all_trade_offers_paginated.object_list %}
+ {% include "trades/_trade_offer_list.html" with offers=all_trade_offers_paginated %}
+
+ {% if all_trade_offers_paginated.has_previous %}
+
Previous
+ {% else %}
+
+ {% endif %}
+
Page {{ all_trade_offers_paginated.number }} of {{ all_trade_offers_paginated.paginator.num_pages }}
+ {% if all_trade_offers_paginated.has_next %}
+
Next
+ {% else %}
+
+ {% endif %}
+
+ {% else %}
+ No trade offers found.
+ {% endif %}
+
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/theme/templates/trades/trade_offer_list.html b/theme/templates/trades/trade_offer_my_list.html
similarity index 100%
rename from theme/templates/trades/trade_offer_list.html
rename to theme/templates/trades/trade_offer_my_list.html
diff --git a/trades/urls.py b/trades/urls.py
index 1ea5eb7..a7d2338 100644
--- a/trades/urls.py
+++ b/trades/urls.py
@@ -2,7 +2,8 @@ from django.urls import path
from .views import (
TradeOfferCreateView,
- TradeOfferListView,
+ TradeOfferAllListView,
+ TradeOfferMyListView,
TradeOfferDetailView,
TradeAcceptanceCreateView,
TradeAcceptanceUpdateView,
@@ -12,10 +13,11 @@ from .views import (
urlpatterns = [
path("create/", TradeOfferCreateView.as_view(), name="trade_offer_create"),
- path("", TradeOfferListView.as_view(), name="trade_offer_list"),
+ path("all/", TradeOfferAllListView.as_view(), name="trade_offer_list"),
+ path("my/", TradeOfferMyListView.as_view(), name="trade_offer_my_list"),
path("search/", TradeOfferSearchView.as_view(), name="trade_offer_search"),
path("
/", TradeOfferDetailView.as_view(), name="trade_offer_detail"),
path("delete//", TradeOfferDeleteView.as_view(), name="trade_offer_delete"),
- path("offer//accept/", TradeAcceptanceCreateView.as_view(), name="trade_acceptance_create"),
- path("acceptance//", TradeAcceptanceUpdateView.as_view(), name="trade_acceptance_update"),
+ path("offer/", TradeAcceptanceCreateView.as_view(), name="trade_acceptance_create"),
+ path("accept//", TradeAcceptanceUpdateView.as_view(), name="trade_acceptance_update"),
]
diff --git a/trades/views.py b/trades/views.py
index 5c953d6..ae2c30e 100644
--- a/trades/views.py
+++ b/trades/views.py
@@ -68,9 +68,55 @@ class TradeOfferCreateView(LoginRequiredMixin, CreateView):
self.object = form.save()
return HttpResponseRedirect(self.get_success_url())
-class TradeOfferListView(LoginRequiredMixin, ListView):
+class TradeOfferAllListView(ListView):
+ model = TradeOffer
+ template_name = "trades/trade_offer_all_list.html"
+
+
+ def get_context_data(self, *, object_list=None, **kwargs):
+ context = super().get_context_data(**kwargs)
+ request = self.request
+ show_closed = request.GET.get("show_closed", "false").lower() == "true"
+ context["show_closed"] = show_closed
+
+ queryset = (
+ TradeOffer.objects.select_related('initiated_by')
+ .prefetch_related(
+ 'trade_offer_have_cards__card',
+ 'trade_offer_want_cards__card',
+ Prefetch(
+ 'acceptances',
+ queryset=TradeAcceptance.objects.select_related('accepted_by', 'requested_card', 'offered_card')
+ )
+ )
+ .order_by("-updated_at")
+ .annotate(
+ is_active=Case(
+ When(
+ manually_closed=False,
+ total_have_quantity__gt=F('total_have_accepted'),
+ total_want_quantity__gt=F('total_want_accepted'),
+ then=Value(True)
+ ),
+ default=Value(False),
+ output_field=BooleanField()
+ )
+ )
+ )
+ if show_closed:
+ queryset = queryset.filter(is_active=False)
+ else:
+ queryset = queryset.filter(is_active=True)
+
+ offers_page = request.GET.get("offers_page")
+ offers_paginator = Paginator(queryset, 10)
+ context["all_trade_offers_paginated"] = offers_paginator.get_page(offers_page)
+
+ return context
+
+class TradeOfferMyListView(LoginRequiredMixin, ListView):
model = TradeOffer # Fallback model; our context data holds separate filtered querysets.
- template_name = "trades/trade_offer_list.html"
+ template_name = "trades/trade_offer_my_list.html"
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated and not request.user.friend_codes.exists():