#!/usr/bin/python from flask import Flask, render_template, Response, g, redirect, abort, request, send_from_directory from re import match from users import users import sqlite3 import os app = Flask('BrmBar') @app.route('/') def index(): cur = g.db.execute('SELECT id, code, name, price FROM items ORDER BY name') items = [dict(id = row[0], code = row[1], name = row[2], price = row[3]) for row in cur.fetchall()] return render_template('index.html', items = items) @app.route('/code/') def code(code): LEN = 25 if match('^U[0-9]{4}$', code): userid = int(code[1:]) # TODO: fetch credit and username try: username = users[userid] usercredit = '0 Kc' r = username[:LEN - len(usercredit) - 1].ljust(LEN - len(usercredit) - 1) + ' ' + usercredit except: r = 'Unknown'.ljust(LEN - 5) + ' - Kc' return Response('%s %s' % (username, usercredit), content_type = 'text/plain') if code == 'R0000': return Response('Reset Credit to 0', content_type = 'text/plain') if match('^\C[0-9]{4}$', code): amount = int(code[1:]) return Response('Credit %d' % amount, content_type = 'text/plain') if match('^[0-9]+$', code): # TODO: fetch item, show name and price itemname = 'Unknown' itemprice = '0 Kc' r = itemname[:LEN - len(itemprice) - 1].ljust(LEN - len(itemprice) - 1) + ' ' + itemprice return Response(r, content_type = 'text/plain') abort(400) @app.route('/action//') def action(user, item): if not match('^U[0-9]{4}$', user): abort(400) if code == 'R0000': # TODO: process - reset credit pass if match('^\C[0-9]{4}$', code): amount = int(code[1:]) # TODO: process - add credit pass if match('^[0-9]+$', code): # TODO: process - deduct item price pass return Response('OK', content_type = 'text/plain') @app.route('/items/') def items(): cur = g.db.execute('SELECT id, code, name, price FROM items ORDER BY name') items = [dict(id = row[0], code = row[1], name = row[2], price = row[3]) for row in cur.fetchall()] return render_template('items.html', items = items) @app.route('/items/', methods=['POST']) def items_post(): f = request.form if f['action'] == 'add': if f['code'] and f['name'] and f['price']: g.db.execute('INSERT INTO items (code, name, price) VALUES (?, ?, ?)', (f['code'], f['name'], f['price'])) g.db.commit() return redirect('/items/') if f['action'].startswith('delete:'): id = int(f['action'][7:]) g.db.execute('DELETE FROM items WHERE id = ?', (id, )) g.db.commit() return redirect('/items/') abort(400) @app.route('/barcodes.txt') def barcodestxt(): ret = [] ret.append('Credit 20;C0020') ret.append('Credit 50;C0050') ret.append('Credit 100;C0100') ret.append('Credit 200;C0200') ret.append('Credit 500;C0500') ret.append('Credit 1000;C1000') ret.append('Credit 2000;C2000') ret.append('RESET;R0000') for (id,name) in sorted(users.iteritems(), key = lambda (k,v): (v,k)): ret.append('%s;U%d' % (name, id)) response = Response(response = '\n'.join(ret) + '\n', content_type = 'text/plain') return response @app.route('/log/') def log(): return render_template('log.html') @app.route('/stats/') def stats(): return render_template('stats.html') @app.route('/static/items/') def download_file(filename): if not os.path.exists('static/items/' + filename): filename = 'missing.jpg' return send_from_directory('static/items/', filename, mimetype='image/jpeg') @app.before_request def before_request(): g.db = sqlite3.connect('db/brmbar.db') @app.after_request def after_request(response): g.db.close() return response if __name__ == '__main__': app.run(host = '0.0.0.0', port = 45678, debug = True)