HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
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