dapla-toolbelt-metadata 0.6.5__py3-none-any.whl → 0.6.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -171,6 +171,21 @@ class Datadoc:
171
171
  ):
172
172
  extracted_metadata = self._extract_metadata_from_dataset(self.dataset_path)
173
173
 
174
+ if extracted_metadata is not None:
175
+ existing_file_path = self._get_existing_file_path(extracted_metadata)
176
+ if (
177
+ self.dataset_path
178
+ and existing_file_path is not None
179
+ and extracted_metadata is not None
180
+ and existing_metadata is not None
181
+ ):
182
+ self.dataset_consistency_status = self._check_dataset_consistency(
183
+ self.dataset_path,
184
+ Path(existing_file_path),
185
+ extracted_metadata,
186
+ existing_metadata,
187
+ )
188
+
174
189
  if (
175
190
  self.dataset_path
176
191
  and self.explicitly_defined_metadata_document
@@ -179,13 +194,6 @@ class Datadoc:
179
194
  and extracted_metadata is not None
180
195
  and existing_metadata is not None
181
196
  ):
182
- existing_file_path = self._get_existing_file_path(extracted_metadata)
183
- self.dataset_consistency_status = self._check_dataset_consistency(
184
- self.dataset_path,
185
- Path(existing_file_path),
186
- extracted_metadata,
187
- existing_metadata,
188
- )
189
197
  self._check_ready_to_merge(
190
198
  self.dataset_consistency_status,
191
199
  errors_as_warnings=self.errors_as_warnings,
@@ -9,24 +9,6 @@ from dapla_metadata.variable_definitions._generated.vardef_client.configuration
9
9
 
10
10
  VARDEF_HOST_TEST = "https://metadata.intern.test.ssb.no"
11
11
  WORKSPACE_DIR = "WORKSPACE_DIR"
12
- VARDEF_DESCRIPTIONS_FILE_PATH = "VARDEF_DESCRIPTIONS_FILE_PATH"
13
- VARDEF_DEFAULT_DESCRIPTION_PATH = (
14
- "variable_definitions/resources/vardef_model_descriptions_nb.yaml"
15
- )
16
-
17
-
18
- def get_descriptions_path() -> str:
19
- """Get the relative file path from the repo root to the Norwegian descriptions.
20
-
21
- First checks the `VARDEF_DESCRIPTIONS_FILE_PATH` environment variable; if not set, returns a default path.
22
-
23
- Returns:
24
- str: The file path to the descriptions.
25
- """
26
- return (
27
- get_config_item(VARDEF_DESCRIPTIONS_FILE_PATH)
28
- or VARDEF_DEFAULT_DESCRIPTION_PATH
29
- )
30
12
 
31
13
 
32
14
  def get_workspace_dir() -> str | None:
@@ -24,8 +24,6 @@ TEMPLATE_SECTION_HEADER_MACHINE_GENERATED_EN = (
24
24
  "\n--- Machine generated fields. Do not edit ---\n"
25
25
  )
26
26
 
27
- NORWEGIAN_DESCRIPTIONS = "norwegian_description"
28
-
29
27
  DEFAULT_DATE = date(1000, 1, 1)
30
28
 
31
29
  MACHINE_GENERATED_FIELDS = [
@@ -3,12 +3,8 @@
3
3
  import logging
4
4
  from datetime import datetime
5
5
  from pathlib import Path
6
- from typing import TYPE_CHECKING
7
- from typing import Any
8
- from typing import cast
9
6
 
10
7
  import pytz
11
- from pydantic.config import JsonDict
12
8
  from ruamel.yaml import YAML
13
9
  from ruamel.yaml import CommentedMap
14
10
  from ruamel.yaml import RoundTripRepresenter
@@ -27,10 +23,7 @@ from dapla_metadata.variable_definitions._utils.constants import DOUBLE_QUOTE_FI
27
23
  from dapla_metadata.variable_definitions._utils.constants import (
28
24
  MACHINE_GENERATED_FIELDS,
29
25
  )
30
- from dapla_metadata.variable_definitions._utils.constants import NORWEGIAN_DESCRIPTIONS
31
- from dapla_metadata.variable_definitions._utils.constants import OPTIONAL_FIELD
32
26
  from dapla_metadata.variable_definitions._utils.constants import OWNER_FIELD_NAME
33
- from dapla_metadata.variable_definitions._utils.constants import REQUIRED_FIELD
34
27
  from dapla_metadata.variable_definitions._utils.constants import (
35
28
  TEMPLATE_SECTION_HEADER_MACHINE_GENERATED,
36
29
  )
@@ -47,14 +40,8 @@ from dapla_metadata.variable_definitions._utils.constants import (
47
40
  VARIABLE_STATUS_FIELD_NAME,
48
41
  )
49
42
  from dapla_metadata.variable_definitions._utils.constants import YAML_STR_TAG
50
- from dapla_metadata.variable_definitions._utils.descriptions import (
51
- apply_norwegian_descriptions_to_model,
52
- )
53
43
  from dapla_metadata.variable_definitions.exceptions import VardefFileError
54
44
 
55
- if TYPE_CHECKING:
56
- from pydantic import JsonValue
57
-
58
45
  logger = logging.getLogger(__name__)
59
46
 
60
47
 
@@ -119,41 +106,6 @@ def _get_variable_definitions_dir():
119
106
  return folder_path
120
107
 
121
108
 
122
- def _set_field_requirement(field_name: str, field: Any) -> str | None:
123
- """Determine the field requirement status."""
124
- if field_name not in MACHINE_GENERATED_FIELDS:
125
- if field.is_required() or field_name == VARIABLE_STATUS_FIELD_NAME:
126
- return REQUIRED_FIELD
127
- return OPTIONAL_FIELD
128
- return None
129
-
130
-
131
- def _populate_commented_map(
132
- field_name: str,
133
- value: str,
134
- commented_map: CommentedMap,
135
- model_instance: CompleteResponse,
136
- ) -> None:
137
- """Add data to a CommentedMap."""
138
- commented_map[field_name] = value
139
- field = type(model_instance).model_fields[field_name]
140
- description: JsonValue = cast(
141
- JsonDict,
142
- field.json_schema_extra,
143
- )[NORWEGIAN_DESCRIPTIONS]
144
- field_requirement: str | None = _set_field_requirement(field_name, field)
145
- if description is not None:
146
- new_description = (
147
- ("\n" + field_requirement + "\n" + str(description))
148
- if field_requirement
149
- else ("\n" + str(description))
150
- )
151
- commented_map.yaml_set_comment_before_after_key(
152
- field_name,
153
- before=new_description,
154
- )
155
-
156
-
157
109
  def _validate_and_create_directory(custom_directory: Path) -> Path:
158
110
  """Ensure that the given path is a valid directory, creating it if necessary.
159
111
 
@@ -290,9 +242,9 @@ def _model_to_yaml_with_comments(
290
242
  start_comment: str,
291
243
  custom_directory: Path | None = None,
292
244
  ) -> Path:
293
- """Convert a model instance to a structured YAML file with Norwegian descriptions as comments.
245
+ """Convert a model instance to a structured YAML file.
294
246
 
295
- Adds Norwegian descriptions to the model, organizes fields into sections, and saves
247
+ Organizes fields into sections with headers and saves
296
248
  the YAML file with a structured format and timestamped filename.
297
249
 
298
250
  Args:
@@ -307,13 +259,6 @@ def _model_to_yaml_with_comments(
307
259
  yaml = YAML()
308
260
  configure_yaml(yaml)
309
261
 
310
- from dapla_metadata.variable_definitions.variable_definition import (
311
- VariableDefinition,
312
- )
313
-
314
- # Apply new fields to model
315
- apply_norwegian_descriptions_to_model(VariableDefinition)
316
-
317
262
  # Convert Pydantic model instance to dictionary
318
263
  data = model_instance.model_dump(
319
264
  serialize_as_any=True,
@@ -326,21 +271,16 @@ def _model_to_yaml_with_comments(
326
271
  status_map = CommentedMap()
327
272
  owner_map = CommentedMap()
328
273
 
329
- # Loop through all fields in the model and populate the commented maps
274
+ # Loop through all fields in the model and assigne to commented maps
330
275
  for field_name, value in data.items():
331
276
  if field_name == VARIABLE_STATUS_FIELD_NAME:
332
- _populate_commented_map(field_name, value, status_map, model_instance)
277
+ status_map[field_name] = value
333
278
  elif field_name == OWNER_FIELD_NAME:
334
- _populate_commented_map(field_name, value, owner_map, model_instance)
279
+ owner_map[field_name] = value
335
280
  elif field_name in MACHINE_GENERATED_FIELDS:
336
- _populate_commented_map(
337
- field_name,
338
- value,
339
- machine_generated_map,
340
- model_instance,
341
- )
342
- elif field_name not in {VARIABLE_STATUS_FIELD_NAME, OWNER_FIELD_NAME}:
343
- _populate_commented_map(field_name, value, commented_map, model_instance)
281
+ machine_generated_map[field_name] = value
282
+ else:
283
+ commented_map[field_name] = value
344
284
 
345
285
  base_path = (
346
286
  _get_variable_definitions_dir()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dapla-toolbelt-metadata
3
- Version: 0.6.5
3
+ Version: 0.6.6
4
4
  Summary: Dapla Toolbelt Metadata
5
5
  License: MIT
6
6
  Author: Team Metadata
@@ -7,7 +7,7 @@ dapla_metadata/dapla/__init__.py,sha256=tkapF-YwmruPPrKvN3pEoCZqb7xvJx_ogBM8XyGM
7
7
  dapla_metadata/dapla/user_info.py,sha256=bENez-ICt9ySR8orYebO68Q3_2LkIW9QTL58DTctmEQ,4833
8
8
  dapla_metadata/datasets/__init__.py,sha256=TvzskpdFC6hGcC9_55URT5jr5wNAPzXuISd2UjJWM_8,280
9
9
  dapla_metadata/datasets/code_list.py,sha256=kp1O6sUiUAP9WKlWY8IgHWx_1IOzJA63WveHqolgKmg,9082
10
- dapla_metadata/datasets/core.py,sha256=AGnGTYF7JV8hySu-_Cd4PvxOMlgX1ICpkiWi9GGLlRg,25778
10
+ dapla_metadata/datasets/core.py,sha256=Q6-sEcI2gNht5uIyM6Y4w99TQfSyGfA2mMyvsJfXe_8,26064
11
11
  dapla_metadata/datasets/dapla_dataset_path_info.py,sha256=zdkVjxlqXMBe7eTAneUrTDP0_fx7JsEQ_0JrKjREhfU,26854
12
12
  dapla_metadata/datasets/dataset_parser.py,sha256=bc3KOIDQGgdZMPh3XVHhiKMsY6FxIY9glvGlwTM4g7I,8233
13
13
  dapla_metadata/datasets/external_sources/__init__.py,sha256=qvIdXwqyEmXNUCB94ZtZXRzifdW4hiXASFFPtC70f6E,83
@@ -73,17 +73,15 @@ dapla_metadata/variable_definitions/_generated/vardef_client/py.typed,sha256=47D
73
73
  dapla_metadata/variable_definitions/_generated/vardef_client/rest.py,sha256=x4PWmg3IYQBr8OgnrWr3l4Ke2rElHP3zAEVxk2U-mOc,12022
74
74
  dapla_metadata/variable_definitions/_utils/__init__.py,sha256=qAhRLJoTBqtR3f9xRXTRhD7-5Xg0Opk1Ks5F4AUYnpA,45
75
75
  dapla_metadata/variable_definitions/_utils/_client.py,sha256=v1-9VjrdPI6-sroam5vXMPEV1dQMPsYk7KyGd48HjYw,971
76
- dapla_metadata/variable_definitions/_utils/config.py,sha256=BpLrnuqgtqz_kxBc_Kd-I1QNL7y2RxRXgX-IVbMIclQ,2416
77
- dapla_metadata/variable_definitions/_utils/constants.py,sha256=BGITkRNYtRDySM-anDMQDvO2JrXm3lDjw7ZmYfhFlXU,1884
78
- dapla_metadata/variable_definitions/_utils/descriptions.py,sha256=bB5QHNc4eOhmpLQHCty-CP5_aA82chkICifXw430suI,2746
79
- dapla_metadata/variable_definitions/_utils/files.py,sha256=qdO9D0l-6FnSGZImTtyMsrFfauFqvQyCWz0knLSklbo,13193
76
+ dapla_metadata/variable_definitions/_utils/config.py,sha256=h5MtmueCdAgg82c5upvQUC9QSzK0TOs40KwQj5mTrE8,1822
77
+ dapla_metadata/variable_definitions/_utils/constants.py,sha256=Jy9xFa4ZpTUxpDZ_vdUaFlB-cPnQpFArwS9VtEIG0SY,1834
78
+ dapla_metadata/variable_definitions/_utils/files.py,sha256=JbPgPNQ7iA38juMqGEdcg5OjZZUwCb6NQtPL0AEspD0,10933
80
79
  dapla_metadata/variable_definitions/_utils/template_files.py,sha256=-PgYs4TG4vrXLQgk47pow9ZsqlZqhtO755LnEmvN4MA,3405
81
80
  dapla_metadata/variable_definitions/_utils/variable_definition_files.py,sha256=PbqsFdHxsq0EWBg9s2Y57LqVP7aPmGD5-FZfnzuOw2Q,4078
82
81
  dapla_metadata/variable_definitions/exceptions.py,sha256=z6Gtd84FboDu7vWjC3wathIF7I0gF0imtRhwMkr16lY,7851
83
- dapla_metadata/variable_definitions/resources/vardef_model_descriptions_nb.yaml,sha256=VNglLU6jBLbfoM12fc2fiby_pi2GAgA-4t30yKypeuY,5474
84
82
  dapla_metadata/variable_definitions/vardef.py,sha256=KYd31nCGhxuzC0hpKR6foQjO39Tlb3vu9IDqUoMvTeY,11352
85
83
  dapla_metadata/variable_definitions/variable_definition.py,sha256=sj49uot0e4UJW4QJ3dEJGgjY4yfCHOkxS2NdD2t60b8,14883
86
- dapla_toolbelt_metadata-0.6.5.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
87
- dapla_toolbelt_metadata-0.6.5.dist-info/METADATA,sha256=nCYM7_zMNUogDtfXGQirVfghQwc4KDnE1GRNQqO-Grw,4905
88
- dapla_toolbelt_metadata-0.6.5.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
89
- dapla_toolbelt_metadata-0.6.5.dist-info/RECORD,,
84
+ dapla_toolbelt_metadata-0.6.6.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
85
+ dapla_toolbelt_metadata-0.6.6.dist-info/METADATA,sha256=o2piO1Eg_WDfqRBTRCj4sCQNbb7ipN09IIrytccqzjI,4905
86
+ dapla_toolbelt_metadata-0.6.6.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
87
+ dapla_toolbelt_metadata-0.6.6.dist-info/RECORD,,
@@ -1,89 +0,0 @@
1
- """Utilities for dynamically adding extra fields to Pydantic models, specifically Norwegian descriptions."""
2
-
3
- import logging
4
- from pathlib import Path
5
- from typing import TYPE_CHECKING
6
- from typing import cast
7
-
8
- import ruamel.yaml
9
- from pydantic import BaseModel
10
- from pydantic import Field
11
-
12
- from dapla_metadata.variable_definitions._utils.config import get_descriptions_path
13
-
14
- if TYPE_CHECKING:
15
- from pydantic.config import JsonDict
16
-
17
- logger = logging.getLogger(__name__)
18
-
19
-
20
- def get_package_root() -> Path:
21
- """Get an absolute Path to the root of the package (dapla_metadata)."""
22
- number_of_directories_up_from_descriptions_file = 2
23
- return (
24
- Path(__file__)
25
- .resolve()
26
- .parents[number_of_directories_up_from_descriptions_file]
27
- )
28
-
29
-
30
- def load_descriptions(file_path: Path) -> dict:
31
- """Load and return the contents of a YAML file as a dictionary.
32
-
33
- Args:
34
- file_path (Path): Path to the YAML file.
35
-
36
- Returns:
37
- dict: Parsed contents of the YAML file.
38
- """
39
- with Path.open(file_path, encoding="utf-8") as f:
40
- return ruamel.yaml.YAML().load(f)
41
-
42
-
43
- def apply_norwegian_descriptions_to_model(
44
- model: type[BaseModel],
45
- ) -> None:
46
- """Add Norwegian descriptions to the fields of a Pydantic model.
47
-
48
- This function globally modifies the model fields by inserting a Norwegian description
49
- from a predefined dictionary. If a field does not have a corresponding
50
- Norwegian description, a default message is used.
51
-
52
- Args:
53
- model (BaseModel): A Pydantic model instance to be updated.
54
-
55
- Returns:
56
- None: The function modifies the model in place.
57
- """
58
- new_fields = {}
59
-
60
- descriptions = load_descriptions(
61
- get_package_root() / get_descriptions_path(),
62
- )
63
-
64
- for field_name, field_info in model.model_fields.items():
65
- new_description: str = descriptions.get(
66
- field_name,
67
- f"No description in norwegian found for {field_name}",
68
- )
69
- if "No description in norwegian found" in new_description:
70
- logger.warning("Missing description for %s", field_name)
71
- else:
72
- logger.debug("Field %s: %s", field_name, new_description)
73
-
74
- new_fields[field_name] = Field( # type: ignore[call-overload]
75
- default=field_info.default,
76
- alias=field_info.alias,
77
- title=field_info.title,
78
- description=field_info.description,
79
- json_schema_extra=cast(
80
- "JsonDict",
81
- {
82
- "norwegian_description": new_description,
83
- "annotation": field_info.annotation,
84
- },
85
- ),
86
- )
87
-
88
- model.model_fields.update(new_fields) # Apply changes
89
- model.model_rebuild()
@@ -1,109 +0,0 @@
1
- # --- Variabel definisjoner ---
2
- # ref: https://statistics-norway.atlassian.net/wiki/spaces/MPD/pages/3009839199/VarDef+-+Krav+til+dokumentasjon+av+variabler
3
- name: |
4
- Variabelens navn. Dette skal ikke være en mer “teknisk” forkortelse, men et navn som er forståelig for mennesker.
5
- -------------------------
6
- >>> EKSEMPEL:
7
- name:
8
- nb: |-
9
- Lønnsinntekter
10
- short_name: |
11
- Dette er variabelens kortnavn, som kan være en mer “teknisk” forkortelse, f.eks. wlonn (kortnavnet til Lønnsinntekter). Kortnavnet til en variabel i Vardef skal være unikt.
12
- Kravet til kortnavnet er at det kan inneholde a-z (kun små bokstaver), 0-9 og _ (understrek). Minimumslengden på kortnavnet er 2 tegn.
13
- Bokstavene “æ”, “ø” og “å” kan ikke brukes. Disse anbefales erstattet med hhv. “ae”, “oe” og “aa"
14
- definition: |
15
- En definisjon skal beskrive hva variabelen betyr og være så kort og presis som mulig. Mer utfyllende opplysninger kan legges i Merknad-feltet.
16
- -------------------------
17
- >>> EKSEMPEL:
18
- definition:
19
- nb: |-
20
- Yrkesinntekter, kapitalinntekter, skattepliktige og skattefrie overføringer, i løpet av kalenderåret.
21
- classification_reference: |
22
- ID av en klassifikasjon eller kodeliste fra KLASS som beskriver verdiene variabelen kan anta.
23
- For eksempel vil variabelen 'Sivilstand' ha klassifikasjon 'Standard for sivilstand' (kan vises på https://www.ssb.no/klass/klassifikasjoner/19 ) som har ID 19.
24
- -------------------------
25
- >>> EKSEMPEL:
26
- classification_reference: "19"
27
- unit_types: |
28
- Enhetstyper - enhetene som beskrives av denne variabelen. Variabelen “sivilstand” vil f.eks. ha enhetstypen person,
29
- mens f.eks. “Produsentpris for tjenester” vil ha både foretak og bedrift som enhetstyper siden variabelen kan beskrive begge.
30
- Verdier skal være koder fra: https://www.ssb.no/klass/klassifikasjoner/702.
31
- -------------------------
32
- >>> EKSEMPEL:
33
- unit_types:
34
- - "20"
35
- subject_fields: |
36
- Statistikkområder som variabelen brukes innenfor. For eksempel tilhører variabelen “Sivilstand” statistikkområdet “Befolkning”.
37
- Verdier skal være koder fra https://www.ssb.no/klass/klassifikasjoner/618.
38
- -------------------------
39
- >>> EKSEMPEL:
40
- subject_fields:
41
- - "bf"
42
- - "be"
43
- contains_special_categories_of_personal_data: |
44
- Viser om variabelen inneholder spesielt sensitive personopplysninger.
45
- -------------------------
46
- >>> EKSEMPEL:
47
- contains_special_categories_of_personal_data: true
48
- measurement_type: |
49
- Måletype som en kvantitativ variabelen tilhører, f.eks. valuta, areal osv.
50
- Verdien skal være en kode fra: https://www.ssb.no/klass/klassifikasjoner/303
51
- -------------------------
52
- >>> EKSEMPEL:
53
- measurement_type: "03"
54
- valid_from: |
55
- Datoen variabeldefinisjonen er gyldig f.o.m.
56
- -------------------------
57
- >>> EKSEMPEL:
58
- valid_from: 1999-01-30
59
- valid_until: |
60
- Datoen variabeldefinisjonens var gyldig t.o.m. Settes hvis definisjonen skal erstattet av en ny definisjon (med en ny gyldighetsperiode), eller variabelen ikke lenger skal brukes.
61
- -------------------------
62
- >>> EKSEMPEL:
63
- valid_until: 2024-10-23
64
- external_reference_uri: |
65
- En peker (URI) til ekstern definisjon/dokumentasjon, f.eks. ei webside som er relevant for variabelen.
66
- -----------------------------------------------------
67
- >>> EKSEMPEL:
68
- external_reference_uri: "https://www.landbruksdirektoratet.com"
69
- comment: |
70
- Her kan en sette inn eventuelle tilleggsopplysninger som ikke hører hjemme i selve definisjonen.
71
- Variabelen “Landbakgrunn” har f.eks. merknaden “Fra og med 1.1.2003 ble definisjon endret til også å trekke inn besteforeldrenes fødeland”.
72
- -----------------------------------------------------------------------------------------------
73
- >>> EKSEMPEL:
74
- comment:
75
- nb: |-
76
- Fra og med 1.1.2003 ble definisjon endret til også å trekke inn besteforeldrenes fødeland.
77
- related_variable_definition_uris: |
78
- Her kan en legge inn URIer til andre variabler som er relevante. Eksempelvis er variabelen “Inntekt etter skatt” en beregnet variabel der “Yrkesinntekter” og “Kapitalinntekter” inngår i beregningen.
79
- En kan da legge inn deres URI-er i dette feltet.
80
- -------------------------
81
- >>> EKSEMPEL:
82
- related_variable_definition_uris:
83
- - "https://example.com/"
84
- contact: |
85
- Her dokumenterer en navn og epost for person eller gruppe som kan svare på spørsmål.
86
- -------------------------
87
- >>> EKSEMPEL:
88
- contact:
89
- title:
90
- nb: |-
91
- Seksjonsleder
92
- email: leder@ssb.no
93
- variable_status: |
94
- Livssyklus for variabelen.
95
- id: |
96
- Unik SSB identifikator for variabeldefinisjonen. Denne blir maskingenerert.
97
- Variabeldefinisjoner med ulike gyldighetsperioder har samme ID (og samme kortnavn).
98
- patch_id: |
99
- Løpenummer som identifiserer en patch, endring, for en variabeldefinisjon.
100
- owner: |
101
- Eier av variabelen dvs. ansvarlig Dapla-team (statistikk-team) og informasjon om tilgangsstyringsgrupper. Team-tilhørighet settes automatisk til det samme som teamtilhørigheten til den som oppretter variabelen.
102
- created_at: |
103
- Tidsstempelet da variabelen ble opprettet. Denne er maskingenerert.
104
- created_by: |
105
- Personen som har opprettet variabelen. Dette er maskingenerert.
106
- last_updated_at: |
107
- Tidsstempelet da variabelen sist ble oppdatert. Denne er maskingenerert.
108
- last_updated_by: |
109
- Personen som sist utførte en endring i variabelen. Denne er maskingenerert.