Skip to content
Permalink
master
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
#coding:utf-8
import os
from datetime import date
from flask import Flask,request, session, redirect, render_template,send_from_directory
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = "ruz@2021"
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, unique=True, primary_key=True)
username=db.Column(db.String(255))
password= db.Column(db.String(255))
def __init__(self,username,password):
self.username=username
self.password=password
def __repr__(self):
return '<User %r>' % self.id
class Book(db.Model):
isbn = db.Column(db.Integer, unique=True, primary_key=True,autoincrement=False)
name=db.Column(db.String(255))
author= db.Column(db.Text)
pub_date= db.Column(db.Date)
description =db.Column(db.Text)
cover =db.Column(db.Text)
trade_price =db.Column(db.Integer)
retail_price =db.Column(db.Integer)
stock = db.Column(db.Integer)
def __init__(self,isbn,name,author,pub_date,description,cover,trade_price,retail_price,stock ):
self.isbn = isbn
self.name = name
self.author = author
self.pub_date = pub_date
self.description = description
self.cover = cover
self.trade_price = trade_price
self.retail_price = retail_price
self.stock = stock
def __repr__(self):
return '<Book %r>' % self.isbn
class Order(db.Model):
id = db.Column(db.Integer, unique=True, primary_key=True,autoincrement=True)
uid= db.Column(db.Integer,db.ForeignKey('user.id'))
total = db.Column(db.Integer)
postage = db.Column(db.Integer)
def __init__(self,uid,total,postage):
self.uid=uid
self.total=total
self.postage = postage
def __repr__(self):
return '<Order %r>' % self.id
class Cart(db.Model):
id = db.Column(db.Integer, unique=True, primary_key=True,autoincrement=True)
uid= db.Column(db.Integer,db.ForeignKey('user.id'))
bid= db.Column(db.Integer,db.ForeignKey('book.isbn'))
num = db.Column(db.Integer)
book = db.relationship('Book')
def __init__(self,uid,bid,num):
self.uid = uid
self.bid = bid
self.num = num
def __repr__(self):
return '<Cart %r>' % self.id
DIRECTORY_PATH = 'media/'
#Home Page
@app.route('/')
@app.route('/index', methods = ['GET'])
def index():
if session.get('admin'):
return render_template('home.html')
else:
res=Book.query.filter( Book.stock > 0 ).all()
return render_template('index.html',res=res)
@app.route('/mycart')
def mycart():
res = Cart.query.filter_by(uid = session.get('uid'))
total = sum([ i.book.retail_price*i.num for i in res ]) if res else 0
return render_template('cart.html', res=res,total = total )
@app.route('/add', methods = ['GET','POST'])
def addstock():
if request.method == "POST":
isbn = request.form['isbn']
name = request.form['name']
author = request.form['author']
pub_date = request.form['pub_date']
pub_date = date( int(pub_date.split('-')[0]),int(pub_date.split('-')[1]),int(pub_date.split('-')[2]) )
retail_price = request.form['retail_price']
trade_price = request.form['trade_price']
description = request.form['description']
quantity = request.form['quantity']
f = request.files['cover']
book = Book.query.filter_by(isbn = int(isbn)).first()
if book:
book.name = name
book.author = author
book.pub_date = pub_date
book.retail_price = int(retail_price)
book.trade_price = int(trade_price)
book.description = description
book.quantity = int(quantity)
book.cover = '/static/img/'+f.filename
upload_path = os.path.join(basedir,'/static/img/',f.filename)
f.save(upload_path)
else:
cover = '/static/img/'+f.filename
upload_path = basedir + cover
f.save(upload_path)
b = Book(isbn=int(isbn), name=name, author=author, pub_date=pub_date, description=description, cover=cover, trade_price=int(trade_price), retail_price=int(retail_price), stock = int(quantity) )
db.session.add(b)
db.session.commit()
return redirect('/stock')
else:
return render_template('add.html')
@app.route('/stock')
def stock():
books=Book.query.all()
return render_template('stock.html',books=books)
@app.route('/clearall')
def doclear():
uid = session.get('uid')
Cart.query.filter_by(uid=uid).delete()
db.session.commit()
return redirect('/index')
@app.route('/gocheck')
def docheck():
res = []
total_price = 0
postage = 0
shortage = []
items = Cart.query.filter_by(uid = session.get('uid'))
for item in items:
if item.num <= item.book.stock:
res.append(item)
postage += item.num
total_price += item.num * item.book.retail_price
else:
shortage.append(item)
postage = 3 if postage == 1 else postage+2
return render_template('check.html',res=res,total_price=total_price,postage=postage)
@app.route('/pay')
def dopay():
total_price = 0
postage = 0
items = Cart.query.filter_by(uid = session.get('uid'))
for item in items:
if item.num <= item.book.stock:
book = Book.query.get(item.book.isbn)
book.stock -= item.num
db.session.delete(item)
postage += item.num
total_price += item.num * item.book.retail_price
total = total_price+3 if postage == 1 else total_price + postage + 2
db.session.commit()
return render_template('pay.html',total=total)
@app.route('/delete', methods = ['GET'])
def dodelete():
c = Cart.query.filter_by( id = int(request.args.get('cid')) ).first()
db.session.delete(c)
db.session.commit()
return redirect('/mycart')
@app.route('/addtocart',methods = ['GET'])
def add():
isbn = int(request.args.get('isbn'))
s = Cart.query.filter_by(uid=session.get('uid'), bid = isbn).first()
if s:
s.num += 1
db.session.commit()
else:
c = Cart(uid=session.get('uid'), bid = isbn, num = 1)
db.session.add(c)
db.session.commit()
return redirect('/mycart')
@app.route('/login',methods = ['GET', 'POST'])
def login():
if request.method == 'POST':
uname=request.form['username']
pwd=request.form['password']
user = User.query.filter_by(username=uname,password=pwd).first()
if user:
session['logged_in'] = True
session['admin'] = True if uname == 'admin' else False
session['username'] = uname
session['uid'] = user.id
return redirect('/index')
else:
return render_template('login.html',info="Incorrect username or password !")
else:
return render_template('login.html')
#Sign out of session
@app.route('/signout')
def signout():
session.pop('username', None)
session.pop('admin', None)
session.pop('logged_in', None)
return redirect('/login')
@app.before_request
def before_request():
if request.path in ['/login','/signout','/reg']:
return None
if session.get('logged_in'):
return None
return redirect('/login')
@app.teardown_request
def teardown_request(exception):
pass
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000,debug=False )