McDuck/users/views.py

167 lines
7.3 KiB
Python
Raw Normal View History

2024-08-29 09:21:58 +00:00
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}.'})