Sindbad~EG File Manager

Current Path : /home/numerotech/mobileapp.aios-scientificcommittee.org/aiosapp/core/controller/
Upload File :
Current File : //home/numerotech/mobileapp.aios-scientificcommittee.org/aiosapp/core/controller/APIController.py

from flask import Flask, request, Blueprint, jsonify, redirect, url_for,flash, render_template,session
from core.model.APIModel import APIModel
from random import randint
import datetime
from datetime import timedelta,date,datetime
import  json
from flask import session, app

import hashlib
from .. import config,Helper,EMAIL
from urllib.parse import unquote
import html
from html import unescape


app = Blueprint('api', __name__)


@app.route('/test', methods = ["GET", "POST"])
def test():
	dbabsids = [1,2,6]
	mobabsids = [2,4,5]
	deleteabsids      =     Helper.list_diff(dbabsids,mobabsids)
	return jsonify(deleteabsids)

@app.route('/otp', methods = ["GET", "POST"])
def OTPLogin():
	msg   = ""
	status= ""
	if  Helper.APIKey == request.values.get("APIKey"):
		email = request.values.get("email") or None
		society_id = request.values.get("society_id") or None
		conf_id = request.values.get("conf_id") or None
		user = APIModel().get_user_by_email(email,society_id)
		if user:
			SendOtpMail(user,society_id,conf_id)
			msg  ="An Email with OTP has been sent to your email id. It might take upto a minute to reach you."
			status="success"
		else:
			msg = "Email Id does not exist."
			status="error"
	else:
		msg = "Invalid API Key"
		status = "error"
	
	return jsonify({'msg':msg,'status':status})



def SendOtpMail(user,society_id,conf_id=None):
	now         = datetime.now()
	if user['otp']: 
		otp_random = user['otp']
	else : 
		otp_random  = Helper.random_otp()
	otp_sent_at     = now
	otp_expire_on   = now + timedelta(minutes=30)
	data            = {'otp_expire_on' : otp_expire_on,'otp_sent_at':otp_sent_at,'otp' : otp_random}
	user            = APIModel().update_member(user['user_id'],data) # db call 2

	if user :
		date        = otp_expire_on.strftime("%d %B %Y %H:%M")
		society_data = APIModel().getSociety(society_id)
		email_logo = society_data["email_logo"]
		app_title  = society_data["society_title"]
		e_support_mail  = society_data["e_support_mail"]
		app_name    = society_data['society_name']

		if conf_id:
			conf_data = APIModel().getConf(conf_id)
			if conf_data:
				email_logo = conf_data["mail_header_logo"]
				app_title  = conf_data["conf_name"]
				e_support_mail  = conf_data["e_support_email"]
				app_name    = conf_data['conf_name']
		
		subject = str(otp_random)+" - OTP for "+ app_name +" smartphone app, valid upto "+str(date)
		to   = user["email"]
		html    = render_template('email/otp_mail_template.html',email_logo=email_logo,data=user,otp=otp_random,otp_expire_at=otp_expire_on,app_title=app_title,e_support_mail=e_support_mail)
		# return html
		# send mail using mail gun
		EMAIL.sendMailInMailGun(subject,html,to,society_data)
		return "success"

	else : 
		return "fail"

@app.route('/otp/verify', methods = ["GET", "POST"])
def VerifyMailOTP():
	data        = {}
	msg         = ''
	status            = '' 
	now         = datetime.now()

	if  Helper.APIKey == request.values.get("APIKey"):
		email = request.values.get('email') or None
		otp    = request.values.get('otp') or None
		society_id = request.values.get("society_id") or None
		user = APIModel().get_user_by_email(email,society_id)
		
		if user:
			if user["email"] == Helper.testmail and int(otp) == 9999: #testing account 
					IsEvaluator = APIModel().checkIsEvaluator(user['user_id'])
					data['UserId']          = user['user_id']
					data['Name']            = user.get('prefix','') + user['full_name']
					data['email']           = user['email']
					data['is_beta_user']    = 0
					data['membership_no']   = user['membership_no']
					data['user_uuid']       = user['user_uuid']
					data['IsEvaluator']     = IsEvaluator['IsEvaluator'] or 0
					status="success"

			elif(int(otp) == user['otp']):
				uData    = {'otp' : None, 'otp_verified_at':now}
				APIModel().update_member(user['user_id'],uData)
				if str(now)<str(user['otp_expire_on']):
					IsEvaluator = APIModel().checkIsEvaluator(user['user_id'])
					data['UserId']          = user['user_id']
					data['Name']            = user.get('prefix','') + user['full_name']
					data['email']           = user['email']
					data['is_beta_user']    = 0
					data['membership_no']   = user['membership_no']
					data['user_uuid']       = user['user_uuid']
					data['IsEvaluator']     = IsEvaluator['IsEvaluator'] or 0
					status="success"
				else:
					msg   ="OTP has expired.Please generate a new one."
					status="error"
			else:
				msg   ="Invalid OTP"
				status="error"
		
		else:
			msg = "Email Id does not exist."
			status="error"
	
	else:
		msg = "Invalid API Key"
		status = "error"
	
	return jsonify({'data':data,'msg':msg,'status':status})
	


@app.route('abs/sync', methods = ["GET", "POST"])
def AbstractsSyncV1():
	sync_data = []
	conf_id  = request.values.get("conf_id")
	if  Helper.APIKey == request.values.get("APIKey"):
		updated_at = request.values.get("last_sync_at") or None
		if updated_at :
			updated_at =unquote(updated_at)
		sync_data = APIModel().getAbstracts(updated_at,conf_id)
	return json.dumps(sync_data,default=str)
				

@app.route('agenda/sync', methods = ["GET", "POST"])
def AgendaSyncV1():
	final_data        = []
	conf_id           = request.values.get("conf_id")
	user_id           = request.values.get("user_id",0)
	isFirstTime       = request.values.get("isFirstTime",0)
	resultlst         = []
	syncAgendaItem    = []
	dbabsids          = []
	mobabsids         = []
	
	insertAgenda    = []
	deleteabsids    = []
	agenda_ids      = []
	webagenda       = {}
	# print("json")
	# print(request.get_json(silent=True))
	if Helper.APIKey == request.values.get("APIKey"):
		content_type = request.headers.get('Content-Type')
		if (content_type == 'application/json'):
			syncAgendaItem = request.get_json(silent=True)

		if int(user_id) > 0:
			webagenda_db = APIModel().getAgendaByUserId(user_id,conf_id)
			# print(webagenda_db)
			if webagenda_db:
				for x in webagenda_db:
					dbabsids.append(x.get('abs_id'))
					webagenda[x.get('abs_id')] = x

			if syncAgendaItem:      
				for item in syncAgendaItem:
					mobabsids.append(int(item['abs_id']))

					a = {}
					a['can_delete'] = 1;
					a['abs_id'] = item['abs_id']
					a['user_id'] = user_id
					a['conf_id'] = conf_id
					a['misc1'] = ""

					existAgenda =  webagenda.get(int(item['abs_id']),None)
					if existAgenda:
						a['can_delete'] = existAgenda['can_delete'];
						agenda_ids.append(existAgenda['agenda_id'])
						# resultlst.append(a)
					else:
						insertAgenda.append(a)  
						# resultlst.append(a)
			# print("dbabsids")
			# print(dbabsids)
			# print("mobabsids")
			# print(mobabsids)                  
			deleteabsids      =     Helper.list_diff(dbabsids,mobabsids)

			if len(insertAgenda) > 0: #insert new data            
					APIModel().insertAgendas(insertAgenda)
			if len(deleteabsids) > 0 and int(isFirstTime) == 0: # delete old removed data
					APIModel().deleteAgendasByUserIdAndAbsIds(user_id,conf_id,deleteabsids)

			final_data =  APIModel().getAgendaByUserId(user_id,conf_id) 
			# print("final_data")
			# print(final_data)
		
	return jsonify(final_data)



@app.route('evaluation/sync', methods = ["GET", "POST"])
def EvaluationSyncV1():
	final_data        = []
	conf_id           = request.values.get("conf_id")
	user_id           = request.values.get("user_id",0)
	device_type       = request.values.get("device_type",0)
	last_sync_at    = request.values.get("last_sync_at",None)
	
	print("user_id - ",user_id)
	
	if last_sync_at:
	    last_sync_at = unquote(last_sync_at)
	
	
	syncMarkitems     = []
	update_list     = []
	mark_list       = []
	if Helper.APIKey == request.values.get("APIKey"):
		content_type = request.headers.get('Content-Type')
		if (content_type == 'application/json'):
			syncMarkitems = request.get_json(silent=True)
		print("syncMarkitems - ",syncMarkitems)
	    
		if int(user_id) > 0:
			mark_list  = APIModel().getUserEvaluations(user_id,conf_id,None)
			mark_counts = {}
			
			print("mark_list - ",mark_list)
			if mark_list:
				for mark in mark_list:
					mark_counts[mark["mark_id"]] = mark["mark_update_count"] 
			
			if syncMarkitems: 
				for item in syncMarkitems:
					if int(item.get('mark_update_count',0)) == 0 or int(mark_counts.get(int(item.get('mark_id',0)),0)) < int(item.get('mark_update_count',0)):
						m1 = None if item.get('m1',None) == "NULL" else item.get('m1',None)
						m2 = None if item.get('m2',None) == "NULL" else item.get('m2',None)
						m3 = None if item.get('m3',None) == "NULL" else item.get('m3',None)
						m4 = None if item.get('m4',None) == "NULL" else item.get('m4',None)
						m5 = None if item.get('m5',None) == "NULL" else item.get('m5',None)
						
						data = {
							"mark_id":item.get('mark_id',0),
							"m1" : m1,
							"m2" : m2,
							"m3" : m3,
							"m4" : m4,
							"m5" : m5,
							"sys_m1" : m1,
							"sys_m2" : m2,
							"sys_m3" : m3,
							"sys_m4" : m4,
							"sys_m5" : m5,
							"comments" : item.get('comments',None),
							"marks_total"       : (int(m1 if m1 else 0) + int(m2 if m2 else 0) + int(m3 if m3 else 0)+ int(m4 if m4 else 0) + int(m5 if m5 else 0)),
							"sys_marks_total"   : (int(m1 if m1 else 0) + int(m2 if m2 else 0) + int(m3 if m3 else 0)+ int(m4 if m4 else 0) + int(m5 if m5 else 0)),
							"device_type":device_type,
							"mark_update_count": (int(item.get("mark_update_count",0))+1),
							"sync_at": datetime.now()
						}
						update_list.append(data)
				print("update_list",update_list)          
				if len(update_list)>0: 
					APIModel().update_marks(update_list)
					
			mark_list = APIModel().getUserEvaluations(user_id,conf_id,last_sync_at) 
				
	return jsonify(mark_list if mark_list else [])



@app.route('/evaluation/check', methods = ["GET", "POST"])
def checkEvaluation():
	data = []
	if  Helper.APIKey == request.values.get("APIKey"):
		society_id = request.values.get("society_id") or None
		conf_id = request.values.get("conf_id") or None
		user_id = request.values.get("user_id") or None
		current_dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
		data = APIModel().checkEvaluator(user_id,conf_id,current_dt)
	return jsonify(data if data else [])


@app.route('/evaluation/assignment', methods = ["GET", "POST"])
def getEvaluationAssignment():
	data = []
	if  Helper.APIKey == request.values.get("APIKey"):
		society_id = request.values.get("society_id") or None
		conf_id = request.values.get("conf_id") or None
		user_id = request.values.get("user_id") or None
		current_dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
		data = APIModel().getUserEvaluationAssignment(user_id,conf_id)
	return jsonify(data if data else [])
	
	

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