167 lines
7.3 KiB
Python
167 lines
7.3 KiB
Python
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}.'}) |