diff --git a/kontor-api/src/apis/base.py b/kontor-api/src/apis/base.py index 35faadd..c632977 100644 --- a/kontor-api/src/apis/base.py +++ b/kontor-api/src/apis/base.py @@ -1,10 +1,9 @@ from fastapi import APIRouter -from src.apis.version1 import comic, media, tysc, admin, metadata +from src.apis.version1 import comic, media, tysc, admin api_router = APIRouter(prefix="/api") api_router.include_router(comic.router, prefix="/comics", tags=["comics"]) api_router.include_router(media.router, prefix="/media", tags=["media"]) api_router.include_router(tysc.router, prefix="/tysc", tags=["tysc"]) api_router.include_router(admin.router, prefix="/login", tags=["login"]) -api_router.include_router(metadata.router, prefix="/metadata", tags=["metadata"]) diff --git a/kontor-api/src/apis/version1/metadata.py b/kontor-api/src/apis/version1/metadata.py deleted file mode 100644 index 2860880..0000000 --- a/kontor-api/src/apis/version1/metadata.py +++ /dev/null @@ -1,26 +0,0 @@ -from typing import List - -from fastapi import APIRouter - -from src.apis.utils import SessionDep -from src.db.models.metadata import MetaDataTable, MetaDataColumn -from src.db.repository.metadata import get_tables, get_columns -from src.schema.admin import MetaDataTableResponse, MetaDataColumnResponse - -router = APIRouter() - - - -@router.get("/tables") -def get_meta_data_tables(db: SessionDep) -> List[MetaDataTableResponse]: - tables = db.query(MetaDataTable).all() - response: List[MetaDataTableResponse] = get_tables(tables) - return response - - - -@router.get("/columns") -def get_meta_data_columns(db: SessionDep) -> List[MetaDataColumnResponse]: - columns = db.query(MetaDataColumn).all() - response: List[MetaDataColumnResponse] = get_columns(columns) - return response diff --git a/kontor-api/src/db/models/metadata.py b/kontor-api/src/db/models/metadata.py deleted file mode 100644 index 466ae19..0000000 --- a/kontor-api/src/db/models/metadata.py +++ /dev/null @@ -1,39 +0,0 @@ -from sqlalchemy import Column, String, ForeignKey, Integer, Boolean -from sqlalchemy.orm import relationship - -from src.db.models.base import Base, BaseMixin - - -class MetaDataTable(Base, BaseMixin): - __tablename__ = 'meta_data_table' - table_name = Column(String, unique=True) - table_columns = relationship("MetaDataColumn") - - def __repr__(self): - return f'MetaDataTable({self.id} {self.table_name})' - - def __str__(self): - return f'{self.table_name}({self.id})' - - -class MetaDataColumn(Base, BaseMixin): - __tablename__ = 'meta_data_column' - column_name = Column(String, nullable=False) - column_type = Column(String) - column_order = Column(Integer) - is_shown = Column(Boolean) - column_label = Column(String) - show_filter = Column(Boolean) - filter_label = Column(String) - ref_column = Column(String, nullable=True) - table_id = Column(String, ForeignKey('meta_data_table.id')) - table = relationship("MetaDataTable", back_populates="table_columns") - - def __repr__(self): - if self.column_name is None: - return f'MetaDataColumn({self.id} {self.table.table_name}.__)' - else: - return f'MetaDataColumn({self.id} {self.table.table_name}.{self.column_name})' - - def __str__(self): - return f'{self.column_name}({self.id})' diff --git a/kontor-api/src/db/repository/metadata.py b/kontor-api/src/db/repository/metadata.py deleted file mode 100644 index 7e19330..0000000 --- a/kontor-api/src/db/repository/metadata.py +++ /dev/null @@ -1,30 +0,0 @@ -from typing import List - -from src.db.models.metadata import MetaDataTable, MetaDataColumn -from src.schema.admin import MetaDataTableResponse, MetaDataColumnResponse - - -def get_tables(tables: List[MetaDataTable]) -> List[MetaDataTableResponse]: - results: List[MetaDataTableResponse] = [] - for table in tables: - result = MetaDataTableResponse(id=table.id, name=table.table_name) - results.append(result) - return results - -def get_columns(columns: List[MetaDataColumn]) -> List[MetaDataColumnResponse]: - results: List[MetaDataColumnResponse] = [] - for column in columns: - result = MetaDataColumnResponse( - id=column.id, - table_name=column.table.table_name, - column_name=column.column_name, - column_type=column.column_type, - column_order=column.column_order, - is_shown=column.is_shown, - column_label=column.column_label, - show_filter=column.show_filter, - filter_label=column.filter_label, - ref_column=column.ref_column - ) - results.append(result) - return results diff --git a/kontor-api/src/schema/admin.py b/kontor-api/src/schema/admin.py index 25beb3c..5efe689 100644 --- a/kontor-api/src/schema/admin.py +++ b/kontor-api/src/schema/admin.py @@ -6,21 +6,3 @@ from pydantic import BaseModel class Token(BaseModel): access_token: str token_type: str - -class MetaDataTableResponse(BaseModel): - id: str - name: str - -class MetaDataColumnResponse(BaseModel): - id: str - table_name: str - column_name: str - column_sync_name: str - column_type: str - column_modifier: Optional[str] - column_order: int - is_shown: bool - column_label: Optional[str] - show_filter: bool - filter_label: Optional[str] - ref_column: Optional[str] diff --git a/kontor-api/src/templates/admin/metadata.html b/kontor-api/src/templates/admin/metadata.html deleted file mode 100644 index ca93b0b..0000000 --- a/kontor-api/src/templates/admin/metadata.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "shared/base.html" %} - -{% block title %} - MetaData -{% endblock %} - -{% block content %} - {% with msg=msg %} - {% include "components/alerts.html" %} - {% endwith %} -
- {% for table in data %} -
- {% with obj=table %} - {% include "components/metadatatable_cards.html" %} - {% endwith %} -
-
- {% endfor %} -
-{% endblock %} diff --git a/kontor-api/src/templates/admin/permissions.html b/kontor-api/src/templates/admin/permissions.html new file mode 100644 index 0000000..fa40de2 --- /dev/null +++ b/kontor-api/src/templates/admin/permissions.html @@ -0,0 +1,38 @@ +{% extends "shared/base.html" %} + +{% block title %} + Permissions +{% endblock %} + +{% block content %} + {% with msg=msg %} + {% include "components/alerts.html" %} + {% endwith %} +
+
+
+

Permissions..

+
+
+
+ + + + + + + {% for permission in permissions %} + + + + + + {% endfor %} + +
NameActions
{{permission.name}}EditDelete
+
+ Add Permission +
+
+
+{% endblock %} diff --git a/kontor-api/src/templates/admin/profiles.html b/kontor-api/src/templates/admin/profiles.html new file mode 100644 index 0000000..254ec84 --- /dev/null +++ b/kontor-api/src/templates/admin/profiles.html @@ -0,0 +1,43 @@ +{% extends "shared/base.html" %} + +{% block title %} + Profiles +{% endblock %} + +{% block content %} + {% with msg=msg %} + {% include "components/alerts.html" %} + {% endwith %} +
+
+
+

Profiles..

+
+
+
+ + + + + + + + + {% for profile in profiles %} + + + + + + + + + {% endfor %} + +
UsernameFirst NameLast NameActions
{{profile.user_name}}{{profile.first_name}}{{profile.last_name}}{{profile.email}}EditDelete
+
+ Add Profile +
+
+
+{% endblock %} diff --git a/kontor-api/src/templates/comic/comics.html b/kontor-api/src/templates/comic/comics.html index df98d07..9e05d67 100644 --- a/kontor-api/src/templates/comic/comics.html +++ b/kontor-api/src/templates/comic/comics.html @@ -34,7 +34,9 @@ {% endfor %} - Add Comic +
+ Add Comic +
{% endblock %} diff --git a/kontor-api/src/templates/components/metadatatable_cards.html b/kontor-api/src/templates/components/metadatatable_cards.html deleted file mode 100644 index be3c534..0000000 --- a/kontor-api/src/templates/components/metadatatable_cards.html +++ /dev/null @@ -1,31 +0,0 @@ -
-
-
{{obj.table_name}}
- - - - - - - - - - - - - {% for column in obj.table_columns %} - - - - - - - - - - - {% endfor %} - -
Column NameColumn TypeColumn OrderIs ShownColumn LabelShow FilterFilter LabelRef Column
{{column.column_name}}{{column.column_type}}{{column.column_order}}{% with check=column.is_shown %}{% include "components/check.html" %}{% endwith %}{{column.column_label}}{% with check=column.show_filter %}{% include "components/check.html" %}{% endwith %}{{column.filter_label}}{{column.ref_column}}
-
-
diff --git a/kontor-api/src/templates/components/navbar.html b/kontor-api/src/templates/components/navbar.html index ad9cc99..02cc139 100644 --- a/kontor-api/src/templates/components/navbar.html +++ b/kontor-api/src/templates/components/navbar.html @@ -41,7 +41,8 @@
  • Signup
  • Login
  • -
  • MetaData
  • +
  • Profiles
  • +
  • Permissions
  • diff --git a/kontor-api/src/webapps/admin/route_admin.py b/kontor-api/src/webapps/admin/route_admin.py index ffc6b78..e2ab62d 100644 --- a/kontor-api/src/webapps/admin/route_admin.py +++ b/kontor-api/src/webapps/admin/route_admin.py @@ -1,24 +1,31 @@ +from typing import AnyStr from fastapi import APIRouter, Request from fastapi.security.utils import get_authorization_scheme_param from fastapi.templating import Jinja2Templates from src.apis.utils import SessionDep from src.apis.version1.admin import get_current_user_from_token -from src.db.models.admin import Profile -from src.db.models.metadata import MetaDataColumn, MetaDataTable -from src.db.repository.metadata import get_columns +from src.db.models.admin import Permission, Profile templates = Jinja2Templates(directory="src/templates") router = APIRouter(include_in_schema=False, prefix="/admin") -@router.get("/metadata") -def get_metadata(db: SessionDep, request: Request, msg: str = None): - token = request.cookies.get("access_token") - scheme, param = get_authorization_scheme_param(token) - current_user: Profile = get_current_user_from_token(token=param, db=db) - data = [] - if current_user is None: - msg = "You are not logged in" - return templates.TemplateResponse("admin/metadata.html", {"request": request, "msg": msg, "data": data}) - tables= db.query(MetaDataTable).all() - return templates.TemplateResponse("admin/metadata.html", {"request": request, "msg": msg, "data": tables}) +@router.get("/profiles") +def get_profiles(db: SessionDep, request: Request, msg: str | None = None): + profiles = db.query(Profile).all() + return templates.TemplateResponse("admin/profiles.html", {"request": request, "msg": msg, "profiles": profiles}) + +@router.get("/profiles/{profile_id}") +def comic_details(profile_id: AnyStr, request: Request, db: SessionDep): + profile = db.get(Profile, profile_id) + return templates.TemplateResponse("admin/profile_detail.html", {"request": request, "profile":profile}) + +@router.get("/permissions") +def get_permissions(db: SessionDep, request: Request, msg: str | None = None): + permissions = db.query(Permission).all() + return templates.TemplateResponse("admin/permissions.html", {"request": request, "msg": msg, "permissions": permissions}) + +@router.get("/permissions/{permission_id}") +def artist_detail(permission_id: AnyStr, request: Request, db: SessionDep): + permission= db.get(Permission, str(permission_id)) + return templates.TemplateResponse("comic/permission_detail.html", {"request": request, "permission": permission}) diff --git a/kontor-api/src/webapps/comic/route_comics.py b/kontor-api/src/webapps/comic/route_comics.py index ea6b03d..b27dd97 100644 --- a/kontor-api/src/webapps/comic/route_comics.py +++ b/kontor-api/src/webapps/comic/route_comics.py @@ -1,16 +1,10 @@ -from fastapi import APIRouter, Request, responses, status +from fastapi import APIRouter, Request from fastapi.templating import Jinja2Templates -from fastapi.responses import RedirectResponse from src.apis.utils import SessionDep -from src.db.models.comic import Comic, Artist, Publisher, Issue, WorkType +from src.db.models.comic import Comic, Artist, Publisher, Issue from typing import AnyStr -from src.db.repository.comic import create_new_worktype, update_worktype -from src.main import logger -from src.schema.comics.worktype import AddWorkType -from src.webapps.comic.forms import AddWorktypeForm - templates = Jinja2Templates(directory="src/templates") router = APIRouter(include_in_schema=False, prefix="/comic") diff --git a/kontor-scripts/db/models/__init__.py b/kontor-scripts/db/models/__init__.py index d0fe076..9da381a 100644 --- a/kontor-scripts/db/models/__init__.py +++ b/kontor-scripts/db/models/__init__.py @@ -33,7 +33,6 @@ from db.models.media import ( MediaArticle, MediaVideo, ) -from db.models.metadata import MetaDataColumn, MetaDataTable from db.models.tysc import ( Card, CardSet, @@ -46,40 +45,38 @@ from db.models.tysc import ( ) registry = { - Card.__tablename__: Card, - CardSet.__tablename__: CardSet, - Rooster.__tablename__: Rooster, + Sport.__tablename__: Sport, + Player.__tablename__: Player, Team.__tablename__: Team, FieldPosition.__tablename__: FieldPosition, - Player.__tablename__: Player, Vendor.__tablename__: Vendor, - Sport.__tablename__: Sport, - Issue.__tablename__: Issue, - TradePaperback.__tablename__: TradePaperback, - StoryArc.__tablename__: StoryArc, - Volume.__tablename__: Volume, - ComicWork.__tablename__: ComicWork, + CardSet.__tablename__: CardSet, + Card.__tablename__: Card, + Rooster.__tablename__: Rooster, Artist.__tablename__: Artist, - Comic.__tablename__: Comic, Publisher.__tablename__: Publisher, WorkType.__tablename__: WorkType, - ArticleAuthor.__tablename__: ArticleAuthor, - BookAuthor.__tablename__: BookAuthor, - BookshelfPublisher.__tablename__: BookshelfPublisher, + Comic.__tablename__: Comic, + Volume.__tablename__: Volume, + StoryArc.__tablename__: StoryArc, + Issue.__tablename__: Issue, + TradePaperback.__tablename__: TradePaperback, + ComicWork.__tablename__: ComicWork, Article.__tablename__: Article, + BookshelfPublisher.__tablename__: BookshelfPublisher, Book.__tablename__: Book, Author.__tablename__: Author, + ArticleAuthor.__tablename__: ArticleAuthor, + BookAuthor.__tablename__: BookAuthor, + MediaArticle.__tablename__: MediaArticle, + MediaVideo.__tablename__: MediaVideo, MediaFile.__tablename__: MediaFile, MediaActor.__tablename__: MediaActor, MediaActorFile.__tablename__: MediaActorFile, - MediaArticle.__tablename__: MediaArticle, - MediaVideo.__tablename__: MediaVideo, - MetaDataColumn.__tablename__: MetaDataColumn, - MetaDataTable.__tablename__: MetaDataTable, - Assignment.__tablename__: Assignment, - Token.__tablename__: Token, Profile.__tablename__: Profile, Permission.__tablename__: Permission, + Assignment.__tablename__: Assignment, + Token.__tablename__: Token, ModuleData.__tablename__: ModuleData, MailAccount.__tablename__: MailAccount, Mail.__tablename__: Mail diff --git a/kontor-scripts/db/models/admin.py b/kontor-scripts/db/models/admin.py index 70e56ad..5aac8b6 100644 --- a/kontor-scripts/db/models/admin.py +++ b/kontor-scripts/db/models/admin.py @@ -40,6 +40,20 @@ class Profile(Base, BaseMixin): self.password = import_data['password'] self.enabled = import_data['enabled'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['first_name'] = self.first_name + item['last_name'] = self.last_name + item['user_name'] = self.user_name + item['email'] = self.email + item['password'] = self.password + item['enabled'] = self.enabled + return item + class Token(Base, BaseMixin): __tablename__ = "token" @@ -60,7 +74,19 @@ class Token(Base, BaseMixin): self.last_used_date = import_data['last_used_date'] self.enabled = import_data['enabled'] self.profile_id = import_data['profile_id'] - self.password = import_data['password'] + + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['token'] = self.token + item['name'] = self.name + item['last_used_date'] = self.last_used_date + item['enabled'] = self.enabled + item['profile_id'] = self.profile_id + return item class Permission(Base, BaseMixin): @@ -75,6 +101,14 @@ class Permission(Base, BaseMixin): self.version = import_data['version'] self.name = import_data['name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + return item class Assignment(Base, BaseMixin): __tablename__ = "assignment" @@ -91,6 +125,16 @@ class Assignment(Base, BaseMixin): self.profile_id = import_data['profile_id'] self.permission_id = import_data['permission_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['profile_id'] = self.profile_id + item['permission_id'] = self.permission_id + return item + class ModuleData(Base, BaseMixin): __tablename__ = "module_data" @@ -105,6 +149,16 @@ class ModuleData(Base, BaseMixin): self.module_name = import_data['module_name'] self.import_data = import_data['import_data'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['module_name'] = self.module_name + item['import_data'] = self.import_data + return item + class MailAccount(Base, BaseMixin): __tablename__ = "mail_account" @@ -127,6 +181,20 @@ class MailAccount(Base, BaseMixin): self.password = import_data['password'] self.start_tls = import_data['start_tls'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['host'] = self.host + item['port'] = self.port + item['protocol'] = self.protocol + item['user_name'] = self.user_name + item['password'] = self.password + item['start_tls'] = self.start_tls + return item + class Mail(Base, BaseMixin): __tablename__ = "mail" @@ -146,3 +214,16 @@ class Mail(Base, BaseMixin): self.body = import_data['body'] self.sent_date = import_data['sent_date'] self.received_date = import_data['received_date'] + + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['folder'] = self.folder + item['subject'] = self.subject + item['body'] = self.body + item['sent_date'] = str(self.sent_date) + item['received_date'] = str(self.received_date) + return item diff --git a/kontor-scripts/db/models/bookshelf.py b/kontor-scripts/db/models/bookshelf.py index e674e0b..078bea6 100644 --- a/kontor-scripts/db/models/bookshelf.py +++ b/kontor-scripts/db/models/bookshelf.py @@ -17,6 +17,15 @@ class Article(Base, BaseMixin): self.version = import_data['version'] self.title = import_data['title'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['title'] = self.title + return item + class Author(Base, BaseMixin): __tablename__ = 'author' @@ -33,6 +42,16 @@ class Author(Base, BaseMixin): self.first_name = import_data['first_name'] self.last_name = import_data['last_name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['first_name'] = self.first_name + item['last_name'] = self.last_name + return item + class BookshelfPublisher(Base, BaseMixin): __tablename__ = 'bookshelf_publisher' @@ -46,6 +65,15 @@ class BookshelfPublisher(Base, BaseMixin): self.version = import_data['version'] self.name = import_data['name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + return item + class Book(Base, BaseMixin): __tablename__ = 'book' @@ -66,6 +94,18 @@ class Book(Base, BaseMixin): self.year = import_data['year'] self.publisher_id = import_data['publisher_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['isbn'] = self.isbn + item['title'] = self.title + item['year'] = self.year + item['publisher_id'] = self.publisher_id + return item + class ArticleAuthor(Base, BaseMixin): __tablename__ = 'article_author' @@ -82,6 +122,16 @@ class ArticleAuthor(Base, BaseMixin): self.article_id = import_data['article_id'] self.author_id = import_data['author_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['article_id'] = self.article_id + item['author_id'] = self.author_id + return item + class BookAuthor(Base, BaseMixin): __tablename__ = 'book_author' @@ -97,3 +147,13 @@ class BookAuthor(Base, BaseMixin): self.version = import_data['version'] self.author_id = import_data['author_id'] self.book_id = import_data['book_id'] + + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['author_id'] = self.author_id + item['book_id'] = self.book_id + return item diff --git a/kontor-scripts/db/models/comic.py b/kontor-scripts/db/models/comic.py index 5e92caa..35e1efa 100644 --- a/kontor-scripts/db/models/comic.py +++ b/kontor-scripts/db/models/comic.py @@ -34,6 +34,17 @@ class Publisher(Base): self.name = import_data['name'] self.parent_publisher_id = import_data['parent_publisher_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['weblink'] = self.weblink + item['parent_publisher_id'] = self.parent_publisher_id + return item + class Comic(Base, BaseMixin): __tablename__ = 'comic' @@ -67,6 +78,19 @@ class Comic(Base, BaseMixin): if 'weblink' in import_data: self.weblink = import_data['weblink'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['title'] = self.title + item['publisher_id'] = self.publisher_id + item['current_order'] = self.current_order + item['completed'] = self.completed + item['weblink'] = self.weblink + return item + class Volume(Base, BaseMixin): __tablename__ = "volume" @@ -84,6 +108,15 @@ class Volume(Base, BaseMixin): self.name = import_data['name'] self.comic_id = import_data['comic_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['comic_id'] = self.comic_id + return item class TradePaperback(Base, BaseMixin): __tablename__ = "trade_paperback" @@ -103,6 +136,18 @@ class TradePaperback(Base, BaseMixin): self.issue_end = import_data['issue_end'] self.comic_id = import_data['comic_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['issue_start'] = self.issue_start + item['issue_end'] = self.issue_end + item['comic_id'] = self.comic_id + return item + class StoryArc(Base, BaseMixin): __tablename__ = "story_arc" @@ -122,6 +167,17 @@ class StoryArc(Base, BaseMixin): self.comic_id = import_data['comic_id'] self.volume_id = import_data['volume_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['comic_id'] = self.comic_id + item['volume_id'] = self.volume_id + return item + class Issue(Base, BaseMixin): __tablename__ = "issue" @@ -147,6 +203,20 @@ class Issue(Base, BaseMixin): self.volume_id = import_data['volume_id'] self.story_arc_id = import_data['story_arc_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['issue_number'] = self.issue_number + item['in_stock'] = self.in_stock + item['is_read'] = self.is_read + item['comic_id'] = self.comic_id + item['volume_id'] = self.volume_id + item['story_arc_id'] = self.story_arc_id + return item + class Artist(Base, BaseMixin): __tablename__ = "artist" @@ -163,6 +233,16 @@ class Artist(Base, BaseMixin): if 'weblink' in import_data: self.weblink = import_data['weblink'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['weblink'] = self.weblink + return item + class WorkType(Base, BaseMixin): __tablename__ = "worktype" @@ -182,6 +262,15 @@ class WorkType(Base, BaseMixin): self.version = import_data['version'] self.name = import_data['name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + return item + class ComicWork(Base, BaseMixin): __tablename__ = "comic_work" @@ -200,3 +289,14 @@ class ComicWork(Base, BaseMixin): self.comic_id = import_data['comic_id'] self.artist_id = import_data['artist_id'] self.work_type_id = import_data['work_type_id'] + + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['comic_id'] = self.comic_id + item['artist_id'] = self.artist_id + item['work_type_id'] = self.work_type_id + return item diff --git a/kontor-scripts/db/models/media.py b/kontor-scripts/db/models/media.py index aaefe4c..f8d9dc8 100644 --- a/kontor-scripts/db/models/media.py +++ b/kontor-scripts/db/models/media.py @@ -34,6 +34,21 @@ class MediaFile(Base, BaseMixin, BaseVideoMixin): self.url = import_data['url'] self.should_download = import_data['should_download'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['cloud_link'] = self.cloud_link + item['file_name'] = self.file_name + item['path'] = self.path + item['review'] = self.review + item['title'] = self.title + item['url'] = self.url + item['should_download'] = self.should_download + return item + def update_title(self) -> None: print(f"update title for {self.url}") try: @@ -41,7 +56,7 @@ class MediaFile(Base, BaseMixin, BaseVideoMixin): soup = BeautifulSoup(r.content, "html.parser") title = soup.title.string self.title = title - self.review = False_ + self.review = False except: self.title = None self.review = True @@ -61,7 +76,7 @@ class MediaFile(Base, BaseMixin, BaseVideoMixin): self.file_name = None else: download_file = Path(file_name) - self.should_download = False_ + self.should_download = False self.file_name = download_file.name self.cloud_link = str(download_file.absolute()) self.last_modified_date = datetime.now() @@ -92,6 +107,15 @@ class MediaActor(Base, BaseMixin): self.version = import_data['version'] self.name = import_data['name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + return item + class MediaActorFile(Base, BaseMixin): __tablename__ = 'media_actor_file' @@ -108,6 +132,15 @@ class MediaActorFile(Base, BaseMixin): self.media_actor_id = import_data['media_actor_id'] self.media_file_id = import_data['media_file_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['media_actor_id'] = self.media_actor_id + item['media_file_id'] = self.media_file_id + return item class MediaArticle(Base, BaseMixin): __tablename__ = 'media_article' @@ -124,6 +157,17 @@ class MediaArticle(Base, BaseMixin): self.title = import_data['title'] self.url = import_data['url'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['review'] = self.review + item['title'] = self.title + item['url'] = self.url + return item + class MediaVideo(Base, BaseMixin): __tablename__ = 'media_video' @@ -147,3 +191,18 @@ class MediaVideo(Base, BaseMixin): self.title = import_data['title'] self.url = import_data['url'] self.should_download = import_data['should_download'] + + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['cloud_link'] = self.cloud_link + item['file_name'] = self.file_name + item['path'] = self.path + item['review'] = self.review + item['title'] = self.title + item['url'] = self.url + item['should_download'] = self.should_download + return item diff --git a/kontor-scripts/db/models/metadata.py b/kontor-scripts/db/models/metadata.py deleted file mode 100644 index eba8281..0000000 --- a/kontor-scripts/db/models/metadata.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import Any, AnyStr, Dict -from sqlalchemy import Column, String, ForeignKey, Integer, Boolean -from sqlalchemy.orm import relationship - -from db.models.base import Base, BaseMixin - - -class MetaDataTable(Base, BaseMixin): - __tablename__ = 'meta_data_table' - table_name = Column(String, unique=True) - table_columns = relationship("MetaDataColumn") - - def __repr__(self): - return f'MetaDataTable({self.id} {self.table_name})' - - def __str__(self): - return f'{self.table_name}({self.id})' - - def import_dict(self, import_data: Dict[AnyStr, Any]): - self.id = import_data['id'] - self.created_date = import_data['created_date'] - self.last_modified_date = import_data['last_modified_date'] - self.version = import_data['version'] - self.table_name = import_data['table_name'] - - -class MetaDataColumn(Base, BaseMixin): - __tablename__ = 'meta_data_column' - column_name = Column(String, nullable=False) - column_type = Column(String) - column_order = Column(Integer) - is_shown = Column(Boolean) - column_label = Column(String) - show_filter = Column(Boolean) - filter_label = Column(String) - ref_column = Column(String, nullable=True) - table_id = Column(String, ForeignKey('meta_data_table.id')) - table = relationship("MetaDataTable", back_populates="table_columns") - - def __repr__(self): - if self.column_name is None: - return f'MetaDataColumn({self.id} {self.table.table_name}.__)' - else: - return f'MetaDataColumn({self.id} {self.table.table_name}.{self.column_name})' - - def __str__(self): - return f'{self.column_name}({self.id})' - - def import_dict(self, import_data: Dict[AnyStr, Any]): - self.id = import_data['id'] - self.created_date = import_data['created_date'] - self.last_modified_date = import_data['last_modified_date'] - self.version = import_data['version'] - self.column_name = import_data['column_name'] - self.column_type = import_data['column_type'] - self.column_order = import_data['column_order'] - self.table_id = import_data['table_id'] - self.is_shown = import_data['is_shown'] - self.column_label = import_data['column_label'] - self.show_filter = import_data['show_filter'] - self.filter_label = import_data['filter_label'] - self.ref_column = import_data['ref_column'] diff --git a/kontor-scripts/db/models/tysc.py b/kontor-scripts/db/models/tysc.py index d554d98..c9d70fc 100644 --- a/kontor-scripts/db/models/tysc.py +++ b/kontor-scripts/db/models/tysc.py @@ -24,6 +24,14 @@ class Sport(Base, BaseMixin): self.version = import_data['version'] self.name = import_data['name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + return item class Team(Base, BaseMixin): __tablename__ = "team" @@ -42,6 +50,16 @@ class Team(Base, BaseMixin): self.short_name = import_data['short_name'] self.sport_id = import_data['sport_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['short_name'] = self.short_name + item['sport_id'] = self.sport_id + return item class FieldPosition(Base, BaseMixin): __tablename__ = "field_position" @@ -64,6 +82,17 @@ class FieldPosition(Base, BaseMixin): self.short_name = import_data['short_name'] self.sport_id = import_data['sport_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['short_name'] = self.short_name + item['sport_id'] = self.sport_id + return item + class Player(Base, BaseMixin): __tablename__ = "player" @@ -85,6 +114,16 @@ class Player(Base, BaseMixin): self.first_name = import_data['first_name'] self.last_name = import_data['last_name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['first_name'] = self.first_name + item['last_name'] = self.last_name + return item + class Rooster(Base, BaseMixin): __tablename__ = "rooster" @@ -110,6 +149,18 @@ class Rooster(Base, BaseMixin): self.player_id = import_data['player_id'] self.position_id = import_data['position_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['year'] = self.year + item['team_id'] = self.team_id + item['player_id'] = self.player_id + item['position_id'] = self.position_id + return item + class Vendor(Base, BaseMixin): __tablename__ = "vendor" @@ -124,6 +175,15 @@ class Vendor(Base, BaseMixin): self.version = import_data['version'] self.name = import_data['name'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + return item + class CardSet(Base, BaseMixin): __tablename__ = "card_set" @@ -147,6 +207,18 @@ class CardSet(Base, BaseMixin): self.insert_set = import_data['insert_set'] self.vendor_id = import_data['vendor_id'] + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['name'] = self.name + item['parallel_set'] = self.parallel_set + item['insert_set'] = self.insert_set + item['vendor_id'] = self.vendor_id + return item + class Card(Base, BaseMixin): __tablename__ = "card" @@ -172,3 +244,16 @@ class Card(Base, BaseMixin): self.card_set_id = import_data['card_set_id'] self.rooster_id = import_data['rooster_id'] self.vendor_id = import_data['vendor_id'] + + def export_dict(self) -> Dict[AnyStr, Any]: + item: Dict[AnyStr, Any] = {} + item['id'] = self.id + item['created_date'] = str(self.created_date) + item['last_modified_date'] = str(self.last_modified_date) + item['version'] = self.version + item['card_number'] = self.card_number + item['year'] = self.year + item['card_set_id'] = self.card_set_id + item['rooster_id'] = self.rooster_id + item['vendor_id'] = self.vendor_id + return item diff --git a/kontor-scripts/db/repository/metadata.py b/kontor-scripts/db/repository/metadata.py deleted file mode 100644 index 0e0558b..0000000 --- a/kontor-scripts/db/repository/metadata.py +++ /dev/null @@ -1,28 +0,0 @@ - -from typing import List -from sqlalchemy.orm import Session - -from db.models.metadata import MetaDataColumn, MetaDataTable -from db.schemas.metadata import MetaDataTableResponse, MetaDataColumnResponse - - -def get_tables(db: Session) -> List[MetaDataTableResponse]: - tables = db.query(MetaDataTable).all() - results: List[MetaDataTableResponse] = [MetaDataTableResponse(id=table.id, name=table.table_name) for table in tables] - return results - - -def get_columns_for_table(db: Session, table: MetaDataTableResponse)-> List[MetaDataColumnResponse]: - columns = db.query(MetaDataColumn).filter_by(table_id = table.id).all() - results: List[MetaDataColumnResponse] = [] - for column in columns: - result: MetaDataColumnResponse = MetaDataColumnResponse( - id=str(column.id), - name=column.column_name, - label=column.column_label, - order=column.column_order, - ref_column=column.ref_column, - column_type=column.column_type) - results.append(result) - return results - diff --git a/kontor-scripts/db/schemas/metadata.py b/kontor-scripts/db/schemas/metadata.py deleted file mode 100644 index cdc1051..0000000 --- a/kontor-scripts/db/schemas/metadata.py +++ /dev/null @@ -1,15 +0,0 @@ -from pydantic import BaseModel, PositiveInt - - -class MetaDataTableResponse(BaseModel): - id: str - name: str - - -class MetaDataColumnResponse(BaseModel): - id: str - name: str - label: str | None - order: PositiveInt - ref_column: str | None - column_type: str diff --git a/kontor-scripts/export.py b/kontor-scripts/export.py index e5a0f09..8e7c006 100644 --- a/kontor-scripts/export.py +++ b/kontor-scripts/export.py @@ -12,7 +12,6 @@ from pathlib import Path from db.models import registry from db.models.base import Base from config import get_logger -from db.repository.metadata import get_tables, get_columns_for_table parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument('--verbose', '-v', action='count', default=0) @@ -40,31 +39,23 @@ if __name__ == '__main__': __session__ = sessionmaker(bind=engine) with __session__() as db: data = {} - tables = get_tables(db) + tables = registry.keys() for table in tables: # logger.info(f"Table {table.name} with {table.id}") - columns = get_columns_for_table(db, table) - model = registry[table.name] + model = registry[table] rows = db.query(model).all() entries = [] for row in rows: - entry = {} - for column in columns: - # logger.info(f" Column {column.order} {column.name} with {column.id}") - try: - value = getattr(row, column.name) - if isinstance(value, datetime): - entry[column.name] = str(value) - else: - entry[column.name] = value - except AttributeError as error: - logger.info(f"{error}") + entry = row.export_dict() entries.append(entry) - data[table.name] = entries - logger.info(f"{table.name}: {len(entries)} exported") - json_dump = json.dumps(data, indent=4) - with open(args.file, "w") as dump_file: - dump_file.write(json_dump) + data[table] = entries + logger.info(f"{table}: {len(entries)} exported") + try: + json_dump = json.dumps(data, indent=4) + with open(args.file, "w") as dump_file: + dump_file.write(json_dump) + except TypeError as error: + logger.info(f"{error}") logger.info(f"{len(data)} tables exported") #kontor_db = KontorDB(engine, logger) #kontor_db.export_db(ExportType.JSON, args.file) diff --git a/kontor-scripts/import.py b/kontor-scripts/import.py index 5950547..d34121b 100644 --- a/kontor-scripts/import.py +++ b/kontor-scripts/import.py @@ -3,6 +3,7 @@ import data from json file to PostgreSQL """ from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter +from datetime import datetime from typing import Any, AnyStr, Dict, List import os import json @@ -61,7 +62,14 @@ def get_ids(items: List[Any]) -> List[AnyStr]: def update_item(db: Session, import_data: Dict[AnyStr, Any], item: Any, dry_run: bool, log): for (key, value) in import_data.items(): existing_value = getattr(item, str(key)) - if existing_value != value: + update: bool = False + if isinstance(existing_value, datetime): + if str(existing_value) != str(value): + update = True + else: + if existing_value != value: + update = True + if update: if not dry_run: log.debug(f"update {key}({existing_value}) with {value}") setattr(item, str(key), value) diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/AdminConstants.java b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/AdminConstants.java index a3ef2ff..9490d74 100644 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/AdminConstants.java +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/AdminConstants.java @@ -49,7 +49,6 @@ public class AdminConstants { data.addItem(new SideNavItem(MediaConstants.MEDIAACTORFILE, MediaActorFileView.class)); data.addItem(new SideNavItem(AUTHORIZATION, AssignmentView.class)); data.addItem(new SideNavItem("Data Import", ModuleDataView.class)); - data.addItem(new SideNavItem("Meta Data", MetaDataView.class)); administration.addItem(data); return administration; } diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java index 81d0773..47ffacf 100644 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java @@ -3,13 +3,10 @@ package de.thpeetz.kontor.admin; import de.thpeetz.kontor.admin.data.Permission; import de.thpeetz.kontor.admin.data.Profile; import de.thpeetz.kontor.admin.data.Assignment; -import de.thpeetz.kontor.admin.data.MetaDataTable; import de.thpeetz.kontor.admin.repository.AssignmentRepository; import de.thpeetz.kontor.admin.repository.ProfileRepository; import de.thpeetz.kontor.admin.repository.MailAccountRepository; - import de.thpeetz.kontor.admin.services.AdminService; -import de.thpeetz.kontor.admin.services.MetaDataService; import de.thpeetz.kontor.mailclient.data.MailAccount; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -44,9 +41,6 @@ public class SetupModuleAdmin implements ApplicationListener tableColumns = new LinkedList<>(); - - public String updateTableName(String value) { - if (!this.getTableName().equals(value)) { - this.setTableName(value); - log.info("update tableName"); - return "updated " + this.getId() + " with " + value; - } - return "no changes for " + this.getId(); - } -} diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/repository/MetaDataColumnRepository.java b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/repository/MetaDataColumnRepository.java deleted file mode 100644 index 7f0af9a..0000000 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/repository/MetaDataColumnRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.thpeetz.kontor.admin.repository; - -import de.thpeetz.kontor.admin.data.MetaDataColumn; -import de.thpeetz.kontor.admin.data.MetaDataTable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface MetaDataColumnRepository extends JpaRepository { - - List findByTable(MetaDataTable table); - - List findByTableAndColumnName(MetaDataTable table, String column_name); - - @Query("select m from MetaDataColumn m " + - "where lower(m.columnName) like lower(concat('%', :searchTerm, '%')) or lower(m.columnLabel) like lower(concat('%', :searchTerm, '%'))") - List search(@Param("searchTerm") String searchTerm); -} diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/repository/MetaDataTableRepository.java b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/repository/MetaDataTableRepository.java deleted file mode 100644 index 4e31cb4..0000000 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/repository/MetaDataTableRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.thpeetz.kontor.admin.repository; - -import de.thpeetz.kontor.admin.data.MetaDataTable; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MetaDataTableRepository extends JpaRepository { - - MetaDataTable findByTableName(String tableName); -} diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/services/MetaDataService.java b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/services/MetaDataService.java deleted file mode 100644 index e8a8ee6..0000000 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/services/MetaDataService.java +++ /dev/null @@ -1,245 +0,0 @@ -package de.thpeetz.kontor.admin.services; - -import org.springframework.stereotype.Service; - -import de.thpeetz.kontor.admin.data.MetaDataColumn; -import de.thpeetz.kontor.admin.repository.MetaDataColumnRepository; -import de.thpeetz.kontor.admin.data.MetaDataTable; -import de.thpeetz.kontor.admin.repository.MetaDataTableRepository; -import lombok.extern.slf4j.Slf4j; - -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicReference; - -@Slf4j -@Service -public class MetaDataService { - - private final MetaDataTableRepository metaDataTableRepository; - - private final MetaDataColumnRepository metaDataColumnRepository; - - public MetaDataService(MetaDataTableRepository metaDataTableRepository, MetaDataColumnRepository metaDataColumnRepository) { - this.metaDataTableRepository = metaDataTableRepository; - this.metaDataColumnRepository = metaDataColumnRepository; - } - - public List findAllTables() { - return metaDataTableRepository.findAll(); - } - - public MetaDataTable getTable(String tableName) { - MetaDataTable table = metaDataTableRepository.findByTableName(tableName); - if (table == null) { - log.info("Metadata for table {} not found, will create it", tableName); - table = new MetaDataTable(); - table.setTableName(tableName); - metaDataTableRepository.save(table); - } - return table; - } - - private void deleteTable(MetaDataTable metaDataTable) { - List columns = metaDataTable.getTableColumns(); - List columnsToDelete = new LinkedList<>(); - for (MetaDataColumn column: columns) { - try { - columnsToDelete.add(column); - metaDataColumnRepository.delete(column); - } catch (Exception e) { - log.info("Exception {} thrown, just go on", e.getMessage()); - } - } - for (MetaDataColumn column: columnsToDelete) { - metaDataTable.getTableColumns().remove(column); - } - try { - metaDataTableRepository.delete(metaDataTable); - } catch (Exception e) { - log.info("could not delete MetaDataTable: {}", e.getMessage()); - } - } - - public void getColumn(MetaDataTable table, String columnName, String columnType, Integer columnOrder, Boolean isShown, String columnLabel, Boolean showFilter, String filterLabel) { - this.getColumn(table, columnName, columnType, columnOrder, isShown, columnLabel, showFilter, filterLabel, null); - } - - public void checkColumnValues(MetaDataTable table, MetaDataColumn column, String columnName, String columnType, Integer columnOrder, Boolean isShown, String columnLabel, Boolean showFilter, String filterLabel, String refColumn) { - log.debug("Column {} with name {} of table {} found, check Values", columnOrder, columnName, table.getTableName()); - if (!column.getColumnName().equals(columnName)) { - log.debug("columnName has to be changed to {}", columnName); - column.setColumnName(columnName); - } - if (!column.getColumnType().equals(columnType)) { - log.debug("columnType has to be changed to {}", columnType); - column.setColumnType(columnType); - } - if (isShown != null && !isShown.equals(column.getIsShown())) { - log.debug("isShown has to be change to {}}", isShown); - column.setIsShown(isShown); - } - if (columnLabel != null && !columnLabel.equals(column.getColumnLabel())) { - log.debug("columnLabel has to be change to {}}", columnLabel); - column.setColumnLabel(columnLabel); - } - if (showFilter != null &&!showFilter.equals(column.getShowFilter())) { - log.debug("showFilter has to be change to {}}", showFilter); - column.setShowFilter(showFilter); - } - if (filterLabel != null && !filterLabel.equals(column.getFilterLabel())) { - log.debug("filterLabel has to be change to {}}", filterLabel); - column.setFilterLabel(filterLabel); - } - if (refColumn != null && !refColumn.equals(column.getRefColumn())) { - log.debug("refColumn has to be change to {}}", filterLabel); - column.setRefColumn(refColumn); - } - saveMetaDataColumn(column); - } - - public void getColumn(MetaDataTable table, String columnName, String columnType, Integer columnOrder, Boolean isShown, String columnLabel, Boolean showFilter, String filterLabel, String refColumn) { - log.info("check if column {} of table {} exists", columnName, table.getTableName()); - boolean columnNameExists = table.getTableColumns().stream().anyMatch(column -> column.getColumnName().equals(columnName)); - boolean columnOrderExists = false; - if (table.getTableColumns().size() > columnOrder-1) { - columnOrderExists = table.getTableColumns().get(columnOrder-1) != null; - } - List metaDataColumns = metaDataColumnRepository.findByTableAndColumnName(table, columnName); - log.debug("column found: name: {}, order: {}: table.columns: {}", columnNameExists, columnOrderExists, metaDataColumns); - if (columnOrderExists) { - MetaDataColumn column = table.getTableColumns().get(columnOrder-1); - checkColumnValues(table, column, columnName, columnType, columnOrder, isShown, columnLabel, showFilter, filterLabel, refColumn); - } else { - log.info("Column {} of table {} not found, will create it", columnName, table.getTableName()); - addColumn(table, columnName, columnType, columnOrder, isShown, refColumn); - } - } - - private void addColumn(MetaDataTable table, String columnName, String columnType, Integer columnOrder, Boolean isShown, String refColumn) { - MetaDataColumn column = new MetaDataColumn(); - column.setTable(table); - column.setColumnName(columnName); - column.setColumnType(columnType); - column.setColumnOrder(columnOrder); - column.setIsShown(isShown); - column.setRefColumn(refColumn); - saveMetaDataColumn(column); - } - - public List findAllMetaDataColumns(String stringFilter) { - if (stringFilter == null || stringFilter.isEmpty()) { - log.debug("Found " + metaDataColumnRepository.count()+ " entries"); - return metaDataColumnRepository.findAll(); - } else { - List results = metaDataColumnRepository.search(stringFilter); - log.debug("Found " + results.size() + " entries"); - return results; - } - } - - public void deleteMetaDataColumn(MetaDataColumn metaDataColumn) { - if (metaDataColumn == null) { - log.warn("MetaDataColumn is null, can't delete it"); - return; - } - log.debug("deleteMetaDataColumn: MetaDataColumn={}", metaDataColumn); - metaDataColumnRepository.delete(metaDataColumn); - } - - public void saveMetaDataColumn(MetaDataColumn metaDataColumn) { - if (metaDataColumn == null) { - log.warn("MetaDataColumn is null, can't save it"); - return; - } - log.debug("saveMetaDataColumn: MetaDataColumn={}", metaDataColumn); - metaDataColumnRepository.save(metaDataColumn); - } - - public String importTableData(Map fields) { - AtomicReference status = new AtomicReference<>("unknown"); - String id = fields.get("id"); - Optional optional = metaDataTableRepository.findById(id); - if (optional.isEmpty()) { - log.info(" not found: {} with {}", id, fields); - status.set(id + "not found"); - MetaDataTable checkExisting = metaDataTableRepository.findByTableName(fields.get("table_name")); - if (checkExisting != null) { - log.info("entry already there with different id ({}), will be deleted", checkExisting.getId()); - deleteTable(checkExisting); - } - MetaDataTable metaDataTable = new MetaDataTable(); - metaDataTable.setId(id); - metaDataTable.setTableName(fields.get("table_name")); - metaDataTableRepository.save(metaDataTable); - } else { - optional.ifPresent( entry -> { - log.info(" found: {}", entry.getTableName()); - String updateStatus = updateTableFields(entry, fields); - metaDataTableRepository.save(entry); - status.set(updateStatus); - }); - } - return status.get(); - } - - public String importColumnData(String tableName, Map fields) { - AtomicReference status = new AtomicReference<>("unknown"); - String id = fields.get("id"); - Optional optional = metaDataColumnRepository.findById(id); - if (optional.isEmpty()) { - log.info(" not found: {} with {}", id, fields); - status.set(id + "not found"); - MetaDataColumn metaDataColumn = new MetaDataColumn(); - metaDataColumn.setId(id); - metaDataColumn.setColumnName(fields.get("column_name")); - metaDataColumn.setColumnType(fields.get("column_type")); - metaDataColumnRepository.save(metaDataColumn); - } else { - optional.ifPresent( entry -> { - log.info(" found: {}", entry.getTableName()); - String updateStatus = updateColumnFields(entry, tableName, fields); - metaDataColumnRepository.save(entry); - status.set(updateStatus); - }); - } - return status.get(); - } - - private String updateColumnFields(MetaDataColumn metaDataColumn, String tableName, Map fields) { - StringBuilder status = new StringBuilder(); - for (Map.Entry entry : fields.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - switch (key) { - case "id", "created_date", "last_modified_date", "version": - break; - case "column_name": - status.append(metaDataColumn.updateColumnName(value)); - break; - default: - log.info("field {} is unknown for table {}", key, tableName); - } - } - return status.toString(); - } - - private String updateTableFields(MetaDataTable metaDataTable, Map fields) { - String status = ""; - for (Map.Entry entry : fields.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - switch (key) { - case "id", "created_date", "last_modified_date", "version": - break; - case "table_name": - status += metaDataTable.updateTableName(value); - default: - log.info("field {} is unknown for table {}", key, MetaDataTable.class.getName()); - } - } - return status; - } -} diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/views/MetaDataForm.java b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/views/MetaDataForm.java deleted file mode 100644 index 8735b4e..0000000 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/views/MetaDataForm.java +++ /dev/null @@ -1,120 +0,0 @@ -package de.thpeetz.kontor.admin.views; - -import com.vaadin.flow.component.ComponentEvent; -import com.vaadin.flow.component.ComponentEventListener; -import com.vaadin.flow.component.Key; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.button.ButtonVariant; -import com.vaadin.flow.component.checkbox.Checkbox; -import com.vaadin.flow.component.combobox.ComboBox; -import com.vaadin.flow.component.formlayout.FormLayout; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.textfield.IntegerField; -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.admin.data.MetaDataColumn; -import de.thpeetz.kontor.admin.data.MetaDataTable; -import lombok.*; - -import java.util.List; - -public class MetaDataForm extends FormLayout { - - ComboBox table = new ComboBox<>("Table"); - TextField columnName = new TextField("Column Name"); - IntegerField columnOrder = new IntegerField("Column Order"); - Checkbox isShown = new Checkbox("Is Shown"); - TextField columnLabel = new TextField("Column Label"); - Checkbox showFilter = new Checkbox("Show Filter"); - TextField filterLabel = new TextField("Filter Label"); - TextField refColumn = new TextField("Ref Column"); - - Button save = new com.vaadin.flow.component.button.Button("Save"); - Button delete = new com.vaadin.flow.component.button.Button("Delete"); - Button close = new Button("Cancel"); - - Binder binder = new BeanValidationBinder<>(MetaDataColumn.class); - - public MetaDataForm(List tables) { - addClassName("metaData-form"); - binder.bindInstanceFields(this); - - table.setItems(tables); - table.setItemLabelGenerator(MetaDataTable::getTableName); - add(table, columnName, columnOrder); - add(isShown, columnLabel); - isShown.addClickListener(click -> columnLabel.setEnabled(isShown.getValue())); - add(showFilter, filterLabel); - showFilter.addClickListener(click -> filterLabel.setEnabled(showFilter.getValue())); - add(refColumn); - add(createButtonsLayout()); - } - - private HorizontalLayout createButtonsLayout() { - save.addThemeVariants(ButtonVariant.LUMO_PRIMARY); - delete.addThemeVariants(ButtonVariant.LUMO_ERROR); - close.addThemeVariants(ButtonVariant.LUMO_TERTIARY); - - save.addClickShortcut(Key.ENTER); - close.addClickShortcut(Key.ESCAPE); - - save.addClickListener(event -> validateAndSave()); - delete.addClickListener(event -> fireEvent(new MetaDataForm.DeleteEvent(this, binder.getBean()))); - close.addClickListener(event -> fireEvent(new MetaDataForm.CloseEvent(this))); - - binder.addStatusChangeListener(e -> save.setEnabled(binder.isValid())); - return new HorizontalLayout(save, delete, close); - } - - private void validateAndSave() { - if (binder.isValid()) { - fireEvent(new MetaDataForm.SaveEvent(this, binder.getBean())); - } - } - - public void setMetaDataColumn(MetaDataColumn metaDataColumn) { - binder.setBean(metaDataColumn); - } - - @Getter - public abstract static class MetaDataFormEvent extends ComponentEvent { - private final MetaDataColumn metaDataColumn; - - protected MetaDataFormEvent(MetaDataForm source, MetaDataColumn metaDataColumn) { - super(source, false); - this.metaDataColumn = metaDataColumn; - } - - } - - public static class SaveEvent extends MetaDataForm.MetaDataFormEvent { - SaveEvent(MetaDataForm source, MetaDataColumn metaDataColumn) { - super(source, metaDataColumn); - } - } - - public static class DeleteEvent extends MetaDataForm.MetaDataFormEvent { - DeleteEvent(MetaDataForm source, MetaDataColumn metaDataColumn) { - super(source, metaDataColumn); - } - } - - public static class CloseEvent extends MetaDataForm.MetaDataFormEvent { - CloseEvent(MetaDataForm source) { - super(source, null); - } - } - - public void addDeleteListener(ComponentEventListener listener) { - addListener(MetaDataForm.DeleteEvent.class, listener); - } - - public void addSaveListener(ComponentEventListener listener) { - addListener(MetaDataForm.SaveEvent.class, listener); - } - - public void addCloseListener(ComponentEventListener listener) { - addListener(MetaDataForm.CloseEvent.class, listener); - } -} diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/views/MetaDataView.java b/kontor-spring/src/main/java/de/thpeetz/kontor/admin/views/MetaDataView.java deleted file mode 100644 index 148bace..0000000 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/admin/views/MetaDataView.java +++ /dev/null @@ -1,185 +0,0 @@ -package de.thpeetz.kontor.admin.views; - -import com.vaadin.flow.component.Component; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.button.ButtonVariant; -import com.vaadin.flow.component.grid.Grid; -import com.vaadin.flow.component.grid.GridSortOrder; -import com.vaadin.flow.component.icon.Icon; -import com.vaadin.flow.component.icon.VaadinIcon; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.component.textfield.TextField; -import com.vaadin.flow.data.provider.SortDirection; -import com.vaadin.flow.data.value.ValueChangeMode; -import com.vaadin.flow.router.PageTitle; -import com.vaadin.flow.router.Route; -import com.vaadin.flow.spring.annotation.SpringComponent; -import de.thpeetz.kontor.admin.AdminConstants; -import de.thpeetz.kontor.admin.data.MetaDataColumn; -import de.thpeetz.kontor.admin.services.MetaDataService; -import de.thpeetz.kontor.common.views.MainLayout; -import de.thpeetz.kontor.common.views.ColumnToggleContextMenu; -import de.thpeetz.kontor.common.views.StatusIcon; -import jakarta.annotation.security.RolesAllowed; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Scope; - -import java.util.ArrayList; -import java.util.List; - -@Slf4j -@SpringComponent -@Scope("prototype") -@RolesAllowed("ROLE_ADMIN") -@Route(value = AdminConstants.METADATA_ROUTE, layout = MainLayout.class) -@PageTitle("Meta Data | Admin | Kontor") -public class MetaDataView extends VerticalLayout { - - Grid grid = new Grid<>(MetaDataColumn.class, false); - Grid.Column idColumn = grid.addColumn(MetaDataColumn::getId) - .setHeader("ID").setResizable(true).setSortable(true); - Grid.Column createdColumn = grid.addColumn(MetaDataColumn::getCreatedDate) - .setHeader("Erstellt").setResizable(true).setSortable(true); - Grid.Column modifiedColumn = grid.addColumn(MetaDataColumn::getLastModifiedDate) - .setHeader("GeƤndert").setResizable(true).setSortable(true); - Grid.Column versionColumn = grid.addColumn(MetaDataColumn::getVersion) - .setHeader("Version").setResizable(true).setSortable(true); - Grid.Column tableColumn = grid.addColumn(MetaDataColumn::getTableName) - .setHeader("Table").setResizable(true).setSortable(true); - Grid.Column columnNameColumn = grid.addColumn(MetaDataColumn::getColumnName) - .setHeader("Column Name").setResizable(true).setSortable(true); - Grid.Column columnTypeColumn = grid.addColumn(MetaDataColumn::getColumnType) - .setHeader("Column Type").setResizable(true).setSortable(true); - Grid.Column columnOrderColumn = grid.addColumn(MetaDataColumn::getColumnOrder) - .setHeader("Column Order").setResizable(true).setSortable(true); - Grid.Column isShownColumn = grid.addComponentColumn(metaDataColumn -> StatusIcon.create(metaDataColumn.getIsShown())). - setHeader("Anzeige?").setWidth("6rem").setSortable(true); - Grid.Column columnLabelColumn = grid.addColumn(MetaDataColumn::getColumnLabel) - .setHeader("Spaltenname").setResizable(true).setSortable(true); - Grid.Column showFilterColumn = grid.addComponentColumn(metaDataColumn -> StatusIcon.create(metaDataColumn.getShowFilter())). - setHeader("Zeige Filter").setWidth("6rem").setSortable(true); - Grid.Column filterLabelColumn = grid.addColumn(MetaDataColumn::getFilterLabel) - .setHeader("Filter Name").setResizable(true).setSortable(true); - Grid.Column refColumnColumn = grid.addColumn(MetaDataColumn::getRefColumn) - .setHeader("Ref Column Name").setResizable(true).setSortable(true); - TextField searchField = new TextField(); - @Getter - MetaDataForm form; - MetaDataService service; - - public MetaDataView(MetaDataService service) { - this.service = service; - addClassName("metadata-view"); - setSizeFull(); - configureGrid(); - configureForm(); - - add(getToolbar(), getContent()); - updateList(); - } - - private void configureGrid() { - grid.addClassName("metadata-grid"); - grid.setSizeFull(); - grid.getColumns().forEach(col -> col.setAutoWidth(true)); - idColumn.setVisible(false); - createdColumn.setVisible(false); - modifiedColumn.setVisible(false); - versionColumn.setVisible(false); - grid.setMultiSort(true); - List> sortOrder = new ArrayList<>(); - sortOrder.add(new GridSortOrder(tableColumn, SortDirection.ASCENDING)); - sortOrder.add(new GridSortOrder(columnOrderColumn, SortDirection.ASCENDING)); - grid.sort(sortOrder); - grid.asSingleSelect().addValueChangeListener(event -> editMetaData(event.getValue())); - } - - private void configureForm() { - form = new MetaDataForm(service.findAllTables()); - form.setWidth("25em"); - form.setVisible(false); - form.addSaveListener(this::saveMetaData); - form.addDeleteListener(this::deleteMetaData); - form.addCloseListener(e -> closeEditor()); - } - - private Component getContent() { - HorizontalLayout content = new HorizontalLayout(grid, form); - content.setFlexGrow(2, grid); - content.setFlexGrow(1, form); - content.addClassName("content"); - content.setSizeFull(); - return content; - } - - private HorizontalLayout getToolbar() { - searchField.setPlaceholder("Search"); - searchField.setClearButtonVisible(true); - searchField.setPrefixComponent(new Icon(VaadinIcon.SEARCH)); - searchField.setValueChangeMode(ValueChangeMode.EAGER); - searchField.addValueChangeListener(e -> updateList()); - - Button addMetaDataButton = new Button("Add Meta Data"); - addMetaDataButton.addClickListener(click -> addMetaDataColumn()); - - Button menuButton = new Button("Show/Hide Columns"); - menuButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY); - ColumnToggleContextMenu columnToggleContextMenu = new ColumnToggleContextMenu<>(menuButton); - columnToggleContextMenu.addColumnToggleItem(idColumn); - columnToggleContextMenu.addColumnToggleItem(createdColumn); - columnToggleContextMenu.addColumnToggleItem(modifiedColumn); - columnToggleContextMenu.addColumnToggleItem(versionColumn); - columnToggleContextMenu.addColumnToggleItem(tableColumn); - columnToggleContextMenu.addColumnToggleItem(columnNameColumn); - columnToggleContextMenu.addColumnToggleItem(columnTypeColumn); - columnToggleContextMenu.addColumnToggleItem(columnOrderColumn); - columnToggleContextMenu.addColumnToggleItem(isShownColumn); - columnToggleContextMenu.addColumnToggleItem(columnLabelColumn); - columnToggleContextMenu.addColumnToggleItem(showFilterColumn); - columnToggleContextMenu.addColumnToggleItem(filterLabelColumn); - columnToggleContextMenu.addColumnToggleItem(refColumnColumn); - HorizontalLayout toolbar = new HorizontalLayout(searchField, addMetaDataButton, menuButton); - toolbar.addClassName("toolbar"); - return toolbar; - } - - private void saveMetaData(MetaDataForm.SaveEvent event) { - MetaDataColumn metaDataColumn = event.getMetaDataColumn(); - service.saveMetaDataColumn(metaDataColumn); - updateList(); - closeEditor(); - } - - private void deleteMetaData(MetaDataForm.DeleteEvent event) { - service.deleteMetaDataColumn(event.getMetaDataColumn()); - updateList(); - closeEditor(); - } - - public void editMetaData(MetaDataColumn metaDataColumn) { - if (metaDataColumn == null) { - closeEditor(); - } else { - form.setMetaDataColumn(metaDataColumn); - form.setVisible(true); - addClassName("editing"); - } - } - - public void closeEditor() { - form.setMetaDataColumn(null); - form.setVisible(false); - removeClassName("editing"); - } - - private void addMetaDataColumn() { - grid.asSingleSelect().clear(); - editMetaData(new MetaDataColumn()); - } - - private void updateList() { - grid.setItems(service.findAllMetaDataColumns(searchField.getValue())); - } -} diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/data/services/DataManagementService.java b/kontor-spring/src/main/java/de/thpeetz/kontor/data/services/DataManagementService.java index 4b950ac..e9df180 100644 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/data/services/DataManagementService.java +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/data/services/DataManagementService.java @@ -1,24 +1,17 @@ package de.thpeetz.kontor.data.services; -import de.thpeetz.kontor.admin.data.MetaDataTable; -import de.thpeetz.kontor.admin.repository.MetaDataTableRepository; -import de.thpeetz.kontor.admin.services.MetaDataService; import de.thpeetz.kontor.tysc.services.SportService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Map; -import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; @Slf4j @Service public class DataManagementService { - @Autowired - MetaDataService metaDataService; - @Autowired SportService sportService; @@ -29,12 +22,6 @@ public class DataManagementService { public String getEntry(String nodeName, Map fields) { AtomicReference status = new AtomicReference<>("unknown"); switch (nodeName) { - case "meta_data_table": - status.set(metaDataService.importTableData(fields)); - break; - case "meta_data_column": - status.set(metaDataService.importColumnData(nodeName, fields)); - break; case "sport": status.set(sportService.importData(fields)); default: