from .models import User, DailyReward, DailyRewardsList, Balance, Levels from .serializers import UserSerializer, DailyRewardSerializer, DailyRewardsListSerializer, BalanceSerializer, LevelsSerializer from rest_framework import status, viewsets from rest_framework.decorators import action from rest_framework.response import Response class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer @action(detail=True, methods=['get']) def get_datetime(self, request): # Получаем текущие дату и время current_datetime = timezone.now() return Response({'datetime': current_datetime}) @action(detail=True, methods=['get']) def get_referrals(self, request, pk=None): user = self.get_object() # Процентные ставки для каждого уровня referral_percentages = { 1: 0.10, # 10% за рефералы 1 уровня 2: 0.06, # 6% за рефералы 2 уровня 3: 0.03, # 3% за рефералы 3 уровня 4: 0.01, # 1% за рефералы 4 уровня } # Рефералы по уровням level_1_referrals = user.referrals.all() level_2_referrals = User.objects.filter(referred_by__in=level_1_referrals) level_3_referrals = User.objects.filter(referred_by__in=level_2_referrals) level_4_referrals = User.objects.filter(referred_by__in=level_3_referrals) referral_levels = { 1: level_1_referrals, 2: level_2_referrals, 3: level_3_referrals, 4: level_4_referrals, } total_coins = 0 for level, referrals in referral_levels.items(): # Фильтруем баланс рефералов, у которых валюта 'MCDC' coins = Balance.objects.filter(user__in=referrals, currency='MCDC').aggregate(total=Sum('balance'))['total'] or 0 bonus_coins = coins * referral_percentages[level] total_coins += bonus_coins # Вычитаем уже полученные бонусы total_coins -= user.coins_for_referral response_data = { "total_coins": total_coins, "level_1_referrals": list(level_1_referrals.values('tg_username', 'tg_id', 'name', 'photo', 'coins_for_referral')), "level_2_referrals": list(level_2_referrals.values('tg_username', 'tg_id', 'name', 'photo', 'coins_for_referral')), "level_3_referrals": list(level_3_referrals.values('tg_username', 'tg_id', 'name', 'photo', 'coins_for_referral')), "level_4_referrals": list(level_4_referrals.values('tg_username', 'tg_id', 'name', 'photo', 'coins_for_referral')), } print(response_data) # TODOPROJECT remove it return Response({'status': '200', 'data': response_data}) class DailyRewardViewSet(viewsets.ModelViewSet): queryset = DailyReward.objects.all() serializer_class = DailyRewardSerializer class DailyRewardsListViewSet(viewsets.ModelViewSet): queryset = DailyRewardsList.objects.all() serializer_class = DailyRewardsListSerializer class BalanceViewSet(viewsets.ModelViewSet): queryset = Balance.objects.all() serializer_class = BalanceSerializer @action(detail=True, methods=['post']) def add_for_balance(self, request, pk=None): user = self.get_object().user amount = request.data.get("amount") currency = request.data.get("currency") if not amount or not currency: return Response({"status": "error", "message": "Пожалуйста, укажите сумму и валюту"}, status=status.HTTP_400_BAD_REQUEST) # Создаем новую транзакцию в базе данных with db_transaction.atomic(): transaction = Transaction.objects.create( user=user, amount=amount, currency=currency, status="Pending" ) # Формирование данных для запроса data = { "amount": amount, "currency": currency, "user_id": user.id, "transaction_id": transaction.id } # Отправка POST-запроса к API Turcode try: response = requests.post( "https://api.turcode.cc/v1/payment", json=data, headers={"Authorization": f"Bearer {settings.TURCODE_API_KEY}"} ) # Обработка ответа от API if response.status_code == 200: transaction.status = "Success" transaction.save() # Обновление баланса пользователя user_balance = self.get_object() user_balance.balance += int(amount) user_balance.save() return Response({"status": "success", "message": "Баланс успешно пополнен"}, status=status.HTTP_200_OK) else: transaction.status = "Failed" transaction.save() return Response({"status": "error", "message": "Не удалось выполнить платеж"}, status=status.HTTP_400_BAD_REQUEST) except requests.RequestException as e: transaction.status = "Error" transaction.save() return Response({"status": "error", "message": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) class LevelsViewSet(viewsets.ModelViewSet): queryset = Levels.objects.all() serializer_class = LevelsSerializer @action(detail=True, methods=['post']) def create_new_levels(self, request, pk=None): user = self.get_object() levels = [] # Задаем названия и изображения для каждого уровня level_data = [ {"name": "Huey", "coins": 0, "image": "static/media/levels/character1.jpg"}, {"name": "Dewey", "coins": 10000, "image": "static/media/levels/character2.jpg"}, {"name": "Donald Duck", "coins": 20000, "image": "static/media/levels/character3.jpg"}, {"name": "Launchpad", "coins": 30000, "image": "static/media/levels/character4.jpg"}, {"name": "Gearloose", "coins": 40000, "image": "static/media/levels/character5.jpg"}, {"name": "Magica", "coins": 50000, "image": "static/media/levels/character6.jpg"}, {"name": "Scrooge", "coins": 60000, "image": "static/media/levels/character7.jpg"}, ] for i, data in enumerate(level_data, start=1): level = Levels( user=user, name=data["name"], level=i, photo=data["image"], need_coins=data["coins"] ) levels.append(level) # Сохраняем все созданные объекты в базе данных Levels.objects.bulk_create(levels) return Response({'status': '200', 'message': f'Created {len(levels)} levels for user {user.username}.'})