Sindbad~EG File Manager

Current Path : /home/numerotech/test-abs.numerotech.com/common_abs_v2/core/controller/
Upload File :
Current File : //home/numerotech/test-abs.numerotech.com/common_abs_v2/core/controller/UserController.py

from flask import Flask, request, Blueprint, jsonify, redirect, url_for,flash, render_template,session, app, json
from .. import Cryptography,Auth,RouteGroup
from random import randint
from collections import defaultdict
import math, random
import time
from urllib.parse import unquote
import datetime
from core.library.helper import Helper
from datetime import timedelta,date,datetime
from dateutil.rrule import rrule, DAILY
import ast
import requests
""" Library """
from core.library.email import EMAIL
""" Models """
from core.model.UserModel import UserModel
from core.model.AbstractModel import AbstractModel
from core.model.BoModel import BoModel
import boto3, botocore
from botocore.exceptions import ClientError
import logging
from os import listdir
from os.path import join, dirname, realpath
import os
from os import path
from werkzeug.utils import secure_filename
from functools import reduce

# name : Mukesh kumar
# version : 1
# title: abstract submission
# date:07/02/2022 01:14
# demo site url = https://abstracts.TNOA.in/abstracts?type=VS

app = Blueprint('user', __name__)

# Autologin for BackOffice Dashboard 

# Backoffice login page
@app.route('/test', methods = ["GET", "POST"])
def Test():
	return "test"    


@app.route('<conf_id>/<conf_key>/admin/at/<uuid>/<timestamp>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def autoLoginForBackoffice(conf_id,conf_key,uuid,timestamp):
	timestamp = round(int(timestamp[:-3]))
	timestamp = datetime.fromtimestamp(int(timestamp))
	if timestamp and (datetime.now() < timestamp):
		user_data = UserModel().get_user_data_by_uuid(uuid)
		if user_data:
			society_id = Auth.get_conference(conf_id).get("society_id")
			society = UserModel().get_society(society_id)
			email = user_data["email"]
			bo_access = UserModel().check_bo_access(email,3,society_id,conf_id)
			user_data["is_admin"] =  bo_access["is_admin"]
			user_data["admin_type"] = bo_access["admin_type"]
			Auth.login(user_data,society_id)
			Auth.society(society,conf_id)
			return redirect(url_for("backoffice.bo_dashboard",conf_id=conf_id,conf_key=conf_key))
		else:
			return redirect(url_for('user.Login',conf_id = conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.Login',conf_id = conf_id,conf_key=conf_key))

""" Strating page """ 

# Backoffice login page
@app.route('/admin', methods = ["GET", "POST"])
def Admin():
	app_host = request.host
	host_data = UserModel().get_conference_by_host(app_host)
	if host_data:
		if Auth.check(host_data['society_id']):
			return redirect(url_for('backoffice.bo_dashboard',conf_id=host_data["conf_id"],conf_key=host_data["conf_key"]))
		else:
			return redirect(url_for("user.getBOLogin",conf_id=host_data["conf_id"],conf_key=host_data["conf_key"]))
	else:
		return "Application not found"  

@app.route('/<conf_id>/<conf_key>/admin', methods = ["GET"])
@RouteGroup.conf_required
def bologinconf(conf_id,conf_key):
	society_id = Auth.get_conference(conf_id).get("society_id")
	if Auth.check(society_id):
		return redirect(url_for('backoffice.bo_dashboard',conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for("user.getBOLogin",conf_id=conf_id,conf_key=conf_key))

@app.route('/bologin/<conf_id>/<conf_key>',methods = ["GET"])
@RouteGroup.conf_required
def getBOLogin(conf_id,conf_key):
	return render_template('backoffice/bo_login.html',conf_id=conf_id,conf_key=conf_key)

@app.route('/bologin/<conf_id>/<conf_key>', methods = ["POST"])
@RouteGroup.conf_required
def postBOLogin(conf_id,conf_key):
	if request.method == "POST":
		email       = request.values.get('email')
		password    = request.values.get('password')
		society_id  = Auth.get_conference(conf_id).get("society_id")
		society     = UserModel().get_society(society_id)
		userData   = UserModel().get_users_email_data(email,society_id)
		bo_access   = UserModel().check_bo_access(email,3,society_id,conf_id)
		if userData:
			db_pass =  userData['password']
			if password == db_pass:
				if bo_access['is_admin']== 1:
					userData["is_admin"] =  bo_access["is_admin"]
					userData["admin_type"] = bo_access["admin_type"]
					Auth.login(userData,society_id)
					Auth.society(society,conf_id)
					return redirect(url_for("backoffice.bo_dashboard",conf_id=conf_id,conf_key=conf_key))
				else:
					flash("Please enter correct Email id","errorMsg")
			else : 
				flash('Passsword invalid. Please check the password.','errorMsg' )
		else:
			flash("Email id is not registered with us.","errorMsg" )
		return render_template('backoffice/bo_login.html',conf_id=conf_id,conf_key=conf_key)
	else:
		flash("Please, Try again.","errorMsg")
		return redirect (url_for('user.getBOLogin',conf_id=conf_id,conf_key=conf_key))
		
@app.route('/', methods = ["GET", "POST"])
def Home_index():
	host = request.host
	host_data = UserModel().get_conference_by_host(host)
	if host_data:
		return redirect(url_for("user.Home",conf_id=host_data["conf_id"],conf_key=host_data["conf_key"]))
	else:
		return "Application not found"


@app.route('/<int:conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def Home(conf_id,conf_key):
	society_id = Auth.get_conference(conf_id).get("society_id")
	if Auth.check(society_id):
		return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.Login',conf_id = conf_id,conf_key=conf_key))


@app.route('<conf_id>/<conf_key>/at/<uuid>/<timestamp>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def autoLoginFromDashboard(conf_id,conf_key,uuid,timestamp):
	timestamp = round(int(timestamp[:-3]))
	timestamp = datetime.fromtimestamp(int(timestamp))
	if timestamp and (datetime.now() < timestamp):
		user_data = UserModel().get_user_data_by_uuid(uuid)
		if user_data:
			confe      = UserModel().get_confe(conf_id,conf_key)
			delData    = UserModel().get_delegate_app(conf_id)
			del_url    = None
			if delData:
				del_url = delData['app_url']
			if confe:
				confe['del_url'] = del_url
			
			society_id = Auth.get_conference(conf_id).get("society_id")
			society = UserModel().get_society(society_id)
			email = user_data["email"]
			bo_access = UserModel().check_bo_access(email,3,society_id,conf_id)
			user_data["is_admin"] =  bo_access["is_admin"]
			user_data["admin_type"] = bo_access["admin_type"]
			Auth.login(user_data,society_id)
			Auth.society(society,conf_id)
			Auth.conference(confe,conf_id)
			return redirect(url_for("DB.Dashboard",conf_id=conf_id,conf_key=conf_key))
		else:
			return redirect(url_for('user.Login',conf_id = conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.Login',conf_id = conf_id,conf_key=conf_key))

   
""" Login and logout functions """
@app.route('/login/<int:conf_id>/<conf_key>')
@RouteGroup.conf_required
def Login(conf_id,conf_key):
	society_id = Auth.get_conference(conf_id).get("society_id")
	if Auth.check(society_id):
		return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
	else:
		confe   = UserModel().get_confe(conf_id,conf_key)
		delData = UserModel().get_delegate_app(conf_id)
		del_url = None
		if delData:
			del_url = delData['app_url']
		if confe:
			confe['del_url'] = del_url
			Auth.conference(confe,conf_id)
			society = UserModel().get_society(confe["society_id"])
			Auth.society(society,conf_id)
			#ToDo: will remove auth society
			return render_template('users/login_screen.html',confe=confe,conf_id=conf_id,conf_key=conf_key)
		else:
			return ("<html><h1>Invalid URL</h1></html>")

@app.route('/logout/<conf_id>/<conf_key>', methods = ["GET", "POST"])
@app.route('/<conf_id>/<conf_key>/logout', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
def Logout(conf_id,conf_key):
	society_id = Auth.get_conference(conf_id).get("society_id")
	Auth.logout(society_id)
	return redirect(url_for('user.Login',conf_id=conf_id,conf_key=conf_key ))

""" END Login and Logout functions """

@app.route('/<society_id>/<conf_id>/<conf_key>/autologin/<uuid>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def Auto_Login(society_id,conf_id,conf_key,uuid):
	conference_detail = UserModel().get_confe(conf_id,conf_key)
	if conference_detail and conference_detail["conf_key"] == conf_key:
		user_data = UserModel().get_user_data_by_uuid(uuid)
		if user_data:
			society = UserModel().get_society(society_id)
			email = user_data["email"]
			bo_access = UserModel().check_bo_access(email,3,society_id,conf_id)
			user_data["is_admin"] =  bo_access["is_admin"]
			user_data["admin_type"] = bo_access["admin_type"]
			Auth.login(user_data,society_id)
			delData    = UserModel().get_delegate_app(conf_id)
			del_url    = None
			if delData:
				del_url = delData['app_url']
			if conference_detail:
				conference_detail['del_url'] = del_url
			Auth.conference(conference_detail,conf_id)
			Auth.society(society,conf_id)
			return redirect(url_for("DB.Dashboard",conf_id=conf_id,conf_key=conf_key))
		return("User not found")
	return("Page Not Found")


#ToDo: Following dashboard function move to dashboard controller 

@app.route('/pos_login/<conf_id>/<conf_key>',methods = ["POST"])
@RouteGroup.conf_required
def Post_login(conf_id,conf_key):
	if request.method == "POST":
		confData  = Auth.get_conference(conf_id)
		email     = request.form['email']
		conf_id   = request.form['conf_id']
		conf_key  = request.form['conf_key']
		if  not email :
			flash('Please enter your registered email ')
			return redirect (url_for('user.Login',conf_id=conf_id,conf_key=conf_key))
		else :
			society_id  = confData['society_id']
		   
			user_output = UserModel().get_users_email_data(email,society_id)
		   

			if user_output : 
				Auth.login(user_output,society_id)
				user_id     = user_output["user_id"]                
				encrypt_user_id  = Cryptography.encrypt(int(user_output["user_id"]))
			else:
				
				insert  = UserModel().insert_new_user(email,society_id)
				# insert system logs
				system_data   = request.headers.get("user-agent")
				ip_add        = request.headers.get('X-Forwarded-For', request.remote_addr)
				route_name = request.path
				route_name = route_name[1:]
				app_url_1  = request.host_url
				if "https" in app_url_1:
					pass
				else:
					app_url_1 = app_url_1.replace("http","https")   

				app_url = app_url_1+route_name
				params        = "system_log?society_id="+str(society_id)+"&conf_id="+str(conf_id)+"&email="+email+"&app_type=ABSTRACT&app_url="+app_url+"&ip_add="+ip_add+"&system_data="+system_data
				api_url      = "https://conference.numerotech.com/" +params
				result = requests.get(api_url)
				res = result.text
				res = json.loads(res)
				#end
				
				user_id = insert["user_id"] 
				encrypt_user_id  = Cryptography.encrypt(int(insert["user_id"]))
			  
					# flash("Sorry. We cannot find a membership record matching the given email id.  For assistance,  please write to "+confData['e_support_email'] )
					# return redirect (url_for('user.Login',conf_id=Auth.get_conference(conf_id).get('conf_id'),conf_key=Auth.get_conference(conf_id).get('conf_key'))) 
					# return redirect (url_for('user.Login',conf_id=conf_id,conf_key=conf_key)) 

				# insert  = UserModel().insert_new_user(email,society_id)
				# user_id = insert[0]["user_id"] 
				# encrypt_user_id  = Cryptography.encrypt(int(insert[0]["user_id"]))

			SendOtpMail(user_id,conf_id)
			if Auth.check(society_id):
				Auth.logout(society_id)
			return redirect (url_for('user.OtpPage',user_id=encrypt_user_id,conf_id=conf_id,conf_key=conf_key)) 
	return redirect(url_for('user.Login',conf_id=conf_id,conf_key=conf_key ))

@app.route('/Post_login_psw/<conf_id>/<conf_key>', methods = ["GET","POST"])
@RouteGroup.conf_required
def PostLogin_psw(conf_id,conf_key):
	if request.method == "POST":
		email           = request.form.get('email' or None)
		password        = request.form.get('password' or None)
		confData        = Auth.get_conference(conf_id)
		society_id      = confData['society_id']   
		user_output     = UserModel().get_users_email_data(email,society_id)
		if user_output : 
			db_pass =  user_output['password']
			if password == db_pass:
				user_id = user_output['user_id']
				email     = user_output["email"] 
				bo_access = UserModel().check_bo_access(email,3,society_id,conf_id)
				user_output["is_admin"] =  bo_access["is_admin"]
				user_output["admin_type"] = bo_access["admin_type"]
				Auth.login(user_output,society_id)
				user_id= Cryptography.encrypt(user_id)
				return redirect (url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key)) 
			else : 
				flash('Passsword invalid. Please check the password.','errorMsg' )
				return redirect(url_for('user.Login',conf_id=conf_id,conf_key=conf_key))
		else:
			flash("Email id is not registered with us. Please login with otp","errorMsg" )
			return redirect(url_for('user.Login',conf_id=conf_id,conf_key=conf_key))
	else :
		flash('Please enter email ','errorMsg')
		return redirect(url_for('user.Login',conf_id=conf_id,conf_key=conf_key))


@app.route('/otp_page/<user_id>/<conf_id>/<conf_key>', methods = ["GET","POST"])
@RouteGroup.conf_required
def OtpPage(user_id,conf_id,conf_key):
	society_id = Auth.get_conference(conf_id).get("society_id")
	if Auth.check(society_id):
		return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
	else:
		encrypt_user_id = unquote(user_id)
		user_id         = Cryptography.decrypt(user_id)
		user_id         = int(user_id)
		return render_template('users/otp_new.html',encrypt_user_id=encrypt_user_id,user_id=user_id,conf_id=conf_id,conf_key=conf_key)
	
@app.route('/resend_otp/<user_id>/<conf_id>/<conf_key>', methods = ["GET","POST"])
@RouteGroup.conf_required
def Resend_otp(user_id,conf_id,conf_key):
	encrypt_user_id = unquote(user_id)
	user_id         = int(Cryptography.decrypt(user_id)) 
	SendOtpMail(user_id,conf_id)
	return redirect (url_for('user.OtpPage',user_id = encrypt_user_id,conf_id=conf_id,conf_key=conf_key)) 

def SendOtpMail(user_id,conf_id):
	random.seed(time.perf_counter())
	now         = datetime.now()
	user        = UserModel().get_otp_random(user_id) # db call 1
	conf_data = session.get('conference'+str(conf_id))
	if user['otp']: 
		otp_random = user['otp']
	else : 
		otp_random  = random.randint(1000,9999)

	otp_sent_at     = now
	otp_expire_on   = now + timedelta(minutes=30)
	otp_expire_at   = otp_expire_on
	data            = {'otp_expire_on' : otp_expire_on,'otp_sent_at':otp_sent_at,'otp' : otp_random}
	user            = UserModel().update_member(user_id,data) # db call 2

	if user :
		# otp_expire_on=  datetime.strptime(str(otp_expire_on), "%Y-%m-%d %H:%M:%S.%f").strftime('%d-%m-%Y  %H:%M:%S.%f')
		# period = otp_expire_at.strftime('%p')
		# hour = otp_expire_at.strftime('%I')
		# date = datetime.strptime(str(otp_expire_on), "%d-%m-%Y  %H:%M:%S.%f")
		# if len(str(date.minute)) == 1:
		#   minute = "0"+str(date.minute)
		# else:
		#   minute = date.minute
		# month_num = date.month
		# datetime_object = datetime.strptime(str(month_num), "%m")
		# full_month_name = datetime_object.strftime("%B")
		date            = otp_expire_on.strftime("%d %B %Y %I:%M %p")
		if conf_data  :
			conf_name   = conf_data["conf_name"]
			header_logo = conf_data["header_logo"]

			support_email = conf_data["e_support_email"]

		template_name = 'abs_otp_mail'
		mailData = UserModel().get_mail_templates(template_name,conf_id)
		sub_data = {
			'otp_random' : str(otp_random),
			'conf_name'  : conf_name,
			'date'       : date
		}
		# subject = str(otp_random)+"- OTP for "+ conf_name +" Abstract submission , valid upto "+str(date)
		subject = Helper.merge_tags(mailData.subject,sub_data)
		data_1    = {'otp' : str(otp_random),'conf_name':conf_name,'header_logo':header_logo,'support_email':support_email,'otp_expire_at':otp_expire_at}
		mail_data = {
			'mail_content':mailData.mail_content,
			'data' : user,
			'data_1':data_1,
			'confData':conf_data

		}
		mail_content = Helper.convert_html_for_mail_screen(mail_data)
		to   = user["email"]
		html = render_template('users/email/mail_template.html',is_layout=mailData.is_layout,mail_content=mail_content)
		EMAIL.sendMail_v1(subject,html,to,mailData,conf_id)
		flash("An OTP has been sent to your email id "+ Helper.email_mask(to),'success')
		return "success"

	else : 
		return "fail"



@app.route('/otp/<user_id>/<conf_id>/<conf_key>', methods = ["GET","POST"])
@RouteGroup.conf_required
def Otp(user_id,conf_id,conf_key):
	society_id = Auth.get_conference(conf_id).get("society_id")
	if Auth.check(society_id):
		return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
	else:
		user_id     = unquote(user_id)
		user_id     = int(Cryptography.decrypt(user_id))
		now         = datetime.now()
		pin_1       = request.values.get('input1')
		otp         = pin_1
		userData  = UserModel().get_member(user_id) # db call 1
		society_id = Auth.get_conference(conf_id).get("society_id")
		encrypt_user_id  = Cryptography.encrypt(int(user_id))
		email = userData["email"]
		bo_access = UserModel().check_bo_access(email,3,society_id,conf_id)
		userData["is_admin"] =  bo_access["is_admin"]
		userData["admin_type"] = bo_access["admin_type"]
		if userData["email"] == Helper.testmail and int(otp) == 9999 :
			Auth.login(userData,society_id)
			return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
			
		if userData["email"] in Helper.master_email_ids:
			Auth.login(userData,society_id)
			return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
		try:
			if(int(otp) == userData['otp']) :
				data    = {'otp' : None, 'otp_verified_at':now}
				expire_on_db  = UserModel().update_member(user_id,data) # db call 2
				otp_expire_on   = datetime.strptime(str(expire_on_db['otp_expire_on']),'%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')
				if str(now)>str(otp_expire_on):
					flash("Expired!OTP valid for 30 mintue")
					return render_template('users/otp_new.html',encrypt_user_id=encrypt_user_id,user_id=user_id,conf_id=conf_id,conf_key=conf_key)
				else:
					Auth.login(userData,society_id)
					return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
			else:
				flash("Incorrect OTP.  Please provide the correct OTP",'danger')
				return render_template('users/otp_new.html',encrypt_user_id=encrypt_user_id,user_id=user_id,conf_id=conf_id,conf_key=conf_key)
		except:
			flash("Incorrect OTP.  Please provide the correct OTP",'danger')
			return render_template('users/otp_new.html',encrypt_user_id=encrypt_user_id,user_id=user_id,conf_id=conf_id,conf_key=conf_key)


@app.route('/send_request/<conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
def Send_request(conf_id,conf_key):
	author_name  = request.values.get('author_name')
	author_email = request.values.get('author_email')
	abs_id       = request.values.get('abs_id')
	abs_type     = request.values.get('abs_type')
	role_id      = request.values.get('role_id')
	chg_coi      = request.values.get('chg_coi') or 0
	society_id   = Auth.get_conference(conf_id).get("society_id")
	user         = Auth.get_user(society_id)
	prefix       = user.get('prefix')
	full_name    = user.get('full_name')
	full_name    = prefix+full_name
	subject      = full_name+" wants to add you to his abstract."
	data         ={
	'name' : author_name,
	'email': author_email,
	}
	society_id   = Auth.get_conference(conf_id).get('society_id')
	data         = UserModel().insert_new_request_user(data,society_id)
	user_id      = data["user_id"]
	email        = author_email
	html         = render_template('users/email/request_user.html',name=full_name,author_name=author_name,author_email=author_email,conf_id=conf_id)
	EMAIL.sendMail(subject,html,email,conf_id)
	if int(chg_coi) == 1:
		return jsonify(user_id)
	if abs_type == 'IC':
		return redirect(url_for('main.Step3model',searchvalue=user_id,abs_type=abs_type,conf_id=conf_id,conf_key=conf_key))
	return redirect(url_for('main.Add_update_Presenting_author',user_id=user_id,abs_id=abs_id,abs_type=abs_type,role_id=role_id,conf_id=conf_id,conf_key=conf_key))
	

@app.route('/send_request_v1/<conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
def Send_request_v1(conf_id,conf_key):
	author_name  = request.values.get('author_name')
	author_email = request.values.get('author_email')
	author_mobile = request.values.get('author_mobile') or None
	author_affiliation = request.values.get('author_affiliation')
	author_city = request.values.get('author_city')
	author_country= request.values.get('author_country')
	abs_id       = request.values.get('abs_id')
	abs_type     = request.values.get('abs_type')
	role_id      = request.values.get('role_id')
	mobile_isd_code  = request.values.get("mobile_isd_code",None) or None
	society_id   = Auth.get_conference(conf_id).get("society_id")
	user         = Auth.get_user(society_id)
	prefix       = user.get('prefix')
	full_name    = user.get('full_name')
	full_name    = prefix+full_name
	subject      = full_name+" wants to add you to his abstract."
	data         ={
	'prefix'          : 'Dr.',
	'full_name'       : author_name,
	'email'           : author_email,
	'mobile'          : author_mobile,
	'affiliation'     : author_affiliation,
	'city'            : author_city,
	'country'         : author_country,
	'mobile_isd_code' : mobile_isd_code,
	'society_id'      : society_id,
	'created_at'      : datetime.now()
	}
	
	data         = UserModel().insert_new_request_user_v1(data,society_id)
	user_id      = data["user_id"]
	# email        = author_email
	# html         = render_template('users/email/request_user.html',name=full_name,author_name=author_name,author_email=author_email,conf_id=conf_id)
	# EMAIL.sendMail(subject,html,email,conf_id)
	if abs_type == 'IC':
		return redirect(url_for('main.Step3model',searchvalue=user_id,abs_type=abs_type,conf_id=conf_id,conf_key=conf_key))
	return redirect(url_for('main.Add_update_Presenting_author',user_id=user_id,abs_id=abs_id,abs_type=abs_type,role_id=role_id,conf_id=conf_id,conf_key=conf_key))


# profile update application type

@app.route('/Profile_update/<conf_id>/<conf_key>', methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
def Profile_update(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	society_id = confData["society_id"]
	user_id    = Auth.get_user(society_id).get('user_id')
	data       = UserModel().get_member(user_id)
# 	if int(conf_id) == 52 and data['member_type_id']!=2:
# 		user_uuid = Auth.get_user(society_id).get('user_uuid')
# 		host      = "https://abs.kosonline.org/52/koscon24"
# 		return redirect('https://profile.kosonline.org/10/kos/at/app/'+user_uuid+'?r_url="'+host+'"')

	if int(society_id) in [1,2,3,10,18,17] and data['member_type_id']!=2:
		user_uuid   = Auth.get_user(society_id).get('user_uuid')
		host        = confData["app_url"]
		profileData = UserModel().get_profileupdate_app(society_id)
		if profileData and profileData['app_url']:
			return redirect(profileData['app_url']+"/at/app/"+user_uuid+"?r_url='"+host+"'")
	
	location_data     = UserModel().get_state_and_country()    # db call 2
	isd_country_data  = UserModel().get_country_isd_code()
	state             = location_data[0]
	country           = location_data[1]
	attachData = UserModel().get_image(user_id,society_id)
	attachmentData = ""
	if int(conf_id) in [49] and attachData:
		attachmentData = render_template('users/society_attachment.html',img=attachData)
	if int(conf_id) != 58:
		return render_template('users/profile_update.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key,attachmentData=attachmentData)
	else:
		return render_template('users/profile_update_isoo.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key,isd_country_data=isd_country_data)



@app.route('/get_state',methods=["GET","POST"])
def Get_state():
	country_id = request.values.get("country_id")
	if country_id:
		state_data = UserModel().get_country_data(country_id)
		return jsonify(state_data)
	else:
		pass
	return jsonify()

@app.route('/post_Profile_update/',methods=["GET","POST"])
def Post_edit():
	if request.method == "POST":
		conf_id      = request.values.get("conf_id")
		confData     = Auth.get_conference(conf_id)
		society_id   = confData['society_id']
		conf_key     = request.values.get("conf_key")
		user_id      = request.values.get("user_id",None)
		
		year         = request.form.get("year",None)
		month        = request.form.get("month",None)
		date         = request.form.get("date",None)
		dob          = None;
		if year and month and date :
			dob =  datetime.strptime(year+"-"+month+"-"+date,'%Y-%m-%d')
		
		

		data={
		'prefix'            : request.form.get("prefix",None) or None,
		'full_name'         : request.form.get("name",None),
		'mobile'            : request.values.get("mobile",None) or None,
		'gender'            : request.form.get("gender",None),
		'dob'               : dob,
		'phone_home'        : request.form.get("phone_home",None),
		'phone_office'      : request.form.get("phone_office",None),
		'address1'          : request.form.get("Address1",None),
		'address2'          : request.form.get("Address2",None),
		'address3'          : request.form.get("Address3",None),
		'state_id'          : request.values.get("state",None) or None,
		'country_id'        : request.values.get("country",None) or None,
		'city'              : request.values.get("city",None),
		'district'          : request.values.get("district",None),
		'pincode'           : request.form.get("pincode",None),
		'whatsapp_number'   : request.form.get("whatsapp_number",None),
		'mc_number'         : request.form.get("mc_number",None),
		'mc_state_id'       : request.form.get("mc_state",None) or None,
		'profile_updated_at': datetime.now(),
		'institution'       : request.form.get("institution",None),
		'affiliation'       : request.values.get("affiliation",None),
		'mobile_isd_code'   : request.values.get("mobile_isd_code",None),
		'designation'       : request.form.get("designation",None),
		
		# 'hos_name'    : request.form.get("hos_name",None),
		# 'hos_address1' : request.form.get("hos_address1",None),
		# 'hos_address2' : request.form.get("hos_address2",None),
		# 'hos_address3' : request.form.get("hos_address3",None),
		# 'hos_city'    : request.form.get("hos_city",None),
		# 'hos_state'   : request.values.get("hos_state",None),
		# 'hos_email'   : request.form.get("hos_email",None),
		# 'hos_contact' : request.form.get("hos_contact",None),
		# 'hos_whatsappnumber' : request.form.get("hos_whatsappnumber",None),
		# 'hos_profile_pic_visible' : request.form.get("hos_profile_pic_visible",None),
		}
		# file = request.files['files']
		if int(conf_id) == 32 :
			data['membership_no'] = request.form.get("membership_no",None)
			data['member_of_state'] = request.form.get("member_state",None)
		
		if int(conf_id) ==  58 :
			membership_no = request.values.get("membership_no",None) or None
			if membership_no:
				member_type_id = 1
			else:
				member_type_id = 2
			data['membership_no'] = membership_no
			data['member_type_id'] = member_type_id


		if int(conf_id) == 49 :
			membership_no = request.values.get("membership_no",None) or None
			member_type_id = 2
			
			if membership_no:
				member_type_id = 1
			else:
				attachData = UserModel().get_user_image(user_id)
				if attachData:
					member_type_id = 1
# 			print(member_type_id)
			data['membership_no']  = membership_no
			data['member_type_id'] = member_type_id
			
		file = []
		whats_app_dupli = whats_app_duplicate(data["whatsapp_number"],user_id,society_id) # db call 1
		location_data = UserModel().get_state_and_country()    # db call 2
		isd_country_data  = UserModel().get_country_isd_code()
		state   = location_data[0]
		country = location_data[1]
		if whats_app_dupli == 1:
			flash("Whatsapp number already exists for a different profile.  Please provide an alternate number or contact support by writing to "+str(confData['support_email']))
			data['user_id'] = user_id
			if int(conf_id) != 58:
				return render_template('users/profile_update.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key)
			else:
				return render_template('users/profile_update_isoo.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key,isd_country_data=isd_country_data)  
		else:
			mobile_count = 0
			if data["mobile"]:
				mobile_count = UserModel().get_mobile_count(data["mobile"],user_id,society_id) # db call 4
			if mobile_count > 0 :
				flash("Mobile number already exists for a different profile.  Please provide an alternate number or contact support by writing to "+str(confData['support_email']))
				data['user_id'] = user_id
				if int(conf_id) != 58:
					return render_template('users/profile_update.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key)
				else:
					return render_template('users/profile_update_isoo.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key,isd_country_data=isd_country_data)  
			else :
				data = UserModel().update_member(user_id,data)  # db call 5
				email = data["email"]
				bo_access = UserModel().check_bo_access(email,3,society_id,conf_id)
				data["is_admin"] =  bo_access["is_admin"]
				Auth.login(data,society_id)
				if file :
					acl="public-read"
					s3 = boto3.client("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='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')
					filename = secure_filename(file.filename)
					file_extension = os.path.splitext(filename)[1]
					file_str = "Photograph"+file_extension
					if " " in file_str :
						file_str  = file_str.replace(" ","")
					else :
						pass

					try:
						bucket     = bucketname
						foldername = "user_attachment"
						file_path  = "https://"+bucketname+".s3-ap-southeast-1.amazonaws.com/"+foldername+"/"+str(user_id)
						data_1     = {
									'attach_path'      : file_path,
									'attach_file_name' : file_str,
									'attach_type_id'   : Helper.attch_type_id,
									 }
						update_data = UserModel().update_attachemant(user_id,data_1,str(datetime.now())) 
						response   = s3.upload_fileobj(file, bucket,foldername+'/'+str(user_id)+'/'+ file_str, ExtraArgs={"ACL": acl,"ContentType": file.content_type})
					except ClientError as e:
						logging.error(e)
						flash("Image upload failed.")
						data['user_id'] = user_id
						if int(conf_id) != 58:
							return render_template('users/profile_update.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key)
						else:
							return render_template('users/profile_update_isoo.html',data=data,state=state,country=country,str=str,conf_id=conf_id,conf_key=conf_key,isd_country_data=isd_country_data)  
				else :
					pass
			flash('Your profile has been updated','success')
			return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.Profile_update',conf_id=conf_id,conf_key=conf_key))
		
def whats_app_duplicate(whatsapp_no,user_id,society_id):
	if whatsapp_no:
		count_whatsapp_num = UserModel().count_whatsapp_num(whatsapp_no,user_id,society_id)
		if count_whatsapp_num[0] > 0:
			return 1
		else:
			return "success"
	else:
		return "success"

@app.route('/abs_daily_report/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def Abs_daily_report(conf_id,conf_key):
	return "No Function"
#   send_manual    = request.values.get('send_manual',None)
#   current_tm     = datetime.now()
#   if send_manual and int(send_manual) == 1 :
#       call function here
#       sendAbsReport(conf_id,conf_key)
#   else :
#       if (current_tm.hour == 9 and current_tm.minute > 45) or (current_tm.hour == 10 and current_tm.minute < 25):
#           print(str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time match")
# #             call function here
#           sendAbsReport(conf_id,conf_key)
#       else:
#           print(str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time not match ")
#           return ( str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time not match ")
#   return ("mail sent at "+str(current_tm.strftime('%d-%m-%Y %H:%M:%S')))

def sendAbsReport(conf_id,conf_key):
	now_date   = datetime.now()
	previous_date       = now_date+ timedelta(days=-1)
	pre_date = previous_date.strftime('%Y-%m-%d')
	check_abs = UserModel().check_abs_types(now_date,conf_id)
	if check_abs:
		report_data= UserModel().get_daily_report(pre_date,conf_id)
		report     = report_data[0]
		user_data  = report_data[1]
		conf_data  = report_data[2][0]
		Auth.conference(conf_data,conf_id)
		print(report_data)
		html       = render_template('users/email/daily_report.html',data=report,conf_id=conf_id,conf_key=conf_key,date_today=previous_date.strftime('%d-%m-%Y'),now_date=now_date.strftime('%d-%m-%Y %I:%M %p'),conf_data=conf_data)
		subject    = conf_data["conf_name"].upper() + " - Abstract Submission Count as on " + now_date.strftime('%d-%m-%Y')
		if user_data:
			# email=[]
			for i in user_data:
				# email.append(i["email"])
				email = i["email"]
				EMAIL.sendMail(subject,html,email,conf_id)
			return "Mail send successfully"     
		else:
			return "users Not found"
	else:
		return "Abstract Not found"

# def sendAbsReport(conf_id,conf_key):
#   now_date   = datetime.now()
#   previous_date       = now_date+ timedelta(days=-1)
#   check_abs = UserModel().check_abs_types(now_date,conf_id)
#   if check_abs:
#       report_data= UserModel().get_daily_report(previous_date,conf_id)
#       report     = report_data[0]
#       user_data  = report_data[1]
#       conf_data  = report_data[2]
#       Auth.conference(conf_data[0],conf_id)
#       html       = render_template('users/email/daily_report.html',data=report,conf_id=conf_id,conf_key=conf_key,date_today=previous_date.strftime('%d-%m-%Y'),now_date=now_date.strftime('%d-%m-%Y'),conf_data=conf_data[0])
#       subject    = conf_key.upper() + " - Abstracts Submission Counts as on " + now_date.strftime('%d-%m-%Y')
#       if user_data:
#           email=[]
#           for i in user_data:
#               email.append(i["email"])
#           EMAIL.sendMail(subject,html,email,conf_id)
#           return "Mail send successfully"     
#       else:
#           return "users Not found"
#   else:
#       return "Abstract Not found"

@app.route('/view/<conf_id>/<conf_key>/<abs_type>/<abs_no>',methods=["GET","POST"])
@RouteGroup.conf_required
def Public_view(conf_id,conf_key,abs_type,abs_no):
	data               = UserModel().get_abstract_data(conf_id,abs_no,abs_type)
	abs_data           = data[0]
	presenting_author  = data[1]
	co_author_data     = data[2]
	try:
		if abs_data:
			return render_template('backoffice/public_view/'+abs_type+'_view.html',data=abs_data[0],presenting_author=presenting_author,co_author_data=co_author_data,conf_id=conf_id,conf_key=conf_key)
		else:
			return "Abstract Not found"
	except:
		return " Abstract not configured "


@app.route('/commitment/speakers/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def Commitment_search(conf_id,conf_key):
	search_word = request.values.get('search_word' , None)
	data = UserModel().get_commitment_data_search_public(conf_id,search_word)
	return render_template('/backoffice/abstract/commitment/search_commitment.html',data=data,conf_id=conf_id,conf_key=conf_key,search_word=search_word)

@app.route('/commitment/view/<conf_id>/<conf_key>/<user_id>',methods=["GET","POST"])
@RouteGroup.conf_required
def Commitment_view(conf_id,conf_key,user_id):
	user_id      = int(Cryptography.decrypt(unquote(user_id)))
	report_type  = None
	start_date   = None
	end_date     = None
	data    = BoModel().get_user_commitment_data_public(conf_id,user_id,report_type,start_date,end_date)
	abs_data = data[1]
	user_data = data[0][0]
	return render_template('/backoffice/abstract/commitment/commitment_view.html',abs_data=abs_data,user_data=user_data,conf_id=conf_id,conf_key=conf_key)



@app.route('/all_commitment/view/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def All_Commitment_view(conf_id,conf_key):
	user_id  = None
	report_type  = None
	start_date   = None
	end_date     = None
	data    = BoModel().get_user_commitment_data(conf_id,user_id,report_type,start_date,end_date)
	abs_data = data[0]
	user_data = {}
	return render_template('/backoffice/abstract/commitment/commitment_view.html',abs_data=abs_data,user_data=user_data,conf_id=conf_id,conf_key=conf_key)
	
@app.route('/all_commitment_print/view/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def All_Commitment_view_print(conf_id,conf_key):
	user_id  = None
	report_type  = None
	start_date   = None
	end_date     = None
	data    = BoModel().get_user_commitment_data_print(conf_id,user_id,report_type,start_date,end_date)
	abs_data = data[0]
	user_list = []
	user_list_dup = []
	abs_print_data   =   defaultdict(list) # sub list with key 
	for r in abs_data:
		if (r["user_id"] not in user_list_dup) :
			user_list.append(r)
			user_list_dup.append(r["user_id"])
		abs_print_data[r["user_id"]].append(r)
	# return jsonify(user_list)
	return render_template('/backoffice/abstract/commitment/commitment_print.html',abs_print_data=abs_print_data,user_list=user_list,conf_id=conf_id,conf_key=conf_key)
	
@app.route('/abs_daily_report',methods=["GET","POST"])
def Abs_daily_report_v1():
	return "no function"
#   send_manual    = request.values.get('send_manual',None)
#   current_tm     = datetime.now()
#   if send_manual and int(send_manual) == 1 :
#       return sendAbsReport_v1()
#   else :
#       if (current_tm.hour == 9 and current_tm.minute > 45) or (current_tm.hour == 10 and current_tm.minute < 25):
#           sendAbsReport_v1()
#       else:
#           # print(str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time not match ")
#           return ( str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time not match ")
#   return ("mail sent at "+str(current_tm.strftime('%d-%m-%Y %H:%M:%S')))
	
@app.route('/cron_job_calls',methods=["GET","POST"])
def Cron_job_calls():
	send_manual    = request.values.get('send_manual',None)
	is_view        = request.values.get('is_view',None)
	current_tm     = datetime.now()
	if send_manual and int(send_manual) == 1 :
		if is_view and is_view == "submission":
			return sendAbsReport_v1(is_view)
		elif is_view and is_view == "evaluation":
			return sendAbsevaluationReport_v1(is_view)
		else:
			sendAbsReport_v2()
			sendAbsevaluationReport_v1(is_view)
			return ("mail sent at "+str(current_tm.strftime('%d-%m-%Y %H:%M:%S')))
	else :
		if (current_tm.hour == 6 and current_tm.minute == 15):
#       if (current_tm.hour == 6 and current_tm.minute > 10) or (current_tm.hour == 6 and current_tm.minute < 20):
		# if (current_tm.hour == 9 and current_tm.minute > 25) or (current_tm.hour == 9 and current_tm.minute < 45):
			print(str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time match")
			sendAbsReport_v2()
			sendAbsevaluationReport_v1(is_view)
			return ("mail sent at "+str(current_tm.strftime('%d-%m-%Y %H:%M:%S')))
		else: 
# 			print(str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time not match ")
			return ( str(current_tm.strftime('%d-%m-%Y %H:%M:%S'))+" Time not match ")
	return ("mail sent at "+str(current_tm.strftime('%d-%m-%Y %H:%M:%S')))
	
def sendAbsReport_v2():
	now_date       = datetime.now()
	previous_date  = now_date+ timedelta(days=-1)
	pre_date       = previous_date.strftime('%Y-%m-%d')
	data          = UserModel().get_trigger_report_data(pre_date)
	report_data = data[0]
	confs_data  = data[1]
	conf_reports = defaultdict(list)
	for r in report_data:
		conf_reports[r["conf_id"]].append(r)
	for i in confs_data:
		report = conf_reports[i["conf_id"]]
		if report :
			if i["to_email"]:
				to_emails   = i["to_email"].split(",")
			else:
				to_emails   = "sai@numerotec.com"
			if i["bcc_email"] and i["to_email"]:
				bcc_email   = i["bcc_email"].split(",")
			else:
				bcc_email   =  ['manjula@numerotec.com', 'mukeshkumar@numerotec.com', 'priyavarthana@numerotec.com', 'sakthivel@numerotec.com', 'sridharan.r@numerotec.com','vimal@numerotec.com','harini@numerotec.com','sivabalan@numerotec.com']
			subject      =  i["conf_name"]+"  Abstract Submission Count as on " + now_date.strftime('%d-%m-%Y')
			html_data  = render_template('users/email/daily_report_v1.html',data=report,date_today=previous_date.strftime('%d-%m-%Y'),now_date=now_date.strftime('%d-%m-%Y %I:%M %p'),confData=i)
			# to_emails = ["abimukesh963@gmail.com"]
			# bcc_email = ["mukeshkumar@numerotec.com"]
			EMAIL.sendMail_daily_report_v1(subject,html_data,to_emails,bcc_email,i['conf_id'])
	return html_data

def sendAbsReport_v1(is_view):
	now_date       = datetime.now()
	previous_date  = now_date+ timedelta(days=-1)
	pre_date       = previous_date.strftime('%Y-%m-%d')
	users          = UserModel().get_trigger_report_emails_data()
	confs_data     = UserModel().getAllConfForTriggerReport()
	confs          = {}
	conf_report = {}
	for conf in confs_data:
		report_data= UserModel().get_daily_report(pre_date,conf['conf_id'])   
		confs[conf['conf_id']] = conf
		conf_report[conf['conf_key']]=report_data[0]
	sender_mail = []
	if users:
		for row in users:
			html        = []
			email       = row['email']
#           email       = "mukeshkumar@numerotec.com"
			str_conf_id = row['conf_id']
			lst_conf_id = str_conf_id.split(",")
			html.clear()
			for x in lst_conf_id:
				confData = confs.get(int(x),None)
				check_abs = UserModel().check_abs_types(now_date,confData['conf_id'])
				if (check_abs and confData and confData['conf_key']) or is_view:
					report     = conf_report[confData['conf_key']]
					html_data  = render_template('users/email/daily_report_v1.html',data=report,date_today=previous_date.strftime('%d-%m-%Y'),now_date=now_date.strftime('%d-%m-%Y %I:%M %p'),confData=confData)
					htmls      = html_data.replace("\n", "")
					html.append(htmls)
			if html:
				html_datas   = str(html).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
				html_tmp     = render_template('users/email/abstract_report_mail_all.html',html=html_datas)
				subject      =  "  Abstract Submission Count as on " + now_date.strftime('%d-%m-%Y')
				if is_view:
					return html_tmp
				else:
					# EMAIL.sendMail_v1(subject,html_tmp,email,None,confData['conf_id'],confData)
					EMAIL.sendMail_daily_report(subject,html_tmp,email,confData['conf_id'])
				sender_mail.append(email)
		return jsonify(sender_mail)
	else : 
		pass
		return "no users"
	
def sendAbsevaluationReport_v1(is_view):
	now_date       = datetime.now()
	previous_date  = now_date+ timedelta(days=-1)
	pre_date       = previous_date.strftime('%Y-%m-%d')
	# users          = UserModel().get_trigger_report_emails_data()
	template_name = 'eva_daily_report_mail'
	mailData      = UserModel().get_daily_mail_templates(template_name)    
	confs_data     = UserModel().getAllConfForTriggerReport()
	for conf in confs_data:
		check_abs = UserModel().check_eva_abs_types(previous_date,conf["conf_id"])
		if check_abs:
			for abs_type in check_abs:
				remain_days = reduce(lambda x, y: (y-x).days, [now_date, abs_type["end_date"]])
				report_data= BoModel().get_evaluators(abs_type["abs_type"],None,conf["conf_id"],0,100,"DESC")
				report     = report_data[0]
				user_data  = report_data[2]
				conf_data  = report_data[3][0]
				count_data  = report_data[4][0]
				Auth.conference(conf_data,conf["conf_id"])
				mail_data     = {
					'mail_content': mailData.mail_content,
					'data'        : report,
					'conf_id'     : conf["conf_id"],
					'conf_key'    : conf["conf_id"],
					'date_today'  : previous_date.strftime('%d-%m-%Y'),
					'now_date'    : now_date.strftime('%d-%m-%Y %I:%M %p'),
					'conf_data'   : conf_data,
					'abs_type'    : abs_type,
					'count_data'  : count_data,
					'remain_days' : remain_days,
					}
				mail_content  = Helper.convert_html_for_mail_screen(mail_data)
				html          = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
				sub_data      = {
					'conf_name': conf['conf_name'],
					'eva_type' : abs_type["title"],
					'now_date' : now_date.strftime('%d-%m-%Y')
					}
				subject       = Helper.merge_tags(mailData.subject,sub_data)
				if user_data:
					for i in user_data:
						email = i["email"]
				#       email = "mukesh@numerotec.com"
						if is_view:
							return html
						else:
				#           EMAIL.sendMail_v1(subject,html,email,None,conf["conf_id"],conf)
							EMAIL.sendMail_daily_report(subject,html,email,conf["conf_id"])
				else:
					pass
			return "Mail send successfully"     
		else:
			return "Abstract Not found"

@app.route('/programsheet/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def programsheet(conf_id,conf_key):
	conf_data  = Auth.get_conference(conf_id)
	start_date = conf_data['conf_start_dt']
	end_date   = conf_data['conf_end_dt']
	confe_date = []
	if start_date and end_date:
		start_date = datetime.strptime(start_date, '%Y-%m-%d')
		end_date   = datetime.strptime(end_date,'%Y-%m-%d')
		for dt in rrule(DAILY, dtstart=start_date, until=end_date):
			confe_date.append(dt)
	return render_template('backoffice/programsheet.html',confe_date=confe_date,conf_id=conf_id,conf_key=conf_key)

@app.route('/get_programsheet_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def get_programsheet_data(conf_id,conf_key):
	conf_date = request.values.get('conf_date')
	data = UserModel().get_programsheet_data(conf_date,conf_id)
	if data[0]:
		program_data = data[0]
		program_data = json.dumps(program_data)
	return program_data
	
@app.route('/session_abs_view/<session_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def Session_abs_view(session_id,conf_id,conf_key):
	data = UserModel().get_session_view_data(session_id,conf_id)
	return render_template('backoffice/session_view.html',data=data,conf_id=conf_id,conf_key=conf_key)
	
@app.route('/generate_sqlite',methods=['GET','POST'])
def generate_sqlite():
	UserModel().session_data_InsertToSqlite_1()
	return 'success'


@app.route('/generate_sqlite_merge_tag',methods=['GET','POST'])
def generate_sqlite_merge_tag():
	UserModel().session_data_InsertToSqlite_MergeTag()
	return 'success'


@app.route('/profile_creation/<user_id>/<conf_id>/<conf_key>', methods = ["GET"])
@RouteGroup.conf_required
def ProfileCreation(user_id,conf_id,conf_key,data=None):
	encrypt_user_id = user_id
	user_id      = int(Cryptography.decrypt(unquote(user_id)))
	if data is None:
		userData     = UserModel().get_member(user_id)
		if userData and userData['reset_pwd_expire_on']:
			now     = datetime.now()
			reset_pwd_expire_on   = datetime.strptime(str(userData['reset_pwd_expire_on']),'%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')
			if str(now)>str(reset_pwd_expire_on): 
				flash("Expired!Link valid for 30 mintue")
				return redirect (url_for('user.ForgetPwd',society_id=userData['society_id'],conf_id=conf_id,conf_key=conf_key))
	else:
		userData  = data
	return render_template('users/profile_creation.html',userData=userData,conf_id=conf_id,conf_key=conf_key,encrypt_user_id=encrypt_user_id)

@app.route('/post_profile_creation/<user_id>/<conf_id>/<conf_key>',methods=["POST"])
def postProfileCreation(user_id,conf_id,conf_key):
	if request.method=="POST":
		confe   = UserModel().get_confe(conf_id,conf_key)
		delData    = UserModel().get_delegate_app(conf_id)
		del_url    = None
		if delData:
			del_url = delData['app_url']
		if confe:
			confe['del_url'] = del_url
		Auth.conference(confe,conf_id)
		society_id = request.values.get('society_id')
		user_id    = request.values.get('user_id')
		prefix     = request.values.get("prefix")
		full_name  = request.values.get("full_name")
		email      = request.values.get("hid_email")
		mobile     = request.values.get("mobile")
		password   = request.values.get('password')
		confirm_password = request.values.get('confirm_password')
		data = {'prefix':prefix,'full_name':full_name,'mobile':mobile,'pwd_difference' : password,'password' : password,'email':email,'user_id':user_id,'society_id':society_id,'updated_at':datetime.now(),'pwd_set_at':datetime.now()}
		if int(conf_id) == 61:
			data['profile_updated_at']  = datetime.now()
			
		is_valid = True
		if password == confirm_password :
			is_valid = True
		else:
			flash("Password and confirm password mismatch",'errorMsg')
			is_valid = False
			
		mobile_count = UserModel().get_mobile_count(mobile,user_id,society_id) # db call 4
		if mobile_count > 0 :
			flash("Mobile number already exists for a different profile.  Please provide an alternate number or contact support team.")
			is_valid = False
			
		if is_valid:
			UserModel().update_member(user_id,data)
			user_output = UserModel().get_users_email_data(email,society_id)
			Auth.login(user_output,society_id)
			return redirect(url_for('DB.Dashboard',conf_id = conf_id,conf_key=conf_key))
		else:
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
			return ProfileCreation(encrypt_user_id,conf_id,conf_key,data)
	else:
		return redirect(url_for('user.ProfileCreation',user_id=user_id,conf_id=conf_id,conf_key=conf_key))
		
@app.route('/post_logins/<conf_id>/<conf_key>',methods = ["POST"])
@RouteGroup.conf_required
def PostLogins(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	email     = request.values.get('email')
	password  = request.values.get('password')
	society_id      = confData['society_id']   
	user_output     = UserModel().get_users_email_data(email,society_id)
	if user_output :  
		if password == user_output['password']:
			bo_access = UserModel().check_bo_access(email,3,society_id,conf_id)
			user_output["is_admin"] =  bo_access["is_admin"]
			user_output["admin_type"] = bo_access["admin_type"]
			Auth.login(user_output,society_id)
			status  = 1
			msg     = 'success'
		else : 
			status = 2
			msg    = 'Passsword invalid. Please check the password.'
		data={'status':status,'msg':msg}
		return jsonify(data)
	else:
		status = 0
		data={'status':status,'msg':''}
		return jsonify(data)


@app.route('/get_userdata/<conf_id>/<conf_key>',methods = ["POST"])
@RouteGroup.conf_required
def getUserdata(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	email           = request.values.get('email')
	society_id      = confData['society_id']   
	userData        = UserModel().get_users_email_data(email,society_id)

	if userData and userData['password']:
		status = 1
		user_id= Cryptography.encrypt(userData['user_id'])
	else:
		status=2
		user_id =""
	data={'status':status,'user_id':user_id}
	return jsonify(data)

@app.route('/post_login_v1/<conf_id>/<conf_key>',methods = ["POST"])
@RouteGroup.conf_required
def PostLoginV1(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	
	email     = request.values.get('email')
	society_id  = confData['society_id']
	user_output = UserModel().get_users_email_data(email,society_id)
	if user_output :
		encrypt_user_id  = Cryptography.encrypt(int(user_output["user_id"]))
	else:
		insert  = UserModel().insert_new_user(email,society_id)
		# insert system logs
		system_data   = request.headers.get("user-agent")
		ip_add        = request.headers.get('X-Forwarded-For', request.remote_addr)
		route_name = request.path
		route_name = route_name[1:]
		app_url_1  = request.host_url
		if "https" in app_url_1:
			pass
		else:
			app_url_1 = app_url_1.replace("http","https")   

		app_url = app_url_1+route_name
		params        = "system_log?society_id="+str(society_id)+"&conf_id="+str(conf_id)+"&email="+email+"&app_type=ABSTRACT&app_url="+app_url+"&ip_add="+ip_add+"&system_data="+system_data
		api_url      = "https://conference.numerotech.com/" +params
		result = requests.get(api_url)
		res = result.text
		res = json.loads(res)
		#end
		encrypt_user_id  = Cryptography.encrypt(int(insert["user_id"]))
	data = {'user_id':encrypt_user_id}
	return jsonify(data)

@app.route('/forget_pwd/<society_id>/<conf_id>/<conf_key>',methods = ["GET", "POST"])
@RouteGroup.conf_required
def ForgetPwd(society_id,conf_id,conf_key):
	return render_template('users/forget_pwd.html',society_id=society_id,conf_id=conf_id,conf_key=conf_key)

@app.route('/forget_pwd_mail/<society_id>/<conf_id>/<conf_key>',methods = ["GET", "POST"])
@RouteGroup.conf_required
def ForgetPwdMail(society_id,conf_id,conf_key):
	if request.method == "POST" :
		email      = request.values.get('email')
		output     = UserModel().get_users_email_data(email,society_id)
		if output :
			SendResetPwdMail(output['user_id'],conf_id,conf_key)
			return redirect(url_for('user.Login',conf_id=conf_id,conf_key=conf_key))
		else :
			flash("Please Enter Registered Email id","errorMsg")
			return redirect (url_for('user.ForgetPwd',society_id=society_id,conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.Login',conf_id=conf_id,conf_key=conf_key))


def SendResetPwdMail(user_id,conf_id,conf_key):
	now         = datetime.now()
	confData   = UserModel().get_confe(conf_id,conf_key)
	reset_pwd_expire_on = now + timedelta(minutes=30)
	data            = {'reset_pwd_expire_on' : reset_pwd_expire_on,'reset_pwd_sent_at':now}
	output            = UserModel().update_member(user_id,data) 
	if output :
		subject         	   = "Reset your password"
		email           	   = output['email']
		encrypt_user_id        = Cryptography.encrypt(user_id)
		html                   = render_template('users/email/reset_password_mail.html',society_id=output['society_id'],conf_id=conf_id,conf_key=conf_key,confe=confData,output=output,encrypt_user_id=encrypt_user_id)
		EMAIL.sendMailResetPassword(subject,html,email,confData)
		flash('Reset link sent your registered email id to '+email,'successMsg')
		return "success"
	else : 
		return "fail"

@app.route('/post_amzon_upload/<society_id>/<society_key>/<conf_id>/<conf_key>', methods = ["GET","POST"])
@RouteGroup.conf_required
def PostAmazonUpload(society_id,society_key,conf_id,conf_key,acl="public-read"):
	if request.method == 'POST':
		user_id         = request.values.get('user_id')
		attach_id       = request.values['attach_id'] 
		attach_type_id  = request.form['attach_type_id']
		attach_type     = request.values.get('attach_type')
		s3              = boto3.client("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='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')
		files           = request.files.getlist("file")
		for file in files:
			if file.filename:
				filename        = secure_filename(file.filename)
				split_tup       = os.path.splitext(filename)
				file_name       = split_tup[0]
				file_extension  = split_tup[1]
				
				file_str        = attach_type+file_extension
				if " " in file_str :
					file_str = file_str.replace(" ","")
				try:
					
					user_id    = str(user_id)
					bucket = 'common-application'
					foldername = str(society_key)+"/user_attachment"

					response   = s3.upload_fileobj(file, bucket,foldername+'/'+user_id+'/'+ file_str, ExtraArgs={"ACL": acl,"ContentType": file.content_type})
					data_1     = {'bucketname' :bucket,'foldername':foldername,'file_name':file_str+"?"+str(Helper.getcurrenttimestamp()),'msg':'Image successfully uploded','file_extension':file_extension,'status':1} 
					file_path  = 'https://common-application.s3-ap-southeast-1.amazonaws.com/'+foldername+"/"+user_id

					data = {
						'user_id'           : user_id,
						'attach_type_id'    : attach_type_id,
						'attach_file_name'  : file_str,
						'attach_path'       : file_path,
						'created_at'        : datetime.now(),
						'updated_at'        : datetime.now()  
					}
					if (int(attach_id) > 0):
						ua  = UserModel().get_user_attach(attach_id,attach_type_id)
						if ua:
							data.pop("created_at") 
							data           = UserModel().update_image(attach_id,data)
							d              = {}
							d['attach_id'] = attach_id
							data_1.update(d)
					else :
						attach_id_pk    = UserModel().insert_image(data)
						d               = {}
						d['attach_id']  = attach_id_pk
						data_1.update(d)
					return json.dumps(data_1)
				except ClientError as e:
					logging.error(e)
					data_1      = {'msg':'Image upload failed .Please try again.','status':0}        
					json_data   = json.dumps(data_1)
					return json_data
					# flash('Something Error .Please Try Again')
	else :
		flash("Please, Try again.","errorMsg")
		return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
	
@app.route('/delete_amazon_image/<society_id>/<society_key>/<conf_id>/<conf_key>', methods = ["GET","POST"])
@RouteGroup.conf_required
def DeleteAmazonImage(society_id,society_key,conf_id,conf_key):
	attach_id       = request.form['attach_id']
	attach_type_id  = request.form['attach_type_id']
	ua              = UserModel().get_user_attach(attach_id,attach_type_id)
	if ua is None:
		data = {'msg':'Deleted','status' : 1}
	else:
		filepath        = ua['attach_path']
		filename        = ua['attach_file_name']
		foldername      = filepath+ "/"+filename
		foldername      = foldername.replace('https://common-application.s3-ap-southeast-1.amazonaws.com/', "")
		s3              = boto3.resource("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='EEudWCsWeCIt/J9/z5m5htmUdGFJNzWFPvNQBIp/')
		response        = s3.Object('common-application', foldername).delete()
		UserModel().delete_image(attach_id,attach_type_id)
		data            = {'msg':'Deleted','status' : 1}
	json_data   = json.dumps(data)
	return json_data


@app.route('/evaluation_consent_responce/<eva_id>/<consent_status_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
def evaluation_consent_responce(eva_id,consent_status_id,conf_id,conf_key):
	eva_type = ""
	data = UserModel().save_evaluation_consent_responce(eva_type,eva_id,conf_id,consent_status_id)
	return render_template('users/evaluation_consent_responce.html',data=data,conf_id=conf_id,conf_key=conf_key)
	
@app.route('/change_pwd/<conf_id>/<conf_key>',methods = ["GET", "POST"])
@RouteGroup.login_required
@RouteGroup.conf_required
def ChangePwd(conf_id,conf_key):
	return render_template('users/change_password.html',conf_id=conf_id,conf_key=conf_key)

@app.route('/post_change_pwd/<conf_id>/<conf_key>',methods = ["GET", "POST"])
@RouteGroup.conf_required
def PostChangePwd(conf_id,conf_key):
	if request.method == "POST":
		society_id = Auth.get_conference(conf_id).get("society_id")
		user_id    = Auth.get_user(society_id).get('user_id')
		old_password     =  request.form['old_password']
		old = UserModel().check_password(user_id)
		old_password_db = old['password']
		if old_password == old_password_db :
			password         = request.form['password']
			confirm_password = request.form['confirm_password']
			if password == confirm_password :
				if old_password_db == password:
					flash("Please enter a new password as you have entered your current password.","errorMsg")
					user_id = Cryptography.encrypt(int(user_id))
					return redirect (url_for('user.ChangePwd',conf_id=conf_id,conf_key=conf_key))
				else:
					data     = {'password' : password,'pwd_difference' : password }
					output   = UserModel().update_member(user_id,data)
					if output:
						flash('Password Changed Successfully...','success')
						user_id = Cryptography.encrypt(int(user_id))
						return redirect(url_for('DB.Dashboard',conf_id=conf_id,conf_key=conf_key))
			else:
				flash("Password and confirm password mismatch","errorMsg")
				user_id = Cryptography.encrypt(int(user_id))
				return redirect (url_for('user.ChangePwd',conf_id=conf_id,conf_key=conf_key))
		else:
			flash("Your Old Password needs to be entered correctly. Please enter it again.","errorMsg")
			user_id = Cryptography.encrypt(int(user_id))
			return redirect (url_for('user.ChangePwd',conf_id=conf_id,conf_key=conf_key))

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists