37 lines
No EOL
1.8 KiB
Python
37 lines
No EOL
1.8 KiB
Python
from cards.models import Card
|
|
from django.core.exceptions import PermissionDenied
|
|
|
|
class TradeOfferContextMixin:
|
|
def get_context_data(self, **kwargs):
|
|
# Start with any context passed in.
|
|
context = kwargs.copy()
|
|
# Include available cards requirements for multiselect fields.
|
|
context.setdefault("cards", Card.objects.all().order_by("name", "rarity_level"))
|
|
|
|
# Provide friend_codes and selected_friend_code as in TradeOfferCreateView
|
|
friend_codes = self.request.user.friend_codes.all()
|
|
context["friend_codes"] = friend_codes
|
|
|
|
if "initiated_by" in self.request.GET:
|
|
try:
|
|
selected_friend_code = friend_codes.get(pk=self.request.GET.get("initiated_by"))
|
|
except friend_codes.model.DoesNotExist:
|
|
selected_friend_code = self.request.user.default_friend_code or friend_codes.first()
|
|
else:
|
|
selected_friend_code = self.request.user.default_friend_code or friend_codes.first()
|
|
context["selected_friend_code"] = selected_friend_code
|
|
|
|
return context
|
|
|
|
class FriendCodeRequiredMixin:
|
|
"""
|
|
Mixin to ensure the authenticated user has at least one friend code.
|
|
This mixin must be placed after LoginRequiredMixin in the view's inheritance order.
|
|
"""
|
|
def dispatch(self, request, *args, **kwargs):
|
|
# Since LoginRequiredMixin guarantees that request.user is authenticated,
|
|
# we assume request.user has the attribute `friend_codes`. If no friend code exists,
|
|
# raise a PermissionDenied error.
|
|
if not getattr(request.user, 'friend_codes', None) or not request.user.friend_codes.exists():
|
|
raise PermissionDenied("No friend codes available for your account.")
|
|
return super().dispatch(request, *args, **kwargs) |