from curses.ascii import isalpha
from datetime import datetime, timedelta
import datetime
import email
from genericpath import exists
from multiprocessing import context
from operator import not_
from unicodedata import name
from xmlrpc.client import FastParser
import PyPDF2
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.contrib.auth.decorators import login_required
from django.contrib.sites.shortcuts import get_current_site
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import render, redirect
from django.core.paginator import Paginator
from django.utils import timezone
from django.utils.encoding import force_text
from django.utils.http import urlsafe_base64_decode
from django.contrib.auth.hashers import make_password
from jmespath import search
from base.models import Country, SubPublisherUser, Subscription, SubscriptionType
from magazine.utils import send_mobile_otp_to_user
from magazineapp.models import Author, MagMapAuthor, MagazineCommissionInfo, MagazineOfferinfo, MagazineOrderinfo, MagazinePurchaseInfo, SystemCategory, MagazineCategory, MagazineInfo, MegazinePages, Language, UserMapOffer, WithdrawalDetails
from django.db.models import Q
from web.forms import AddOffersForm, AddSubscriptionForm, AddSystemCategoryForm, AddAuthorForm, AddLanguageForm, AddMagazineCategoryForm, AddMagazineInfoForm, AddMegazinePagesForm, AssignUsersToOffersForm, ChangePasswordForm, CommissionForm, CountryForm, CountrySubscriptionForm, ForgetChangePasswordForm, ForgotPasswordForm, MagazineAuthorForm, ProfileForm, PublisherForm, SubAdminForm, SubPublisherForm, SubscriptionCommisionForm, SubscriptionTypeForm, UpdateLanguageForm, UserLoginForm, UserRegisterForm, VerifyMobileForm, VerifyRegiterForm, WithdrawalForm
from django.contrib.auth.hashers import check_password
from web.email import send_config_email, send_email
from web.serializers import GetAuhtorSerializer, MagazineGroupwiseReportSerializer, MagazinePurchaseInfoListSerializer, MagazinePurchaseInfoSumAmountSerializer, MagazineSellDetailsSerializer, ReportListSerializer
from web.thread import DeliveryRequestStatusEmailTread, ForgotPasswordVerificationThread, MagazineApprovedEmailTread, MagazineStatusEmailTread, SentForgotPasswordLinkViaEmailThread, SentOTPViaEmailThread, WithdrawRequestStatusEmailTread
from web.utils import TopMegazineCategories, get_MostSellMagazines, get_UserCount
User = get_user_model()
from django.utils.crypto import get_random_string
from django.db.models import Value
from django.db.models.functions import Concat


def user_login(request):
    forms = UserLoginForm()
    if request.method == 'POST':
        form = UserLoginForm(request.POST)       
        if form.is_valid():
            print('dffffffffffffffffffffffff')
            username = request.POST['username']
            password = request.POST['password']
            name = request.POST.get('roles')
            print(name,"===========================<")
            if name == 'admin':
                print(username, 'username')
                user = authenticate(username=username, password=password)
                if user:
                    validate_user = User.objects.filter(Q(roles_id__in=[1,2]),username=username).last()
                    if validate_user: 
                        print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
                        login(request, user)
                        print(settings.LOGIN_REDIRECT_URL)
                        return redirect(settings.LOGIN_REDIRECT_URL)
                    else:
                        messages.error(request, 'You are not allowed to login.')
                        return redirect(settings.LOGIN_REDIRECT_URL)
                    
                else:
                    messages.error(request, 'Invalid credentials.')
                    return redirect(settings.LOGIN_REDIRECT_URL)
            elif name == 'publisher':
                print(username, 'username')
                user = authenticate(username=username, password=password)
                if user:
                    validate_user = User.objects.filter(Q(roles_id__in=[3,4]),username=username).last()
                    if validate_user: 
                        print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
                        login(request, user)
                        print(settings.LOGIN_REDIRECT_URL)
                        return redirect(settings.LOGIN_REDIRECT_URL)
                    else:
                        messages.error(request, 'You are not allowed to login.')
                        return redirect(settings.LOGIN_REDIRECT_URL)
                    
                else:
                    messages.error(request, 'Invalid credentials.')
                    return redirect(settings.LOGIN_REDIRECT_URL)
            else:
                messages.error(request, 'You are not allowed to login.')
                return redirect(settings.LOGIN_REDIRECT_URL)

        else:
            forms = UserLoginForm(request.POST)


    context = {'title': 'Login','forms':forms}
    return render(request, 'web/login.html', context)

# def user_register(request):
#     forms = UserRegisterForm()
#     if request.method == 'POST':
#         # email_verification=request.POST['email_varification']
#         # print(email_verification,'********************email_verification')
#         existance_of_user = User.objects.filter(username=request.POST['email']).exists()
#         if not existance_of_user:
#             forms = UserRegisterForm(request.POST)
#             first_name=request.POST['first_name']
#             last_name=request.POST['last_name']
#             password = request.POST['password']          
#             confirm_password = request.POST['confirm_password']
#             if all(x.isalpha() or x.isspace()  for x in first_name) and all(y.isalpha() or y.isspace() for y in last_name):   
#                 if len(password)>6 and len(confirm_password)>6:
#                     if password == confirm_password :
#                         if forms.is_valid():
#                             otp = get_random_string(4, allowed_chars='01234106789')
#                             # forms.save()
#                             # # User.objects.filter(id=user.id).update(username=request.POST['email'])
#                             # # User.objects.filter(id=user.id).update(roles_id=3)
#                             print('saved<------------------------')
#                             user = User()
#                             user.first_name = request.POST['first_name']
#                             user.last_name = request.POST['last_name']
#                             user.email = request.POST['email']
#                             # u1=user.email
#                             # user.username = request.POST['email']
#                             user.password = make_password(request.POST['password'])
#                             user.roles_id = 3
#                             user.otp = otp
#                             user.save()
#                             User.objects.filter(username=request.POST['email']).update(country=request.POST['country_id'])
#                             requested_email=request.POST['email']
#                             userid = user.id
#                             record_data = {'requested_email':requested_email, 'name':user.first_name, 'otp':otp, 'userid':userid}
#                             SentOTPViaEmailThread(record_data).start()
#                             return redirect(f'/auth/register/verification/{userid}')
#                         else:
#                             messages.error(request, "Data is not valid.")
#                     else:
#                         messages.error(request, "Password and Confirm Password is not matched.")
#                 else:
#                     messages.error(request, "Password and Confirm Password length should minimum seven digit")
#             else:
#                 messages.error(request, "Name must be character.") 
#         else:
#             messages.error(request, "Emails is already registred with us.")

        
#     context = {'title': 'Registration','forms': forms}
#     return render(request, 'web/register.html', context)


def user_register(request):
    forms = UserRegisterForm()
    if request.method == 'POST':
        email_verification=User.objects.filter(username=request.POST['email'],email_varification=False).exists()
        if email_verification:
            u1=User.objects.filter(email=request.POST['email']).all()
            u1.delete()    
        existance_of_user = User.objects.filter(username=request.POST['email']).exists()
        if not existance_of_user:
            forms = UserRegisterForm(request.POST)
            first_name=request.POST['first_name']
            last_name=request.POST['last_name']
            password = request.POST['password']          
            confirm_password = request.POST['confirm_password']
            if all(x.isalpha() or x.isspace()  for x in first_name) and all(y.isalpha() or y.isspace() for y in last_name):   
                if len(password)>6 and len(confirm_password)>6:
                    if password == confirm_password :
                        if forms.is_valid():
                            otp = get_random_string(4, allowed_chars='0123456789')
                            # forms.save()
                            # # User.objects.filter(id=user.id).update(username=request.POST['email'])
                            # # User.objects.filter(id=user.id).update(roles_id=3)
                            print('saved<------------------------')
                            user = User()
                            user.first_name = request.POST['first_name']
                            user.last_name = request.POST['last_name']
                            user.email = request.POST['email']
                            user.username = request.POST['email']
                            user.password = make_password(request.POST['password'])
                            user.roles_id = 3
                            user.otp = otp
                            user.save()
                            User.objects.filter(username=request.POST['email']).update(country=request.POST['country_id'])
                            requested_email=request.POST['email']
                            userid = user.id
                            record_data = {'requested_email':requested_email, 'name':user.first_name, 'otp':otp, 'userid':userid}
                            SentOTPViaEmailThread(record_data).start()
                            return redirect(f'/auth/register/verification/{userid}')
                        else:
                            messages.error(request, "Data is not valid.")
                    else:
                        messages.error(request, "Password and Confirm Password is not matched.")
                else:
                    messages.error(request, "Password and Confirm Password length should minimum seven digit")
            else:
                messages.error(request, "Name must be character.") 
        else:
            messages.error(request, "Emails is already registred with us.")

        
    context = {'title': 'Registration','forms': forms}
    return render(request, 'web/register.html', context)

# OTP Verification
def Verify_register_account(request,id):
    forms=VerifyRegiterForm()
    users = User.objects.filter(id=id).last()
    email_otp=users.otp
    print(email_otp, "OTP SCREEN GETED OTP<<<<<<<<<<<<<<<<")
    if request.method == 'POST':
        user_otp=request.POST['register_otp']
        if user_otp == email_otp:
            # users.username=users.email
            users.email_varification=True
            users.save()
            messages.success(request,"Account Create Successfuly.")
            return redirect('/')  
        else:
            messages.error(request, "Otp is wrong!")
            return redirect(f'/auth/register/verification/{id}')
    context={'forms':forms}    
    return render(request, 'web/Verify_register_account.html',context)

# Sent URL via Mail
def sent_forgot_password_url(request):
    forms = ForgotPasswordForm()
    base_url = f"{request.scheme}"+"://" +f"{request.get_host()}"
    print(base_url, "<====================Host")

    if request.method == 'POST':
        requested_email = request.POST.get('forgot_password_email')
        user =  User.objects.filter(email=requested_email).exists()
        print(user)
        if user:
            user =  User.objects.filter(email=requested_email).last()
            name = user.first_name + " " + user.last_name
            userid = user.id
            record_data = {'requested_email':requested_email, 'name':name, 'userid':userid,'base_url':base_url}
            SentForgotPasswordLinkViaEmailThread(record_data).start()
            # send_email(requested_email,name, userid, base_url)
            print("Email Successfully Delivered!")
            messages.success(request, "Link to reset your password is successfully sented to your mail.")
        else:
            messages.error(request, "Enter email is not recognised!")
        
    print(request.POST)
    context = {'title': 'Forgot Password','forms':forms}
    return render(request, 'web/forgot-password.html', context)

# Forgot Password View
def change_password(request, id):
    forms = ChangePasswordForm()
    user = User.objects.filter(id=id)
    print(user,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<,User")
    if request.method == 'POST':
        form = ChangePasswordForm(request.POST)
        if form.is_valid():
            password = request.POST['password']
            confirm_password = request.POST['confirm_password']
            if password == confirm_password:
                new_password = make_password(password)
                User.objects.filter(id=id).update(password=new_password)
                # user.password = make_password(request.POST['password'])
                # user.save()
                messages.success(request, "Your password is successfully Chnaged.")
                # return redirect(settings.LOGIN_REDIRECT_URL)
            else:
                messages.error(request, "Password and Confirm Password is not matched!")
                return redirect(f'/user/change_password/{id}/')
    context = {'forms':forms}
    return render(request, 'web/change-password.html', context)

# Logout URL Here.
def logout_view(request):
    logout(request)
    return redirect(settings.LOGOUT_REDIRECT_URL)

# All Login Required pages.
@login_required
def user_dashboard(request):
    role_id = request.user.roles_id
    user_id = request.user.id
    sub_admins = User.objects.filter(roles_id=2).count()
    publishers = User.objects.filter(roles_id=3).count()
    system_category = SystemCategory.objects.count()
    magazine_category = MagazineCategory.objects.count()
    languages = Language.objects.count()
    subscriptions = Subscription.objects.count()
    offers = MagazineOfferinfo.objects.count()
   

    if role_id in [1,2]:
        sub_publishers = User.objects.filter(roles_id=4).count()
        magazine_info = MagazineInfo.objects.count()
        author = Author.objects.count()
        magazine_pages =  MegazinePages.objects.count()

        ########################### Admin Earning magazine amt.
        purchase_info = MagazinePurchaseInfo.objects.all().order_by('-create_on')
        purchase_info = MagazinePurchaseInfoSumAmountSerializer(purchase_info, many=True,context={'request':request})
        purchase_info = purchase_info.data
        admin_earning_amt = 0
        if purchase_info:
            for row in purchase_info:
                admin_earning_amt+=row['ammount']
                admin_earning_amt = round(admin_earning_amt,2)
        else:
            admin_earning_amt = 0
        ############################

    
    elif role_id == 3:
        ##################################
        subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
        subpliserappend = []
        if subpubliserlist:
            for subpuliserrow in subpubliserlist:
                subpliserappend.append(subpuliserrow.users_id)
    
        purchase_info = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id)).order_by('-create_on')
        purchase_info = MagazinePurchaseInfoSumAmountSerializer(purchase_info, many=True,context={'request':request})
        purchase_info = purchase_info.data
        admin_earning_amt = 0
        if purchase_info:
            for row in purchase_info:
                admin_earning_amt+=row['ammount']
                admin_earning_amt = round(admin_earning_amt,2)
        else:
             admin_earning_amt = 0
        #####################################
        subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
        subpliserappend = []
        if subpubliserlist:
            for subpuliserrow in subpubliserlist:
                subpliserappend.append(subpuliserrow.users_id)
        sub_publishers=User.objects.filter(id__in=subpliserappend).count()
        magazine_info = MagazineInfo.objects.filter(users_id=user_id).count()
        author = Author.objects.filter(users_id=user_id).count()
        magazine_pages =  MegazinePages.objects.filter(users_id=user_id).count()

    else:
        ###########################
        purchase_info = MagazinePurchaseInfo.objects.filter(magazineInfos__users_id=user_id).order_by('-create_on')
        purchase_info = MagazinePurchaseInfoSumAmountSerializer(purchase_info, many=True,context={'request':request})
        purchase_info = purchase_info.data
        admin_earning_amt = 0
        if purchase_info:
            for row in purchase_info:
                admin_earning_amt+=row['ammount']
                admin_earning_amt = round(admin_earning_amt,2)
        else:
             admin_earning_amt = 0
        ############################
        sub_publishers = User.objects.filter(roles_id=4, ).count()
        magazine_info = MagazineInfo.objects.filter(users_id=user_id).count()
        author = Author.objects.filter(users_id=user_id).count()
        magazine_pages =  MegazinePages.objects.filter(users_id=user_id).count()


    context = {
        'title': 'Dashboard',
        'sub_admins':sub_admins,
        'publishers':publishers,
        'sub_publishers':sub_publishers,
        'system_category':system_category,
        'magazine_category':magazine_category,
        'magazine_info':magazine_info,
        'magazine_pages':magazine_pages,
        'author':author,
        'languages':languages,
        'subscriptions':subscriptions,
        'offers':offers,
        'admin_earning_amt':admin_earning_amt,
        }
    return render(request, 'web/dashboard/admin.html', context)

@login_required
def forget_change_password(request):
    user=request.user
    email=request.user.email
    fname=request.user.first_name
    lname=request.user.last_name
    full_name=fname+" "+lname
    print(full_name,email)
    forms=ForgetChangePasswordForm()
    if request.method == 'POST':
        form = ForgetChangePasswordForm(request.POST)
        if form.is_valid():
            last_password = request.user.password
            old_password = request.POST['old_password']
            check = check_password(old_password, last_password)
            if check:
                password = request.POST['password']
                c_password = request.POST['confirm_password']
                if password == c_password:
                    user.password = make_password(request.POST['password'])
                    user.save()
                    record_data = {'full_name':full_name,'email':email}
                    ForgotPasswordVerificationThread(record_data).start()
                    # send_config_email(full_name, email)
                    return redirect('/user/dashboard/')
                else:
                    messages.error(request, "Password and Confirm Password is not matched!")
                    return redirect('/user/forget_change_password/')
            else:
                messages.error(request, "Old Password is not matched!")
                return redirect('/user/forget_change_password/')   
    context = {'title': 'Forget Change Password','forms':forms}
    return render(request, 'web/forget_password/index.html', context)


@login_required
def sub_admin_view(request):
    search = request.GET.get('search', '')
    id = request.user.id
    print(search, " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+_+_+++_+_+")
    if search:
        sub_admins = User.objects.filter((Q(first_name__icontains=search) | Q(last_name__icontains=search) | Q(email__icontains=search)) & Q(roles_id=2))
        if not sub_admins:
            messages.error(request, "No Data Found!")
        else:
            messages.success(request, "Data Found Successfully!")
    else:
        # if id in [1,2]:
        #     sub_admins = User.objects.all().order_by('-created_on')
        # else:
        sub_admins = User.objects.filter(roles_id=2).order_by('-created_on')
            # sub_admins = User.objects.filter(Q(roles_id=2)).order_by('-created_on')
    print(sub_admins,"<+==================================")
    paginator = Paginator(sub_admins, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title':'Sub Admin','sub_admins':page_obj,'search':search}
    return render(request, 'web/sub_admin/index.html', context)

@login_required
def add_sub_admin_view(request):
    print("YoYO")
    forms = UserRegisterForm()
    id = request.user.id
    if request.method == 'POST':
        email = request.POST['email']
        fname=request.POST['first_name']
        lname=request.POST['last_name']
        check_email =  User.objects.filter(Q(email=email) | Q(username=email))
        print(check_email,"++++++++++++++++++++++++++++++++++++++checking")
        if all(x.isalpha() or x.isspace()  for x in fname) and all(y.isalpha() or y.isspace() for y in lname):
            if not check_email:
                password = request.POST['password']
                confirm_password = request.POST['confirm_password']
                if len(password)>6 and len(confirm_password)>6:
                    if password == confirm_password :
                        user = User()
                        user.first_name = request.POST['first_name']
                        user.last_name = request.POST['last_name']
                        user.email = request.POST['email']
                        user.username = request.POST['email']
                        user.password = make_password(password)
                        user.roles_id = 2
                        user.save()
                        print(user,"================>")
                        sub_user = SubPublisherUser()
                        sub_user.created_by_id = id
                        sub_user.users_id = user.id
                        sub_user.save()
                        print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<IN.")
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/subadmin/')
                    else:
                        messages.error(request, "Password and confirm password does not match!")
                        forms = UserRegisterForm(request.POST)
                else:
                    messages.error(request, "Your password must be greater than 6 characters.")
                    forms = UserRegisterForm(request.POST)        
            else:
                messages.error(request, "This email is already registered!")
                forms = UserRegisterForm(request.POST)
        else:
            messages.error(request, "Firstname and Lastname must be character.")
            forms = UserRegisterForm(request.POST)         
    context = {'title':'Add Sub Admin','forms':forms}
    return render(request, 'web/sub_admin/add.html', context)

@login_required
def edit_sub_admin_view(request, id):
    print("id -----------------> ",id)
    user = User.objects.filter(id=id).last()
    print(user, " <-----------------------------------")
    forms = SubAdminForm(request.POST or None, instance = user)
    if request.method == 'POST' and forms.is_valid():
        forms.save()
        messages.success(request, 'Data has been Updated successfully.')
        return redirect('/user/dashboard/subadmin/')

    context = {'title': 'Edit Sub Admin','forms':forms,}
    return render(request, 'web/sub_admin/edit.html', context)

@login_required
def delete_sub_admin_view(request, id):
    user = User.objects.get(id=id)
    print(user,"==============")
    user.is_active = False
    user.save()
    print(user.is_active,"<===================")
    messages.success(request, f'{user.first_name} {user.last_name} (Subadmin) has been deactivated successfully.')
    return redirect('/user/dashboard/subadmin/')

@login_required
def activate_sub_admin_view(request, id):
    user = User.objects.get(id=id)
    print(user,"==============")
    user.is_active = True
    user.save()
    print(user.is_active,"<===================")
    messages.success(request, f'{user.first_name} {user.last_name} (Subadmin) has been activated successfully.')
    return redirect('/user/dashboard/subadmin/')




@login_required    
def publisher_view(request):
    search=request.GET.get('search', '')
    if search:
        publishers = User.objects.filter((Q(first_name__icontains=search) | Q(last_name__icontains=search) | Q(email__icontains=search)) & Q(roles_id=3))
        if not publishers:
            messages.error(request, "No Data Found!")
        else:
            messages.success(request, "Data Found Successfully!")
    else:
        publishers = User.objects.filter(roles_id=3).order_by('-created_on')
    paginator = Paginator(publishers, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'Publisher','publishers':page_obj,'search':search}
    return render(request,'web/publisher/index.html',context)  

@login_required    
def add_publisher_view(request):
    forms=UserRegisterForm()
    id = request.user.id
    if request.method == 'POST':
        email = request.POST['email']
        fname=request.POST['first_name']
        lname=request.POST['last_name']
        check_email =  User.objects.filter(Q(email=email) | Q(username=email))
        print(check_email,"++++++++++++++++++++++++++++++++++++++checking")
        if all(x.isalpha() or x.isspace()  for x in fname) and all(y.isalpha() or y.isspace() for y in lname):
            if not check_email:
                password = request.POST['password']
                confirm_password = request.POST['confirm_password']
                if len(password)>6 and len(confirm_password)>6:
                    if password == confirm_password:
                        user = User()
                        user.first_name = request.POST['first_name']
                        user.last_name = request.POST['last_name']
                        user.email = request.POST['email']
                        user.username = request.POST['email']
                        user.password = make_password(password)
                        user.roles_id = 3
                        user.save()
                        print(user,"================>")
                        sub_user = SubPublisherUser()
                        sub_user.created_by_id = id
                        sub_user.users_id = user.id
                        sub_user.save()
                        print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<IN.")
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/publisher/')
                    else:
                        messages.error(request, "Password and confirm password does not match!")
                        forms = UserRegisterForm(request.POST)
                else:
                    messages.error(request, "Your password must be greater than 6 characters.")
                    forms = UserRegisterForm(request.POST)            
            else:
                messages.error(request, "This email is already registered!")
                forms = UserRegisterForm(request.POST)
        else:
            messages.error(request, "Firstname and Lastname must be character.")
            forms = UserRegisterForm(request.POST)    
    context = {'title': 'Add Publisher','forms':forms}
    return render(request, 'web/publisher/add.html', context)


@login_required
def edit_publisher_view(request,id):
    publisher=User.objects.filter(id=id).last()
    forms=PublisherForm(request.POST or None ,instance=publisher)
    if request.method == 'POST' and forms.is_valid():
        forms.save()
        messages.success(request, 'Data has been updated successfully.')
        return redirect('/user/dashboard/publisher/')
    context = {'title': 'Edit Publisher Page','forms':forms}
    return render(request, 'web/publisher/edit.html',context)    

@login_required
def delete_publisher_view(request,id):
    publisher = User.objects.get(id=id)
    publisher.is_active = False
    publisher.save()
    messages.success(request, f'{publisher.first_name} {publisher.last_name} (Publisher) has been deactivated successfully.')
    return redirect('/user/dashboard/publisher/')   

@login_required
def activate_publisher_view(request, id):
    publisher = User.objects.get(id=id)
    publisher.is_active = True
    publisher.save()
    messages.success(request, f'{publisher.first_name} {publisher.last_name} (Subadmin) has been activated successfully.')
    return redirect('/user/dashboard/publisher/')  


#### Add New SubPubliser.
@login_required    
def add_sub_publisher_view(request):
    forms=UserRegisterForm()
    id = request.user.id
    if request.method == 'POST':
        email = request.POST['email']
        fname=request.POST['first_name']
        lname=request.POST['last_name']
        check_email =  User.objects.filter(Q(email=email) | Q(username=email))
        print(check_email,"++++++++++++++++++++++++++++++++++++++checking")
        if all(x.isalpha() or x.isspace()  for x in fname) and all(y.isalpha() or y.isspace() for y in lname):    
            if not check_email:
                password = request.POST['password']
                confirm_password = request.POST['confirm_password']
                if len(password)>6 and len(confirm_password)>6:
                    if password == confirm_password:
                        user = User()
                        user.first_name = request.POST['first_name']
                        user.last_name = request.POST['last_name']
                        user.email = request.POST['email']
                        user.username = request.POST['email']
                        user.password = make_password(password)
                        user.roles_id = 4
                        user.save()
                        print(user,"================>")
                        sub_user = SubPublisherUser()
                        sub_user.created_by_id = id
                        sub_user.users_id = user.id
                        sub_user.save()
                        print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<IN.")
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/subpublisher/')
                    else:
                        messages.error(request, "Password and confirm password does not match!")
                        forms = UserRegisterForm(request.POST)
                else:
                    messages.error(request, "Your password must be greater than 6 characters.")
                    forms = UserRegisterForm(request.POST)            
            else:
                messages.error(request, "This email is already registered!")
                forms = UserRegisterForm(request.POST)
        else:
            messages.error(request, "Firstname and Lastname must be character.")
            forms = UserRegisterForm(request.POST)        
    context = {'title': 'Add SubPublisher','forms':forms}
    return render(request, 'web/sub_publisher/add.html', context)
### Close Subpubliser.
@login_required    
def sub_publisher_view(request):
    search=request.GET.get('search','')
    publiser_id = request.user.id
    rolesid = request.user.roles_id
    print('>>>>>>>>>>', rolesid)
    if rolesid in [1,2]:
        print('admin>>>>>>>>>>>>>>>')
        if search:
            publishers=User.objects.filter((Q(first_name__icontains=search) | Q(last_name__icontains=search) | Q(email__icontains=search) ), roles_id=4).order_by('-created_on')
            if not publishers:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            publishers = User.objects.filter(roles_id=4).all().order_by('-created_on')
    else:
        subpubliserlist = SubPublisherUser.objects.filter(created_by_id=publiser_id).all()
        subpliserappend = []
        if subpubliserlist:
            for subpuliserrow in subpubliserlist:
                subpliserappend.append(subpuliserrow.users_id)
            if search:
                publishers=User.objects.filter((Q(first_name__icontains=search) | Q(last_name__icontains=search) | Q(email__icontains=search) ), id__in =subpliserappend).order_by('-created_on')
                if not publishers:
                    messages.error(request, "No Data Found!")
                else:
                    messages.success(request, "Data Found Successfully!")
            else:
                publishers=User.objects.filter(id__in =subpliserappend).order_by('-created_on')
        else:
            publishers = User.objects.none()

    
    # print(subpubliserlist,'>>>>>>>>>>>>>>>>')

    # search=request.GET.get('search')
    # if search:
    #     publishers=User.objects.filter((Q(first_name=search) | Q(last_name=search) | Q(email=search) ) & Q(roles_id = 4))
    # else:
    #     publishers=User.objects.filter(Q(roles_id=4)).order_by('-created_on')
    paginator = Paginator(publishers, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'Publisher','publishers':page_obj,'search':search}
    return render(request,'web/sub_publisher/index.html',context)    



@login_required
def edit_sub_publisher_view(request,id):
    publisher=User.objects.filter(id=id).last()
    forms=SubPublisherForm(request.POST or None ,instance=publisher)
    if request.method == 'POST' and forms.is_valid():
        forms.save()
        messages.success(request, 'Data has been updated successfully.')
        return redirect('/user/dashboard/subpublisher/')
    context = {'title': 'Edit SubPublisher Page','forms':forms}
    return render(request, 'web/sub_publisher/edit.html',context)    

@login_required
def delete_sub_publisher_view(request,id):
    sub_publisher = User.objects.get(id=id)
    sub_publisher.is_active = False
    sub_publisher.save()
    messages.success(request, f'{sub_publisher.first_name} {sub_publisher.last_name} (Sub-Publisher) has been deactivated successfully.')
    return redirect('/user/dashboard/subpublisher/')  

@login_required
def activate_sub_publisher_view(request, id):
    sub_publisher = User.objects.get(id=id)
    sub_publisher.is_active = True 
    sub_publisher.save()
    messages.success(request, f'{sub_publisher.first_name} {sub_publisher.last_name} (Sub-Publisher) has been activated successfully.')
    return redirect('/user/dashboard/subpublisher/') 

      

@login_required
def author_view(request):
    search = request.GET.get('search', '')
    id = request.user.roles_id
    user_id = request.user.id
    if id in [1,2]:
        if search:
            authors = Author.objects.filter((Q(author_name__icontains=search) | Q(writing_type__icontains=search)))
            if not authors:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            authors = Author.objects.all().order_by('-create_on')
    ## Publiser for
    elif id == 3:
        if search:
            authors = Author.objects.filter((Q(author_name__icontains=search) | Q(writing_type__icontains=search)),users_id=request.user.id)
            if not authors:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            authors = Author.objects.filter(users_id=user_id).all().order_by('-create_on')
        
    else:
        if search:
            authors = Author.objects.filter((Q(author_name__icontains=search) | Q(writing_type__icontains=search)),users_id=request.user.id)
            if not authors:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            authors = Author.objects.filter(users_id=user_id).all().order_by('-create_on')
    paginator = Paginator(authors, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'Author','authors':page_obj,'search':search}
    return render(request, 'web/author/index.html', context)

# Add Author.
@login_required
def add_author_view(request):
    # print(request.user.first_name)
    print('+++++++++++++++++++++111111111111', request)
    forms = AddAuthorForm()
    if request.method == 'POST':
        forms = AddAuthorForm(request.POST, request.FILES)
        author_name=request.POST['author_name']
        writing_type=request.POST['writing_type']
        if all(x.isalpha() or x.isspace()  for x in author_name): 
            if all(y.isalpha() or y.isspace() for y in writing_type):
                if forms.is_valid():
                    author = forms.save()
                    Author.objects.filter(id=author.id).update(users_id=request.user.id)
                    messages.success(request, 'Data has been saved successfully.')
                    return redirect('/user/dashboard/author/')
                else:
                    messages.error(request, 'Something went wrong!')
                    forms = AddAuthorForm(request.POST, request.FILES)
            else:
                messages.error(request, 'Writing type must be character!')
                forms = AddAuthorForm(request.POST, request.FILES )       
        else:
            messages.error(request, 'Name must be character!')
            forms = AddAuthorForm(request.POST, request.FILES)        
    context = {'title': 'Add Author','forms':forms,}
    return render(request, 'web/author/add.html', context)


@login_required
def edit_author_view(request,id):
    print("id -----------------> ",id)
    author = Author.objects.filter(id=id).last()
    forms = AddAuthorForm(request.POST or None, request.FILES or None, instance=author)
    if request.method == 'POST':
        author_name=request.POST['author_name']
        writing_type=request.POST['writing_type'] 
        if all(x.isalpha() or x.isspace()  for x in author_name): 
            if all(y.isalpha() or y.isspace() for y in writing_type):
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been Updated successfully.')
                    return redirect('/user/dashboard/author/')
            else:
                messages.error(request, 'Writing type must be character!')
                forms = AddAuthorForm(request.POST, request.FILES, instance=author)       
        else:
            messages.error(request, 'Name must be character!')
            forms = AddAuthorForm(request.POST, request.FILES, instance=author)       
    context = {'title': 'Edit Author','forms':forms,}
    return render(request, 'web/author/edit.html', context)

@login_required
def delete_author_view(request,id):
    author = Author.objects.get(id=id)
    author.delete()
    print("Deleted<------")
    messages.success(request, 'Data has been deleted successfully.')
    return redirect('/user/dashboard/author/')

@login_required
def system_category_view(request):
    search=request.GET.get('search', '')
    id = request.user.roles_id
    user_id = request.user.id
    if id in [1,2]:
        if search:
            system_categorys = SystemCategory.objects.filter((Q(category_name__icontains=search)))
            if not system_categorys:
                messages.error(request, "No Data Found!")
                print("-------------------is here")
            else:
                messages.success(request, "Data Found Successfully!")
                print("-------------------is here")
        else:
            system_categorys = SystemCategory.objects.all().order_by('-create_on')
    paginator = Paginator(system_categorys, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'System Category','system_categorys':page_obj,'search':search}
    return render(request, 'web/system_category/index.html', context)


@login_required
def add_system_category_view(request):
    forms = AddSystemCategoryForm()
    if request.method == 'POST':
        category_name=request.POST['category_name']
        category=SystemCategory.objects.filter(category_name=category_name).last()
        if category:
            print(category)
            messages.error(request, 'Category already exists.')
            forms = AddSystemCategoryForm(request.POST,request.FILES)
            print(' data  not found') 

        else:
            forms = AddSystemCategoryForm(request.POST,request.FILES)
            # if category_name.isalpha():
            if all(x.isalpha() or x.isspace()  for x in category_name):    
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been saved successfully.')
                    return redirect('/user/dashboard/systemcategory/')
                else:
                    messages.error(request, 'Category already exists.')
                    forms = AddSystemCategoryForm(request.POST,request.FILES)
            else:
                messages.error(request, 'Category must be character.')
                forms = AddSystemCategoryForm(request.POST,request.FILES)        
    context = {'title': 'Add System Category','forms':forms}
    return render(request, 'web/system_category/add.html', context)

@login_required
def edit_system_category_view(request,id):
    print("id -----------------> ",id)
    system_category = SystemCategory.objects.filter(id=id).last()
    forms = AddSystemCategoryForm(request.POST or None, request.FILES or None, instance=system_category)
    if request.method == 'POST':
        category_name=request.POST['category_name']
        category=SystemCategory.objects.filter(category_name=category_name).last()
        if category:
            if category.id == id:
                if all(x.isalpha() or x.isspace()  for x in category_name):
                    if forms.is_valid():
                        forms.save()
                        messages.success(request, 'Data has been updated successfully.')
                        return redirect('/user/dashboard/systemcategory/')
                    else:
                        messages.error(request, 'Category already exists.')
                        forms = AddSystemCategoryForm(request.POST,request.FILES)
                else:
                    messages.error(request, 'Category must be character.')
                    forms = AddSystemCategoryForm(request.POST,request.FILES)        
            else:
                print(category)
                messages.error(request, 'Category already exists.')
                forms = AddSystemCategoryForm(request.POST,request.FILES)
                print(' data  not found') 
        else:
            if category_name.isalpha():
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been updated successfully.')
                    return redirect('/user/dashboard/systemcategory/')
                else:
                    messages.error(request, 'Category already exists.')
                    forms = AddSystemCategoryForm(request.POST,request.FILES)
            else:
                messages.error(request, 'Category must be character.')
                forms = AddSystemCategoryForm(request.POST,request.FILES)         
    context = {'title': 'Edit System Category','forms':forms}
    return render(request, 'web/system_category/edit.html', context)
    
@login_required
def delete_system_category_view(request,id):
    system_category = SystemCategory.objects.get(id=id)
    system_category.delete()
    messages.success(request, 'Data has been deleted successfully.')
    return redirect('/user/dashboard/systemcategory/')

   
# Magazine Category List.
@login_required
def magazine_category_view(request):
    search=request.GET.get('search', '')
    id=request.user.roles_id
    user_id = request.user.id
    if id in [1,2]:
        if search:
            magazine_categorys = MagazineCategory.objects.filter(Q(category_name__icontains=search)|Q(magazine_category_color__icontains=search))
            if not magazine_categorys:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            magazine_categorys = MagazineCategory.objects.all().order_by('-create_on')
    paginator = Paginator(magazine_categorys, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'Magazine Category','magazine_categorys':page_obj,'search':search}
    return render(request, 'web/magazine_category/index.html', context)

@login_required
def add_magazine_category_view(request):
    forms = AddMagazineCategoryForm()
    if request.method == 'POST':
        category_name=request.POST['category_name']
        category=MagazineCategory.objects.filter(category_name=category_name).exists()
        if category:
            print(category)
            messages.error(request, 'Category already exists.')
            forms = AddMagazineCategoryForm(request.POST,request.FILES)
            print(' data  not found') 
        else:
            forms = AddMagazineCategoryForm(request.POST,request.FILES)
            if all(x.isalpha() or x.isspace()  for x in category_name):
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been saved successfully.')
                    return redirect('/user/dashboard/magazinecategory/')
                else:
                    messages.error(request, 'Color in hexcode.')
                    forms = AddMagazineCategoryForm(request.POST,request.FILES)  
            else:
                messages.error(request, 'Category must be character.')
                forms = AddMagazineCategoryForm(request.POST,request.FILES)              
    context = {'title': 'Add Magazine Category','forms':forms}
    return render(request, 'web/magazine_category/add.html', context)

@login_required
def edit_magazine_category_view(request,id):
    magazine_category = MagazineCategory.objects.filter(id=id).last()
    forms = AddMagazineCategoryForm(request.POST or None, request.FILES or None, instance=magazine_category)
    if request.method == 'POST':
        category_name=request.POST['category_name']
        category=MagazineCategory.objects.filter(category_name=category_name).last()
        # forms = AddMagazineCategoryForm(request.POST, request.FILES)
        if category:
            if category.id == id:
                if all(x.isalpha() or x.isspace()  for x in category_name):
                    if forms.is_valid():
                        forms.save()
                        messages.success(request, 'Data has been updated successfully.')
                        return redirect('/user/dashboard/magazinecategory/')
                    else:
                        messages.error(request, 'Data is not valid.')
                        forms = AddMagazineCategoryForm(request.POST,request.FILES, instance=magazine_category)
                else:
                    messages.error(request, 'Category must be character.')
                    forms = AddMagazineCategoryForm(request.POST,request.FILES,instance=magazine_category) 
            else:
                print(category)
                messages.error(request, 'Category already exists.')
                forms = AddMagazineCategoryForm(request.POST,request.FILES,instance=magazine_category)
                print(' data  not found') 
        else:
            if category_name.isalpha():
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been updated successfully.')
                    return redirect('/user/dashboard/magazinecategory/')
                else:
                    messages.error(request, 'Data is not valid..')
                    forms = AddMagazineCategoryForm(request.POST,request.FILES, instance=magazine_category)
            else:
                messages.error(request, 'Category must be character.')
                forms = AddMagazineCategoryForm(request.POST,request.FILES,instance=magazine_category) 
    context = {'title': 'Edit Magazine Category','forms':forms}
    return render(request, 'web/magazine_category/edit.html', context)

@login_required
def delete_magazine_category_view(request,id):
    magazine_category = MagazineCategory.objects.get(id=id)
    magazine_category.delete()
    messages.success(request, 'Data has been deleted successfully.')
    return redirect('/user/dashboard/magazinecategory/')

@login_required
def magazine_info_view(request):
    search = request.GET.get('search', '')
    magazine_infos = MagazineInfo()
    id = request.user.roles_id
    user_id = request.user.id
    if id in [1,2]:
        if search:
            print(type(search), '.......................')
            magazine_infos = MagazineInfo.objects.filter(Q(name__icontains=search)| Q(system_category_id__category_name=search) | Q(magazine_category_id__category_name=search) | Q(author_id__author_name=search) | Q(language_id__language=search))
            magazine_pages = MegazinePages.objects.all()
            try:
                filter_arg = Q(ratting=float(search))
                magazine_infos = MagazineInfo.objects.filter(filter_arg).order_by('-create_on')
            except ValueError:
                pass
            if not magazine_infos:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            magazine_infos = MagazineInfo.objects.all().order_by('-create_on')
            magazine_pages = MegazinePages.objects.all()
    
    elif id == 3:
        if search:
            magazine_pages = MegazinePages.objects.all()
            magazine_infos = MagazineInfo.objects.filter(Q(name__icontains=search)| Q(system_category_id__category_name=search) | Q(magazine_category_id__category_name=search) | Q(author_id__author_name=search) | Q(language_id__language=search),users_id = user_id)
            try:
                filter_arg = Q(ratting=float(search))
                magazine_infos = MagazineInfo.objects.filter(filter_arg).order_by('-create_on')
            except ValueError:
                pass
            if not magazine_infos:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            magazine_infos =  MagazineInfo.objects.filter(Q(users_id = user_id)).all().order_by('-create_on')
            magazine_pages = MegazinePages.objects.all()

    else:
        if search:
            magazine_pages = MegazinePages.objects.all()
            magazine_infos = MagazineInfo.objects.filter(Q(name__icontains=search)| Q(system_category_id__category_name=search) | Q(magazine_category_id__category_name=search) | Q(author_id__author_name=search) | Q(language_id__language=search),users_id = user_id)
            try:
                filter_arg = Q(ratting=float(search))
                magazine_infos = MagazineInfo.objects.filter(filter_arg).order_by('-create_on')
            except ValueError:
                pass
            if not magazine_infos:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            magazine_pages = MegazinePages.objects.all()
            magazine_infos =  MagazineInfo.objects.filter(Q(users_id = user_id)).all().order_by('-create_on')
    paginator = Paginator(magazine_infos, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'Magazine Info','magazine_infos':page_obj,'search':search,'magazine_pages':magazine_pages}
    return render(request, 'web/magazine_info/index.html', context)

@login_required
def add_magazine_info_view(request):
    forms = AddMagazineInfoForm()
    author_forms = MagazineAuthorForm()
    pages_forms = AddMegazinePagesForm()

    if request.method == 'POST':
        
      
        magazine_type = request.POST['form_select_type']
        if magazine_type == 'standard':
            magazine_type = 'Standard'
        elif magazine_type == 'Different':
            magazine_type == 'Diffrent Issues'

        mag_pages = request.FILES.get('pages')
        forms = AddMagazineInfoForm(request.POST, request.FILES)
        print(forms,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<1")
        print(forms.errors,">>>>>>>>>>>>>>>>>>>>>>>")
        # breakpoint()
        author_forms = MagazineAuthorForm(request.POST)
        pages_forms = AddMegazinePagesForm(request.POST, request.FILES)
        if forms.is_valid() and author_forms.is_valid:
            rent=request.POST['rent_price']
            buy=request.POST['buy_price']
            year_available=request.POST['year_available']
            year_available = int(year_available)
            
            comment=request.POST['comment']
            if not buy and not rent:
                print('Provide price.:::::::::::::::')
                messages.error(request, 'Please provide rent or buy price.')

            elif buy and rent:
                if buy == rent:
                    messages.error(request, 'Buy price and rent price can not be same.1')
                    print('Equal')
                elif buy < rent:
                    messages.error(request, 'Buy price can not be less then rent price.1')
                    print('Greater')
                elif buy != rent or buy > rent:
                    if mag_pages:
                        filename = mag_pages.name
                        if filename.endswith('.pdf'):
                            readpdf = PyPDF2.PdfFileReader(mag_pages)
                            totalpages = readpdf.numPages
                            # Saving Magazines
                            mgn = forms.save()
                            MagazineInfo.objects.filter(id=mgn.id).update(magazine_type=magazine_type)
                            MagazineInfo.objects.filter(id=mgn.id).update(users_id=request.user.id)
                            MagazineInfo.objects.filter(id=mgn.id).update(years_available=year_available)
                            MagazineInfo.objects.filter(id=mgn.id).update(comment=comment)
                            # Saving Magazines Pages
                            mag_pages = MegazinePages()
                            mag_pages.magazine_id = mgn.id
                            mag_pages.pages = request.FILES['pages']
                            mag_pages.users_id = request.user.id
                            mag_pages.page_number = totalpages
                            mag_pages.save()
                            # Saving Magazines Authors
                            author_list = author_forms['author'].data
                            for row in author_list:
                                authors = MagMapAuthor()
                                authors.author_id = row
                                authors.magazine_id = mgn.id
                                authors.save()
                                print(row,"<============+ Is Saved")
                            messages.success(request, 'Data has been saved successfully.')
                            return redirect('/user/dashboard/magazineinfo/')
                        else:
                            messages.error(request, 'File not supported, only pdf file is allowed!')
                    else:
                        mgn = forms.save()
                        MagazineInfo.objects.filter(id=mgn.id).update(magazine_type=magazine_type)
                        MagazineInfo.objects.filter(id=mgn.id).update(users_id=request.user.id)
                        MagazineInfo.objects.filter(id=mgn.id).update(years_available=year_available)
                        author_list = author_forms['author'].data
                        for row in author_list:
                            authors = MagMapAuthor()
                            authors.author_id = row
                            authors.magazine_id = mgn.id
                            authors.save()
                            print(row,"<============+ Is Saved")
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/magazineinfo/')

            elif buy and not rent:
                if mag_pages:
                    filename = mag_pages.name
                    if filename.endswith('.pdf'):
                        readpdf = PyPDF2.PdfFileReader(mag_pages)
                        totalpages = readpdf.numPages
                        # Saving Magazines
                        mgn = forms.save()
                        MagazineInfo.objects.filter(id=mgn.id).update(magazine_type=magazine_type)
                        MagazineInfo.objects.filter(id=mgn.id).update(users_id=request.user.id)
                        MagazineInfo.objects.filter(id=mgn.id).update(years_available=year_available)
                        # Saving Magazines Pages
                        mag_pages = MegazinePages()
                        mag_pages.magazine_id = mgn.id
                        mag_pages.pages = request.FILES['pages']
                        mag_pages.users_id = request.user.id
                        mag_pages.page_number = totalpages
                        mag_pages.save()
                        # MagazineInfo.objects.filter(id=mgn.id).update(magazine_type=magazine_type)
                        # Saving Magazines Authors
                        author_list = author_forms['author'].data
                        for row in author_list:
                            authors = MagMapAuthor()
                            authors.author_id = row
                            authors.magazine_id = mgn.id
                            authors.save()
                            print(row,"<============+ Is Saved")
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/magazineinfo/')
                    else:
                        messages.error(request, 'File not supported, only pdf file is allowed!')
                else:
                    mgn = forms.save()
                    MagazineInfo.objects.filter(id=mgn.id).update(magazine_type=magazine_type)
                    MagazineInfo.objects.filter(id=mgn.id).update(users_id=request.user.id)
                    MagazineInfo.objects.filter(id=mgn.id).update(years_available=year_available)
                    author_list = author_forms['author'].data
                    for row in author_list:
                        authors = MagMapAuthor()
                        authors.author_id = row
                        authors.magazine_id = mgn.id
                        authors.save()
                        print(row,"<============+ Is Saved")
                    messages.success(request, 'Data has been saved successfully.')
                    return redirect('/user/dashboard/magazineinfo/')

            elif not buy:
                print("injbdsbbjsbdjd<<<<<<<<<<<<<<<<<<<<<<<<<<")
                if mag_pages:
                    filename = mag_pages.name
                    if filename.endswith('.pdf'):
                        
                        readpdf = PyPDF2.PdfFileReader(mag_pages)
                        totalpages = readpdf.numPages
                        # Saving Magazines
                        mgn = forms.save()
                        MagazineInfo.objects.filter(id=mgn.id).update(magazine_type=magazine_type)
                        MagazineInfo.objects.filter(id=mgn.id).update(users_id=request.user.id)
                        MagazineInfo.objects.filter(id=mgn.id).update(years_available=year_available)
                        # Saving Magazines Pages
                        mag_pages = MegazinePages()
                        mag_pages.magazine_id = mgn.id
                        mag_pages.pages = request.FILES['pages']
                        mag_pages.users_id = request.user.id
                        mag_pages.page_number = totalpages
                        mag_pages.save()
                        # Saving Magazines Authors
                        author_list = author_forms['author'].data
                        for row in author_list:
                            authors = MagMapAuthor()
                            authors.author_id = row
                            authors.magazine_id = mgn.id
                            authors.save()
                            print(row,"<============+ Is Saved")
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/magazineinfo/')
                    else:
                        messages.error(request, 'File not supported, only pdf file is allowed!')
                else:
                        mgn = forms.save()
                        MagazineInfo.objects.filter(id=mgn.id).update(magazine_type=magazine_type)
                        MagazineInfo.objects.filter(id=mgn.id).update(users_id=request.user.id)
                        MagazineInfo.objects.filter(id=mgn.id).update(years_available=year_available)
                        author_list = author_forms['author'].data
                        for row in author_list:
                            authors = MagMapAuthor()
                            authors.author_id = row
                            authors.magazine_id = mgn.id
                            authors.save()
                            print(row,"<============+ Is Saved")
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/magazineinfo/')
            print("NOTIN")
        else:
            messages.error(request, 'Please enter valid data.')
            return redirect('/user/dashboard/addmagazines/')

                        
    context = {'title': 'Magazine Info','forms':forms, 'author_forms':author_forms,'pages_forms':pages_forms,}
    return render(request, 'web/magazine_info/add.html', context)

@login_required
def edit_magazine_info_view(request,id):
    print("id -----------------> ",id)
    magazine_info = MagazineInfo.objects.filter(id=id).last()
    year_available = magazine_info.years_available
    print(type(year_available))
    # breakpoint()
    authors = MagMapAuthor.objects.filter(magazine_id=id).all()
    mag_pages = MegazinePages.objects.filter(magazine_id=id).last()
    # all_authors = Author.objects.all()
    forms = AddMagazineInfoForm(request.POST or None, request.FILES or None, instance=magazine_info)
    pages_forms = AddMegazinePagesForm(request.POST or None, request.FILES or None, instance=mag_pages)
    mag = MagazineInfo.objects.filter(id=id).last()
    user_id = mag.users_id
    # author_forms = MagazineAuthorForm(request.POST or None, instance=authors)
    author_list = Author.objects.all()
    author_list = GetAuhtorSerializer(author_list, many=True, context={'magzine_id':id})
    author_list = author_list.data
    if request.method == 'POST' and forms.is_valid():
        year_available=request.POST['year_available']
        year_available = int(year_available)
        magazine_type = request.POST['form_select_type']
        if magazine_type == 'standard':
            magazine_type = 'Standard'
        elif magazine_type == 'Different':
            magazine_type == 'Diffrent Issues'
        forms.save()
        MagazineInfo.objects.filter(id=id).update(magazine_type=magazine_type)
        MagazineInfo.objects.filter(id=id).update(years_available=year_available)
        # MagazineInfo.objects.filter(id=id).update(years_available=year_available)
        a = pages_forms['pages'].data
        if not a is None:
            # PDF Page Counter ############################
            readpdf = PyPDF2.PdfFileReader(a)
            totalpages = readpdf.numPages
            ###############################################
            filename = a.name
            if filename.endswith('.pdf'):
                mag = MegazinePages.objects.filter(magazine_id=id).exists()
                if mag:
                    MegazinePages.objects.filter(magazine_id=id).update(pages=a)
                    MegazinePages.objects.filter(magazine_id=id).update(page_number=totalpages)
                    
                else:
                    mag_pages = MegazinePages()
                    mag_pages.magazine_id = id
                    mag_pages.pages = a
                    mag_pages.page_number=totalpages
                    mag_pages.users_id=user_id
                    mag_pages.save()
            else:
                messages.error(request, "File not supported! only pdf file is allow.")
                return redirect(f'/user/dashboard/editmagazines/{id}/')

        author_data = MagMapAuthor.objects.filter(magazine_id=id).delete()
        # magazine_info_data = MagazineInfo.objects.filter
        authors =  request.POST.getlist('author')
        for row in authors:
            authors = MagMapAuthor()
            authors.author_id = row
            authors.magazine_id = id
            authors.save()
            print(row,"<============+ Is Saved")
        messages.success(request, 'Data has been updated successfully.')
        return redirect('/user/dashboard/magazineinfo/')
    elif not forms.is_valid:
        messages.error(request, 'Data is not valid.')

    print(forms.errors)
    context = {'title': 'Edit Megazine Info','forms':forms,'author_list':author_list,
               'pages_forms':pages_forms,'mag_pages':magazine_info,}
    return render(request, 'web/magazine_info/edit.html', context)

@login_required
def activate_magazine_commission_view(request,id):
    magazine_info = MagazineInfo.objects.filter(id=id).last()
    value_click=request.POST['flexRadioDefault']
    if value_click == 'button1':
        magazine_info.is_commission=True
        magazine_info.is_aproved = True
        magazine_info.save()
        messages.success(request, f'{magazine_info.name} has been aproved successfully.')
        extra='with commission as per your country'
        publisher_id = magazine_info.users_id
        print(publisher_id,'views???????????????????????????/')
        record_data = {'publisher_id':publisher_id,'extra':extra ,'magazine_name':magazine_info.name,'status':"Approved"}
        print(magazine_info.name,'***********************88views')
        MagazineApprovedEmailTread(record_data).start()
        print('ajay......................................')
    if value_click == 'button2':
        magazine_info.is_commission=False   
        magazine_info.is_aproved = True  
        magazine_info.save()     
        messages.success(request, f'{magazine_info.name} has been aproved successfully.')
        extra='without commission'
        publisher_id = magazine_info.users_id
        record_data = {'publisher_id':publisher_id,'extra':extra, 'magazine_name':magazine_info.name,'status':"Approved"}
        MagazineApprovedEmailTread(record_data).start()
    return redirect('/user/dashboard/magazineinfo/') 
    
@login_required
def delete_magazine_info_view(request, id):
    magazine_info = MagazineInfo.objects.get(id=id)
    magazine_info.delete()
    messages.success(request, 'Data has been deleted successfully.')
    return redirect('/user/dashboard/magazineinfo/')

# Active Magzine Only for Admin
@login_required
def activate_magazine_view(request, id):
    if request.user.roles_id == 1:
        mgz = MagazineInfo.objects.get(id=id)
        mgz.is_active = True
        mgz.save()
        messages.success(request, f'{mgz.name} has been activeate successfully.')
        #############
        # Sending male to the publisher
        publisher_id = mgz.users_id
        record_data = {'publisher_id':publisher_id, 'magazine_name':mgz.name,'status':"Activated"}
        MagazineStatusEmailTread(record_data).start()
        #############
        print("Email Delivered!!! <-----------------")
        return redirect('/user/dashboard/magazineinfo/')
    else:
        return redirect('/user/dashboard/magazineinfo/')

# Deactive Magzine Only for Admin
@login_required
def deactivate_magazine_view(request, id):
    if request.user.roles_id == 1:
        mgz = MagazineInfo.objects.get(id=id)
        mgz.is_active = False
        mgz.save()
        messages.success(request, f'{mgz.name} has been deactiveate successfully.')
        #############
        # Sending male to the publisher
        publisher_id = mgz.users_id
        record_data = {'publisher_id':publisher_id, 'magazine_name':mgz.name,'status':"Deactivated"}
        MagazineStatusEmailTread(record_data).start()
        #############
        print("Email Delivered!!! <-----------------")
        return redirect('/user/dashboard/magazineinfo/')
    else:
        return redirect('/user/dashboard/magazineinfo/')

#Aprove Magazines Only For Admin
@login_required
def aprove_magazine_view(request, id):
    if request.user.roles_id == 1:
        mgz = MagazineInfo.objects.get(id=id)
        mgz.is_aproved = True
        mgz.save()
        messages.success(request, f'{mgz.name} has been aproved successfully.')
        #############
        # Sending male to the publisher
        publisher_id = mgz.users_id
        record_data = {'publisher_id':publisher_id, 'magazine_name':mgz.name,'status':"Approved"}
        MagazineApprovedEmailTread(record_data).start()
        #############
        print("Email Delivered!!! <-----------------")
        return redirect('/user/dashboard/magazineinfo/')

    else:
        return redirect('/user/dashboard/magazineinfo/')

#Disaprove Magazines Only For Admin
@login_required
def disaprove_magazine_view(request, id):
    if request.user.roles_id == 1:
        mgz = MagazineInfo.objects.get(id=id)
        mgz.is_aproved = False
        mgz.save()
        messages.success(request, f'{mgz.name} has been disaproved successfully.')
        #############
        # Sending male to the publisher
        publisher_id = mgz.users_id
        record_data = {'publisher_id':publisher_id, 'magazine_name':mgz.name,'status':"Disapproved"}
        MagazineApprovedEmailTread(record_data).start()
        #############
        print("Email Delivered!!! <-----------------")
        return redirect('/user/dashboard/magazineinfo/')
    else:
        return redirect('/user/dashboard/magazineinfo/')


# Upload Files
@login_required
def UploadPDF(request, id):
    print("INSIDE/////////////////////////",id)
    if request.method == 'POST':
        mag_pages = request.FILES.get('pages')
        if mag_pages:
            filename = mag_pages.name
            if filename.endswith('.pdf'):
                # PDF Page Counter ############################
                readpdf = PyPDF2.PdfFileReader(mag_pages)
                totalpages = readpdf.numPages
                ###############################################
                mag = MegazinePages.objects.filter(magazine_id=id).last()
                print(mag,"<<<<<<<<<<>>>>>>>>>>>>>>>>>")
                if mag:
                    mag.pages = request.FILES.get('pages')
                    mag.page_number = totalpages
                    mag.save()
                    print("Done<<<<<<<<<<<<<")
                    messages.success(request,'File Updated succesfully.')
                    return redirect('/user/dashboard/magazineinfo/')
                else:
                    magazine = MegazinePages()
                    magazine.magazine_id = id
                    magazine.users_id = request.user.id
                    magazine.pages = request.FILES.get('pages')
                    magazine.page_number = totalpages
                    magazine.save()
                    messages.success(request,'File uploaded succesfully.')
                    return redirect('/user/dashboard/magazineinfo/')
            else:
                messages.error(request,'File not supported! Only PDF files are allowed.')
                return redirect('/user/dashboard/magazineinfo/')
        else:
            messages.error(request,'Please Provide a PDF file.')
            return redirect('/user/dashboard/magazineinfo/')

    return redirect('/user/dashboard/magazineinfo/')

@login_required
def magazine_pages_view(request):
    search=request.GET.get('search', '')
    id=request.user.roles_id
    user_id = request.user.id
    if id in [1,2]:
        if search:
            magazine_pages = MegazinePages.objects.filter(Q(magazine_id__name__icontains=search))
            if not magazine_pages:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            magazine_pages = MegazinePages.objects.all().order_by('-create_on')
    elif id==3:
        if search:
            magazine_pages = MegazinePages.objects.filter(Q(magazine_id__name__icontains=search),Q(users_id = user_id))
            if not magazine_pages:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            magazine_pages = MegazinePages.objects.filter(Q(users_id = user_id)).all().order_by('-create_on')        
    else:
        if search:
            magazine_pages = MegazinePages.objects.filter(Q(magazine_id__name__icontains=search),Q(users_id = user_id))
            if not magazine_pages:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            magazine_pages = MegazinePages.objects.filter(Q(users_id = user_id)).all().order_by('-create_on')        

    paginator = Paginator(magazine_pages, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'Magazine Pages','magazine_pages':page_obj,'search':search}
    return render(request, 'web/magazine_pages/index.html', context)


@login_required
def add_magazine_pages_view(request):
    form = AddMegazinePagesForm()
    if request.method == 'POST':
        form = AddMegazinePagesForm(request.POST,request.FILES)
        file = request.FILES.get('pages')
        print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<pppp")
        if file:
            filename = file.name
            if filename.endswith('.pdf'):
                # PDF Page Counter ############################
                readpdf = PyPDF2.PdfFileReader(file)
                totalpages = readpdf.numPages
                ###############################################
                print("Supported")
                if form.is_valid():
                    mgn_pages = form.save()
                    MegazinePages.objects.filter(id=mgn_pages.id).update(page_number=totalpages)
                    MegazinePages.objects.filter(id=mgn_pages.id).update(users_id=request.user.id)
                    messages.success(request, 'Data has been saved successfully.')
                    return redirect('/user/dashboard/magazinepages/')
                else:
                    messages.error(request, 'Please enter valid data.')
                    form = AddMegazinePagesForm(request.POST,request.FILES)
                    print('<<<<<<<<<<<<<<<<<<',form.errors)
            else:
                messages.error(request, 'File not supported only pdf file is allowed.')
                form = AddMegazinePagesForm(request.POST,request.FILES)
        else:
            messages.error(request, 'Please Choose a file.')
            form = AddMegazinePagesForm(request.POST,request.FILES)


        
    context = {'forms':form}
    return render(request, 'web/magazine_pages/add.html', context)  

@login_required
def edit_magazine_pages_view(request,id):
    print("id -----------------> ",id)
    magazine_pages = MegazinePages.objects.filter(id=id).last()
    forms = AddMegazinePagesForm(request.POST or None, request.FILES or None, instance=magazine_pages)
    if request.method == 'POST':
        form = AddMegazinePagesForm(request.POST,request.FILES)
        file = request.FILES.get('pages')
        print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<pppp")
        if file:
            filename = file.name
            if filename.endswith('.pdf'):
                # PDF Page Counter ############################
                readpdf = PyPDF2.PdfFileReader(file)
                totalpages = readpdf.numPages
                ###############################################
                if form.is_valid():
                    mgn_pages = form.save()
                    MegazinePages.objects.filter(id=mgn_pages.id).update(page_number=totalpages)
                    messages.success(request, 'Data has been updated successfully.')
                    return redirect('/user/dashboard/magazinepages/')
                else:
                    messages.error(request, 'Please enter valid data.')
                    form = AddMegazinePagesForm(request.POST,request.FILES)
                    print('<<<<<<<<<<<<<<<<<<',form.errors)
            else:
                messages.error(request, 'File not supported only pdf file is allowed.')
                form = AddMegazinePagesForm(request.POST,request.FILES)
        else:
            messages.error(request, 'Please Choose a file.')
            form = AddMegazinePagesForm(request.POST,request.FILES)
    context = {'title': 'Edit Megazine Pages','forms':forms}
    return render(request, 'web/magazine_pages/edit.html', context)



@login_required
def delete_magazine_pages_view(request,id):
    magazine_pages = MegazinePages.objects.get(id=id)
    magazine_pages.delete()
    print("Deleted<------")
    messages.success(request, 'Data has been deleted successfully.')
    return redirect('/user/dashboard/magazinepages/')

@login_required
def languages_view(request):
    search = request.GET.get('search', '')
    id=request.user.roles_id
    user_id = request.user.id
    if id in [1,2]:
        if search:
            languages = Language.objects.filter(Q(language__icontains=search),id=1)
            if not languages:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            # languages = Language.objects.all().order_by('-create_on')
            languages = Language.objects.filter(id=1)

    else:
        # languages = Language.objects.filter(id=1).last()
        languages = Language.objects.filter(id=1)

    paginator = Paginator(languages, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'title': 'Languages','languages':page_obj,'search':search}
    return render(request, 'web/languages/index.html', context)

@login_required
def add_languages_view(request):
    forms = AddLanguageForm()
    if request.method == 'POST':
        language=request.POST['language']
        language=Language.objects.filter(language=language).exists()
        if language:
            print(language)
            messages.error(request, 'Language already exists.')
            forms = AddLanguageForm(request.POST,request.FILES)
            print(' data  not found') 
        else:
            forms = AddLanguageForm(request.POST or None)
            if forms.is_valid():
                forms.save()
                messages.success(request, 'Data has been saved successfully.')
                return redirect('/user/dashboard/languages/')
            else:
                messages.error(request, 'Language already exists.')
                forms = AddLanguageForm(request.POST)     
    context = {'title': 'Languages','forms':forms}
    return render(request, 'web/languages/add.html', context)

@login_required
def edit_languages_view(request,id):
    language = Language.objects.filter(id=id).last()
    forms = AddLanguageForm(request.POST or None, instance=language)
    if request.method == 'POST':
        language=request.POST['language']
        language=Language.objects.filter(language=language).last()
        if language:
            if language.id == id:
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been updated successfully.')
                    return redirect('/user/dashboard/languages/')
                else:
                    messages.error(request, 'Language already exists.')
                    forms = AddLanguageForm(request.POST)
            else:
                print(language.id,"<<<<<<<<<<<<<<<")
                # breakpoint()
                print(language)
                messages.error(request, 'Language already exists.')
                forms = AddLanguageForm(request.POST,request.FILES)
                print(' data  not found') 
        else:
            if forms.is_valid():
                forms.save()
                messages.success(request, 'Data has been updated successfully.')
                return redirect('/user/dashboard/languages/')
            else:
                messages.error(request, 'Language already exists.')
                forms = AddLanguageForm(request.POST)
    context = {'title': 'Edit Megazine Pages','forms':forms,}
    return render(request, 'web/languages/edit.html', context)

@login_required
def delete_languages_view(request, id):
    language = Language.objects.get(id=id)
    language.delete()
    print("Deleted<------")
    messages.success(request, 'Data has been deleted successfully.')
    return redirect('/user/dashboard/languages/')

@login_required
def user_profile(request):
    id = request.user.id
    user_data = User.objects.filter(id=id).last()
    cc=user_data.country_code
    form=ProfileForm(request.POST or None, request.FILES or None,instance=user_data)
    if request.method=='POST':
        first_name=request.POST['first_name']
        last_name=request.POST['last_name']
        phone_number=request.POST['phone_number']
        city=request.POST['city']
        state=request.POST['state']
        cc=request.POST['country_code']
        print(cc)
        if all(x.isalpha() or x.isspace()  for x in first_name) and all(y.isalpha() or y.isspace() for y in last_name):
            if all(z.isalpha() or z.isspace()  for z in state):
                if all(w.isalpha() or w.isspace()  for w in city):
                    numberexists=User.objects.filter(phone_number=phone_number,phone_varification=True).exists()
                    number1=User.objects.filter(phone_number=phone_number).exists()
                    if form.is_valid():
                        if numberexists:
                            user_data.first_name=first_name
                            user_data.last_name=last_name
                            user_data.country_code=cc
                            user_data.save()
                            messages.error(request,'This number is already registered with us.')
                            return redirect('/user/profile/')
                        elif number1 is not True :
                        
                            user_data.phone_varification=False
                            if user_data.phone_varification==False:
                                otp = get_random_string(4, allowed_chars='0123456789')
                                user_data.otp=otp
                                send_mobile_otp_to_user(phone_number,otp)
                                user_data.first_name=first_name
                                user_data.last_name=last_name
                                user_data.country_code=cc
                                user_data.save()
                                return redirect(f'/user/profile/verification/{request.user.id}')
                        elif user_data.phone_varification==False:
                    
                            otp = get_random_string(4, allowed_chars='0123456789')
                            user_data.otp=otp
                            send_mobile_otp_to_user(phone_number,otp)
                            user_data.first_name=first_name
                            user_data.last_name=last_name
                            user_data.country_code=cc
                            user_data.save()
                            return redirect(f'/user/profile/verification/{request.user.id}')
                        else:
                            messages.success(request,'Data has been updated successfully.')
                            return redirect('/user/profile/')
                    else:
                        messages.error(request,'Address format is wrong.')
                        return redirect('/user/profile/')   
                else:
                    messages.error(request,'City name must be character.')
            else:
                messages.error(request,'State name must be character.') 
        else:
            messages.error(request,'Firstname and Lastname must be character.')
            return redirect('/user/profile/')    
    return render(request, 'web/user_profile/index.html',{'forms':form,'country_code':cc,'user_data':user_data,'title':'Profile',})    

@login_required    
def Verify_mobile_number(request,id):
    forms=VerifyMobileForm()
    users = User.objects.filter(id=id).last()
    mob_otp=users.otp
    if request.method == 'POST':
        user_otp=request.POST['mobile_otp']
        if user_otp == mob_otp:             
            # users.username=users.email
            users.phone_varification=True
            users.save()
            messages.success(request,"Data has been updated successfully.")
            return redirect('/user/profile/')  
        else:
            messages.error(request, "Otp is wrong!")
            return redirect(f'/user/profile/verification/{id}')
    context={'forms':forms}
    return render(request,'web/user_profile/update.html',context)    
# Add Subscription View
# @login_required
# def add_subscription_view(request):
#     forms = AddSubscriptionForm()
#     if request.method == 'POST':
#         forms = AddSubscriptionForm(request.POST or None)
#         if forms.is_valid():
#             print(forms.errors,"<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>")
#             print('M<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
#             forms.save()
#             messages.success(request, 'Data has been saved successfully.')
#             return redirect('user/dashboard/subscription/')
#         else:
#             print("aaaaaaaaaaaaa")
#             messages.error(request, 'Please enter valid data.')
#             forms = AddSubscriptionForm(request.POST)   
#     context = {'title': 'Add Subscriptions','forms':forms}
#     return render(request, 'web/subscription/add.html', context)

# Subscription Listing 
# @login_required
# def subscription_view(request):
#     search = request.GET.get('search', '')
    
#     if search:
#         print(type(search), '.......................')
#         subscription = SubscriptionType.objects.filter(Q(subscription_type__icontains=search)|Q(country__name__icontains=search))  
#         if not subscription:
#             messages.error(request, "No Data Found!")
#         else:
#             messages.success(request, "Data Found Successfully!")
#     else:
#         subscription = SubscriptionType.objects.all().order_by("-created_on")
#     paginator = Paginator(subscription, 10) 
#     page_number = request.GET.get('page')
#     page_obj = paginator.get_page(page_number)
#     context = {
#         'title':'Subscriptions',
#         'subscriptions':page_obj,
#         'search':search
#         }
#     return render(request, 'web/subscription/index.html', context)

# Edit Subscription View
@login_required
def edit_subscription_view(request,id):
    print("id -----------------> ",id)
    subscriptions = SubscriptionType.objects.filter(id=id).last()
    forms = AddSubscriptionForm(request.POST or None, instance=subscriptions)
    if request.method == 'POST' and forms.is_valid():
        forms.save()
        messages.success(request, 'Data has been updated successfully.')
        return redirect('/user/dashboard/subscription/')
    context = {'title': 'Edit Subscription','forms':forms}
    return render(request, 'web/subscription/edit.html', context)

# Delete Subscription View
def delete_subscription_view(request,id):
    # subscriptions = SubscriptionType.objects.get(id=id)
    # subscriptions.delete()
    # print("Deleted<------")
    # messages.success(request, 'Data has been deleted successfully.')
    # return redirect('/user/dashboard/subscription/')
    pass

# For Deactivate Subscription
@login_required
def deactivate_subscription(request, id):
    subscription = SubscriptionType.objects.get(id=id)
    subscription.subscription_status = False
    subscription.save()
    return redirect('/user/dashboard/subscription/')

# For Activate Subscription
@login_required
def activate_subscription(request, id):
    subscription = SubscriptionType.objects.get(id=id)
    subscription.subscription_status = True
    subscription.save()
    return redirect('/user/dashboard/subscription/')


# Offer Listing 
@login_required
def offers_view(request):
    search = request.GET.get('search', '')
    
    if search:
        print(type(search), '.......................')
        offers = MagazineOfferinfo.objects.filter(Q(users_id__email__icontains=search) | Q(code__icontains=search) )  
        if not offers:
            messages.error(request, "No Data Found!") 
        else:
            messages.success(request, "Data Found Successfully!")
    else:
        offers = MagazineOfferinfo.objects.all().order_by("-created_on")
    paginator = Paginator(offers, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {
        'title':'Subscriptions',
        'offers':page_obj,
        'search':search,
        }
    return render(request, 'web/offers/index.html', context)

# @login_required
# def ShowUsers(request, id):
#     search = request.GET.get('search', '')
    
#     if search:
#         print(type(search), '.......................')
#         offers = MagazineOfferinfo.objects.filter(Q(users_id__email__icontains=search) | Q(code__icontains=search) )  
#         if not offers:
#             messages.error(request, "No Data Found!") 
#         else:
#             messages.success(request, "Data Found Successfully!")
#     else:
#         offers = MagazineOfferinfo.objects.all().order_by("-created_on")
#     paginator = Paginator(offers, 10) 
#     page_number = request.GET.get('page')
#     page_obj = paginator.get_page(page_number)
#     users = UserMapOffer.objects.filter(magazineoffer__id=id).all()
#     context = {
#         'title':'Subscriptions',
#         'offers':page_obj,
#         'search':search,
#         'users':users
#         }
#     return render(request, 'web/offers/index.html', context)


# Add Offers View
@login_required
def add_offers_view(request):
    forms = AddOffersForm()
    user_form = AssignUsersToOffersForm()
    if request.method == 'POST':
        forms = AddOffersForm(request.POST)
        user_form = AssignUsersToOffersForm(request.POST)
        user_list = user_form['users'].data
        for_users = forms['for_users'].data
        code = request.POST['code']
        check_code = MagazineOfferinfo.objects.filter(code=code).exists()
        if check_code:
            messages.error(request, f"{code} is already exist.")
        else:
            # if all(x.isalpha() or x.isspace()  for x in first_name) 
            if for_users == 'Perticular':
                if len(user_list) == 0:
                    messages.info(request, "Please Choose atleast on user.")
                else:
                    if forms.is_valid():
                        offers = forms.save()
                        for row in user_list:
                            users = UserMapOffer()
                            users.user_id = row
                            users.magazineoffer_id = offers.id
                            users.save()
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/offers/')
                    else:
                        messages.error(request, 'End date must be after start date')
                        forms = AddOffersForm(request.POST)
            else:
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been saved successfully.')
                    return redirect('/user/dashboard/offers/')
                else:
                    messages.error(request, 'End date can not be from past.')
                    forms = AddOffersForm(request.POST)



        
    context = {'title': 'Add Offers','forms':forms,'user_form':user_form}
    return render(request, 'web/offers/add.html', context)

# Edit Subscription View
@login_required
def edit_offers_view(request,id):
    print("id -----------------> ",id)
    subscriptions = MagazineOfferinfo.objects.filter(id=id).last()
    forms = AddOffersForm(request.POST or None, instance=subscriptions)
    if request.method == 'POST':
        code = request.POST['code']
        check_code = MagazineOfferinfo.objects.filter(code=code).exists()
        print(check_code,"<---------------------------- Code Existance.")
        if check_code:
            messages.error(request, f"{code} is already exist.")
        # else:
        if forms.is_valid():
            forms.save()
            messages.success(request, 'Data has been updated successfully.')
            return redirect('/user/dashboard/offers/')
        else:
                messages.error(request, "Data is not been saved.")
    context = {'title': 'Edit Offers','forms':forms}
    return render(request, 'web/offers/edit.html', context)


# Deactivate Offers
@login_required
def deactivate_offers(request,id):
    offers = MagazineOfferinfo.objects.get(id=id)
    offers.offer_status = False
    offers.save()
    print("Deactivated<------")
    messages.success(request, f'Offer {offers.code} has been deactivated successfully.')
    return redirect('/user/dashboard/offers/')

# Activate Offers
@login_required
def activate_offers(request,id):
    offers = MagazineOfferinfo.objects.get(id=id)
    offers.offer_status = True
    offers.save()
    print("Activated<------")
    messages.success(request, f'Offer {offers.code} has been activated successfully.')
    return redirect('/user/dashboard/offers/')

# Delete Offers View
@login_required
def delete_offers_view(request, id):
    offers = MagazineOfferinfo.objects.get(id=id)
    offers.delete()
    print("Deleted<------")
    messages.success(request, 'Data has been deleted successfully.')
    return redirect('/user/dashboard/offers/')

# Sells View
@login_required
def sells_view(request):
    search = request.GET.get('search', '')
    user_id = request.user.id
    ## Role Data Show for Admin and Subadmin
    print( request.user.id, " <======================")
    if request.user.roles_id in [1,2]:
        if search:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            ########################### Admin Earning magazine amt.
            purchase_info=MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__last_name__icontains=search)|Q(magazineInfos__name__icontains=search)|Q(magazineInfos__buy_price__icontains=search)|Q(magazineInfos__rent_price__icontains=search))).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                for row in purchase_info:
                    admin_earning_amt+=row['ammount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0

            purchase_info=MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__last_name__icontains=search)|Q(magazineInfos__name__icontains=search)|Q(magazineInfos__buy_price__icontains=search)|Q(magazineInfos__rent_price__icontains=search))).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            if not purchase_info:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            ########################### Admin Earning magazine amt.
            purchase_info = MagazinePurchaseInfo.objects.all().order_by('-create_on')
            purchase_info = MagazinePurchaseInfoSumAmountSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                for row in purchase_info:
                    admin_earning_amt+=row['ammount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            ###############################
            purchase_info = MagazinePurchaseInfo.objects.all().order_by('-create_on')
            purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data

    ## Pulisher
    elif request.user.roles_id == 3:
        if search:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            ########################### Admin Earning magazine amt.
            purchase_info=MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__last_name__icontains=search)|Q(magazineInfos__name__icontains=search)|Q(magazineInfos__buy_price__icontains=search)|Q(magazineInfos__rent_price__icontains=search)), Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id)).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                for row in purchase_info:
                    admin_earning_amt+=row['ammount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            #####################################
            # purchase_info=MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__last_name__icontains=search)|Q(magazineInfos__name__icontains=search)|Q(magazineInfos__buy_price__icontains=search)|Q(magazineInfos__rent_price__icontains=search)), magazineInfos__users_id=user_id).order_by('-create_on')
            # purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True,context={'request':request})
            # purchase_info = purchase_info.data
            if not purchase_info:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            ########################### Admin Earning magazine amt.
            purchase_info = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id)).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoSumAmountSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                for row in purchase_info:
                    admin_earning_amt+=row['ammount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            #####################################
            
            # For Top Selling Magazine
            purchase_info = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id)).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True, context={'request':request})
            purchase_info = purchase_info.data
    
    ## Subpublisher
    elif request.user.roles_id == 4:
        if search:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            ########################### Admin Earning magazine amt.
            purchase_info=MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__last_name__icontains=search)|Q(magazineInfos__name__icontains=search)|Q(magazineInfos__buy_price__icontains=search)|Q(magazineInfos__rent_price__icontains=search)),magazineInfos__users_id=user_id).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                for row in purchase_info:
                    admin_earning_amt+=row['ammount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            # purchase_info=MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__last_name__icontains=search)|Q(magazineInfos__name__icontains=search)|Q(magazineInfos__buy_price__icontains=search)|Q(magazineInfos__rent_price__icontains=search)), magazineInfos__users_id=user_id).order_by('-create_on')
            # purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True,context={'request':request})
            # purchase_info = purchase_info.data
            if not purchase_info:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")
        else:           
            ########################### Admin Earning magazine amt.
            purchase_info = MagazinePurchaseInfo.objects.filter(magazineInfos__users_id=user_id).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoSumAmountSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                for row in purchase_info:
                    admin_earning_amt+=row['ammount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            #####################################
            purchase_info = MagazinePurchaseInfo.objects.filter(magazineInfos__users_id=request.user.id).order_by('-create_on')
            purchase_info = MagazinePurchaseInfoListSerializer(purchase_info, many=True, context={'request':request})
            purchase_info = purchase_info.data

    paginator = Paginator(purchase_info, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)        
    context = {'title': 'Sells','purchase_infos':page_obj, 'search':search, 'total_ammount':admin_earning_amt}
    return render(request, 'web/sell/index.html',context)

from django.db.models import Count
@login_required
def report_view(request):
    search = request.GET.get('search', '')
    roles_id = request.user.roles_id
    user_id = request.user.id
    print(roles_id, user_id,"][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[][")
    labels = []
    data = []
    magazine_labels = []
    magazine_data = []
    category_label = []
    category_data = []
    if roles_id in [1,2]:
        if search:
            print(search,"<================")
            queryset = MagazinePurchaseInfo.objects.filter(magazineInfos__name=search).all()
            id_list = []
            dataset = queryset.values_list('magazineInfos').annotate(truck_count=Count('magazineInfos')).order_by('-truck_count') 
            for row in dataset:
                id_list.append(row[0])
            MagazineSellDetails = MagazineInfo.objects.filter(id__in=id_list).all()
            MagazineSellDetails = MagazineSellDetailsSerializer(MagazineSellDetails, many=True)
            
            if not MagazineSellDetails:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")

            # For Top Sell Magazines 
            magazine_queryset = MagazinePurchaseInfo.objects.all()  
            magazine_dataset = get_MostSellMagazines(magazine_queryset)

            # For Top Selling Categories
            category_queryset = MagazinePurchaseInfo.objects.all()
            category_dataset = TopMegazineCategories(category_queryset)

            # User Count
            user_queryset = User.objects.all()
            user_data = get_UserCount(user_queryset)
            labels = user_data['labels']
            data = user_data['data']

        
        else:
            # For Top Sell Magazines 
            magazine_queryset = MagazinePurchaseInfo.objects.all()  
            magazine_dataset = get_MostSellMagazines(magazine_queryset)

            # For Top Selling Categories
            category_queryset = MagazinePurchaseInfo.objects.all()
            category_dataset = TopMegazineCategories(category_queryset)

            # For Magazine Sell Details
            id_list = []
            dataset = MagazinePurchaseInfo.objects.values_list('magazineInfos').annotate(truck_count=Count('magazineInfos')).order_by('-truck_count') 
            for row in dataset:
                id_list.append(row[0])
            MagazineSellDetails = MagazineInfo.objects.filter(id__in=id_list).all()
            MagazineSellDetails = MagazineSellDetailsSerializer(MagazineSellDetails, many=True)

        
            # User Count
            user_queryset = User.objects.all()
            user_data = get_UserCount(user_queryset)
            labels = user_data['labels']
            data = user_data['data']

    elif roles_id == 3:
        if search:
            print(search,"<================")
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)

            queryset = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__name=search), (Q(magazineInfos__users_id__in=subpliserappend) | Q(magazineInfos__users_id=user_id))).all()
            # For Magazine Sell Details
            id_list = []
            dataset = queryset.values_list('magazineInfos').annotate(truck_count=Count('magazineInfos')).order_by('-truck_count') 
            for row in dataset:
                id_list.append(row[0])

            MagazineSellDetails = MagazineInfo.objects.filter(id__in=id_list).all()
            MagazineSellDetails = MagazineSellDetailsSerializer(MagazineSellDetails, many=True)

            if not MagazineSellDetails:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")

            # For Top Selling Magazine
            magazine_queryset = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id))
            print(magazine_queryset,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
            magazine_dataset = get_MostSellMagazines(magazine_queryset)

            # For Top Selling Magazine Categories
            category_queryset = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id))
            category_dataset = TopMegazineCategories(category_queryset)

        else:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            # For Top Selling Magazine
            magazine_queryset = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id))
            print(magazine_queryset,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
            magazine_dataset = get_MostSellMagazines(magazine_queryset)

            # For Top Selling Magazine Categories
            category_queryset = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id))
            category_dataset = TopMegazineCategories(category_queryset)

            # For Magazine Sell Details
            id_list = []
            dataset = magazine_queryset.values_list('magazineInfos').annotate(truck_count=Count('magazineInfos')).order_by('-truck_count') 
            for row in dataset:
                id_list.append(row[0])

            MagazineSellDetails = MagazineInfo.objects.filter(id__in=id_list).all()
            MagazineSellDetails = MagazineSellDetailsSerializer(MagazineSellDetails, many=True)

    elif roles_id==4:
        # subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
        # subpliserappend = []
        # if subpubliserlist:
        #     for subpuliserrow in subpubliserlist:
        #         subpliserappend.append(subpuliserrow.users_id)
        
        # For Top Selling Magazines
        if search:
            queryset = MagazinePurchaseInfo.objects.filter(magazineInfos__name=search, magazineInfos__users_id=user_id).all()
            # For Magazine Sell Details
            id_list = []
            dataset = queryset.values_list('magazineInfos').annotate(truck_count=Count('magazineInfos')).order_by('-truck_count') 
            for row in dataset:
                id_list.append(row[0])

            MagazineSellDetails = MagazineInfo.objects.filter(id__in=id_list).all()
            MagazineSellDetails = MagazineSellDetailsSerializer(MagazineSellDetails, many=True)

            if not queryset:
                messages.error(request, "No Data Found!")
            else:
                messages.success(request, "Data Found Successfully!")

            magazine_queryset = MagazinePurchaseInfo.objects.filter(magazineInfos__users_id=user_id)
            magazine_dataset = get_MostSellMagazines(magazine_queryset)

            # For Top Selling Magazine Categories
            category_queryset = MagazinePurchaseInfo.objects.filter(magazineInfos__users_id=user_id)
            category_dataset = TopMegazineCategories(category_queryset)


        else:
            magazine_queryset = MagazinePurchaseInfo.objects.filter(magazineInfos__users_id=user_id)
            magazine_dataset = get_MostSellMagazines(magazine_queryset)

            # For Top Selling Magazine Categories
            category_queryset = MagazinePurchaseInfo.objects.filter(magazineInfos__users_id=user_id)
            category_dataset = TopMegazineCategories(category_queryset)

            # For Magazine Sell Details
            id_list = []
            dataset = magazine_queryset.values_list('magazineInfos').annotate(truck_count=Count('magazineInfos')).order_by('-truck_count') 
            for row in dataset:
                id_list.append(row[0])

            MagazineSellDetails = MagazineInfo.objects.filter(id__in=id_list).all()
            MagazineSellDetails = MagazineSellDetailsSerializer(MagazineSellDetails, many=True)

    paginator = Paginator(MagazineSellDetails.data, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {
        'title':'Reports',
        'labels':labels,
        'data':data,
        'magazine_label':magazine_dataset['labels'],
        'magazine_data':magazine_dataset['data'],
        'category_label':category_dataset['labels'],
        'category_data':category_dataset['data'],
        'MagazineSellDetails':page_obj,
        }
    return render(request, 'web/reports/index.html', context)


##### Country Section
@login_required
def country_view(request):
    search = request.GET.get('search', '')
    if search:
        countrys = Country.objects.filter(Q(name__icontains=search))  
        if not countrys:
            messages.error(request, "No Country Found!") 
        else:
            messages.success(request, "CountryFtebular Found Successfully!")
    else:
        countrys=Country.objects.all()
    paginator = Paginator(countrys, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {
        'title':'Country',
        'countrys':page_obj,
        'search':search,
        }
    return render(request,'web/country/index.html',context)    

@login_required
def add_country_view(request):
    forms=CountryForm()
    if request.method=='POST':
        country_name=request.POST['name']
        country=Country.objects.filter(name=country_name).exists()
        if country:
            messages.error(request, 'Country already exists.')
            forms = CountryForm(request.POST)
        else:
            if all(x.isalpha() or x.isspace()  for x in country_name):
                forms=CountryForm(request.POST or None)
                if forms.is_valid():
                    forms.save()
                    messages.success(request,'Data has been saved successfully')
                    return redirect('/user/dashboard/country_view/')
            else:
                messages.error(request, 'Country name must be character.')
    context = {'forms':forms}    
    return render(request,'web/country/add.html',context)

@login_required
def delete_country(request,id):
    country=Country.objects.get(id=id)
    country.delete()
    messages.success(request, 'Data has been deleted successfully.')
    return redirect(f'/user/dashboard/country_view/')
 
@login_required
def edit_country_view(request,id):
    print(id,'---------------------------')
    country=Country.objects.filter(id=id).last()
    forms=CommissionForm(request.POST or None,instance=country)
    subscription_form = SubscriptionTypeForm(request.POST or None,instance=country)
    stu=SubscriptionType.objects.filter(country_id=country).all().order_by('-created_on')
    if request.method=='POST':
        country_name=request.POST['name']
        if all(x.isalpha() or x.isspace()  for x in country_name):
            if forms.is_valid():
                forms.save()
                messages.success(request,'Data has been updated successfully')
                return redirect('/user/dashboard/country_view/')
        else:
            messages.error(request, 'Country name must be character.')    
    context={'forms':forms,'subscription_form':subscription_form,'Country':country,'countryid':id,'stu':stu}    
    return render(request,'web/country/edit.html',context)

@login_required
def subscription_sub_via_country(request):
    country=Country.objects.filter(id=request.POST['countryid']).last()
    print(country.id,'==========================')
    forms=SubscriptionTypeForm()
    if request.method=='POST':
        type=request.POST['type']
        subs=SubscriptionType.objects.filter(country_id=country,type=type).exists()
        if subs:
            if type!="Buy":
                messages.error(request, 'Only one time rent is applicable')
                return redirect(f'/user/dashboard/edit_country_view/{country.id}')
            else:
                forms=SubscriptionTypeForm(request.POST or None)
                if forms.is_valid():
                    st = forms.save()
                    SubscriptionType.objects.filter(id=st.id).update(country_id=country.id)
                    messages.success(request,'Data has been saved successfully')
                    return redirect(f'/user/dashboard/edit_country_view/{request.POST["countryid"]}')  
                else:
                    messages.error(request, 'already exists.') 
                    return redirect(f'/user/dashboard/edit_country_view/{request.POST["countryid"]}')   
        else:
            forms=SubscriptionTypeForm(request.POST or None)
            if forms.is_valid():
                st = forms.save()
                SubscriptionType.objects.filter(id=st.id).update(country_id=country.id)
                messages.success(request,'Data has been saved successfully')
                return redirect(f'/user/dashboard/edit_country_view/{request.POST["countryid"]}')
            else:
                messages.error(request, 'already exists.')
                return redirect(f'/user/dashboard/edit_country_view/{request.POST["countryid"]}')   
    context = {'forms':forms}         
    return render(request,'web/country/edit.html',context)
    
@login_required
def delete_country_view(request, id):
    subs=SubscriptionType.objects.get(id=id)
    country = subs.country.id
    subs.delete()
    messages.success(request, 'Data has been deleted successfully.')
    return redirect(f'/user/dashboard/edit_country_view/{country}')

@login_required
def edit_subscriptiontype_view(request,id):
    Subscription=SubscriptionType.objects.filter(id=id).last()
    country = Subscription.country.id
    count=Subscription.country.name
    print(count,'country name..........................................')
    forms=SubscriptionTypeForm(request.POST or None ,instance=Subscription)
    if request.method=="POST":
        type=request.POST['type']
        subs=SubscriptionType.objects.filter(country_id=country,type='Rent').last()
        subs1=SubscriptionType.objects.filter(country_id=country,type=type).last()
        if subs:
            print(subs.id,'++++++++++++++++++++++++++++subs+++++++++++++++==')
            if subs.id==id:
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been updated successfully.')
                    return redirect(f'/user/dashboard/edit_country_view/{country}')  
                else:
                    messages.error(request, 'Enter valid data.')
                    return redirect(f'/user/dashboard/edit_subscriptiontype_view/{id}')
            elif subs1.id==id:
                if forms.is_valid():
                    forms.save()
                    messages.success(request, 'Data has been updated successfully.')
                    return redirect(f'/user/dashboard/edit_country_view/{country}')  
                else:
                    messages.error(request, 'Enter valid data.')
                    return redirect(f'/user/dashboard/edit_subscriptiontype_view/{id}')         
            else:
                messages.error(request, 'Only one time rent is applicable')
                return redirect(f'/user/dashboard/edit_subscriptiontype_view/{id}')    
        else:
            if forms.is_valid():
                forms.save()
                messages.success(request, 'Data has been updated successfully.')
                return redirect(f'/user/dashboard/edit_country_view/{country}')
            else:
                messages.error(request, 'Enter valid data.')
                return redirect(f'/user/dashboard/edit_subscriptiontype_view/{id}')
               
    context = {'forms':forms,"countryid":country,}
    return render(request,'web/country/edit_subscription.html',context)


# Subscription Listing 
@login_required
def subscription_view(request):
    search = request.GET.get('search', '')
    country_form=CountrySubscriptionForm()
    
    if search:
        print(type(search), '.......................')
        subscription = SubscriptionType.objects.filter(Q(subscription_type__icontains=search)|Q(country__name__icontains=search))  
        if not subscription:
            messages.error(request, "No Data Found!")
        else:
            messages.success(request, "Data Found Successfully!")
    else:
        subscription = SubscriptionType.objects.all().order_by("-created_on")
    paginator = Paginator(subscription, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {
        'title':'Subscriptions',
        'subscriptions':page_obj,
        'search':search,
        'country_form':country_form,
        }
    return render(request, 'web/subscription/index.html', context)        

@login_required
def add_other_country(request,id):
    subs = SubscriptionType.objects.filter(id=id).last()
    print(subs.per_month_price,'______________++++++++++++++++++________________')
    print(subs.price,'______________++++++++++++++++++________________')
    
    type = subs.subscription_type
    country_form=CountrySubscriptionForm()
    if request.method == 'POST':
        countries = request.POST.getlist('name')
        data = Country.objects.filter(name__in=countries).all()  #for all selected country
        subs_country=SubscriptionType.objects.filter(subscription_type=subs.subscription_type).all()
        contry_list = []
        for country in subs_country:
            contry_list.append(country.country_id) #for all subscription country
        count=0    
        for row in data:
            if int(row.id) in contry_list:
                continue
            else:
                subscrtion = SubscriptionType()
                subscrtion.subscription_type = subs.subscription_type
                subscrtion.days = subs.days
                subscrtion.price = subs.price
                subscrtion.description = subs.description
                subscrtion.type = subs.type
                subscrtion.per_month_price= subs.per_month_price
                subscrtion.discount = subs.discount
                subscrtion.country_id = row.id
                subscrtion.save()
                count = 1
        if count == 1:
            messages.success(request, 'Data has been saved successfully.')
            return redirect('/user/dashboard/subscription/')
        else:
            messages.info(request, 'Country already exist on this subscription.')
            return redirect('/user/dashboard/subscription/')  
    context = {'title': 'Subscription','country_form':country_form}
    return render(request,'web/subscription/index.html',context) 
     
@login_required
def add_subscription_view(request):
    country_list=[]
    forms=SubscriptionTypeForm()
    country_form=CountrySubscriptionForm()
    subscription = SubscriptionType.objects.all().order_by("-created_on")
    if request.method == "POST":
        subs_price=request.POST['price']
        # print(subs_price,'price<<<<<<<<<<<<<<<>...........................')
        subs_days=request.POST['days']
        # print(subs_days,'days>>>>>>>>>>>>>>>>>>>..........................')
        subs_discount=request.POST['discount']
        # print(subs_discount,'discount>>>>>>>>>>>>>>>>>>>..........................')
        subs_disc_per=(float(subs_price)*float(subs_discount))/100
        # print(subs_disc_per,'disc per month price...............................')
        subs_disc_per_month=float(subs_price)-float(subs_disc_per)
        # print(subs_disc_per_month,'after discount................')
        subs_per_month=float(subs_disc_per_month)/int(subs_days)
        # print(subs_per_month,'per mpnth............................')
        forms = SubscriptionTypeForm(request.POST, request.FILES)
        country_fo= CountrySubscriptionForm(request.POST)
        if forms.is_valid():
            country_list = country_fo['name'].data
            data = Country.objects.filter(name__in=country_list).all()
            c_list = []
            for row in data:
                c_list.append(row.id)
            subs_name=request.POST['subscription_type']    
            subs_country=SubscriptionType.objects.filter(subscription_type=subs_name).all()
            contry_list = []
            for country in subs_country:
              contry_list.append(country.country_id)    
            # name = SubscriptionType.objects.filter(country_id__in=c_list).all()
            # print(name,"<<<<<")
            # breakpoint()
            count = 0
            if all(x.isalpha() or x.isspace()  for x in subs_name):
                for row in data:
                    if int(row.id) in contry_list:
                    # if1 =  SubscriptionType.objects.filter(subscription_type__in=name,country_id=i.id).exists()
                    # if if1:
                        continue
                    else:
                        subscrtion = SubscriptionType()
                        subscrtion.subscription_type = request.POST['subscription_type']
                        subscrtion.days = request.POST['days']
                        subscrtion.price = request.POST['price']
                        subscrtion.description = request.POST['description']
                        # subscrtion.type = request.POST['type']
                        subscrtion.per_month_price= subs_per_month
                        subscrtion.discount=request.POST['discount']
                        subscrtion.country_id = row.id
                        subscrtion.save()
                        count = 1
                if count == 1:
                    messages.success(request, 'Data has been saved successfully.')
                    return redirect('/user/dashboard/subscription/')
                else:
                    messages.info(request, 'Country already exist on this subscription.')
                    return redirect('/user/dashboard/addsubscription/')
            else:
                messages.error(request, 'Subscription name must be character.')
                # return redirect('/user/dashboard/subscription/')
        else:
            messages.error(request, 'Data not valid')         
    context = {'title': 'Subscription','subscription_form':forms,'forms':forms,'country':country_form,'subs':subscription}
    return render(request, 'web/subscription/add.html', context)  

@login_required
def edit_subscription_commission_view(request,id):
    subscription=SubscriptionType.objects.filter(id=id).last()
    print(subscription,'------------------')
    forms=SubscriptionCommisionForm(request.POST or None,instance=subscription)
    if request.method=="POST":
        subs_price=request.POST['price']
        # print(subs_price,'price<<<<<<<<<<<<<<<>...........................')
        subs_days=request.POST['days']
        subs_discount=request.POST['discount']
        # print(subs_discount,'discount>>>>>>>>>>>>>>>>>>>..........................')
        subs_disc_per=(float(subs_price)*float(subs_discount))/100
        # print(subs_disc_per,'disc per month price...............................')
        subs_disc_per_month=float(subs_price)-float(subs_disc_per)
        # print(subs_disc_per_month,'after discount................')
        subs_per_month=float(subs_disc_per_month)/int(subs_days)
        if forms.is_valid():
            subscription.per_month_price= subs_per_month
            forms.save()
            print(request.POST['cntry'])
            subscription.country.id = request.POST['cntry']
            subscription.save()
            print(request.POST['cntry'],"<<<<<<<<<<<<<<<<<<<<<<<<<<")
            messages.success(request,'Data has been updates successfully')
            return redirect('/user/dashboard/subscription/')
        else:
            messages.error(request,'Data not valid')
            return redirect(f'/user/dashboard/editsubscriptioncommission/{id}')
    context={'forms':forms,'subscription_form':forms,'subscription':subscription} 
    return render(request,'web/subscription/edit.html',context)

# def error_404(request,exception):
#     return render(request, '404.html')

# Report Tebular View
@login_required
def report_tebular_view(request):
    user_id = request.user.id
    search = request.GET.get('search', '')
    requests = []
    withdrawal_form = WithdrawalForm()
    if request.method == 'POST':
        withdrawal_form = WithdrawalForm(request.POST)
        if withdrawal_form.is_valid():
            form_id = withdrawal_form.save()
            WithdrawalDetails.objects.filter(id=form_id.id).update(user_id=request.user.id)
            WithdrawalDetails.objects.filter(id=form_id.id).update(role_id=request.user.roles_id)

        else:
            withdrawal_form = WithdrawalForm(request.POST)
            messages.error(request, "Something went wrong.")
            print(withdrawal_form.errors,"<<<<<<<<Errors")

    if request.user.roles_id in [1,2]:
        # date_one = request.GET.get('date_one')
        # date_two = request.GET.get('date_two')
        # print(date_one)
        # print(date_two)
        if search:
            # purchase_info = MagazineInfo.objects.filter(Q(create_on__gte=date_one) & Q(create_on__lte=date_two)).order_by('-create_on')
            purchase_info_group = MagazineInfo.objects.filter(Q(name__icontains=search) | Q(users__first_name__icontains=search)).order_by('-create_on')
            purchase_info_group = MagazineGroupwiseReportSerializer(purchase_info_group, many=True,context={'request':request})
            purchase_info_group = purchase_info_group.data
            if purchase_info_group:
                messages.success(request,'Data found successfully.')
            else:
                messages.error(request,'No Data found.')
            
            purchase_info_list = []
            for row in purchase_info_group:
                if row['magazine']:
                    print(row,"<<<<<<<<<<<<<<<<<,")
                    purchase_info_list.append(row)

            admin_earning_amt = 0
            if purchase_info_group:
                for row in purchase_info_group:
                    if row['admin_amount'] is None:
                        continue
                    admin_earning_amt+=row['admin_amount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            
            pending_requests = WithdrawalDetails.objects.filter(is_aproved=False).count()
            withdrawal_amount = 0
            wallet_amount = 0
                            
        else:
            purchase_info_group = MagazineInfo.objects.all().order_by('-create_on')
            purchase_info_group = MagazineGroupwiseReportSerializer(purchase_info_group, many=True,context={'request':request})
            purchase_info_group = purchase_info_group.data

            purchase_info_list = []
            for row in purchase_info_group:
                if row['magazine']:
                    print(row,"<<<<<<<<<<<<<<<<<,")
                    purchase_info_list.append(row)
            
            admin_earning_amt = 0
            if purchase_info_group:
                for row in purchase_info_group:
                    if row['admin_amount'] is None:
                        continue
                    admin_earning_amt+=row['admin_amount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            
            withdrawal_amount = 0 #sum(withdrawal_amount.values_list('withdrawal_amount', flat=True))
            wallet_amount = 0
            print(withdrawal_amount)
            pending_requests = WithdrawalDetails.objects.filter(is_aproved="").count()
            

    elif request.user.roles_id == 3:
        # date_one = request.GET.get('date_one')
        # date_two = request.GET.get('date_two')
        # print(date_one)
        # print(date_two)
        # if date_one and date_two:
        if search:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            ########################### Admin Earning magazine amt.
            purchase_info_group = MagazineInfo.objects.filter(Q(name__icontains=search)| Q(users__first_name__icontains=search),Q(users_id__in=subpliserappend)| Q(users_id=user_id)).order_by('-create_on')
            purchase_info_group = MagazineGroupwiseReportSerializer(purchase_info_group, many=True,context={'request':request})
            purchase_info_group = purchase_info_group.data
            
            if purchase_info_group:
                messages.success(request,'Data found successfully.')
            else:
                messages.error(request,'No Data found.')

            purchase_info_list = []
            for row in purchase_info_group:
                if row['magazine']:
                    print(row,"<<<<<<<<<<<<<<<<<,")
                    purchase_info_list.append(row)


            admin_earning_amt = 0
            if purchase_info_group:
                for row in purchase_info_group:
                    if row['admin_amount'] is None:
                        continue
                    admin_earning_amt+=row['admin_amount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            

            withdrawal_amount = WithdrawalDetails.objects.filter(Q(user_id=request.user.id) & Q(is_aproved=True)).all()#.annotate(Sum('withdrawal_amount'))
            print(withdrawal_amount)
            withdrawal_amount = sum(withdrawal_amount.values_list('withdrawal_amount', flat=True))
            wallet_amount = admin_earning_amt - withdrawal_amount
            print(withdrawal_amount)
            pending_requests = 0
        
        else:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=user_id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            
            ########################### Admin Earning magazine amt.
            # purchase_info = MagazinePurchaseInfo.objects.filter(Q(magazineInfos__users_id__in=subpliserappend)| Q(magazineInfos__users_id=user_id)).order_by('-create_on')
            purchase_info_group = MagazineInfo.objects.filter(Q(users_id__in=subpliserappend)| Q(users_id=user_id)).order_by('-create_on')
            purchase_info_group = MagazineGroupwiseReportSerializer(purchase_info_group, many=True,context={'request':request})
            purchase_info_group = purchase_info_group.data
            
            purchase_info_list = []
            for row in purchase_info_group:
                if row['magazine']:
                    print(row,"<<<<<<<<<<<<<<<<<,")
                    purchase_info_list.append(row)

            # print(purchase_info_list)

            admin_earning_amt = 0
            if purchase_info_group:
                for row in purchase_info_group:
                    if row['publisher_amount'] is None:
                        continue
                    admin_earning_amt+=row['publisher_amount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0

            withdrawal_amount = WithdrawalDetails.objects.filter(Q(user_id=request.user.id) & Q(is_aproved=True)).all()#.annotate(Sum('withdrawal_amount'))
            withdrawal_amount = sum(withdrawal_amount.values_list('withdrawal_amount', flat=True))
            withdrawal_amount = round(withdrawal_amount)
            wallet_amount = admin_earning_amt - withdrawal_amount
            wallet_amount = round(wallet_amount)
            print(withdrawal_amount)
            pending_requests = 0


    elif request.user.roles_id == 4:
        # date_one = request.GET.get('date_one')
        # date_two = request.GET.get('date_two')
        # print(date_one)
        # print(date_two)
        # if date_one and date_two:
        if search:
            purchase_info_group = MagazineInfo.objects.filter(Q(name__icontains=search), users_id=user_id).order_by('-create_on')
            purchase_info_group = MagazineGroupwiseReportSerializer(purchase_info_group, many=True,context={'request':request})
            purchase_info_group = purchase_info_group.data
            
            if purchase_info_group:
                messages.success(request,'Data found successfully.')
            else:
                messages.error(request,'No Data found.')

            purchase_info_list = []
            for row in purchase_info_group:
                if row['magazine']:
                    print(row,"<<<<<<<<<<<<<<<<<,")
                    purchase_info_list.append(row)

            admin_earning_amt = 0
            if purchase_info_group:
                for row in purchase_info_group:
                    if row['publisher_amount'] is None:
                        continue
                    admin_earning_amt+=row['publisher_amount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            
            withdrawal_amount = 0
            wallet_amount = 0
            pending_requests = 0
        else:
            purchase_info_group = MagazineInfo.objects.filter(users_id=user_id).order_by('-create_on')
            purchase_info_group = MagazineGroupwiseReportSerializer(purchase_info_group, many=True,context={'request':request})
            purchase_info_group = purchase_info_group.data
            purchase_info_list = []
            
            purchase_info_list = []
            for row in purchase_info_group:
                if row['magazine']:
                    print(row,"<<<<<<<<<<<<<<<<<,")
                    purchase_info_list.append(row)

            admin_earning_amt = 0
            if purchase_info_group:
                for row in purchase_info_group:
                    if row['publisher_amount'] is None:
                        continue
                    admin_earning_amt+=row['publisher_amount']
                    admin_earning_amt = round(admin_earning_amt,2)
            else:
                admin_earning_amt = 0
            
            withdrawal_amount = 0
            wallet_amount = 0
            pending_requests = 0

            # Form to save requested withdrawal amount              
    
    
    paginator = Paginator(purchase_info_list, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {'purchase_info_groups':page_obj,'admin_earning_amt':admin_earning_amt,
    'withdrawal_form':withdrawal_form,'search':search,
    'withdrawal_amount':withdrawal_amount,'wallet_amount':wallet_amount,
    'requests':requests,'pending_requests':pending_requests,}
    return render(request,'web/reports-new/demo.html',context)


@login_required
def per_magazine_report_list(request, id):
    search =  request.GET.get('search','')
    date_first = request.GET.get('date_one')
    date_second = request.GET.get('date_two')
    mag = MagazineInfo.objects.filter(id=id).last()
    if request.user.roles_id in [1,2]:
        if search:
            purchase_info = MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__name__icontains=search)),magazineInfos=id).all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            if purchase_info:
                messages.success(request,f"Data Found Successfuly between.")
            else:
                messages.error(request,f"No Data Found.")

            admin_earning_amt = 0
        elif date_first and date_second:
            purchase_info = MagazinePurchaseInfo.objects.filter(create_on__gte=date_first,create_on__lte=date_second,magazineInfos=id).all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                messages.success(request,f"Data Found Successfuly between {date_first} to {date_second}.")
            else:
                messages.error(request,f"No records Found.")
        else:
            mag = MagazineInfo.objects.filter(id=id).last()
            print(mag,"<<<<<<<<<<<<<<<<<<<<<<")
            date_today = datetime.date.today() + datetime.timedelta(+1)
            date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
            print(date_today,"<----------------->", date_30_day_before)
            purchase_info = MagazinePurchaseInfo.objects.filter(create_on__gte=date_30_day_before,create_on__lte=date_today,magazineInfos=id).all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
        # if purchase_info:
        #     for row in purchase_info:
        #         admin_earning_amt+=row['ammount']
        #         admin_earning_amt = round(admin_earning_amt,2)
        # else:
        #     admin_earning_amt = 0

    elif request.user.roles_id in [3,4]:
        if search:
            purchase_info = MagazinePurchaseInfo.objects.filter((Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__users__first_name__icontains=search)|Q(magazineInfos__name__icontains=search)),magazineInfos=id).all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                messages.success(request,f"Data Found Successfuly between.")
            else:
                messages.error(request,f"No Data Found.")
                
        elif date_first and date_second:
            purchase_info = MagazinePurchaseInfo.objects.filter(create_on__gte=date_first,create_on__lte=date_second,magazineInfos=id).all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if purchase_info:
                messages.success(request,f"Data Found Successfuly between {date_first} to {date_second}.")
            else:
                messages.error(request,f"No records Found.")
        else:
            mag = MagazineInfo.objects.filter(id=id).last()
            print(mag,"<<<<<<<<<<<<<<<<<<<<<<")
            date_today = datetime.date.today() + datetime.timedelta(+1)
            date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
            print(date_today,"<----------------->", date_30_day_before)
            purchase_info = MagazinePurchaseInfo.objects.filter(create_on__gte=date_30_day_before,create_on__lte=date_today,magazineInfos=id).all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            # if purchase_info:
            #     for row in purchase_info:
            #         admin_earning_amt+=row['ammount']
            #         admin_earning_amt = round(admin_earning_amt,2)
            # else:
            #     admin_earning_amt = 0

        
    magazine = mag.name

    paginator = Paginator(purchase_info, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {
        'purchase_infos':page_obj,
        'admin_earning_amt':admin_earning_amt,
        'magazine':magazine,
        'search':search,
    }
    return render(request,'web/reports-new/per_magazine_sell_list.html',context)


@login_required
def withdrawal_request(request):
    search = request.GET.get('search', '')
    date_first = request.GET.get('date_one', '')
    date_second = request.GET.get('date_two', '')

    if request.user.roles_id in [1,2]:
        date_today = datetime.date.today() + datetime.timedelta(+1)
        date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
        print(date_first,"<----------------->", date_second)    
        # withdrawlist = WithdrawalDetails.objects.all().order_by('-created_on')
        if request.method == 'POST':
            status = request.POST['status']
            admin_image =request.FILES.get('admin_image')
            comment = request.POST['comment']
            id = request.POST['request_id']
            
            print(status, admin_image, comment, id)
            request_data = WithdrawalDetails.objects.filter(id=id).last()
            request_data.admin_image = admin_image
            request_data.comment = comment
            request_data.is_aproved = status
            request_data.save()
            requested_email = request_data.user.email
            name = request_data.user.first_name + " " + request_data.user.last_name
            amount = request_data.withdrawal_amount
            if status == '1':
                status = 'Approved'
            elif status == '0':
                status = 'Disapproved'
            print(status)

            record_data = {'requested_email':requested_email, 'name':name,'amount':amount,'status':status,}
            print('record_data')
            WithdrawRequestStatusEmailTread(record_data).start()
            messages.success(request, f"You just {status} {request_data.name}'s withdrawal request.")
            return redirect('/user/dashboard/report/withdrawalrequests/')
            # withdrawlist = WithdrawalDetails.objects.filter(created_on__gte=date_30_day_before,created_on__lte=date_today).order_by('-created_on')
            # print(request_data,"?????????????????????")
            # breakpoint()
        elif search:
            withdrawlist = WithdrawalDetails.objects.filter((Q(name__icontains=search))).order_by('-created_on')
        elif date_first and date_second:
            withdrawlist = WithdrawalDetails.objects.filter(created_on__gte=date_first,created_on__lte=date_second).order_by('-created_on')
        else:
            withdrawlist = WithdrawalDetails.objects.filter(created_on__gte=date_30_day_before,created_on__lte=date_today).order_by('-created_on')

    elif request.user.roles_id == 3:
        date_today = datetime.date.today()
        date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
        print(date_first,"<----------------->", date_second)
        if search:
            withdrawlist = WithdrawalDetails.objects.filter((Q(name__icontains=search)),user_id=request.user.id).order_by('-created_on')
        elif date_first and date_second:
            withdrawlist = WithdrawalDetails.objects.filter(created_on__gte=date_first,created_on__lte=date_second,user_id=request.user.id).order_by('-created_on')
        else:
            date_today = datetime.date.today()
            date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
            print(date_first,"<----------------->", date_second)
            withdrawlist = WithdrawalDetails.objects.filter(created_on__gte=date_30_day_before,created_on__lte=date_today,user_id=request.user.id).order_by('-created_on')
    
    paginator = Paginator(withdrawlist, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {'withdrawlists':page_obj,'search':search,'date_today':'02/02/1998','date_30_day_before':date_30_day_before,}
    return render(request,'web/reports-new/withdrwal_request.html',context)

@login_required
def approve_withdrawal_request(request,id):
    request_to_apporve = WithdrawalDetails.objects.filter(id=id).last()
    request_to_apporve.is_aproved = True
    # request_to_apporve.save()
    # Email Data  ##################################
    requested_email = request_to_apporve.user.email
    name = request_to_apporve.user.first_name + " " + request_to_apporve.user.last_name
    amount = request_to_apporve.withdrawal_amount
    status = 'Approved'
    record_data = {'requested_email':requested_email, 'name':name,'amount':amount,'status':status,}
    print('record_data')
    WithdrawRequestStatusEmailTread(record_data).start()
    # ###########  ##################################
    messages.success(request, f'Request approved successfully.')
    return redirect('/user/dashboard/report/withdrawalrequests/')

@login_required
def disapprove_withdrawal_request(request,id):
    request_to_apporve = WithdrawalDetails.objects.filter(id=id).last()
    request_to_apporve.is_aproved = False
    request_to_apporve.save()
    # Email Data  ##################################
    requested_email = request_to_apporve.user.email
    name = request_to_apporve.user.first_name + " " + request_to_apporve.user.last_name
    amount = request_to_apporve.withdrawal_amount
    status = 'Disapproved'
    record_data = {'requested_email':requested_email, 'name':name,'amount':amount,'status':status,}
    print('record_data')
    WithdrawRequestStatusEmailTread(record_data).start()
    # ###########  ##################################
    messages.success(request, f'Request approved successfully.')
    return redirect('/user/dashboard/report/withdrawalrequests/')

from django.http import HttpResponse
import csv

from django.core.exceptions import PermissionDenied

@login_required
def download_csv(request, queryset):
    model = queryset.model
    model_fields = model._meta.fields + model._meta.many_to_many
    field_names = [field.name for field in model_fields]

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="export.csv"'

    # the csv writer
    writer = csv.writer(response, delimiter=";")
    # Write a first row with header information
    writer.writerow(field_names)
    # Write data rows
    for row in queryset:
        values = []
        for field in field_names:
            value = getattr(row, field)
            if callable(value):
                try:
                    value = value() or ''
                except:
                    value = 'Error retrieving value'
            if value is None:
                value = ''
            values.append(value)
        writer.writerow(values)
    return response

@login_required
def export_csv(request):
    # Create the HttpResponse object with the appropriate CSV header.
    data = download_csv(request, MagazinePurchaseInfo.objects.all())
    response = HttpResponse(data, content_type='text/csv')
    return response

# Delivery View
@login_required
def Delivery_View(request):
    search = request.GET.get('search', '')
    date_first = request.GET.get('date_one')
    date_second = request.GET.get('date_two')

    if request.user.roles_id in [1,2]:
        if search:
            delivery_data = MagazinePurchaseInfo.objects.filter((Q(users__email__icontains=search)|Q(magazineInfos__name__icontains=search)|Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(delivery_location__icontains=search)),is_hard_copy=True).all().order_by('-create_on')
            print(delivery_data,"<<<<<<<<<<<<<<<<<<<")
            if delivery_data:
                messages.success(request, 'Data found successfully.')
            else:
                messages.error(request, 'No Data found.')

        elif date_first and date_second:
            delivery_data = MagazinePurchaseInfo.objects.filter(create_on__gte=date_first,create_on__lte=date_second,is_hard_copy=True).all().order_by('-create_on')
            if delivery_data:
                messages.success(request, 'Data found successfully.')
            else:
                messages.error(request, 'No Data found.')
        else:
            delivery_data = MagazinePurchaseInfo.objects.filter(is_hard_copy=True).all().order_by('-create_on')
            print(delivery_data,"<<<<<<<<<<<<<<<<<<<")
            # breakpoint()
    elif request.user.roles_id == 3:
        if search:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=request.user.id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)

            delivery_data = MagazinePurchaseInfo.objects.filter((Q(magazineInfos__name__icontains=search)|Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(delivery_location__icontains=search)),(Q(magazineInfos__users_id = request.user.id)|Q(magazineInfos__users_id__in=subpliserappend)),is_hard_copy=True).all().order_by('-create_on')
            print(delivery_data,"<<<<<<<<<<<<<<<<<<<")
            if delivery_data:
                messages.success(request, 'Data found successfully.')
            else:
                messages.error(request, 'No Data found.')
        
        elif date_first and date_second:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=request.user.id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
                    
            delivery_data = MagazinePurchaseInfo.objects.filter((Q(magazineInfos__users_id = request.user.id)|Q(magazineInfos__users_id__in=subpliserappend)),create_on__gte=date_first,create_on__lte=date_second,is_hard_copy=True).all().order_by('-create_on')
    
            if delivery_data:
                messages.success(request, 'Data found successfully.')
            else:
                messages.error(request, 'No Data found.')

        else:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=request.user.id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
                    
            delivery_data = MagazinePurchaseInfo.objects.filter((Q(magazineInfos__users_id = request.user.id)|Q(magazineInfos__users_id__in=subpliserappend)),is_hard_copy=True).all().order_by('-create_on')
    
    elif request.user.roles_id == 4:
        if search:                   
            delivery_data = MagazinePurchaseInfo.objects.filter((Q(magazineInfos__name__icontains=search)|Q(users__first_name__icontains=search)|Q(users__last_name__icontains=search)|Q(delivery_location__icontains=search)),(Q(magazineInfos__users_id = request.user.id)),is_hard_copy=True).all().order_by('-create_on')
            print(delivery_data,"<<<<<<<<<<<<<<<<<<<")
            if delivery_data:
                messages.success(request, 'Data found successfully.')
            else:
                messages.error(request, 'No Data found.')
        elif date_first and date_second:
            delivery_data = MagazinePurchaseInfo.objects.filter(create_on__gte=date_first,create_on__lte=date_second,is_hard_copy=True,magazineInfos__users_id = request.user.id).all()
            if delivery_data:
                messages.success(request, 'Data found successfully.')
            else:
                messages.error(request, 'No Data found.')

        else:
            delivery_data = MagazinePurchaseInfo.objects.filter(is_hard_copy=True,magazineInfos__users_id = request.user.id).all()
    paginator = Paginator(delivery_data, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {'delivery_data':page_obj,'search':search,}
    return render(request,'web/delivery/index.html',context)

@login_required
def Approve_Delivery(request, id):
    delivery_request = MagazinePurchaseInfo.objects.filter(is_hard_copy=True,id=id).last()
    delivery_request.is_delivered = True
    delivery_request.save()
    # Email Thread #############################
    requested_email  = delivery_request.users.email
    name = delivery_request.users.first_name + " " + delivery_request.users.last_name
    record_data = {'requested_email':requested_email, 'name':name,}
    print('record_data')
    DeliveryRequestStatusEmailTread(record_data).start()
    # #############################################
    return redirect('/user/dashboard/delivery/')

def error_404(request,exception):
    return render(request, 'web/404.html', status=404)