#!/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 offset_reset = ['c_reference', 'c_designation', 'c_place', 'c_provider'] 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: old = str(session[key]) 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 in offset_reset and len(str(session[key])) > 0 and old != str(session[key]): session['c_offset'] = 0 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/') 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/', 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/') 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/') def add_componant(componant_id): return render_template('wip.html') ## Componants stock in ## @app.route('/componants/in/') def in_componants(): return render_template('wip.html') ## Componants stock out ## @app.route('/componants/out/') 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 = '%s%s%s' % ('%', str(session['c_reference']), '%') componants = Stock_componants.query.filter(Stock_componants.reference.like(like)) # search by designation like = '%s%s%s' % ('%', str(session['c_designation']), '%') componants = componants.filter(Stock_componants.designation.like(like)) # search by place like = '%s%s%s' % ('%', 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/') def get_kit(kit_id): return render_template('wip.html') @app.route('/kits/add/') def add_kit(kit_id): return render_template('wip.html') @app.route('/kits/edit/') def edit_kit(kit_id): return render_template('wip.html') @app.route('/kits/delete/') 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/') def get_provider(provider_id): return render_template('wip.html') @app.route('/providers/add/') def add_provider(provider_id): return render_template('wip.html') @app.route('/providers/edit/') def edit_provider(provider_id): return render_template('wip.html') @app.route('/providers/delete/') 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/') def get_user(user_id): return render_template('wip.html') @app.route('/users/add/') def add_user(user_id): return render_template('wip.html') @app.route('/users/edit/') def edit_user(user_id): return render_template('wip.html') @app.route('/users/delete/') 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')