85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
from datetime import date
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from flask_login import UserMixin
|
|
from werkzeug.security import generate_password_hash, check_password_hash
|
|
|
|
db = SQLAlchemy()
|
|
|
|
|
|
class User(UserMixin, db.Model):
|
|
__tablename__ = "users"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
username = db.Column(db.String(64), unique=True, nullable=False, index=True)
|
|
email = db.Column(db.String(120), unique=True, nullable=False, index=True)
|
|
password_hash = db.Column(db.String(255), nullable=False)
|
|
|
|
trips = db.relationship(
|
|
"Trip", backref="user", lazy=True, cascade="all, delete-orphan"
|
|
)
|
|
|
|
def set_password(self, password: str) -> None:
|
|
self.password_hash = generate_password_hash(password)
|
|
|
|
def check_password(self, password: str) -> bool:
|
|
return check_password_hash(self.password_hash, password)
|
|
|
|
|
|
VERKEHRSMITTEL_OPTIONEN = [
|
|
"Bus",
|
|
"Straßenbahn",
|
|
"U-Bahn",
|
|
"S-Bahn",
|
|
"Regionalzug",
|
|
"Fernzug (ÖBB/Railjet/WESTbahn)",
|
|
"Sonstiges",
|
|
]
|
|
|
|
|
|
class Stop(db.Model):
|
|
"""A boardable public-transport stop ("Haltestelle") in Austria.
|
|
|
|
Sourced from OpenStreetMap; see scripts/fetch_stops.py and stops_import.py.
|
|
"""
|
|
|
|
__tablename__ = "stops"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
osm_type = db.Column(db.String(8), nullable=False)
|
|
osm_id = db.Column(db.BigInteger, nullable=False)
|
|
|
|
name = db.Column(db.String(200), nullable=False)
|
|
# lowercased, accent-folded copy of name for diacritic-insensitive search
|
|
name_normalized = db.Column(db.String(200), nullable=False, index=True)
|
|
stop_type = db.Column(db.String(20), nullable=False, default="other")
|
|
municipality = db.Column(db.String(120))
|
|
latitude = db.Column(db.Float, nullable=False)
|
|
longitude = db.Column(db.Float, nullable=False)
|
|
|
|
__table_args__ = (
|
|
db.UniqueConstraint("osm_type", "osm_id", name="uq_stops_osm"),
|
|
)
|
|
|
|
|
|
class Trip(db.Model):
|
|
__tablename__ = "trips"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False, index=True)
|
|
|
|
transport_mode = db.Column(db.String(50), nullable=False)
|
|
line = db.Column(db.String(50))
|
|
# free-text label as entered; *_stop_id links to a known stop when matched
|
|
origin = db.Column(db.String(120), nullable=False)
|
|
origin_stop_id = db.Column(db.Integer, db.ForeignKey("stops.id"))
|
|
destination = db.Column(db.String(120), nullable=False)
|
|
destination_stop_id = db.Column(db.Integer, db.ForeignKey("stops.id"))
|
|
trip_date = db.Column(db.Date, nullable=False, default=date.today)
|
|
rating = db.Column(db.Integer, nullable=False) # 1-5
|
|
comment = db.Column(db.Text)
|
|
|
|
created_at = db.Column(db.DateTime, server_default=db.func.now())
|
|
|
|
origin_stop = db.relationship("Stop", foreign_keys=[origin_stop_id])
|
|
destination_stop = db.relationship("Stop", foreign_keys=[destination_stop_id])
|