Loading .gitlab-ci.yml +3 −3 Changes for .gitlab-ci.yml: 3 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ lint-openapi: allow_failure: true test-frontend: image: ghcr.io/astral-sh/uv:python3.12-bookworm image: ghcr.io/astral-sh/uv:python3.12-trixie stage: test before_script: - apt-get update Loading @@ -20,7 +20,7 @@ test-frontend: - curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg - echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list - apt-get update - apt-get install -y nodejs libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb - apt-get install -y nodejs libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb - uv sync --locked - npm install cypress script: Loading @@ -37,7 +37,7 @@ test-frontend: expire_in: 1 week test-python: image: ghcr.io/astral-sh/uv:python3.12-bookworm image: ghcr.io/astral-sh/uv:python3.12-trixie stage: test before_script: - uv sync --locked Loading cypress/e2e/fachschaftssitzung.cy.js +6 −0 Changes for cypress/e2e/fachschaftssitzung.cy.js: 6 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -5,6 +5,12 @@ describe("Fachschaftssitzung page", () => { cy.contains("Tagesordnung") }) it("contains the word 'To Do'", () => { cy.visit("/fachschaftssitzung") cy.contains("To Do") }) it("shows a generic text about editing today's protocol", () => { cy.visit("/fachschaftssitzung") Loading portal/api/__init__.py +1 −0 Changes for portal/api/__init__.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,4 +2,5 @@ from .agenda import * from .auth import * from .blueprint import bp as bp from .rest import * from .todo import * from .version import * portal/api/agenda.py +10 −35 Changes for portal/api/agenda.py: 10 added lines, 35 removed lines. Original line number Diff line number Diff line from flask import request from portal.model import TaigaUserStoryProvider from ..model import AgendaItem, Key, TaigaUserStoryReference from ..model import Key, Task from ..problem_details import ProblemResponse, bad_request from .auth import require_valid from .blueprint import bp from .utils.tasks import STATUS_NEXT_MEETING, fetch_tasks, update_tasks @bp.get("/agendas/-/items") @require_valid(Key) def the_agenda_items() -> list[AgendaItem]: user_stories = sorted( TaigaUserStoryProvider.get_the_one().fetch_user_stories(), key=lambda story: story["kanban_order"], ) def the_agenda_items() -> list[Task]: return [ AgendaItem(name="Tagesordnung"), AgendaItem(name="Gremienberichte"), AgendaItem(name="Posteingang und Kummerkasten"), *( AgendaItem( name=story["subject"], taiga=TaigaUserStoryReference( id=story["id"], status=story["status"], version=story["version"] ), ) for story in user_stories ), AgendaItem(name="Sonstiges"), Task(name="Tagesordnung"), Task(name="Gremienberichte"), Task(name="Posteingang und Kummerkasten"), *fetch_tasks(STATUS_NEXT_MEETING), Task(name="Sonstiges"), ] @bp.patch("/agendas/-/items") @require_valid(Key) def patch_the_agenda_items() -> list[AgendaItem] | ProblemResponse: def patch_the_agenda_items() -> list[Task] | ProblemResponse: if not isinstance(request.json, list): return bad_request() relevant_items = [item for item in request.json if "taiga" in item] taiga = TaigaUserStoryProvider.get_the_one() # TODO Parallelize this for item in relevant_items: taiga.update_user_story( item["taiga"]["id"], item["taiga"]["version"], status=item["taiga"]["status"], ) # TODO Add a comment update_tasks(request.json) return the_agenda_items() portal/api/todo.py 0 → 100644 +24 −0 Changes for portal/api/todo.py: 24 added lines, 0 removed lines. Original line number Diff line number Diff line from flask import request from ..model import Key, Task from ..problem_details import ProblemResponse, bad_request from .auth import require_valid from .blueprint import bp from .utils.tasks import STATUS_TODO, fetch_tasks, update_tasks @bp.get("/todos/-/items") @require_valid(Key) def the_todo_items() -> list[Task]: return fetch_tasks(STATUS_TODO) @bp.patch("/todos/-/items") @require_valid(Key) def patch_the_todo_items() -> list[Task] | ProblemResponse: if not isinstance(request.json, list): return bad_request() update_tasks(request.json) return the_todo_items() Loading
.gitlab-ci.yml +3 −3 Changes for .gitlab-ci.yml: 3 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ lint-openapi: allow_failure: true test-frontend: image: ghcr.io/astral-sh/uv:python3.12-bookworm image: ghcr.io/astral-sh/uv:python3.12-trixie stage: test before_script: - apt-get update Loading @@ -20,7 +20,7 @@ test-frontend: - curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg - echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list - apt-get update - apt-get install -y nodejs libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb - apt-get install -y nodejs libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb - uv sync --locked - npm install cypress script: Loading @@ -37,7 +37,7 @@ test-frontend: expire_in: 1 week test-python: image: ghcr.io/astral-sh/uv:python3.12-bookworm image: ghcr.io/astral-sh/uv:python3.12-trixie stage: test before_script: - uv sync --locked Loading
cypress/e2e/fachschaftssitzung.cy.js +6 −0 Changes for cypress/e2e/fachschaftssitzung.cy.js: 6 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -5,6 +5,12 @@ describe("Fachschaftssitzung page", () => { cy.contains("Tagesordnung") }) it("contains the word 'To Do'", () => { cy.visit("/fachschaftssitzung") cy.contains("To Do") }) it("shows a generic text about editing today's protocol", () => { cy.visit("/fachschaftssitzung") Loading
portal/api/__init__.py +1 −0 Changes for portal/api/__init__.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,4 +2,5 @@ from .agenda import * from .auth import * from .blueprint import bp as bp from .rest import * from .todo import * from .version import *
portal/api/agenda.py +10 −35 Changes for portal/api/agenda.py: 10 added lines, 35 removed lines. Original line number Diff line number Diff line from flask import request from portal.model import TaigaUserStoryProvider from ..model import AgendaItem, Key, TaigaUserStoryReference from ..model import Key, Task from ..problem_details import ProblemResponse, bad_request from .auth import require_valid from .blueprint import bp from .utils.tasks import STATUS_NEXT_MEETING, fetch_tasks, update_tasks @bp.get("/agendas/-/items") @require_valid(Key) def the_agenda_items() -> list[AgendaItem]: user_stories = sorted( TaigaUserStoryProvider.get_the_one().fetch_user_stories(), key=lambda story: story["kanban_order"], ) def the_agenda_items() -> list[Task]: return [ AgendaItem(name="Tagesordnung"), AgendaItem(name="Gremienberichte"), AgendaItem(name="Posteingang und Kummerkasten"), *( AgendaItem( name=story["subject"], taiga=TaigaUserStoryReference( id=story["id"], status=story["status"], version=story["version"] ), ) for story in user_stories ), AgendaItem(name="Sonstiges"), Task(name="Tagesordnung"), Task(name="Gremienberichte"), Task(name="Posteingang und Kummerkasten"), *fetch_tasks(STATUS_NEXT_MEETING), Task(name="Sonstiges"), ] @bp.patch("/agendas/-/items") @require_valid(Key) def patch_the_agenda_items() -> list[AgendaItem] | ProblemResponse: def patch_the_agenda_items() -> list[Task] | ProblemResponse: if not isinstance(request.json, list): return bad_request() relevant_items = [item for item in request.json if "taiga" in item] taiga = TaigaUserStoryProvider.get_the_one() # TODO Parallelize this for item in relevant_items: taiga.update_user_story( item["taiga"]["id"], item["taiga"]["version"], status=item["taiga"]["status"], ) # TODO Add a comment update_tasks(request.json) return the_agenda_items()
portal/api/todo.py 0 → 100644 +24 −0 Changes for portal/api/todo.py: 24 added lines, 0 removed lines. Original line number Diff line number Diff line from flask import request from ..model import Key, Task from ..problem_details import ProblemResponse, bad_request from .auth import require_valid from .blueprint import bp from .utils.tasks import STATUS_TODO, fetch_tasks, update_tasks @bp.get("/todos/-/items") @require_valid(Key) def the_todo_items() -> list[Task]: return fetch_tasks(STATUS_TODO) @bp.patch("/todos/-/items") @require_valid(Key) def patch_the_todo_items() -> list[Task] | ProblemResponse: if not isinstance(request.json, list): return bad_request() update_tasks(request.json) return the_todo_items()