Skip to content

Commit

Permalink
custom field value
Browse files Browse the repository at this point in the history
  • Loading branch information
ciur committed Oct 7, 2024
1 parent 55347e3 commit e4bb470
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 12 deletions.
9 changes: 7 additions & 2 deletions papermerge/core/db/doc.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import uuid
from datetime import datetime
from uuid import UUID

from sqlalchemy import Engine, select
Expand Down Expand Up @@ -108,8 +109,12 @@ def update_document_custom_field_values(
}
attr_name = CUSTOM_FIELD_DATA_TYPE_MAP.get(found.data_type.value, None)
if attr_name:
_dic[f"value_{attr_name}"] = incoming_cf.value

if attr_name == "date":
_dic[f"value_{attr_name}"] = datetime.strptime(
incoming_cf.value, "%d.%m.%Y"
)
else:
_dic[f"value_{attr_name}"] = incoming_cf.value
cfv = CustomFieldValue(
id=uuid.uuid4(),
field_id=incoming_cf.custom_field_id,
Expand Down
1 change: 1 addition & 0 deletions papermerge/core/routers/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ def update_document_custom_fields(
)
except NoResultFound:
raise HTTPException(status_code=404, detail="Document not found")

return doc


Expand Down
14 changes: 14 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,17 @@ def document_type_with_two_integer_cf(
custom_field_ids=[cf1.id, cf2.id],
user_id=user.id,
)


@pytest.fixture
def document_type_with_one_date_cf( # cf = custom field
db_session: Session, user: User, make_custom_field
):
cf1 = make_custom_field(name="date-name1", data_type=CustomFieldType.date)

return db.create_document_type(
db_session,
name="document_type_with_one_date_cf",
custom_field_ids=[cf1.id],
user_id=user.id,
)
37 changes: 37 additions & 0 deletions tests/core/models/test_document.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,3 +257,40 @@ def test_document_update_custom_field_values(
)
# two custom field values were created
assert len(total_cfv_after) == 2


@pytest.mark.django_db(transaction=True)
def test_document_update_custom_field_value_of_type_date(
db_session: Session,
user: User,
document: Document,
document_type_with_one_date_cf: schemas.DocumentType,
):
"""
Custom field of type `date` is set to string "28.10.2024"
"""
total_cfv_after = db.get_document_custom_field_values(
db_session, id=document.id, user_id=user.id
)
assert len(total_cfv_after) == 0

dtype = document_type_with_one_date_cf
cf_update = {
"document_type_id": dtype.id,
"custom_fields": [
{"custom_field_id": dtype.custom_fields[0].id, "value": "28.10.2024"},
],
}
custom_fields_update = schemas.DocumentCustomFieldsUpdate(**cf_update)
db.update_document_custom_field_values(
db_session,
id=document.id,
custom_fields_update=custom_fields_update,
user_id=user.id,
)

total_cfv_after = db.get_document_custom_field_values(
db_session, id=document.id, user_id=user.id
)
# one custom field value was created
assert len(total_cfv_after) == 1
22 changes: 21 additions & 1 deletion ui2/src/features/document/apiSlice.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {RootState} from "@/app/types"
import {ONE_DAY_IN_SECONDS} from "@/cconstants"
import {apiSlice} from "@/features/api/slice"
import type {CustomFieldValueType} from "@/types"
import {DocumentType, ExtractStrategyType, TransferStrategyType} from "@/types"
import {getBaseURL, getDefaultHeaders, imageEncode} from "@/utils"

Expand Down Expand Up @@ -41,6 +42,14 @@ type ExtractPagesType = {
sourceDocParentID: string
}

type UpdateDocumentCustomFields = {
documentID: string
body: {
document_type_id: string
custom_fields: Array<CustomFieldValueType>
}
}

export const apiSliceWithDocuments = apiSlice.injectEndpoints({
endpoints: builder => ({
getDocument: builder.query<DocumentType, string>({
Expand Down Expand Up @@ -129,6 +138,16 @@ export const apiSliceWithDocuments = apiSlice.injectEndpoints({
{type: "Node", id: arg.body.target_folder_id}
]
}
}),
updateDocumentCustomFields: builder.mutation<
void,
UpdateDocumentCustomFields
>({
query: data => ({
url: `/documents/${data.documentID}/custom-fields`,
method: "PATCH",
body: data.body
})
})
})
})
Expand All @@ -138,5 +157,6 @@ export const {
useGetPageImageQuery,
useApplyPageOpChangesMutation,
useMovePagesMutation,
useExtractPagesMutation
useExtractPagesMutation,
useUpdateDocumentCustomFieldsMutation
} = apiSliceWithDocuments
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,11 @@ import {
useGetDocumentTypeQuery,
useGetDocumentTypesQuery
} from "@/features/document-types/apiSlice"
import {useUpdateDocumentCustomFieldsMutation} from "@/features/document/apiSlice"
import {selectCurrentNodeID} from "@/features/ui/uiSlice"
import type {CustomField, PanelMode} from "@/types"
import type {CustomField, CustomFieldValueType, PanelMode} from "@/types"
import {Button, ComboboxItem, Select, Skeleton, TextInput} from "@mantine/core"

interface CustomFieldValueType {
custom_field_id: string
value: string
}

export default function CustomFields() {
const [showSaveButton, setShowSaveButton] = useState<boolean>(false)
const {data: allDocumentTypes = []} = useGetDocumentTypesQuery()
Expand All @@ -32,6 +28,8 @@ export default function CustomFields() {
const [customFieldValues, setCustomFieldValues] = useState<
CustomFieldValueType[]
>([])
const [updateDocumentCustomFields, {error}] =
useUpdateDocumentCustomFieldsMutation()

useEffect(() => {
if (documentType?.custom_fields) {
Expand Down Expand Up @@ -78,9 +76,18 @@ export default function CustomFields() {
}
}

const onSave = () => {
console.log(`Document ID=${docID}; documentTypeID=${documentTypeID?.value}`)
console.log(customFieldValues)
const onSave = async () => {
const data = {
documentID: docID!,
body: {
document_type_id: documentTypeID?.value!,
custom_fields: customFieldValues
}
}

await updateDocumentCustomFields(data)

setShowSaveButton(false)
}

if (isLoading || !docID || !doc) {
Expand All @@ -101,6 +108,11 @@ export default function CustomFields() {
/>
{genericCustomFieldsComponents}
{showSaveButton && <Button onClick={onSave}>Save</Button>}
{error && (
<div>
{error.status} {JSON.stringify(error.data)}
</div>
)}
</>
)
}
Expand Down
5 changes: 5 additions & 0 deletions ui2/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -428,3 +428,8 @@ export interface ServerErrorType {

export type SortMenuColumn = "title" | "ctype" | "created_at" | "updated_at"
export type SortMenuDirection = "az" | "za"

export interface CustomFieldValueType {
custom_field_id: string
value: string
}

0 comments on commit e4bb470

Please sign in to comment.