stock/tetastock.py

348 lines
11 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: utf-8
import math
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
from flask_sqlalchemy import SQLAlchemy
from functools import wraps
########################################################################
# App settings
########################################################################
app = Flask(__name__)
app.config.from_pyfile('config.py')
app.secret_key = '446307a5f61c2bb810436b2ee0f903f2'
app.debug = True
app.static_url_path='/static'
db = SQLAlchemy(app)
########################################################################
# Database
########################################################################
class Stock_users(db.Model):
id = db.Column(db.Integer, primary_key=True)
mail = db.Column(db.Text, nullable=False)
password = db.Column(db.Text, nullable=False)
name = db.Column(db.Text, nullable=False)
class Stock_componants(db.Model):
id = db.Column(db.Integer, primary_key=True)
reference = db.Column(db.Text, nullable=False)
designation = db.Column(db.Text, nullable=False)
last_price = db.Column(db.Float)
mean_price = db.Column(db.Float)
quantity = db.Column(db.Integer)
min_quantity = db.Column(db.Integer)
place = db.Column(db.Text, nullable=False)
provider_id = db.Column(db.Integer, nullable=False)
class Stock_providers(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, nullable=False)
address = db.Column(db.Text)
url = db.Column(db.Text)
comment = db.Column(db.Text)
class Stock_kits(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, nullable=False)
description = db.Column(db.Text, nullable=False)
class Stock_kit_compositions(db.Model):
id = db.Column(db.Integer, primary_key=True)
kit_id = db.Column(db.Integer, db.ForeignKey('Stock_kits.id'), nullable=False)
component_id = db.Column(db.Integer, db.ForeignKey('Stock_componants.id'), nullable=False)
component_quantity = db.Column(db.Integer, nullable=False)
def resume_session(func):
@wraps(func)
def check(*args, **kwargs):
# default
limit = 8
offset = 0
nexthop = offset + limit
prevhop = offset
sort = 'reference'
order = 'asc'
order_refresh = 0
c_empty = ''
c_provider = 1
if not 'c_limit' in session:
session['c_limit'] = limit
if not 'c_offest' in session:
session['c_offset'] = offset
if not 'c_sort' in session:
session['c_sort'] = sort
if not 'c_order' in session:
session['c_order'] = order
if not 'c_order_refresh' in session:
session['c_order_refresh'] = order_refresh
if not 'c_nexthop' in session:
session['c_nexthop'] = nexthop
if not 'c_prevhop' in session:
session['c_prevhop'] = prevhop
if not 'c_reference' in session:
session['c_reference'] = c_empty
if not 'c_designation' in session:
session['c_designation'] = c_empty
if not 'c_place' in session:
session['c_place'] = c_empty
if not 'c_provider' in session:
session['c_provider'] = c_provider
# Cookies/session sync
for key in request.cookies:
try:
session[key] = int(str(request.cookies[key]))
except ValueError:
# Value is not an int, will be treated as string
session[key] = str(request.cookies[key])
if key != 'session':
print '+', key, request.cookies[key]
# Switch sort order
if session['c_order_refresh'] == 1:
refresh = {'desc': 'asc', 'asc': 'desc'}
session['c_order'] = refresh[session['c_order']]
session['c_order_refresh'] = 0
return func(*args, **kwargs)
return check
########################################################################
# Routes
########################################################################
@app.errorhandler(404)
def page_not_found(e):
return render_template('error.html'), 404
@app.route("/")
def authenticate():
return render_template('index.html')
########################################################################
# Componants
########################################################################
## Main ##
@app.route('/componants', methods=['GET', 'POST'])
@resume_session
def get_componants():
providers = Stock_providers.query.order_by(Stock_providers.name).all()
return render_template('componants.html',
providers=providers,
reference=session['c_reference'],
designation=session['c_designation'],
place=session['c_place'],
provider_id=session['c_provider'])
## Componant edition ##
@app.route('/componants/<componant_id>')
def get_componant(componant_id):
try:
componant_id = int(componant_id)
except ValueError as e:
return render_template('error.html'), 404
componant = Stock_componants.query.filter_by(id=componant_id).first()
if componant:
providers = Stock_providers.query.order_by(Stock_providers.name).all()
provider = componant.provider_id
provider = Stock_providers.query.filter_by(id=provider).first()
return render_template('componant.html', componant=componant, providers=providers, provider=provider)
return render_template('error.html'), 404
## Componant update ##
@app.route('/componants/update/<componant_id>', methods=['POST'])
def update_componant(componant_id):
field = request.form['field']
value = request.form['value']
if field and value:
try:
componant = Stock_componants.query.filter_by(id=componant_id).first()
setattr(componant, field, value)
db.session.commit()
except Exception as e:
return 'KO'
return 'OK'
## Componant deletion ##
@app.route('/componants/delete/<componant_id>')
def delete_componant(componant_id):
try:
componant_id = int(componant_id)
except ValueError as e:
return render_template('error.html'), 404
Stock_componants.query.filter_by(id=componant_id).delete()
db.session.commit()
return get_componants()
## Componant creation ##
@app.route('/componants/new/<componant_id>')
def add_componant(componant_id):
return render_template('wip.html')
## Componants stock in ##
@app.route('/componants/in/<componant_id>')
def in_componants():
return render_template('wip.html')
## Componants stock out ##
@app.route('/componants/out/<componant_id>')
def out_componants():
return render_template('wip.html')
## Componants update result set
@app.route('/componants/update', methods=['POST'])
@resume_session
def update_componants():
# search by reference
like = '%'+str(session['c_reference'])+'%'
componants = Stock_componants.query.filter(Stock_componants.reference.like(like))
# search by designation
like = '%'+str(session['c_designation'])+'%'
componants = componants.filter(Stock_componants.designation.like(like))
# search by place
like = '%'+str(session['c_place'])+'%'
componants = componants.filter(Stock_componants.place.like(like))
# search by provider
if session['c_provider'] > 0:
componants = componants.filter_by(provider_id=session['c_provider'])
# Pages calculation
row_count = componants.count()
session['c_pagecount'] = int(math.ceil(row_count / float(session['c_limit'])))
session['c_page'] = int(math.ceil(float(float(session['c_offset']) + 1) / float(session['c_limit'])))
if session['c_page'] > session['c_pagecount']:
session['c_page'] = session['c_pagecount']
session['c_offset'] = 0
print "*****", componants.count(), session['c_pagecount'], session['c_page']
session['c_nexthop'] = session['c_offset'] + session['c_limit']
if session['c_nexthop'] > row_count - 1:
session['c_nexthop'] = int(session['c_offset'])
session['c_prevhop'] = int(session['c_offset']) - session['c_limit']
if session['c_prevhop'] < 0:
session['c_prevhop'] = 0
# Sorting
sort = getattr(Stock_componants, session['c_sort'])
if session['c_order'] == 'desc':
sort = getattr(Stock_componants, session['c_sort']).desc()
componants = componants.order_by(sort)
# Applying offset
componants = componants.offset(session['c_offset'])
# Applying limit
componants = componants.limit(session['c_limit'])
# Get result
componants = componants.all()
response = app.make_response(render_template('result.html',
componants=componants,
offset=session['c_offset'] ,
nexthop=session['c_nexthop'],
prevhop=session['c_prevhop'],
page_count=session['c_pagecount'],
page=session['c_page'],
sort=session['c_sort'],
order=session['c_order'],
row_count=row_count))
for key in session:
response.set_cookie(key, value=str(session[key]))
if key != 'session':
print '++', key, session[key]
return response
########################################################################
# Kits
########################################################################
@app.route('/kits')
def get_kits():
return render_template('kits.html')
@app.route('/kits/<kit_id>')
def get_kit(kit_id):
return render_template('wip.html')
@app.route('/kits/add/<kit_id>')
def add_kit(kit_id):
return render_template('wip.html')
@app.route('/kits/edit/<kit_id>')
def edit_kit(kit_id):
return render_template('wip.html')
@app.route('/kits/delete/<kit_id>')
def delete_kit(kit_id):
return render_template('wip.html')
@app.route('/kits/search')
def search_kits():
return render_template('wip.html')
########################################################################
# Providers
########################################################################
@app.route('/providers')
def get_providers():
return render_template('providers.html')
@app.route('/providers/<provider_id>')
def get_provider(provider_id):
return render_template('wip.html')
@app.route('/providers/add/<provider_id>')
def add_provider(provider_id):
return render_template('wip.html')
@app.route('/providers/edit/<provider_id>')
def edit_provider(provider_id):
return render_template('wip.html')
@app.route('/providers/delete/<provider_id>')
def delete_provider(provider_id):
return render_template('wip.html')
@app.route('/providers/search')
def search_providers():
return render_template('wip.html')
########################################################################
# Users
########################################################################
@app.route('/users')
def get_users():
return render_template('wip.html')
@app.route('/users/<user_id>')
def get_user(user_id):
return render_template('wip.html')
@app.route('/users/add/<user_id>')
def add_user(user_id):
return render_template('wip.html')
@app.route('/users/edit/<user_id>')
def edit_user(user_id):
return render_template('wip.html')
@app.route('/users/delete/<user_id>')
def delete_user(user_id):
return render_template('wip.html')
@app.route('/users/search')
def search_users():
return render_template('wip.html')
##############################################
# SQL
##############################################
def sql_get_distinct(query):
results = []
for result in query:
result = result[0]
if result not in results:
results.append(result)
return results
# Main #######################################
if __name__ == '__main__':
app.run(host='0.0.0.0')