Sindbad~EG File Manager
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