from datetime import datetime from flask_login import UserMixin from sqlalchemy import Numeric from werkzeug.security import check_password_hash, generate_password_hash from .extensions import db class Uzytkownik(UserMixin, db.Model): __tablename__ = "uzytkownik" id = db.Column(db.Integer, primary_key=True) uzytkownik = db.Column(db.String(80), unique=True, nullable=False) haslo_hash = db.Column(db.String(128), nullable=False) czy_admin = db.Column(db.Boolean, default=False) def set_password(self, password): self.haslo_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.haslo_hash, password) class Zbiorka(db.Model): id = db.Column(db.Integer, primary_key=True) nazwa = db.Column(db.String(100), nullable=False) opis = db.Column(db.Text, nullable=False) numer_konta = db.Column(db.String(50), nullable=True) numer_telefonu_blik = db.Column(db.String(50), nullable=True) cel = db.Column(Numeric(12, 2), nullable=False, default=0) stan = db.Column(Numeric(12, 2), default=0) ukryta = db.Column(db.Boolean, default=False) ukryj_kwote = db.Column(db.Boolean, default=False) zrealizowana = db.Column(db.Boolean, default=False) pokaz_postep_finanse = db.Column(db.Boolean, default=True, nullable=False) pokaz_postep_pozycje = db.Column(db.Boolean, default=True, nullable=False) pokaz_postep_kwotowo = db.Column(db.Boolean, default=True, nullable=False) uzyj_konta = db.Column(db.Boolean, default=True, nullable=False) uzyj_blik = db.Column(db.Boolean, default=True, nullable=False) typ_zbiorki = db.Column(db.String(20), default="standardowa", nullable=False) wplaty = db.relationship( "Wplata", back_populates="zbiorka", lazy=True, order_by="Wplata.data.desc()", cascade="all, delete-orphan", passive_deletes=True, ) wydatki = db.relationship( "Wydatek", backref="zbiorka", lazy=True, order_by="Wydatek.data.desc()", cascade="all, delete-orphan", passive_deletes=True, ) przedmioty = db.relationship( "Przedmiot", backref="zbiorka", lazy=True, order_by="Przedmiot.id.asc()", cascade="all, delete-orphan", passive_deletes=True, ) class Przedmiot(db.Model): id = db.Column(db.Integer, primary_key=True) zbiorka_id = db.Column( db.Integer, db.ForeignKey("zbiorka.id", ondelete="CASCADE"), nullable=False, ) nazwa = db.Column(db.String(120), nullable=False) link = db.Column(db.String(255), nullable=True) cena = db.Column(Numeric(12, 2), nullable=True) kupione = db.Column(db.Boolean, default=False) class Wplata(db.Model): id = db.Column(db.Integer, primary_key=True) zbiorka_id = db.Column( db.Integer, db.ForeignKey("zbiorka.id", ondelete="CASCADE"), nullable=False, ) kwota = db.Column(Numeric(12, 2), nullable=False) data = db.Column(db.DateTime, default=datetime.utcnow) opis = db.Column(db.Text, nullable=True) zbiorka = db.relationship("Zbiorka", back_populates="wplaty") ukryta = db.Column(db.Boolean, nullable=False, default=False) class Wydatek(db.Model): id = db.Column(db.Integer, primary_key=True) zbiorka_id = db.Column( db.Integer, db.ForeignKey("zbiorka.id", ondelete="CASCADE"), nullable=False, ) kwota = db.Column(Numeric(12, 2), nullable=False) data = db.Column(db.DateTime, default=datetime.utcnow) opis = db.Column(db.Text, nullable=True) ukryta = db.Column(db.Boolean, nullable=False, default=False) class Przesuniecie(db.Model): id = db.Column(db.Integer, primary_key=True) zbiorka_zrodlo_id = db.Column( db.Integer, db.ForeignKey("zbiorka.id", ondelete="CASCADE"), nullable=False, ) zbiorka_cel_id = db.Column( db.Integer, db.ForeignKey("zbiorka.id", ondelete="CASCADE"), nullable=False, ) kwota = db.Column(Numeric(12, 2), nullable=False) data = db.Column(db.DateTime, default=datetime.utcnow) opis = db.Column(db.Text, nullable=True) ukryta = db.Column(db.Boolean, nullable=False, default=False) wplata_id = db.Column( db.Integer, db.ForeignKey("wplata.id", ondelete="SET NULL"), nullable=True, ) zbiorka_zrodlo = db.relationship("Zbiorka", foreign_keys=[zbiorka_zrodlo_id], backref="przesuniecia_wychodzace") zbiorka_cel = db.relationship("Zbiorka", foreign_keys=[zbiorka_cel_id], backref="przesuniecia_przychodzace") wplata = db.relationship("Wplata", foreign_keys=[wplata_id], backref="przesuniecia") class UstawieniaGlobalne(db.Model): __tablename__ = "ustawienia_globalne" id = db.Column(db.Integer, primary_key=True) numer_konta = db.Column(db.String(50), nullable=False) numer_telefonu_blik = db.Column(db.String(50), nullable=False) dozwolone_hosty_logowania = db.Column(db.Text, nullable=True) logo_url = db.Column(db.String(255), nullable=True) tytul_strony = db.Column(db.String(120), nullable=True) pokaz_logo_w_navbar = db.Column(db.Boolean, default=False) typ_navbar = db.Column(db.String(10), default="text") typ_stopka = db.Column(db.String(10), default="text") stopka_text = db.Column(db.String(200), nullable=True) kolejnosc_rezerwowych = db.Column(db.String(20), default="id", nullable=False)