Skip to content

Commit

Permalink
Ensure metadata for use_restriction_date is saved (#384)
Browse files Browse the repository at this point in the history
* Add missing dataset fields

* Ensure metadata for use_restriction_date is saved
  • Loading branch information
mmwinther authored Aug 2, 2024
1 parent 3a76f73 commit 286f216
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 11 deletions.
12 changes: 12 additions & 0 deletions src/datadoc/frontend/callbacks/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

from __future__ import annotations

import datetime
import logging
import re
from typing import TYPE_CHECKING

import arrow
from dash import no_update
from pydantic import ValidationError

Expand All @@ -15,6 +17,7 @@
from datadoc.backend.dapla_dataset_path_info import DaplaDatasetPathInfo
from datadoc.constants import CHECK_OBLIGATORY_METADATA_DATASET_MESSAGE
from datadoc.constants import MISSING_METADATA_WARNING
from datadoc.frontend.callbacks.utils import VALIDATION_ERROR
from datadoc.frontend.callbacks.utils import MetadataInputTypes
from datadoc.frontend.callbacks.utils import find_existing_language_string
from datadoc.frontend.callbacks.utils import get_dataset_path
Expand All @@ -40,6 +43,7 @@
from datadoc.frontend.fields.display_dataset import (
OBLIGATORY_DATASET_METADATA_IDENTIFIERS_AND_DISPLAY_NAME,
)
from datadoc.frontend.fields.display_dataset import TIMEZONE_AWARE_METADATA_IDENTIFIERS
from datadoc.frontend.fields.display_dataset import DatasetIdentifiers
from datadoc.frontend.text import INVALID_DATE_ORDER
from datadoc.frontend.text import INVALID_VALUE
Expand Down Expand Up @@ -168,6 +172,14 @@ def process_special_cases(
)
elif metadata_identifier in DROPDOWN_DATASET_METADATA_IDENTIFIERS and value == "":
updated_value = None
elif metadata_identifier in TIMEZONE_AWARE_METADATA_IDENTIFIERS and isinstance(
value,
(str, datetime.date, datetime.datetime),
):
try:
updated_value = arrow.get(value).astimezone(tz=datetime.UTC)
except arrow.parser.ParserError as e:
raise ValueError(VALIDATION_ERROR + str(e)) from e
else:
updated_value = value

Expand Down
24 changes: 24 additions & 0 deletions src/datadoc/frontend/fields/display_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,29 @@ def render(
)


@dataclass
class MetadataDateField(DisplayMetadata):
"""Controls how fields which define a single date are displayed."""

def render(
self,
component_id: dict,
metadata: BaseModel,
) -> ssb.Input:
"""Build Input date component."""
return ssb.Input(
label=self.display_name,
id=component_id,
debounce=False,
type="date",
disabled=not self.editable,
showDescription=True,
description=self.description,
value=get_metadata_and_stringify(metadata, self.identifier),
className="input-component",
)


@dataclass
class MetadataPeriodField(DisplayMetadata):
"""Controls how fields which define a time period are displayed.
Expand Down Expand Up @@ -342,6 +365,7 @@ def render(
FieldTypes = (
MetadataInputField
| MetadataDropdownField
| MetadataDateField
| MetadataCheckboxField
| MetadataPeriodField
| MetadataMultiLanguageField
Expand Down
13 changes: 9 additions & 4 deletions src/datadoc/frontend/fields/display_dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from datadoc.frontend.fields.display_base import DROPDOWN_DESELECT_OPTION
from datadoc.frontend.fields.display_base import FieldTypes
from datadoc.frontend.fields.display_base import MetadataCheckboxField
from datadoc.frontend.fields.display_base import MetadataDateField
from datadoc.frontend.fields.display_base import MetadataDropdownField
from datadoc.frontend.fields.display_base import MetadataInputField
from datadoc.frontend.fields.display_base import MetadataMultiLanguageField
Expand Down Expand Up @@ -83,6 +84,9 @@ class DatasetIdentifiers(str, Enum):
SUBJECT_FIELD = "subject_field"
KEYWORD = "keyword"
SPATIAL_COVERAGE_DESCRIPTION = "spatial_coverage_description"
CONTAINS_PERSONAL_DATA = "contains_personal_data"
USE_RESTRICTION = "use_restriction"
USE_RESTRICTION_DATE = "use_restriction_date"
ID = "id"
OWNER = "owner"
FILE_PATH = "file_path"
Expand All @@ -92,9 +96,6 @@ class DatasetIdentifiers(str, Enum):
METADATA_LAST_UPDATED_BY = "metadata_last_updated_by"
CONTAINS_DATA_FROM = "contains_data_from"
CONTAINS_DATA_UNTIL = "contains_data_until"
USE_RESTRICTION = "use_restriction"
USE_RESTRICTION_DATE = "use_restriction_date"
CONTAINS_PERSONAL_DATA = "contains_personal_data"


DISPLAY_DATASET: dict[
Expand Down Expand Up @@ -292,7 +293,7 @@ class DatasetIdentifiers(str, Enum):
enums.UseRestriction,
),
),
DatasetIdentifiers.USE_RESTRICTION_DATE: MetadataPeriodField(
DatasetIdentifiers.USE_RESTRICTION_DATE: MetadataDateField(
identifier=DatasetIdentifiers.USE_RESTRICTION_DATE.value,
display_name="Bruksrestriksjonsdato",
description='Oppgi ev. "tiltaksdato" for bruksrestriksjoner, f.eks. frist for sletting/anonymisering. Noen bruksrestriksjoner vil ikke ha en slik dato, f.eks. vil en behandlingsbegrensning normalt være permanent/tidsuavhengig.',
Expand Down Expand Up @@ -336,6 +337,10 @@ class DatasetIdentifiers(str, Enum):
m.identifier for m in DROPDOWN_DATASET_METADATA
]

TIMEZONE_AWARE_METADATA_IDENTIFIERS = [
m.identifier for m in DISPLAYED_DATASET_METADATA if isinstance(m, MetadataDateField)
]

OBLIGATORY_DATASET_METADATA_IDENTIFIERS: list[str] = [
m.identifier for m in DISPLAY_DATASET.values() if m.obligatory and m.editable
]
Expand Down
26 changes: 25 additions & 1 deletion tests/frontend/callbacks/test_dataset_callbacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def file_path_without_dates():
"Census",
),
(
DatasetIdentifiers.DESCRIPTION,
DatasetIdentifiers.POPULATION_DESCRIPTION,
"Population description",
enums.LanguageStringType(
[
Expand All @@ -124,6 +124,11 @@ def file_path_without_dates():
],
),
),
(
DatasetIdentifiers.UNIT_TYPE,
"17",
"17",
),
(
DatasetIdentifiers.TEMPORALITY_TYPE,
enums.TemporalityTypeType.ACCUMULATED,
Expand Down Expand Up @@ -159,6 +164,25 @@ def file_path_without_dates():
],
),
),
(DatasetIdentifiers.CONTAINS_PERSONAL_DATA, True, True),
(
DatasetIdentifiers.USE_RESTRICTION,
enums.UseRestriction.PROCESS_LIMITATIONS,
"PROCESS_LIMITATIONS",
),
(
DatasetIdentifiers.USE_RESTRICTION_DATE,
"2024-12-31T23:59:59Z",
datetime.datetime(
2024,
12,
31,
23,
59,
59,
tzinfo=datetime.UTC,
),
),
(
DatasetIdentifiers.ID,
"2f72477a-f051-43ee-bf8b-0d8f47b5e0a7",
Expand Down
15 changes: 9 additions & 6 deletions tests/frontend/components/test_build_dataset_edit_section.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,17 +248,20 @@ def test_build_dataset_edit_section_dropdown_component_props(
if isinstance(m, MetadataInputField) and m.type == "url"
]

DATASET_DATE_FIELD_LIST: list[FieldTypes] = [
DATASET_PERIOD_FIELD_LIST: list[FieldTypes] = [
m for m in DISPLAY_DATASET.values() if isinstance(m, MetadataPeriodField)
]

DATASET_DROPDOWN_FIELD_LIST_MINUS_ATYPICAL: list[FieldTypes] = [
m
for m in DISPLAY_DATASET.values()
if isinstance(m, MetadataDropdownField)
and m.identifier != DatasetIdentifiers.UNIT_TYPE.value
and m.identifier != DatasetIdentifiers.SUBJECT_FIELD.value
and m.identifier != DatasetIdentifiers.OWNER.value
and m.identifier
not in (
DatasetIdentifiers.UNIT_TYPE.value,
DatasetIdentifiers.SUBJECT_FIELD.value,
DatasetIdentifiers.OWNER.value,
)
]


Expand All @@ -279,11 +282,11 @@ def test_build_dataset_edit_section_dropdown_component_props(
(
(
"title",
DATASET_DATE_FIELD_LIST,
DATASET_PERIOD_FIELD_LIST,
model.Dataset(short_name="date_dataset"),
{"type": "dataset-edit-section", "id": "title-nb"},
),
3,
2,
ssb.Input,
),
(
Expand Down

0 comments on commit 286f216

Please sign in to comment.