deepsite / management /serializers.py
coerxso's picture
Upload 73 files
3e8a166 verified
raw
history blame
7.56 kB
# management/serializers.py
# -*- coding: utf-8 -*-
from rest_framework import serializers
from django.utils import timezone
import datetime
from .models import (
CustomUser,
Panel,
License,
PushSubscription,
MarzbanAdmin,
SecurityToken,
DiscountCode,
Plan,
Subscription,
Payment,
EndUser,
PaymentMethod,
PaymentSetting,
PaymentDetail,
)
# --- Serializers for Django Rest Framework ---
# ADDED: LicenseSerializer (was missing)
class LicenseSerializer(serializers.ModelSerializer):
"""Serializer for the License model."""
class Meta:
model = License
fields = ['key', 'is_active', 'owner', 'created_at', 'expiry_date']
read_only_fields = ['key', 'created_at']
class CustomUserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ['id', 'username', 'role']
class PushSubscriptionSerializer(serializers.Serializer):
subscription_info = serializers.JSONField()
class MarzbanAdminSerializer(serializers.ModelSerializer):
class Meta:
model = MarzbanAdmin
fields = ['id', 'username', 'password', 'permission']
extra_kwargs = {'password': {'write_only': True}}
class SecurityTokenSerializer(serializers.ModelSerializer):
class Meta:
model = SecurityToken
fields = ['admin_id', 'token', 'expiration_date']
class DiscountCodeSerializer(serializers.ModelSerializer):
class Meta:
model = DiscountCode
fields = ['id', 'code', 'discount_percentage', 'is_active']
read_only_fields = ['id', 'admin']
class PanelSerializer(serializers.ModelSerializer):
license_key = serializers.CharField(write_only=True, required=True)
class Meta:
model = Panel
fields = ['id', 'name', 'marzban_host', 'marzban_username', 'marzban_password', 'telegram_bot_token', 'license_key']
read_only_fields = ['id', 'owner']
def validate_license_key(self, value):
owner = self.context['request'].user
try:
license_obj = License.objects.get(key=value, owner=owner, is_active=True)
if hasattr(license_obj, 'linked_panel') and license_obj.linked_panel is not None:
raise serializers.ValidationError('This license key has already been used.')
return license_obj
except License.DoesNotExist:
raise serializers.ValidationError('Invalid or inactive license key.')
def create(self, validated_data):
license_obj = validated_data.pop('license_key')
panel = Panel.objects.create(
owner=self.context['request'].user,
license=license_obj,
**validated_data
)
return panel
class PlanSerializer(serializers.ModelSerializer):
class Meta:
model = Plan
fields = ['id', 'name', 'price', 'duration_days', 'data_limit_gb', 'is_active']
read_only_fields = ['id']
class SubscriptionSerializer(serializers.ModelSerializer):
end_user = serializers.CharField(source='end_user.username', read_only=True)
plan = PlanSerializer(read_only=True)
class Meta:
model = Subscription
fields = ['id', 'end_user', 'plan', 'status', 'start_date', 'end_date', 'remaining_data_gb']
class AdminLevel3SubscriptionSerializer(serializers.ModelSerializer):
end_user_username = serializers.CharField(write_only=True)
plan_id = serializers.IntegerField(write_only=True)
end_user = SubscriptionSerializer(source='end_user', read_only=True) # To show user details on response
plan = PlanSerializer(read_only=True) # To show plan details on response
class Meta:
model = Subscription
fields = ['id', 'end_user_username', 'plan_id', 'status', 'start_date', 'end_date', 'remaining_data_gb', 'end_user', 'plan']
read_only_fields = ['id', 'status', 'start_date', 'end_date', 'remaining_data_gb', 'end_user', 'plan']
def validate(self, data):
request_user = self.context['request'].user
try:
panel = request_user.owned_panel
except Panel.DoesNotExist:
raise serializers.ValidationError("Admin does not own a panel.")
try:
end_user = EndUser.objects.get(username=data.get('end_user_username'), panel=panel)
data['end_user_instance'] = end_user
except EndUser.DoesNotExist:
raise serializers.ValidationError({"end_user_username": "User not found in your panel."})
try:
plan = Plan.objects.get(id=data.get('plan_id'), is_active=True, panel=panel)
data['plan_instance'] = plan
except Plan.DoesNotExist:
raise serializers.ValidationError({"plan_id": "Plan not found or is not active in your panel."})
data['panel_instance'] = panel
return data
def create(self, validated_data):
end_user = validated_data.get('end_user_instance')
plan = validated_data.get('plan_instance')
panel = validated_data.get('panel_instance')
start_date = timezone.now().date()
end_date = start_date + datetime.timedelta(days=plan.duration_days)
subscription = Subscription.objects.create(
end_user=end_user,
plan=plan,
panel=panel,
status='active', # Assuming direct creation by admin activates it
start_date=start_date,
end_date=end_date,
remaining_data_gb=plan.data_limit_gb
)
return subscription
class PurchaseSubscriptionForUserSerializer(serializers.Serializer):
end_user_username = serializers.CharField(max_length=150)
plan_id = serializers.IntegerField()
amount = serializers.DecimalField(max_digits=10, decimal_places=2)
def validate_plan_id(self, value):
if not Plan.objects.filter(id=value, is_active=True).exists():
raise serializers.ValidationError("Plan not found or is not active.")
return value
class ReceiptUploadSerializer(serializers.ModelSerializer):
payment_token = serializers.UUIDField(write_only=True)
class Meta:
model = Payment
fields = ['receipt_image', 'receipt_text', 'payment_token']
def validate(self, data):
if not data.get('receipt_image') and not data.get('receipt_text'):
raise serializers.ValidationError("Either receipt image or text is required.")
return data
# --- Payment System Serializers ---
class PaymentMethodSerializer(serializers.ModelSerializer):
class Meta:
model = PaymentMethod
fields = ['id', 'name', 'is_active', 'can_be_managed_by_level3']
read_only_fields = ['id']
class PaymentDetailSerializer(serializers.ModelSerializer):
class Meta:
model = PaymentDetail
fields = ['id', 'card_number', 'card_holder_name', 'wallet_address']
read_only_fields = ['id']
class EndUserPaymentDetailSerializer(serializers.Serializer):
method_name = serializers.CharField(source='payment_method.get_name_display')
method_key = serializers.CharField(source='payment_method.name')
is_active = serializers.BooleanField(source='is_active')
card_number = serializers.CharField(source='admin_level_3.payment_details.card_number', read_only=True)
card_holder_name = serializers.CharField(source='admin_level_3.payment_details.card_holder_name', read_only=True)
wallet_address = serializers.CharField(source='admin_level_3.payment_details.wallet_address', read_only=True)