Permalink
Cannot retrieve contributors at this time
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?
Yiyan_Chen_bookshop/app.py
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
223 lines (192 sloc)
7.55 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ) |