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/BackofficeController.py

from flask import Flask, request, Blueprint, jsonify,json, redirect, url_for,flash, render_template,session, app,Response,send_file
from core.model.UserModel import UserModel
from core.model.AbstractModel import AbstractModel
from core.model.BoModel import BoModel
from core.library.helper import Helper
from random import randint
import datetime
import time
from core.library.email import EMAIL
from core.library.Xlsexport import XLSEXPORT
from datetime import timedelta,date,datetime
from .. import Cryptography,Auth,RouteGroup,path_wkhtmltopdf,is_windows_os
from urllib.parse import unquote
import ast
from collections import defaultdict
from dateutil.rrule import rrule, DAILY
import urllib.parse
from os import listdir
import io 
import csv
from io import StringIO
from io import BytesIO
import xlsxwriter
from xlsxwriter import Workbook
import xlwt
import string 
import os
import logging
import flask_excel as excel
from requests.utils import requote_uri

from pydoc import locate
import imp,sys
import base64 
from urllib.parse import unquote
import boto3, botocore
from botocore.exceptions import ClientError
from os import listdir
from os.path import join, dirname, realpath
from werkzeug.utils import secure_filename
import pdfkit
import pandas as pd

app = Blueprint('backoffice', __name__)

@app.route('<conf_id>/<conf_key>/bo_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:
			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"]
			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))



@app.route('/dashboard/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def bo_dashboard(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	society_id = confData.get("society_id")
	user_id            = Auth.get_user(society_id).get('user_id')
	confe              = confData.get('conference_header_logo')
	get_abstrcts       = BoModel().get_abstract(conf_id)
	get_abstract_count = BoModel().get_abstract_count(conf_id,confData.get('conf_schema'))
	statistic_data     = BoModel().get_statistic_data(conf_id)
	role_wise_faculty = statistic_data[0]
	submitted_abs     = statistic_data[1]
	Selected_abs      = statistic_data[2]
	Podium_count      = statistic_data[3]
	abstypewise_count = statistic_data[4]
	withdraw_count    = statistic_data[5]
	upload_count      = statistic_data[6]
	abstypeData = BoModel().get_distinct_all_selectiontype(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/dashboard.html',abstracts = get_abstrcts,data=get_abstract_count,confe_logo=confe,conf_id=conf_id,conf_key=conf_key,role_wise_faculty=role_wise_faculty,submitted_abs=submitted_abs,Selected_abs=Selected_abs,Podium_count=Podium_count,abstypewise_count=abstypewise_count,withdraw_count=withdraw_count,abstypeData=abstypeData,upload_count=upload_count)

@app.route('/get_searched_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_searched_data(conf_id,conf_key):
	search_text = request.values.get('search_txt') or None
	if search_text:
		length = len(search_text)
	else:
		length = 0
	abs_types = request.values.get('abs_types') or None
	searched_data = BoModel().get_searched_data(search_text,abs_types,conf_id)
	if searched_data:
		count = len(searched_data)
	else:
		count = 0
	if (length>=3):
		html_data = render_template('backoffice/get_search_table.html',data=searched_data,conf_id=conf_id,conf_key=conf_key,count=count)
		data      = {"html_data" :html_data,"msg" : "success" ,"status" : 1 }
		json_data = json.dumps(data,default = str)
		return json_data
	else:
		data      = {"html_data" :"","msg" : "fail" ,"status" : 2 }
		json_data = json.dumps(data,default = str)
		return json_data

@app.route('/report/<string:abs_type>/<status_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def bo_report(abs_type,status_type,conf_id,conf_key):
	NULL=None
	status_type = int(status_type)
	get_abs_details=BoModel().get_abs_details(abs_type,NULL,NULL,NULL,status_type,NULL,conf_id)
	data         = BoModel().get_status_selection_type_of_presentation_abs_types(conf_id)
	status       = data[0]
	selection    = data[1]
	presentation = data[2]
	abs_types    = data[3]
	mail_templates = data[4]
	awards = AbstractModel().get_abs_award(conf_id,abs_type)
	status_type =list(str(status_type))
	col_name=BoModel().get_export_cols(conf_id)
	categories_data = UserModel().get_categories_v1(abs_type,conf_id)
	return render_template ('backoffice/report_table.html',awards=awards,abs_type=abs_type,data=get_abs_details,abs_types=abs_types,status=status,status_type=list(status_type),selection=selection,presentation=presentation,conf_id=conf_id,conf_key=conf_key,col_name=col_name,mail_templates=mail_templates,categories_data=categories_data)

@app.route('/report/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def bo_report_blank(conf_id,conf_key):
	data         = BoModel().get_status_selection_type_of_presentation_abs_types(conf_id)
	status       = data[0]
	selection    = data[1]
	presentation = data[2]
	abs_types    = data[3]
	awards = []
	mail_templates = data[4]
	return render_template ('backoffice/report_table.html',awards=awards,status=status,abs_types=abs_types,selection=selection,presentation=presentation,mail_templates=mail_templates,conf_id=conf_id,conf_key=conf_key)


@app.route('/view/<abs_id>/<inuser_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def bo_View(abs_id,inuser_id,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data=AbstractModel().get_sept4_data(abs_id,confData.get('conf_schema'))
	data1=AbstractModel().get_authors(abs_id,confData.get('conf_schema'))
	data2=AbstractModel().FP_step1_get_author(abs_id,confData.get('conf_schema'))
	abs_uploads = AbstractModel().get_abs_uploads(abs_id)
	abs_type = AbstractModel().get_abs_type(abs_id,confData.get('conf_schema'))
	abs_type = abs_type["abs_type"]
	abs_awards = AbstractModel().get_abs_award_v1(conf_id,abs_type,abs_id)
	award_title = {}
	awards = {}

	abs_parent_ids = []
	if abs_awards:
		for i in abs_awards:
			if i['abs_id']:
				abs_parent_ids.append(i['parent_id'])   
	
		for item in abs_awards:
			if item["is_parent"] == 1:
				if item["award_id"]  in abs_parent_ids:
					award_title[item['award_id']] = item["award_name"] 
			else:
				if item["abs_id"] != None: 
					awards[item["parent_id"]]  = [item] + awards.get(item["parent_id"],[])
	if data['abs_type'] == "IC":
		duration     = AbstractModel().settings(confData.get('society_intial')+"_Duration",conf_id)
		return render_template('backoffice/bo_edit/IC_view.html',inuser_id=inuser_id,abs_id=abs_id,data=data,data2=data2,data1=data1,conf_id=conf_id,conf_key=conf_key,duration=duration[0])
	elif data['abs_type'] == "GP":
		return redirect(url_for('backoffice.View_GP',abs_id=abs_id,conf_id=conf_id,conf_key=conf_key))
	try:
		if abs_uploads:
			return render_template('backoffice/bo_edit/'+conf_key.upper()+'/'+data['abs_type']+'_view.html',inuser_id=inuser_id,abs_id=abs_id,data=data,data2=data2,data1=data1,conf_id=conf_id,conf_key=conf_key,abs_uploads=abs_uploads)
		if abs_awards:
			return render_template('backoffice/bo_edit/'+conf_key.upper()+'/'+data['abs_type']+'_view.html',inuser_id=inuser_id,abs_id=abs_id,data=data,data2=data2,data1=data1,conf_id=conf_id,conf_key=conf_key,awards=awards,award_title=award_title)
		else:
			return render_template('backoffice/bo_edit/'+conf_key.upper()+'/'+data['abs_type']+'_view.html',inuser_id=inuser_id,abs_id=abs_id,data=data,data2=data2,data1=data1,conf_id=conf_id,conf_key=conf_key)
	except:
		return render_template('backoffice/bo_edit/'+conf_key.upper()+'/bo_view.html',inuser_id=inuser_id,abs_id=abs_id,data=data,data2=data2,data1=data1,conf_id=conf_id,conf_key=conf_key)


@app.route('/edit/<abs_id>/<abs_type>/<inuser_id>/<int:conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def edit(abs_id,abs_type,inuser_id,conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	data       = AbstractModel().get_sept4_data(abs_id,confData.get('conf_schema'))
	# categories = UserModel().get_categories(abs_type,conf_id)
	# if not categories:
	society_id  =   Auth.get_conference(conf_id).get("society_id")
	categories = UserModel().get_categories_v1(abs_type,conf_id)
	if conf_id==32:
		abs_id=int(abs_id)
		abs_awards = AbstractModel().get_abs_award_v1(conf_id,abs_type,abs_id)
		award_title = {}
		awards = {}
		for item in abs_awards:
			if item["is_parent"] == 1:
				award_title[item['award_id']] = item["award_name"] 
			else:
				awards[item["parent_id"]]  = awards.get(item["parent_id"],[]) + [item]
	else:
		abs_awards = UserModel().get_abs_awards(abs_type,conf_id)
		awards=None
		award_title=None
	type_of_presentation = AbstractModel().get_type_of_presentation(conf_id)
	uploaded_data = AbstractModel().get_img_upload_by_abs_id(abs_id)
	duration     = AbstractModel().settings(Auth.get_conference(conf_id).get('society_intial')+"_Duration",conf_id)
	img               = AbstractModel().get_fulltext_by_abs_id(abs_id,confData.get('conf_schema'))
	#   img    = AbstractModel().get_img_upload(abs_id)
	if img:
		return render_template('backoffice/bo_edit/'+conf_key.upper()+'/'+abs_type+'_edit.html',inuser_id=inuser_id,abs_id=abs_id,data=data,categories=categories,type_of_presentation=type_of_presentation,conf_id=conf_id,conf_key=conf_key,society_id=society_id,abs_awards=abs_awards,award_title=award_title,awards=awards,img=img,duration=duration[0])
	else:
		if abs_type == 'GP':
			return redirect(url_for("backoffice.Gp_abstract",abs_id=abs_id,conf_id=conf_id,conf_key=conf_key))
		else:
			return render_template('backoffice/bo_edit/'+conf_key.upper()+'/'+abs_type+'_edit.html',inuser_id=inuser_id,abs_id=abs_id,data=data,categories=categories,type_of_presentation=type_of_presentation,conf_id=conf_id,conf_key=conf_key,society_id=society_id,uploaded_data=uploaded_data,abs_awards=abs_awards,award_title=award_title,awards=awards,duration=duration[0],img=img)

@app.route('/edit/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def post_edit(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	if request.method == "POST":
		abs_id = request.values["abs_id"]
		try:
			int(abs_id)
		except ValueError:
			abs_id = int(Cryptography.decrypt(abs_id))
		inuser_id = request.values.get("inuser_id")
		abs_type = request.values.get("abs_type")
		if(abs_type == 'IC'):
			data = {
			'category_id':request.values.get("category"),
			'level':request.values.get("level" or ''),
			'title':request.values.get("title"),
			'synopsis':request.values.get("synopsis"),
			'resume':request.values.get("resume"),
			}
		elif(abs_type in ('EP','OP','VP')):
			award_list = request.form.getlist('chk_awards' or None)
			insert_and_delete_award(award_list,abs_id)
			data={
			'category_id' : request.values.get("cat_type"),
			'title'       : request.values.get("title"),
			'synopsis'    : request.values.get("synopsis"),
			'methods'     : request.values.get("methods"),
			'results'     : request.values.get("results"),
			'conclusion'  : request.values.get("conclusion" or ''),
			'case_report'   : request.values.get("Clinical_Implication" or ''),
			'misc1'       : request.values.get("misc1" or None ),
			'misc2'       : request.values.get("misc2") or None,
			'misc3'       : request.values.get("misc3") or None,
			'award_id'    : request.values.get('award_id') or None,
			}
		elif(abs_type == 'FP'):
			data = {
			'category_id'         : request.values.get("category"),
			'presentation_type_id': request.values.get("presenting_type" or None),
			'title'       : request.values.get("title"),
			'synopsis'    : request.values.get("synopsis"),
			'purpose'     : request.values.get("purpose" or ''),
			'methods'     : request.values.get("methods" or ''),
			'results'     : request.values.get("result" or ''),
			'conclusion'  : request.values.get("conclusion" or ''),
			'case_report'   : request.values.get("Clinical_Implication" or ''),
			'misc1'       : request.values.get("misc1") or None,
			'misc2'       : request.values.get("misc2") or None,
			'misc3'       : request.values.get("misc3") or None,
			'award_id'    : request.values.get('abs_awards') or None,
			'updated_at'  : datetime.now()
			}
		elif(abs_type == 'PP'):
			award_list = request.form.getlist('chk_awards' or None)
			insert_and_delete_award(award_list,abs_id)
			data={
			'presentation_type_id':request.values.get("presenting_type" or ''),
			'category_id'    :request.values.get("cat_type" or '' ),
			'presentation_type_id':request.values.get("presenting_type"),
			'title'       :request.values.get("title"),
			'synopsis'    :request.values.get("synopsis" or ''),
			'purpose'    :request.values.get("purpose" or ''),
			'methods'    :request.values.get("methods" or ''),
			'results'    :request.values.get("results" or ''),
			'conclusion'    :request.values.get("conclusion" or ''),
			'is_award'    :request.values.get("is_award" or ''),
			}
		elif( abs_type in ('PGPP','SZPGPP')):
			award_list = request.form.getlist('chk_awards' or None)
			insert_and_delete_award(award_list,abs_id)
			data={
			'presentation_type_id':request.values.get("presenting_type" or ''),
			'category_id'    :request.values.get("cat_type" or '' ),
			'presentation_type_id':request.values.get("presenting_type"),
			'title'       :request.values.get("title"),
			'synopsis'    :request.values.get("synopsis" or ''),
			'purpose'    :request.values.get("purpose" or ''),
			'methods'    :request.values.get("methods" or ''),
			'results'    :request.values.get("results" or ''),
			'conclusion'    :request.values.get("conclusion" or ''),
			'is_award'    :request.values.get("is_award" or ''),
			}
		elif(abs_type == 'VS'):
			data = {
			'title':request.values.get("title"),
			'synopsis':request.values.get("synopsis"),
			}
		elif(abs_type == 'HT'):
			data = {
			'title':request.values.get("title"),
			'purpose'    :request.values.get("purpose" or ''),
			'methods'    :request.values.get("methods" or ''),
			'results'    :request.values.get("results" or ''),
			}
		else:
			data = {
			'category_id':request.values.get("category"),
			'title':request.values.get("title"),
			'synopsis':request.values.get("synopsis"),
			'is_in_india':request.values.get("in_India"),
			'presentation_type_id':request.values.get("presenting_type" or ''),
			'is_already_published':request.values.get("is_already_published"),
			'purpose'     : request.values.get("purpose" or ''),
			'methods'     : request.values.get("methods" or ''),
			'results'     : request.values.get("result" or ''),
			'conclusion'  : request.values.get("conclusion" or ''),
			'case_report'   : request.values.get("Clinical_Implication" or ''),
			'misc1'       : request.values.get("misc1") or None,
			'misc2'       : request.values.get("misc2") or None,
			'misc3'       : request.values.get("misc3") or None,
			}

		# print(data)
		edittodb=UserModel().update_step(data,abs_id,confData.get('conf_schema'))
		return redirect(url_for('backoffice.bo_View',abs_id=abs_id,inuser_id=inuser_id,conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('backoffice.edit',abs_id=abs_id,abs_type=abs_type,inuser_id=inuser_id,conf_id=conf_id,conf_key=conf_key))


@app.route('/add_and_edit_to_authors/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def StepPost_3(conf_id,conf_key):#this will add coinstructor for IC
	confData = Auth.get_conference(conf_id)
	topic       =request.values["topic"]
	duration    =request.values["duration"]
	topic_order =request.values["topic_order"]
	user_id     =request.values["user_id"]
	abs_id      =request.values["abs_id"]
	abs_id      =int(Cryptography.decrypt(abs_id))
	topic_id  =request.values["topic_id"] or 0
	data1={ 'topic':topic,
			'duration':duration,
			'order_no':topic_order,
			'user_id':user_id,
			'abs_id':abs_id,
			'role_id':33,
			}
	check_authors_id = AbstractModel().check_authors_id_by_abs_id(abs_id,confData.get('conf_schema'))#checking the authors id for insert in database 
	if check_authors_id == 0 and topic_id == 0 or topic_id == '0':#this will add author if the count for author table is zero
		data=AbstractModel().add_to_authors(data1,abs_id,confData.get('conf_schema'))#inserting into data base
		return jsonify(status = 0)
	total_duration=AbstractModel().authors_total_duration_for_edit(abs_id,topic_id,confData.get('conf_schema'))#getting total duration for inserting the author  
	if(total_duration == None):
		total_duration = 0
	total_duration=total_duration+int(duration)
	if total_duration <= 75 and topic_id == 0 :
		data=AbstractModel().add_to_authors(data1,abs_id,confData.get('conf_schema'))#adding new author
		return jsonify(status = 0)
	elif total_duration <= 75:
		data=AbstractModel().edit_to_authors(data1,topic_id,confData.get('conf_schema'))#editing the existing author
		return jsonify(status = 0)
	else:
		return jsonify(status = 1)
	

@app.route('/searchinstructor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def SearchInstructor(conf_id,conf_key):
	searchtext = request.values["searchtext"]
	abs_type   = request.values["abs_type"]
	btn_val    = request.values["btn_val"]
	society_id = Auth.get_conference(conf_id).get("society_id")
	role_id    = 33
	data       = UserModel().get_search_data(searchtext,role_id,abs_type,society_id,conf_id)#getting search data from DB to step3 
	if(abs_type == "IC"):
		consent_count = 'IC_CONSENT_COUNT'
		data1         = AbstractModel().settings(consent_count,conf_id)#get settings for IC councent count
		html = render_template('backoffice/bo_edit/search_table.html',data=data,abs_type = abs_type,data1=int(data1[0][0]["setting_value"]))
		return jsonify(html)
	elif((abs_type == "FP" or abs_type == "GP") and btn_val == "1"):
		role_id     = 35
		setting_key = 'FP_PA_COUNT'
		data1       = AbstractModel().settings(setting_key,conf_id)#get settings for FP presenting author count
		html = render_template('backoffice/bo_edit/presenting_authour_search_table.html',abs_type = abs_type,data=data,data1=int(data1[0][0]["setting_value"]))
		return jsonify(html)
	elif(abs_type == "PP" and btn_val == "1"):
		role_id     = 35
		setting_key = 'PP_PA_COUNT'
		data1       = AbstractModel().settings(setting_key,conf_id)#get settings for FP presenting author count
		html = render_template('backoffice/bo_edit/presenting_authour_search_table.html',abs_type = abs_type,data=data,data1=int(data1[0][0]["setting_value"]))
		return jsonify(html)
	elif(abs_type == "VS" and btn_val == "1"):
		role_id     = 35
		setting_key = 'VS_PA_COUNT'
		data1       = AbstractModel().settings(setting_key,conf_id)#get settings for FP presenting author count
		html   = render_template('backoffice/bo_edit/presenting_authour_search_table.html',abs_type = abs_type,data=data,data1=int(data1[0][0]["setting_value"]))
		return jsonify(html)
	elif(btn_val == "1"):
		role_id     = 35
		setting_key = str(abs_type)+'_PA_COUNT'
		data1       = AbstractModel().settings(setting_key,conf_id)#get settings for FP presenting author count
		html   = render_template('backoffice/bo_edit/presenting_authour_search_table.html',abs_type = abs_type,data=data,data1=int(data1[0][0]["setting_value"]))
		return jsonify(html)
	elif(btn_val=="3"):
		role_id=34
		setting_key = str(abs_type)+'_PA_COUNT'
		data1       = AbstractModel().settings(setting_key,conf_id)
		html   = render_template('backoffice/bo_edit/chief_author_search_table.html',abs_type = abs_type,data=data,data1=int(data1[0][0]["setting_value"]))
		return jsonify(html)

	else:
		html = render_template('backoffice/bo_edit/co_authour_search_table.html',data=data,abs_type = abs_type)
		return jsonify(html)

@app.route('/step3model_presenting_author/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def BO_Step3model_presenting_author(conf_id,conf_key):
	confData  =  Auth.get_conference(conf_id)
	user_id   = request.values["searchvalue"]
	abs_type  = request.values["abs_type"]
	addcoinst = UserModel().get_user_data(user_id)#getting user data
	abs_id    = request.values["abs_id"]
	try:
		abs_id = int(abs_id)
	except ValueError:
		abs_id = int(Cryptography.decrypt(abs_id))
	role_id   = request.values["role_id"]
	if int(role_id) == 34:
		data = AbstractModel().update_chief_author(abs_id,user_id,role_id)
		return jsonify(addcoinst)
	else:
		data      = AbstractModel().add_to_presenting_author(abs_id,user_id,role_id,confData.get('conf_schema'))#adding presenting author for VT
		html   = render_template('backoffice/bo_edit/presenting_authour_table.html',data2=addcoinst)
		return jsonify(html)

@app.route('/step3model/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step3model(conf_id,conf_key):
	confData  =  Auth.get_conference(conf_id)
	user_id   = request.values["searchvalue"]
	abs_type  = request.values["abs_type"]
	addcoinst = UserModel().get_user_data(user_id)#getting user data
	if(abs_type != "IC"):
		abs_id  = request.values["abs_id"]
		role_id = request.values["role_id"]
		try:
			int(abs_id)
		except ValueError:
			abs_id = int(Cryptography.decrypt(abs_id))
		# abs_id = int(Cryptography.decrypt(abs_id))
		data    = AbstractModel().add_to_presenting_author(abs_id,user_id,role_id,confData.get('conf_schema'))#adding presenting author for VT
		html = render_template('backoffice/bo_edit/co_athour_table.html',data2=addcoinst)
		return jsonify(html)
	else:
		html = render_template('backoffice/bo_edit/insert_model.html',data=addcoinst,user_id =user_id)
		return jsonify(html)

@app.route('/fpstep1getauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step1_get_author(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_id = request.values["abs_id"]
	try:
		int(abs_id)
	except ValueError:
		abs_id = int(Cryptography.decrypt(abs_id))
	data=AbstractModel().FP_step1_get_author(abs_id,confData.get('conf_schema'))#getting the presenting author to show in step1
	if(data == []):
		data1 = 0
		return jsonify(data1)
	html = render_template('backoffice/bo_edit/presenting_authour_table.html',data2=data)
	return jsonify(html)

@app.route('/step3getauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step3getauthor(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_id   = request.values["abs_id"]
	try:
		int(abs_id)
	except ValueError:
		abs_id = int(Cryptography.decrypt(abs_id))
	abs_type         = request.values["abs_type"]
	data             = AbstractModel().get_authors(abs_id,confData.get('conf_schema'))#geting author to show in step 3 table
	panel_discussion = AbstractModel().get_panel_disscussion(abs_id,confData.get('conf_schema'))#geting panel discussion
	total_duration   = AbstractModel().total_duration_step4(abs_id,confData.get('conf_schema'))#getting total discussion 
	if(abs_type != "IC"  ):
		limit_of_authors = AbstractModel().limit_of_authors(abs_id,confData.get('conf_schema'))#geting count of author for co-authorss
		settings         = AbstractModel().settings(abs_type +"_CA_COUNT",conf_id)
		if(limit_of_authors >= int(settings[0][0]["setting_value"])):
			limit = 0
		else:
			limit = 1
		html = render_template('backoffice/bo_edit/co_athour_table.html',data=data,limit=limit,abs_type=abs_type)
		return jsonify(html)
	else:
		duration_db = AbstractModel().settings(confData.get('society_name')+"_Duration",conf_id)
		html = render_template('backoffice/bo_edit/coi_table.html',data=data,total_duration=total_duration,duration_db=duration_db[0][0]['setting_value'],panel_discussion=panel_discussion,conf_id=conf_id,conf_key=conf_key)
		return jsonify(html)


@app.route('/step3deleteauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step3deleteauthor(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	topic_id = request.values["topic_id"]
	data     = AbstractModel().delete_author_userid(topic_id,confData.get('conf_schema'))#deleting the author
	return jsonify()

@app.route('/step3editauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step3editauthor(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	topic_id = request.values["topic_id"]
	data     = AbstractModel().get_author_for_edit(topic_id,confData.get('conf_schema'))#geting author information for edit
	return render_template('backoffice/bo_edit/insert_model.html',data=data)

@app.route('/total_duration/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Total_duration(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_id = request.values["abs_id"]
	abs_id = int(Cryptography.decrypt(abs_id))
	panel_discussion = int(request.values["panel_discussion"])
	duration_model   = int(request.values["duration_model"])
	confe_name       = Auth.get_conference(conf_id).get('society_name')
	data             = AbstractModel().total_duration(abs_id,panel_discussion,confe_name,conf_id,confData.get('conf_schema'))#getting total duration 
	data             = int(data)+duration_model
	return jsonify(data)

@app.route('/category/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_category(conf_id,conf_key):
	abs_type = request.values["abs_type"]
	data = UserModel().get_categories_v1(abs_type,conf_id)
	return jsonify(data)

@app.route('/filter_report/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_filter_report(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	abs_type          = request.values.get("ddlAbstractType")
	category_id       = request.values.getlist("ddlCategory")
	presentation_type_list = request.form.getlist("ddlpresentation")
	selection_type_list    = request.form.getlist("ddlselection")
	award_list    = request.form.getlist("ddlawards")
	status            = request.values.getlist("ddlstatus")
	export_file          = request.values.get("export_file") or None
	category_id       = (','.join(str(e) for e in category_id))
	presentation_type = (','.join(str(e) for e in presentation_type_list))
	selection_type    = (','.join(str(e) for e in selection_type_list))
	award_list    = (','.join(str(e) for e in award_list))
	status_type       = (','.join(str(e) for e in status))
	col_name=BoModel().get_export_cols(conf_id)
	export_columns = request.values.getlist('selected_fields',None)
	if export_columns:
		export_column = ("','".join(export_columns))
		export_column = "'"+export_column+"'"
	else:
		export_column = "Null"
	get_abs_details   = BoModel().get_abs_details(abs_type,category_id,presentation_type,selection_type,status_type,award_list,conf_id)
	data         = BoModel().get_status_selection_type_of_presentation_abs_types(conf_id)
	status       = data[0]
	selection    = data[1]
	presentation = data[2]
	abs_types    = data[3]
	mail_templates = data[4]
	awards = AbstractModel().get_abs_award(conf_id,abs_type)
	status_type       = status_type.split(",")
	selection_type    = selection_type.split(",")
	if export_file=='csv':
		if export_column:
			if get_abs_details:
				data_name=[]
				for j in get_abs_details:
					data1={}
					for row in export_columns:
						if row == 'abs_no':
							abs_no=j[row]
							data1[row]=j['abs_type']+str(abs_no)
						elif row == 'full_name':
							full_name=j[row]
							data1[row]=j['prefix']+str(full_name)
						else:
							data1[row]=j[row]
					data_name.append(data1)
				get_select_columns = BoModel().get_select_columns(export_column,conf_id)
				col_name=[] 
				if get_select_columns:
					for j in get_select_columns:
						data2=j['cols_display_name']
						col_name.append(data2)
				return ExportDownloadCSV(data_name,export_columns,col_name,conf_key)
		else:
			now    = datetime.now()
			date   = now.strftime("%Y-%m-%d %H:%M")
			output = io.StringIO()
			writer = csv.writer(output)
			line   = ['S.No','ABS_No','Title', 'Category', 'Chief Author','Chief Author Membership No' ,'Presenting Author', 'Presenting Author Membership No','Co-Author']
			writer.writerow(line)
			sno_val = 0
			for row in get_abs_details:
				sno_val = sno_val +1
				abs_no  = row['abs_type']+str(row['abs_no'])
				chief_author=row['prefix']+row['full_name']
				line = [sno_val ,abs_no,row['title'],row['display_name'] ,chief_author, row['membership_no'],row['presenting_authour'],row['presenting_membership_no'],row['co_author']]
				writer.writerow(line)
			output.seek(0)
			return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+confData['conf_name']+"Abstract_Submission_Report"+str(date)+".csv"})
	if export_file=='xl' :
		if export_column:
			if get_abs_details:
				get_select_columns = BoModel().get_select_columns(export_column,conf_id)
				data_name=[]
				for j in get_abs_details:
					data1={}
					for row in export_columns:
						if row=='abs_no':
							data1[row]=j['abs_type']+str(j[row])
						elif row=='full_name':
							data1[row]=j['prefix']+str(j[row])
						else:
							data1[row]=j[row]
					data_name.append(data1)
				col_name=[] 
				if get_select_columns:
					for j in get_select_columns:
						data2=j['cols_display_name']
						col_name.append(data2)
				return ExportDownloadXSL(data_name,export_columns,col_name,conf_key)        
		else:
			output = io.BytesIO()
			Workbook =xlwt.Workbook()
			sh = Workbook.add_sheet('get_abs_details')
			sh.write(0,0,'Sno')
			sh.write(0,1,'Abs_No')
			sh.write(0,2,'Title')
			sh.write(0,3,'Category')
			sh.write(0,4,'Chief Author')
			sh.write(0,5,'Chief Author Membership No')
			sh.write(0,6,'Presenting Author')
			sh.write(0,7,'Presenting Author Membership No')
			sh.write(0,8,'Co- Author')
			idx=0
			sno_val = 0
			for data in get_abs_details:
				sno_val = sno_val+1
				abs_no  = data['abs_type']+str(data['abs_no'])
				chief_author=data['prefix']+data['full_name']
				sh.write(idx+1,0,sno_val)
				sh.write(idx+1, 1, abs_no)
				sh.write(idx+1, 2, data['title'])
				sh.write(idx+1, 3, data['display_name'])
				sh.write(idx+1, 4, chief_author)
				sh.write(idx+1, 5, data['membership_no'])
				sh.write(idx+1, 6, data['presenting_authour'])
				sh.write(idx+1, 7, data['presenting_membership_no'])
				sh.write(idx+1, 8, data['co_author'])
				idx+=1
			Workbook.save(output)
			output.seek(0)
			now    = datetime.now()
			date   = now.strftime("%Y-%m-%d %H:%M")
			return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+confData['conf_name']+"Abstract_Submission_Report-"+str(date)+".xls"})
	categories_data = UserModel().get_categories_v1(abs_type,conf_id)
	return render_template ('backoffice/report_table.html',category_id=category_id,presentation_type=presentation_type,selection_type=selection_type,status_type=status_type,abs_type=abs_type,data=get_abs_details,abs_types=abs_types,status=status,selection=selection,presentation=presentation,awards=awards,mail_templates=mail_templates,conf_id=conf_id,conf_key=conf_key,col_name=col_name,categories_data=categories_data)

def ExportDownloadCSV(data_name,export_columns,col_name,conf_key):
	conf_id          = request.values["conf_id"]
	confData  = Auth.get_conference(conf_id)
	now    = datetime.now()
	date   = now.strftime("%Y-%m-%d %H:%M")
	output = io.StringIO()
	writer = csv.writer(output)
	# writer = csv.writer(output,delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMA)
	line = col_name
	writer.writerow(line)
	for row in data_name:
		line = []
		for i in export_columns:
			line.append(row[i])
		writer.writerow(line)
	output.seek(0)
	return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+confData['conf_name']+"_Abstract_Submission_Report"+str(date)+".csv"})

def ExportDownloadXSL(data_name,export_columns,col_name,conf_key):
	now      = datetime.now()
	date     = now.strftime("%Y-%m-%d %H:%M")
	output   = io.BytesIO()
	Workbook = xlwt.Workbook()
	sh       = Workbook.add_sheet('Report')
	idx      = 0
	a = 0
	for row in col_name:
		sh.write(0,a,row)
		a+=1
	b=0
	sno_val = 0
	for row in data_name:
		for i in export_columns:
			sh.write(idx+1, b, row[i])
			b+=1
		b=0
		idx+=1
	Workbook.save(output)
	output.seek(0)
	now    = datetime.now()
	date   = now.strftime("%Y-%m-%d %H:%M")
	return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+str(conf_key)+"_Abstract_Submission_Report_"+str(date)+".xls"}) 

@app.route('/date_config/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_Date_config(conf_id,conf_key):
	confe = Auth.get_conference(conf_id).get('conference_header_logo')
	data  = BoModel().get_date_config(conf_id)
	now   = (datetime.now())
	return render_template('backoffice/settings/date_config.html',data=data,confe_logo=confe,now=now,conf_id=conf_id,conf_key=conf_key)

@app.route('/config_edit_model/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_config_model(conf_id,conf_key):
	config_id = request.values["config_id"]
	data      = BoModel().get_config_id(config_id)
	html = render_template('backoffice/settings/date_config_edit.html',data=data[0],conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)

@app.route('/post_config_edit_model/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_post_Date_config(conf_id,conf_key):
	config_id       = request.values["config_id"]
	start_date      = request.values["start_date"]
	end_date        = request.values["end_date"]
	title           = request.values.get("title" or None)
	description     = request.values["description"]
	abs_type_url    = request.values["abs_type_url"]
	abs_description = request.values["abs_description"]
	is_visible      = request.values.get("is_visible" or 0)
	order_by        = request.values["order_by"]
	data = {
	'start_date'     : start_date,
	'end_date'       : end_date,
	'title'          : title,
	'description'    : description,
	'abs_type_url'   : abs_type_url,
	'abs_description': abs_description,
	'is_visible'     : is_visible,
	'order_by'       : order_by,
	'updated_at' : str(datetime.now())
	}
	result = BoModel().sent_config(config_id,data)
	return redirect(url_for('backoffice.Bo_Date_config',conf_id=conf_id,conf_key=conf_key))

@app.route('/setting_config/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_setting_config(conf_id,conf_key):
	confe  = Auth.get_conference(conf_id).get('conference_header_logo')
	data   = BoModel().get_setting_config(conf_id)
	return render_template('backoffice/settings/project_edit.html',data=data,confe_logo=confe,conf_id=conf_id,conf_key=conf_key)


@app.route('/project_edit_model/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_project_setting_edit(conf_id,conf_key):
	setting_id = request.values["setting_id"]
	data = BoModel().get_setting_id(setting_id)
	html = render_template('backoffice/settings/project_edit_model.html',data=data[0],conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)

@app.route('/post_project_edit_model/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_post_project_config(conf_id,conf_key):
	setting_id = request.values["setting_id"]
	count      = request.values.get("count")
	data = {
	'setting_value' : count,
	}
	result = BoModel().sent_project_config(setting_id,data)
	return redirect(url_for('backoffice.Bo_setting_config',conf_id=conf_id,conf_key=conf_key))


# -------------      Evaluation  Assign      ------------------ #

@app.route('/evaluation_assign/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_Assign_val(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_types = BoModel().get_abs_type_for_eva(conf_id,confData.get('conf_schema'))
	eva_abs_types = BoModel().get_eva_abs_type_for_eva(conf_id)
	return render_template('backoffice/val/Assign_eva.html',abs_types=abs_types,conf_id=conf_id,conf_key=conf_key,eva_abs_types=eva_abs_types)

@app.route('/eva_category/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Eva_Category(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type = request.values.get('abs_type')
	if abs_type:
		categories = BoModel().get_categories_for_eva(abs_type,conf_id,confData.get('conf_schema'))
	else:
		categories = []
	return jsonify(categories)

@app.route('/get_evaluation_type/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_evaluation_type(conf_id,conf_key):
	abs_type = request.values.get('abs_type')
	eva_abs_types = BoModel().get_eva_abs_type_for_eva_v1(abs_type,conf_id)
	return jsonify(eva_abs_types)

@app.route('/eva_category_status/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Eva_Category_status(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type = request.values.get('abs_type')
	categories = BoModel().get_categories_for_eva(abs_type,conf_id,confData.get('conf_schema'))
	return jsonify(categories)



@app.route('/view_eva_type/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def View_eva_type(conf_id,conf_key):
	abs_type = request.values.get('eva_abs_type')
	data = BoModel().get_abstract_typebyabstype(conf_id,abs_type)
	data['d_start_date'] = data['start_date'].strftime('%Y-%m-%dT%H:%M') if data['start_date'] else None
	data['d_end_date'] = data['end_date'].strftime('%Y-%m-%dT%H:%M') if data['end_date'] else None
	return jsonify(data)

@app.route('/search_evaluator/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Search_Evaluator(conf_id,conf_key):
	searchtext = request.values["searchvalue"]
	data = BoModel().get_search(searchtext,conf_id)#getting search data from DB to step3
	html = render_template('backoffice/val/eval_assign_search_table.html',data=data)
	return jsonify(html)

@app.route('/add_eval_assign/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Add_Eval_assign(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type = request.values.get('abs_type')
	cat_id   = request.values.get('cat_id')
	eval_id  = request.values.get('eval_id')
	eva_abs_type = request.values.get('ddlevatype')
	abs_nos = request.values.get('abs_nos')
	add_evaluator = BoModel().get_abs_for_eval(abs_type,cat_id,eval_id,eva_abs_type,abs_nos,conf_id,confData['conf_schema'])
	return jsonify()

@app.route('/get_eva_assign_paper/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_eva_assign_paper(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type    = request.values.get('abs_type')
	eva_abs_type = request.values.get('eva_abs_type')
	cat_type_id = request.values.get('cat_id')
	get_details = BoModel().get_eva_by_catid(abs_type,cat_type_id,eva_abs_type,conf_id,confData['conf_schema'])
	html = render_template('backoffice/val/eval_assign_table.html',data=get_details,conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)

@app.route('/remove_evaluator/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Remove_Evaluator(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	user_id = request.values.get('user_id')
	eva_abs_type = request.values.get('eva_abs_type')
	delete_eva = BoModel().delete_evaluator(user_id,eva_abs_type,conf_id,confData['conf_schema'])
	return jsonify()

@app.route('/add-evaluation-type/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Addevaluationtype(conf_id,conf_key):
	eva_type  = request.form['eva_abs_type']
	title   = request.form['abs_title']
	start_date = request.form['eva_start_date']
	end_date = request.form['eva_end_date']
	is_visible = request.values.get('eva_is_visible') or 0
	button_name = request.values.get('eva_button_val')
	abs_type_id = request.form['eva_abs_id']
	data = {
		'abs_type':eva_type,
		'title':title,
		'start_date':start_date,
		'end_date':end_date,
		'is_visible':is_visible,
		'button_name':button_name,
		'conf_id':conf_id
	}
	result = BoModel().Add_eva_abstract_type(data,abs_type_id)
	return "success"
	
@app.route('/delete_eva_abs/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Delete_eva_abs(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	mark_id= request.values.get('mark_id')
	delete_eva = BoModel().delete_eva_abs(mark_id,confData.get('conf_schema'))
	return jsonify()

@app.route('/view_evaluation/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def View_Evaluation(conf_id,conf_key):
	conf_data = Auth.get_conference(conf_id)
	abs_types = BoModel().get_abs_type_for_eva(conf_id,conf_data.get('conf_schema'))
	data = {}
	total_report={}
	abs_type = request.values.get('ddlAbstractType') or None 
	eva_abs_type = request.values.get('ddlevaAbstractType') or None
	cat_id   = request.values.get('ddlCategory') or None
	if cat_id == "None":
		cat_id = None
	percent_filter_start = request.values.get('p_f_start') or 0
	percent_filter_end = request.values.get('p_f_end') or 100
	p_r_type = request.values.get('p_r_type') or 1
	order_by = request.values.get('order_by') or "DESC"
	if abs_type and eva_abs_type:
		data = BoModel().get_evaluators(eva_abs_type,cat_id,conf_id,percent_filter_start,percent_filter_end,order_by)
		total_report = data[1]
		data = data[0]
		output = io.StringIO()
		writer = csv.writer(output)
		is_download = request.values.get('is_download')
		if data and int(is_download) == 1:
			hline = list(data[0].keys())
			writer.writerow(hline)
			for i in data:
					line = []
					for j in hline:
						line.append(i[j])
					writer.writerow(line)
			output.seek(0)
			return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+str(conf_data["conf_key"])+abs_type+"_status_report.csv"})
	return render_template('backoffice/val/view_eval_index.html',abs_types=abs_types,eva_abs_type=eva_abs_type,conf_id=conf_id,conf_key=conf_key,data=data,abs_type=abs_type,cat_id=cat_id,p_r_type=p_r_type,p_f_end=percent_filter_end,p_f_start=percent_filter_start,order_by=order_by,total_report=total_report)

@app.route('/eva_view/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Eval_view(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type      = request.values.get('abs_type')
	cat_type_id   = request.values.get('cat_id')
	user_id       = request.values.get('user_id')
	get_details = BoModel().get_eva_by_user_id(abs_type,cat_type_id,user_id,conf_id,confData.get('conf_schema'))
	return render_template('backoffice/val/view_eval.html',data=get_details,conf_id=conf_id,conf_key=conf_key)

@app.route('/regen_eval_assign/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Regen_evaluator(conf_id,conf_key):
	abs_type = request.values.get('abs_type')
	cat_id   = request.values.get('cat_id')
	regen_eval = BoModel().Regen_evaluator_by_id(abs_type,cat_id,conf_id)
	return jsonify()

@app.route('/find_evaluator/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Find_Evaluator(conf_id,conf_key):
	host_url = request.host_url
	abs_type = request.values.get('abs_type') or ''
	p_r_type = request.values.get('p_r_type') or 0
	eva_abs_types = BoModel().get_eva_abs_type_for_eva(conf_id)
	result = BoModel().get_evaluators_seach(conf_id,conf_key,host_url,abs_type)
	return render_template('backoffice/val/find_evaluator.html',data=result,conf_id=conf_id,conf_key=conf_key,eva_abs_types=eva_abs_types,p_r_type=p_r_type)

#------------------------------------ Mukesh mail evaluation reminder mail function -----------------------------------------------------------------#

@app.route('/mail_eva_reminder/<btn_val>/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def mail_eva_reminder(btn_val,abs_type,conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	template_name = abs_type+'_eva_reminder_mail'
	mailData      = UserModel().get_mail_templates(template_name,conf_id)
	if not mailData:
		data = {'msg':'Mail template Not Found'}
		return jsonify(data)
	sub_data      = {'conf_name': confData['conf_name']}
	subject       = Helper.merge_tags(mailData.subject,sub_data)
	checkbox = request.form.getlist('to_mail')
	user_ids = ",".join(checkbox)
	if user_ids :
		mail_ids   = BoModel().get_evaluators_mail(user_ids,abs_type,conf_id,confData.get('conf_schema'))
		
		if int(btn_val) == 0 :  
			
			for i in mail_ids:
				mail_data     = {'mail_content': mailData.mail_content,'data': i,'confData':confData}
				mail_content  = Helper.convert_html_for_mail_screen(mail_data)
				html          = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
				to            = i["email"]
				EMAIL.sendMail_v1(subject,html,to,mailData,conf_id)
			data = {'msg':'Mail sent successfully'}
			return jsonify(data)
		else: #test mail
			email = request.values["test_mail_id"]
			for i in mail_ids:
				mail_data     = {'mail_content': mailData.mail_content,'data': i,'confData':confData}
				mail_content  = Helper.convert_html_for_mail_screen(mail_data)
				html          = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
				to            = email
				EMAIL.sendMail_v1(subject,html,to,mailData,conf_id)
			data = {'msg':'Test mail sent successfully'}
			return jsonify(data)
	return jsonify(1)


#------------------------------------ Priyavarthana mail evalution invite function using get mail content from database ----------------------------------#

@app.route('/mail_eva/<btn_val>/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Mail_Eva(btn_val,abs_type,conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	template_name = abs_type+'_eva_invite_mail'
	mailData      = UserModel().get_mail_templates(template_name,conf_id)
	if not mailData:
		data = {'msg':'Mail template Not Found'}
		return jsonify(data)
	checkbox = request.form.getlist('to_mail')
	user_ids = ",".join(checkbox)
	if user_ids :
		mail_ids   = BoModel().get_evaluators_mail(user_ids,abs_type,conf_id,confData.get('conf_schema'))
		
		if int(btn_val) == 0 :  
			
			for i in mail_ids:
				sub_data      = {'conf_name': confData['conf_name'],'eva_name':i['evaluator_name']}
				subject       = Helper.merge_tags(mailData.subject,sub_data)
				mail_data     = {'mail_content': mailData.mail_content,'data': i,'confData':confData}
				mail_content  = Helper.convert_html_for_mail_screen(mail_data)
				html          = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
				to            = i["email"]
				EMAIL.sendMail_v1(subject,html,to,mailData,conf_id)
			data = {'msg':'Mail sent successfully'}
			return jsonify(data)
		else: #test mail
			email = request.values["test_mail_id"]
			for i in mail_ids:
				sub_data      = {'conf_name': confData['conf_name'],'eva_name':i['evaluator_name']}
				subject       = Helper.merge_tags(mailData.subject,sub_data)
				mail_data     = {'mail_content': mailData.mail_content,'data': i,'confData':confData}
				mail_content  = Helper.convert_html_for_mail_screen(mail_data)
				html          = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
				to            = email
				EMAIL.sendMail_v1(subject,html,to,mailData,conf_id)
			data = {'msg':'Test mail sent successfully'}
			return jsonify(data)
	return jsonify(1)

@app.route('/abs_selection/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Abs_Selection(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_types = BoModel().get_abs_type_for_eva(conf_id,confData.get('conf_schema'))
	abs_type  = "OP"
	selection_type = BoModel().get_selection_type(abs_type)
	if request.method == "POST":
		abs_type = request.values['ddlAbstractType']or None
		eva_abs_type = request.values['ddlevaAbstractType']or None
		cat_id   = request.values['ddlCategory']or None
		export_file          = request.values["export_file"] or None
		if export_file == "xl":
			cat_id = None
		data     = BoModel().get_evaluation_summary_data(eva_abs_type,conf_id,cat_id) 
		for index,value in enumerate(data) :
			if index == 0:
				data_1 = value
			if index == 1:
				data_2 = value
			if index == 2:
				evaluator = value
		abs_eval_marks = {}
		if data_2:
			for m in data_2:
				mkey = f"{m.get('abs_id')}-{m.get('eva_user_id')}"
				abs_eval_marks[mkey] = {'abs_id':m.get('abs_jd') ,'marks_total':m.get('marks_total')} 
		count_data = BoModel().get_selection_count(cat_id,abs_type,conf_id,confData.get('conf_schema'))
		fp_count_data = BoModel().get_count_by_selection_type(conf_id,cat_id,abs_type,confData.get('conf_schema'))
		return render_template('backoffice/selection/abs_selection.html',abs_types=abs_types,conf_id=conf_id,conf_key=conf_key,data_1=data_1,abs_type=abs_type,cat_id=cat_id,evaluator=evaluator,data_2=data_2,eva_abs_type=eva_abs_type,abs_eval_marks=abs_eval_marks,count_data=count_data,selection_type=selection_type,fp_count_data=fp_count_data)
	return render_template('backoffice/selection/abs_selection.html',abs_types=abs_types,selection_type=selection_type,conf_id=conf_id,conf_key=conf_key)

@app.route('/get_other_ic_selected_by_user/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def getothericseleted(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	user_id  = request.values.get('user_id')
	abs_type = request.values.get('abs_type')
	abs_id   = request.values.get('abs_id')
	abs_data = BoModel().get_other_id_selected_by_user(conf_id,user_id,abs_type,confData.get('conf_schema'))
	return render_template('backoffice/selection/other_ic_abs_table.html',conf_id=conf_id,conf_key=conf_key,abs_data=abs_data,abs_type=abs_type,abs_id=abs_id)

@app.route('/get_selection_paper/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_selection_paper(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type      = request.values.get('abs_type')
	cat_type_id   = request.values.get('cat_id')
	conf_id       = request.values.get('conf_id')
	get_details = BoModel().get_paper_for_selection(abs_type,cat_type_id,conf_id,confData.get('conf_schema'))
	html   = render_template('backoffice/selection/selection_tabel.html',data=get_details)
	return jsonify(html)

@app.route('/select_paper/<btn_val>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def select_paper(btn_val,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	selection_id = request.values.get('selection_type_id') or 0
	checkbox = request.form.getlist('select')
	abs_ids = ",".join(checkbox)
	abs_status_id = 2
	if btn_val == "0" :
		abs_status_id = 3
	if abs_ids :
		BoModel().update_status_to_selected(abs_ids,abs_status_id,selection_id,confData.get('conf_schema'))
		status=1
	else:
		status=2
	return jsonify(status)
# ------------------------------------------------------------------------ #

#  IC Consent status #
@app.route('/abstract/consent/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Consent_status(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	btn_val = request.form.get("btn_val" or None)
	if btn_val:
		consent_status_id = request.form.get("consent_status_id" or None)
		abs_no            = request.values.get("abs_no" or None)
		data              = BoModel().get_consent_status_data(abs_no,consent_status_id,confData['conf_schema'])
		return render_template('backoffice/abstract/consent_status.html',data = data,abs_no = abs_no,consent_status_id = consent_status_id,conf_id=conf_id,conf_key=conf_key)
	return render_template('backoffice/abstract/consent_status.html',conf_id=conf_id,conf_key=conf_key)

@app.route('/abstract/verify/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Verify_IC(abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	categories    =  BoModel().get_categories_for_verify(abs_type,confData['conf_schema'])
	cat_with_abs  =  BoModel().get_category_with_abstract(confData['conf_schema'],abs_type)
	cat_abs       =  defaultdict(list)
	for r in cat_with_abs:
		cat_abs[r["parent_category_id"]].append(r)
	return render_template('backoffice/abstract/verify.html',categories = categories,data=cat_abs)

# Priyavarthana for sending reminder mail for video and eposter not received

@app.route('/abstract/cdstatus/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def CDstatus(abs_type,conf_id,conf_key):
	data         = BoModel().get_status_selection_type_of_presentation_abs_types(conf_id)
	status       = data[0]
	datas        = BoModel().usp_abs_files_received_status(conf_id,None)
	confData     = Auth.get_conference(conf_id)
	return render_template('backoffice/abstract/vtcdstatus.html',conf_id=conf_id,conf_key=conf_key,abs_type=abs_type,status=status,datas=datas,confData=confData)

@app.route('/abstract/get_absnotype/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def GetAbsNoType(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type = request.values["abs_type"]
	data = BoModel().getAbsNosType(abs_type,conf_id,confData['conf_schema'])
	return jsonify(data)

@app.route('/get_all_attachement_abstract/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def GetAllAttachmentAbstract(abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abstractData = BoModel().get_category_with_abstract(abs_type,conf_id,confData['conf_schema'])
	html = render_template('backoffice/abstract/cdstatus_table.html',data=abstractData,conf_id=conf_id,conf_key=conf_key,abs_type=abs_type)
	return jsonify(html)

@app.route('/get_abstract_for_cdstatus/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def GetAbstractForCDStatus(abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	cd_status_id = request.values.get('vt_status') or None
	abs_status_id = request.values.get('abs_status_id') or None
	cat_with_abs = BoModel().get_abstract_received_notreceived(abs_status_id,cd_status_id,abs_type,conf_id,confData['conf_schema'])
	html = render_template('backoffice/abstract/cdstatus_table.html',data=cat_with_abs,conf_id=conf_id,conf_key=conf_key,abs_type=abs_type)
	return jsonify(html)
# end

@app.route('/export_received_attachment/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def ExportReceivedAttachment(abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	cd_status_id = request.values.get('vt_status') or None
	abs_status_id = request.values.get('abs_status_id') or None
	cat_with_abs = BoModel().get_abstract_received_notreceived(abs_status_id,cd_status_id,abs_type,conf_id,confData['conf_schema'])
	output = io.BytesIO()
	Workbook =xlwt.Workbook()
	col_name       = ["Abs no","Title","Presenting Author Name","Presenting Author Email","Presenting Author Mobile","Category","Received At"]
	export_columns = ["abss_type","title","presenting_author","email","mobile","display_name","cd_received_at"]
	sheet_name = "reports"
	sh = Workbook.add_sheet(sheet_name)
	idx  = 0
	a    = 0
	sh.row(0).height = 20*30
	# t_style=xlwt.easyxf('alignment: wrap True;''pattern: pattern solid,fore_colour yellow;' 'font: colour black, bold True, name Calibri, height 230; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')
	data_name=[]
	
	if cat_with_abs:	
		for j in cat_with_abs:
			data1={}
			for row in export_columns:
				
				data1[row]=j[row]
			data_name.append(data1)
			
		for row in col_name:
			sh.write(0,a,row)
			a+=1
		b=0
		for row in data_name:
			for i in export_columns:
				# sh.write(idx+1, b, b)
				sh.write(idx+1, b, row[i])
				b+=1
			b=0
			idx+=1
		# print(output)
		Workbook.save(output)
		output.seek(0)
		now    = datetime.now()
		date   = now.strftime("%Y-%m-%d %H:%M")
		# print(output)
		
		return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+str(conf_key)+"_Abstract_Submission_Report_"+str(date)+".xls"}) 
	return None

@app.route('/abstract/mail_cdstatus/<btn_val>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Mail_cddtatus(btn_val,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	checkbox = request.values.getlist('chk_send_reminder')
	cd_status_id   = request.values.get('vt_status') or None
	abs_status_id = request.values.get('abs_status_id') or None
	if checkbox:
		for j in checkbox:

			data         = AbstractModel().get_sept4_data(j,confData.get('conf_schema'))
			
			
			if int(btn_val) == 0:
				email = data["email"]
				# email = "mukeshkumar@numerotec.com"
				msg = 'Mail sent successfully'
			else:
				email = request.values["test_mail_id"]
				msg = 'Test mail sent successfully'
				
			template_name = "attachment_reminder_mail"
			mailData      = UserModel().get_mail_templates(template_name,conf_id)
			sub_data      = {'abs_type':data['abs_type'],'abs_no':str(data['abs_no']),'title':str(data['title'])}
			subject       = Helper.merge_tags(mailData.subject,sub_data)
			mail_data = {
				'mail_content': mailData.mail_content,
				'data'        : data,
				'confData'    : confData
			}
			mail_content  = Helper.convert_html_for_mail_screen(mail_data)
			html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
			EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
		data = {'msg':msg}
		return jsonify(data)
	else:
		return jsonify(1)

@app.route('/post_received_at/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_CD_received_at(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	cd_received_at = request.values.get("cd_received_at" or None)
	abs_id         = request.values.getlist("abs_id" or None)
	abs_type       = request.values.get('abs_type' or None)
	abs_status_id = request.values.get('abs_status_id') or None
	is_today  = request.values.get('is_today')
	if int(is_today) == 1:
		cd_received_at = datetime.now()
	data = {
	'cd_received_at' :cd_received_at,
	'updated_at' : datetime.now()
	}
	update       = BoModel().update_abstracts(abs_id,data,confData.get('conf_schema'))
	cd_status_id = request.values.get('vt_status') or None
	cat_with_abs = BoModel().get_abstract_received_notreceived(abs_status_id,cd_status_id,abs_type,conf_id,confData['conf_schema'])
	html         = render_template('backoffice/abstract/cdstatus_table.html',data=cat_with_abs,conf_id=conf_id,conf_key=conf_key,abs_type=abs_type)
	return jsonify(html)

@app.route('/post_bulk_received_at/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_Bulk_received_at(abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	cd_received_at = request.values.get("cd_received_at" or None)
	abs_ids         = request.form.getlist("abs_ids")

	data = {
	'cd_received_at' :cd_received_at,
	'updated_at' : datetime.now()
	}
	if abs_ids and cd_received_at :
		update       = BoModel().update_abstracts(abs_ids,data,confData.get('conf_schema'))
		cd_status_id = request.values.get('vt_status_m') or None
		abs_status_id = request.values.get('abs_status_id_m') or None
		
		cat_with_abs = BoModel().get_abstract_received_notreceived(abs_status_id,cd_status_id,abs_type,conf_id,confData['conf_schema'])
		html         = render_template('backoffice/abstract/cdstatus_table.html',data=cat_with_abs,conf_id=conf_id,conf_key=conf_key,abs_type=abs_type)
		return jsonify(html)
	else:
		return jsonify(1)

#------------- mail template edit --------

@app.route('/mail_template/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Mail_template(conf_id,conf_key):
	data = BoModel().get_templates_data(conf_id)
	return render_template('backoffice/settings/template_edit.html',data = data,conf_id=conf_id,conf_key=conf_key)

@app.route('/template_edit_model/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Template_edit_model(conf_id,conf_key):
	template_id = request.values.get("template_id" or None )
	# temp = Helper.convert_jinja_template(data1,data)
	data = BoModel().get_template_data(template_id)
	html = render_template('backoffice/settings/template_edit_model.html',data = data,conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)

@app.route('/post_mail_template_edit/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Bo_post_template_config(conf_id,conf_key):
	template_id   = request.values.get("template_id" or None)
	data = {
	'subject' : request.values.get("subject" or None),
	'template_data' :request.values.get("template_data" or None),
	}
	update = BoModel().update_mail_template(data,template_id)
	return redirect(url_for("backoffice.Mail_template",conf_id=conf_id,conf_key=conf_key))

#---------------------------------------

@app.route('/abstract/hallassignment/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Hall_Assignment(conf_id,conf_key):
	is_program_sheet = request.values.get("is_program_sheet") or 0
	conf_data  = Auth.get_conference(conf_id)
	start_date = conf_data['conf_start_dt']
	end_date   = conf_data['conf_end_dt']
	halls      = BoModel().get_halls(conf_id)
	abs_types  = BoModel().get_abs_type(conf_id);
	selection_type = BoModel().get_selection_type('abs_type')
	if int(is_program_sheet) == 1:
		return render_template('backoffice/program_sheet/hallassignment.html',halls=halls,conf_id=conf_id,conf_key=conf_key,abs_types=abs_types,selection_type=selection_type)
	else:
		return render_template('backoffice/abstract/hallassignment.html',halls=halls,conf_id=conf_id,conf_key=conf_key,abs_types=abs_types,selection_type=selection_type)


@app.route('/ajax/get_sessions/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_sessions(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	abs_type = request.values.get("abs_type" or None)
	session_data = BoModel().get_abs_session(conf_id,abs_type,confData.get('conf_schema'))
	if abs_type == "IC":
		halls      = BoModel().get_halls(conf_id)
		session_data = render_template('backoffice/abstract/ic_hallassignment_table.html',session_data=session_data,halls=halls)
	return jsonify(session_data)

@app.route('/ajax/save_ic_abs_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Save_ic_abs_session(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	no_ic_abstracts    = request.form.get("no_ic_abstracts" or None)
	insert_data  = []
	update_data   = []
	for i in range(1,int(no_ic_abstracts)+1):
		session_id = request.values.get("abs_session_id_"+str(i)) or None
		if session_id:
			data = {
				"abs_session_id" : session_id,
				"start_date"     : request.values.get("abs_session_start_time_"+str(i)) or None,
				"end_date"       : request.values.get("abs_session_end_time_"+str(i)) or None, 
				"hall_id"        : request.values.get("session_hall_id_"+str(i)) or None,
			}
			update_data.append(data)
		else:
			data = {
				"abs_session_id" : session_id,
				"abs_id"         : request.values.get("abs_id_"+str(i)) or None,
				"start_date"     : request.values.get("abs_session_start_time_"+str(i)) or None,
				"end_date"       : request.values.get("abs_session_end_time_"+str(i)) or None, 
				"hall_id"        : request.values.get("session_hall_id_"+str(i)) or None,
			}
			insert_data.append(data)
	if insert_data:
		BoModel().add_new_IC_sessions(insert_data,conf_id,confData.get('conf_schema'))
	if update_data:
		BoModel().update_IC_sessions(update_data,confData.get('conf_schema'))
	return jsonify()
	
@app.route('/ajax/insert_ic_abs_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def InsertICSession(conf_id,conf_key):
	results = BoModel().usp_generate_ic_sessions(conf_id)
	return jsonify(results)


@app.route('/ajax/get_session_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_session_data(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	session_id = request.values.get("session_id" or None)
	session_data = BoModel().get_session_data(session_id,confData.get('conf_schema'))
	if session_data["start_date"]:
		session_data["start_date"] = session_data["start_date"].strftime("%Y-%m-%d %H:%M")
	if session_data["end_date"]:
		session_data["end_date"] = session_data["end_date"].strftime("%Y-%m-%d %H:%M")
	return jsonify(session_data)

@app.route('/ajax/save_abs_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Save_abs_session(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	session_id   = request.values.get("session_id")
	session_name = request.values.get("session_name")
	abs_type     = request.values.get("abs_type")
	start_date   = request.values.get("start_date")
	hall_id      = request.values.get("hall_id")
	end_date     = request.values.get("end_date")
	if session_id and int(session_id) >= 1:
		data = {
		'session_name' : session_name,
		'start_date'   : start_date,
		'end_date'     : end_date,
		'hall_id'      : hall_id, 
		}
		BoModel().update_session(data,session_id,confData.get('conf_schema'))
	else:
		data = {
		'session_name' : session_name,
		'conf_id'      : conf_id,
		's_abs_type'     : abs_type,
		}
		BoModel().insert_new_session(data,confData.get('conf_schema'))
	return jsonify()
# /ajax/get_session_abstracts

@app.route('/ajax/get_session_abstracts/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_session_Abstracts(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	session_id   = request.values.get("session_id")
	abs_type     = request.values.get("abs_type")
	sel_type_id  = request.values.get('sel_type')
	data         = BoModel().get_session_abstract_data(session_id,abs_type,conf_id,confData.get('conf_schema'))
	data1        = BoModel().get_new_session_abstract_data(abs_type,conf_id,sel_type_id,confData.get('conf_schema'))
	html  = render_template('backoffice/abstract/hallassignment_table.html',data=data,data1=data1)
	return jsonify(html)



@app.route('/ajax/add_remove_abstracts_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def add_remove_session_Abstracts(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_ids    = request.values.get("abs_ids")
	session_id = request.values.get("session_id")
	btn_val    = request.values.get("btn_val")
	if abs_ids:
		BoModel().add_session_abstract(session_id,abs_ids,btn_val,confData.get('conf_schema'))
	return jsonify("success")



@app.route('/abstract/storehallassignment/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.login_required #check if login else automatically redirect to login page
def StoreHallAssigment(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	total_length = request.values.get("total_length")
	data = []
	abs_ids = []
	for i in range(1,int(total_length)+1):
		date = request.values.get('hall_date_'+str(i))
		dicts = {
			'abs_id'     : request.values.get('abs_id_'+str(i)),
			'hall_id'    : request.values.get('hall_id_'+str(i) or 'Null' ), 
			'starts_by'  : "' "+date+ " " +request.values.get('start_time_'+str(i) or 'Null')+" '",
			'ends_by'    : "' "+date+ " " +request.values.get('end_time_'+str(i) or 'Null')+" '",
		}
		abs_ids.append(request.values.get('abs_id_'+str(i)))
		data.append(dicts)
	data_post = BoModel().store_hall_assignment(data,abs_ids,confData.get('conf_schema'))
	flash("successfully Hall Assignment updated ","successMsg")
	return redirect(url_for("backoffice.Hall_Assignment",btn_val = 0,conf_id=conf_id,conf_key=conf_key))


@app.route('/abstract/general_paper/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def General_Paper_list(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data = BoModel().get_gp_list(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/general_paper_list.html',data=data,conf_id=conf_id,conf_key=conf_key)

@app.route('/abstract/newgp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def New_GP(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	society_id = confData.get("society_id")
	user_id = Auth.get_user(society_id).get("user_id")
	insert_gp = BoModel().insert_new_gp('GP',conf_id,user_id,confData.get('conf_schema'))
	is_program_sheet = request.values.get("is_program_sheet") or 0
	return redirect(url_for("backoffice.Gp_abstract",abs_id=insert_gp,conf_id=conf_id,conf_key=conf_key,is_program_sheet=is_program_sheet))


@app.route('/abstract/gp/<abs_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Gp_abstract(abs_id,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	is_program_sheet = request.values.get("is_program_sheet") or 0
	data       = BoModel().get_gp_abstract_data(abs_id,confData.get('conf_schema'))
	desigation = BoModel().get_role_for_desigination()
	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.strftime("%Y-%m-%d"))
	halls      = BoModel().get_halls(conf_id)
	if int(is_program_sheet) == 1:
		return render_template('backoffice/program_sheet/GP_edit.html',data=data,abs_id=abs_id,halls=halls,confe_date=confe_date,desigation=desigation,conf_id=conf_id,conf_key=conf_key)
	else:   
		return render_template('backoffice/abstract/GP_abstract/GP_edit.html',data=data,abs_id=abs_id,halls=halls,confe_date=confe_date,desigation=desigation,conf_id=conf_id,conf_key=conf_key)


@app.route('/Gp_searchauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Gp_Searchauthor(conf_id,conf_key):
	searchtext = request.values["searchtext"]
	abs_type   = request.values["abs_type"]
	btn_val    = request.values["btn_val"]
	society_id = Auth.get_conference(conf_id).get("society_id")
	role_id    = 33
	data       = UserModel().get_search_data(searchtext,role_id,abs_type,society_id,conf_id)#getting search data from DB to step3 
	if btn_val == "1":
		html = render_template('backoffice/abstract/GP_abstract/chief_authour_search_table.html',abs_type=abs_type,data=data,conf_id=conf_id,conf_key=conf_key)
		return jsonify(html)
	else:
		html = render_template('backoffice/abstract/GP_abstract/GP_co_authour_search.html',abs_type = abs_type,data=data)
		return jsonify(html)


@app.route('/step3_GP_getauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step3_GP_getauthor(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_id     = request.values["abs_id"]
	abs_type   = request.values["abs_type"]
	desigation = BoModel().get_role_for_desigination()
	data       = AbstractModel().get_GP_authors(abs_id,confData['conf_schema'])#geting author to show in step 3 table
	html  = render_template('backoffice/abstract/GP_abstract/GP_co_authour_table.html',abs_type=abs_type,data=data,desigation=desigation,conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)


@app.route('/step3model_Chief_author/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def BO_Step3model_chief_author(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	user_id   = request.values["searchvalue"]
	abs_type  = request.values["abs_type"]
	addcoinst = UserModel().get_user_data(user_id)#getting user data
	abs_id    = request.values["abs_id"]
	role_id   = request.values["role_id"]
	data      = AbstractModel().add_to_GP_author(abs_id,user_id,confData['conf_schema'])#adding presenting author for VT
	html = render_template('backoffice/abstract/GP_abstract/Chief_authour_table.html',data2=addcoinst,conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)

@app.route('/GPstep1getauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step1_GP_get_author(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	abs_id     = request.values["abs_id"]
	data=AbstractModel().GP_step1_get_author(abs_id,confData.get('conf_schema'))#getting the presenting author to show in step1
	if(data == []):
		data1 = 0
		return jsonify(data1)
	html = render_template('backoffice/abstract/GP_abstract/Chief_authour_table.html',data2=data,conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)

@app.route('/step3model_gp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Step3model_GP(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	user_id   = request.values["searchvalue"]
	abs_type  = request.values["abs_type"]
	addcoinst = UserModel().get_user_data(user_id)#getting user data
	abs_id    = request.values["abs_id"]
	role_id   = request.values.get("role_id" or 'Null' )
	topic     = request.values.get("topic" or 'Null')
	order_by  = request.values.get("order_by" or 'Null')
	duration  = request.values.get("duration" or 'Null')
	if not role_id:
		role_id = "Null"
	if not order_by:
		order_by = "Null"
	if not duration:
		duration = "Null"
	data      = AbstractModel().add_to_GP_presenting_author(confData.get('conf_schema'),abs_id,user_id,role_id,topic,order_by,duration)#adding presenting author for FP
	html = render_template('backoffice/bo_edit/co_athour_table.html',data2=addcoinst,conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)


@app.route('/abstract/post_gp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_gp_abstract(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	if request.method == "POST":
		abs_id   = request.values.get('abs_id' or '')
		title    = request.values.get('title' or '')
		Synopsis = request.values.get('Synopsis' or '')
		date     = request.values.get('hall_date' or '')
		hall_id  = request.values.get('hall_id' or '')
		start_time = request.values.get('start_time' or '00:00')
		end_time = request.values.get('end_time' or '00:00')
		user_id  = request.values.get('pre_user_id' or '')
		abs_type = request.values.get('abs_type' or '')
		abs_no   = request.values.get('abs_no' or '')
		session_id = request.values.get('session_id' or '')
		data = {
			'title'         : title,
			'synopsis'      : Synopsis,
			'updated_at'    : datetime.now(),
			'abs_status_id' : 2,
			'submitted_at'  : datetime.now(),
			'conf_id'       : conf_id,
		}
		session_data = {
			'start_date'     : str(date + " " + start_time) if date else None ,
			'end_date'       : str(date + " " + end_time) if date  else None,
			'hall_id'       : hall_id,
			'conf_id'       : conf_id,
			'created_at'    : datetime.now(),
		}
		if (not abs_no):
			update = AbstractModel().abstract_submited(user_id,abs_id,abs_type,data,conf_id)
			BoModel().update_gp_session(session_data,abs_id,confData.get('conf_schema'))
		update_step = UserModel().update_step(data,abs_id,confData.get('conf_schema'))
		if session_id:
			update_session = BoModel().update_abs_session(session_data,session_id,confData.get('conf_schema'))
		total_co = request.values.get('total_co') or 0 
		data = []
		topic_ids = []
		if total_co != '0':
			for i in range(1,int(total_co)+1):
				order_no = request.values.get("order_no_"+str(i)) or None
				duration = request.values.get("duration_"+str(i)) or 0
				role_id = request.values.get("desigation_"+str(i)) or None
				topic = request.values.get("topic_"+str(i)) or None
				dicts ={
				'topic_id' : request.values.get("topic_id_"+str(i) or 'null'),
				'topic'    : topic,
				'role_id'  : role_id,
				'order_no' : order_no,
				'duration' : duration,
				}
				topic_ids.append(request.values.get("topic_id_"+str(i) or ''))
				data.append(dicts)
			update_co = BoModel().update_GP_co_author(data,topic_ids,confData.get('conf_schema'))

	return redirect(url_for("backoffice.General_Paper_list",conf_id=conf_id,conf_key=conf_key))

@app.route('/abstract/view/gp/<abs_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def View_GP(abs_id,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data = BoModel().get_gp_abstract_data(abs_id,confData.get('conf_schema'))
	data1=AbstractModel().GP_step1_get_author(abs_id,confData.get('conf_schema'))
	data2=AbstractModel().get_GP_authors(abs_id,confData.get('conf_schema'))#geting author to show in step 3 table
	return render_template('backoffice/abstract/GP_abstract/GP_view.html',data=data,data1=data1,data2=data2,conf_id=conf_id,conf_key=conf_key)

@app.route('/abstract/sendresult/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def SendResult(abs_type,conf_id,conf_key):
	selection_type = BoModel().get_selection_type(abs_type)
	data              = []
	selection_type_id = ""
	status            = ""
	delegate_reg      = None
	role_id           = None
	if request.method == "POST":
		selection_type_id = request.values.get("ddlsel_type",None) or None
		status           = request.values.get("ddlstatus",None) or None
		delegate_reg     = request.values.get("delegate_reg",None) or None
		role_id          = request.values.get("role_id",None) or None
#       data             = BoModel().get_selection_data(selection_type_id,status,abs_type,delegate_reg,conf_id)
		data = BoModel().usp_abs_selection_result_with_delegate(abs_type,selection_type_id,status,delegate_reg,role_id,conf_id)
		for index,value in enumerate(data):
			if index == 0:
				data = value
		if data:
			if not data[0]["abs_id"] :
				data = []
		else:
			 data = []
	return render_template('backoffice/abstract/sendresult.html',selection_type = selection_type,abs_type=abs_type,data=data,selection_type_id=selection_type_id,status=status,conf_id=conf_id,conf_key=conf_key,delegate_reg=delegate_reg,role_id=role_id)

@app.route('/mail_result_mail/<btn_val>/<conf_id>/<conf_key>/<abs_type>/<selection_type_id>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Mail_Result_Mail(btn_val,conf_id,conf_key,abs_type,selection_type_id):
	confData = Auth.get_conference(conf_id)
	checkbox = request.values.getlist('select_to_mail')
	abs_ids  = ",".join(checkbox)
	if abs_ids :
		mail_ids   = BoModel().get_mail_ids_by_abs_id_v1(abs_ids,confData.get('conf_schema'))
#       print('mail_ids - ', mail_ids)
#       return jsonify(mail_ids)
		confe_logo = confData['mail_header_logo']
		if int(conf_id) == 13:
			abs_type = 'FP'
			
		get_selection_abs_type     = BoModel().get_abs_type_from_selection_type(selection_type_id)
		if get_selection_abs_type and get_selection_abs_type['selection_abs_type']:
			selection_abs_type=get_selection_abs_type['selection_abs_type']

		else:
			selection_abs_type = abs_type

		template_name   = selection_abs_type+"_send_result_mail"
		mailData        = UserModel().get_mail_templates(template_name,conf_id)
		if mailData and type(mailData) != "dict":
			mailData = dict(mailData._mapping)
		if mailData:

			if mailData.get('subject'):
				sub_data = {'conf_name':confData['conf_name']}
				subject  = Helper.merge_tags(mailData.get('subject'),sub_data)

			else:
				subject = confData['conf_name']+" - Result for submission "

			if btn_val == "0" :
				if mail_ids:
					for i in mail_ids:
						name    = i["full_name"]
						email   = i["email"]
						if i["abs_status_id"] == 2:

							mail_data = {
								'mail_content': mailData.get('mail_content'),
								'data' : i,
								'confData':confData
							}
							mail_content = Helper.convert_html_for_mail_screen(mail_data)
							html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
						else:
							template_name   = "result_rejected_mail"
							mailData        = UserModel().get_mail_templates(template_name,conf_id)
							sub_data = {'conf_name':confData['conf_name']}
							subject  = Helper.merge_tags(mailData.get('subject'),sub_data)
							mail_data = {
								'mail_content': mailData.get('mail_content'),
								'data' : i,
								'confData':confData
							}
							mail_content = Helper.convert_html_for_mail_screen(mail_data)
							html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
							# html    = render_template('users/email/result_rejected.html',name=name,data=i,confe_logo=confe_logo,conf_id=conf_id)
						mailData['CC'] = []
						cc_ids = i['co_email']
						if cc_ids:
							cc_ids = cc_ids.split(',')
							mailData['CC'] = cc_ids
						EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
				data = {'msg':'Mail sent successfully'}
				return jsonify()
			else:
				email = request.values["test_mail_id"]
				for i in mail_ids:
					name    = i["full_name"]
					email   = email
					
					if i["abs_status_id"] == 2:
						mail_data = {
							'mail_content':mailData.get('mail_content'),
							'data' : i,
							'confData':confData
						}
						mail_content = Helper.convert_html_for_mail_screen(mail_data)
						html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
					else:
						template_name   = "result_rejected_mail"
						mailData        = UserModel().get_mail_templates(template_name,conf_id)
						sub_data = {'conf_name':confData['conf_name']}
						subject  = Helper.merge_tags(mailData.get('subject'),sub_data)
						mail_data = {
							'mail_content': mailData.get('mail_content'),
							'data' : i,
							'confData':confData
						}
						mail_content = Helper.convert_html_for_mail_screen(mail_data)
						html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
						# html    = render_template('users/email/result_rejected.html',name=name,data=i,confe_logo=confe_logo,conf_id=conf_id)
				#   return html
					EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
				data = {'msg':'Test mail sent successfully'}
				return jsonify(data)
		else:
			data = {'msg':'Please add mail content'}
			return jsonify(data)
	return jsonify(1)
	
# --------------------- abstract session adding --------
@app.route('/abstract/abs_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Abs_session(conf_id,conf_key):
	abs_session = BoModel().get_abs_session(conf_id)
	halls      = BoModel().get_halls(conf_id)
	data         = BoModel().get_status_selection_type_of_presentation_abs_types(conf_id)
	status       = data[0]
	selection    = data[1]
	presentation = data[2]
	abs_types    = data[3]
	return render_template('backoffice/abstract/abs_session_assignment/abssessionassignment.html',abs_session=abs_session,hall_data=halls,selection=selection,presentation=presentation,abs_types=abs_types,conf_id=conf_id,conf_key=conf_key)

@app.route('/ajax/get_abs_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_abs_session(conf_id,conf_key):
	conf_id = request.values["conf_id"]
	abs_session = BoModel().get_abs_session(conf_id)
	html = render_template('backoffice/abstract/abs_session_assignment/abssessiontable.html',data = abs_session)
	return jsonify(html)

@app.route('/ajax/get_abs_session_dropdown/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_abs_session_dropdown(conf_id,conf_key):
	conf_id = request.values["conf_id"]
	abs_session = BoModel().get_abs_session(conf_id)
	return jsonify(abs_session)

@app.route('/ajax/delete_abs_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Delete_abs_session(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_id   = request.values.get("session_id")
	BoModel().delete_session(session_id,confData['conf_schema'])
	return jsonify()

@app.route('/ajax/search_abstract/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Search_Author(conf_id,conf_key):
	abs_search_text   = request.values.get("abs_search_text")
	abs_type          = request.values.get("abs_type")
	selection_type    = request.values.get("selection")
	presentation_type = request.values.get("presentation")
	conf_id           = request.values.get("conf_id")
	data = BoModel().search_session_abstracts(abs_search_text,abs_type,selection_type,presentation_type,conf_id)
	html = render_template('backoffice/abstract/abs_session_assignment/abs_sessions_abstract_table.html',data=data)
	return jsonify(html)

@app.route('/ajax/add_remove_session_abstract/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Add_emove_session_abstract(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_id  = request.values.get("session_id")
	abs_id      = request.values.get("abs_id")
	btn_val     = request.values.get('btn_val')
	if btn_val:
		BoModel().add_session_abstract(session_id,abs_id,btn_val,confData.get('conf_schema'))
	return jsonify()

#----------------------------------commitment mail ---------------------------------------

@app.route('/abstract/commitment_mail/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Commitment_mail(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.strftime("%Y-%m-%d"))
	return render_template('backoffice/abstract/commitment_mail.html',conf_id=conf_id,conf_key=conf_key,confe_date=confe_date)


@app.route('/ajax/search_user_commitment/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Search_user_commitment(conf_id,conf_key):
	conf_id     = request.values.get("conf_id" or None)
	report_type = request.values.get("report_type" or None)
	start_date  = request.values.get('start_date' or None)
	end_date    = request.values.get('end_date' or None)
	if report_type == '2':
		start_date = datetime.now()
	data = BoModel().get_commitment_data(conf_id,report_type,start_date,end_date)
	html = render_template('backoffice/abstract/commitment_mail_table.html',data=data)
	return jsonify(html)

@app.route('/abstract/commitment_mail_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Commitment_mail_by_session(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_data = BoModel().get_all_session(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/commitment_mail_session.html',conf_id=conf_id,conf_key=conf_key,session_data=session_data)


@app.route('/ajax/search_user_commitment_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Search_user_commitment_session(conf_id,conf_key):
	session_id = request.values.get("ddl_session_id")
	data = BoModel().get_commitment_data_session(conf_id,session_id)
	html = render_template('backoffice/abstract/commitment_mail_table.html',data=data[0])
	return jsonify(html)

@app.route('/ajax/get_commitment_data_mail/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_commitment_mail_data(conf_id,conf_key):
	user_ids     = request.values.getlist("chk_user_id" or None)
	report_type  = request.values.get("hid_report_type" or None)
	start_date   = request.values.get("hid_cus_start_date" or None) or None
	end_date     = request.values.get("hid_cus_end_date" or None) or None
	testmail     = request.values.get("test_mail") or None
	is_attachement = request.values.get('is_attachement')
	confData = Auth.get_conference(conf_id)
	try:
		if user_ids:
			user_ids_str = ",".join(str(e) for e in user_ids)
			
			data = BoModel().get_user_commitment_data(conf_id,user_ids_str,report_type,start_date,end_date)
			user_data = data[0]
			abs_data  = data[1]
			user_abs  = defaultdict(list)
			if user_data and abs_data:
				for r in abs_data:
					user_abs[r["user_id"]].append(r)
				template_name = 'commitment_mail'
				mailData      = UserModel().get_mail_templates(template_name,conf_id)
				if type(mailData) != dict:
					mailData = dict(mailData._mapping)
				for u in user_data:
					if u["user_id"] in user_abs :
						user_abs_data = user_abs[u["user_id"]] 
						email = u["email"]
						sub_data      = {'full_name': u['full_name']}
						subject       = Helper.merge_tags(mailData['subject'],sub_data)
						mail_data     = {'mail_content': mailData['mail_content'],'user_data': u,'abs_data':user_abs_data,'confData':confData}
						mail_content  = Helper.convert_html_for_mail_screen(mail_data)
						html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
						# time.sleep(2) 
						attachmentData = None
						if is_attachement and int(is_attachement) == 1:
							attachmentData = UserInviteLetter(u['user_id'],u,1)
						mailData['TO'] = email
						EMAIL.sendMail_v2(subject,html,mailData,conf_id,confData,attachmentData)
		status = 1
	except ClientError as e:
		status = 0
		
	data = {'msg':"Send mail successfully"}
	return jsonify(status)

@app.route('/ajax/test_commitment_mail/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def send_test_commitment_mail(conf_id,conf_key):
	report_type  = request.values.get("hid_repot_type" or None)
	start_date   = request.values.get("hid_cus_start_date" or None) or None
	end_date     = request.values.get("hid_cus_end_date" or None) or None
	email        = request.values.get("test_mail" or None)
	user_id      = request.values.get("test_user_id" or None)
	is_attachement = request.values.get("is_attahement" or None)
	confData = Auth.get_conference(conf_id)
	if user_id:
		data = BoModel().get_user_commitment_data(conf_id,user_id,report_type,start_date,end_date)
		user_data = data[0]
		abs_data  = data[1]
		user_abs  = defaultdict(list)
		if user_data and abs_data:
			for r in abs_data:
				user_abs[r["user_id"]].append(r)
			template_name = 'commitment_mail'
			mailData      = UserModel().get_mail_templates(template_name,conf_id)
			if type(mailData) != dict:
					mailData = dict(mailData._mapping)
			for u in user_data:
				if u["user_id"] in user_abs :
					user_abs_data = user_abs[u["user_id"]] 
					email = email
					sub_data      = {'full_name': u['full_name']}
					subject       = Helper.merge_tags(mailData['subject'],sub_data)
					mail_data     = {'mail_content': mailData['mail_content'],'user_data': u,'abs_data':user_abs_data,'confData':confData}
					mail_content  = Helper.convert_html_for_mail_screen(mail_data)

					html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
			
					attachmentData = None
					if int(is_attachement) == 1:
						attachmentData = UserInviteLetter(u['user_id'],u,1)
					mailData['TO'] = email
					EMAIL.sendMail_v2(subject,html,mailData,conf_id,confData,attachmentData)
			
	data = {'msg':"Test mail sent successfully"}
	return jsonify(data)

@app.route('/ajax/view_commitment_data_mail/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def View_commitment_data_mail(conf_id,conf_key):
	user_id     = request.values.get("user_id" or None)
	report_type  = request.values.get("hid_repot_type" or None)
	start_date   = request.values.get("hid_cus_start_date" or None) or None
	end_date     = request.values.get("hid_cus_end_date" or None) or None
	conf_data    = Auth.get_conference(conf_id)
	data_mail = BoModel().get_user_commitment_data(conf_id,user_id,report_type,start_date,end_date)
	user_data = data_mail[0]
	abs_data  = data_mail[1]
	data_whatsapp = BoModel().get_user_commitment_data_whatsapp(user_id,report_type,start_date,end_date,conf_id)
	template_name = "Commitment"
	get_commitment = BoModel().get_commitment_template(conf_id,template_name)
	if get_commitment:
		Commitment_data = get_commitment['commitment_content']
	else:
		Commitment_data='{{data}}'
	whatsapp_msg = ''
	url= ''
	if data_whatsapp:
		for i in data_whatsapp:
			mobile = i["mobile"] if i["mobile"] else ""
			url    = "http://wa.me/91"
			mail_data     = {'mail_content': Commitment_data,'data':i["whatsapp_commitment"].replace('&amp;', '&'),'user_data':i,'conf_data':conf_data}
			whatsapp_msg  = Helper.convert_html_for_mail_screen(mail_data)
			whatsapp_msg = urllib.parse.quote(whatsapp_msg)
			whatsapp_msg = "?text="+whatsapp_msg
			i["whatsapp_msg"] = whatsapp_msg
	
	user_abs  = defaultdict(list)
	if user_data and abs_data:
		for r in abs_data:
			user_abs[r["user_id"]].append(r)
		template_name = 'commitment_mail'
		mailData      = UserModel().get_mail_templates(template_name,conf_id)
		for u in user_data:
			if u["user_id"] in user_abs :
				user_abs_data = user_abs[u["user_id"]] 
				email = u["email"]
				sub_data      = {'full_name': u['full_name']}
				subject       = Helper.merge_tags(mailData.subject,sub_data)
				mail_data     = {'mail_content': mailData.mail_content,'user_data': u,'abs_data':user_abs_data,'confData':conf_data}
				mail_content  = Helper.convert_html_for_mail_screen(mail_data)

				html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)

	data = {
	# 'html': render_template('users/email/commitment_mail.html',conf_id=conf_id,conf_key=conf_key,user_data=user_data[0],abs_data=abs_data),
	'html' : html,
	'whatsapp_msg' : whatsapp_msg,
	'whatsapp_msg_url' : url,
	'user_email'  : user_data[0]["email"],
	'user_mobile' : user_data[0]["mobile"],
	}    
	return jsonify(data)
#-----------------------Commitment whatsapp-----------------

@app.route('/abstract/whatsapp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Commitment_whatsapp(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 = []
	template_name="Commitment"
	get_commitment = BoModel().get_commitment_template(conf_id,template_name)
	html_data = render_template('backoffice/abstract/commitment_content.html' ,commitment_data = get_commitment)
	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.strftime("%Y-%m-%d"))
	return render_template('backoffice/abstract/commitment_whatsapp.html',conf_id=conf_id,conf_key=conf_key,commitment_data = get_commitment,confe_date=confe_date,get_commitment=get_commitment,html_data=html_data)

@app.route('/update_commitment/<conf_id>/<conf_key>', methods = ["GET","POST"])
def UpadateCommmitment(conf_id,conf_key):
	commitment_content       = request.values.get('commitment_content') or None
	template_name   = request.values.get('template_name') or None
	template_id    = request.values.get('template_id')  or None
	if template_id and int(template_id) > 0 :
		data_for_update={
		  'template_name'  : template_name,
		  'commitment_content'    : commitment_content,
		}
		update_and_getdata = BoModel().update_commitment_and_getcommitment(data_for_update,template_id)
		html_data = render_template('backoffice/abstract/commitment_content.html' ,commitment_data = update_and_getdata)
		data = {"html_data" :html_data,"msg" : "success" ,"status" : 1 }
		return json.dumps(data)
	else:
		data = {"html_data" :"","msg" : "Invlaid template_id" ,"status" : 2 }
		return json.dumps(data)

@app.route('/ajax/search_user_commitment_whatsapp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Search_user_commitment_Whatsapp(conf_id,conf_key):
	conf_id     = request.values.get("conf_id" or None)
	report_type = request.values.get("report_type" or None)
	start_date  = request.values.get('start_date' or None)
	end_date    = request.values.get('end_date' or None)
	conf_data    = Auth.get_conference(conf_id) 
	if report_type == '2':
		start_date = datetime.now()
	user_ids_str = ""
	data = BoModel().get_user_commitment_data_whatsapp(user_ids_str,report_type,start_date,end_date,conf_id)
	template_name = "Commitment"
	get_commitment = BoModel().get_commitment_template(conf_id,template_name)
	if get_commitment:
		Commitment_data = get_commitment['commitment_content']
	else:
		Commitment_data='{{data}}'
	if data:
		for i in data:
			mobile = i["mobile"] if i["mobile"] else ""
			url    = "http://wa.me/91"+ mobile +"?text="
			mail_data     = {'mail_content': Commitment_data,'data':i["whatsapp_commitment"].replace('&amp;', '&'),'user_data':i,'conf_data':conf_data}
			whatsapp_msg  = Helper.convert_html_for_mail_screen(mail_data)
			whatsapp_msg = requote_uri(whatsapp_msg)
			whatsapp_msg = url+whatsapp_msg
			i["whatsapp_msg"] = whatsapp_msg
	html = render_template('backoffice/abstract/commitment_whatsapp_table.html',data=data)
	return jsonify(html)

@app.route('/ajax/get_commitment_data_whatsapp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_commitment_whatsapp_data(conf_id,conf_key):
	user_ids     = request.values.getlist("chk_user_id" or None)
	report_type  = request.values.get("hid_report_type" or None)
	start_date   = request.values.get("hid_cus_start_date" or None)
	end_date     = request.values.get("hid_cus_end_date" or None)
	conf_id      = request.values.get("conf_id" or None)
	conf_key     = request.values.get("conf_key" or None)
	conf_data    = Auth.get_conference(conf_id) 
	output = io.StringIO()
	writer = csv.writer(output)
	# writer = csv.writer(output,delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMA)
	if user_ids:
		user_ids_str = "','".join(str(e) for e in user_ids)
		user_ids_str = "'"+user_ids_str+"'"
		data = BoModel().get_user_commitment_data_whatsapp(user_ids_str,report_type,start_date,end_date,conf_id)
		template_name = "Commitment"
		get_commitment = BoModel().get_commitment_template(conf_id,template_name)
		if get_commitment:
			Commitment_data = get_commitment['commitment_content']
		else:
			Commitment_data='{{data}}'
		if data:
			hline = list(data[0].keys())
			writer.writerow(hline)
			for i in data:
				mobile = i["mobile"] if i["mobile"] else ""
				url = "http://wa.me/91"+ mobile +"?text="
				mail_data     = {'mail_content': Commitment_data,'data':i["whatsapp_commitment"].replace('&amp;', '&'),'user_data':i,'conf_data':conf_data}
				whatsapp_msg  = Helper.convert_html_for_mail_screen(mail_data)
				whatsapp_msg = urllib.parse.quote(whatsapp_msg)
				whatsapp_msg = url+whatsapp_msg
				i["whatsapp_commitment"] = whatsapp_msg
			for i in data:
				line = []
				for j in hline:
					line.append(i[j])
				writer.writerow(line)
		output.seek(0)
		return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+str(conf_data["conf_key"])+"abs_whatsapp_report.csv"})
	return redirect(url_for("backoffice.Commitment_whatsapp",conf_id=conf_id,conf_key=conf_key))

	# -------------------------Keynote address function start---------------------------------------


@app.route('/keynote_address_index/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Keynote_address_Index(abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_data = BoModel().get_keynote_abstract_data(abs_type,conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/Keynoteaddress/keynote_index.html',conf_id=conf_id,conf_key=conf_key,data=abs_data,abs_type=abs_type)

@app.route('/new_keynote_address/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def New_Keynote_address(abs_type,conf_id,conf_key): 
	confData = Auth.get_conference(conf_id)
	abs_data = BoModel().New_keynote_abstract(abs_type,conf_id,confData.get('conf_schema'))
	return redirect(url_for("backoffice.Keynote_address",abs_id=abs_data["abs_id"],abs_type=abs_type,conf_id=conf_id,conf_key=conf_key))

@app.route('/keynote_address/<abs_id>/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Keynote_address(abs_id,abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_data = BoModel().get_abstract_data_for_keynote(abs_type,conf_id,confData.get('conf_schema'))
	data = BoModel().get_keynote_abstract(abs_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/Keynoteaddress/keynote.html',data=data,conf_id=conf_id,conf_key=conf_key,abs_data=abs_data,abs_type=abs_type)

@app.route('/ajax/keynote_searchauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def keynote_Searchauthor(conf_id,conf_key):
	searchtext = request.values["searchtext"]
	abs_type   = request.values["abs_type"]
	btn_val    = request.values["btn_val"]
	society_id = Auth.get_conference(conf_id).get("society_id")
	role_id    = 35
	data       = UserModel().get_search_data(searchtext,role_id,abs_type,society_id,conf_id)#getting search data from DB to step3 
	html = render_template('backoffice/abstract/Keynoteaddress/chief_authour_search_table.html',abs_type=abs_type,data=data,conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)


@app.route('/ajax/add_keynote_author/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Add_keynote_author(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	user_id   = request.values.get("user_id")
	abs_type  = request.values.get("abs_type")
	abs_id    = request.values.get("abs_id")
	data      = BoModel().add_keynote_author(abs_id,user_id,abs_type,confData.get('conf_schema'))#adding presenting author for VT
	html = render_template('backoffice/abstract/Keynoteaddress/Chief_authour_table.html',data2=data[0],conf_id=conf_id,conf_key=conf_key)
	return jsonify(html)

@app.route('/ajax/keynotegetauthor/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Keynote_getauthor(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	abs_id=request.values["abs_id"]
	if abs_id:
		data=BoModel().get_keynote_abstract(abs_id,confData.get('conf_schema'))#getting the presenting author to show in step1
		if(data == []):
			data1 = 0
			return jsonify(data1)
		html = render_template('backoffice/abstract/Keynoteaddress/Chief_authour_table.html',data2=data,conf_id=conf_id,conf_key=conf_key)
		return jsonify(html)
	return jsonify()

@app.route('/ajax/get_old_keynote/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_old_Keynote(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	abs_id=request.values["abs_id"]
	if abs_id:
		data=BoModel().Get_old_Keynote_abs_id(abs_id,conf_id,confData.get('conf_schema'))#getting the presenting author to show in step1
		html = render_template('backoffice/abstract/Keynoteaddress/old_keynote_abstracts.html',data=data,conf_id=conf_id,conf_key=conf_key)
		return jsonify(html)
	return jsonify()

@app.route('/ajax/save_keynote_address/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Save_keynote_address(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	abs_id   = request.values.get("abs_id" or '')
	title    = request.values.get("title" or '')
	keynote_topic = request.values.get("keynote_topic" or '')
	keynote_abs_id = request.values.get("ddlabs_id" or '')
	data = {
		'keynote_topic'       : keynote_topic,
		'title'          : title,
		'keynote_abs_id' : keynote_abs_id,
	} 
	update = UserModel().update_step(data,abs_id,confData.get('conf_schema'))
	return jsonify()

@app.route('/ajax/generate_keynote_address_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Generate_keynote_address_session(conf_id,conf_key):
	confData   = Auth.get_conference(conf_id)
	abs_type   = request.values.get("abs_type" or '')
	update     = BoModel().generate_keynote_session(abs_type,conf_id,confData.get('conf_schema'))
	return jsonify()

# -------------------------Keynote address function end---------------------------------------
# -------------------------Marksheet function start---------------------------------------

@app.route('/marksheet/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Marksheet_index(conf_id,conf_key): 
	confData   = Auth.get_conference(conf_id)
	session_types = BoModel().get_session_by_selection_types(None,conf_id,confData.get('conf_schema'))
	selection  = BoModel().get_session_selection_types(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/abs_marksheets/marksheet_index.html',conf_id=conf_id,conf_key=conf_key,session_types=session_types,selection=selection)

@app.route('/printmarksheet/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_Marksheet(conf_id,conf_key): 
	session_id = request.values.get("session_type")
	abs_type = request.values.get("selection")
	data       = BoModel().get_marksheet_data(session_id,abs_type,conf_id)
	session_data  = data[0]
	abstract_data = data[1]
	judge_data    = data[2]
	selection_type_id = 0
	if abstract_data:
		selection_type_id = abstract_data[0]["selection_type_id"]
	marksheet_template = BoModel().get_marksheet_template(conf_id,abs_type,selection_type_id)
	return render_template('backoffice/abstract/abs_marksheets/main_marksheet.html',conf_id=conf_id,conf_key=conf_key,session_data=session_data,abstract_data=abstract_data,abs_type=abs_type,judge_data=judge_data,marksheet_template=marksheet_template) 
#   try:
#       return render_template('backoffice/abstract/abs_marksheets/'+abs_type+'marksheet.html',conf_id=conf_id,conf_key=conf_key,session_data=session_data,abstract_data=abstract_data,abs_type=abs_type,judge_data=judge_data) 
#   except:
#       return "MARKSHEET NOT INTERGRATED"


@app.route('/printabstract/<abs_type>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Print_abstract(abs_type,conf_id,conf_key): 
	data       = BoModel().get_print_abstracts_data(abs_type,conf_id)
	session_data = []
	abstract_data = []
	co_author    = []
	if data[0]:
		session_data = data[0]
	if data[1]:
		abstract_data= data[1]
	if data[2]:
		co_author   = data[2]
	abs_data = {}
	abs_co_data = {}
	if session_data and abs_type != 'IC':
		for session in session_data:
			temp_list = []
			for ab in abstract_data:
				if session["abs_session_id"] == ab["abs_session_id"]:
					temp_list.append(ab)
			abs_data[session["abs_session_id"]] = temp_list
	else:
		abs_data = abstract_data
	cat_list = []
	if session_data == []:
		abs_data    =   defaultdict(list) # sub list with key 
		for r in abstract_data:
			abs_data[r["display_name"]].append(r)
			if r["display_name"] not in cat_list:
				cat_list.append(r["display_name"])
	if co_author:
		for ab in abstract_data:
			temp_list = []
			for co in co_author:
				if ab["abs_id"] == co["abs_id"]:
					temp_list.append(co)
			abs_co_data[ab["abs_id"]] = temp_list
	return render_template('backoffice/abstract/print_abstracts/'+abs_type+'_print.html',conf_id=conf_id,conf_key=conf_key,session_data = session_data,abstract_data=abs_data,co_author=abs_co_data,abs_type=abs_type,cat_list=cat_list)
	try:
		return render_template('backoffice/abstract/print_abstracts/'+abs_type+'_print.html',conf_id=conf_id,conf_key=conf_key,session_data = session_data,abstract_data=abs_data,co_author=abs_co_data,abs_type=abs_type,cat_list=cat_list)
	except:
		return "Print Page Not Intergrated"

@app.route('/printabstractavcode/<conf_id>/<conf_key>',methods=["GET"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Print_abstract_avcode(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.strftime("%Y-%m-%d"))
	hall_data = BoModel().get_halls(conf_id)
	return render_template('backoffice/abstract/print_abstracts/avcode_print.html',conf_id=conf_id,conf_key=conf_key,confe_date=confe_date,hall_data=hall_data)

@app.route('/printabstractavcode/<conf_id>/<conf_key>',methods=["POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_Print_abstract_avcode(conf_id,conf_key): 
	abs_type  = request.values.get('ddl_abstype') or None
	date_wise = request.values.get('ddl_date') or None
	hall_wise = request.values.get('ddl_hall') or None
	chk_break = request.values.get('chk_break') or 0
	# print(hall_wise,date_wise,abs_type)
	data       = BoModel().get_print_avcode_abstracts_data(abs_type,date_wise,hall_wise,conf_id)
	session_data = []
	abstract_data = []
	co_author    = []
	if data[0]:
		session_data = data[0]
	if data[1]:
		abstract_data= data[1]
	if data[2]:
		co_author   = data[2]
	abs_data = {}
	abs_co_data = {}
	if session_data:
		for session in session_data:
			temp_list = []
			for ab in abstract_data:
				if session["abs_session_id"] == ab["abs_session_id"]:
					temp_list.append(ab)
			abs_data[session["abs_session_id"]] = temp_list
	if co_author:
		for ab in abstract_data:
			temp_list = []
			for co in co_author:
				if ab["abs_id"] == co["abs_id"]:
					temp_list.append(co)
			abs_co_data[ab["abs_id"]] = temp_list
	try:
		return render_template('backoffice/abstract/print_abstracts/FP_avcode_print.html',conf_id=conf_id,conf_key=conf_key,session_data = session_data,abstract_data=abs_data,co_author=abs_co_data,abs_type=abs_type,chk_break=chk_break)
	except:
		return "Print Page Not Intergrated"

@app.route('/judges_assignment/<conf_id>/<conf_key>/<session_id>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Judges_Assignment(conf_id,conf_key,session_id):
	confData = Auth.get_conference(conf_id) 
	session_types = BoModel().get_all_session(conf_id,confData.get('conf_schema'))
	role_data     = BoModel().get_role_for_desigination()
	return render_template('backoffice/abstract/Judges_assignment/judges_assignment.html',session_types=session_types,conf_id=conf_id,conf_key=conf_key,role_data=role_data,session_id=session_id)

@app.route('/judges_assignment_index/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Judges_Assignment_index(conf_id,conf_key):
	confData = Auth.get_conference(conf_id) 
	abstract_types = BoModel().get_judge_abs_types(conf_id,confData.get('conf_schema'))
	selection_type_id = request.values.get('ddlsession_type') or 0
	session_data = []
	if selection_type_id:
		session_data = BoModel().get_session_by_selection_type(conf_id,selection_type_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/Judges_assignment/judges_assignment_index.html',abstract_types=abstract_types,conf_id=conf_id,conf_key=conf_key,selection_type_id=selection_type_id,session_data=session_data)


@app.route('/ajax/get_session_judges/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_session_judges(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_id = request.values.get('session_id')
	judge_data = BoModel().get_session_judge_data(session_id,confData.get('conf_schema'))
	html = render_template('backoffice/abstract/Judges_assignment/session_judges.html',data = judge_data)
	return jsonify(html)

@app.route('/ajax/get_session_data_display/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Get_session_data_display(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	session_id = request.values.get("session_id" or None)
	session_data = BoModel().get_session_data(session_id,confData.get('conf_schema'))
	# return jsonify(session_data)
	return render_template('backoffice/abstract/display_session_data.html',session_data=session_data,conf_id=conf_id,conf_key=conf_key)



@app.route('/ajax/search_session_judges/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Search_session_judges(conf_id,conf_key):
	Null = None
	searchtext = request.values.get("searchtext" or None) 
	society_id = Auth.get_conference(conf_id).get("society_id")
	data = UserModel().get_search_data(searchtext,Null,Null,society_id,conf_id)#getting search data from DB to step3 
	html = render_template('backoffice/abstract/Judges_assignment/session_judges_search_table.html',data=data)
	return jsonify(html)

@app.route('/ajax/add_judge_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Add_judge_session(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_id = request.values.get("session_id" or None)
	user_id    = request.values.get("user_id" or None) 
	role_id    = request.values.get("role_id" or None)
	society_id = Auth.get_conference(conf_id).get("society_id")
	data = {
		'session_id' : session_id,
		'user_id'    : user_id,
		'role_id'    : role_id, 
	}
	in_judge   = BoModel().insert_new_judge(data,confData.get('conf_schema'))
	judge_data = BoModel().get_session_judge_data(session_id,confData.get('conf_schema'))
	html = render_template('backoffice/abstract/Judges_assignment/session_judges.html',data = judge_data)
	return jsonify(html)

@app.route('/ajax/delete_judge_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Delete_judge_session(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_id = request.values.get("session_id" or None)
	user_id    = request.values.get("user_id" or None)
	del_judge  = BoModel().delete_judge(session_id,user_id,confData.get('conf_schema'))
	judge_data = BoModel().get_session_judge_data(session_id,confData.get('conf_schema'))
	html = render_template('backoffice/abstract/Judges_assignment/session_judges.html',data = judge_data)
	return jsonify(html)

@app.route('/ajax/renerate_judges_mark/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Renerate_judges_mark(conf_id,conf_key):
	regen_judge  = BoModel().regen_judge(conf_id)
	return jsonify()

@app.route('/print/createprintspeakerattendance/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Print_speaker_attendance(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.strftime("%Y-%m-%d"))
	hall_data = BoModel().get_halls(conf_id);
	return render_template('backoffice/abstract/print_abstracts/speaker_attendance.html',confe_date=confe_date,hall_data=hall_data,conf_id=conf_id,conf_key=conf_key)

@app.route('/print/postprintspeakerattendance/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_print_speaker_attendence(conf_id,conf_key):
	date = request.values.get('ddl_date') or None
	hall = request.values.get('ddl_hall') or None
	btn_val = request.values.get('btn_val') or None
	show_attendance = request.values.get('show_attendance') or None
	data = BoModel().get_speaker_attendance_list(conf_id,date,hall)
	hall_data    = data[0]
	session_data = data[1]
	speaker_data = data[2]
	speaker_list = defaultdict(list)
	session_list = defaultdict(list)
	for r in session_data:
		session_list[r["hall_id"]].append(r)
	for r in speaker_data:
		speaker_list[r["abs_session_id"]].append(r)
	if btn_val == 'signature':
		return render_template('backoffice/abstract/print_abstracts/print_speaker_sttendance_signature.html',speaker_list=speaker_list,session_data=session_data,session_list=session_list,hall_data=hall_data,conf_id=conf_id,conf_key=conf_key)
	else:
		return render_template('backoffice/abstract/print_abstracts/print_speaker_attendance.html',speaker_list=speaker_list,session_data=session_data,session_list=session_list,hall_data=hall_data,conf_id=conf_id,conf_key=conf_key,show_attendance=show_attendance)

@app.route('/user_report/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def User_report(conf_id,conf_key):
	data = []
	society_id = Auth.get_conference(conf_id).get('society_id')
	if (request.method == 'POST'):
		search_data = request.values.get('searchtext')
		data = UserModel().get_search_data(search_data,None,None,society_id,conf_id)
	return render_template ('backoffice/user_report_table.html',data=data,conf_id=conf_id,conf_key=conf_key,society_id=society_id)

# Priyavarthana for view user reports
@app.route('/view_user/<user_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def ViewUser(user_id,conf_id,conf_key):
	results = BoModel().usp_get_abstracts(conf_id,user_id,None,None)
	for index,value in enumerate(results) :
		if index == 0 :
			db_abstract = value
		if index == 1 :
			db_abstopic = value
		if index == 2 :
			user_profile  = value[0]
		if index == 3 :
			db_judges  = value
		if index == 4 :
			db_eva_data = value
			
	commitmentData = BoModel().get_user_commitment_data(conf_id,user_id,None,None,None)
	
	if commitmentData:
		commitment_data  = commitmentData[1]
	else:
		commitment_data = None

	abstopics_lst = {} 
	if db_abstopic:     
		for abstopic in db_abstopic:
			abstopics_lst[abstopic['abs_id']] = (abstopics_lst[abstopic['abs_id']] if abstopics_lst.get(abstopic['abs_id'],None) else [] ) +  [abstopic]    
	
	abstopic = []
	if db_abstract:
		for absData in db_abstract:
			absData['topics'] = abstopics_lst.get(absData['abs_id'],[])
			abstopic.append(absData)
			
	return render_template('backoffice/user_view.html',conf_id=conf_id,conf_key=conf_key,userData=user_profile,absDatas=abstopic,db_judges=db_judges,user_id=user_id,commitment_data=commitment_data,db_eva_data=db_eva_data)

#Harini for mail template
# -----------------------------------------------------------Mail Template--------------------------------------------------------------    

@app.route('/view_mail_template_index/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def ViewMailTempIndex(conf_id,conf_key):
	mail_data = BoModel().getMailTemplate(conf_id)
	# mail_template_id=mail_data[0]["mail_template_id"]
	return render_template('backoffice/mail_template/mail_index.html',mail_data=mail_data,conf_id=conf_id,conf_key=conf_key)

@app.route('/view_mail_template/<int:mail_template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def ViewMailTemplate(mail_template_id,conf_id,conf_key):
	mailData = BoModel().getMailTemplateId(conf_id,mail_template_id)
	confData  = Auth.get_conference(conf_id)
	return render_template('backoffice/mail_template/view_mail_template.html',mailData=mailData,conf_id=conf_id,conf_key=conf_key,confData=confData)

@app.route('/edit_mail_template/<int:mail_template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def EditMailTemplate(mail_template_id,conf_id,conf_key):
	mailData = BoModel().getMailTemplateId(conf_id,mail_template_id)
	confData  = Auth.get_conference(conf_id)
	return render_template('backoffice/mail_template/edit_mail.html',mailData=mailData,conf_id=conf_id,conf_key=conf_key,confData=confData)    

@app.route('/add_mail_template/<app_type_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def AddMailTemplate(app_type_id,conf_id,conf_key):
	data={
				'conf_ids':conf_id,
				'app_type_id':app_type_id
	}
	mail_template_id = BoModel().insert_mail_template(data)
	# confData  = Auth.get_conference(conf_id)
	return redirect(url_for('backoffice.EditMailTemplate',conf_id=conf_id,conf_key=conf_key,mail_template_id=mail_template_id)) 
	
@app.route('/post_edit_mail_template/<int:mail_template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@app.route('/post_edit_mail_template/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def PostEditMailTemplate(conf_id,conf_key,mail_template_id=0):
	if request.method == "POST" :
		template_name   = request.form['template_name']
		display_name   = request.form['display_name']
		subject_type    = request.form['subject_type']
		is_active       = request.values.get('is_active') or None
		subject         =request.form['subject']
		mail_type       = request.form['mail_type']
		is_layout       = request.values.get('is_layout') or None
		mail_content    = request.form['mail_content']
		mail_template_id=request.form['mail_template_id']
		from_mail_name  = request.values.get('from_mail_name')
		reply_mail_name = request.values.get('reply_mail_name')
		from_mail_id    = request.values.get('from_mail_id') 
		reply_mail_id   = request.values.get('reply_mail_id') 
		data = {
			
			'template_name' : template_name,
			'display_name'  : display_name,
			'subject_type'  : subject_type,
			'is_active'     : is_active,
			'subject'       : subject,
			'mail_type'     :mail_type,
			'is_layout'     : is_layout,
			'mail_content'  :mail_content,
			'from_mail_name'  : from_mail_name,
			'reply_mail_name' : reply_mail_name,
			'from_mail_id'    : from_mail_id,
			'reply_mail_id'   : reply_mail_id
			
			}
		if (mail_template_id != 0):
			mailData = BoModel().update_mail_template(mail_template_id,data)
			confData  = Auth.get_conference(conf_id)
			return redirect(url_for('backoffice.ViewMailTempIndex',conf_id=conf_id,conf_key=conf_key,mail_template_id=mail_template_id)) 
	else:
		return redirect(url_for('backoffice.ViewMailTempIndex',conf_id=conf_id,conf_key=conf_key,mail_template_id=mail_template_id))
## END #####

# ---------- Vimal IC Consent  ------------

@app.route('/ic_consent/<int:conf_id>/<conf_key>',methods=["GET","POST"])
def IC_Consent(conf_id,conf_key):
	return render_template('backoffice/abstract/ic_consent/ic_consent_data.html',conf_id=conf_id,conf_key=conf_key)

@app.route('/ic_consent_data/<int:conf_id>/<conf_key>',methods=["GET","POST"])
def IcConsentData(conf_id,conf_key):
	confData      = Auth.get_conference(conf_id)
	consent_status=request.values.get('consent_status')
	abs_no=request.values.get('abs_no') or None
	if abs_no==None:
		abs_no=0
	get_constent=BoModel().GetConsentStatus(consent_status,abs_no,conf_id,confData.get('conf_schema'))
	html_data=render_template('backoffice/abstract/ic_consent/consent_table.html',get_constent=get_constent)
	data                = {"html_data":html_data,"msg" : "success" ,"status" : 1 }
	return jsonify(data)

@app.route('/mail_consent/<btn_val>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Mail_consent(btn_val,conf_id,conf_key):
	confData      = Auth.get_conference(conf_id)
	checkbox      = request.values.getlist('select_topic_id')
	topic_ids     = ','.join(checkbox)
	data          = BoModel().consent_reminder_mail_datas(topic_ids,conf_id,confData.get('conf_schema'))
	consent_users = BoModel().consent_reminder_mail_users(topic_ids,confData.get('conf_schema'))
	topic_data    = defaultdict(list) 
	template_name = 'Co_Instructor_reminder_mail'
	mailData      = UserModel().get_mail_templates(template_name,conf_id)
	for r in data:
		topic_data[r["co_user_id"]].append(r)
	for i in consent_users:
		data1 =  topic_data[i["user_id"]]
		  
		if int(btn_val) == 0:
			email = i["email"]
		else:
			email = request.values["test_mail_id"]
		sub_data         = {'abs_type':data1[0]['abs_type'],'abs_no':str(data1[0]['abs_no']),'conf_name': confData['conf_name']}
		subject          = Helper.merge_tags(mailData.subject,sub_data)
		encrypt_user_id  = Cryptography.encrypt(int(i['user_id']))
		encrypt_topic_id = Cryptography.encrypt(int(i['topic_id']))
		if data1[0]['setting_value']:
			dates = datetime.strptime(data1[0]['setting_value'], '%Y-%m-%d %H:%M:%S')
		else:
			dates=''
		mail_data        = {'mail_content': mailData.mail_content,'data': data1[0],'confData':confData,'cons_date':dates,'encrypt_user_id':encrypt_user_id,'encrypt_topic_id':encrypt_topic_id}
		mail_content     = Helper.convert_html_for_mail_screen(mail_data)
		html             = render_template('users/email/mail_template.html',is_layout=mailData.is_layout,mail_content=mail_content,confData=confData)
		# return html
		EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
	return jsonify()

# --------------------------------------Challenging Cases Uploads in Vrsi-----------------------------------------------------------------------------------------------

@app.route('/getccuploads/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def GetccUploads(conf_id,conf_key):
		confData  =  Auth.get_conference(conf_id)
		abs_id      = request.values["abs_id"]
		abs_id      = (int(Cryptography.decrypt(abs_id)))
		# saved_to    = AbstractModel().add_to_presenting_author(abs_id,user_id,role_id)#adding presenting author for PP
		abs_uploads = AbstractModel().get_abs_uploads(abs_id)
		if abs_uploads ==None:
			len_abs_uploads = 0
		else:
			len_abs_uploads = len(abs_uploads)
		return render_template(f'backoffice/bo_edit/{conf_key.upper()}/ccuploads.html',conf_id=conf_id,conf_key=conf_key,abs_uploads=abs_uploads,len_abs_uploads=len_abs_uploads)

@app.route('/cc_img_upload/<abs_id>/<abs_type>/<conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def cc_Img_upload(abs_id,abs_type,conf_id,conf_key):
	file = request.files.get('file')
	abs_id      = int(Cryptography.decrypt(abs_id))
	presentation_type_id = request.values.get('presentation_type_id',None) or None
	if int(presentation_type_id) == Helper.CC_Presentation_type_id :
		filename = secure_filename(file.filename)
		data = AbstractModel().checkexistsfile(abs_id,filename);
		if data and len(data) >0:
			return jsonify({'data':'','msg':"file already exists"})
	bucketname = 'common-application'
	if file and bucketname:
		data_1 = {}
		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_str = filename
		try:
			bucket     = bucketname
			foldername_1 = 'abs_uploads'
			foldername_2 = conf_key
			file_path  = "https://"+bucketname+".s3-ap-southeast-1.amazonaws.com/"+foldername_1+"/"+foldername_2+"/"+str(abs_type)+"/"+str(abs_id)+"/"
			data_1     = {
						'path'      : file_path,
						'file_name' : file_str,
						'img_type'  : None,
						 }
			update_data = AbstractModel().update_imge_db(abs_id,data_1)
			response   = s3.upload_fileobj(file, bucket,foldername_1+'/'+foldername_2+'/'+str(abs_type)+'/'+str(abs_id)+'/'+ file_str, ExtraArgs={"ACL": acl,"ContentType": file.content_type})
		except ClientError as e:
			logging.error(e)
		abs_uploads = AbstractModel().get_abs_uploads(abs_id)
		if len(abs_uploads)<=3:
			json = {'msg':'','status' : 1,'data':''}
			if abs_uploads ==None:
				len_abs_uploads = 0
			else:
				len_abs_uploads = len(abs_uploads)
			
			json["data"] =  render_template(f'backoffice/bo_edit/{conf_key.upper()}/ccuploads.html',conf_id=conf_id,conf_key=conf_key,abs_uploads=abs_uploads,len_abs_uploads=len_abs_uploads)
			
			return jsonify(json)

@app.route('/cc_remove_img/<conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
def CCRemove_img(conf_id,conf_key):
	abs_id      = request.values.get('abs_id')  
	upload_id   = request.values.get('upload_id')
	abs_id      = int(Cryptography.decrypt(abs_id))
	img         = AbstractModel().get_img_upload_by_upload_id(upload_id)
	if img:
		bucketname = 'common-application'
		img        = img  
		filepath   = img['path']
		filename   = img['file_name']
		foldername = filepath+filename
		foldername = foldername.replace("https://"+bucketname+".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(bucketname,foldername).delete() 
		AbstractModel().delete_abs_upload(upload_id)
		json = {'msg':'','status' : 1,'data':""}

		abs_uploads = AbstractModel().get_abs_uploads(abs_id)
		if abs_uploads ==None:
			len_abs_uploads = 0
		else:
			len_abs_uploads = len(abs_uploads)
		json["data"] =  render_template(f'backoffice/bo_edit/{conf_key.upper()}/ccuploads.html',conf_id=conf_id,conf_key=conf_key,abs_uploads=abs_uploads,len_abs_uploads=len_abs_uploads)
		return jsonify(json)

## Priyavarthana 
# for backoffice mail sending function
@app.route('/submitted_mail_view/<abs_id>/<user_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def SubmittedMailView(abs_id,user_id,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data     = AbstractModel().get_sept4_data(abs_id,confData.get('conf_schema'))
	abs_type= data['abs_type']
	authors  = AbstractModel().get_authors(abs_id,confData.get('conf_schema'))
	data2    = AbstractModel().FP_step1_get_author(abs_id,confData.get('conf_schema'))
	data3    = AbstractModel().fp_authors_for_email(abs_id,confData.get('conf_schema'))
	abs_awards = AbstractModel().get_abs_award_v1(conf_id,abs_type,abs_id)
	award_title = {}
	awards = {}

	abs_parent_ids = []
	if abs_awards:
		for i in abs_awards:
			if i['abs_id']:
				abs_parent_ids.append(i['parent_id'])   
	
		for item in abs_awards:
			if item["is_parent"] == 1:
				if item["award_id"]  in abs_parent_ids:
					award_title[item['award_id']] = item["award_name"] 
			else:
				if item["abs_id"] != None: 
					awards[item["parent_id"]]  = [item] + awards.get(item["parent_id"],[])
	for i in data3:
		template_name = data['abs_type']+'_submit_mail'
		mailData      = UserModel().get_mail_templates(template_name,conf_id)
		sub_data      = {'abs_type':data['abs_type'],'abs_no':str(data['abs_no']),'conf_name': confData['conf_name']}
		subject       = Helper.merge_tags(mailData.subject,sub_data)
		email         = i["email"]
		if int(conf_id)==32:
			mail_data     = {'mail_content': mailData.mail_content,'data': data,'data1':authors,'confData':confData,'data2':data2,'awards':awards,'award_title':award_title}
		else:
			mail_data     = {'mail_content': mailData.mail_content,'data': data,'data1':authors,'confData':confData,'data2':data2}
		mail_content  = Helper.convert_html_for_mail_screen(mail_data) 
	return render_template('backoffice/email/submitted_mail_view.html',conf_id=conf_id,conf_key=conf_key,confData=confData,mail_content=mail_content,subject=subject,data=data)

@app.route('/submitted_mail/<abs_id>/<user_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def SubmittedMail(abs_id,user_id,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data     = AbstractModel().get_sept4_data(abs_id,confData.get('conf_schema'))
	authors  = AbstractModel().get_authors(abs_id,confData.get('conf_schema'))
	data2    = AbstractModel().FP_step1_get_author(abs_id,confData.get('conf_schema'))
	data3    = AbstractModel().fp_authors_for_email(abs_id,confData.get('conf_schema'))
	
	abs_awards = AbstractModel().get_abs_award_v1(conf_id,data['abs_type'],abs_id)
	
	if abs_awards:

		award_title = {}
		awards = {}
		abs_parent_ids = []

		for i in abs_awards:
			if i['abs_id']:
				abs_parent_ids.append(i['parent_id'])   

		for item in abs_awards:
			if item["is_parent"] == 1:
				if item["award_id"]  in abs_parent_ids:
					award_title[item['award_id']] = item["award_name"] 
			else:
				if item["abs_id"] != None: 
					awards[item["parent_id"]]  = [item] + awards.get(item["parent_id"],[])
	else:
		awards      = None
		award_title = None
	
	if request.method =="POST":
		email   = request.form['sample_email']
		template_name = data['abs_type']+'_submit_mail'
		mailData      = UserModel().get_mail_templates(template_name,conf_id)
		sub_data      = {'abs_type':data['abs_type'],'abs_no':str(data['abs_no']),'conf_name': confData['conf_name']}
		subject       = Helper.merge_tags(mailData.subject,sub_data)
		# if int(conf_id)==32:
		mail_data     = {'mail_content': mailData.mail_content,'data': data,'data1':authors,'confData':confData,'data2':data2,'awards':awards,'award_title':award_title}
		# else:
			# mail_data     = {'mail_content': mailData.mail_content,'data': data,'data1':authors,'confData':confData,'data2':data2}
		mail_content  = Helper.convert_html_for_mail_screen(mail_data)
#       subject       = "SAMPLE : " + subject 
		html          = render_template('users/email/mail_template.html',is_layout=mailData.is_layout,mail_content=mail_content,confData=confData,conf_id=conf_id,conf_key=conf_key)
		EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
		flash("Successfully sent sample mail","successMsg")

	else:
		for i in data3:
			template_name = data['abs_type']+'_submit_mail'
			mailData      = UserModel().get_mail_templates(template_name,conf_id)
			sub_data      = {'abs_type':data['abs_type'],'abs_no':str(data['abs_no']),'conf_name': confData['conf_name']}
			subject       = Helper.merge_tags(mailData.subject,sub_data)
			email         = i["email"]
			# if int(conf_id)==32:
			mail_data     = {'mail_content': mailData.mail_content,'data': data,'data1':authors,'confData':confData,'data2':data2,'awards':awards,'award_title':award_title}
			# else: 
				# mail_data     = {'mail_content': mailData.mail_content,'data': data,'data1':authors,'confData':confData,'data2':data2}
			mail_content  = Helper.convert_html_for_mail_screen(mail_data)
			html          = render_template('users/email/mail_template.html',is_layout=mailData.is_layout,mail_content=mail_content,confData=confData,conf_id=conf_id,conf_key=conf_key)
			EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
		flash("Successfully sent mail","successMsg")
	return redirect(url_for('backoffice.SubmittedMailView',abs_id=abs_id,user_id=user_id,conf_id=conf_id,conf_key=conf_key))
	
# end

#vimal
#find abstract
@app.route('/abstract/find_abstract/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Find_Abstract(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	get_abs_types=BoModel().get_abs_types(conf_id,confData.get('conf_schema'))
	session.pop('category',None)
	return render_template ('backoffice/abstract/find_abstract.html',conf_id=conf_id,conf_key=conf_key,get_abs_types=get_abs_types)

@app.route('/get_abstract/<conf_id>/<conf_key>',methods=["POST"])
def Get_Abstract(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	abs_type=request.values.get('abs_type') or None
	abs_no =request.values.get('abs_no') or None
	get_abst=BoModel().find_abs(conf_id,abs_type,abs_no,confData.get('conf_schema'))
	html_data=render_template('backoffice/abstract/find_abs_table.html',conf_id=conf_id,conf_key=conf_key,get_abst=get_abst)
	data={'html_data':html_data,'msg':'success','status':1}
	json_data    = json.dumps(data,default = str)
	return json_data

# end find_abstract

# Evaluation summary

@app.route('/view_evaluation_summary/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def ViewEvaluationSummary(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	abs_types = BoModel().get_abs_type_for_eva(conf_id,confData.get('conf_schema'))
	abs_type = ""
	eval_abs_types = BoModel().get_eva_abs_type_for_eva(conf_id)
	data = {}
	if request.method == "POST":
		abs_type = request.values['ddlAbstractType']or None
		eva_abs_type = request.values['ddlevaAbstractType']or None
		cat_id   = request.values['ddlCategory']or None
		export_file          = request.values.get("export_file") or None
		data     = BoModel().get_evaluation_summary_data(eva_abs_type,conf_id,cat_id) 
		for index,value in enumerate(data) :
			if index == 0:
				data_1 = value
			if index == 1:
				data_2 = value
			if index == 2:
				evaluator = value
		if export_file=="csv":
			now    = datetime.now()
			date   = now.strftime("%Y-%m-%d %H:%M")
			output = io.StringIO()
			writer = csv.writer(output)
			full_name=[]
			for r in evaluator:
				f_name=r['full_name']
				full_name.append(f_name)
			line   = ['S.No','Abstract Type','Abstract Id', 'Title']+full_name
			writer.writerow(line)
			sno_val = 0
			for row in data_1:
				sno_val = sno_val +1
				marks=[]
				for m in data_2:
					if m['abs_id'] == row['abs_id']:
						mark=m['marks_total']
						marks.append(mark)
				line = [sno_val ,row['abs_no'],row['abs_id'],row['title'] ] + marks
				writer.writerow(line)
			output.seek(0)
			return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+confData['conf_name']+"Evaluation_summary_Report"+str(date)+".csv"})
		if export_file=='xl' :
#           all_categories = UserModel().get_categories_v1(abs_type,conf_id)
			abstracts      = defaultdict(list) 
			evaluator_list = defaultdict(list) 
			marks_list     = defaultdict(list)
			categories     = []  
			for r in data_1:
				abstracts[r["cat_name"]].append(r)
				if r["cat_name"] not in categories:
					categories.append(r["cat_name"])
			for r in data_2:
				marks_list[r["cat_name"]].append(r)
			for r in evaluator:
				evaluator_list[r["cat_name"]].append(r)
			output = io.BytesIO()
			Workbook =xlwt.Workbook()
			for cat in categories:
				full_name=[]
				for r in evaluator_list[cat]:
					f_name = r['full_name']
					full_name.append(f_name)
				if abs_type == "IC":
					eva_length     = len(full_name)+7
					col_name       = ["Abs no","Presentation type","Title","Chief instrutor","Membership No","Email","Mobile"]+full_name + ["Total","Average"]
					export_columns = ["abs_no","presenting_type","title","presenting_author","presenting_membershipno","presenting_email","presenting_mobile"] + full_name + ["total_marks","percentage"]
				else:
					eva_length = len(full_name)+7
					col_name       = ["Abs no","Presentation type","Title","Presenting author","Membership No","Email","Mobile"]+full_name + ["Total","Average"]
					export_columns = ["abs_no","presenting_type","title","presenting_author","presenting_membershipno","presenting_email","presenting_mobile"] + full_name + ["total_marks","percentage"]
				marks_dict    =   defaultdict(list) # sub list with key 
				for r in marks_list[cat]:
					marks_dict[r["e_full_name"]].append(r)
				if cat :
					sheet_name = cat.replace("/","").strip()
				else :
					sheet_name = "Sheet1"
				sheet_name = sheet_name[:25] + '..' * (len(sheet_name) > 25)
				sh = Workbook.add_sheet(sheet_name)
				idx  = 0
				a    = 0
				sh.row(0).height = 20*30
				sh.col(2).width  = int(65 * 300) 
				t_style=xlwt.easyxf('alignment: wrap True;''pattern: pattern solid,fore_colour yellow;' 'font: colour black, bold True, name Calibri, height 230; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')
				for row in col_name:
					sh.write(0,a,row,style=t_style)
					sno_val = 0
					a+=1
				total_eva = len(full_name)+11
				col_len = len(export_columns)
				ce = len(full_name)
				style   = xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour yellow;' 'font: colour black, bold True, name Calibri, height 200; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')
				style_1 = xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour white;' 'font: colour black, name Calibri, height 200;border: left thin,right thin,top thin,bottom thin')
				style_2 = xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour white;' 'font: colour black, name Calibri, height 200; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')
				alpaindex = {0:'C',1:'D',2:'E',3:'F',4:'G',5:'H',6:'I',7:'J',8:'K',9:'L',10:'M',11:'N',12:'O',13:'P',14:'Q',15:'R',16:'S',17:'T',18:'U',19:'V',20:'W',21:'X',22:'Y',23:'Z',24:'AA',25:'AB',26:'AC',27:'AD',28:'AE',29:'AF',30:'AG',
							31:'AH',32:'AI',33:'AJ',34:'AK',35:'AL',36:'AM',37:'AN',38:'AO',39:'AP',40:'AQ',41:'AR',42:'AS',43:'AT',44:'AU',45:'AV',46:'AW',47:'AX',49:'AY',50:'AZ',51:'BA',52:'BB',53:'BC',54:'BD',55:'BE',56:'BF',57:'BG',58:'BH',59:'BI',60:'BJ',61:'BK',62:'BL',63:'BM',64:'BN',65:'BO'}
				for data in abstracts[cat]:
					b=0
					c=0
					d=0
					for i in export_columns:
						if int(col_len) >= int(c):
							if c > 6 :
								if int(c) < int(eva_length):
									for j in marks_dict[i]:
										if data['abs_id'] == j["abs_id"]:
											if data["pa_user_id"] == j["eva_user_id"]:
												sh.write(idx+1, b, 'N/A',style=style)
											else:
												sh.write(idx+1, b, j["marks_total"],style=style_2)
											d+=1
								else:
									
									if i == 'total_marks':
										sh.write(idx+1, b,xlwt.Formula("SUM(H"+str(idx+2)+":"+ alpaindex[ce+4] +str(idx+2)+")"),style=style_2)

									else:
										if data['evaluated']:
											sh.write(idx+1, b,xlwt.Formula(alpaindex[ce+5]+str(idx+2)+"/"+str(data['evaluated'])),style=style_2)
										else:
											sh.write(idx+1, b,"",style=style_2)

							else:
								sh.write(idx+1, b, data[i],style=style_1)
							b+=1
							if int(total_eva) == d:
								c = 0
								d = 0
							else:
								c+=1
						else:
							c = 0
							d = 0
					b=0
					idx+=1
			Workbook.save(output)
			output.seek(0)
			now    = datetime.now()
			date   = now.strftime("%Y-%m-%d %H:%M")
			return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+abs_type+"Evaluation_summary_Report-"+str(date)+".xls"})
		abs_eval_marks = {}
		if data_2:
			for m in data_2:
				mkey = f"{m.get('abs_id')}-{m.get('eva_user_id')}"
				abs_eval_marks[mkey] = {'abs_id':m.get('abs_jd') ,'marks_total':m.get('marks_total')} 
		return render_template('backoffice/val/evaluation_summary.html',abs_types=abs_types,conf_id=conf_id,conf_key=conf_key,data_1=data_1,abs_type=abs_type,cat_id=cat_id,evaluator=evaluator,data_2=data_2,eva_abs_type=eva_abs_type,eval_abs_types=eval_abs_types,abs_eval_marks=abs_eval_marks)
	return render_template('backoffice/val/evaluation_summary.html',abs_types=abs_types,conf_id=conf_id,conf_key=conf_key,eval_abs_types=eval_abs_types)

def insert_and_delete_award(award_list,abs_id):
	# abs_id      =   unquote(abs_id)
	# abs_id     =   int(Cryptography.decrypt(abs_id))
	old_award_data = AbstractModel().get_old_awardlist(abs_id)
	new_award_data = award_list
	insert_award_data = new_award_data
	delete_award = []
	if old_award_data:
		for j in old_award_data:  
			delete_award.append(str(j["award_id"]))
			if str(j["award_id"]) in new_award_data:
				delete_award.remove(str(j["award_id"]))
				insert_award_data.remove(str(j["award_id"]))
	if new_award_data:
		insert_award_data = new_award_data
		AbstractModel().insert_awardlist(insert_award_data,abs_id)
	if delete_award:
		delete_award =  ",".join(delete_award)
		AbstractModel().delete_awardlist(delete_award,abs_id)
	return "success"

	
# End of evaluation summary
@app.route('/standyprint/<conf_id>/<conf_key>',methods=["GET"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Standy_Print(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.strftime("%Y-%m-%d"))
	hall_data = BoModel().get_halls(conf_id)
	return render_template('backoffice/abstract/print_abstracts/standy_print.html',conf_id=conf_id,conf_key=conf_key,confe_date=confe_date,hall_data=hall_data)

@app.route('/standyprint/<conf_id>/<conf_key>',methods=["POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Standy_Print_post(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	date_wise = request.values.get('ddl_date') or 'null'
	hall_wise = request.values.get('ddl_hall') or 'null'
	hall_date_data = BoModel().get_session_date_and_hall_wise(date_wise,hall_wise,conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/print_abstracts/standy_print_page.html',conf_id=conf_id,conf_key=conf_key,hall_date_data=hall_date_data)
	
@app.route('/upload_status/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def UploadStatus(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	status_data = AbstractModel().get_upload_status_data(conf_id,confData.get('conf_schema'))
	status = request.values.get('status') or 'All'
	selection_type = request.values.get('selection_type') or '2,3,4,26,23,11,44,45,46,47,49,50,51,52,53,5,24,10,61'
	data = AbstractModel().get_upload_data_by_status(conf_id,status,selection_type,confData.get('conf_schema'))
	return render_template('backoffice/abstract/uploadstatus/uploadstatus_index.html',status_data=status_data,data=data,conf_id=conf_id,conf_key=conf_key,selection_type=selection_type,status=status)

# mail_fulltext_reminder
# /abstract/mail_fulltext_reminder/

@app.route('/abstract/mail_fulltext_reminder/<btn_val>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Mail_Fulltext_reminder(btn_val,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	checkbox = request.values.getlist('chk_send_reminder')
	abs_ids  = ",".join(checkbox)
	if abs_ids :
		mail_ids   = BoModel().get_mail_ids_by_abs_id_v1(abs_ids,confData.get('conf_schema'))
		template_name   = "eposter_reminder_mail"
		mailData        = UserModel().get_mail_templates(template_name,conf_id)
		if mailData:
			if mailData.subject:
				sub_data = {'conf_name':confData['conf_name']}
				subject  = Helper.merge_tags(mailData.subject,sub_data)
			else:
				subject = confData['conf_name']+" - Gental reminder for full text upload"
			if btn_val == "0" :
				if mail_ids:
					for i in mail_ids:
						name    = i["full_name"]
						email   = i["email"]
						if i["abs_status_id"] == 2:
							mail_data = {
								'mail_content': mailData.mail_content,
								'data' : i,
								'confData':confData
							}
							mail_content = Helper.convert_html_for_mail_screen(mail_data)
							html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
							EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
				data = {'msg':'Mail sent successfully'}
				return jsonify()
			else:
				email = request.values["test_mail_id"]
				for i in mail_ids:
					name    = i["full_name"]
					email   = email
					if i["abs_status_id"] == 2:
						mail_data = {
							'mail_content':mailData.mail_content,
							'data' : i,
							'confData':confData
						}
						mail_content = Helper.convert_html_for_mail_screen(mail_data)
						html  = render_template('users/email/bo_mail_template.html',mail_content=mail_content)
						EMAIL.sendMail_v1(subject,html,email,mailData,conf_id)
				data = {'msg':'Test mail sent successfully'}
				return jsonify(data)
		else:
			data = {'msg':'Please add mail content'}
			return jsonify(data)
	return jsonify(1)

# For sending mail in report page
@app.route('/report/send_mail/<mail_template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def ReportSendMail(mail_template_id,conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	mailData  = BoModel().getMailTemplateId(conf_id,mail_template_id)
	to_mail_role_ids    = request.values.get('to_mail_role_id',None)
	to_mail_role_ids    = to_mail_role_ids.split(',') if to_mail_role_ids else [] 
	cc_mail_role_ids    = request.values.get('cc_mail_role_id')
	cc_mail_role_ids    = cc_mail_role_ids.split(',') if cc_mail_role_ids else [] 
	abs_ids             = request.values.get('selected_mail_ids',None)
	# abs_ids             = abs_ids.split(',') if abs_ids else None
	user_ids            = None
	abs_status_ids      = None
	is_test             = request.values.get('is_test',None)
	is_preview          = request.values.get('is_preview',None)
	results = BoModel().usp_get_abstracts(conf_id,user_ids,abs_ids,abs_status_ids)

	for index,value in enumerate(results):
		if index == 0:
			db_abstract = value
			
		if index == 1:
			db_abstopic = value

	abstopics_lst = {} 
	if db_abstopic:     
		for abstopic in db_abstopic:
			abstopics_lst[abstopic['abs_id']] = (abstopics_lst[abstopic['abs_id']] if abstopics_lst.get(abstopic['abs_id'],None) else [] ) +  [abstopic]    
	
	if db_abstract:
		for absData in db_abstract:
			absData['topics'] = abstopics_lst.get(absData['abs_id'],[])

			mailData['TO'] =  []
			mailData['CC'] = []
			if is_test and int(is_test) ==1:
				mailData['TO'] = to_mail_role_ids
				if cc_mail_role_ids:
					mailData['CC'] = cc_mail_role_ids 
			else:
				for item in absData['topics']:
					if to_mail_role_ids:
						if str(item['role_id']) in to_mail_role_ids:
							mailData['TO'].append(item["email"])
					if cc_mail_role_ids:
						if str(item['role_id']) in cc_mail_role_ids:
							mailData['CC'].append(item["email"])
	
			sub_data      = {'abs_type':absData['abs_type'],'abs_no':str(absData['abs_no']),'conf_name':confData['conf_name']}
			subject       = Helper.merge_tags(mailData['subject'],sub_data)
			chiefins,coins,chiefauthor,presauthor,coauthor,others = Helper.get_role_data(absData)
			mail_data = {
				'mail_content': mailData['mail_content'],
				'absData'     : absData,
				'chiefauthor' : chiefauthor,
				'presauthor'  : presauthor,
				'coauthor'    : coauthor,
				'confData'    : confData,
				'chiefins'    : chiefins,
				'coins'       : coins
				
				}
			mail_content  = Helper.convert_html_for_mail_screen(mail_data)
			html          = render_template('users/email/mail_template.html',is_layout=mailData['is_layout'],mail_content=mail_content,confData=confData)
			if is_preview and int(is_preview)==1:
				data = {'html':html}
			else:
				msg  = 'Mail sent successfully'
				data = {'msg':msg}
				EMAIL.sendMail_v2(subject,html,mailData,conf_id)
	return jsonify(data)
	
@app.route('/session_clash/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def SessionClash(conf_id,conf_key):
	if request.method == 'POST':
		btn_value = request.values.get('btn_val')
		if btn_value == 'Export':
			now    = datetime.now()
			date   = now.strftime("%Y-%m-%d %H:%M")
			results =  BoModel().usp_abs_session_clash(conf_id)
			output = io.StringIO()
			writer = csv.writer(output)
			line   = ['S.No', 'Role', 'Name', 'Email','Mobile' ,'Hall', 'Start Date','End Date','Title']
			writer.writerow(line)
			sno_val = 0
			for row in results:
				if row['abs_no'] and row['title'] :
					abs_title = row['abs_no'] +"-"+row['title']
				else:
					abs_title = row['title']
					
				sno_val = sno_val +1
				line = [sno_val ,row['role'],row['full_name'], row['email'],row['mobile'],row['hall'],row['start_date'],row['end_date'],abs_title]
				writer.writerow(line)
			output.seek(0)
			return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+conf_key+"_session_clash"+str(date)+".csv"})

	else:
		results =  BoModel().usp_abs_session_clash(conf_id)
		user_count    =   defaultdict(list) # sub list with key 
		for r in results:
			user_count[r["user_id"]].append(r)
		return render_template('backoffice/abstract/session_clash.html',data=results,conf_id=conf_id,conf_key=conf_key,user_count=user_count)

@app.route('/custome_user_abs_type/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def Custome_user_abs_type(conf_id,conf_key):
	get_abstrcts       = BoModel().get_abstract_custome(conf_id)
	get_costom_users   = BoModel().get_costom_user(conf_id)
	return render_template('backoffice/custome_abs_users/cus_user_list.html',get_abstrcts=get_abstrcts,conf_id=conf_id,conf_key=conf_key,costom_users=get_costom_users)

@app.route('/save_costom_user/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def Post_Custome_user_abs_type(conf_id,conf_key):
	user_name      =  request.values.get('user_name')
	user_email     = request.values.get("user_email")
	user_abstract  = request.values.getlist("user_abstract[]")
	start_date     = request.values.get("start_date")
	end_date       = request.values.get("end_date")
	cu_abs_type_id = request.values.get("cu_abs_type_id")
	society_id     = Auth.get_conference(conf_id).get('society_id')
	if user_abstract:
		user_abstract = ",".join([str(item) for item in user_abstract])
	data = {
		'abs_type_ids':user_abstract,
		'conf_id':conf_id,
		'start_date':start_date,
		'end_date':end_date,
	}
	if cu_abs_type_id and int(cu_abs_type_id) != 0 :
		BoModel().update_costom_user(data,cu_abs_type_id)
	else:
		BoModel().insert_custom_user(data,user_email,user_name,society_id)
	return "success"    
	
@app.route('/delete_costom_user/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def delete_costom_user(conf_id,conf_key):
	cu_abs_type_id = request.values.get("cu_abs_type_id")
	BoModel().delete_costom_user(cu_abs_type_id)
	return "success"

@app.route('/user_invite_letter/<user_id>',methods=["GET","POST"])
@app.route('/user_invite_letter/<user_id>/<is_base64>',methods=["GET","POST"])
def UserInviteLetter(user_id,user = None,is_base64 = 0):
	user        = user if user else UserModel().get_user_data(user_id)
	if user:
		now         = datetime.now()
		dt_string   = now.strftime("%d-%b-%Y")
		
		html = render_template('backoffice/custom_template/SZTNAOI_2023_invitation_letter.html',user=user,dt_string=dt_string)

		# return html
		options = {
					'dpi': 72,
					# 'page-size': 'A4',
					'page-height': '178.22mm', 
					'page-width': '118mm',
					 'margin-top': '0.0in',
					'margin-right': '0.0in',
					'margin-bottom': '0.0in',
					'margin-left': '0.0in',
					"enable-local-file-access": ""
				}
			
		if is_windows_os == 1:  
			config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)
		else:
			config = None
		
		pdf_file = pdfkit.from_string(html,False, options=options,configuration=config)
		print("pdf_file - ",type(pdf_file))
		if is_base64 == 1:
			# return {'content': base64.b64encode(pdf_file).decode('ascii'), 'type': 'application/pdf', 'name': str(user['prefix'] or '') + str(user['full_name'])+"-invite-letter.pdf"}     
			return {'content': pdf_file, 'type': 'application/pdf', 'name': str(user['full_name'])+"-invitation.pdf"}     
		
		else:    
			return Response(pdfkit.from_string(html, options=options),
					   mimetype="application/pdf",
					   headers={"Content-Disposition":
									"attachment;filename="+str(user['full_name'])+"-invitation.pdf"+""})
	else:
		return "Invalid url"  

@app.route('/send_user_invite_letter/<conf_id>/<conf_key>/<user_id>',methods=["GET","POST"])
@RouteGroup.conf_required
def SendUserInviteLetter(conf_id,conf_key,user_id):
	user        = UserModel().get_user_data(user_id)
	confData  = Auth.get_conference(conf_id)
	if user:
		attachmentData = UserInviteLetter(user['user_id'],user,1)
		# return jsonify(attachmentData)
		subject = str(user['prefix'] or '') + str(user['full_name']) + "SZTNAOI Invite Letter"
		to = "sridharan.r@numerotec.com"
		html = "SZTNAOI Invite Letter"
		mailData = {
			'TO' : to
		}
		EMAIL.sendMail_v2(subject,html,mailData,conf_id,confData,attachmentData)
		return "success"
	else:
		return "Invalid url"  

@app.route('/mainbookprint/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Print_main_book(conf_id,conf_key): 
	data       = BoModel().get_book_print_abstracts_data_v1(None,None,conf_id,1)
	session_data = data[0]
	abs_data_db = data[1]
	topics_data_db = data[2]
	judge_data_db = data[3]
	abstract_data =   defaultdict(list)
	topics_data   =   defaultdict(list)
	judge_data    =   defaultdict(list) 
	for r in abs_data_db:
		abstract_data[r["abs_session_id"]].append(r)
	for r in topics_data_db:
		topics_data[r["abs_session_id"]].append(r)
	for r in judge_data_db:
		judge_data[r["abs_session_id"]].append(r)
	# return jsonify(data)
	return render_template('backoffice/abstract/print_abstracts/bookprint/abstractbookprint.html',conf_id=conf_id,conf_key=conf_key,session_data=session_data,abstract_data=abstract_data,topics_data=topics_data,judge_data=judge_data) 
	
@app.route('/marksheet_label_index/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def marksheet_label_index(conf_id,conf_key):
	confData     = Auth.get_conference(conf_id) 
	# abs_types  = BoModel().get_abs_type(conf_id)
	# session_data = BoModel().get_abs_session(conf_id,None)
	session_types = BoModel().get_session_by_selection_types(None,conf_id,confData.get('conf_schema'))
	selection  = BoModel().get_session_selection_types(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/abs_marksheets/marksheet_label_index.html',conf_id=conf_id,conf_key=conf_key,session_types=session_types,selection=selection) 

@app.route('/post_marksheet_label_index/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_Marksheet_label_print(conf_id,conf_key):
	confData     = Auth.get_conference(conf_id) 
	abs_type     = request.values.get('abs_type')
	session_type = request.values.getlist('session_type')
	session_type = ','.join(session_type)
	data = BoModel().get_abs_session_with_judges(conf_id,abs_type,session_type,confData.get('conf_schema'))
	judge_data    =   defaultdict(list) 
	session_data = []
	session_ids = []
	if data:
		for r in data:
			judge_data[r["abs_session_id"]].append(r)
			if not (r['abs_session_id'] in session_ids):
				session_data.append(r)
				session_ids.append(r['abs_session_id'])
	return render_template('backoffice/abstract/abs_marksheets/marksheet_label_print.html',conf_id=conf_id,conf_key=conf_key,session_data=session_data,judge_data=judge_data) 

@app.route('/print_physical_poster/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def print_physical_poster(conf_id,conf_key): 
	confData = Auth.get_conference(conf_id)
	abstract_data = BoModel().get_physical_poster_abs(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/print_abstracts/print_physical_poser.html',conf_id=conf_id,conf_key=conf_key,abstract_data=abstract_data) 

@app.route('/update_usersdata/<society_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def UpdateUsersData(society_id,conf_id,conf_key):
	user_id     = request.values.get('user_id')
	prefix      = request.values.get('prefix') or None
	full_name   = request.values.get('full_name') or None
	email       = request.values.get('email') or None
	mobile      = request.values.get('mobile') or None
	dob         = request.values.get('dob') or None
	
	status      = 2
	if email:
		total_count  = UserModel().count_email(user_id,email,society_id)

		if total_count and int(total_count[0]) > 0 :
			msg="Email id already exist with someone"
			status = 1
	if mobile:
		mobile_count = UserModel().get_mobile_count(mobile,user_id,society_id)

		if mobile_count and int(mobile_count) > 0 :
			msg="Mobile number already exist with someone"
			status = 1
	
	if int(status) != 1:
		data = {
			'full_name'              : full_name,
			'prefix'                 : prefix,
			'email'                  : email,
			'mobile'                 : mobile,
			'dob'                    : dob,
			'updated_at'             : datetime.now()
			}
		status = 2

		output = UserModel().update_member(user_id,data)
		msg ="Successfully updated"
	data = { "msg" : msg ,"status" :status}
	json_data = json.dumps(data,default=str)
	return json_data

@app.route('/addnewuser/<society_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def AddNewUser(society_id,conf_id,conf_key):
	return render_template('backoffice/add_newuser.html',conf_id=conf_id,conf_key=conf_key,society_id=society_id,limit=2)

@app.route('/get_add_table/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def GetAddTable(conf_id,conf_key):
	total_row = request.values.get('limit') 
	start = request.values.get('start')
	lst = []
	html_data =  render_template('backoffice/add_newuser_table.html',start=int(start),limit=int(total_row),conf_id=conf_id,conf_key=conf_key,lst=lst)
	data = { "html_data":html_data}
	json_data = json.dumps(data,default=str)
	return json_data

@app.route('/insert_new_users/<society_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def InsertNewUsers(society_id,conf_id,conf_key):
	full_name   = request.values.get('full_name') or None
	email       = request.values.get('email') or None
	mobile      = request.values.get('mobile') or None
	email_data  = UserModel().check_email(email,society_id)
	mobile_data = UserModel().check_mobile(mobile,society_id)
	_blank = "_blank"
	if email_data :
		link =  url_for('backoffice.ViewUser',user_id=email_data.user_id,conf_id=conf_id,conf_key=conf_key)
		msg  = "Email id already exist with someone,<a href ="+link+" target="+_blank+" > View that Member</a>"
		status = 1   

	elif mobile_data :
		link =  url_for('backoffice.ViewUser',user_id=mobile_data.user_id,conf_id=conf_id,conf_key=conf_key)
		msg="Mobile number already exist with someone,<a href ="+link+" target="+_blank+" > View that Member</a>"
		status = 1

	else:
		data = {
			'society_id'   : society_id, 
			'prefix'       : 'Dr.',       
			'full_name'    : full_name,
			'email'        : email,
			'mobile'       : mobile,
			'created_at'   : datetime.now()
			}

		status = 2

		output = BoModel().insert_users(data)
		msg ="Successfully inserted"
	data = { "msg" : msg ,"status" :status}
	return json.dumps(data,default=str)

@app.route('/download_csv_file/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def DownloadCSVFile(conf_id,conf_key):
	output = io.StringIO()
	writer = csv.writer(output)
	line   = ['Full Name', 'Email','Mobile']
	writer.writerow(line)
	line = []
	writer.writerow(line)
	output.seek(0)
	return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename=""sample.csv"  })

@app.route('/upload_csv_file/<society_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def UploadCSVFile(society_id,conf_id,conf_key):
	
	file        = request.files.get('file')
	start       = request.values.get('start')
	limit       = 0
	col_names   = ['Full Name', 'Email','Mobile']
	csvData     = pd.read_csv(file,names=col_names, header=None)    
	lst         = []
	status      = 1
	for index,row in csvData.iterrows():
		if index == 0:
			if row[0] == col_names[0] and row[1] == col_names[1] and row[2] == col_names[2]:
				msg=""
			else:
				msg="The column names mismatch in the CSV file, Please use the sample.csv format"
				status = 2

		else:
			if status != 2:
				data = {}
				data['full_name']=row['Full Name']
				data['email']=row['Email']
				data['mobile']=row['Mobile']

				lst.append(data)
			else:
				pass

	limit = int(len(lst))
	html_data =  render_template('backoffice/add_newuser_table.html',limit=limit,start=int(start),conf_id=conf_id,conf_key=conf_key,lst=lst)        
	data = { "html_data" : html_data,"status":status ,'msg':msg}
	return json.dumps(data,default=str)
	
@app.route('/upload_new_attachemnt/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def UploadNewAttachement(conf_id,conf_key):
	selection_type   = BoModel().get_selection_type(abs_type=None)
	upload_selection = BoModel().get_selected_upload_abstract(conf_id)
	return render_template('backoffice/abstract/uploadstatus/upload_new_attachment.html',conf_id=conf_id,conf_key=conf_key,selection_type=selection_type,upload_selection=upload_selection)

@app.route('/get_abstract_for_upload/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def getAbstractForUpload(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	selection_type_id = request.values.get('selection_type_id')
	selection_type_id = selection_type_id.split("-")
	if selection_type_id[0]:
		results           = BoModel().get_selected_abstacts(conf_id,selection_type_id[0],confData.get('conf_schema'))
	else:
		results = ''
	return jsonify(results)

@app.route('/get_uploaded_image/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def getUploadedImage(conf_id,conf_key):
	abs_id           = request.values.getlist('abs_id')
	abs_id           = ",".join(abs_id)
	img_type         = request.values.get('img_type')
	abs_type         = request.values.get('abs_type')
	upload_selection = BoModel().get_abstract_typebyabstype(conf_id,abs_type)
	results          = BoModel().get_uploaded_image_type(abs_id,img_type)
	html = render_template('backoffice/abstract/uploadstatus/upload_image_div.html',conf_id=conf_id,conf_key=conf_key,img=results,upload_data=upload_selection)
	data = {'html':html}
	return json.dumps(data,default=str)

@app.route('/add_halls/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def AddHalls(conf_id,conf_key):
	return render_template('backoffice/abstract/AddNew_halls/add_newhalls.html',conf_id=conf_id,conf_key=conf_key)

#Get all halls data 
@app.route('/get_all_hall_list/<conf_id>/<conf_key>', methods = ["GET","POST"])
def getAllHallList(conf_id,conf_key):
	halls_data = BoModel().get_halls(conf_id)
	return render_template('backoffice/abstract/AddNew_halls/add_newhalls_table.html',halls_data = halls_data,conf_id=conf_id,conf_key=conf_key)

@app.route('/insert_halls/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def InsertHalls(conf_id,conf_key):
	hall_id       = request.values.get('hall_id')
	name          = request.values.get('hall_name')
	order_no      = request.values.get('order_no')
	hallname_data = BoModel().check_hall_exist_or_not(name,hall_id,conf_id)
	orderno_data  = BoModel().check_orderno_exist_or_not(order_no,hall_id,conf_id)

	if hallname_data:
		data = {'msg':'Hall Name already exists','status':2}
	elif orderno_data:
		data = {'msg':'Order number already exists','status':2} 
	else:
		data          = {'name':name,'order_no':order_no,'conf_id':conf_id,'created_at':datetime.now(),'updated_at': datetime.now()}
		result        = BoModel().insert_update_halls(conf_id,hall_id,data)
		html          =  render_template('backoffice/abstract/AddNew_halls/add_newhalls_table.html',halls_data = result,conf_id=conf_id,conf_key=conf_key)
		if int(hall_id) > 0 :
			msg = 'Updated Successfully'
		else:
			msg = "Inserted Successfully"

		data = {'html':html,'msg':msg,'status':1}
	return json.dumps(data,default=str)

@app.route('/delete_halls/<conf_id>/<conf_key>',methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def deleteHalls(conf_id,conf_key):
	hall_id   = request.values.get('hall_id')
	BoModel().delete_halls(hall_id)
	halls_data = BoModel().get_halls(conf_id)
	return render_template('backoffice/abstract/AddNew_halls/add_newhalls_table.html',halls_data = halls_data,conf_id=conf_id,conf_key=conf_key)

@app.route('/get_halls/<conf_id>/<conf_key>',methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def getHalls(conf_id,conf_key):
	hall_id   = request.values.get('hall_id')
	hall_data = BoModel().get_hall_by_hall_id(hall_id)
	return json.dumps(hall_data)
	
@app.route('/evaluation_template/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def EvaluationTemplate(conf_id,conf_key):
	eva_template = BoModel().get_evaluation_template(conf_id)
	return render_template('backoffice/settings/evaluation_template/eva_template_index.html',conf_id=conf_id,conf_key=conf_key,eva_template=eva_template)

@app.route('/view_evaluation_template/<template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def ViewEvaluationTemplate(template_id,conf_id,conf_key):
	eva_template_data = BoModel().get_evaluation_template_by_id(template_id)
	return render_template('backoffice/settings/evaluation_template/view_eva_template.html',conf_id=conf_id,conf_key=conf_key,eva_template_data=eva_template_data)

@app.route('/edit_eva_template/<template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def EditEvaTemplate(template_id,conf_id,conf_key):
	eva_template_data = BoModel().get_evaluation_template_by_id(template_id)
	return render_template('backoffice/settings/evaluation_template/edit_eva_template.html',conf_id=conf_id,conf_key=conf_key,eva_template_data=eva_template_data)

@app.route('/post_edit_eva_template/<template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def PostEditEvaTemplate(template_id,conf_id,conf_key):
	abs_type       = request.values.get('abs_type')
	template_name  = request.values.get('template_name')
	template_data  = request.values.get('template_data')
	data    = {
		'abs_type'      : abs_type,
		'template_name' : template_name,
		'template_data' : template_data,
		'conf_id'       : conf_id
	}
	BoModel().insert_update_evaluation_template(data,template_id)
	return redirect(url_for('backoffice.EditEvaTemplate',conf_id=conf_id,conf_key=conf_key,template_id=template_id))

@app.route('/add_new_evaluation_template/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def AddNewEvaluationTemplate(conf_id,conf_key):
	data       = {'conf_id':conf_id}
	template_id = BoModel().insert_update_evaluation_template(data,template_id=None)
	return redirect(url_for('backoffice.PostEditEvaTemplate',conf_id=conf_id,conf_key=conf_key,template_id=template_id)) 

@app.route('/delete_eva_template/<template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def DeleteEvaTemplate(template_id,conf_id,conf_key):
	BoModel().delete_eva_template(template_id)
	flash('Deleted successfully','errorMsg')
	return redirect(url_for('backoffice.EvaluationTemplate',conf_id=conf_id,conf_key=conf_key))

@app.route('/duplicate_eva_template/<template_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def DuplicateEvaTemplate(template_id,conf_id,conf_key):
	data = BoModel().get_evaluation_template_by_id(template_id)
	datas = {
		'template_name' :   str(data['template_name'])+str( ' - Duplicate'),
		'abs_type'      :   data['abs_type'],
		'template_data' :   data['template_data'],
		'conf_id'       :   conf_id
		}
	BoModel().insert_update_evaluation_template(datas,template_id=None)
	return redirect(url_for('backoffice.EvaluationTemplate',conf_id=conf_id,conf_key=conf_key))
	
@app.route('/generate_sp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def generateSP(conf_id,conf_key):
	return render_template('backoffice/generate_sp.html',conf_id=conf_id,conf_key=conf_key) 

@app.route('/post_generate_sp/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def postGenerateSP(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	generate_btn = request.values.get('generate_btn')
#   print("generate_btn>>>",generate_btn)
	if (generate_btn=="e_abstract"):
		get_generated_eabstract = BoModel().get_e_abstracts(conf_id)
		flash("Generate E-abstract successfully","successMsg")
	elif(generate_btn=="av_code"):
		get_generated_av_code= BoModel().get_avcode(conf_id)
		flash("Generate Avcode successfully","successMsg")
	elif(generate_btn=="agenda"):
		get_generated_agenda= BoModel().get_agenda(conf_id)
		flash("Generate Agenda successfully","successMsg")
	elif(generate_btn=="certificate"):
		get_generated_agenda= BoModel().get_certificate(conf_id)
		flash("Generate Certificate successfully","successMsg")
	elif(generate_btn=="badge_commitment"):
		get_generated_agenda= BoModel().get_badge(conf_id)
		flash("Generate Badge successfully","successMsg")
	elif(generate_btn=="whatsapp_commitment"):
		data= BoModel().get_whatsapp_commitment(conf_id)
		output   = io.BytesIO()
		Workbook = xlwt.Workbook()
		col_name       = ["Name","Email","Mobile","Membership","Session_date","Session_time","Hall","Message"]
		session_date    =   defaultdict(list)
		date =[]
		for i in data:
			session_date[i["sess_date"].strftime("%d-%m-%Y")].append(i)
			if i["sess_date"].strftime("%d-%m-%Y") not in date:
				date.append(i["sess_date"].strftime("%d-%m-%Y"))
#       print(date)
		export_columns = ["full_name","email","mobile","membership_no","sess_date","sess_time","hall","message"]
		for d in date:
			sh = Workbook.add_sheet(d)
			idx      = 0
			a = 0
			for row in col_name:
				sh.write(0,a,row)
				sno_val = 0
				a+=1
			b=0
			sno_val = 0
			for row in session_date[d]:
				for i in export_columns:
					if i == "sess_date":
						sh.write(idx+1, b, row[i].strftime("%d-%m-%Y")) 
					else:
						sh.write(idx+1, b, row[i])
					b+=1
				b=0
				idx+=1
		Workbook.save(output)
		output.seek(0)
		now    = datetime.now()
		date   = now.strftime("%Y-%m-%d %H:%M")
		return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+confData['conf_name']+"Datewise_Whatsapp_Committment_Report-"+str(date)+".xls"})
		# print(date)
	else:
		return render_template('backoffice/generate_sp.html',conf_id=conf_id,conf_key=conf_key)
	return render_template('backoffice/generate_sp.html',conf_id=conf_id,conf_key=conf_key)

@app.route('/view_commitment_with_delegate_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def ViewCommitmentWithDelegateData(conf_id,conf_key):
	s_abs_types     = request.values.getlist('abs_type') or None
	is_delegate = request.values.get('is_delegate') or None
	role_id     = request.values.getlist('role_id') or None
	btn_page    = request.values.get('form_submit',None)

	if role_id:
		role_id       = (','.join(str(e) for e in role_id))
		role_ids      =  role_id.split(",")
		role_id_int      = list(map(int,role_ids))
	else: 
		role_id_int  = None

	if s_abs_types:
		abs_types_str   = ("','".join(s_abs_types))
		abs_types_str    = "'"+abs_types_str+"'"
	else:
		abs_types_str = None

	abs_roles = BoModel().get_role_for_desigination()
# 	print("SP Pram - ",conf_id,abs_types_str,role_id,is_delegate)
	commitment_data = BoModel().usp_get_delegate_commitment(conf_id,abs_types_str,role_id,is_delegate)
	if commitment_data:
		for index,value in enumerate(commitment_data) :
			if index == 0 :
				abs_data = value

			if index == 1 :
				abs_types = value

	if btn_page == "Export Excel":
		output = io.BytesIO()
		Workbook =xlwt.Workbook()
		sh = Workbook.add_sheet('Speaker Report')
		sh.write(0,0,'Sno')
		sh.write(0,1,'Delegate No')
		sh.write(0,2,'Membership No')
		sh.write(0,3,'Name')
		sh.write(0,4,'Email')
		sh.write(0,5,'Mobile')
		sh.write(0,6,'Abstracts')

		idx=0
		sno_val = 0
		for data in abs_data:
			sno_val = sno_val+1
			sh.write(idx+1,0,sno_val)
			sh.write(idx+1, 1, data['delegate_no'])
			sh.write(idx+1, 2, data['membership_no'])
			sh.write(idx+1, 3, data['full_name'])
			sh.write(idx+1, 4, data['email'])
			sh.write(idx+1, 5, data['mobile'])
			sh.write(idx+1, 6, data['abstracts'])
			idx+=1
		Workbook.save(output)
		output.seek(0)
		now    = datetime.now()
		date   = now.strftime("%Y-%m-%d %H:%M")
		return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+conf_key+"Speaker_Report-"+str(date)+".xls"})
	elif btn_page == "Export CSV" :
		now    = datetime.now()
		date   = now.strftime("%Y-%m-%d %H:%M")
		output = io.StringIO()
		writer = csv.writer(output)
		line   = ['S.No', 'Delegate No','Membership No', 'Name', 'Email','Mobile' ,'Abstracts']
		writer.writerow(line)
		sno_val = 0
		for row in abs_data:
			
			sno_val = sno_val +1
			line = [sno_val ,row['delegate_no'],row['membership_no'] , row['full_name'], row['email'],row['mobile'],row['abstracts']]
			writer.writerow(line)
		output.seek(0)
		return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename=""Record_"+str(date)+".csv"})  
	return render_template('backoffice/commitment_delegate.html',conf_id=conf_id,conf_key=conf_key,abs_data=abs_data,abs_roles=abs_roles,abs_types=abs_types,role_id_int=role_id_int,s_abs_types=s_abs_types,is_delegate=is_delegate)
	
@app.route('/marksheet_template/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def MarksheetTemplate(conf_id,conf_key):
	marksheet_template = BoModel().get_marksheet_all_template(conf_id)
	return render_template('backoffice/settings/marksheet_template/marksheet_template_index.html',conf_id=conf_id,conf_key=conf_key,marksheet_template=marksheet_template)

@app.route('/edit_marksheet_template/<temp_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def EditMarksheetTemplate(temp_id,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	ms_template_data = BoModel().get_marksheet_template_by_id(temp_id)
	abstractData     = BoModel().get_abs_types(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/settings/marksheet_template/edit_marksheet_template.html',conf_id=conf_id,conf_key=conf_key,ms_template_data=ms_template_data,abstractData=abstractData)

@app.route('/post_edit_marksheet_template/<temp_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def PostEditMarksheetTemplate(temp_id,conf_id,conf_key):

	abs_type            = request.values.get('abs_type')
	selection_type_id   = request.values.get('selection_type_id')
	abs_prefix          = request.values.get('abs_prefix')
	parameters          = request.values.get('parameters')
	total_mark          = request.values.get('total_marks')

	data    = {
		'abs_type'          : abs_type,
		'selection_type_id' : selection_type_id,
		'abs_prefix'        : abs_prefix,
		'parameters'        : parameters,
		'total_mark'        : total_mark,
		'conf_id'           : conf_id
	}
	BoModel().insert_update_marksheet_template(data,temp_id)
	flash('Updated Successfully','successMsg')
	return redirect(url_for('backoffice.MarksheetTemplate',conf_id=conf_id,conf_key=conf_key))

@app.route('/get_distinct_selection_type/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def GetDistinctSelectionType(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	abs_type = request.values.get('abs_type')
	selectionData = BoModel().get_distinct_selection(conf_id,abs_type,confData.get('conf_schema'))
	return jsonify(selectionData)

@app.route('/get_selection_type_prefix/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def GetSelectionTypePrefix(conf_id,conf_key):
	selection_type_id = request.values.get('selection_type_id')
	selectionPrefix = BoModel().get_selection_prefix(selection_type_id)
	return jsonify(selectionPrefix)

@app.route('/add_new_marksheet_template/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def AddNewMarksheetTemplate(conf_id,conf_key):
	data       = {'conf_id':conf_id}
	temp_id = BoModel().insert_update_marksheet_template(data,temp_id=None)
	return redirect(url_for('backoffice.EditMarksheetTemplate',conf_id=conf_id,conf_key=conf_key,temp_id=temp_id)) 

@app.route('/delete_marksheet_template/<temp_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def DeleteMarksheetTemplate(temp_id,conf_id,conf_key):
	BoModel().delete_marksheet_template(temp_id)
	flash('Deleted successfully','errorMsg')
	return redirect(url_for('backoffice.MarksheetTemplate',conf_id=conf_id,conf_key=conf_key))

@app.route('/duplicate_marksheet_template/<temp_id>/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def DuplicateMarksheetTemplate(temp_id,conf_id,conf_key):
	data = BoModel().get_marksheet_template_by_id(temp_id)
	datas = {
		'abs_type'              :   str(data['abs_type'])+str( ' - Duplicate'),
		'selection_type_id'     :   data['selection_type_id'],
		'abs_prefix'            :   data['abs_prefix'],
		'parameters'            :   data['parameters'],
		'total_mark'            :   data['total_mark'],
		'conf_id'               :   conf_id
		}
	BoModel().insert_update_marksheet_template(datas,temp_id=None)
	return redirect(url_for('backoffice.MarksheetTemplate',conf_id=conf_id,conf_key=conf_key))

@app.route('/gentrate_scoring_marksheet/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def GentrateScoringMarksheet(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_types = BoModel().get_comp_session_types(conf_id,confData['conf_schema'])
	return render_template('backoffice/abstract/session_scoring/session_select_for_scoring.html',conf_id=conf_id,conf_key=conf_key,session_types=session_types)

@app.route('/post_gentrate_scoring_marksheet/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def PostGentrateScoringMarksheet(conf_id,conf_key):
	submit_btn = request.values.get('submit_btn')

	abs_session= request.values.get('abs_session')
	if abs_session:
		abs_sess= abs_session.split("__")
		data       = BoModel().get_marksheet_data(abs_sess[0],abs_sess[1],conf_id)
		for index,value in enumerate(data):
			if index == 0 :
				session_data = value[0]
			if index == 1 :
				abstract_data = value
			if index == 3 :
				judge_data = value
			if index == 4 :
				scoring_data = value
			if index == 5 :
				sorting_abs_data = value
		
		if len(abstract_data) !=0:
			selection_type_id = abstract_data[0]["selection_type_id"]
			marksheet_template = BoModel().get_marksheet_template(conf_id,abs_sess[1],selection_type_id)

			m_data = {}
			for m in scoring_data:
				key = str(m['abs_id'])+"_"+str(m['user_id'])
				m_data[key] = m 
			
			first_topmark = max(sorting_abs_data, key=lambda x:x['total'])
			return render_template('backoffice/abstract/session_scoring/scoring_marksheet.html',conf_id=conf_id,conf_key=conf_key,session_data=session_data,abstract_data=sorting_abs_data,judge_data=judge_data,marksheet_template=marksheet_template,m_data=m_data,abs_type=abs_sess[1],first_topmark=first_topmark)
		else:
			return "No data"
	else:
		return redirect(url_for('backoffice.GentrateScoringMarksheet',conf_id=conf_id,conf_key=conf_key))
	
	
@app.route('/export_scoringsheet_download_excel/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def ExportScoringSheetDownloadExcel(conf_id,conf_key):
	data       = BoModel().usp_download_scoring_marksheet(conf_id)
	for index,value in enumerate(data):
		if index == 0 :
			all_session = value
		if index == 1 :
			abstract_data = value
		if index == 2 :
			judge_data = value
		if index == 3 :
			scoring_data = value
		if index == 4 :
			sorting_abs_data = value

	sheet_id    = []
	sheet_names = {}
	d_session_name = {}
	lst_jud     = []
	d_judgedata = {}
	
	d_session_details = {}
	lst_judges = []
	dj=[]

	sheets ={}
	m_data = {}

	hall_name = {}
	
	i=1
	for session in all_session:
		hall = session['name'].replace(" ","")
		hall_name[str(session['abs_session_id'])] = hall+'-'+session['start_date'].strftime('%d%m')+'-'+session['start_date'].strftime('%H%M')+'-'+session['end_date'].strftime('%H%M')
		sheet_id.append(str(session['abs_session_id']))
		sheet_names[str(session['abs_session_id'])] = session['session_name']
		d_session_name[str(session['abs_session_id'])] = session['session_name']
		d_session_details[str(session['abs_session_id'])] = "Date : "+str(session['start_date'].strftime('%d-%m-%Y'))+"  Hall : "+str(session['name'])+"  Time : "+str(session['start_date'].strftime('%H:%M'))+" - "+str(session['end_date'].strftime('%H:%M'))

		for m in scoring_data:
			if m['session_id'] == session['abs_session_id']:
				key = str(m['abs_id'])+"_"+str(m['user_id'])
				m_data[key] = m['total_mark']
				
		d_absdata ={}
		jd= ""
		for jdata in judge_data:
			if jdata['session_id'] == session['abs_session_id']:
				judge_details = " "+str(jdata['role'])+" : "+str(jdata['full_name'])+"("+str(jdata['mobile'])+")" # Judge: Dr.ABI (1213223213)
				d_judgedata['judge_'+str(i)] = judge_details #
				jd+=str(d_judgedata['judge_'+str(i)])
				i = i+1
				d_absdata[str(session['abs_session_id'])] = jd
		lst_jud.append(d_absdata)

		j_name = {}
		h_judges_name = {}
		dict_jcount = {}
		j_count=2
		j_name['jname_0'] = ""
		j_name['jname_1'] = "Speaker Present (Y/N)"

		for judge_name in judge_data:
			if judge_name['session_id'] == session['abs_session_id']:
				j_name['jname_'+str(j_count)] = judge_name['full_name']
				j_count=j_count+1
				h_judges_name[str(session['abs_session_id'])] = j_name

		j_name['jname_'+str(j_count)] = "Total" 
		j_name['jname_'+str(j_count+1)] = "Average"
		dict_jcount[str(session['abs_session_id'])] = j_count
		lst_judges.append(h_judges_name)
	
		dj.append(dict_jcount)

		rows = []
		y = 0
		
		for data in sorting_abs_data:

			cell_dict  = {}
			if data['abs_session_id'] == session['abs_session_id']:
				
				abs_no = "["+str(data['abs_type'])+str(data['abs_no'])+"] : "+str(data['title'])
				if data['pcu_name']:
					authors ="CHIEF & PRESENTING AUTHOR : "+str(data['pcu_name'])
				else : 
					authors ="CHIEF AUTHOR : "+str(data['ca_name'])+" PRESENTING AUTHOR : "+str(data['pa_name'])

				if data['co_authors']:
					coauthor = "Co Author(s) : "+str(data['co_authors'])
				else:
					coauthor = ""
				
				# absData = str(abs_no)+" "+str(authors)+" "+str(coauthor)
				comment_font = xlwt.easyfont("bold true")
				absData = (abs_no,"\n",(authors, comment_font),"\n",coauthor)
				cell_dict['c0'] = data['abs_id']
				cell_dict['c1'] = absData

				if data['is_present'] != None:
					if int(data['is_present']) == 1:
						is_present = "Y" 
					else:
						is_present = "N"
				else:
					is_present = ""

				cell_dict['c2'] = is_present
				y = y+1

				x = 3
				for j in judge_data:
					if j['session_id'] == session['abs_session_id']:
						key = str(data['abs_id'])+'_'+str(j['user_id'])
						if m_data:
							if key in m_data.keys():
								marks = m_data[key]  
							else:
								marks = ""
						else:
							marks = ""
						cell_dict['c'+str(x)] = marks
						x=x+1
		
				cell_dict['c'+str(x)] = data['total']
				cell_dict['c'+str(x+1)] = data['avg']
				rows.append(cell_dict)


		sheets[str(session['abs_session_id'])]=rows

	output   = io.BytesIO()
	Workbook = xlwt.Workbook()
	file_name = conf_key
	lst_sheetname = []

	if sheet_id :

		t=0
		for d in sheet_id:
			count_judges = dj[t][d]
			t+=1
			sheet_name = sheet_names[d].replace("/","").strip()
			sheet =  sheet_name[:25] + '..' * (len(sheet_name) > 25)
			
			if sheet in lst_sheetname:
				sheet_1 = hall_name[d]
				sheet_1 = sheet_1.replace("/","").strip()
				sheet =  sheet_1[:25] + '..' * (len(sheet_1) > 25)
			
			lst_sheetname.append(sheet)
			
			sh = Workbook.add_sheet(sheet)
			sh.row(0).height = 20*20  
			sh.row(1).height = 20*20
			sh.row(2).height = 50*20
			sh.row(3).height = 50*20
			sh.col(0).width = int(60 * 300)
			h_style = xlwt.easyxf('pattern: pattern solid, fore_colour white;' 'font: colour black,bold True, name Calibri, height 250; align: horiz centre;border: left thin,right thin,top thin,bottom thin')
			style   = xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour white;' 'font: colour black, name Calibri, height 200; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')
			style_2 = xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour white;' 'font: colour black, name Calibri, height 200; align: vert centre, horiz left;border: left thin,right thin,top thin,bottom thin')
			sh.write_merge(0,0,0,int(count_judges)+1,d_session_name[d],style=h_style)
			sh.write_merge(1,1,0,int(count_judges)+1,d_session_details[d],style=style)
			for index,value in enumerate(lst_jud):
				keys = list(value.keys())
				for key in keys:
					key = key
					if key == d :
						sh.write_merge(2,2,0,int(count_judges)+1,value[d],style=style)
			nth_row  = 3
			nth_col  = 0
			for index,value in enumerate(lst_judges):
				keys = list(value.keys())
				for key in keys:
					key = key
					if key == d :
						for j in range(0,int(count_judges)+2):
							sh.write(nth_row,nth_col,value[d]['jname_'+str(j)],style=style)
							nth_col+=1  
						nth_col = 0
						nth_row+=1
			nth_row  = 4
			nth_col  = 0
			
			a=0
			keys = sheets.keys()
			if sheets[d]:
				first_topmark = max(sheets[d],key=lambda x:x['c'+str(int(count_judges)+1)])
			else:
				first_topmark = ''
			
			m =count_judges
			alpaindex = {0:'C',1:'D',2:'E',3:'F',4:'G',5:'H',6:'I',7:'J',8:'K',9:'L',10:'M',11:'N',12:'O',13:'P',14:'Q',15:'R'}
			for key in keys :
				if key == d:
					for data in sheets[d]:
						d_keys = data.keys()
						sh.row(a+4).height = 50*20  
						for l in range(1,len(d_keys)):
							style_1=xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour yellow;''font: colour black, bold True, name Calibri, height 200; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')

							if data['c'+str(int(count_judges)+1)] == first_topmark['c'+str(int(count_judges)+1)] and data['c'+str(int(count_judges)+1)] !=0:
								if 'c'+str(j) == 'c1':
									sh.row(nth_row).set_cell_rich_text(nth_col, data['c'+str(l)], style_1)
								else:
									sh.write(nth_row,nth_col,data['c'+str(l)],style=style_1)
							else:
								# if 'c'+str(l) == 'c1':
								# 	sh.write(nth_row,nth_col,data['c'+str(l)],style=style_2)
								# else:
								# 	sh.write(nth_row,nth_col,data['c'+str(l)],style=style)
								if 'c'+str(l) == 'c1':
									sh.write(nth_row,nth_col,data['c'+str(l)],style=style_2)
								elif 'c'+str(l) == 'c'+str(count_judges+1):
									if int(m) > 3:
										sh.write(nth_row,nth_col,xlwt.Formula("SUM(C"+str(nth_row+1)+":"+ alpaindex[m-3] +str(nth_row+1)+")"),style=style)
									else:
										sh.write(nth_row,nth_col,data['c'+str(l)],style=style)

								elif 'c'+str(l) == 'c'+str(count_judges+2):
									if int(m) > 3:
										sh.write(nth_row, nth_col, xlwt.Formula(alpaindex[m-2]+str(nth_row+1)+"/"+str(int(count_judges)-2)),style=style)
									else:
										sh.write(nth_row,nth_col,data['c'+str(l)],style=style)
								else:
									sh.write(nth_row,nth_col,data['c'+str(l)],style=style)
							
							nth_col+=1  
								
						nth_col = 0
						nth_row+=1
						a+=1
			
		Workbook.save(output)
		output.seek(0)
		return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+str(file_name)+".xls"})
	
	return None

@app.route('/post_marks/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def PostMarks(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	submit_btn = request.values.get('submit_btn')
	session_id = request.values.get('session_id')
	abs_type   = request.values.get('abs_type')
	lst        = request.values.getlist('m_key')
	judge_lst  = request.values.getlist('judge_user_id')
	m_list_insert = []  
	m_list_update = []  
	attendance_data = []
	jud_attendance_data = []
	for key in lst:
		data = {}
		att_data = {}
		data['session_id']      = session_id
		data['abs_id']          = key.split('_')[0]
		data['user_id']         = key.split('_')[1]
		data['m1']              = request.values.get('m1_'+key) or 'null'
		data['m2']              = request.values.get('m2_'+key) or 'null' 
		data['m3']              = request.values.get('m3_'+key) or 'null' 
		data['m4']              = request.values.get('m4_'+key) or 'null' 
		data['m5']              = request.values.get('m5_'+key) or 'null'
		data['total_mark']      = request.values.get('t_marks_'+key) 
		data['judges_mark_id']  = request.values.get('m_pk_'+key) or 0
		data['is_present']      = request.values.get('is_present_'+data['abs_id']) or 'null'
		data['created_at']      = datetime.now()
		data['updated_at']      = datetime.now()
		att_data['abs_id']      = key.split('_')[0]
		att_data['is_present']  = request.values.get('is_present_'+data['abs_id']) or 'null'
		
		if int(data['judges_mark_id']) >0:
			if data['total_mark'] == '':
				data['total_mark'] = 'null'
			m_list_update.append(data)
				
		else:
			if data['total_mark'] != '':
				m_list_insert.append(data)

		attendance_data.append(att_data)

	for key in judge_lst:
		att_juddata = {}
		att_juddata['judges_id']       = request.values.get('judges_id_'+str(key))
		att_juddata['is_present']    = request.values.get('j_present_'+str(att_juddata['judges_id'])) or 'null'
		jud_attendance_data.append(att_juddata)

	data       = BoModel().get_marksheet_data(session_id,abs_type,conf_id)
	for index,value in enumerate(data):
		if index == 0 :
			session_data = value[0]
		if index == 3 :
			judge_data = value
		if index == 4 :
			scoring_data = value
		if index == 5 :
			sorting_abs_data = value

	lst_abs = []
	d_absdata = {}
	d_absdata['session_name'] = session_data['session_name'] #for getting session name
	# for getting session date,time and hall
	d_absdata['session_names'] = "Date : "+str(session_data['start_date'].strftime('%d-%m-%Y'))+"  Hall : "+str(session_data['name'])+"  Time : "+str(session_data['start_date'].strftime('%H:%M'))+" - "+str(session_data['end_date'].strftime('%H:%M'))
	lst_abs.append(d_absdata)

	# for getting judge details(Role,Name,Mobile)
	lst_jud = []
	d_judgedata = {}
	i=1
	jd= ""
	for jdata in judge_data:
		judge_details = " "+str(jdata['role'])+" : "+str(jdata['full_name'])+"("+str(jdata['mobile'])+")" # Judge: Dr.ABI (1213223213)
		d_judgedata['judge_'+str(i)] = judge_details #
		jd+=str(d_judgedata['judge_'+str(i)])
		i = i+1
		
	d_absdata['judge'] = jd
	lst_jud.append(d_absdata)

	lst_jud_name = []
	j_name = {}
	i=2

	j_name['jname_0'] = ""  # For Empty
	j_name['jname_1'] = "Speaker Present (Y/N)" 
	for judge_name in judge_data:
		j_name['jname_'+str(i)] = judge_name['full_name']
		i = i+1

	j_name['jname_'+str(len(judge_data)+2)] = "Total" 
	j_name['jname_'+str(len(judge_data)+3)] = "Average"

	lst_jud_name.append(j_name)

	m_data = {}
	for m in scoring_data:
		key = str(m['abs_id'])+"_"+str(m['user_id'])
		m_data[key] = m['total_mark']
	
	lst_abs_data = []
	
	for data in sorting_abs_data:
		dict_abs_details  = {}
		abs_no = "["+str(data['abs_type'])+str(data['abs_no'])+"] : "+str(data['title'])
		if data['pcu_name']:
			authors ="CHIEF & PRESENTING AUTHOR : "+str(data['pcu_name'])
		else : 
			authors ="CHIEF AUTHOR : "+str(data['ca_name'])+" PRESENTING AUTHOR : "+str(data['pa_name'])

		if data['co_authors']:
			coauthor = "Co Author(s) : "+str(data['co_authors'])
		else:
			coauthor = ""

#       absData = str(abs_no)+" "+str(authors)+" "+str(coauthor)
		comment_font = xlwt.easyfont('bold true')
		absData = (abs_no,"\n",(authors, comment_font),"\n",coauthor)
		dict_abs_details['c0'] = absData

		if data['is_present'] != None:
			if int(data['is_present']) == 1:
				is_present = "Y" 
			else:
				is_present = "N"
		else:
			is_present = ""


		dict_abs_details['c1'] = is_present
		x=2
		for j in judge_data:
			key = str(data['abs_id'])+'_'+str(j['user_id'])
			if m_data:
				if key in m_data.keys():
					marks = m_data[key]  
				else:
					marks = ""
			else:
				marks = ""
			dict_abs_details['c'+str(x)] = marks
			x=x+1

		dict_abs_details['c'+str(len(judge_data)+2)] = data['total']
		dict_abs_details['c'+str(len(judge_data)+3)] = data['avg']
		
		lst_abs_data.append(dict_abs_details)

	first_topmark = max(sorting_abs_data, key=lambda x:x['total'])
	
	if submit_btn == "Save":
		BoModel().update_attendance(attendance_data,jud_attendance_data,confData['conf_schema'])
		if m_list_insert:
			BoModel().insert_scoring_marks(m_list_insert,confData['conf_schema'])
		elif m_list_update:
			BoModel().update_scoring_marks(m_list_update,confData['conf_schema'])
		flash('Updated Successfully','successMsg')

	elif submit_btn == "Export CSV":
		rows      = lst_abs
		file_name = session_data['session_name']
		output    = io.StringIO()
		writer    = csv.writer(output)
		if rows:
			for i in rows:
				line = []
				line.append(i['session_name'])
				writer.writerow(line)

			for i in rows:
				line = []
				line.append(i['session_names'])
				writer.writerow(line)

			for i in rows:
				line = []
				line.append(i['judge'])
				writer.writerow(line)

			for i in lst_jud_name:
				line = []
				for j in range(0,len(judge_data)+4):
					
					line.append(i['jname_'+str(j)])
				writer.writerow(line)

			for i in lst_abs_data:
				line = []
				for j in range(0,len(judge_data)+4):
					line.append(i['c'+str(j)])
				writer.writerow(line)
			output.seek(0)
			return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+str(file_name)+".csv"})

	elif submit_btn == "Export Excel":
		header   = None
		file_name = session_data['session_name']
		rows     = lst_abs
		output   = io.BytesIO()
		Workbook = xlwt.Workbook()
		sheet_name = session_data['session_name'].replace("/","").strip()
		sheet =  sheet_name[:25] + '..' * (len(sheet_name) > 25)
		sh = Workbook.add_sheet(sheet)
		sh.row(0).height = 20*20  # to set row height
		sh.row(1).height = 20*20
		sh.row(2).height = 50*20
		sh.row(3).height = 50*20
		sh.col(0).width = int(60 * 320) # to set col width
		style = xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour white;' 'font: colour black, name Calibri, height 200; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')
		style_2 = xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour white;' 'font: colour black, name Calibri, height 200; align: vert centre, horiz left;border: left thin,right thin,top thin,bottom thin')
		h_style = xlwt.easyxf('pattern: pattern solid, fore_colour white;' 'font: colour black,bold True, name Calibri, height 250; align: horiz centre;border: left thin,right thin,top thin,bottom thin')
		
		if rows:
			for row in rows:
				sh.write_merge(0,0,0,len(judge_data)+3,row['session_name'],style=h_style)
			for row in rows:
				sh.write_merge(1,1,0,len(judge_data)+3,row['session_names'],style=style)
			for row in rows:
				sh.write_merge(2,2,0,len(judge_data)+3,row['judge'],style=style)

			nth_row  = 3
			nth_col  = 0
			for i in lst_jud_name:
				for j in range(0,len(judge_data)+4):
					sh.write(nth_row,nth_col,i['jname_'+str(j)],style=style)
					nth_col+=1
				nth_col = 0
				nth_row+=1

			nth_row  = 4
			nth_col  = 0    
			style_1=xlwt.easyxf('alignment: wrap True;''pattern: pattern solid, fore_colour yellow;''font: colour black, bold True, name Calibri, height 200; align: vert centre, horiz centre;border: left thin,right thin,top thin,bottom thin')
			x=0
			m =len(judge_data)
			alpaindex = {0:'C',1:'D',2:'E',3:'F',4:'G',5:'H',6:'I',7:'J',8:'K',9:'L',10:'M',11:'N'}
			for i in lst_abs_data:
				sh.row(x+4).height = 50*20  
				for j in range(0,len(judge_data)+4):
					if i['c'+str(len(judge_data)+2)] == first_topmark['total'] and i['c'+str(len(judge_data)+2)] !=0:
						sh.write(nth_row,nth_col,i['c'+str(j)],style=style_1)
					else:
						if 'c'+str(j) == 'c0':
							sh.write(nth_row,nth_col,i['c'+str(j)],style=style_2)
						
						elif 'c'+str(j) == 'c'+str(len(judge_data)+2):
							# ws.write(2, 2, xlwt.Formula("A3+B3"))
							# sh.write(nth_row,nth_col,i['c'+str(j)],style=style)
							if int(m) != 0 :
								sh.write(nth_row, nth_col, xlwt.Formula("SUM(C"+str(nth_row+1)+":"+ alpaindex[m-1] +str(nth_row+1)+")"),style=style)
							else:
								sh.write(nth_row,nth_col,i['c'+str(j)],style=style)
								
						elif 'c'+str(j) == 'c'+str(len(judge_data)+3):
							if int(m) != 0 :
								sh.write(nth_row, nth_col, xlwt.Formula(alpaindex[m]+str(nth_row+1)+"/"+str(len(judge_data))),style=style)
							else:
								sh.write(nth_row, nth_col,i['c'+str(j)],style=style)
						else:
							sh.write(nth_row,nth_col,i['c'+str(j)],style=style)
					nth_col+=1
				nth_col = 0
				nth_row+=1
				x+=1

			Workbook.save(output)
			output.seek(0)
			return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+str(file_name)+".xls"})
		return None
		
	abs_session = str(session_id)+'__'+str(abs_type)
	return redirect(url_for('backoffice.PostGentrateScoringMarksheet',conf_id=conf_id,conf_key=conf_key,abs_session=abs_session))

@app.route('/print_scoring_marksheet/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def PrintScoringMarksheet(conf_id,conf_key):
	abs_session= request.values.get('abs_session')
	if abs_session:
		abs_sess= abs_session.split("__")
		data       = BoModel().get_marksheet_data(abs_sess[0],abs_sess[1],conf_id)
		for index,value in enumerate(data):
			if index == 0 :
				session_data = value[0]
			if index == 1 :
				abstract_data = value
			if index == 3 :
				judge_data = value
			if index == 4 :
				scoring_data = value
			if index == 5 :
				sorting_abs_data = value

		if abstract_data:
			selection_type_id = abstract_data[0]["selection_type_id"]
		marksheet_template = BoModel().get_marksheet_template(conf_id,abs_sess[1],selection_type_id)

		m_data = {}
		for m in scoring_data:
			key = str(m['abs_id'])+"_"+str(m['user_id'])
			m_data[key] = m 

		first_topmark = max(sorting_abs_data, key=lambda x:x['total'])
		return render_template('backoffice/abstract/session_scoring/print_scoring_marksheet.html',conf_id=conf_id,conf_key=conf_key,session_data=session_data,abstract_data=sorting_abs_data,judge_data=judge_data,marksheet_template=marksheet_template,m_data=m_data,abs_type=abs_sess[1],first_topmark=first_topmark)
	else:
		return redirect(url_for('backoffice.GentrateScoringMarksheet',conf_id=conf_id,conf_key=conf_key))

@app.route('/change_judge_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def ChangeJudgeSession(conf_id,conf_key):
	judges_id  = request.values.get('judges_id')
#   print(judges_id)
	data = {
		'session_id' : request.values.get('session_id'),
		'user_id'    : request.values.get('user_id'),
		'role_id'    : request.values.get('role_id'),
		'is_present' : None,
		}
	BoModel().update_judges(data,judges_id)
	datas = {'msg':"Changed Successfully"}
	return jsonify(datas)

@app.route('/<conf_id>/<conf_key>/insert_fb_commitment',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def InsertFbCommitment(conf_id,conf_key):
	# now_date       = datetime.now()
	# date              = now_date.strftime('%Y-%m-%d %H:%M:%S')
	# user_ids=request.values.get('user_ids')
	# user_id=str(user_ids)[1:-1]
	# users=list(user_id.split(","))
	# val=[]
	# for i in users:
	#   # y='data_'+str(i.strip())
	#   # print(y)
	#   data={
	#   'user_id':(i.strip()),
	#   'conf_id':conf_id,
	#   'fb_commitments':request.values.get('data_'+str(i.strip())),
	#   'created_at':date
	#   }
	#   val.append(data)
	# insert_fb_commitment=BoModel().InsertFbCommitmentData_v1(val)
	insert_fb_commitment=BoModel().InsertFbCommitmentData_v1(conf_id)
	flash("Push Notification commitment(s) Inserted Successfully","successMsg")
	return redirect(url_for('backoffice.bo_dashboard',conf_id=conf_id,conf_key=conf_key))
	
@app.route('/get_categories/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def GetCategories(conf_id,conf_key):
	category_id = request.values.get('category_id')
	categories = BoModel().get_category_with_category_id(category_id)
	return jsonify(categories)

@app.route('/update_color_code/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def UpdateColorCode(conf_id,conf_key):
	category_id = request.values.get('category_id')
	color_code  = request.values.get('color_code')
	data = {'color_code':color_code}
	BoModel().update_cat_color_code(category_id,data)
	return jsonify()

@app.route('/update_withdraw_abs/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def UpdateWithdrawAbs(conf_id,conf_key):
	confData  = Auth.get_conference(conf_id)
	abs_id           = request.values.get('abs_id')
	if abs_id:
		result = BoModel().update_withdraw_abs(abs_id,datetime.now(),confData.get('conf_schema'))
	if abs_id and result == 'success':
		data = {'status' : 1 }
	else:
		data = {'status' : 2 }
	return jsonify(data)

@app.route('/view_all_sessions/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def ViewAllSessions(conf_id,conf_key):
	sessionData = BoModel().get_all_sessions(conf_id)
	absHalls    = BoModel().get_halls(conf_id)
	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.strftime("%d-%m-%Y"))
	return render_template('backoffice/view_all_session.html',sessionData=sessionData,absHalls=absHalls,conf_id=conf_id,conf_key=conf_key,confe_date=confe_date)


@app.route('/programsheet_edit/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Programsheet_edit(conf_id,conf_key):
	conf_data  = Auth.get_conference(conf_id)
	user_id  = request.values.get('user_id') or None
	start_date = datetime.strptime(conf_data['conf_start_dt'], '%Y-%m-%d')
	end_date   = datetime.strptime(conf_data['conf_end_dt'], '%Y-%m-%d')
	halls      = BoModel().get_halls(conf_id)
	confe_date = []
	if start_date and end_date:
		for dt in rrule(DAILY, dtstart=start_date, until=end_date):
			confe_date.append(dt)
	return render_template('backoffice/program_sheet/programsheet_edit.html',confe_date=confe_date,conf_id=conf_id,conf_key=conf_key,user_id=user_id,halls=halls)

@app.route('/get_programsheet_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_programsheet_data(conf_id,conf_key):
	conf_date = request.values.get('conf_date')
	user_id  = request.values.get('user_id') or None
	data = UserModel().get_programsheet_data_v1(conf_date,conf_id,user_id)
	final_data = {}
	if data[0]:
		program_data = data[0]
		final_data["program_data"] = program_data
	if data[1]:
		hall_data = data[1]
		final_data["hall_data"] = hall_data
	return jsonify(final_data)

@app.route('/get_programsheet_abstract_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_programsheet_abstract_data(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data = BoModel().get_session_data_programsheet(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/program_sheet/abstract_session_table.html',data=data,conf_id=conf_id,conf_key=conf_key)

@app.route('/save_programsheet_abs_session_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def save_programsheet_abs_session_data(conf_id,conf_key):
	session_id = request.values.get('session_id')
	data = {
		'start_date' : request.values.get('session_date')+" "+request.values.get('start_time'),
		'end_date' : request.values.get('session_date')+" "+request.values.get('end_time'),
		'hall_id'  : request.values.get('hall_id')
	}
	BoModel().update_session(data,session_id)
	return render_template('backoffice/program_sheet/abstract_session_table.html',data=data,conf_id=conf_id,conf_key=conf_key)

@app.route('/get_change_abstract_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_change_abstract_data(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	session_id = request.values.get("session_id")
	session_data = BoModel().get_session_data(session_id,confData.get('conf_schema'))
	data = BoModel().get_session_data_programsheet(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/program_sheet/abstract_change_session_table.html',data=data,conf_id=conf_id,conf_key=conf_key,session_data=session_data,session_id=session_id)

@app.route('/change_abstract_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def change_abstract_session(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	old_session_id = request.values.get("old_session_id")
	new_session_id = request.values.get("new_session_id")
	data = BoModel().save_change_session(old_session_id,new_session_id,confData.get('conf_schema'))
	return jsonify()

@app.route('/get_swap_session/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_swap_session(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data = BoModel().get_session_data_swapping(conf_id,confData.get('conf_schema'))
	return jsonify(data)

@app.route('/save_swap_sessions/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def save_swap_session(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	right_session_id = request.values.get('right_session')
	left_session_id = request.values.get('left_session')
	data = BoModel().save_swapping_session_data(right_session_id,left_session_id,confData.get('conf_schema'))
	return jsonify(data)

@app.route('/get_duplicate_session_clash_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_duplicate_session_clash_data(conf_id,conf_key):
	session_id = request.values.get('session_id')
	data = BoModel().get_duplicate_session_clash_data(session_id,conf_id)
	return render_template('backoffice/program_sheet/abstract_duplicate_session_clash_table.html',data=data,conf_id=conf_id,conf_key=conf_key,session_id=session_id)

@app.route('/get_session_clash_speaker_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def get_session_clash_speaker_data(conf_id,conf_key):
	session_id = request.values.get('session_id')
	data = BoModel().get_session_clash_speaker_data(session_id,conf_id)
	clash_data    =   defaultdict(list) # sub list with key 
	speaker_data = []
	if data:
		user_ids = []
		for r in data:
			clash_data[r["user_id"]].append(r)
			if r["user_id"] not in user_ids: 
				user_ids.append(r["user_id"])
				data = {
					'user_id' : r["user_id"],
					'speaker_name': r["full_name"]
				}
				speaker_data.append(data)
	return render_template('backoffice/program_sheet/abstract_session_clash_speaker_table.html',speaker_data=speaker_data,clash_data=clash_data,conf_id=conf_id,conf_key=conf_key,session_id=session_id)

@app.route('/print_panel/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def Print_Panel(conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	template_data = BoModel().get_print_template_data()
	get_abstrcts  = BoModel().get_abstract(conf_id)
	selection  = BoModel().get_session_selection_types(conf_id,confData.get('conf_schema'))
	return render_template('backoffice/abstract/print_abstracts/print_panel.html',conf_id=conf_id,conf_key=conf_key,template_data=template_data,get_abstrcts=get_abstrcts,selection=selection)
	

@app.route('/add_new_print_template/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def add_new_print_template(conf_id,conf_key):
	abstract_types  = request.values.getlist('ddl_abs_type')
	selection_types = request.values.getlist('ddl_abs_selection')
	abs_status      = request.values.get('ddl_abs_status') or None
	order_by        = request.values.getlist('order_by')
	cus_query       = request.values.get('cut_query_sttmt') or None
	template_content= request.values.get('template_content') or None
	temp_name       = request.values.get('temp_name') or None
	template_id     = request.values.get('template_id') or None
	where_con = {
		'abs_status': abs_status,
		'abs_type'  : abstract_types,
		'selection' : selection_types,
	}
	data = {
		'query_statement': cus_query,
		'order_by'       : str(order_by),
		'print_content'  : template_content,
		'template_name'  : temp_name,
		'where_con'      : str(where_con),
	}
	if template_id:
		BoModel().update_print_template(data,template_id)
	else:
		BoModel().insert_print_template(data)
	return redirect(url_for('backoffice.Print_Panel',conf_id=conf_id,conf_key=conf_key))

@app.route('/get_print_template_data/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def get_print_template_data(conf_id,conf_key):
	template__id = request.values.get("template_id")
	data = BoModel().get_print_template(template__id)
	if data:
		data['order_by'] = ast.literal_eval(data['order_by']) if data['order_by'] else None
		data['where_con'] = ast.literal_eval(data['where_con']) if data['where_con'] else []
	return jsonify(data)

@app.route('/template_print/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def template_print(conf_id,conf_key):
	template__id = request.values.get("template_id")
	data = BoModel().get_print_template(template__id)
	order_by = []
	where_con = {}
	if data:
		order_by = ast.literal_eval(data['order_by']) if data['order_by'] else None
		where_con = ast.literal_eval(data['where_con']) if data['where_con'] else None
	if order_by :
		order_by = ','.join(order_by)
	abs_status = abs_types = selection = None
	if  where_con :
		abs_status = where_con["abs_status"]
		abs_types  = '","'.join(where_con["abs_type"]) if where_con["abs_type"] else None
		selection  = ','.join(where_con["selection"]) if where_con["selection"] else None
	print_data       = BoModel().get_abstracts_print_data(conf_id,abs_status,abs_types,selection,order_by)
	session_data = []
	abstract_data = []
	co_author    = []
	judge_data    = []
	if print_data[0]:
		session_data = print_data[0]
	if print_data[1]:
		abstract_data= print_data[1]
	if print_data[2]:
		co_author   = print_data[2]
	if print_data[3]:
		judge_data   = print_data[3]
	abs_data = defaultdict(list)
	abs_co_data = defaultdict(list)
	abs_judge_data = defaultdict(list)
	cat_list = []
	cat_list_data = []
	cat_abs  = defaultdict(list)
	
	
	absdata_abstype = defaultdict(list)
	abs_type_list = []

	for abd in abstract_data:
		absdata_abstype[abd['abs_title']].append(abd)
		if abd["abs_title"] not in abs_type_list:
			abs_type_list.append(abd["abs_title"])
			
			
	for d in abstract_data:
		cat_abs[d['category_id']].append(d)
		if d["category_id"] not in cat_list:
			cat_list.append(d["category_id"])
			cat_list_data.append({'category_id' : d["category_id"],'display_name' : d["display_name"]})
	if session_data:
		for ab in abstract_data:
			abs_data[ab['abs_session_id']].append(ab)
	if judge_data:
		for co in judge_data:
			abs_judge_data[co['abs_session_id']].append(co)
	if co_author:
		for co in co_author:
			abs_co_data[co['abs_id']].append(co)
	mail_data     = {
		'mail_content': data["print_content"],
		'session_data': session_data,
		'abstract_data':abs_data,
		'judge_data' : abs_judge_data,
		'cat_list':cat_list_data,
		'cat_list_data':cat_list_data,
		'cat_abs':cat_abs,
		'co_author':abs_co_data,
		'chk_break':1,
		'conf_id':conf_id,
		'conf_key':conf_key,
		'abs_type_list':abs_type_list,
		'absdata_abstype':absdata_abstype,
		'data_ic':abstract_data
		
		}
	return Helper.convert_html_for_mail_screen(mail_data)
	return jsonify(data)

@app.route('/template_print_preview/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def template_print_preview(conf_id,conf_key):
	template__id = request.values.get("template_id")
	template_content = request.values.get("template_content")
	try:
		data = BoModel().get_print_template(template__id)
		order_by = []
		where_con = {}
		if data:
			order_by = ast.literal_eval(data['order_by']) if data['order_by'] else None
			where_con = ast.literal_eval(data['where_con']) if data['where_con'] else None
		if order_by :
			order_by = ','.join(order_by)
		abs_status = abs_types = selection = None
		if  where_con :
			abs_status = where_con["abs_status"]
			abs_types  = '","'.join(where_con["abs_type"]) if where_con["abs_type"] else None
			selection  = ','.join(where_con["selection"]) if where_con["selection"] else None
		print_data       = BoModel().get_abstracts_print_data(conf_id,abs_status,abs_types,selection,order_by)
		session_data = []
		abstract_data = []
		co_author    = []
		judge_data = []
		if print_data[0]:
			session_data = print_data[0]
		if print_data[1]:
			abstract_data= print_data[1]
		if print_data[2]:
			co_author   = print_data[2]
		if print_data[3]:
			judge_data   = print_data[3]
		abs_data = defaultdict(list)
		abs_co_data = defaultdict(list)
		abs_judge_data = defaultdict(list)
		cat_list = []
		cat_list_data = []
		cat_abs  = defaultdict(list)
		
		absdata_abstype = defaultdict(list)
		abs_type_list = []
	
		for abd in abstract_data:
			absdata_abstype[abd['abs_title']].append(abd)
			if abd["abs_title"] not in abs_type_list:
				abs_type_list.append(abd["abs_title"])
			
		for d in abstract_data:
			cat_abs[d['category_id']].append(d)
			if d["category_id"] not in cat_list:
				cat_list.append(d["category_id"])
				cat_list_data.append({'category_id' : d["category_id"],'display_name' : d["display_name"]})
		if session_data:
			for ab in abstract_data:
				abs_data[ab['abs_session_id']].append(ab)
		if judge_data:
			for co in judge_data:
				abs_judge_data[co['abs_session_id']].append(co)
		if co_author:
			for co in co_author:
				abs_co_data[co['abs_id']].append(co)
		mail_data     = {
			'mail_content': template_content,
			'session_data': session_data,
			'abstract_data':abs_data,
			'judge_data' : abs_judge_data,
			'cat_list':cat_list_data,
			'cat_list_data':cat_list_data,
			'cat_abs':cat_abs,
			'co_author':abs_co_data,
			'chk_break':1,
			'conf_id':conf_id,
			'conf_key':conf_key,
			'absdata_abstype':absdata_abstype,
			'abs_type_list':abs_type_list,
			'data_ic':abstract_data
			}
		html = Helper.convert_html_for_mail_screen(mail_data)
		return jsonify(html)
	except Exception as e:
		print(e)
		return jsonify(str(e))

@app.route('/cme_point_report/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def cme_point_report(conf_id,conf_key):
	report_sheets = request.values.getlist("report_sheets") or None
	if report_sheets:
		get_report = BoModel().get_cme_point_data(conf_id)
		f_report = {
			'Sessions details':get_report[0],
			'MC speakers from native state' :get_report[1],
			'MC speakers from other state' :get_report[2],
			'MC Speakers from native state without sessions' :get_report[3],
			'MC speakers from other state without sessions':get_report[4],
			'MC delegates from native state' :get_report[5],
			'MC delegates from other states':get_report[6],
			'All Delegate list':get_report[7],
		}
		file_name = conf_key+"_cme_report"+str(datetime.now())
		return XLSEXPORT().export_multiplesheet_xls(report_sheets,f_report,file_name)
	else:
#       print(request.method)
		if request.method == "POST":
			flash(" Please select atleast one sheet you want in report to download ",'errorMsg')
	return render_template('backoffice/cme_point_report.html',conf_id=conf_id,conf_key=conf_key)

@app.route('/list_awards/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def ListAwards(conf_id,conf_key):
	datas = AbstractModel().get_abs_award(conf_id,"FP")
	return render_template('backoffice/view_all_awards.html',datas=datas,conf_id=conf_id,conf_key=conf_key) 

@app.route('/view_award_list/<award_id>/<abs_type>/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def ViewAwardList(award_id,abs_type,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	datas = BoModel().get_abstract_awards(award_id,abs_type,conf_id,confData.get('conf_schema'))
	ver_data = BoModel().get_verified_award(award_id,abs_type,conf_id,confData.get('conf_schema'))
	return render_template('backoffice/view_award_list.html',datas=datas,conf_id=conf_id,conf_key=conf_key,ver_data=ver_data)

@app.route('/bo_View_sundaram/<abs_id>/<user_id>/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def BOViewSundaram(abs_id,user_id,conf_id,conf_key):
	confData = Auth.get_conference(conf_id)
	data=AbstractModel().get_sept4_data(abs_id,confData.get('conf_schema'))
	data1=AbstractModel().get_authors(abs_id,confData.get('conf_schema'))
	data2=AbstractModel().FP_step1_get_author(abs_id,confData.get('conf_schema'))
	aadhar_img  = UserModel().get_aadhar_image(data['user_id'],12,78)
	age = ''
	if data2['dob']:
		dob = data2['dob'].strftime('%d/%m/%Y')
		day1, mon1, year1=(dob).split('/')
		current_dt = datetime.now()
		day2, mon2, year2=(current_dt.strftime('%d/%m/%Y')).split('/')

		# Converting given dates into date format
		date1 = date(int(year1), int(mon1), int(day1))
		date2 = date(int(year2), int(mon2), int(day2))
		age = Helper.calcluate_age_v1(date1,date2,year1,year2,mon1,mon2,day1,day2)
	return render_template('backoffice/bo_edit/TNASICON24/sundaram_award_verification.html',conf_id=conf_id,conf_key=conf_key,data=data,data1=data1,data2=data2,aadhar_img=aadhar_img[0],user_id=user_id,age=age)

@app.route('/postSundaramawardVerification/<abs_id>/<abs_type>/<conf_id>/<conf_key>',methods=["POST","GET"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def PostSundaramawardVerification(abs_id,abs_type,conf_id,conf_key):
	btn_value = request.values.get('submit_btn')
	award_id  = request.values.get('award_id')
	misc3 = request.values.get('misc3') or None
	if btn_value == 'Verified':
		misc2 = 'Verified'
		data = {'misc2':misc2,'misc3':misc3,'verified_at':datetime.now()}
	else:
		misc2    = 'Rejected'
		u_award_id = None
		data = {'award_id':u_award_id,'misc2':misc2,'misc3':misc3,'verified_at':datetime.now()}
	
	AbstractModel().update_panel(data,abs_id)
		
	return redirect(url_for('backoffice.ViewAwardList',award_id=award_id,abs_type=abs_type,conf_id=conf_id,conf_key=conf_key))

@app.route('/print_dig_podium/<conf_id>/<conf_key>',methods=["GET"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Print_dig_podium(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.strftime("%Y-%m-%d"))
	hall_data = BoModel().get_halls(conf_id)
	return render_template('backoffice/abstract/print_abstracts/dig_podium_print_index.html',conf_id=conf_id,conf_key=conf_key,confe_date=confe_date,hall_data=hall_data)

@app.route('/print_dig_podium/<conf_id>/<conf_key>',methods=["POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def Post_Print_dig_podium(conf_id,conf_key): 
	abs_type  = request.values.get('ddl_abstype') or None
	date_wise = request.values.get('ddl_date') or None
	hall_wise = request.values.get('ddl_hall') or None
	chk_break = request.values.get('chk_break') or 0
	print(hall_wise,date_wise,abs_type)
	data       = BoModel().get_print_dig_podium_abstracts_data(abs_type,date_wise,hall_wise,conf_id)
	session_data = []
	abstract_data = []
	if data[0]:
		session_data = data[0]
	if data[1]:
		abstract_data= data[1]
	abs_data = {}
	if session_data:
		for session in session_data:
			temp_list = []
			for ab in abstract_data:
				if session["abs_session_id"] == ab["abs_session_id"]:
					temp_list.append(ab)
			abs_data[session["abs_session_id"]] = temp_list
	return render_template('backoffice/abstract/print_abstracts/dig_podium_print.html',conf_id=conf_id,conf_key=conf_key,session_data = session_data,abstract_data=abs_data,abs_type=abs_type)
	
# ---ResultAnnouncement-------------------------------------------------------------------------------------------------------------------------


@app.route('/resultannouncement/<conf_id>/<conf_key>',methods=["GET","POST"])
# @app.route('/resultannouncement/<conf_id>/<conf_key>/<selection_type_id>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def ResultAnnouncement(conf_id,conf_key,selection_type_id=None):
	is_semi_final = None
	is_final = None
	is_winner = None
	btn_val = request.values.get('export_button') or None
	get_abs_session_id=BoModel().get_abs_session_id(is_semi_final,is_final,is_winner,conf_id)
	if selection_type_id:
		selection_type_id = selection_type_id
	else:
		selection_type_id        = request.values.get('selection_type_id') or None

	abs_session_id = request.values.get('abs_session_id') or None
	if abs_session_id:
		session_dates = BoModel().get_session_date_time(abs_session_id,conf_id)
	else:
		session_dates = None

	abs_category = None
	result_type=None
	if selection_type_id:
		get_abs_session     = BoModel().get_abs_session_name(conf_id,selection_type_id)
	else:
		get_abs_session = None
	if abs_session_id and selection_type_id:
		if btn_val=="Export":
			output = io.BytesIO()
			Workbook =xlwt.Workbook()
			session_details = 'Start Date : ' + str(session_dates[0]['start_date'].strftime('%d-%m-%Y %H:%M:%S')) + ' Hall : ' + str(session_dates[0]['name']) + ' End Date : ' + str(session_dates[0]['end_date'].strftime('%d-%m-%Y %H:%M:%S'))
			sh = Workbook.add_sheet('result_data')
			sh.write(0,0,session_dates[0]['session_name'])
			sh.write(1,0,session_details)
			sh.write(2,0,'Sno')
			sh.write(2,1,'Session name')
			sh.write(2,2,'Category')
			sh.write(2,3,'Abstract no')
			sh.write(2,4,'Title')
			sh.write(2,5,'Chief Author name')
			sh.write(2,6,'Presenting Author name')
			sh.write(2,7,'Presenting Author mobile no')
			sh.write(2,8,'Presenting Author email')
			sh.write(2,9,'Co-author')
			sh.write(2,10,'Abstracts content')
			idx=2
			sno_val = 0
			result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category,result_type)
			for data in result_data:
				abstract_data= str(data['abs_type_and_no']) +':' + str(data['title']) + " PRESENTING AUTHOR " + str(data['presenting_author'])+':' +'['+ str(data['presenting_author_membership_no']) + ']' + '(' + str(data['presenting_author_mobile']) + ')'
				sno_val = sno_val+1
				sh.write(idx+1,0,sno_val)
				sh.write(idx+1,1,data['session_name'])
				sh.write(idx+1,2,data['display_name'])
				sh.write(idx+1,3,data['abs_type_and_no'])
				sh.write(idx+1,4,data['title'])
				sh.write(idx+1,5,data['chief_author'])
				sh.write(idx+1,6,data['presenting_author'])
				sh.write(idx+1,7,data['presenting_author_mobile'])
				sh.write(idx+1,8,data['presenting_author_email'])
				sh.write(idx+1,9,data['co_author'])
				sh.write(idx+1,10,abstract_data)
				idx+=1
			Workbook.save(output)
			output.seek(0)
			now             = datetime.now()
			date            = now.strftime("%Y-%m-%d %H:%M")
			return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+session_dates[0]['session_name']+" SessionList"+"_"+str(date)+".xls"})
		result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category,result_type)
		abstract_data     = render_template('backoffice/result_announcement/abstract_result.html',result_data=result_data)   
	else:
		result_data = None
		abstract_data = None
	return render_template('backoffice/result_announcement/results.html',conf_id=conf_id,conf_key=conf_key,get_abs_session_id=get_abs_session_id,abs_session_id=abs_session_id,selection_type_id=selection_type_id,get_abs_session=get_abs_session,abstract_data=abstract_data,session_dates=session_dates,result_data=result_data)
		

	# get_abs_types=BoModel().get_abs_type_id(conf_id)
	# if abs_types:
	# 	abs_types=abs_types
	# else:
	# 	abs_types        = request.values.get('abs_types') or None
	# abs_session_id = request.values.get('abs_session_id') or None
	# abs_category = None
	# result_type=None
	# if abs_types:
	# 	get_abs_session     = BoModel().get_abs_session_name(conf_id,abs_types)
	# else:
	# 	get_abs_session = None
	# if abs_session_id and abs_types:
	# 	result_data = BoModel().usp_get_bo_result_announcement(conf_id,abs_types,abs_session_id,abs_category,result_type)
	# else:
	# 	result_data = None
	# return render_template('backoffice/result_announcement/results.html',conf_id=conf_id,conf_key=conf_key,get_abs_types=get_abs_types,abs_types=abs_types,get_abs_session=get_abs_session,abs_session_id=abs_session_id,result_data=result_data)



# @app.route('/post_resultannouncement/<conf_id>/<conf_key>',methods=["GET","POST"])
# @RouteGroup.conf_required
# @RouteGroup.login_required #check if login else automatically redirect to login page
# @RouteGroup.bo_access_required
# def PostResultAnnouncement(conf_id,conf_key):
#     if request.method == "POST":
#         selection_type_id        = request.form.get('ddl_selection_type_id') or None
#         abs_session_id = request.values.get('ddl_session_id') or None
#         selected_col   = request.values.get('select_to' ) or None
#         selected_abs_ids = request.form.getlist('selected_result_'+str(abs_session_id)) or None
#         if selected_abs_ids:
#                 selected_abs_id = ','.join(selected_abs_ids)
#         else:
#                 selected_abs_id=None
#         if selected_col:
#             update_data= BoModel().update_selected_abs_ids_v1(selected_col,abs_session_id,selected_abs_id,conf_id)
#         return redirect(url_for('backoffice.ResultAnnouncement',conf_id=conf_id,conf_key=conf_key,selection_type_id=selection_type_id,abs_session_id=abs_session_id))

@app.route('/post_session_winner/<conf_id>/<conf_key>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required 
@RouteGroup.bo_access_required
def PostSessionWinner(conf_id,conf_key):
	selection_type_id        = request.values.get('ddl_selection_type_id') or None
	abs_session_id = request.values.get('ddl_session_id') or None
	selected_col   = request.values.get('selected_col' ) or None
	selected_abs_id = request.values.get('selected_abs_id') or None
	unselected_abs_id = request.values.get('unselected_abs_id') or None
	if selected_col:
		update_data= BoModel().update_session_and_award_winner(selected_col,selected_abs_id,unselected_abs_id,conf_id)
	abs_category = None
	result_type  = None
	if abs_session_id and selection_type_id:
		result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category,result_type)
		abstract_data     = render_template('backoffice/result_announcement/abstract_result.html',result_data=result_data)
	if (update_data == "success"):
		data      = {"abstract_data":abstract_data,"msg" : "success" ,"status" : 1 }
		json_data = json.dumps(data,default = str)
		return json_data
	else:
		error_msg = "fail"
		data      = {"abstract_data":'',"msg" : error_msg ,"status" : 2 }
		json_data = json.dumps(data,default = str)
		return json_data
	

@app.route('/result_announcement_semi_final/<conf_id>/<conf_key>/<int:result_type>',methods=["GET","POST"])
@app.route('/result_announcement_semi_final/<conf_id>/<conf_key>/<int:result_type>/<selection_type_id>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
@RouteGroup.bo_access_required
def SemiFinalResultAnnouncement(conf_id,conf_key,result_type,selection_type_id=None):
	is_semi_final = 1
	is_final = None
	is_winner = None
	btn_val = request.values.get('export_button') or None
	get_abs_session_id=BoModel().get_abs_session_id(is_semi_final,is_final,is_winner,conf_id)
	if selection_type_id:
		selection_type_id=selection_type_id
	else:
		selection_type_id     = request.form.getlist('selection_type_id')or None
		# selection_type_id        = request.values.get('selection_type_id') or None
		if selection_type_id:
			selection_type_id = ",".join(selection_type_id)
		else:
			selection_type_id = None
	abs_category_id = request.values.get('abs_category_id') or None
	abs_session_id = None
	if selection_type_id and selection_type_id !="All":
		get_categories     = BoModel().get_cateories_by_abs_type(conf_id,selection_type_id,is_semi_final)
	else:
		get_categories = None
	# if abs_category_id and selection_type_id:
	if selection_type_id:
		if btn_val=="Export":
			output = io.BytesIO()
			Workbook =xlwt.Workbook()
			# session_details = 'Start Date : ' + str(session_dates[0]['start_date'].strftime('%d-%m-%Y %H:%M:%S')) + ' Hall : ' + str(session_dates[0]['name']) + ' End Date : ' + str(session_dates[0]['end_date'].strftime('%d-%m-%Y %H:%M:%S'))
			sh = Workbook.add_sheet('result_data')
			sh.write(0,0,'BEST PAPER OF THE SESSION')
			# sh.write(1,0,session_details)
			sh.write(1,0,'Sno')
			sh.write(1,1,'Session name')
			sh.write(1,2,'Category')
			sh.write(1,3,'Abstract no')
			sh.write(1,4,'Title')
			sh.write(1,5,'Chief Author name')
			sh.write(1,6,'Presenting Author name')
			sh.write(1,7,'Presenting Author mobile no')
			sh.write(1,8,'Presenting Author email')
			sh.write(1,9,'Co-author')
			sh.write(1,10,'Abstracts Content')
			idx=1
			sno_val = 0
			result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category_id,result_type)
			for data in result_data:
				abstract_data= str(data['session_name'] + '-'+ data['abs_type_and_no']) +':' + str(data['title']) + " PRESENTING AUTHOR " + str(data['presenting_author'])+':' +'['+ str(data['presenting_author_membership_no']) + ']' + '(' + str(data['presenting_author_mobile']) + ')'
				sno_val = sno_val+1
				sh.write(idx+1,0,sno_val)
				sh.write(idx+1,1,data['session_name'])
				sh.write(idx+1,2,data['display_name'])
				sh.write(idx+1,3,data['abs_type_and_no'])
				sh.write(idx+1,4,data['title'])
				sh.write(idx+1,5,data['chief_author'])
				sh.write(idx+1,6,data['presenting_author'])
				sh.write(idx+1,7,data['presenting_author_mobile'])
				sh.write(idx+1,8,data['presenting_author_email'])
				sh.write(idx+1,9,data['co_author'])
				sh.write(idx+1,10,abstract_data)
				idx+=1
			Workbook.save(output)
			output.seek(0)
			now             = datetime.now()
			date            = now.strftime("%Y-%m-%d %H:%M")
			return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename= Best paper of the session"+"_"+str(date)+".xls"})
		result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category_id,result_type)
		abstract_data     = render_template('backoffice/result_announcement/semi_final_abstract_result.html',result_data=result_data)  
	else:
		result_data = None
		abstract_data = None
	return render_template('backoffice/result_announcement/semi_final_result.html',conf_id=conf_id,conf_key=conf_key,get_abs_session_id=get_abs_session_id,get_categories=get_categories,selection_type_id=selection_type_id,abs_category_id=abs_category_id,result_type=result_type,result_data=result_data,abstract_data=abstract_data)

@app.route('/post_award_winner/<conf_id>/<conf_key>/<int:result_type>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def PostAwardWinner(conf_id,conf_key,result_type):
	selected_col   = request.values.get('selected_col' ) or None
	selected_abs_id = request.values.get('selected_abs_id') or None
	unselected_abs_id = request.values.get('unselected_abs_id') or None
	abs_category_id = request.values.get('ddl_category_id') or None
	abs_session_id = None
	selection_type_id        = request.values.get('ddl_selection_type_id') or None
	if selected_col:
		update_data= BoModel().update_session_and_award_winner(selected_col,selected_abs_id,unselected_abs_id,conf_id)
	if selection_type_id:
		result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category_id,result_type)
		abstract_data     =render_template('backoffice/result_announcement/semi_final_abstract_result.html',result_data=result_data)
	if (update_data == "success"):
		data      = {"abstract_data":abstract_data,"msg" : "success" ,"status" : 1 }
		json_data = json.dumps(data,default = str)
		return json_data
	else:
		error_msg = "fail"
		data      = {"abstract_data":'',"msg" : error_msg ,"status" : 2 }
		json_data = json.dumps(data,default = str)
		return json_data


# @app.route('/post_semi_final_resultannouncement/<conf_id>/<conf_key>/<int:result_type>',methods=["GET","POST"])
# @RouteGroup.conf_required
# @RouteGroup.login_required #check if login else automatically redirect to login page
# @RouteGroup.bo_access_required
# def PostSemiFinalResultAnnouncement(conf_id,conf_key,result_type):
#     if request.method == "POST":
#         selection_type_id        = request.form.get('ddl_selection_type_id') or None
#         abs_category_id        = request.form.get('ddl_category_id') or None
#         selected_abs_id = request.form.getlist('selected_result_'+str(abs_category_id) )or None
#         abs_session_id = None
#         if selected_abs_id:
#             selected_abs_ids = ','.join(selected_abs_id)
#         else:
#             selected_abs_ids=None
#         updated_data= BoModel().update_selected_abs_ids_by_category_id(selected_abs_ids,selection_type_id,abs_category_id,conf_id)
#         return redirect(url_for('backoffice.SemiFinalResultAnnouncement',conf_id=conf_id,conf_key=conf_key,result_type=result_type,abs_category_id=abs_category_id,selection_type_id=selection_type_id))


@app.route('/result_announcement_final/<conf_id>/<conf_key>/<int:result_type>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def FinalResultAnnouncement(conf_id,conf_key,result_type):
	is_semi_final = None
	is_final = 1
	is_winner = None
	btn_val = request.values.get('export_button') or None
	get_abs_session_id=BoModel().get_abs_session_id(is_semi_final,is_final,is_winner,conf_id)
	get_abs_awards = BoModel().get_abs_award_winner(conf_id)
	selection_type_id        = request.values.get('selection_type_id') or None
	abs_session_id = None
	abs_category_id = None
	if selection_type_id:
		if btn_val=="Export":
			output = io.BytesIO()
			Workbook =xlwt.Workbook()
			session_details = str(get_abs_session_id[0]['type'])
			# session_details = 'Start Date : ' + str(session_dates[0]['start_date'].strftime('%d-%m-%Y %H:%M:%S')) + ' Hall : ' + str(session_dates[0]['name']) + ' End Date : ' + str(session_dates[0]['end_date'].strftime('%d-%m-%Y %H:%M:%S'))
			sh = Workbook.add_sheet('result_data')
			sh.write(0,0,'BEST SUBJECT OF THE PAPER')
			sh.write(1,0,session_details)
			sh.write(2,0,'Sno')
			sh.write(2,1,'Section name')
			sh.write(2,2,'Session name')
			sh.write(2,3,'Category')
			sh.write(2,4,'Abstract no')
			sh.write(2,5,'Title')
			sh.write(2,6,'Chief Author name')
			sh.write(2,7,'Presenting Author name')
			sh.write(2,8,'Presenting Author mobile no')
			sh.write(2,9,'Presenting Author email')
			sh.write(2,10,'Co-author')
			sh.write(2,11,'Abstracts Content')
			idx = 2
			sno_val = 0
			result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category_id,result_type)
			for data in result_data:
				abstract_data= str(data['session_name'] + '- ['+ data['abs_type_and_no']) +'] :' + str(data['title']) + " PRESENTING AUTHOR " + str(data['presenting_author'])+':' +'['+ str(data['presenting_author_membership_no']) + ']' + '(' + str(data['presenting_author_mobile']) + ')'
				sno_val = sno_val+1
				section_name = str(data['type'])+' -  '+str(data['display_name'])
				sh.write(idx+1,0,sno_val)
				sh.write(idx+1,1,section_name)
				sh.write(idx+1,2,data['session_name'])
				sh.write(idx+1,3,data['display_name'])
				sh.write(idx+1,4,data['abs_type_and_no'])
				sh.write(idx+1,5,data['title'])
				sh.write(idx+1,6,data['chief_author'])
				sh.write(idx+1,7,data['presenting_author'])
				sh.write(idx+1,8,data['presenting_author_mobile'])
				sh.write(idx+1,9,data['presenting_author_email'])
				sh.write(idx+1,10,data['co_author'])
				sh.write(idx+1,11,abstract_data)
				idx+=1
			Workbook.save(output)
			output.seek(0)
			now             = datetime.now()
			date            = now.strftime("%Y-%m-%d %H:%M")
			# file_name   =   session_dates[0]['session_name']+" WinnerList"+"_"+str(date)
			return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename= Best subject of the paper"+"_"+str(date)+".xls"})
		result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category_id,result_type)
	else:
		result_data = None
	return render_template('backoffice/result_announcement/final_result.html',conf_id=conf_id,conf_key=conf_key,get_abs_session_id=get_abs_session_id,selection_type_id=selection_type_id,result_type=result_type,result_data=result_data,get_abs_awards=get_abs_awards)


@app.route('/post_final_resultannouncement/<conf_id>/<conf_key>/<int:result_type>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def PostFinalResultAnnouncement(conf_id,conf_key,result_type):
	if request.method == "POST":
		selection_type_id        = request.form.get('ddl_selection_type_id') or None
		selected_abs_id = request.form.getlist('selected_result' )or None
		# award_name      = request.values.get('award_name') or None
		abs_session_id = None
		abs_category = None         
		if selected_abs_id:
			selected_abs_ids = ','.join(selected_abs_id)
		else:
			selected_abs_ids=None
		# get_award_id = BoModel().check_awards_by_selection_type_id(selection_type_id,conf_id)
		# if get_award_id == None:
		# 	data = {
		# 		'selection_type_id':selection_type_id,
		# 		'award_name' : award_name,
		# 		'conf_id':conf_id
		# 	}
		# 	award_id = BoModel().insert_award_by_selection_type_id(data)
		# else:
		# 	award_id     = get_award_id['award_id']
		# updated_data= BoModel().update_selected_abs_ids(award_id,selected_abs_ids,selection_type_id,conf_id)
		updated_data= BoModel().update_selected_abs_ids(selected_abs_ids,selection_type_id,conf_id)
		return redirect(url_for('backoffice.FinalResultAnnouncement',conf_id=conf_id,conf_key=conf_key,selection_type_id=selection_type_id,result_type=result_type))

@app.route('/result_announcement_winner/<conf_id>/<conf_key>/<int:result_type>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def WinnerResultAnnouncement(conf_id,conf_key,result_type):
	is_semi_final= None
	is_final = None
	is_winner = 1
	get_abs_session_id=BoModel().get_abs_session_id(is_semi_final,is_final,is_winner,conf_id)
	selection_type_id        = request.values.get('selection_type_id') or None
	abs_session_id = None
	abs_category_id = None
	if selection_type_id:
		result_data = BoModel().usp_get_bo_result_announcement(conf_id,selection_type_id,abs_session_id,abs_category_id,result_type)
	else:
		result_data = None
	return render_template('backoffice/result_announcement/winner_result.html',conf_id=conf_id,conf_key=conf_key,get_abs_session_id=get_abs_session_id,selection_type_id=selection_type_id,result_type=result_type,result_data=result_data)


@app.route('/selected_final_screen/<conf_id>/<conf_key>/<col_name>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def SelectedFinalScreen(conf_id,conf_key,col_name=None):
	confe              = Auth.get_conference(conf_id)
	selection_type_id     =request.values.get('selection_type_id')
	abs_session_id     =request.values.get('abs_session_id')
	abs_category_id    =request.values.get('abs_category_id') 
	result_data = BoModel().usp_get_bo_selected_final_screen(conf_id,col_name,selection_type_id,abs_session_id,abs_category_id)
	return render_template('backoffice/result_announcement/bw_selected_final_screen.html',conf_id=conf_id,col_name=col_name,conf_key=conf_key,confe=confe,result_data=result_data,selection_type_id=selection_type_id)

@app.route('/color_selected_final_screen/<conf_id>/<conf_key>/<col_name>',methods=["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.bo_access_required
def ColorSelectedFinalScreen(conf_id,conf_key,col_name=None):
	confe              = Auth.get_conference(conf_id)
	selection_type_id     =request.values.get('selection_type_id')
	abs_session_id     =request.values.get('abs_session_id')
	abs_category_id    =request.values.get('abs_category_id') 
	# random_list = ["winner2024_ppt_1.jpg", "winner2024_ppt_2.jpg", "winner2024_ppt_3.jpg", "winner2024_ppt_4.jpg", "winner2024_ppt_5.jpg","winner2024_ppt_6.jpg"]
	# random_num = str(random.choice(random_list))
	random_num = None
	result_data = BoModel().usp_get_bo_selected_final_screen(conf_id,col_name,selection_type_id,abs_session_id,abs_category_id)
	return render_template('backoffice/result_announcement/color_selected_winner_screen.html',conf_id=conf_id,conf_key=conf_key,col_name=col_name,confe=confe,result_data=result_data,random_num=random_num,selection_type_id=selection_type_id)

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