from django.shortcuts import render

import io
from django.db import models
import calendar
import datetime
import re
import os
import math, random 
import json,jwt
import sys

import hashlib
import string
import secrets
import environ



from rest_framework.decorators import api_view, permission_classes, renderer_classes,authentication_classes
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated,AllowAny

from django.contrib.auth.hashers import make_password, check_password
from django.core.mail import send_mail
from django.core.files.storage import FileSystemStorage
from django.template.loader import get_template
from django.core.mail import EmailMultiAlternatives
from django.contrib.auth import authenticate
# from django.core.mail import send_mail
# from django.core.mail import EmailMessage

from sqlalchemy.exc import SQLAlchemyError

from datetime import date, timedelta
from django.utils import timezone

from Idpwoa_Backend import dbsession
from Idpwoa_Backend.JSONDateSerializer import JSONDateEncoder
from Idpwoa_Backend.settings import ALLOWED_HOSTS
from idpwoa.models import *
from Idpwoa_Backend.SQLAlchemyAuthenticationBackend import SQLAlchemyUserBackend
from Idpwoa_Backend.userrestframeworkTokenAuthenticaion import TokenAuthentication

env = environ.Env()
environ.Env.read_env()



new_limit = 5000



# idpwoa 

def get_current_time():
    current_time = datetime.datetime.now().strftime('%H:%M:%S')
    return current_time

def get_current_date():
    return datetime.datetime.now().strftime('%d-%m-%Y')

current_date = get_current_date()
# current_time = datetime.datetime.now().strftime('%H:%M:%S') 

current_time = get_current_time()

# Functions

def landingpage(request):
    # send_notification("New notification message")
    return render(request, 'landing page/index.html')
    # return render(request,'index.html',)


def checkIdNoExist(id,district):
	try:
		session = dbsession.Session()
		uid_length = session.query(UserRegistrationTbl).filter(UserRegistrationTbl.idno==id).all()
		if(len(uid_length) == 0):
			return 0
		else:
			# user_id = generateIdNo(district)
			# checkUserIdisExist(user_id)
			return 1
	except SQLAlchemyError as e:
		session.rollback()
		session.close()
		return False

def generateIdNo(district):
        session = dbsession.Session()
        if district == 'Trivandrum' :
            #print('TVM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/TVM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/TVM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kollam' :
            #print('KLM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KLM/"+id
               
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KLM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Pathanamthitta' :
           #print('PTA')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/PTA/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/PTA/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Alappuzha' :
            #print('ALP')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/ALP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/ALP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kottayam' :
            #print('KTM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KTM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KTM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Idukki' :
            #print('IDK')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/IDK/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/IDK/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Ernakulam' :
            #print('EKM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/EKM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/EKM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Thrissur' :
            #print('TSR')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/TSR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/TSR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Palakkad' :
            #print('PKD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/PKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/PKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Malappuram' :
            #print('MLP')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/MLP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/MLP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kozhikode' :
            #print('KKD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Wayanad' :
            #print('WYD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/WYD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/WYD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kannur' :
            #print('KNR')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KNR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KNR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kasargod' :
            #print('KGD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KGD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KGD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1

def checkEmailExist(email):
	try:
		session = dbsession.Session()
		email_length = session.query(loginTbl).filter(loginTbl.email==email).all()
		if(len(email_length) == 0):
			return 0
		else:
			# user_id = generateIdNo(district)
			# checkUserIdisExist(user_id)
			return 1
	except SQLAlchemyError as e:
		session.rollback()
		session.close()
		return False

# OTP
def generateRandomOTP():
	digits = "0123456789"
	OTP = ""
	for i in range(6) : 
		OTP += digits[math.floor(random.random() * 10)] 
	return OTP

def generate_key_from_name(name):
    # Hash the name using SHA-256
    # sha256 = hashlib.sha256()
    # sha256.update(name.encode('utf-8'))
    # hash_value = sha256.hexdigest()
    # key_part = hash_value[:7]
    # special_character = random.choice(string.punctuation)
    
    # return key_part + special_character
    random_key = secrets.token_hex(6 // 2)
    return random_key

def sendOTP(params):
    try :
        print('inside')
        ctx = {
            'OTP':params['otp_val'],
            'name':params['name']
                }
        plaintext = get_template('email/email.txt')
        htmly     = get_template('email/email.html')
        subject, from_email, to = 'Welcome to IDPWOA', 'idpwoakeralawebsite@gmail.com', params['email']
        text_content = plaintext.render(ctx)
        html_content = htmly.render(ctx)
        msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
        msg.attach_alternative(html_content, "text/html")
        msg.send()
        if msg:
            return True
        else:
            return False
        return False
    except Exception as e:
        print(e)
        return False

def forgotSendOTP(params):
	ctx = {
        'OTP':params['otp_val'],
            }
	plaintext = get_template('email/forgotemail.txt')
	htmly     = get_template('email/forgotemail.html')
	subject, from_email, to = 'Welcome to IDPWOA', 'idpwoakeralawebsite@gmail.com', params['email']
	text_content = plaintext.render(ctx)
	html_content = htmly.render(ctx)
	msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
	msg.attach_alternative(html_content, "text/html")
	msg.send()
	if msg:
		return True
	else:
		return False
	return False
 
def welcomeMail(params):
    try :
        ctx = {
            'name':params['name']
                }
        plaintext = get_template('email/welcome.txt')
        htmly     = get_template('email/welcome.html')
        subject, from_email, to = 'Welcome to IDPWOA', 'idpwoakeralawebsite@gmail.com', params['email']
        text_content = plaintext.render(ctx)
        html_content = htmly.render(ctx)
        msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
        msg.attach_alternative(html_content, "text/html")
        msg.send()
        if msg:
            return True
        else:
            return False
        return False
    except Exception as e:
        return False
    


# API


@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def user_registration(request):
    session = dbsession.Session()
    try :
        district = request.data['district']
        email = request.data['email']
        name = request.data['fname']+' '+request.data['lname']
        emailExist = checkEmailExist(email)
        idNo = generateIdNo(district)
        if emailExist == 0:
            if idNo !=1:
                userObj = UserRegistrationTbl()
                userObj.fname = request.data['fname']
                userObj.lname = request.data['lname']
                userObj.idno = idNo
                userObj.useraddress = request.data['useraddress']
                userObj.shopaddress = request.data['shopaddress']
                userObj.contactno = request.data['contactno']
                userObj.whatsappno = request.data['whatsappno']
                userObj.shoptype = request.data['shoptype']
                userObj.bloodgroup = request.data['bloodgroup']
                userObj.email = request.data['email']
                userObj.gender = request.data['gender']
                if request.data.getlist('userimage')!=['undefined']:
                    for f in request.data.getlist('userimage'):
                        fs = FileSystemStorage()
                        filename = fs.save(f.name,f)
                        uploaded_file_url = fs.url(filename)
                        userObj.userimageurl = uploaded_file_url
                
                if request.data.getlist('shopimage')!=['undefined']:
                    for f in request.data.getlist('shopimage'):
                        fs = FileSystemStorage()
                        filename = fs.save(f.name,f)
                        uploaded_file_url = fs.url(filename)
                        userObj.shopimageurl = uploaded_file_url
                userObj.district = request.data['district']
                userObj.constituency = request.data['constituency']
                userObj.panchayath = request.data['panchayath']
                userObj.status = 'Active'
                userObj.createddate = datetime.datetime.now()
                session.add(userObj)
                session.commit()
                if userObj.id >0:
                    loginObj = loginTbl()
                    loginObj.login_id = idNo
                    loginObj.userid = userObj.id
                    loginObj.username = request.data['email']
                    loginObj.password = make_password(request.data['password'])
                    loginObj.type = 'User'
                    loginObj.status = 'Inactive'
                    loginObj.email = request.data['email']
                    loginObj.createddate = datetime.datetime.now()
                    session.add(loginObj)
                    session.commit()
                    session.refresh(loginObj)
                if loginObj.id>0:
                    Params = {
			                "email":request.data['email'],
                            "name":name,
		                }
                        # send welcome mail
                    welcome = welcomeMail(Params)
                    session.close()
                    return Response({'response':'Success','message':'Account created successfully'})
                else :
                    return Response({'response':'Error','message':"Can't register now...! please try again later"})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't register now...! please try again later"})
        else :
            session.close()
            return Response({'response':'Error','message':"An account with this email already exist"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def userAuthenticate(request):
    try :
        print('inside login')
        session = dbsession.Session()
        user_name = request.data['username']
        password = request.data['password']
        c_date = get_current_date()
        loginArr = []
        user = session.query(loginTbl).filter(loginTbl.username == user_name).one()
        if user.id>0:
            user_name = user.email
            print(user_name)
            if user.check_password(password):
                if user.id>0 :
                    if user.id:
                        if user.status=='Active' and user.type=='User':
                            print('inside active')
                            logList = {
                                "userid":user.userid,
                                "idno" : user.login_id,
                                "type" : user.type,
                                "status" : user.status,
                            }
                            loginArr.append(logList)
                            sql = session.query(loginTbl).filter_by(id=user.id).update({'last_logineddate':c_date})
                            session.commit()
                            session.close()
                            return Response({'response':'Success','logindetails':loginArr})
                        elif user.status=='Active' and user.type=='Admin':
                            print('inside active')
                            logList = {
                                "userid":user.userid,
                                "idno" : user.login_id,
                                "type" : user.type,
                                "status" : user.status,
                            }
                            loginArr.append(logList)
                            sql = session.query(loginTbl).filter_by(id=user.id).update({'last_logineddate':c_date})
                            session.commit()
                            session.close()
                            return Response({'response':'Success','logindetails':loginArr})
                        else :
                            return Response({'response':'Error','message':'User account is not active please contact admin'})
                    else :
                        return Response({'response':'Error','message':'Invalid username or password'})
                else:
                    return Response({'response':'Error','message':'Invalid username or password'})
            else :
                return Response({'response':'Error','message':'Invalid username or password'})
        else :
            return Response({'response':'Error','message':'Invalid username or password'})

    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})



@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def adminAuthentication(request):
    session = dbsession.Session()
    try :
        username = request.data['username']
        password = request.data['password']
       
        current_date = datetime.datetime.now().replace(microsecond=0)
        session.flush()
        user = authenticate(user_name=username, password=password)
        if user :
            if user.id:
                if user.status=='Active' and user.type=='User':
                    print('inside active')
                    try :
                        DateEncoder = JSONDateEncoder()
                        payload = {
                        'user_id': user.userid,
                        'expiry' : DateEncoder.default(datetime.date.today() + datetime.timedelta(days=30))
                        }
                        
                        token = jwt.encode(payload, env('SECRET_KEY'))
                        session.query(loginTbl).filter(loginTbl.userid==user.userid).update({'last_logineddate':current_date})
                        session.query(AuthToken).filter_by(user_id=user.userid).delete()
                        auth_token = AuthToken()
                        auth_token.key = token
                        auth_token.created = datetime.datetime.now()
                        auth_token.user_id = user.userid
                        session.add(auth_token)
                        session.commit()
                        
                        admin_details = {}
                        admin_details['token'] = token
                        admin_details['username']  = user.username
                        admin_details['userid'] = payload['user_id']
                        admin_details['type'] = user.type
                        admin_details['status'] = user.status
                        admin_details['token_expiry'] = payload['expiry']
                        admin_details['expiry_time'] = datetime.datetime.now()+datetime.timedelta(minutes = 43200)
                        session.close()
                        return Response({'response':'Success','logindetails':admin_details})
                    except Exception as e:
                        print(e)
                        session.rollback()
                        session.close()
                        return Response ({'response':'Error','message':'Cant login now. Please try again later...!'})
                elif user.status=='Active' and user.type=='Admin':
                        print('inside active')
                        try :
                            DateEncoder = JSONDateEncoder()
                            payload = {
                            'user_id': user.userid,
                            'expiry' : DateEncoder.default(datetime.date.today() + datetime.timedelta(days=30))
                            }
                            
                            token = jwt.encode(payload, env('SECRET_KEY'))
                            session.query(loginTbl).filter(loginTbl.userid==user.userid).update({'last_logineddate':current_date})
                            session.query(AuthToken).filter_by(user_id=user.userid).delete()
                            auth_token = AuthToken()
                            auth_token.key = token
                            auth_token.created = datetime.datetime.now()
                            auth_token.user_id = user.userid
                            session.add(auth_token)
                            session.commit()
                            
                            admin_details = {}
                            admin_details['token'] = token
                            admin_details['username']  = user.username
                            admin_details['userid'] = payload['user_id']
                            admin_details['type'] = user.type
                            admin_details['status'] = user.status
                            admin_details['token_expiry'] = payload['expiry']
                            admin_details['expiry_time'] = datetime.datetime.now()+datetime.timedelta(minutes = 43200)
                            session.close()
                            return Response({'response':'Success','logindetails':admin_details})
                        except Exception as e:
                            print(e)
                            session.rollback()
                            session.close()
                            return Response ({'response':'Error','message':'Cant login now. Please try again later...!'})         
                else :
                    session.close()
                    return Response({'response':'Error','message':'User account is not active please contact admin'})
        else :
            return Response({'status': 'Error','message':'Please check your credentails'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
        session.close()










@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def get_UserList(request):
    try :
        session = dbsession.Session()
        print('inside login')
        #sql = 'select * from idpwoauserregistartion order by id desc'
        sql ='select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.* from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="Active" order by id desc'
        userObj = session.execute(text(sql)).fetchall()
        userObjs = [dict(row) for row in userObj]
        if len(userObjs)>0 :
             session.close()
             return Response({'response':'Success','userlist':userObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getUserByStatus(request):
    try :
        session = dbsession.Session()
        print('inside login')
        status = request.data['status']
        #sql = 'select * from idpwoauserregistartion order by id desc'
        sql ='select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.* from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="'+status+'" order by id desc'
        userObj = session.execute(text(sql)).fetchall()
        userObjs = [dict(row) for row in userObj]
        if len(userObjs)>0 :
             session.close()
             return Response({'response':'Success','userlist':userObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})




@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getUser_ByID(request):
    try :
        session = dbsession.Session()
        print('inside login')
        id = request.data['id']
        sql = 'select * from idpwoauserregistartion where id ="'+id+'"'
        userObj = session.execute(text(sql)).fetchall()
        userObjs = [dict(row) for row in userObj]
        if len(userObjs)>0 :
             session.close()
             return Response({'response':'Success','userlist':userObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})


@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def editUserProfile(request):
    session = dbsession.Session()
    try :
        id = request.data['userid']
        idno = request.data['idno']
        userObj = session.query(UserRegistrationTbl).filter_by(id=id, idno=idno).one()
        userObj.fname = request.data['fname']
        userObj.lname = request.data['lname']
        userObj.useraddress = request.data['useraddress']
        userObj.shopaddress = request.data['shopaddress']
        userObj.contactno = request.data['contactno']
        userObj.whatsappno = request.data['whatsappno']
        userObj.shoptype = request.data['shoptype']
        userObj.bloodgroup = request.data['bloodgroup']
        userObj.gender = request.data['gender']
        if request.data.getlist('userimage')!=['undefined']:
            for f in request.data.getlist('userimage'):
                fs = FileSystemStorage()
                filename = fs.save(f.name,f)
                uploaded_file_url = fs.url(filename)
                userObj.userimageurl = uploaded_file_url
        
        if request.data.getlist('shopimage')!=['undefined']:
            for f in request.data.getlist('shopimage'):
                fs = FileSystemStorage()
                filename = fs.save(f.name,f)
                uploaded_file_url = fs.url(filename)
                userObj.shopimageurl = uploaded_file_url
        userObj.district = request.data['district']
        userObj.constituency = request.data['constituency']
        userObj.panchayath = request.data['panchayath']
        userObj.status = 'Active'
        userObj.createddate = datetime.datetime.now()
        session.add(userObj)
        session.commit()
        if userObj.id >0:
            session.close()
            return Response({'response':'Success','message':'Updated successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't update value"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"}) 




# Approve user

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getUser_Request(request):
    try :
        session = dbsession.Session()
        print('inside login')
        sql = 'select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.* from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="Inactive" order by id desc'
        userObj = session.execute(text(sql)).fetchall()
        userObjs = [dict(row) for row in userObj]
        if len(userObjs)>0 :
             session.close()
             return Response({'response':'Success','userlist':userObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})


@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def approveUser(request):
    session = dbsession.Session()
    try :
        userid = request.data['userid']
        status = request.data['status']
        user = session.query(loginTbl).filter_by(userid=userid).first()
        if user:
            user.status = status
            session.commit()
            return Response({'response': 'Success', 'message': 'Updated successfully'})
        else :
            return Response({'response':'Warning','message':'Cant update value try again later'})  
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
        session.close()


# Registartion OTP
@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def sendUserOtp(request):
    session = dbsession.Session()
    try :
        email = request.data['email']
        name = request.data['name']
        phone = request.data['phone']
        emailExist = checkEmailExist(email)
        if emailExist == 1:
            session.close()
            return Response({'response':'Error','message':'An account with this email already exist'})
        else :
            # Setting email limit
            current_limit = sys.getrecursionlimit()
            sys.setrecursionlimit(new_limit)
            
            Otp = generateRandomOTP()
            otp_cre_time = datetime.datetime.now().replace(microsecond=0)
            otp_expire_time = otp_cre_time+datetime.timedelta(minutes = 5)
            Otp = generateRandomOTP()
            params = {"otp_val": Otp , "otp_created_time" : otp_cre_time, "otp_exp_time": otp_expire_time}
            otpParams = {
                "otp_val": Otp , 
                "otp_cre_time" : otp_cre_time, 
                "otp_expire_time": otp_expire_time,
                "email":request.data['email'],
                "name":name,
            }
            if Otp :
                result = sendOTP(otpParams)
                if result == True:
                    otpDtl = Otpdtl()
                    otpDtl.email = request.data['email']
                    otpDtl.otp = Otp
                    today = date.today()
                    otpDtl.createddate = datetime.datetime.now()
                    otpDtl.createdtime = current_time
                    key = generate_key_from_name(name)
                    otpDtl.key = key
                    otpDtl.type = 'Registration'
                    otpDtl.name = name
                    otpDtl.phone = phone
                    otpDtl.status = 'Pending'
                    session.add(otpDtl)
                    session.commit()
                    session.close()
                    return Response({'response':'Success','key':key})
                else :
                    session.close()
                    return Response({'response':'Error','message':'Cant send otp to the email you provided...!please check you email id'}) 
            else :
                session.close()
                return Response({'response':'Error','message':'Cant send otp now..! please try again later'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print('inside try')
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def verifyUserOtp(request):
    session = dbsession.Session()
    try :
        otp = request.data['otp']
        key = request.data['key']
        email = request.data['email']
        otpVal = session.query(Otpdtl).filter_by(email=email,key=key).one()
        # print(otpVal)
        # if otpVal.createdtime :
        #      print(otpVal.createdtime)
        #      print(current_time)
        if otpVal.status == 'Pending':
            expiration_time = timezone.timedelta(minutes=15)
            created_at = timezone.make_aware(otpVal.createddate)
            current_time = timezone.now()
            
            if current_time - created_at > expiration_time:
                session.close()
                return Response({'response' :'Error',"message": "OTP expired"}, status=400)
            else:
                if otpVal.otp == otp :
                    sql = session.query(Otpdtl).filter_by(key=key).update({'status':'Verified'})
                    session.commit()
                    session.close()
                    return Response({'response':'Success','message':'OTP Verified'})
                else :
                    session.close()
                    return Response({'response':'Error','message':'Incorrect OTP'})
        else :
            session.close()
            return Response({'response':'Warning','message':'Account already verified'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

# Forgot password

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def fogetPasswordOtp(request):
    session = dbsession.Session()
    try :
        email = request.data['email']
        emailExist = checkEmailExist(email)
        if emailExist == 0:
                return Response({'response':'Error','message':'Account with this email not exist'})
        elif emailExist ==1:
            Otp = generateRandomOTP()
            otp_cre_time = datetime.datetime.now().replace(microsecond=0)
            otp_expire_time = otp_cre_time+datetime.timedelta(minutes = 5)
            Otp = generateRandomOTP()
            otpParams = {
			    "otp_val": Otp , 
			    "otp_cre_time" : otp_cre_time, 
			    "otp_expire_time": otp_expire_time,
                "email":request.data['email'],
		    }
        else :
            print('')
        if Otp :
            result = forgotSendOTP(otpParams)
            if result == True:
                loginDtl = session.query(loginTbl).filter_by(email = email).one()
                keyId = loginDtl.login_id
                otpDtl = Otpdtl()
                otpDtl.email = request.data['email']
                otpDtl.otp = Otp
                otpDtl.type = "Forgot password"
                otpDtl.status = "Pending"
                today = date.today()
                otpDtl.createddate = datetime.datetime.now()
                otpDtl.createdtime = get_current_time()
                key = generate_key_from_name('name')
                otpDtl.key = key
                session.add(otpDtl)
                session.commit()
                session.close()
                return Response({'response':'Success','key':key,'keyid':keyId})
            else :
                session.close()
                return Response({'response':'Error','message':'Cant Send OTP to your given email'}) 
        else :
            session.close()
            return Response({'response':'Error','message':'Something went wrong please try again after sometime'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def foget_PasswordChange(request):
    session = dbsession.Session()
    try :
        email = request.data['email']
        password = request.data['password']
        keyId = request.data['keyid']
        loginDtl = session.query(loginTbl).filter_by(email = email,login_id=keyId).one()
        loginDtl.password =  make_password(request.data['password'])
        session.add(loginDtl)
        session.commit()
        session.refresh(loginDtl)
        if loginDtl.id>0:
            session.close()
            return Response ({'response':'Success','message':'Password changed successfully'})
        else :
            session.close()
            return Response ({'response':'Error','message':"Can't change password"})

    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

# Change password
@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def changePassword(request):
        session = dbsession.Session()
        try :
            oldPassword = request.data['oldpassword']
            newPassword = request.data['newpassword']
            userid = request.data['userid']
            idno = request.data['idno']

            user = session.query(loginTbl).filter(loginTbl.userid == userid).one()
            if user :
                if user.check_password(oldPassword):
                    password = make_password(newPassword)
                    sql = session.query(loginTbl).filter_by(userid=userid,login_id=idno).update({'password':password})
                    session.commit()
                    if sql>0:
                        session.close()
                        return Response({'response':'Success','message':'Password changed successfully'})
                    else :
                        session.close()
                        return Response({'response':'Success','message':"can't change password"})
                else :
                    session.close()
                    return Response({'response':'Error','message':'Old password is incorrect'})
            else :
                session.close()
                return Response({'response':'Success','message':"can't change password"})

        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()



# usefull links

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addUsefullLinks(request):
    try :
        session = dbsession.Session()
        linksObj = usefullLinksTbl()
        if request.data.getlist('image')!=['undefined']:
            for f in request.data.getlist('image'):
                fs = FileSystemStorage()
                filename = fs.save(f.name,f)
                uploaded_file_url = fs.url(filename)
                linksObj.imageurl = uploaded_file_url
        linksObj.description = request.data['description']
        linksObj.link = request.data['link']
        linksObj.status = 'Active'
        linksObj.createddate = datetime.datetime.now()
        session.add(linksObj)
        session.commit()
        session.refresh(linksObj)
        if linksObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getuseFullLinks(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoausefulllinks order by id desc'
        userObj = session.execute(text(sql)).fetchall()
        userObjs = [dict(row) for row in userObj]
        if len(userObjs)>0 :
             session.close()
             return Response({'response':'Success','usefulllinklist':userObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})
@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def get_useFullLinksById(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = 'select * from idpwoausefulllinks where id = "'+id+'"'
        userObj = session.execute(text(sql)).fetchall()
        userObjs = [dict(row) for row in userObj]
        if len(userObjs)>0 :
             session.close()
             return Response({'response':'Success','usefulllinklist':userObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def editUsefullLinks(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        if request.data.getlist('image')!=['undefined']:
            linksObj = session.query(usefullLinksTbl).filter_by(id=id).one()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                # fs = FileSystemStorage(location=categoryFolder)
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    #categorydtl.iconurl = categoryFolder+filename
                    linksObj.imageurl = uploaded_file_url
            linksObj.description = request.data['description']
            linksObj.link = request.data['link']
            session.commit()
            session.refresh(linksObj)
        
            if linksObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Updated successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't update value"})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't update value"})

    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def deleteUsefullLinks(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = session.query(usefullLinksTbl).filter_by(id=id).delete()
        session.commit()
        if sql>0 :
             session.close()
             return Response({'response':'Success','message':'Deleted successfully '})
        else :
            session.close()
            return Response({'response':'Error','message':"can't delete now"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

# Banner

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addbanner(request):
    try :
        session = dbsession.Session()
        bannerObj = bannerTbl()
        if request.data.getlist('image')!=['undefined']:
            for f in request.data.getlist('image'):
                fs = FileSystemStorage()
                filename = fs.save(f.name,f)
                uploaded_file_url = fs.url(filename)
                bannerObj.imageurl = uploaded_file_url
        bannerObj.linkurl = request.data['linkurl']
        bannerObj.status = 'Active'
        bannerObj.createddate = datetime.datetime.now()
        session.add(bannerObj)
        session.commit()
        session.refresh(bannerObj)
        if bannerObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getBannerList(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoabanner order by id desc'
        bannerObj = session.execute(text(sql)).fetchall()
        bannerObjs = [dict(row) for row in bannerObj]
        if len(bannerObjs)>0 :
             session.close()
             return Response({'response':'Success','bannerlist':bannerObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getUserBannerList(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoabanner where status ="Active" order by id desc'
        bannerObj = session.execute(text(sql)).fetchall()
        bannerObjs = [dict(row) for row in bannerObj]
        if len(bannerObjs)>0 :
             session.close()
             return Response({'response':'Success','bannerlist':bannerObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def deleteBanner(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = session.query(bannerTbl).filter_by(id=id).delete()
        session.commit()
        if sql>0 :
             session.close()
             return Response({'response':'Success','message':'Deleted successfully '})
        else :
            session.close()
            return Response({'response':'Error','message':"can't delete now"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def updateBannerStatus(request):
    session = dbsession.Session()
    try :
        id = request.data['id']
        status = request.data['status']
        banner = session.query(bannerTbl).filter_by(id=id).first()
        if banner:
            banner.status = status
            session.commit()
            return Response({'response': 'Success', 'message': 'Updated successfully'})
        else :
            return Response({'response':'Warning','message':'Cant update value try again later'})  
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
        session.close()


# Marque

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addMarque(request):
    try :
        session = dbsession.Session()
        marqueObj = marqueTbl()
        marqueObj.marque = request.data['marque']
        marqueObj.status = 'Active'
        marqueObj.type = request.data['type']
        marqueObj.createddate = datetime.datetime.now()
        session.add(marqueObj)
        session.commit()
        session.refresh(marqueObj)
        if marqueObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getMarqueList(request):
    try :
        session = dbsession.Session()
        type = request.data['type']
        if type == 'All':
            sql = 'select * from idpwoamarque order by id desc'
            marqueObj = session.execute(text(sql)).fetchall()
            marqueObjs = [dict(row) for row in marqueObj]
        else :
            sql = 'select * from idpwoamarque where type="'+type+'" order by id desc'
            marqueObj = session.execute(text(sql)).fetchall()
            marqueObjs = [dict(row) for row in marqueObj]
        if len(marqueObjs)>0 :
             session.close()
             return Response({'response':'Success','marquelist':marqueObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def get_MarqueById(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = 'select * from idpwoamarque where id = "'+id+'"'
        marqueObj = session.execute(text(sql)).fetchall()
        marqueObjs = [dict(row) for row in marqueObj]
        if len(marqueObjs)>0 :
             session.close()
             return Response({'response':'Success','marque':marqueObj})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def editMarque(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        marqueObj = session.query(marqueTbl).filter_by(id=id).one()
        marqueObj.marque = request.data['marque']
        marqueObj.type = request.data['type']
        session.commit()
        session.refresh(marqueObj)
        if marqueObj.id>0 :
            session.close()
            return Response({'response':'Success','message':'Updated successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't update value"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def deleteMarque(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = session.query(marqueTbl).filter_by(id=id).delete()
        session.commit()
        if sql>0 :
             session.close()
             return Response({'response':'Success','message':'Deleted successfully '})
        else :
            session.close()
            return Response({'response':'Error','message':"can't delete now"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})


# About us

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def aboutUs(request):
    try :
        session = dbsession.Session()
        about = session.query(aboutUsTbl).all()
        if about :
            print('inside')
            print(about[0].id)
            aboutObj = session.query(aboutUsTbl).filter_by(id=about[0].id).one()
            aboutObj.about = request.data['about']
            aboutObj.status = 'Active'
            session.commit()
            session.refresh(aboutObj)
            if aboutObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Updated successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't update value"})
        else :
            aboutObj = aboutUsTbl()
            aboutObj.about = request.data['about']
            aboutObj.status = 'Active'
            aboutObj.createddate = datetime.datetime.now()
            session.add(aboutObj)
            session.commit()
            session.refresh(aboutObj)
            if aboutObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Updated successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't update value"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getAboutUs(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoaaboutus order by id desc'
        aboutObj = session.execute(text(sql)).fetchall()
        aboutObjs = [dict(row) for row in aboutObj]
        if len(aboutObjs)>0 :
             session.close()
             return Response({'response':'Success','aboutus':aboutObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def deleteAboutUs(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = session.query(aboutUsTbl).filter_by(id=id).delete()
        session.commit()
        if sql>0 :
             session.close()
             return Response({'response':'Success','message':'Deleted successfully '})
        else :
            session.close()
            return Response({'response':'Error','message':"can't delete now"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

# Contact form

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addContactForm(request):
    try :
        session = dbsession.Session()
        contactObj = contactFormTbl()
        contactObj.fname = request.data['fname']
        contactObj.lname = request.data['lname']
        contactObj.district = request.data['district']
        contactObj.subject = request.data['subject']
        contactObj.status = 'Pending'
        contactObj.createddate = datetime.datetime.now()
        session.add(contactObj)
        session.commit()
        session.refresh(contactObj)
        if contactObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getContactForm(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoacontactform order by id desc'
        contactObj = session.execute(text(sql)).fetchall()
        contactObjs = [dict(row) for row in contactObj]
        if len(contactObjs)>0 :
             session.close()
             return Response({'response':'Success','formlist':contactObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})


# Gallery

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addGallery(request):
    try :
        session = dbsession.Session()
        galleryObj = galleryTbl()
        if request.data.getlist('image')!=['undefined']:
            for f in request.data.getlist('image'):
                fs = FileSystemStorage()
                filename = fs.save(f.name,f)
                uploaded_file_url = fs.url(filename)
                galleryObj.imageurl = uploaded_file_url
        galleryObj.status = 'Active'
        galleryObj.createddate = datetime.datetime.now()
        session.add(galleryObj)
        session.commit()
        session.refresh(galleryObj)
        if galleryObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getgallery(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoagallery order by id desc'
        galleryObj = session.execute(text(sql)).fetchall()
        galleryObjs = [dict(row) for row in galleryObj]
        if len(galleryObjs)>0 :
             session.close()
             return Response({'response':'Success','gallerylist':galleryObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def deleteGallery(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = session.query(galleryTbl).filter_by(id=id).delete()
        session.commit()
        if sql>0 :
             session.close()
             return Response({'response':'Success','message':'Deleted successfully '})
        else :
            session.close()
            return Response({'response':'Error','message':"can't delete now"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})


# Rate chart

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addRateChart(request):
    try :
        session = dbsession.Session()
        chartObj = rateChartTbl()
        if request.data.getlist('file')!=['undefined']:
            for f in request.data.getlist('file'):
                fs = FileSystemStorage()
                filename = fs.save(f.name,f)
                uploaded_file_url = fs.url(filename)
                chartObj.file = uploaded_file_url
        chartObj.district = request.data['district']
        chartObj.description = request.data['description']
        chartObj.status = 'Active'
        chartObj.createddate = datetime.datetime.now()
        session.add(chartObj)
        session.commit()
        session.refresh(chartObj)
        if chartObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getRateChart(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoaratechart order by id desc'
        chartObj = session.execute(text(sql)).fetchall()
        chartObjs = [dict(row) for row in chartObj]
        if len(chartObjs)>0 :
             session.close()
             return Response({'response':'Success','ratechartlist':chartObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def deleteRateChart(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = session.query(rateChartTbl).filter_by(id=id).delete()
        session.commit()
        if sql>0 :
             session.close()
             return Response({'response':'Success','message':'Deleted successfully '})
        else :
            session.close()
            return Response({'response':'Error','message':"can't delete now"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

# upcomming events

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addEvents(request):
    try :
        session = dbsession.Session()
        eventObj = upcommingEvents()
        if request.data.getlist('image')!=['undefined']:
            for f in request.data.getlist('image'):
                fs = FileSystemStorage()
                filename = fs.save(f.name,f)
                uploaded_file_url = fs.url(filename)
                eventObj.imageurl = uploaded_file_url
        eventObj.eventname = request.data['eventname']
        eventObj.status = 'Active'
        eventObj.createddate = datetime.datetime.now()
        session.add(eventObj)
        session.commit()
        session.refresh(eventObj)
        if eventObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getEvents(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoaupcommingevents order by id desc'
        chartObj = session.execute(text(sql)).fetchall()
        chartObjs = [dict(row) for row in chartObj]
        if len(chartObjs)>0 :
             session.close()
             return Response({'response':'Success','ratechartlist':chartObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def deleteEvents(request):
    try :
        session = dbsession.Session()
        id = request.data['id']
        sql = session.query(upcommingEvents).filter_by(id=id).delete()
        session.commit()
        if sql>0 :
             session.close()
             return Response({'response':'Success','message':'Deleted successfully '})
        else :
            session.close()
            return Response({'response':'Error','message':"can't delete now"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

# Dashboard


@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getDashboardCounts(request):
    try :
        session = dbsession.Session()
        sql = 'select count(id) from idpwoauserregistartion where status ="Active"'
        membersObj = session.execute(text(sql)).fetchall()
        membersObjs = membersObj[0][0]
        
        sql1 = 'select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.id,idpwoauserregistartion.fname,idpwoauserregistartion.lname from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="Inactive" order by id desc limit 5'
        requestObj = session.execute(text(sql1)).fetchall()
        requestObjs = [dict(row) for row in requestObj]
        
        sql1 = 'select * from idpwoaupcommingevents order by id desc limit 5'
        eventsObj = session.execute(text(sql1)).fetchall()
        eventsObjs = [dict(row) for row in eventsObj]
        
        if len(membersObj)>0 :
             session.close()
             return Response({'response':'Success','membesrscount':membersObjs,'openingbalance':0,'income':0,'expense':0,'userrequests':requestObjs,'events':eventsObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})



