svaze's picture
Upload 125 files
5026c77 verified
from flask import Blueprint, render_template, request, redirect, url_for, flash, session, jsonify
from requests import delete
from .models import User, Pincodes, Offices, EF71929279, Bookings
from . import db, oauth
from werkzeug.security import generate_password_hash, check_password_hash
# from sqlalchemy import text
import jwt # Import PyJWT
import datetime
from functools import wraps
from flask import current_app
# import sqlite3
from math import ceil
from urllib.parse import urlencode
import secrets
from flask_mail import Mail, Message
from itsdangerous import URLSafeTimedSerializer
auth = Blueprint('auth', __name__)
def calc_post(service_type, article, weight):
if service_type == 'DOMESTIC':
if article == 'Single Card':
return 0.5
elif article == 'Reply Card':
return 1
elif article == 'Meghdoot Post Card':
return 0.25
elif article == 'Printed Card':
return 6
elif article == 'Inland Letter Card':
return 2.5
elif article == 'Letters/Documents':
if weight <= 20:
return 5
else:
total = ceil(weight / 20) * 5
return total
elif article == 'Book Pattern and Sample Packets':
if weight <= 50:
return 4
else:
total = ceil((weight - 50) / 50) * 3 + 4
return total
elif article == 'Blind Literature packets ':
return 0
elif article == 'Parcels':
if weight <= 500:
return 19
else:
return ceil((weight - 500) / 500) * 16 + 19
elif article == 'Registered News Paper':
if weight <= 50:
return 0.25
elif weight <= 100:
return 0.5
else:
total = ceil((weight - 100) / 100) * 0.2 + 0.5
else:
return 10
elif service_type == 'INTERNATIONAL':
if article == 'DOCUMENT':
if weight <= 250:
return 150
else:
return ceil((weight - 250) / 250) * 15 + 150
elif article == 'MERCHANDISE':
if weight <= 250:
return 400
else:
return ceil((weight - 250) / 250) * 40 + 400
else:
return 300
# def get_db_connection():
# conn = sqlite3.connect('postoffice.db') # Replace with your database path
# conn.row_factory = sqlite3.Row # This will allow us to fetch rows as dictionaries
# print("Connection Successful")
# res = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='pincodes';")
# print(res)
# return conn
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = session.get('token') # Retrieve token from session
if not token:
# jsonify({'message': 'Token is missing!'}), 403
return redirect(url_for('auth.login'))
try:
data = jwt.decode(token, current_app.config['JWT_SECRET_KEY'], algorithms=["HS256"])
except jwt.ExpiredSignatureError:
# return jsonify({'message': 'Token has expired!'}), 403
return redirect(url_for('auth.login'))
except jwt.InvalidTokenError:
# return jsonify({'message': 'Invalid token!'}), 403
return redirect(url_for('auth.login'))
return f(*args, **kwargs)
return decorated
@auth.route('/register.html', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
userid = request.form.get('userid')
pwd = request.form.get('password')
user = User.query.filter_by(userid=userid).first()
print(user)
if not user:
session['userid'] = userid
session['pwd'] = pwd
print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
return redirect(url_for('auth.newUser'))
else:
print('Email Exists!')
return redirect(url_for('auth.login'))
return render_template("register.html")
@auth.route('/login.html', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
userid = request.form.get('userid')
pwd = request.form.get('password')
user = User.query.filter_by(userid=userid).first()
if not user:
return redirect(url_for('auth.register'))
else:
if check_password_hash(user.password, pwd):
token = jwt.encode({
'user_id': user.userid,
'exp': datetime.datetime.now(datetime.UTC) + datetime.timedelta(hours=1) # Token expires in 1 hour
}, current_app.config['JWT_SECRET_KEY'], algorithm="HS256")
session['token'] = token # Store token in session
session['name'] = f"{user.firstname} {user.lastname}"
# print(name)
return redirect(url_for('views.homepage'), 201)
else:
flash("Wrong Password Try Again!")
return redirect(url_for('auth.login'))
return render_template("login.html")
@auth.route('/google/login')
def google_login():
# Google OAuth2 endpoint
google_auth_url = "https://accounts.google.com/o/oauth2/v2/auth"
# Parameters for the request
params = {
'client_id': current_app.config['GOOGLE_CLIENT_ID'],
'redirect_uri': url_for('auth.google_callback', _external=True),
'response_type': 'code',
'scope': 'openid email profile',
'access_type': 'offline',
'include_granted_scopes': 'true',
'state': secrets.token_urlsafe(16) # Generate a random state parameter
}
# Store state in session for verification
session['oauth_state'] = params['state']
# Build the authorization URL
auth_url = f"{google_auth_url}?" + urlencode(params)
return redirect(auth_url)
@auth.route('/google/callback')
def google_callback():
try:
# Get token info directly from request
if 'error' in request.args:
raise Exception(f"OAuth error: {request.args['error']}")
if 'id_token' in request.args:
# If the ID token is in URL parameters
id_token = request.args.get('id_token')
print(id_token)
else:
# Get the authorization code
code = request.args.get('code')
print(f"Received authorization code: {code}")
user_info = {
'email': 'soorya.sivaramakrishnan22@spit.ac.in',
'given_name': 'Soorya',
'family_name': 'Siva'
}
# Check if user exists
user = User.query.filter_by(userid=user_info['email']).first()
if not user:
session['userid'] = user_info['email']
session['pwd'] = None
return redirect(url_for('auth.newUser'))
else:
# Generate JWT token
token = jwt.encode({
'user_id': user_info['email'],
'exp': datetime.datetime.now(datetime.UTC) + datetime.timedelta(hours=1)
}, current_app.config['JWT_SECRET_KEY'], algorithm="HS256")
session['token'] = token
session['name'] = f"{user.firstname} {user.lastname}"
return redirect(url_for('views.homepage'))
except Exception as e:
print(f"OAuth error: {str(e)}")
import traceback
print(f"Traceback: {traceback.format_exc()}")
print(f"Request args: {request.args}") # Print request args for debugging
flash("Authentication failed. Please try again.")
return redirect(url_for('auth.login'))
@auth.route('/newUser', methods=['GET', 'POST'])
def newUser():
userid = session.get('userid')
pwd = session.get('pwd')
if request.method == 'POST':
fname = request.form.get('firstname')
lname = request.form.get('lastname')
mobile = request.form.get('mobile')
gender = request.form.get('gender')
pincode = request.form.get('pincode')
city = request.form.get('city-district')
state = request.form.get('state')
country = request.form.get('country')
add1 = request.form.get('address1')
add2 = request.form.get('address2')
print(
f"Inputs: {userid}, {fname}, {lname}, {mobile}, {gender}, {pincode}, {city}, {state}, {country}, {add1}, {add2}")
print("AAAAAAAAAAAAAAAAAAAAAAAAA")
if pwd is None:
pwd = "abcd"
new_user = User(userid=userid, firstname=fname, lastname=lname, mobile=mobile, gender=gender, pincode=pincode,
city=city, state=state, country=country, add1=add1, add2=add2,
password=generate_password_hash(pwd, method='pbkdf2:sha256'))
print("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB")
db.session.add(new_user)
print("CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
db.session.commit()
print("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD")
token = jwt.encode({
'user_id': new_user.userid,
'exp': datetime.datetime.now(datetime.UTC) + datetime.timedelta(hours=1) # Token expires in 1 hour
}, current_app.config['JWT_SECRET_KEY'], algorithm="HS256")
session['token'] = token # Store token in session
return redirect(url_for('auth.login'), 201)
print("*******************************************")
return render_template('newUser.html')
@auth.route('logout.html')
def logout():
session.clear()
return redirect(url_for('views.homepage'))
@auth.route('/trackconsignment.html', methods=['GET', 'POST'])
@token_required
def track():
token = session.get('token') # Check if the token exists in the session
if token:
name = session.get('name')
# If token exists, render the findpincode page
if request.method == 'POST':
id_ = request.form.get('trackingid')
if id_ != 'EF71929279':
return render_template("trackconsignment.html", result=None, Name=name)
consign = EF71929279.query.all()
print(consign)
return render_template("trackconsignment.html", result=consign, Name=name)
return render_template("trackconsignment.html", result=None, Name=name)
else:
# If no token exists, redirect to the homepage
return redirect(url_for('auth.login'))
@auth.route('/calculatepostage.html', methods=['GET', 'POST'])
@token_required
def calcpost():
token = session.get('token') # Check if the token exists in the session
if token:
name = session.get('name')
# If token exists, render the findpincode page
if request.method == 'POST':
service_type = request.form.get('service-type').upper()
service = request.form.get('service')
weight = request.form.get('weight')
weight = int(weight)
print(service_type, service, weight)
value = calc_post(service_type, service, weight)
print(value)
return render_template("calculatepostage.html", Name=name, value=value)
return render_template("calculatepostage.html", Name=name, value=0)
else:
# If no token exists, redirect to the homepage
return redirect(url_for('auth.login'))
@auth.route('/findpincode.html', methods=['GET', 'POST'])
@token_required
def findpincode():
token = session.get('token') # Check if the token exists in the session
if token:
name = session.get('name')
if request.method == 'POST':
poname = request.form.get('poname').strip()
city = request.form.get('city-district').strip().upper()
state = request.form.get('state').strip().upper()
print(poname, city, state)
# conn = get_db_connection()
if poname == 'NULL':
results = Pincodes.query.filter_by(District=city, StateName=state).all()
else:
results = Pincodes.query.filter_by(OfficeName=poname).all()
# conn.close()
print(results)
# Pass the results to the template
return render_template("findpincode.html", Name=name, results=results)
# If token exists, render the findpincode page
return render_template("findpincode.html", Name=name, results=None)
else:
# If no token exists, redirect to the homepage
return redirect(url_for('auth.login'))
@auth.route('/locatepostoffice.html', methods=['GET', 'POST'])
@token_required
def locpost():
token = session.get('token') # Check if the token exists in the session
if token:
name = session.get('name')
if request.method == 'POST':
pincode = request.form.get('pincode').strip().upper()
# city = request.form.get('city-district').upper()
# state = request.form.get('state').upper()
# conn = get_db_connection()
results = Offices.query.filter_by(Pincode=pincode).all()
return render_template("locatepostoffice.html", Name=name, results=results)
return render_template("locatepostoffice.html", Name=name, results=None)
else:
# If no token exists, redirect to the homepage
return redirect(url_for('views.homepage'))
@auth.route('/buystamps.html', methods=['GET', 'POST'])
@token_required
def stamp():
token = session['token']
if token:
name = session.get('name')
return render_template('buystamps.html', Name=name)
else:
return redirect(url_for('auth.login'))
@auth.route('/tenders.html', methods=['GET', 'POST'])
@token_required
def tender():
token = session['token']
if token:
name = session.get('name')
return render_template('tenders.html', Name=name)
else:
return redirect(url_for('auth.login'))
@auth.route('/recruitment.html', methods=['GET', 'POST'])
@token_required
def recruit():
token = session['token']
if token:
name = session.get('name')
return render_template('recruitment.html', Name=name)
else:
return redirect(url_for('auth.login'))
@auth.route('/addhaarbooking.html', methods=['GET', 'POST'])
@token_required
def addhaarbooking():
token = session['token']
if token:
name = session.get('name')
if request.method == 'POST':
name = request.form.get('fullname')
mobile = request.form.get('mobile')
email = request.form.get('email')
aadhar = request.form.get('addhaar')
service = request.form.get('addhaarbookingtype')
date = request.form.get('date')
time = request.form.get('time')
print(name, mobile, email, aadhar, service, date, time)
new_book = Bookings(name=name, mobile=mobile, email=email, aadhar=aadhar, service=service,
date=date, time=time)
db.session.add(new_book)
db.session.commit()
return render_template('addhaarbooking.html', Name=name)
else:
return redirect(url_for('auth.login'))
@auth.route('/insurance.html', methods=['GET', 'POST'])
@token_required
def insurance():
token = session['token']
if token:
name = session.get('name')
return render_template('insurance.html', Name=name)
else:
return redirect(url_for('auth.login'))