diff --git a/kontor-api/src/db/models/comic.py b/kontor-api/src/db/models/comic.py index ab58336..815f217 100644 --- a/kontor-api/src/db/models/comic.py +++ b/kontor-api/src/db/models/comic.py @@ -1,6 +1,6 @@ import uuid from datetime import datetime -from typing import Dict, List, Optional +from typing import Dict, List, Optional, Any from natsort import natsorted from sqlalchemy import Column, ForeignKey, Integer, String, Boolean, func from sqlalchemy.orm import relationship, Mapped, mapped_column @@ -48,10 +48,10 @@ class Comic(Base, BaseMixin): def __str__(self): return f'{self.title}({self.id})' - def get_artists(self) -> Dict[str, List[str]]: - works: Dict[str, List[str]] = {} + def get_artists(self) -> Dict[Any, List[Any]]: + works: Dict[Any, List[Any]] = {} for work in self.comic_works: - work_type = work.work_type.name + work_type = work.work_type artist = work.artist if work_type in works: works[work_type].append(artist) @@ -107,6 +107,18 @@ class Issue(Base, BaseMixin): story_arc = relationship("StoryArc", back_populates="issues") issue_works = relationship("IssueWork") + def get_artists(self) -> Dict[Any, List[Any]]: + works: Dict[Any, List[Any]] = {} + for work in self.issue_works: + work_type = work.work_type + artist = work.artist + if work_type in works: + works[work_type].append(artist) + else: + works[work_type] = [artist] + return works + + class Artist(Base, BaseMixin): __tablename__ = "artist" name = Column(String, nullable=False) @@ -114,10 +126,10 @@ class Artist(Base, BaseMixin): comic_works = relationship("ComicWork") issue_works = relationship("IssueWork") - def get_comics(self) -> Dict[str, List[str]]: - works: Dict[str, List[str]] = {} + def get_comics(self) -> Dict[Any, List[Comic]]: + works: Dict[Any, List[Comic]] = {} for work in self.comic_works: - work_type = work.work_type.name + work_type = work.work_type comic = work.comic if work_type in works: works[work_type].append(comic) diff --git a/kontor-api/src/templates/comic/artist_detail.html b/kontor-api/src/templates/comic/artist_detail.html index 650f796..b540bcd 100644 --- a/kontor-api/src/templates/comic/artist_detail.html +++ b/kontor-api/src/templates/comic/artist_detail.html @@ -29,7 +29,7 @@
- {{work}}: + {{work.name}}
- {{work}}: + {{work.name}}
| Volume | {{issue.volume.name}} | |
|---|---|---|
| Works | +
+ {% for work in issue.get_artists() %}
+ + {{work.name}} +
|
+ |
| Data Created | {{issue.created_date}} | diff --git a/kontor-api/src/webapps/comic/route_comics.py b/kontor-api/src/webapps/comic/route_comics.py index 808795a..ceccc78 100644 --- a/kontor-api/src/webapps/comic/route_comics.py +++ b/kontor-api/src/webapps/comic/route_comics.py @@ -10,7 +10,24 @@ router = APIRouter(include_in_schema=False, prefix="/comic") @router.get("/comics") def get_comics(db: SessionDep, request: Request, msg: str | None = None): - comics = db.query(Comic).all() + params = request.query_params + query = params.get("query") + filter = {} + completed = params.get('completed') == "on" + if completed: + filter['completed'] = True + order = params.get("order") == "on" + if order: + filter['current_order'] = True + if query is not None and len(query) > 0: + filter['title'] = query + if len(filter) > 0: + if "title" in filter: + comics = db.query(Comic).filter(Comic.title.ilike(f'%{query}%')) + else: + comics = db.query(Comic).filter_by(**filter).all() + else: + comics = db.query(Comic).all() return templates.TemplateResponse("comic/comics.html", {"request": request, "msg": msg, "comics": comics}) @router.get("/comics/{comic_id}") diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/data/Issue.java b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/data/Issue.java index 4b2095a..9d97320 100644 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/data/Issue.java +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/data/Issue.java @@ -70,6 +70,18 @@ public class Issue extends AbstractEntity { return null; } + public String getFullTitle() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(this.getComic().getTitle()); + stringBuilder.append(" #"); + stringBuilder.append(this.getIssueNumber()); + if (this.title !=null && !this.title.isEmpty()) { + stringBuilder.append(": "); + stringBuilder.append(this.title); + } + return stringBuilder.toString(); + } + @Override public String toString() { StringBuilder result = new StringBuilder(); diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java index 6627453..2f59921 100644 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java @@ -16,7 +16,10 @@ import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.data.binder.BeanValidationBinder; import com.vaadin.flow.data.binder.Binder; -import de.thpeetz.kontor.comics.data.*; +import de.thpeetz.kontor.comics.data.Comic; +import de.thpeetz.kontor.comics.data.Issue; +import de.thpeetz.kontor.comics.data.IssueWork; +import de.thpeetz.kontor.comics.data.Volume; import de.thpeetz.kontor.common.views.YearMonthField; import lombok.extern.slf4j.Slf4j; diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueWorkForm.java b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueWorkForm.java index 6f7e88f..597d3e0 100644 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueWorkForm.java +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueWorkForm.java @@ -14,12 +14,13 @@ import com.vaadin.flow.data.binder.BeanValidationBinder; import com.vaadin.flow.data.binder.Binder; import de.thpeetz.kontor.comics.data.Artist; -import de.thpeetz.kontor.comics.data.Issue; +import de.thpeetz.kontor.comics.data.Comic; import de.thpeetz.kontor.comics.data.IssueWork; import de.thpeetz.kontor.comics.data.Worktype; +import de.thpeetz.kontor.common.views.ComicIssueField; public class IssueWorkForm extends FormLayout { - ComboBox|