Bintang Fajar Julio
update
78bf9c7
raw
history blame contribute delete
No virus
5.1 kB
import json
from datetime import datetime
from flask import Blueprint, render_template, request, flash, redirect, url_for
from requests.exceptions import HTTPError
from firebase_config import firebase_auth, firebase_db
from flask_login import logout_user, login_user
from middleware import load_user
from pytz import timezone
auth = Blueprint('auth', __name__, template_folder='templates')
tz = timezone('Asia/Jakarta')
@auth.route('/sign-up', methods=['GET', 'POST'])
def sign_up():
if request.method == 'POST':
nama = request.form['nama']
email = request.form['email']
password = request.form['password']
confirm_password = request.form['confirm_password']
if not nama or not email or not password or not confirm_password:
flash(('Pendaftaran Gagal', 'Semua isian harus diisi'), 'error')
return render_template('auth/sign_up.html')
if not email.endswith('pnj.ac.id'):
flash(('Pendaftaran Gagal', 'Harus menggunakan email Politeknik Negeri Jakarta'), 'error')
return render_template('auth/sign_up.html')
if password != confirm_password:
flash(('Pendaftaran Gagal', 'Password dan konfirmasi password tidak sama'), 'error')
return render_template('auth/sign_up.html')
try:
user = firebase_auth.create_user_with_email_and_password(email, password)
data = {
'nama': nama,
'email': email,
'role': 'pengguna',
'registered_at': datetime.now(tz),
'inactive': '0'
}
firebase_db.collection('users').document(user['localId']).set(data)
firebase_auth.send_email_verification(user['idToken'])
flash(('Pendaftaran Diproses', 'Periksa email untuk verifikasi akun'), 'success')
except HTTPError as e:
message = json.loads(e.strerror)['error']['message']
if 'WEAK_PASSWORD' in message:
message = 'Password minimal 6 karakter'
if 'EMAIL_EXISTS' in message:
message = 'Email sudah terdaftar'
flash(('Pendaftaran Gagal', message), 'error')
return render_template('auth/sign_up.html')
@auth.route('/sign-in', methods=['GET', 'POST'])
def sign_in():
if request.method == 'POST':
email = request.form['email']
password = request.form['password']
if not email or not password:
flash(('Masuk Gagal', 'Semua isian harus diisi'), 'error')
return render_template('auth/sign_in.html')
try:
user = firebase_auth.sign_in_with_email_and_password(email, password)
user_info = firebase_auth.get_account_info(user['idToken'])['users'][0]
if user_info['emailVerified'] == False:
flash(('Masuk Gagal', 'Email belum diverifikasi'), 'error')
return render_template('auth/sign_in.html')
except HTTPError as e:
message = json.loads(e.strerror)['error']['message']
if 'INVALID_LOGIN_CREDENTIALS' in message:
message = 'Email atau password salah'
flash(('Masuk Gagal', message), 'error')
return render_template('auth/sign_in.html')
except Exception as e:
flash(('Masuk Gagal', 'Server sedang bermasalah'), 'error')
return render_template('auth/sign_in.html')
user_id = user_info['localId']
user = load_user(user_id)
if user.inactive == "1":
flash(('Masuk Gagal', 'Akun anda dinonaktifkan oleh admin'), 'error')
return render_template('auth/sign_in.html')
if user:
login_user(user)
if user.role == 'admin':
return redirect(url_for('dashboard.lecturer'))
elif user.role == "pengguna":
return redirect(url_for('dashboard.classifier'))
return render_template('auth/sign_in.html')
@auth.route('/reset-password', methods=['GET', 'POST'])
def reset_password():
if request.method == 'POST':
email = request.form['email']
if not email:
flash(('Reset Password Gagal', 'Email harus diisi'), 'error')
return render_template('auth/reset_password.html')
try:
firebase_auth.send_password_reset_email(email)
flash(('Reset Password Diproses', 'Periksa email untuk reset password'), 'success')
except HTTPError as e:
message = json.loads(e.strerror)['error']['message']
if 'INVALID_EMAIL' in message:
message = 'Email tidak ditemukan'
flash(('Reset Password Gagal', message), 'error')
except Exception as e:
flash(('Reset Password Gagal', 'Server sedang bermasalah'), 'error')
return render_template('auth/reset_password.html')
@auth.route('/sign-out')
def sign_out():
logout_user()
return redirect(url_for('auth.sign_in'))