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
from base.models import Notification, Role
from django.utils.timezone import now

from django.template import RequestContext
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 RentForCountry,Country, SubPublisherUser, Subscription, SubscriptionType, UserRent
from magazine.utils import send_mobile_otp_to_user
from magazineapp.models import Author, Blogs, BlogsImages, MagMapAuthor, MagazineCommissionInfo, MagazineImage, MagazineOfferinfo, MagazineOrderinfo, MagazinePurchaseInfo, SystemCategory, MagazineCategory, MagazineInfo, MegazinePages, Language, UserMapOffer, WithdrawalDetails
from django.db.models import Q
from web.decorators import unauthenticated_user
from web.forms import BlogImageForm, BlogsForm, RentForm,RentForCountryForm, 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 BlogImageURLSerializer, GetAuhtorSerializer, GetCountrySerializer, MagazineGroupwiseReportSerializer, MagazinePurchaseInfoListSerializer, MagazinePurchaseInfoSumAmountSerializer, MagazineSellDetailsSerializer, ReportListSerializer, WithdrawalDetailsSerializer
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
from datetime import date
from web.message import *
from django.views.decorators.csrf import csrf_exempt

# @unauthenticated_user
@csrf_exempt
def user_login(request):
    if request.user.is_authenticated:
        return redirect(settings.LOGIN_REDIRECT_URL)
        
    forms = UserLoginForm()
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        # if request.user.is_authenticated:
        #     return redirect(settings.LOGIN_REDIRECT_URL)
        if form.is_valid():
            print('dffffffffffffffffffffffff')
            print("request post",request.POST) 
            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')
                print(password, 'password')
                user = authenticate(username=username, password=password)
                print(user,"User+=================")
                if user:
                    validate_user = User.objects.filter(Q(roles_id__in=[3,4]),username=username).last()
                    print(validate_user,"validate_user+++++++++++++++++")
                    if validate_user: 
                        print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
                        login(request, user)
                        print(settings.LOGIN_REDIRECT_URL)
                        return redirect(settings.LOGIN_REDIRECT_URL)
                    else:
                        print(form.errors)
                        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:
                print("hello i am starting here")
                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_id=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, "An Email with a link to reset your password has been sent, please check your Inbox.")
        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 = SubscriptionType.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)
    # return render(request, 'web/dashboard/admin.html')

@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', '')
    page = request.GET.get('page', '')
    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_fetched)
        else:
            messages.success(request, data_fetched)
    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,'page':page,}
    return render(request, 'web/sub_admin/index.html', context)

@login_required
def add_sub_admin_view(request):
    print("YoYO")
    page = request.GET.get('page', '')
    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,'page':page}
    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/')
        return redirect(request.META.get('HTTP_REFERER'))   
    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(f"/user/dashboard/subadmin/?page={request.GET.get('page')}")

@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(f'/user/dashboard/subadmin/?page={request.GET.get("page")}')




@login_required    
def publisher_view(request):
    search=request.GET.get('search', '')
    page = request.GET.get('page', '')
    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_fetched)
        else:
            messages.success(request, data_fetched)
    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,'page':page,}
    return render(request,'web/publisher/index.html',context)  

@login_required    
def add_publisher_view(request):
    forms=UserRegisterForm()
    page = request.GET.get('page', '')
    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,
    'page':page,}
    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(f"/user/dashboard/publisher/?page={request.GET.get('page')}")   

@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(f"/user/dashboard/publisher/?page={request.GET.get('page')}")  


#### Add New SubPubliser.
@login_required    
def add_sub_publisher_view(request):
    page = request.GET.get('page', '')
    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 successfullyly.')
                        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,
    'page':page,}
    return render(request, 'web/sub_publisher/add.html', context)
### Close Subpubliser.
@login_required    
def sub_publisher_view(request):
    search=request.GET.get('search','')
    page = request.GET.get('page', '')
    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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
                else:
                    messages.success(request, data_fetched)
            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,'page':page,}
    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(f"/user/dashboard/subpublisher/?page={request.GET.get('page')}")  

@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(f"/user/dashboard/subpublisher/?page={request.GET.get('page')}") 

      

@login_required
def author_view(request):
    search = request.GET.get('search', '')
    page = request.GET.get('page', '')
    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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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,
    'page':page,}
    return render(request, 'web/author/index.html', context)

# Add Author.
@login_required
def add_author_view(request):
    # print(request.user.first_name)
    page = request.GET.get('page', '')
    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 successfullyly.')
                    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,'page':page,}
    return render(request, 'web/author/add.html', context)


@login_required
def edit_author_view(request,id):
    page = request.GET.get('page', '')
    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/')
                    if page:
                        return redirect(f"/user/dashboard/author/?page={request.GET.get('page')}")
                    else:
                        return redirect(f"/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,'page':page,}
    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', '')
    page = request.GET.get('page', '')
    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_fetched)
                print("-------------------is here")
            else:
                messages.success(request, data_fetched)
                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,'page':page,}
    return render(request, 'web/system_category/index.html', context)


@login_required
def add_system_category_view(request):
    forms = AddSystemCategoryForm()
    page = request.GET.get('page', '')
    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 successfullyly.')
                    return redirect('/user/dashboard/systemcategory/')
                else:
                    messages.error(request, 'Category already exists.')
                    forms = AddSystemCategoryForm(request.POST,request.FILES)
            else:
                messages.error(request, 'Category name must be character.')
                forms = AddSystemCategoryForm(request.POST,request.FILES)        
    context = {'title': 'Add System Category','forms':forms,'page':page,}
    return render(request, 'web/system_category/add.html', context)

@login_required
def edit_system_category_view(request,id):
    page = request.GET.get('page', '')
    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.')
                        if page:
                            return redirect(f'/user/dashboard/systemcategory/?page={page}')
                        else:
                            return redirect('/user/dashboard/systemcategory/')
                        # return redirect(request.META.get('HTTP_REFERER'))
                    else:
                        messages.error(request, 'Category already exists.')
                        forms = AddSystemCategoryForm(request.POST,request.FILES)
                else:
                    messages.error(request, 'Category name 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:
                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.')
                        if page:
                            return redirect(f'/user/dashboard/systemcategory/?page={page}')
                        else:
                            return redirect('/user/dashboard/systemcategory/')
                        # return redirect('/user/dashboard/systemcategory/')
                        # return redirect(request.META.get('HTTP_REFERER'))
                    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,'page':page,}
    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', '')
    page = request.GET.get('page', '')
    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_fetched)
            else:
                messages.success(request, data_fetched)
        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,'page':page,}
    return render(request, 'web/magazine_category/index.html', context)

@login_required
def add_magazine_category_view(request):
    forms = AddMagazineCategoryForm()
    page = request.GET.get('page', '')
    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 successfullyly.')
                    return redirect('/user/dashboard/magazinecategory/')
                else:
                    messages.error(request, 'Color in hexcode.')
                    forms = AddMagazineCategoryForm(request.POST,request.FILES)  
            else:
                messages.error(request, 'Category name must be character.')
                forms = AddMagazineCategoryForm(request.POST,request.FILES)              
    context = {'title': 'Add Magazine Category','forms':forms,'page':page,}
    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()
    page = request.GET.get('page', '')
    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.')
                        if page:
                            return redirect(f'/user/dashboard/magazinecategory/?page={page}')
                        else:
                            return redirect('/user/dashboard/magazinecategory/')
                        # return redirect(request.META.get('HTTP_REFERER'))
                    else:
                        messages.error(request, 'Data is not valid.')
                        forms = AddMagazineCategoryForm(request.POST,request.FILES, instance=magazine_category)
                else:
                    messages.error(request, 'Category name 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:
                if category_name:
                    if all(x.isalpha() or x.isspace()  for x in category_name):
                        forms.save()
                        messages.success(request, 'Data has been updated successfully.')
                        if page:
                            return redirect(f'/user/dashboard/magazinecategory/?page={page}')
                        else:
                            return redirect('/user/dashboard/magazinecategory/')
                        # return redirect('/user/dashboard/magazinecategory/')
                        # return redirect(request.META.get('HTTP_REFERER'))
                    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,'page':page,}
    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):
    page = request.GET.get('page', '')
    print('page>>>>>>>', page)
    search = request.GET.get('search', '')
    url = request.get_full_path()
    # print(url,'++++++++++++++++')
    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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        else:
            magazine_pages = MegazinePages.objects.all()
            magazine_infos =  MagazineInfo.objects.filter(Q(users_id = user_id)).all().order_by('-create_on')
    
    author_list = MagMapAuthor.objects.all().exclude(author=None)
    image_list = MagazineImage.objects.all()
    pdf_list = MegazinePages.objects.all()
    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,
    'author_list':author_list,'image_list':image_list,'pdf_list':pdf_list,'page':page}
    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()
    page = request.GET.get('page', '')
    
    if request.method == 'POST':  
        mag_pages = request.FILES.get('pages')
        
        lang = request.POST.get('language')
        lang =  int(lang)
        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')
        cover_pic = request.FILES.get('cover_pic')
        desktop_cover_pic = request.FILES.get('desktop_cover_pic')
        related_issue_cover_images = request.FILES.getlist('related_issues_covers')
        forms = AddMagazineInfoForm(request.POST, request.FILES)
        
        author_forms = MagazineAuthorForm(request.POST)
        pages_forms = AddMegazinePagesForm(request.POST, request.FILES)
        filename = cover_pic.name
        if (filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png')) :
            if forms.is_valid() and author_forms.is_valid:
                buy=request.POST.get('buy_price')
                if buy:
                    buy = float(buy)
                year_available=request.POST['year_available']
                year_available = int(year_available)
                comment=request.POST['comment']
                author_list = author_forms['author'].data
                if not buy:
                    messages.error(request, 'Please provide buy price.')
                elif buy:
                    if mag_pages:
                        filename = mag_pages.name
                        if filename.endswith('.pdf'):
                            readpdf = PyPDF2.PdfFileReader(mag_pages)
                            totalpages = readpdf.numPages
                            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(language=int(lang))

                            Notification.objects.create(
                                message=f"Hi {request.user.get_full_name()}, your magazine '{mgn.title}' has been added successfully.",
                                user_id=request.user.id,
                                read=False,
                                created_on=now(),
                                updated_on=now()
                            )

                            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()
                            
                            for row in related_issue_cover_images:
                                covers = MagazineImage()
                                covers.image = row
                                covers.magazine_id = mgn.id
                                covers.save()
                                print('Save!')
                            author_list = author_forms['author'].data
                            if author_list:
                                for row in author_list:
                                    authors = MagMapAuthor()
                                    authors.author_id = row
                                    authors.magazine_id = mgn.id
                                    authors.save()
                            else:
                                authors = MagMapAuthor()
                                authors.magazine_id = mgn.id
                                authors.save()
                            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)
                        MagazineInfo.objects.filter(id=mgn.id).update(language=int(lang))

                        admin_user = User.objects.filter(roles_id=1).first()
                        if admin_user:
                            Notification.objects.create(
                                message=f"📚 New magazine '{mgn.name}' submitted by {request.user.get_full_name()}",
                                user=admin_user,
                                read=False,
                                created_on=now(),
                                updated_on=now()
                            )


                        for row in related_issue_cover_images:
                            covers = MagazineImage()
                            covers.image = row
                            covers.magazine_id = mgn.id
                            covers.save()
                            print('Save!')
                        author_list = author_forms['author'].data
                        if author_list:
                            for row in author_list:
                                authors = MagMapAuthor()
                                authors.author_id = row
                                authors.magazine_id = mgn.id
                                authors.save()
                        else:
                            authors = MagMapAuthor()
                            authors.magazine_id = mgn.id
                            authors.save()
                        
                        messages.success(request, 'Data has been saved successfully.')
                        return redirect('/user/dashboard/magazineinfo/')
                else:
                    messages.error(request, 'Please provide buy price.')
            else:
                messages.error(request, 'Please enter valid data.')
                print(forms.errors,"ppppppppppppppppppppppppppp")
        else:
            messages.error(request, 'File not supported, only jpg, jpeg, png files are allowed!')
                        
    context = {'title': 'Magazine Info','forms':forms, 'author_forms':author_forms,
    'pages_forms':pages_forms,'page':request.GET.get('page'),}
    return render(request, 'web/magazine_info/add.html', context)



@login_required
def edit_magazine_info_view(request,id):
    magazine_info = MagazineInfo.objects.filter(id=id).last()
    year_available = magazine_info.years_available
    images= request.FILES.getlist('related_issues_covers')
    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()
    related_issues_cover = MagazineImage.objects.filter(magazine_id=id).all()
    pages_of_mag = MegazinePages.objects.filter(magazine_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
    image_list = MagazineImage.objects.filter(magazine_id=id).all()
    if request.method == 'POST' and forms.is_valid():
        lang = request.POST.get('language')
        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(language=int(lang))
        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:
            filename = a.name
            if filename.endswith('.pdf'):
                # 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:
                        print("=================")
                        ass = MegazinePages.objects.get(magazine_id=id)
                        ass.pages = a
                        ass.save()
                        # .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}/')

            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")
        images= request.FILES.getlist('related_issues_covers')
        print(images,'-----------------------images list')
        for row in images:
            photo= MagazineImage()    
            photo.image= row
            photo.magazine_id =id
            photo.save()
            print('photo....save')
        messages.success(request, 'Data has been updated successfully.')

        if request.GET.get('page') is None:
            return redirect(f"/user/dashboard/magazineinfo/?page={request.GET.get('page')}")
        else:
            return redirect(f"/user/dashboard/magazineinfo/?page={request.GET.get('page')}")
        
        # return redirect('/user/dashboard/magazineinfo/')
    elif not forms.is_valid:
        print(forms.errors,"===========")
        messages.error(request, 'Data is not valid.')

    print(forms.errors)
    context = {'title': 'Edit Megazine Info','forms':forms,'author_list':author_list,'related_issues_cover':images,
               'pages_forms':pages_forms,'mag_pages':magazine_info,'image_list':image_list,'pages_of_mag':pages_of_mag,
               'page':request.GET.get('page'),}
    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
        
        Notification.objects.create(
            message=f"Hi, your magazine '{magazine_info.name}' has been approved {extra}.",
            user_id=publisher_id,
            read=False,
            created_on=now(),
            updated_on=now()
        )

        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
        Notification.objects.create(
            message=f"Hi, your magazine '{magazine_info.name}' has been approved {extra}.",
            user_id=publisher_id,
            read=False,
            created_on=now(),
            updated_on=now()
        )

        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:  # Only admin allowed
        mgz = MagazineInfo.objects.get(id=id)
        mgz.is_active = True
        mgz.save()

        messages.success(request, f'{mgz.name} has been activated successfully.')

        # ✅ Send notification to the publisher
        if mgz.users_id:
            try:
                Notification.objects.create(
                    message=f"✅ Your magazine '{mgz.name}' has been approved by admin and is now live.",
                    user_id=mgz.users_id,
                    read=False,
                    created_on=now(),
                    updated_on=now()
                )
            except Exception as e:
                print(f"Notification error: {e}")

        # ✅ Send email to publisher (already present)
        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(f"/user/dashboard/magazineinfo/?page={request.GET.get('page')}")
    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(f"/user/dashboard/magazineinfo/?page={request.GET.get('page')}")
    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!!! <-----------------qqq")
        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!!! <-----------------www")
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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 successfullyly.')
                    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_fetched)
            else:
                messages.success(request, data_fetched)
        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 successfullyly.')
                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.success(request,'Data has been updated successfully.')
                            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/')
        return redirect(request.META.get('HTTP_REFERER'))
    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(f"/user/dashboard/subscription/?page={request.GET.get('page')}")

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


# Offer Listing 
@login_required
def offers_view(request):
    search = request.GET.get('search', '')
    page = request.GET.get('page', '')
    current_date= date.today()
    offer_data = MagazineOfferinfo.objects.all()
    for offer in offer_data:
        if offer.end_date == current_date:
            pass
        elif offer.start_date <= current_date <= offer.end_date:
            pass
        else:
            offer.offer_status = False
            offer.save()

    if search:
        offers = MagazineOfferinfo.objects.filter(Q(users_id__email__icontains=search) | Q(code__icontains=search) )  
        if not offers:
            messages.error(request, no_data_fetched) 
        else:
            messages.success(request, data_fetched)
    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,
        'current_date':current_date,
        'page':page,
        }
    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):
    date_today = datetime.date.today()
    page = request.GET.get('page', '')
    forms = AddOffersForm()
    # user_form = AssignUsersToOffersForm()
    user_form = User.objects.filter(roles_id=5).all()
    if request.method == 'POST':
        forms = AddOffersForm(request.POST)
        user_list = request.POST.getlist('users')
        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 == 'Particular':
                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:
                            print("<++++++++++++++++++")
                            users = UserMapOffer()
                            users.user_id = int(row)
                            users.magazineoffer_id = offers.id
                            users.save()
                        messages.success(request, 'Data has been saved successfullyly.')
                        return redirect('/user/dashboard/offers/')
                    else:
                        print(forms.errors,"____________________=")
                        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 successfullyly.')
                    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,'page':page,'date_today':date_today}
    return render(request, 'web/offers/add.html', context)

# Edit Subscription View
@login_required
def edit_offers_view(request,id):
    page = request.GET.get('page', '')
    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.')
            if page:
                return redirect(f'/user/dashboard/offers/?page={page}')
            else:
                return redirect('/user/dashboard/offers/')
        else:
                messages.error(request, "Data is not been saved.")
    context = {'title': 'Edit Offers','forms':forms,'page':page,}
    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(f"/user/dashboard/offers/?page={request.GET.get('page')}")

# 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(f"/user/dashboard/offers/?page={request.GET.get('page')}")

# 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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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_fetched)
            else:
                messages.success(request, data_fetched)
        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(Q(magazineInfos__name__icontains=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.data:
                messages.error(request, no_data_fetched)
            else:
                messages.success(request, data_fetched)



            # 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__icontains=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.data:
                messages.error(request, no_data_fetched)
            else:
                messages.success(request, data_fetched)

            # 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(Q(magazineInfos__name__icontains=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 MagazineSellDetails.data:
                messages.error(request,no_data_fetched)
            else:
                messages.success(request,data_fetched)

            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,
        'search':search,
        }
    return render(request, 'web/reports/index.html', context)


##### Country Section
@login_required
def country_view(request):
    search = request.GET.get('search', '')
    page = request.GET.get('page', '')

    if search:
        countrys = Country.objects.filter(Q(name__icontains=search))  
        if not countrys:
            messages.error(request, no_data_fetched) 
        else:
            messages.success(request, data_fetched)
    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,
        'page':page,
        }
    return render(request,'web/country/index.html',context)    

@login_required
def add_country_view(request):
    page = request.GET.get('page', '')
    forms=CountryForm()
    if request.method=='POST':
        country_name=request.POST['name']
        country_commission=request.POST['commission']
        print(country_name, country_commission)

        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()
                    country_data = Country()
                    country_data.name = country_name
                    if country_commission:
                        country_name=request.POST['commission']
                    country_data.save()
                    messages.success(request,'Data has been saved successfullyly')
                    return redirect('/user/dashboard/country_view/')
            else:
                messages.error(request, 'Country name must be character.')
    context = {'forms':forms,'page':page,}    
    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):
    page = request.GET.get('page', '') 
    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':
        if forms.is_valid():
            forms.save()
            messages.success(request,'Data has been updated successfully')
                # return redirect('/user/dashboard/country_view/')
            if page:
                return redirect(f'/user/dashboard/country_view/?page={page}')
            else:
                return redirect(f'/user/dashboard/country_view/')
        else:
            messages.error(request, 'Add commission.')
            return redirect(request.META.get('HTTP_REFERER'))
        # 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/')
         
    context={'forms':forms,'subscription_form':subscription_form,'Country':country,
    'countryid':id,'stu':stu,'page':page,}    
    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):
    page = request.GET.get('page', '')
    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)).all().order_by("-created_on")
        if not subscription:
            messages.error(request, no_data_fetched)
        else:
            messages.success(request, data_fetched)
    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,
        'page':page,
        }
    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 
        if countries:   
            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/')  
        else:
            messages.error(request, 'Please select the country.')
            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):
    page = request.GET.get('page', '')
    country_list=[]
    forms=SubscriptionTypeForm()
    country_form=CountrySubscriptionForm()
    subscription = SubscriptionType.objects.all().order_by("-created_on")
    if request.method == "POST":
        subs_price=request.POST['price']
        subs_days=request.POST['days']
        subs_discount=request.POST['discount']
        if subs_discount:
            subs_disc_per=(float(subs_price)*float(subs_discount))/100
            subs_disc_per_month=float(subs_price)-float(subs_disc_per)
        else:  
            subs_disc_per_month=float(subs_price)
        subs_per_month=float(subs_disc_per_month)/int(subs_days)
        subs_per_month=round(subs_per_month, 2)
        forms = SubscriptionTypeForm(request.POST, request.FILES)
        country_fo= CountrySubscriptionForm(request.POST)
        country_list = request.POST.getlist('country')
        print(country_list,"+++++++++++++++++++++++")
        
        if country_list:    
            if forms.is_valid():
                # country_list = country_fo['name'].data
                data = Country.objects.filter(id__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)    
                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:
                            print('////////////')
                            continue
                        else:
                            print('*************')
                            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.per_month_price= subs_per_month
                            subscrtion.discount=request.POST['discount']
                            print('///////////////////////row.id')
                            subscrtion.country_id = row.id
                            print('///////////////////////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.')
                else:
                    messages.error(request, 'Subscription name must be character.')
            else:
                name = request.POST['subscription_type']
                print()
                if len(name)>20:
                    messages.error(request, 'Subscription name contain more then 20 characters.')
                else:  
                    print(forms.errors,"======================")
                    messages.error(request, 'Please select the country')  
        else:
            messages.error(request,'Please select the country') 
    country = Country.objects.all().order_by('name')              
    context = {'title': 'Subscription','subscription_form':forms,
    'forms':forms,'country':country_form,'subs':subscription,'country':country,
    'page':page,}
    return render(request, 'web/subscription/add.html', context)   

@login_required
def edit_subscription_commission_view(request,id):
    subscription=SubscriptionType.objects.filter(id=id).last()
    page = request.GET.get('page', '')
    print(subscription,'------------------')
    forms=SubscriptionCommisionForm(request.POST or None,instance=subscription)
    if request.method=="POST":
        subs_price=request.POST['price']
        subs_days=request.POST['days']
        subs_discount=request.POST['discount']
        if subs_discount:
            subs_disc_per=(float(subs_price)*float(subs_discount))/100
            subs_disc_per_month=float(subs_price)-float(subs_disc_per)
        else:  
            subs_disc_per_month=float(subs_price)
        subs_per_month=float(subs_disc_per_month)/int(subs_days)
        subs_per_month=round(subs_per_month, 2)
        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')
            if page:
                return redirect(f'/user/dashboard/subscription/?page={page}')
            else:
                return redirect('/user/dashboard/subscription/')

            # return redirect(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request,'Data not valid')
            return redirect(request.META.get('HTTP_REFERER'))
    context={'forms':forms,'subscription_form':forms,'subscription':subscription,'page':page,} 
    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', '')
    page = request.GET.get('page', '')
    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)
            messages.success(request, "Request successfully sent to admin.")
            return redirect(request.META.get('HTTP_REFERER'))

        else:
            withdrawal_form = WithdrawalForm(request.POST)
            messages.error(request, "Something went wrong.")
            print(withdrawal_form.errors,"<<<<<<<<Errors")
            return redirect(request.META.get('HTTP_REFERER'))


    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 not purchase_info_group:
                messages.error(request, no_data_fetched)
            else:
                messages.success(request, data_fetched)
            
            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:
        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 not purchase_info_group:
                messages.error(request,no_data_fetched)
            else:
                messages.success(request, data_fetched)

            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
            if wallet_amount < 0:
                wallet_amount = 0
                
            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
            if wallet_amount < 0:
                wallet_amount = 0
            wallet_amount = round(wallet_amount)
            print(withdrawal_amount)
            pending_requests = 0

            if not purchase_info_group:
                messages.error(request,no_data_fetched)
            else:
                messages.success(request, data_fetched)


    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 not purchase_info_group:
                messages.error(request, no_data_fetched)
            else:
                messages.success(request, data_fetched)

            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,'page':page,}
    return render(request,'web/reports-new/demo.html', context)


@login_required
def per_magazine_report_list(request, id):
    page = request.GET.get('page', '')
    date_today = datetime.date.today()
    date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
    search = request.GET.get('search', '')
    date_first = request.GET.get('date_one', date_30_day_before)
    date_second = request.GET.get('date_two', date_today)

    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,status="success").all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            if not purchase_info:
                messages.error(request,f"{no_data_fetched}")
            else:
                messages.success(request, data_fetched)

            admin_earning_amt = 0
        elif date_first and date_second:
            purchase_info = MagazinePurchaseInfo.objects.filter(create_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],magazineInfos=id,status="success").all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if not purchase_info:
                messages.error(request,no_data_fetched)
            else:
                messages.success(request,f"{data_fetched} between {date_first} to {date_second}.")               
        else:
            mag = MagazineInfo.objects.filter(id=id).last()
            print(date_first,"<----------------->", date_second)
            if date_first and date_second:
                purchase_info = MagazinePurchaseInfo.objects.filter(create_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],magazineInfos=id,status="success").all()
                purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
                purchase_info = purchase_info.data
                admin_earning_amt = 0
            else:
                admin_earning_amt = 0
                purchase_info = MagazinePurchaseInfo.objects.all()
                purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
                purchase_info = purchase_info.data
                messages.success(request, "All data is showing because dates are not filtered.")
        # 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,status="success").all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if not purchase_info:
                messages.error(request,no_data_fetched)
                
            else:
                messages.success(request,data_fetched)
                
        elif date_first and date_second:
            purchase_info = MagazinePurchaseInfo.objects.filter(create_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],magazineInfos=id,status="success").all()
            purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
            purchase_info = purchase_info.data
            admin_earning_amt = 0
            if not purchase_info:
                messages.error(request,no_data_fetched)
                
            else:
                messages.success(request,f"{data_fetched} between {date_first} to {date_second}.")
                
        else:
            mag = MagazineInfo.objects.filter(id=id).last()
            if date_first and date_second:
                purchase_info = MagazinePurchaseInfo.objects.filter(create_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],magazineInfos=id,status="success").all()
                purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
                purchase_info = purchase_info.data
                admin_earning_amt = 0
            else:
                purchase_info = MagazinePurchaseInfo.objects.filter(magazineInfos=id,status="success").all()
                purchase_info = ReportListSerializer(purchase_info, many=True,context={'request':request})
                purchase_info = purchase_info.data
                admin_earning_amt = 0
                messages.success(request, "All data is showing because dates are not filtered.")

            
            # 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
    today = datetime.date.today
    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,'date_first':str(date_first),'date_second':str(date_second),
        'page':page,
        'todays_date':str(date_today)
    }
    print(context, "<++++++++++++++context")
    return render(request,'web/reports-new/per_magazine_sell_list.html',context)


@login_required
def withdrawal_request(request):
    page = request.GET.get('page', '')
    date_today = datetime.date.today()
    date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
    search = request.GET.get('search', '')
    date_first = request.GET.get('date_one', date_30_day_before)
    date_second = request.GET.get('date_two', date_today)
    print(date_first,date_second)

    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/')
           
        elif search:
            withdrawlist = WithdrawalDetails.objects.filter((Q(name__icontains=search))).order_by('-created_on')
            
            if withdrawlist:
                messages.success(request, data_fetched)
            else:
                messages.error(request, no_data_fetched)

        elif date_first and date_second:
            withdrawlist = WithdrawalDetails.objects.filter(created_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59']).order_by('-created_on')
            if withdrawlist:
                messages.success(request, f"{data_fetched} between {date_first} to {date_second}.")
            else:
                messages.error(request, no_data_fetched)
        else:
            print(date_first,"<----------------->", date_second)
            if date_first and date_second:
                withdrawlist = WithdrawalDetails.objects.filter(created_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59']).order_by('-created_on')
            else:
                withdrawlist = WithdrawalDetails.objects.all().order_by('-created_on')
                messages.error(request, f'All data is showing because no date filter.')

    elif request.user.roles_id == 3:
        # date_today = datetime.date.today() + datetime.timedelta(+1)
        # 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')
            if withdrawlist:
                messages.success(request, data_fetched)
            else:
                messages.error(request, no_data_fetched)

        elif date_first and date_second:
            print('date_first', date_first)
            withdrawlist = WithdrawalDetails.objects.filter(created_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],user_id=request.user.id).order_by('-created_on')
            if withdrawlist:
                messages.success(request, f"{data_fetched} between {date_first} to {date_second}.")
            else:
                messages.error(request, no_data_fetched)
        else:
            # date_today = datetime.date.today()  + datetime.timedelta(+1)
            # date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
            print(date_first,"<----------------->", date_second)
            if date_first and date_second:
                withdrawlist = WithdrawalDetails.objects.filter(created_on__range=[f'{date_first} 00:00:00' ,f'{date_second} 23:59:59'],user_id=request.user.id).order_by('-created_on')
            else:
                withdrawlist = WithdrawalDetails.objects.filter(user_id=request.user.id).order_by('-created_on')
                messages.success(request, f'All data is showing because no date filter.')

    paginator = Paginator(withdrawlist, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {'withdrawlists':page_obj,'search':search,'date_first':str(date_first),
    'date_second':str(date_second),'page':page,'todays_date':str(date_today)}
    print(context,"=============-context")
    return render(request,'web/reports-new/withdrwal_request.html',context)


@login_required
def pending_request(request):
    page = request.GET.get('page', '')
    # date_today = datetime.date.today()
    # date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
    search = request.GET.get('search', '')
    date_first = request.GET.get('date_one','')
    date_second = request.GET.get('date_two','')
    print(date_first,date_second)

    if request.user.roles_id in [1,2]:
        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/pendingrequests/')
           
        elif search:
            withdrawlist = WithdrawalDetails.objects.filter((Q(name__icontains=search))).order_by('-created_on')
            
            if withdrawlist:
                messages.success(request, data_fetched)
            else:
                messages.error(request, no_data_fetched)

        elif date_first and date_second:
            withdrawlist = WithdrawalDetails.objects.filter((Q(is_aproved=None)|Q(is_aproved="")),created_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59']).order_by('-created_on')
            if withdrawlist:
                messages.success(request, f"{data_fetched} between {date_first} to {date_second}.")
            else:
                messages.error(request, no_data_fetched)
        else:
            print(date_first,"<------------YES In----->", date_second)
            if date_first and date_second:
                withdrawlist = WithdrawalDetails.objects.filter(is_aproved=None).order_by('-created_on')
            else:
                withdrawlist = WithdrawalDetails.objects.filter(Q(is_aproved=None)|Q(is_aproved="")).order_by('-created_on')
                # messages.error(request, f'All data is showing because no date filter.')

    todays_date = datetime.date.today()
    paginator = Paginator(withdrawlist, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {'withdrawlists':page_obj,'search':search,'date_first':str(date_first),
    'date_second':str(date_second),'page':page,'todays_date':str(todays_date)}
    # print(context,"=============-context")
    return render(request,'web/reports-new/pending_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, JsonResponse
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):
    date_today = datetime.date.today()
    date_30_day_before = datetime.date.today() + datetime.timedelta(-30)
    search = request.GET.get('search', '')
    page = request.GET.get('page', '')
    date_first = request.GET.get('date_one', date_30_day_before)
    date_second = request.GET.get('date_two', date_today)
    print(date_first,date_second)

    if request.user.roles_id in [1,2]:
        if search:
            delivery_data = MagazinePurchaseInfo.objects.filter((Q(users__username__icontains=search)|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(search,"==========")
            print(delivery_data,"<<<<<<<<<<<<<<<<<<<")
            if not delivery_data:
                messages.error(request, no_data_fetched)
                
            else:
                messages.success(request, data_fetched)

        elif date_first and date_second:
            delivery_data = MagazinePurchaseInfo.objects.filter(create_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],is_hard_copy=True).all().order_by('-create_on')
            if not delivery_data:
                messages.error(request, no_data_fetched)
                
            else:
                messages.success(request, f'{data_fetched} between {date_first} to {date_second}.')
        # elif not date_first or not date_second:
        #     delivery_data = MagazinePurchaseInfo.objects.none()
        #     messages.error(request, "Please provide dates to found data.")

        else:
            delivery_data = MagazinePurchaseInfo.objects.filter(is_hard_copy=True).all().order_by('-create_on')
            messages.success(request, "All data show because not date is filtered.")
            # print(delivery_data,"<<<<<<<<<<<<<<<<<<<")
            # breakpoint()
    elif request.user.roles_id == 3:
        if request.method == 'POST':
            print(request.POST)
            status = request.POST['status']
            status_code = status
            admin_image =request.FILES.get('admin_image')
            comment = request.POST['comment']
            id = request.POST['request_id']
            
            print(status, admin_image, comment, id)
            # breakpoint()
            request_data = MagazinePurchaseInfo.objects.filter(id=id).last()
            print(request_data.magazineInfos.name)
            request_data.image = admin_image
            request_data.description = comment
            request_data.is_delivered = int(status)
            request_data.save()
            requested_email = request_data.users.email
            name = request_data.users.first_name + " " + request_data.users.last_name
            if status == '1':
                status = 'Delivered'
                MagazinePurchaseInfo.objects.filter(id=id).update(delivery_date=datetime.datetime.today())
            elif status == '0':
                status = 'Rejected'
                MagazinePurchaseInfo.objects.filter(id=id).update(delivery_date=datetime.datetime.today())
            elif status == '2':
                status = 'In Progress'
            print(status)
            print(status_code,"+++++++++++")

            record_data = {'requested_email':requested_email, 'name':name,'status':status,'status_code':status_code,}
            # print('record_data')
            DeliveryRequestStatusEmailTread(record_data).start()
            return redirect(f'/user/dashboard/delivery/?page={page}')

        elif 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(users__username__icontains=search)|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)),(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,"<<<<<<<<<<<<<<<<<<<")
            print(search,"==========")
            if not delivery_data:
                messages.error(request, no_data_fetched)
                
            else:
                messages.success(request, data_fetched)
        
        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__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],is_hard_copy=True).all().order_by('-create_on')
    
            if not delivery_data:
                messages.error(request, no_data_fetched)
                
            else:
                messages.success(request, f'{data_fetched} between {date_first} to {date_second}.')
        # elif not date_first or not date_second:
        #     delivery_data = MagazinePurchaseInfo.objects.none()
        #     messages.error(request, "Please provide dates to found data.")
        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')
            messages.success(request, "All data show because not date is filtered.")
    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 not delivery_data:
                messages.error(request, no_data_fetched)
                
            else:
                messages.success(request, data_fetched)
        elif date_first and date_second:
            delivery_data = MagazinePurchaseInfo.objects.filter(create_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],is_hard_copy=True,magazineInfos__users_id = request.user.id).all()
            if not delivery_data:
                messages.error(request, no_data_fetched)
                
            else:
                messages.success(request, data_fetched)

        else:
            delivery_data = MagazinePurchaseInfo.objects.filter(create_on__range=[f'{date_first} 00:00:01' ,f'{date_second} 23:59:59'],is_hard_copy=True,magazineInfos__users_id = request.user.id).all()
    todays_date = datetime.date.today()
    paginator = Paginator(delivery_data, 10) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number) 
    context = {'todays_date':str(todays_date),'delivery_data':page_obj,'search':search,'date_first':str(date_first),'date_second':str(date_second),}
    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/')
@login_required
def error_404(request,exception):
    return render(request, 'web/404.html', status=404)

@login_required
def rent_view(request):
    if request.user.roles_id in  [1,2]:
        search = request.GET.get('search', '')
        page = request.GET.get('page', '')

        if search:
            rent_list = UserRent.objects.filter(Q(name__icontains=search)|Q(country__name__icontains=search)).order_by('-created_on')
            if rent_list:
                messages.success(request,"Data fetched successfully.")
            else:
                messages.error(request, 'Data not fetched.')
            # return redirect('user/dashboard/rent/')
        else:
            rent_list = UserRent.objects.all().order_by('-created_on')
        paginator = Paginator(rent_list, 10) 
        page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number) 
        context = {"rent_list":page_obj,'page':page,'search':search}
        return render(request, 'web/rent/index.html',context)
    else:
        return redirect('user/dashboard/')

@login_required
def add_rent_view(request):
    page = request.GET.get('page', '')
    print(request.POST.getlist('country'))
    if request.user.roles_id in  [1,2]:
        forms = RentForm()
        countryForms = RentForCountryForm()
        if request.method == 'POST':
            country_list = request.POST.getlist('country')
            # print(country_list,"============>")
            # # breakpoint()
            if country_list:
                check_country = UserRent.objects.filter(country__name__in=country_list).values_list('country__name', flat=True)
                if check_country:
                    forms = RentForm(request.POST)
                    countryForms = RentForCountryForm(request.POST)
                    country = []
                    for i in check_country:
                        country.append(i)
                    messages.error(request,f"Country {country} already exists in for rent.")
                    return redirect(f"/user/dashboard/addrent/?page={request.GET.get('page')}")
                forms = RentForm(request.POST)
                if forms.is_valid():
                    # a = forms.save()
                    for country in country_list:
                        # UserRent.objects.filter(id=a.id).update(country_id=Country.objects.filter(name=country).last().id)
                        rent_country = UserRent()
                        rent_country.name = request.POST.get('name').title()
                        rent_country.price = request.POST.get('price')
                        rent_country.rent_status = True
                        rent_country.validity = request.POST.get('validity')
                        rent_country.country_id = Country.objects.filter(name=country).last().id
                        rent_country.save()
                    messages.success(request,"Rent Created successfully")
                    return redirect(f"/user/dashboard/rent/?page={request.GET.get('page')}")
                else:
                    messages.error(request,"Entered data was not valid.")
                    forms = RentForm(request.POST)
                    countryForms = RentForCountryForm(request.POST)
                    print(forms.errors,'forms')
                    print(countryForms.errors)
            else:
                messages.error(request,"Please choose atleast one country.")
                forms = RentForm(request.POST)
                countryForms = RentForCountryForm(request.POST)
                print(countryForms.errors)

            print(country_list,"country","=============")
        country_list = Country.objects.all().order_by('name')
        context = {'form':forms, 'cf':countryForms,'page':page,'country_list':country_list,}
        return render(request, 'web/rent/add.html', context)
    else:
        return redirect('user/dashboard/')

@login_required
def edit_rent_view(request, id):
    page = request.GET.get('page', '')
    rent =  UserRent.objects.filter(id=id).last()
    forms = RentForm(request.POST or None, instance=rent)
    if request.method == "POST":
        forms.save()
        messages.success(request, f'Data updated successfully.')
        return redirect(f"/user/dashboard/rent/?page={request.GET.get('page')}")
    context = {'form':forms,'country_list':rent,'page':page}
    return render(request, 'web/rent/edit.html', context)

@login_required
def activate_rent(request,id):
    rent =  UserRent.objects.get(id=id)
    rent.rent_status = True
    rent.save()
    messages.success(request, f'{rent.name} has been activated successfully.')
    return redirect(f"/user/dashboard/rent/?page={request.GET.get('page')}")

@login_required
def deactivate_rent(request,id):
    rent =  UserRent.objects.get(id=id)
    rent.rent_status = False
    rent.save()
    messages.success(request, f'{rent.name} has been deactivated successfully.')
    return redirect(f"/user/dashboard/rent/?page={request.GET.get('page')}")

#### Ajay the greate codder
@login_required
def blogs_views(request):
    search = request.GET.get('search', '')
    page = request.GET.get('page', '')
    role_id = request.user.roles_id
    user_id = request.user.id
    if role_id in [1,2]:
        if search:
            blog = Blogs.objects.filter((Q(category__category_name__icontains=search) | Q(title__icontains=search))).all()#,user_id=request.user.id)
            if not blog:
                messages.error(request, no_data_fetched)
            else:
                messages.success(request, data_fetched)
        else:
            blog = Blogs.objects.filter((Q(is_deleted=False)|Q(is_deleted=None))).all().order_by('-created_on')
    elif role_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)
            blog = Blogs.objects.filter((Q(category__category_name__icontains=search) | Q(title__icontains=search)),Q(user_id__in=subpliserappend)| Q(user_id=user_id))
            if not blog:
                messages.error(request, no_data_fetched)
            else:
                messages.success(request, data_fetched)
        else:
            subpubliserlist = SubPublisherUser.objects.filter(created_by_id=request.user.id).all()
            subpliserappend = []
            if subpubliserlist:
                for subpuliserrow in subpubliserlist:
                    subpliserappend.append(subpuliserrow.users_id)
            blog = Blogs.objects.filter((Q(is_deleted=False)|Q(is_deleted=None)),Q(user_id__in=subpliserappend)| Q(user_id=user_id)).all().order_by('-created_on')
    elif role_id == 4:
        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)
            blog = Blogs.objects.filter((Q(category__category_name__icontains=search) | Q(title__icontains=search)),user_id=user_id)
            if not blog:
                messages.error(request, no_data_fetched)
            else:
                messages.success(request, data_fetched)
        else:
            blog = Blogs.objects.filter((Q(is_deleted=False)|Q(is_deleted=None)),user_id=user_id).all().order_by('-created_on')
    


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

@login_required
def add_blogs_views(request):
    forms = BlogsForm()
    image_form = BlogImageForm()
    b = BlogsImages.objects.all()

    if request.method == 'POST':
        forms = BlogsForm(request.POST or None, request.FILES or None)
        if forms.is_valid():
            blog = forms.save()
            Blogs.objects.filter(id=blog.id).update(user_id=request.user.id)

            try:
                # Find the first admin user
                admin_user = User.objects.filter(roles_id=Role.ADMIN).first()

                if admin_user:
                    Notification.objects.create(
                        message=f"📝 New blog '{blog.title}' submitted by {request.user.get_full_name()}",
                        user=admin_user,  # ✅ assign to admin so only admin sees it
                        read=False,
                        created_on=now(),
                        updated_on=now()
                    )
            except Exception as e:
                print("❌ Notification creation failed:", e)

            messages.success(request, 'Data has been saved successfully')
            return redirect('/user/dashboard/blogs/')
        else:
            print(forms.errors, "<================")
            if request.POST.get('content') in ["", None]:
                messages.error(request, "Please provide content before save.")
            else:
                messages.error(request, 'Something went wrong')

        forms = BlogsForm(request.POST or None, request.FILES or None)

    context = {
        'title': 'Blogs',
        'form': forms,
        'bi': b,
        'image_form': image_form
    }
    return render(request, "web/blogs/add.html", context)


@login_required
def edit_blogs_views(request,id):
    blog = Blogs.objects.filter(id=id).last()
    forms = BlogsForm(request.POST or None, request.FILES or None, instance=blog)
    image_form = BlogImageForm()

    if request.method == 'POST':
        if forms.is_valid():
            forms.save()
            messages.success(request, 'Data has been updated successfully.')
            return redirect('/user/dashboard/blogs/')
        else:
            print(forms.errors,"<================")
            if request.POST.get('content') == "" or request.POST.get('content') == None:
                messages.error(request, "Please provide content before save.")
            else:
                messages.error(request, 'Something went wrong')
            forms = BlogsForm(request.POST or None, request.FILES or None, instance=blog)    
    context = {'title':'Blogs','form':forms,'image_form':image_form,'blog':blog,}
    return render(request,"web/blogs/edit.html", context)

@login_required
def delete_blogs_views(request,id):
    blog = Blogs.objects.get(id=id)
    blog.is_deleted = True
    blog.save()
    messages.success(request, f'{blog.title} has been deleted successfully.')
    return redirect(f"/user/dashboard/blogs/?page={request.GET.get('page')}") 


@login_required
def activate_blog_view(request, id):
    try:
        blog = Blogs.objects.get(id=id)
        blog.is_active = True
        blog.save()

        # ✅ Notify the publisher whose blog is approved
        if blog.user_id:
            try:
                Notification.objects.create(
                    message=f"✅ Hi {blog.user.get_full_name()}, your blog '{blog.title}' has been approved and is now live!",
                    user_id=blog.user_id,  # ✅ only publisher will see this
                    read=False,
                    created_on=now(),
                    updated_on=now()
                )
            except Exception as e:
                print(f"❌ Notification creation failed: {e}")

        messages.success(request, f"✅ '{blog.title}' has been activated successfully.")
    except Blogs.DoesNotExist:
        messages.error(request, "❌ Blog not found.")

    return redirect(f"/user/dashboard/blogs/?page={request.GET.get('page')}")


@login_required
def deactivate_blog_view(request,id):
    blog = Blogs.objects.get(id=id)
    blog.is_active = False
    blog.save()
    messages.success(request, f'{blog.title} has been deactivated successfully.')
    return redirect(f"/user/dashboard/blogs/?page={request.GET.get('page')}") 

@login_required
def approve_blogs_views(request,id):
    blog = Blogs.objects.get(id=id)
    blog.is_aproved = True
    blog.save()
    messages.success(request, f'{blog.title} has been approved successfully.')
    return redirect(f"/user/dashboard/blogs/?page={request.GET.get('page')}") 

@login_required
def disapprove_blogs_views(request,id):
    blog = Blogs.objects.get(id=id)
    blog.is_aproved = False
    blog.save()
    messages.success(request, f'{blog.title} has been disapproved successfully.')
    return redirect(f"/user/dashboard/blogs/?page={request.GET.get('page')}") 

from django.http.response import HttpResponse
from rest_framework.response import Response
from .serializers import DetectModelSerializer

from rest_framework.views import APIView
from rest_framework.decorators import parser_classes
from rest_framework.parsers import MultiPartParser, FormParser
# from django.views.decorators.csrf import csrf_exempt   
# @csrf_exempt
class GenURl(APIView):
    parser_classes = (MultiPartParser, )

    def get(self,request):
        print(request)
        return Response()

    def post(self,request,*arg, **kwargs):
        print(request.data,"<===============")
        print("++++++++++++++++")
        dSerializer = DetectModelSerializer(data=request.data)
        if (dSerializer.is_valid()):
           uploaded_image = dSerializer.save()
           print(uploaded_image,"+<+++++++++++++++")
           uploaded_image = BlogsImages.objects.filter(id=uploaded_image.id).last()
           uploaded_image = BlogImageURLSerializer(uploaded_image).data

        else:
            print(dSerializer.errors)
        data = {"url":uploaded_image}
        return Response(data)
