Skip to content
Permalink
main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
import os
from flask import Flask,request, session, redirect, render_template ,flash
from flask_login import UserMixin,LoginManager,login_required, login_user, current_user, logout_user
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import date
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'db.sqlite3')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = "asdf"
login_manager = LoginManager(app)
login_manager.login_view = 'login'
db = SQLAlchemy(app)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
is_admin = db.Column(db.Boolean, nullable=False )
@property
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
class Book(db.Model):
isbn_num = db.Column(db.String(13), unique=True, primary_key = True )
book_name=db.Column(db.String(128), nullable=False)
author= db.Column(db.Text, nullable=False)
desc =db.Column(db.Text, nullable=False)
book_cover =db.Column(db.Text, nullable=False)
quantity = db.Column(db.Integer, nullable=False)
trade_price =db.Column(db.Integer, nullable=False)
retail_price =db.Column(db.Integer, nullable=False)
publication_date= db.Column(db.Date, nullable=False)
class Cart(db.Model):
id = db.Column(db.Integer, unique=True, primary_key=True )
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
book_id = db.Column(db.String(13), db.ForeignKey('book.isbn_num') )
num = db.Column(db.Integer, nullable=False )
book = db.relationship('Book', backref='cart')
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/', methods = ['GET'])
@login_required
def index():
total_price = 0
books=Book.query.filter( Book.quantity > 0 ).all()
num = Cart.query.filter_by( user_id = current_user.id ).count()
if num > 0:
for item in Cart.query.filter_by( user_id = current_user.id ).all():
total_price += item.book.retail_price*item.num
return render_template('index.html',books=books,num=num,total_price=total_price)
@app.route('/admin', methods = ['GET'])
@login_required
def admin():
books=Book.query.all()
return render_template('admin.html',books=books)
@app.route('/cart')
@login_required
def cart():
res = Cart.query.filter_by( user_id = current_user.id ).all()
total_price = 0
if res is not None:
for item in res:
total_price += item.book.retail_price*item.num
return render_template('cart.html', res=res, total_price = total_price )
@app.route('/check')
@login_required
def do_checkout():
items = []
total_price = 0
postage = 0
in_shortage = []
books = Cart.query.filter_by(user_id = current_user.id)
if books is None:
flash("No books !")
return redirect('/')
for item in books:
if item.num <= item.book.quantity:
items.append(item)
postage = postage + item.num
total_price = total_price + (item.num * item.book.retail_price)
else:
in_shortage.append(item)
if postage == 1:
postage = 3
else:
postage = postage - 2
return render_template('check.html',items=items,total_price=total_price,postage=postage)
@app.route('/clearall')
@login_required
def clear_all():
Cart.query.filter_by(user_id = current_user.id).delete()
db.session.commit()
return redirect('/')
@app.route('/gotopay')
@login_required
def do_pay():
items = Cart.query.filter_by(user_id = current_user.id)
for item in items:
if item.num <= item.book.quantity:
book = Book.query.get(item.book.isbn_num)
book.quantity -= item.num
db.session.delete(item)
db.session.commit()
return render_template('fakepay.html')
@app.route('/remove', methods = ['GET'])
@login_required
def remove_from_cart():
item= Cart.query.filter_by(id=int(request.args.get('id'))).first()
db.session.delete(item)
db.session.commit()
return redirect('/cart')
@app.route('/addtocart',methods = ['GET'])
@login_required
def add_to_cart():
isbn = int(request.args.get('isbn'))
item = Cart.query.filter_by(user_id=current_user.id , book_id = isbn).first()
if item is not None:
item.num += 1
else:
c = Cart(user_id=current_user.id , book_id = isbn, num = 1)
db.session.add(c)
db.session.commit()
return redirect('/cart')
@app.route('/add',methods = ['GET','POST'])
@login_required
def addbook():
if request.method == "POST":
isbnnum = request.form.get('isbnnum')
name = request.form.get('title')
author = request.form.get('author')
desc = request.form.get('description')
quantity = request.form.get('quantity')
cover = request.files.get('cover')
publication_date = request.form.get('publication_date')
publication_date = date( int(publication_date.split('-')[0]),\
int(publication_date.split('-')[1]),\
int(publication_date.split('-')[2]) )
retail_price = request.form.get('retail_price')
trade_price = request.form.get('trade_price')
book = Book.query.filter_by(isbn_num = isbnnum ).first()
if book:
book.book_name = name
book.author = author
book.desc = desc
book.quantity = int(quantity)
book.publication_date = publication_date
book.retail_price = int(retail_price)
book.trade_price = int(trade_price)
if cover is not None:
book.book_cover = '/static/cover/'+cover.filename
cover.save(basedir+'/static/cover/'+cover.filename)
else:
cover.save(basedir+'/static/cover/'+cover.filename)
b = Book(isbn_num = isbnnum, book_name=name, author=author,\
publication_date=publication_date, desc = desc,\
book_cover='/static/cover/'+cover.filename, trade_price=int(trade_price), \
retail_price=int(retail_price), quantity = int(quantity) )
db.session.add(b)
db.session.commit()
return redirect('/admin')
else:
return render_template('addbook.html')
@app.route('/login',methods = ['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter_by(username=username).first()
if user is not None and user.verify_password(password):
login_user(user)
if user.is_admin:
return redirect('/admin')
else:
return redirect('/')
else:
flash("Incorrect username or password !")
return render_template('login.html')
else:
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect('/login')
if __name__ == "__main__":
app.run( host='0.0.0.0', port=5000, debug = True )