From a1563b53acc1cd438e263438b4cf2ddcb08ede5e Mon Sep 17 00:00:00 2001 From: Niklas Meinzer Date: Wed, 22 Oct 2025 12:01:43 +0200 Subject: [PATCH] Add project setup some models and a test --- pyproject.toml | 10 ++ src/allmende_payment_system/api/__init__.py | 0 src/allmende_payment_system/app.py | 9 +- src/allmende_payment_system/database.py | 6 + src/allmende_payment_system/models.py | 39 ++++++ .../static/img/Logo.png | Bin 0 -> 21153 bytes .../templates/base.html.jinja | 2 +- test/test_models.py | 27 ++++ uv.lock | 123 ++++++++++++++++++ 9 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 src/allmende_payment_system/api/__init__.py create mode 100644 src/allmende_payment_system/database.py create mode 100644 src/allmende_payment_system/models.py create mode 100644 src/allmende_payment_system/static/img/Logo.png create mode 100644 test/test_models.py diff --git a/pyproject.toml b/pyproject.toml index be6156b..7acb679 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,3 +18,13 @@ allmende-payment-system = "allmende_payment_system:main" [build-system] requires = ["uv_build>=0.9.2,<0.10.0"] build-backend = "uv_build" + +[dependency-groups] +dev = [ + "black>=25.9.0", + "isort>=7.0.0", + "pytest>=8.4.2", +] + +[tool.isort] +profile = "black" \ No newline at end of file diff --git a/src/allmende_payment_system/api/__init__.py b/src/allmende_payment_system/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/allmende_payment_system/app.py b/src/allmende_payment_system/app.py index 126054b..946fbac 100644 --- a/src/allmende_payment_system/app.py +++ b/src/allmende_payment_system/app.py @@ -1,11 +1,16 @@ # backend/app/main.py from fastapi import FastAPI, Request -from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates app = FastAPI() templates = Jinja2Templates(directory="src/allmende_payment_system/templates") -app.mount("/static", StaticFiles(directory="src/allmende_payment_system/static"), name="static") +app.mount( + "/static", + StaticFiles(directory="src/allmende_payment_system/static"), + name="static", +) + @app.get("/") async def landing_page(request: Request): diff --git a/src/allmende_payment_system/database.py b/src/allmende_payment_system/database.py new file mode 100644 index 0000000..3139eec --- /dev/null +++ b/src/allmende_payment_system/database.py @@ -0,0 +1,6 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +SQLALCHEMY_DATABASE_URL = "sqlite:///./aps_db.db" +engine = create_engine(SQLALCHEMY_DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) diff --git a/src/allmende_payment_system/models.py b/src/allmende_payment_system/models.py new file mode 100644 index 0000000..64d53aa --- /dev/null +++ b/src/allmende_payment_system/models.py @@ -0,0 +1,39 @@ +from sqlalchemy import Column, ForeignKey, Table +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship + +TABLE_PREFIX = "aps_" + + +class Base(DeclarativeBase): + pass + + +class Account(Base): + __tablename__ = TABLE_PREFIX + "account" + id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + name: Mapped[str] = mapped_column(nullable=False, unique=True) + + users: Mapped[list["User"]] = relationship( + "User", + secondary=TABLE_PREFIX + "user_account_association", + back_populates="accounts", + ) + + +user_account_association = Table( + TABLE_PREFIX + "user_account_association", + Base.metadata, + Column("user_id", ForeignKey(TABLE_PREFIX + "user.id"), primary_key=True), + Column("account_id", ForeignKey(TABLE_PREFIX + "account.id"), primary_key=True), +) + + +class User(Base): + __tablename__ = TABLE_PREFIX + "user" + id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + username: Mapped[str] = mapped_column(nullable=False, unique=True) + display_name: Mapped[str] = mapped_column(nullable=False) + + accounts: Mapped[list["Account"]] = relationship( + "Account", secondary=user_account_association, back_populates="users" + ) diff --git a/src/allmende_payment_system/static/img/Logo.png b/src/allmende_payment_system/static/img/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2b44bc45037d93324c466515940bb88cacae498c GIT binary patch literal 21153 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 b(Ios|HGd@Sau#9b00000NkvXXu0mjf1^OMB literal 0 HcmV?d00001 diff --git a/src/allmende_payment_system/templates/base.html.jinja b/src/allmende_payment_system/templates/base.html.jinja index b8f6c24..895a22a 100644 --- a/src/allmende_payment_system/templates/base.html.jinja +++ b/src/allmende_payment_system/templates/base.html.jinja @@ -15,7 +15,7 @@