diff --git a/back/app/core/models.py b/back/app/core/models.py new file mode 100644 index 00000000..b292bcea --- /dev/null +++ b/back/app/core/models.py @@ -0,0 +1,34 @@ +from datetime import datetime + +from beanie import Document +from pydantic import Field, validator + + +class CrudDocument(Document): + _id: str + created_at: datetime = Field(default=datetime.utcnow(), nullable=False) + updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False) + + @validator("label", always=True, check_fields=False) + def generate_label(cls, v, values, **kwargs): + return v + + class Settings: + fulltext_search = [] + + +def text_area(*args, **kwargs): + kwargs['widget'] = { + "formlyConfig": { + "type": "textarea", + "props": { + "placeholder": "Leaving this field empty will cause formData property to be `null`", + "rows": kwargs['size'] if 'size' in kwargs else 10 + } + } + } + + return Field(*args, **kwargs) + + + diff --git a/back/app/core/routes.py b/back/app/core/routes.py index 7d89e4a4..bb8bb826 100644 --- a/back/app/core/routes.py +++ b/back/app/core/routes.py @@ -1,5 +1,5 @@ from beanie import PydanticObjectId -from beanie.operators import And, Or, RegEx, Eq +from beanie.operators import And, RegEx, Eq from fastapi import APIRouter, HTTPException from fastapi_paginate import Page, Params, add_pagination @@ -18,6 +18,10 @@ def parse_sort(sort_by): return fields +def Or(filters): + return {'$or': filters} + + def parse_query(query: str, model): if query is None: return {} @@ -40,7 +44,10 @@ def parse_query(query: str, model): and_array.append(operand) - return And(and_array) if len(and_array) > 1 else and_array[0] + if and_array: + return And(and_array) if len(and_array) > 1 else and_array[0] + else: + return {} def get_crud_router(model, model_create, model_read, model_update): diff --git a/back/app/entity/models.py b/back/app/entity/models.py index ff811bb4..25a5261c 100644 --- a/back/app/entity/models.py +++ b/back/app/entity/models.py @@ -1,11 +1,13 @@ from enum import Enum -from datetime import datetime, date +from datetime import date, datetime from typing import List, Literal, Optional from pymongo import TEXT, IndexModel from pydantic import Field, BaseModel, validator from beanie import Document, Indexed +from ..core.models import CrudDocument + class EntityType(BaseModel): @property @@ -55,11 +57,10 @@ class Institution(EntityType): employees: List[Employee] = Field(default=[]) -class Entity(Document): - _id: str +class Entity(CrudDocument): entity_data: Individual | Corporation | Institution = Field(..., discriminator='type') - address: Optional[str] = "" label: str = None + address: Optional[str] = "" @validator("label", always=True) def generate_label(cls, v, values, **kwargs): @@ -67,16 +68,11 @@ class Entity(Document): return v return values['entity_data'].label - created_at: datetime = Field(default=datetime.utcnow(), nullable=False) - updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False) - - class Settings: - bson_encoders = { - date: lambda dt: dt if hasattr(dt, 'hour') - else datetime(year=dt.year, month=dt.month, day=dt.day, - hour=0, minute=0, second=0) - } - + class Settings(CrudDocument.Settings): fulltext_search = ['label'] - + bson_encoders = { + date: lambda dt: dt if hasattr(dt, 'hour') + else datetime(year=dt.year, month=dt.month, day=dt.day, + hour=0, minute=0, second=0) + } diff --git a/front/app/src/common/crud/list/list.component.ts b/front/app/src/common/crud/list/list.component.ts index 564dbc2c..7783b8d2 100644 --- a/front/app/src/common/crud/list/list.component.ts +++ b/front/app/src/common/crud/list/list.component.ts @@ -100,7 +100,7 @@ export class ListComponent implements OnInit { } onSelect(id: string) { - this.router.navigate([id], {relativeTo: this.route}); + this.router.navigate([`../${id}`], {relativeTo: this.route}); } get listData$() { diff --git a/front/app/src/common/crud/types/foreignkey.type.ts b/front/app/src/common/crud/types/foreignkey.type.ts index d8cd271b..90819474 100644 --- a/front/app/src/common/crud/types/foreignkey.type.ts +++ b/front/app/src/common/crud/types/foreignkey.type.ts @@ -31,7 +31,7 @@ import {formatDate} from "@angular/common"; [resultFormatter]="formatter" [editable]="false" />
- +
@@ -142,11 +142,11 @@ export class ForeignkeyTypeComponent extends FieldType implemen } hasValue() { - return this.formControl.value !== undefined; + return this.formControl.value !== undefined && this.formControl.value !== null; } add(modal: any) { - this.modalService.open(modal); + this.modalService.open(modal, { size: 'xl' }); } onResourceCreated(resource_id: string) { @@ -155,7 +155,7 @@ export class ForeignkeyTypeComponent extends FieldType implemen } see(modal: any) { - this.modalService.open(modal); + this.modalService.open(modal, { size: 'xl' }); } onResourceDeleted(resource_id: string) {