Sindbad~EG File Manager

Current Path : /home/numerotech/sa.aios-scientificcommittee.org/aios_sa_app/core/controller/
Upload File :
Current File : //home/numerotech/sa.aios-scientificcommittee.org/aios_sa_app/core/controller/UserController.py

from flask import Flask, request, Blueprint, jsonify, redirect, url_for,flash, render_template,session, app,json
from .. import Cryptography,Auth,RouteGroup
from random import randint
from collections import defaultdict
import math, random
import time
from urllib.parse import unquote
import datetime
from core.library.helper import Helper
from datetime import timedelta,date,datetime
from dateutil.rrule import rrule, DAILY
from functools import reduce

import ast

""" Library """
from core.library.email import EMAIL
""" Models """
from core.model.UserModel import UserModel
from core.model.AbstractModel import AbstractModel
from core.model.BoModel import BoModel

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

app = Blueprint('user', __name__)

""" Strating page """ 
@app.route('/', methods = ["GET", "POST"])
def Home_index():
    host = request.host
    host_data = UserModel().get_conference_by_host(host)
    if host_data:
        return redirect(url_for("user.Home",society_id=host_data['society_id']))
    else:
        return "Application not found"


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


@app.route('<society_id>/at/<uuid>/<timestamp>', methods = ["GET", "POST"])
def autoLoginFromDashboard(society_id,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 = UserModel().get_society(society_id)
            Auth.login(user_data,society_id)
            Auth.society(society)
            return redirect(url_for("DB.Dashboard",society_id=society_id))
        else:
            return redirect(url_for('user.Login',society_id=society_id))
    else:
        return redirect(url_for('user.Login',society_id=society_id))

   
""" Login and logout functions """
@app.route('/login/<society_id>')
def Login(society_id):
    return redirect(Helper.live_domain)
    # if Auth.check(society_id):
    #     return redirect(url_for('DB.Dashboard',society_id=society_id))
    # else:
    #     society = UserModel().get_society(society_id)
    #     Auth.society(society)
    #     return render_template('users/login_screen.html',society_id=society_id)
        

@app.route('/logout/<society_id>', methods = ["GET", "POST"])

@RouteGroup.login_required #check if login else automatically redirect to login page
def Logout(society_id):
    user_society = Auth.get_user(society_id).get('user_society')
    Auth.logout(society_id)
    if user_society == 'AIOS':
        return redirect(Helper.live_domain+"/logout")
    return redirect (url_for('user.Login',society_id=society_id))


""" END Login and Logout functions """

@app.route('/<society_id>/autologin/<uuid>', methods = ["GET", "POST"])

def Auto_Login(society_id,uuid):
    # conference_detail = UserModel().get_confe(conf_id,conf_key)
    # if conference_detail and conference_detail["conf_key"] == conf_key:
    user_data = UserModel().get_user_data_by_uuid(uuid)
    if user_data:
        society = UserModel().get_society(society_id)
        Auth.login(user_data,society_id)
        # Auth.conference(conference_detail,conf_id)
        Auth.society(society)
        return redirect(url_for("DB.Dashboard",society_id=society_id))
    return("User not found")
    # return("Page Not Found")


#ToDo: Following dashboard function move to dashboard controller 

@app.route('/pos_login/<society_id>',methods = ["POST"])

def Post_login(society_id):
    if request.method == "POST":
        email     = request.form['email']
        society_name  = request.form['society']
        if  not email :
            flash('Please enter your registered email ')
            return redirect (url_for('user.Login',society_id=society_id))
        else :
            
            user_output = UserModel().get_users_email_data(email,society_id,society_name)
           

            if user_output : 
                Auth.login(user_output,society_id)
                user_id     = user_output["user_id"]                
                encrypt_user_id  = Cryptography.encrypt(int(user_output["user_id"]))
            else:
                
                insert  = UserModel().insert_new_user(email,society_id,society_name)
                user_id = insert[0]["user_id"] 
                encrypt_user_id  = Cryptography.encrypt(int(insert[0]["user_id"]))
              
                # flash("Sorry. We cannot find a membership record matching the given email id.  For assistance,  please write to "+confData['e_support_email'] )
                # # return redirect (url_for('user.Login',conf_id=Auth.get_conference(conf_id).get('conf_id'),conf_key=Auth.get_conference(conf_id).get('conf_key'))) 
                # return redirect (url_for('user.Login',conf_id=conf_id,conf_key=conf_key)) 

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

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

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

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

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

    if user :
        # otp_expire_on=  datetime.strptime(str(otp_expire_on), "%Y-%m-%d %H:%M:%S.%f").strftime('%d-%m-%Y  %H:%M:%S.%f')
        # period = otp_expire_at.strftime('%p')
        # hour = otp_expire_at.strftime('%I')
        # date = datetime.strptime(str(otp_expire_on), "%d-%m-%Y  %H:%M:%S.%f")
        # if len(str(date.minute)) == 1:
        #   minute = "0"+str(date.minute)
        # else:
        #   minute = date.minute
        # month_num = date.month
        # datetime_object = datetime.strptime(str(month_num), "%m")
        # full_month_name = datetime_object.strftime("%B")
        date            = otp_expire_on.strftime("%d %B %Y %I:%M %p")
        # template_name = 'abs_otp_mail'
        # mailData = UserModel().get_mail_templates(template_name)
        # sub_data = {
        #     'otp_random' : str(otp_random),
        #     'date'       : date
        # }
        # # subject = str(otp_random)+"- OTP for "+ conf_name +" Abstract submission , valid upto "+str(date)
        # subject = Helper.merge_tags(mailData.subject,sub_data)
        # data_1    = {'otp' : str(otp_random),'otp_expire_at':otp_expire_at}
        # mail_data = {
        #     'mail_content':mailData.mail_content,
        #     'data' : user,
        #     'data_1':data_1,

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

    else : 
        return "fail"



@app.route('/otp/<user_id>/<society_id>', methods = ["GET","POST"])

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



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