Commit a9d1fed0 authored by Jakob Moser's avatar Jakob Moser
Browse files

Merge branch 'fachschaftssitzung/todo' into 'master'

Show to-do items on /fachschaftssitzung

See merge request !42
parents 04c0aea4 0b339f50
Loading
Loading
Loading
Loading
Loading
+3 −3
Changes for .gitlab-ci.yml: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -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
@@ -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:
@@ -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
+6 −0
Changes for cypress/e2e/fachschaftssitzung.cy.js: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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")

+1 −0
Changes for portal/api/__init__.py: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -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 *
+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