Compare commits

...

8 Commits

7 changed files with 72 additions and 51 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
__pycacahe__/* __pycacahe__/*
freeriders/__pycacahe__/*
instance/

View File

@ -7,3 +7,4 @@ Web app for tracking current ticket numbers
- keep all ticket numbers and timestamps in SQL table "tickets" - keep all ticket numbers and timestamps in SQL table "tickets"
- display last ticket number - display last ticket number
- don't allow tickets that are out of probable ticket number range - don't allow tickets that are out of probable ticket number range
- if last submited ticket is timestamped more then 90 minutes ago, try to predict the next number

21
freeriders/functions.py Normal file
View File

@ -0,0 +1,21 @@
import time
import datetime
def datetounix(day, month, year, hour, minute, second):
seconds = datetime.datetime(year, month, day, hour, minute, second).timestamp()
return int(seconds)
def formatprefix2(number):
return "{:02d}".format(number)
def formatprefix10(number):
return "{:010d}".format(number)
def predict(timestamp):
base_ticket = 7157662
base_timestamp = 1695887564
step = 0.688
ticket = base_ticket + (timestamp - base_timestamp) * step
return int(ticket)

View File

@ -1,14 +1,26 @@
from flask import render_template, request, redirect from flask import render_template, request, redirect
from freeriders import app, db from freeriders import app, db
from freeriders.models import Ticket from freeriders.functions import formatprefix2,formatprefix10, predict
from freeriders.models import Tickets
from datetime import datetime
import time import time
@app.route('/sms', methods=['GET']) @app.route('/sms', methods=['GET'])
def sms(): def sms():
if request.method == 'GET': if request.method == 'GET':
timenow = int(time.time())
try: try:
lastticket = Ticket.query.order_by(Ticket.timestamp.desc()).first() lastticket = Tickets.query.order_by(Tickets.timestamp.desc()).first()
return render_template('sms.html', ticket = lastticket)
if lastticket.timestamp < timenow - (90 * 60):
lastticket = formatprefix10(predict(timenow))
else:
lastticket = formatprefix10(lastticket.ticket)
date = datetime.now()
datenow = f'{formatprefix2(date.day)}.{formatprefix2(date.month)}.{date.year}'
timenow = f'{formatprefix2(date.hour)}:{formatprefix2(date.minute)}:{formatprefix2(date.second)}'
return render_template('sms.html', ticket = lastticket, date = datenow, time = timenow)
except: except:
return 'Error retriving last ticket' return 'Error retriving last ticket'
else: else:
@ -16,6 +28,7 @@ def sms():
@app.route('/submit', methods=['POST', 'GET']) @app.route('/submit', methods=['POST', 'GET'])
def submit(): def submit():
PREDICTTIMERANGE = 60 * 60 * 24
if request.method == 'GET': if request.method == 'GET':
return render_template('submit.html') return render_template('submit.html')
elif request.method == 'POST': elif request.method == 'POST':
@ -23,7 +36,14 @@ def submit():
ticket_input = request.form['ticket'] ticket_input = request.form['ticket']
if ticket_input.isdigit() and len(ticket_input) == 10 : if ticket_input.isdigit() and len(ticket_input) == 10 :
ticket = Ticket(ticket = int(ticket_input), timestamp = timenow) if int(ticket_input) < predict(timenow + PREDICTTIMERANGE ) and int(ticket_input) > predict(timenow - PREDICTTIMERANGE ) :
ticket = Tickets(ticket = int(ticket_input), timestamp = timenow)
else:
print(int(ticket_input))
print(predict(timenow - PREDICTTIMERANGE))
print(predict(timenow + PREDICTTIMERANGE))
print(predict(timenow))
return 'Ticket number is in unexpected range.'
else: else:
return 'Ticket format is wrong. Only 10 digits allowed.' return 'Ticket format is wrong. Only 10 digits allowed.'

View File

@ -1,14 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/styles/style.css">
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">
<title>Ticket tracking</title>
</head>
<body>
<main>
</main>
</body>
</html>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Karta</title> <title>Karta</title>
<link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="/static/style.css">
</head> </head>
<body> <body>
<header> <header>
@ -20,35 +20,8 @@
U Beogradu, za broj telefona ste kupili U Beogradu, za broj telefona ste kupili
VREMENSKU KARTU OD 90 MINUTA U ZONI A po VREMENSKU KARTU OD 90 MINUTA U ZONI A po
ceni od 50 din + osnovna cena poruke, ceni od 50 din + osnovna cena poruke,
koja vazi do 03.10.2023, 09:42:54. koja vazi do {{ date }}, {{ time }}.
Karta broj: 0000343232. Karta broj: {{ ticket }}.
Placanjem operateru izmirujete dugovanja
za ovu kartu prema JKP Naplata prevozne
usluge Beograd. Sacuvajte ovu poruku.
</section>
<section class='request'>
A90
</section>
<section class='ticket'>
U Beogradu, za broj telefona ste kupili
VREMENSKU KARTU OD 90 MINUTA U ZONI A po
ceni od 50 din + osnovna cena poruke,
koja vazi do 03.10.2023, 09:42:54.
Karta broj: 0000343232.
Placanjem operateru izmirujete dugovanja
za ovu kartu prema JKP Naplata prevozne
usluge Beograd. Sacuvajte ovu poruku.
</section>
<section class='date'>08:23</section>
<section class='request'>
A90
</section>
<section class='ticket'>
U Beogradu, za broj telefona ste kupili
VREMENSKU KARTU OD 90 MINUTA U ZONI A po
ceni od 50 din + osnovna cena poruke,
koja vazi do 03.10.2023, 09:42:54.
Karta broj: 0000343232.
Placanjem operateru izmirujete dugovanja Placanjem operateru izmirujete dugovanja
za ovu kartu prema JKP Naplata prevozne za ovu kartu prema JKP Naplata prevozne
usluge Beograd. Sacuvajte ovu poruku. usluge Beograd. Sacuvajte ovu poruku.

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Submit</title>
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<main>
<form action="/submit" method="POST">
<label for="ticket">ticket</label>
<input type="text" name="ticket" id="ticket" placeholder="1234567890" required>
<button> Submit </button>
</form>
</main>
</body>
</html>