Verified Commit e8a4aa17 authored by Jakob Moser's avatar Jakob Moser
Browse files

Create /todos/ APIs, outfactor tasks utils into utils.tasks

parent 3f62e5ee
Loading
Loading
Loading
Loading
+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()
+0 −0

Empty file added.

+36 −0
Changes for portal/api/utils/tasks.py: 36 added lines, 0 removed lines.
Original line number Diff line number Diff line
from ...model import TaigaUserStoryProvider, TaigaUserStoryReference, Task

STATUS_NEXT_MEETING = 42
STATUS_TODO = 41


def fetch_tasks(status: int) -> list[Task]:
    user_stories = sorted(
        TaigaUserStoryProvider.get_the_one().fetch_user_stories(status),
        key=lambda story: story["kanban_order"],
    )

    return [
        Task(
            name=story["subject"],
            taiga=TaigaUserStoryReference(
                id=story["id"], status=story["status"], version=story["version"]
            ),
        )
        for story in user_stories
    ]


def update_tasks(items: list[Task]) -> None:
    relevant_items = [item for item in items 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