From b3a59f5aa291638d221937eaea50caa60fd29816 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 7 Jul 2025 16:22:35 +0200 Subject: [PATCH] adds a service to request if the user has a hierarchy that can pay --- api/urls.py | 1 + api/views.py | 39 ++++++++++++++++++++++------------ tournaments/models/purchase.py | 6 +++++- tournaments/views.py | 3 +-- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/api/urls.py b/api/urls.py index 13faa2e..64a3aa8 100644 --- a/api/urls.py +++ b/api/urls.py @@ -35,6 +35,7 @@ urlpatterns = [ path('sync-data/', SynchronizationApi.as_view(), name="data"), path('data-access-content/', UserDataAccessApi.as_view(), name="data-access-content"), + path("can_create_tournament/", views.has_hierarchy_with_payment_capabilities, name="can-create-tournament"), path('api-token-auth/', obtain_auth_token, name='api_token_auth'), path("user-by-token/", views.user_by_token, name="user_by_token"), diff --git a/api/views.py b/api/views.py index 820f642..7c9986b 100644 --- a/api/views.py +++ b/api/views.py @@ -1,34 +1,33 @@ -from .serializers import ClubSerializer, CourtSerializer, DateIntervalSerializer, DrawLogSerializer, TournamentSerializer, UserSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, PurchaseSerializer, ShortUserSerializer, FailedApiCallSerializer, LogSerializer, DeviceTokenSerializer, CustomUserSerializer, UnregisteredTeamSerializer, UnregisteredPlayerSerializer, ImageSerializer -from tournaments.models import Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Court, DateInterval, Purchase, FailedApiCall, Log, DeviceToken, DrawLog, UnregisteredTeam, UnregisteredPlayer, Image - from rest_framework import viewsets from rest_framework.response import Response -from rest_framework.decorators import api_view +from rest_framework.decorators import api_view, permission_classes from rest_framework import status from rest_framework.exceptions import MethodNotAllowed +from rest_framework.permissions import IsAuthenticated -from django.http import Http404 +from django.conf import settings +from django.http import Http404, HttpResponse, JsonResponse from django.db.models import Q +from django.core.files.storage import default_storage +from django.core.files.base import ContentFile +from django.shortcuts import get_object_or_404 + +from .serializers import ClubSerializer, CourtSerializer, DateIntervalSerializer, DrawLogSerializer, TournamentSerializer, UserSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, PurchaseSerializer, ShortUserSerializer, FailedApiCallSerializer, LogSerializer, DeviceTokenSerializer, CustomUserSerializer, UnregisteredTeamSerializer, UnregisteredPlayerSerializer, ImageSerializer +from tournaments.models import Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Court, DateInterval, Purchase, FailedApiCall, Log, DeviceToken, DrawLog, UnregisteredTeam, UnregisteredPlayer, Image from .permissions import IsClubOwner from .utils import check_version_smaller_than_1_1_12 from shared.discord import send_discord_log_message -from rest_framework.decorators import permission_classes -from rest_framework.permissions import IsAuthenticated -from django.shortcuts import get_object_or_404 - from tournaments.services.payment_service import PaymentService -from django.conf import settings +from tournaments.utils.extensions import create_random_filename + import stripe import json import pandas as pd -from tournaments.utils.extensions import create_random_filename -from django.core.files.storage import default_storage -from django.core.files.base import ContentFile + import os -from django.http import HttpResponse import logging logger = logging.getLogger(__name__) @@ -568,3 +567,15 @@ def validate_stripe_account(request): 'error': f'Unexpected error: {str(e)}', 'needs_onboarding': True, }, status=200) + +@api_view(['GET']) +@permission_classes([IsAuthenticated]) +def has_hierarchy_with_payment_capabilities(request): + can_create = False + if request.user and request.user.is_anonymous == False and request.user.owners: + for owner in request.user.owners.all(): + purchases = Purchase.objects.filter(user=owner,product_id='app.padelclub.tournament.subscription.unlimited') + for purchase in purchases: + if purchase.is_active(): + can_create = True + return JsonResponse({'can_create': can_create}, status=status.HTTP_200_OK) diff --git a/tournaments/models/purchase.py b/tournaments/models/purchase.py index 29cba73..5d8e4bf 100644 --- a/tournaments/models/purchase.py +++ b/tournaments/models/purchase.py @@ -1,6 +1,7 @@ from django.db import models -from . import BaseModel, CustomUser +from django.utils import timezone +from . import BaseModel, CustomUser class Purchase(BaseModel): id = models.BigIntegerField(primary_key=True, unique=True, editable=True) @@ -16,3 +17,6 @@ class Purchase(BaseModel): def __str__(self): return f"{self.id} > {self.product_id} - {self.purchase_date} - {self.user.username}" + + def is_active(self): + return self.expiration_date > timezone.now() diff --git a/tournaments/views.py b/tournaments/views.py index 3ddc29c..6391888 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -21,7 +21,7 @@ from django.conf import settings from django.contrib.admin.views.decorators import staff_member_required from django.views.generic import View from django.db.models import Q -from .models import Club, Tournament, CustomUser, Event, Round, Match, TeamScore, TeamRegistration, PlayerRegistration, UserOrigin +from .models import Club, Tournament, CustomUser, Event, Round, Match, TeamScore, TeamRegistration, PlayerRegistration, UserOrigin, Purchase from datetime import datetime, timedelta import time import json @@ -1678,7 +1678,6 @@ def get_user_tournaments(user, tournaments): def stripe_onboarding_complete(request): return render(request, 'stripe/onboarding_complete.html') - def stripe_refresh_account_link(request): return render(request, 'stripe/refresh_account_link.html')