mirror of
https://github.com/brmlab/brmbar.git
synced 2025-06-08 05:14:00 +02:00
120 lines
3.9 KiB
Python
Executable file
120 lines
3.9 KiB
Python
Executable file
#!/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/<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/<user>/<item>')
|
|
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/<filename>')
|
|
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)
|