File: //home/arjun/projects/unlimited-leads/Unlimited-Leads-Be/Admin/serializers.py
from rest_framework import serializers
from authorization.models import UnlimitedLeadUser, VerificationMailRequest
from payment.models import Transaction
from Admin.models import Lead
from user.models import EmailOrPhoneVerifyProcessedFile
class UserListSerializer(serializers.ModelSerializer):
plan_chosen = serializers.SerializerMethodField()
subscription_status = serializers.SerializerMethodField()
validation_count = serializers.SerializerMethodField()
search_count = serializers.SerializerMethodField()
class Meta:
model = UnlimitedLeadUser
fields = ['id', 'first_name', 'last_name', 'email', 'date_joined', 'plan_chosen', 'subscription_status', 'is_active','validation_count','search_count','credit_limit', 'is_verified']
def get_plan_chosen(self, obj):
transaction = obj.transaction_set.filter(is_subscription=True).order_by("-created_at").first()
return transaction.product.plan_name if transaction else None
def get_subscription_status(self, obj):
transaction = obj.transaction_set.filter(is_subscription=True).order_by("-created_at").first()
return transaction.subscription_status if transaction else None
def get_validation_count(self, obj):
count = obj.emailorphoneverifyprocessedfile_set.filter(user=obj).count()
return count if count else None
def get_search_count(self, obj):
count = 0
return count if count else None
class UserDetailSerializer(serializers.ModelSerializer):
# joined_date = serializers.SerializerMethodField()
plan_chosen = serializers.SerializerMethodField()
subscription_status = serializers.SerializerMethodField()
subscription_start = serializers.SerializerMethodField()
subscription_end = serializers.SerializerMethodField()
validation_count = serializers.SerializerMethodField()
search_count =serializers.SerializerMethodField()
class Meta:
model = UnlimitedLeadUser
fields = ['first_name', 'last_name', 'email', 'date_joined', 'plan_chosen', 'subscription_status', 'is_active','phone_number', 'profile_image',
'subscription_start', 'subscription_end','validation_count','search_count','credit_limit', 'is_verified'
]
def get_joined_date(self, obj):
request = VerificationMailRequest.objects.filter(user=obj).first()
return request.created_at if request else None
def get_plan_chosen(self, obj):
transaction = Transaction.objects.filter(customer=obj, is_subscription=True).first()
return transaction.product.plan_name if transaction else None
def get_subscription_status(self, obj):
transaction = Transaction.objects.filter(customer=obj, is_subscription=True).first()
return transaction.subscription_status if transaction else None
def get_subscription_start(self, obj):
transaction = Transaction.objects.filter(customer=obj, is_subscription=True).first()
return transaction.subscription_start if transaction else None
def get_subscription_end(self, obj):
transaction = Transaction.objects.filter(customer=obj, is_subscription=True).first()
return transaction.subscription_end if transaction else None
def get_validation_count(self, obj):
count = obj.emailorphoneverifyprocessedfile_set.filter(user=obj).count()
return count if count else None
def get_search_count(self, obj):
count = 0
return count if count else None
class LeadSerializer(serializers.ModelSerializer):
class Meta:
model = Lead
exclude = ('id', 'is_deleted', 'hash_value')
class UploadCSVSerializer(serializers.Serializer):
"""
Serializer to validate the uploaded CSV files.
"""
files = serializers.ListField(
child=serializers.FileField(),
allow_empty=False,
help_text="A list of CSV files to upload."
)
type = serializers.CharField(required=False)
def validate_files(self, files):
"""
Custom validation to ensure only valid CSV files are uploaded.
"""
for file in files:
if not file.name.endswith('.csv'):
raise serializers.ValidationError(f"{file.name} is not a valid CSV file.")
if file.size > 5 * 1024 * 1024 * 1024: # Limit file size to 5 GB
raise serializers.ValidationError(f"{file.name} exceeds the size limit of 5 GB.")
return files