diff --git a/FlaskWebProject/FlaskWebProject/config.example.toml b/FlaskWebProject/FlaskWebProject/config.example.toml index e4caaa7..3d84c81 100644 --- a/FlaskWebProject/FlaskWebProject/config.example.toml +++ b/FlaskWebProject/FlaskWebProject/config.example.toml @@ -10,3 +10,22 @@ api_key = "" [scraper] user-agent = "" # Leave empty for default (Firefox ESR). + +[sportsmen] +tracked_ids = [ + "MVC8zHZD", # Robert Lewandowski + "WGOY4FSt", # Cristiano Ronaldo + "vgOOdZbd", # Lionel Messi + "Wn6E2SED", # Kylian Mbappe + "AiH2zDve", # Zlatan Ibrahimovic + "dUShzrBp", # Luis Suarez + "UmV9iQmE", # Erling Haaland + "tpV0VX0S", # Karim Benzema + "vw8ZV7HC", # Sergio Aguero + "Qgx2trzH", # Edinson Cavani + "2oMimkAU", # Radamel Falcao + "WfXv1DCa", # Wayne Rooney + "0vgcq6un", # Robin van Persie + "v5HSlEAa", # Harry Kane + "4S9fNUYh" # Ciro Immobile +] \ No newline at end of file diff --git a/FlaskWebProject/FlaskWebProject/fs_scraper.py b/FlaskWebProject/FlaskWebProject/fs_scraper.py index a485e3a..c37216d 100644 --- a/FlaskWebProject/FlaskWebProject/fs_scraper.py +++ b/FlaskWebProject/FlaskWebProject/fs_scraper.py @@ -1,5 +1,7 @@ -import requests +from lewy_db import baza as ldb import json +import lewy_globals +import requests class scraper: @@ -7,7 +9,10 @@ class scraper: 'x-fsign': 'SW9D1eZo' } + db = None + def __init__(self): + db = lewy_globals.getDb() pass def pobierzDaneNajlepszegoSportowcaNaSwiecie(self) -> dict: @@ -19,3 +24,11 @@ class scraper: raise ValueError("Zewnętrzne ID sportowca powinno być długości 8!") response = requests.get(f'https://3.flashscore.ninja/3/x/feed/plm_{zewnetrzne_id_sportowca}_{nr_strony}', headers=self.headers) return json.loads(response.text) + + def czy_mecz_istnieje(self, zewnetrzne_id_meczu: str): + mecz = db.simple_select_all(ldb.mecze, zewnetrzne_id_meczu=zewnetrzne_id_meczu).first + if mecz is not None: + return mecz + else: + return False + diff --git a/FlaskWebProject/FlaskWebProject/lewy_api_v1.py b/FlaskWebProject/FlaskWebProject/lewy_api_v1.py index 8049120..c1fc7ef 100644 --- a/FlaskWebProject/FlaskWebProject/lewy_api_v1.py +++ b/FlaskWebProject/FlaskWebProject/lewy_api_v1.py @@ -6,7 +6,7 @@ from flask_sqlalchemy import SQLAlchemy from functools import wraps from lewy_globals import getDb, colors as c import flask, json, time -import lewy_db +import lewy_db as ldb import lewy_globals def require_authentication(func): diff --git a/FlaskWebProject/FlaskWebProject/lewy_db.py b/FlaskWebProject/FlaskWebProject/lewy_db.py index a3c23a2..e87203e 100644 --- a/FlaskWebProject/FlaskWebProject/lewy_db.py +++ b/FlaskWebProject/FlaskWebProject/lewy_db.py @@ -1,106 +1,134 @@ from datetime import datetime from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase, relationship +from sqlalchemy import ForeignKey, select +from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase, Session, relationship from typing import List import toml global db -def initDB(app, config): - global sportowcy, trofea, sportowcy_w_meczach, statystyki_sportowcow, kluby, mecze - tnp = config['general']['db_prefix'] + "_lewangoalski_" +class baza(): - class Base(DeclarativeBase): - pass + # global sportowcy, trofea, sportowcy_w_meczach, statystyki_sportowcow, kluby, mecze - db = SQLAlchemy(app, model_class=Base) + db = None - class sportowcy(Base): - __tablename__ = tnp + "sportowcy" - id_zawodnika: Mapped[ int] = mapped_column(primary_key=True) - zewnetrzne_id_zawodnika: Mapped[ str] = mapped_column() - data_urodzenia: Mapped[ str] = mapped_column() - czy_aktywny: Mapped[ bool] = mapped_column() - klub_id: Mapped[ List[str]] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) - klub: Mapped[ List["kluby"]] = relationship(back_populates="sportowcy_w_klubie", foreign_keys=[klub_id]) - narodowosc: Mapped[ str] = mapped_column() - ilosc_trofeow: Mapped[ int] = mapped_column() - ostatnie_trofeum_id: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}trofea.id_trofeum")) - ostatnie_trofeum: Mapped[ "trofea"] = relationship(back_populates="zawodnik", foreign_keys=[ostatnie_trofeum_id]) - pierwszy_mecz: Mapped[ int] = mapped_column() - wycena: Mapped[ int] = mapped_column() - ostatni_gol_dla_id: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) - ostatni_gol_dla: Mapped[ "kluby"] = relationship(back_populates="sportowcy_ostatni_gol", foreign_keys=[ostatni_gol_dla_id]) - statystyki_id: Mapped[ List[int]] = mapped_column(ForeignKey(f"{tnp}statystyki_sportowcow.id_statystyki")) - statystyki: Mapped[List["statystyki_sportowcow"]] = relationship(back_populates="sportowiec") - trofea: Mapped[ List["trofea"]] = relationship(back_populates="zawodnik", foreign_keys="[trofea.id_zawodnika]") + def __init__(self, app, config): + self.db = self.initDB(app, config) - class trofea(Base): - __tablename__ = tnp + "trofea" - id_trofeum: Mapped[ int] = mapped_column(primary_key=True) - id_zawodnika: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}sportowcy.id_zawodnika")) - zawodnik: Mapped[ "sportowcy"] = relationship(back_populates="trofea", foreign_keys=[id_zawodnika]) - nazwa: Mapped[ str] = mapped_column() - sezon: Mapped[ str] = mapped_column() - rok: Mapped[ str] = mapped_column() + def initDB(self, app, config): + global sportowcy, trofea, sportowcy_w_meczach, statystyki_sportowcow, kluby, mecze + tnp = config['general']['db_prefix'] + "_lewangoalski_" - class sportowcy_w_meczach(Base): - __tablename__ = tnp + "sportowcy_w_meczach" - id_rekordu: Mapped[ int] = mapped_column(primary_key=True) - id_zawodnika: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}sportowcy.id_zawodnika")) - zawodnik: Mapped[ "sportowcy"] = relationship() - zewnetrzne_id_meczu: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}mecze.zewnetrzne_id_meczu")) - czas_gry: Mapped[ int] = mapped_column() - goli: Mapped[ int] = mapped_column() - asyst: Mapped[ int] = mapped_column() - interwencje_bramkarza: Mapped[ int] = mapped_column() - suma_interwencji_na_bramke: Mapped[ int] = mapped_column() - zolte_kartki: Mapped[ int] = mapped_column() - czerwone_kartki: Mapped[ int] = mapped_column() - wygrana: Mapped[ int] = mapped_column() - wynik: Mapped[ float] = mapped_column() + class Base(DeclarativeBase): + pass - class statystyki_sportowcow(Base): - __tablename__ = tnp + "statystyki_sportowcow" - id_statystyki: Mapped[ int] = mapped_column(primary_key=True) - sportowiec: Mapped[ "sportowcy"] = relationship(back_populates="statystyki") - ostatni_mecz: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}mecze.id_meczu")) - ilosc_wystapien: Mapped[ int] = mapped_column() - minut_gry: Mapped[ int] = mapped_column() - gier_sum: Mapped[ int] = mapped_column() - goli_sum: Mapped[ int] = mapped_column() - asyst_sum: Mapped[ int] = mapped_column() - interwencji_sum: Mapped[ int] = mapped_column() - nieobronionych_interwencji_sum: Mapped[ int] = mapped_column() - zoltych_kartek_sum: Mapped[ int] = mapped_column() - czerwonych_kartek_sum: Mapped[ int] = mapped_column() - wygranych_sum: Mapped[ int] = mapped_column() - wynik_sum: Mapped[ int] = mapped_column() - meczow_do_wynikow_sum: Mapped[ int] = mapped_column() + db = SQLAlchemy(app, model_class=Base) - class kluby(Base): - __tablename__ = tnp + "kluby" - id_klubu: Mapped[ str] = mapped_column(primary_key=True) - pelna_nazwa: Mapped[ str] = mapped_column() - skrocona_nazwa: Mapped[ str] = mapped_column() - sportowcy_w_klubie: Mapped[ List["sportowcy"]] = relationship(back_populates="klub", foreign_keys="[sportowcy.klub_id]") - sportowcy_ostatni_gol: Mapped[ "sportowcy"] = relationship(back_populates="ostatni_gol_dla", foreign_keys="[sportowcy.ostatni_gol_dla_id]") + class sportowcy(Base): + __tablename__ = tnp + "sportowcy" + id_zawodnika: Mapped[ int] = mapped_column(primary_key=True) + zewnetrzne_id_zawodnika: Mapped[ str] = mapped_column() + data_urodzenia: Mapped[ str] = mapped_column() + czy_aktywny: Mapped[ bool] = mapped_column() + klub_id: Mapped[ List[str]] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) + klub: Mapped[ List["kluby"]] = relationship(back_populates="sportowcy_w_klubie", foreign_keys=[klub_id]) + narodowosc: Mapped[ str] = mapped_column() + ilosc_trofeow: Mapped[ int] = mapped_column() + ostatnie_trofeum_id: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}trofea.id_trofeum")) + ostatnie_trofeum: Mapped[ "trofea"] = relationship(back_populates="zawodnik", foreign_keys=[ostatnie_trofeum_id]) + pierwszy_mecz: Mapped[ int] = mapped_column() + wycena: Mapped[ int] = mapped_column() + ostatni_gol_dla_id: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) + ostatni_gol_dla: Mapped[ "kluby"] = relationship(back_populates="sportowcy_ostatni_gol", foreign_keys=[ostatni_gol_dla_id]) + statystyki_id: Mapped[ List[int]] = mapped_column(ForeignKey(f"{tnp}statystyki_sportowcow.id_statystyki")) + statystyki: Mapped[List["statystyki_sportowcow"]] = relationship(back_populates="sportowiec") + trofea: Mapped[ List["trofea"]] = relationship(back_populates="zawodnik", foreign_keys="[trofea.id_zawodnika]") + + class trofea(Base): + __tablename__ = tnp + "trofea" + id_trofeum: Mapped[ int] = mapped_column(primary_key=True) + id_zawodnika: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}sportowcy.id_zawodnika")) + zawodnik: Mapped[ "sportowcy"] = relationship(back_populates="trofea", foreign_keys=[id_zawodnika]) + nazwa: Mapped[ str] = mapped_column() + sezon: Mapped[ str] = mapped_column() + rok: Mapped[ str] = mapped_column() + + class sportowcy_w_meczach(Base): + __tablename__ = tnp + "sportowcy_w_meczach" + id_rekordu: Mapped[ int] = mapped_column(primary_key=True) + id_zawodnika: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}sportowcy.id_zawodnika")) + zawodnik: Mapped[ "sportowcy"] = relationship() + zewnetrzne_id_meczu: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}mecze.zewnetrzne_id_meczu")) + czas_gry: Mapped[ int] = mapped_column() + goli: Mapped[ int] = mapped_column() + asyst: Mapped[ int] = mapped_column() + interwencje_bramkarza: Mapped[ int] = mapped_column() + suma_interwencji_na_bramke: Mapped[ int] = mapped_column() + zolte_kartki: Mapped[ int] = mapped_column() + czerwone_kartki: Mapped[ int] = mapped_column() + wygrana: Mapped[ int] = mapped_column() + wynik: Mapped[ float] = mapped_column() + + class statystyki_sportowcow(Base): + __tablename__ = tnp + "statystyki_sportowcow" + id_statystyki: Mapped[ int] = mapped_column(primary_key=True) + sportowiec: Mapped[ "sportowcy"] = relationship(back_populates="statystyki") + ostatni_mecz: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}mecze.id_meczu")) + ilosc_wystapien: Mapped[ int] = mapped_column() + minut_gry: Mapped[ int] = mapped_column() + gier_sum: Mapped[ int] = mapped_column() + goli_sum: Mapped[ int] = mapped_column() + asyst_sum: Mapped[ int] = mapped_column() + interwencji_sum: Mapped[ int] = mapped_column() + nieobronionych_interwencji_sum: Mapped[ int] = mapped_column() + zoltych_kartek_sum: Mapped[ int] = mapped_column() + czerwonych_kartek_sum: Mapped[ int] = mapped_column() + wygranych_sum: Mapped[ int] = mapped_column() + wynik_sum: Mapped[ int] = mapped_column() + meczow_do_wynikow_sum: Mapped[ int] = mapped_column() + + class kluby(Base): + __tablename__ = tnp + "kluby" + id_klubu: Mapped[ str] = mapped_column(primary_key=True) + pelna_nazwa: Mapped[ str] = mapped_column() + skrocona_nazwa: Mapped[ str] = mapped_column() + sportowcy_w_klubie: Mapped[ List["sportowcy"]] = relationship(back_populates="klub", foreign_keys="[sportowcy.klub_id]") + sportowcy_ostatni_gol: Mapped[ "sportowcy"] = relationship(back_populates="ostatni_gol_dla", foreign_keys="[sportowcy.ostatni_gol_dla_id]") + + class mecze(Base): + __tablename__ = tnp + "mecze" + id_meczu: Mapped[ int] = mapped_column(primary_key=True) + zewnetrzne_id_meczu: Mapped[ str] = mapped_column(unique=True) + data: Mapped[ datetime] = mapped_column() + gospodarze_id: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) + gospodarze: Mapped[ "kluby"] = relationship(foreign_keys=[gospodarze_id]) + goscie_id: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) + goscie: Mapped[ "kluby"] = relationship(foreign_keys=[goscie_id]) + gosp_wynik: Mapped[ int] = mapped_column() + gosc_wynik: Mapped[ int] = mapped_column() + sezon: Mapped[ str] = mapped_column() + nazwa_turnieju: Mapped[ str] = mapped_column() + skrocona_nazwa_turnieju: Mapped[ str] = mapped_column() + flaga: Mapped[ int] = mapped_column() + + return db + + def create_all(self): + self.db.create_all() + + def simple_select_all(self, type, **kwargs): + """ + Użycie: + simple_select_all(ldb.sportowcy, zewnetrzne_id_zawodnika="").fetchall() + + https://stackoverflow.com/a/75316945 + Did they make it harder to query dynamically on purpose? ~Frank 19.11.2023 + """ + with self.db.engine.begin() as conn: + return conn.execute( + select(type). + filter_by(**kwargs) + ).scalars() - class mecze(Base): - __tablename__ = tnp + "mecze" - id_meczu: Mapped[ int] = mapped_column(primary_key=True) - zewnetrzne_id_meczu: Mapped[ str] = mapped_column(unique=True) - data: Mapped[ datetime] = mapped_column() - gospodarze_id: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) - gospodarze: Mapped[ "kluby"] = relationship(foreign_keys=[gospodarze_id]) - goscie_id: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}kluby.id_klubu")) - goscie: Mapped[ "kluby"] = relationship(foreign_keys=[goscie_id]) - gosp_wynik: Mapped[ int] = mapped_column() - gosc_wynik: Mapped[ int] = mapped_column() - sezon: Mapped[ str] = mapped_column() - nazwa_turnieju: Mapped[ str] = mapped_column() - skrocona_nazwa_turnieju: Mapped[ str] = mapped_column() - flaga: Mapped[ int] = mapped_column() - return db \ No newline at end of file diff --git a/FlaskWebProject/FlaskWebProject/lewy_globals.py b/FlaskWebProject/FlaskWebProject/lewy_globals.py index 93efd02..2a1dbfd 100644 --- a/FlaskWebProject/FlaskWebProject/lewy_globals.py +++ b/FlaskWebProject/FlaskWebProject/lewy_globals.py @@ -84,7 +84,7 @@ def getConfig(configfile): def setupDb(app, config): global db - db = lewy_db.initDB(app, config) + db = lewy_db.baza(app, config) return db def getDb():