From 69730bcfe3d967437b333564437da5c706ab218b Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Mon, 30 Sep 2024 17:57:29 +0200 Subject: [PATCH 01/42] refactor with alex --- openatlas/api/endpoints/parser.py | 12 +++++------- openatlas/api/resources/search.py | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index 09e2191d9..c1ff7ef87 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -84,7 +84,7 @@ def set_search_param(self) -> None: for category, value_list in item.items(): for values in value_list: values['logicalOperator'] = ( - values.get('logicalOperator') or 'or') + values.get('logicalOperator') or 'or') check_search_parameters(category, values) if check_if_date_search(category): try: @@ -95,19 +95,17 @@ def set_search_param(self) -> None: category, values["values"]) from e - for item in url_parameters: - for category, values in item.items(): - for parameter in values: self.search_param.append({ "search_values": get_search_values( category, - parameter), - "logical_operator": parameter['logicalOperator'], + values), + "logical_operator": values['logicalOperator'], "operator": 'equal' if category == "valueTypeID" - else parameter['operator'], + else values['operator'], "category": category, "is_date": check_if_date_search(category)}) + def search_filter(self, entity: Entity) -> bool: for i in self.search_param: if not search_entity( diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 2ff5c2215..13e41ed8a 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -10,7 +10,7 @@ def get_search_values( category: str, - parameter: dict[str, Any]) -> list[str | int | list[Any]]: + parameter: dict[str, Any]) -> list[str | int | list[int]]: values = parameter["values"] match category: case "typeIDWithSubs": From faef248cac4a9048437b040495377c0e93c33c8c Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Tue, 1 Oct 2024 14:56:54 +0200 Subject: [PATCH 02/42] revert refactor with alex --- openatlas/api/endpoints/parser.py | 11 +++++++---- openatlas/api/resources/search_validation.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index c1ff7ef87..97f37fa51 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -21,7 +21,7 @@ from openatlas.api.resources.search import ( get_search_values, search_entity, value_to_be_searched) from openatlas.api.resources.search_validation import ( - check_if_date_search, check_search_parameters) + check_if_date_search, validate_search_parameters) from openatlas.api.resources.templates import ( geojson_pagination, linked_place_pagination, loud_pagination) from openatlas.api.resources.util import ( @@ -80,12 +80,12 @@ def set_search_param(self) -> None: url_parameters = [ast.literal_eval(i) for i in self.search] except Exception as e: raise InvalidSearchSyntax from e - for item in url_parameters: - for category, value_list in item.items(): + for search in url_parameters: + for category, value_list in search.items(): for values in value_list: values['logicalOperator'] = ( values.get('logicalOperator') or 'or') - check_search_parameters(category, values) + validate_search_parameters(category, values) if check_if_date_search(category): try: values["values"] = [ @@ -95,6 +95,9 @@ def set_search_param(self) -> None: category, values["values"]) from e + for search in url_parameters: + for category, value_list in search.items(): + for values in value_list: self.search_param.append({ "search_values": get_search_values( category, diff --git a/openatlas/api/resources/search_validation.py b/openatlas/api/resources/search_validation.py index 1c412ffe4..f487a0752 100644 --- a/openatlas/api/resources/search_validation.py +++ b/openatlas/api/resources/search_validation.py @@ -10,7 +10,7 @@ def check_if_date_search(k: str) -> bool: return bool(k in ["beginFrom", "beginTo", "endFrom", "endTo"]) -def check_search_parameters(category: str, values: dict[str, Any]) -> None: +def validate_search_parameters(category: str, values: dict[str, Any]) -> None: if values['logicalOperator'] not in app.config['LOGICAL_OPERATOR']: raise LogicalOperatorError if values['operator'] not in app.config['COMPARE_OPERATORS']: From 73f5de600e261f7b81a8c843d2624c3b359319f1 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Tue, 1 Oct 2024 16:50:35 +0200 Subject: [PATCH 03/42] Trying to merge valueTypeID in search filter --- openatlas/api/endpoints/parser.py | 19 +++++----- openatlas/api/resources/search.py | 63 +++++++++++++++++-------------- 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index 97f37fa51..f2c416f6d 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -98,25 +98,24 @@ def set_search_param(self) -> None: for search in url_parameters: for category, value_list in search.items(): for values in value_list: + is_comparable= False + if check_if_date_search(category): + is_comparable = True + if category == 'valueTypeID': + is_comparable = True self.search_param.append({ "search_values": get_search_values( category, values), "logical_operator": values['logicalOperator'], - "operator": 'equal' if category == "valueTypeID" - else values['operator'], + "operator": values['operator'], "category": category, - "is_date": check_if_date_search(category)}) + "is_comparable": is_comparable}) def search_filter(self, entity: Entity) -> bool: - for i in self.search_param: - if not search_entity( - entity_values=value_to_be_searched(entity, i['category']), - operator_=i['operator'], - search_values=i['search_values'], - logical_operator=i['logical_operator'], - is_comparable=i['is_date']): + for param in self.search_param: + if not search_entity(entity, param): return False return True diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 13e41ed8a..4e7798d62 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -1,4 +1,4 @@ -from typing import Any, Optional, Tuple +from typing import Any, Optional from flask import g from numpy import datetime64 @@ -18,9 +18,10 @@ def get_search_values( case "relationToID": values = flatten_list_and_remove_duplicates( [get_linked_entities_id_api(value) for value in values]) - case "valueTypeID": - values = flatten_list_and_remove_duplicates( - [search_for_value_type(value, parameter) for value in values]) + # case "valueTypeID": + # values = flatten_list_and_remove_duplicates( + # [search_for_value_type(value, parameter) for value in + # values]) case _: values = [ value.lower() if isinstance(value, str) else value @@ -28,30 +29,22 @@ def get_search_values( return values -def search_for_value_type( - values: Tuple[int, float], - parameter: dict[str, Any]) -> list[int]: - links = Entity.get_links_of_entities(values[0], inverse=True) - ids = [] - for link_ in links: - if link_.description and search_entity( - entity_values=[float(link_.description)] - if parameter['operator'] in ['equal', 'notEqual'] - else float(link_.description), - operator_=parameter['operator'], - search_values=[values[1]], - logical_operator=parameter['logicalOperator'], - is_comparable=True): - ids.append(link_.domain.id) - return ids -def search_entity( - entity_values: Any, - operator_: str, - search_values: list[Any], - logical_operator: str, - is_comparable: bool) -> bool: + +def search_entity(entity: Entity, param: dict[str, Any]) -> bool: + entity_values = value_to_be_searched(entity, param) + operator_ = param['operator'] + search_values = param['search_values'] + logical_operator = param['logical_operator'] + is_comparable = param['is_comparable'] + + # Problem is, that we get not only one value to compare. + # How compare multiple? + if param['category'] == 'valueTypeID': + search_values = [value[1] for value in search_values] + print(search_values) + if not entity_values and (operator_ == 'like' or is_comparable): return False @@ -109,10 +102,13 @@ def search_entity( return bool_ -def value_to_be_searched(entity: Entity, key: str) -> Any: - match key: +def value_to_be_searched( + entity: Entity, param: dict[str, Any]) \ + -> list[int | str | float] | Optional[datetime64] | Optional[float]: + value: list[int | str | float] | Optional[datetime64]| Optional[float] = [] + match param['category']: case "entityID" | "relationToID" | "valueTypeID": - value: list[int | str] | Optional[datetime64] = [entity.id] + value = [entity.id] case "entityName": value = [entity.name.lower()] case "entityDescription" if entity.description: @@ -137,6 +133,15 @@ def value_to_be_searched(entity: Entity, key: str) -> Any: value = entity.end_from case "endTo": value = entity.end_to + case "valueTypeID": + links = Entity.get_links_of_entities( + param['values'][0], + inverse=True) + for link_ in links: + if link_.description: + value = [float(entity.description)] \ + if param['operator'] in ['equal', 'notEqual'] \ + else float(entity.description) case _: value = [] return value From 8fe870b5af9c15e2ac249e254ded4c68e62d2189 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 2 Oct 2024 13:30:39 +0200 Subject: [PATCH 04/42] semifixed valueTypeID search --- openatlas/api/endpoints/parser.py | 14 +++++++++++-- openatlas/api/resources/search.py | 33 +++++++++++-------------------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index f2c416f6d..33fb16059 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -99,10 +99,15 @@ def set_search_param(self) -> None: for category, value_list in search.items(): for values in value_list: is_comparable= False + links = [] if check_if_date_search(category): is_comparable = True if category == 'valueTypeID': is_comparable = True + for value in values["values"]: + links.append(Entity.get_links_of_entities( + value[0], + inverse=True)) self.search_param.append({ "search_values": get_search_values( category, @@ -110,9 +115,14 @@ def set_search_param(self) -> None: "logical_operator": values['logicalOperator'], "operator": values['operator'], "category": category, - "is_comparable": is_comparable}) - + "is_comparable": is_comparable, + "value_type_links": + flatten_list_and_remove_duplicates(links)}) + # Todo: fix multiple valueTypeID searches, e.g. + # search={"valueTypeID":[{"operator":"equal","values":[(150412,34)], + # "logicalOperator":"or"}]}&search={"valueTypeID":[{"operator":"equal", + # "values":[(131994,13.5),(131997,3.7)],"logicalOperator":"or"}]} def search_filter(self, entity: Entity) -> bool: for param in self.search_param: if not search_entity(entity, param): diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 4e7798d62..584cf1300 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -5,7 +5,7 @@ from openatlas.api.resources.util import ( flatten_list_and_remove_duplicates, get_linked_entities_id_api) -from openatlas.models.entity import Entity +from openatlas.models.entity import Entity, Link def get_search_values( @@ -18,10 +18,8 @@ def get_search_values( case "relationToID": values = flatten_list_and_remove_duplicates( [get_linked_entities_id_api(value) for value in values]) - # case "valueTypeID": - # values = flatten_list_and_remove_duplicates( - # [search_for_value_type(value, parameter) for value in - # values]) + case "valueTypeID": + values = [value[1] for value in values] case _: values = [ value.lower() if isinstance(value, str) else value @@ -32,19 +30,13 @@ def get_search_values( -def search_entity(entity: Entity, param: dict[str, Any]) -> bool: +def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: entity_values = value_to_be_searched(entity, param) operator_ = param['operator'] search_values = param['search_values'] logical_operator = param['logical_operator'] is_comparable = param['is_comparable'] - # Problem is, that we get not only one value to compare. - # How compare multiple? - if param['category'] == 'valueTypeID': - search_values = [value[1] for value in search_values] - print(search_values) - if not entity_values and (operator_ == 'like' or is_comparable): return False @@ -63,7 +55,8 @@ def search_entity(entity: Entity, param: dict[str, Any]) -> bool: bool_values.append(bool(not any( item in entity_values for item in search_value))) return all(bool_values) - + if entity_values: + print(entity_values) bool_ = False match operator_: case 'equal' if logical_operator == 'or': @@ -107,7 +100,7 @@ def value_to_be_searched( -> list[int | str | float] | Optional[datetime64] | Optional[float]: value: list[int | str | float] | Optional[datetime64]| Optional[float] = [] match param['category']: - case "entityID" | "relationToID" | "valueTypeID": + case "entityID" | "relationToID": value = [entity.id] case "entityName": value = [entity.name.lower()] @@ -134,14 +127,10 @@ def value_to_be_searched( case "endTo": value = entity.end_to case "valueTypeID": - links = Entity.get_links_of_entities( - param['values'][0], - inverse=True) - for link_ in links: - if link_.description: - value = [float(entity.description)] \ - if param['operator'] in ['equal', 'notEqual'] \ - else float(entity.description) + value = [] + for link_ in param['value_type_links']: + if entity.id == link_.domain.id: + value.append(float(link_.description)) case _: value = [] return value From da63bd0c669ad1ff43b445fa1f0a08b684cb8e12 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Thu, 17 Oct 2024 16:31:10 +0200 Subject: [PATCH 05/42] With Alex fixing value type search --- openatlas/api/endpoints/endpoint.py | 5 ++++- openatlas/api/endpoints/parser.py | 6 +++--- openatlas/api/resources/search.py | 33 +++++++++++++++++------------ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/openatlas/api/endpoints/endpoint.py b/openatlas/api/endpoints/endpoint.py index 48595d3a9..8f0feb8e4 100644 --- a/openatlas/api/endpoints/endpoint.py +++ b/openatlas/api/endpoints/endpoint.py @@ -243,7 +243,10 @@ def get_geojson_v2(self) -> dict[str, Any]: out = [] links = [ link_ for link_ in self.link_parser_check() if link_.property.code - in ['P53', 'P74', 'OA8', 'OA9', 'P7', 'P26', 'P27']] + in ['P53', 'P74', + 'OA8', 'OA9', + 'P7', 'P26', + 'P27']] for entity in self.entities: entity_links = [ link_ for link_ in links if link_.domain.id == entity.id] diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index f47a22104..970de5429 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -19,7 +19,7 @@ EntityDoesNotExistError, InvalidSearchSyntax, InvalidSearchValueError, LastEntityError, UrlNotValid) from openatlas.api.resources.search import ( - get_search_values, search_entity, value_to_be_searched) + get_search_values, search_entity) from openatlas.api.resources.search_validation import ( check_if_date_search, validate_search_parameters) from openatlas.api.resources.templates import ( @@ -84,7 +84,7 @@ def set_search_param(self) -> None: for category, value_list in search.items(): for values in value_list: values['logicalOperator'] = ( - values.get('logicalOperator') or 'or') + values.get('logicalOperator') or 'or') validate_search_parameters(category, values) if category in app.config['INT_VALUES']: values['values'] = list(map(int, values['values'])) @@ -100,7 +100,7 @@ def set_search_param(self) -> None: for search in url_parameters: for category, value_list in search.items(): for values in value_list: - is_comparable= False + is_comparable = False links = [] if check_if_date_search(category): is_comparable = True diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 584cf1300..b24b18173 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -18,8 +18,6 @@ def get_search_values( case "relationToID": values = flatten_list_and_remove_duplicates( [get_linked_entities_id_api(value) for value in values]) - case "valueTypeID": - values = [value[1] for value in values] case _: values = [ value.lower() if isinstance(value, str) else value @@ -27,9 +25,6 @@ def get_search_values( return values - - - def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: entity_values = value_to_be_searched(entity, param) operator_ = param['operator'] @@ -55,9 +50,10 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: bool_values.append(bool(not any( item in entity_values for item in search_value))) return all(bool_values) - if entity_values: - print(entity_values) bool_ = False + # print(entity_values) + # print(type(entity_values)) + # print(type(search_values)) match operator_: case 'equal' if logical_operator == 'or': bool_ = bool(any(item in entity_values for item in search_values)) @@ -79,7 +75,18 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: case 'greaterThan' if is_comparable and logical_operator == 'or': bool_ = bool(any(item < entity_values for item in search_values)) case 'greaterThan' if is_comparable and logical_operator == 'and': - bool_ = bool(all(item < entity_values for item in search_values)) + if param['category'] == 'valueTypeID': + test_bool = [] + for search_value in search_values: + test_dict = dict(entity_values) + if search_value[0] not in test_dict: + test_bool.append(False) + continue + test_bool.append(test_dict[search_value[0]] > search_value[1]) + print(test_bool) + bool_ = bool(all(test_bool)) + else: + bool_ = bool(all(item < entity_values for item in search_values)) case 'greaterThanEqual' if is_comparable and logical_operator == 'or': bool_ = bool(any(item <= entity_values for item in search_values)) case 'greaterThanEqual' if is_comparable and logical_operator == 'and': @@ -97,8 +104,8 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: def value_to_be_searched( entity: Entity, param: dict[str, Any]) \ - -> list[int | str | float] | Optional[datetime64] | Optional[float]: - value: list[int | str | float] | Optional[datetime64]| Optional[float] = [] + -> list[int | str | tuple[int, float]] | Optional[datetime64]: + value: list[int | str | tuple[int, float]] | Optional[datetime64] = [] match param['category']: case "entityID" | "relationToID": value = [entity.id] @@ -129,8 +136,6 @@ def value_to_be_searched( case "valueTypeID": value = [] for link_ in param['value_type_links']: - if entity.id == link_.domain.id: - value.append(float(link_.description)) - case _: - value = [] + if entity.id == link_.domain.id: + value.append((link_.range.id, float(link_.description))) return value From a0a4746534a742c0812c62803840d77f2fa03004 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Thu, 17 Oct 2024 16:47:52 +0200 Subject: [PATCH 06/42] With Alex adding new way to check value types in search --- openatlas/api/resources/search.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index b24b18173..6c7063eb8 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -40,20 +40,30 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: search_values = flatten_list_and_remove_duplicates(search_values) else: bool_values = [] - for search_value in search_values: + for item in search_values: if operator_ == 'equal': if logical_operator == 'and': bool_values.append(bool(any( - item in entity_values for item in search_value))) + item in entity_values for item in item))) if operator_ == 'notEqual': if logical_operator == 'and': bool_values.append(bool(not any( - item in entity_values for item in search_value))) + item in entity_values for item in item))) return all(bool_values) bool_ = False # print(entity_values) # print(type(entity_values)) # print(type(search_values)) + # import operator + # todo: check operator module to simplify the operator calls + def check_value_type(): + b = True + values = dict(entity_values) + for i in search_values: + if i[0] not in values or not values[i[0]] > i[1]: + b = False + break + return b match operator_: case 'equal' if logical_operator == 'or': bool_ = bool(any(item in entity_values for item in search_values)) @@ -76,15 +86,7 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: bool_ = bool(any(item < entity_values for item in search_values)) case 'greaterThan' if is_comparable and logical_operator == 'and': if param['category'] == 'valueTypeID': - test_bool = [] - for search_value in search_values: - test_dict = dict(entity_values) - if search_value[0] not in test_dict: - test_bool.append(False) - continue - test_bool.append(test_dict[search_value[0]] > search_value[1]) - print(test_bool) - bool_ = bool(all(test_bool)) + bool_ = check_value_type() else: bool_ = bool(all(item < entity_values for item in search_values)) case 'greaterThanEqual' if is_comparable and logical_operator == 'or': From 6cf07102775cda155a7829f81d3a76f9e6d2e25b Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Mon, 4 Nov 2024 17:02:20 +0100 Subject: [PATCH 07/42] refactor with Alex --- openatlas/api/resources/search.py | 67 ++++++++++++------------------- 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 6c7063eb8..5cebde4c0 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -1,3 +1,4 @@ +import builtins from typing import Any, Optional from flask import g @@ -50,12 +51,7 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: bool_values.append(bool(not any( item in entity_values for item in item))) return all(bool_values) - bool_ = False - # print(entity_values) - # print(type(entity_values)) - # print(type(search_values)) - # import operator - # todo: check operator module to simplify the operator calls + # Todo: add to all comparison functions and replace > with operators from import operator def check_value_type(): b = True values = dict(entity_values) @@ -64,44 +60,33 @@ def check_value_type(): b = False break return b + found = False + scope = getattr(builtins, 'any' if logical_operator == 'or' else 'all') match operator_: - case 'equal' if logical_operator == 'or': - bool_ = bool(any(item in entity_values for item in search_values)) - case 'equal' if logical_operator == 'and': - bool_ = bool(all(item in entity_values for item in search_values)) - case 'notEqual' if logical_operator == 'or': - bool_ = bool( - not any(item in entity_values for item in search_values)) - case 'notEqual' if logical_operator == 'and': - bool_ = bool( - not all(item in entity_values for item in search_values)) - case 'like' if logical_operator == 'or': - bool_ = bool(any( - item in value for item in search_values - for value in entity_values)) - case 'like' if logical_operator == 'and': - bool_ = bool(all( - item in ' '.join(entity_values) for item in search_values)) - case 'greaterThan' if is_comparable and logical_operator == 'or': - bool_ = bool(any(item < entity_values for item in search_values)) - case 'greaterThan' if is_comparable and logical_operator == 'and': + case 'equal': + found = bool(scope([item in entity_values for item in search_values])) + case 'notEqual': + found = bool( + not scope(item in entity_values for item in search_values)) + case 'like': + # Todo: this function seems to have been a word search but we want to have a %like% search + found = bool(any(item in value for item in search_values for value in entity_values)) + # found = bool(all(item in ' '.join(entity_values) for item in search_values)) + case True if not is_comparable: + found = False + case 'greaterThan': if param['category'] == 'valueTypeID': - bool_ = check_value_type() + found = check_value_type() else: - bool_ = bool(all(item < entity_values for item in search_values)) - case 'greaterThanEqual' if is_comparable and logical_operator == 'or': - bool_ = bool(any(item <= entity_values for item in search_values)) - case 'greaterThanEqual' if is_comparable and logical_operator == 'and': - bool_ = bool(all(item <= entity_values for item in search_values)) - case 'lesserThan' if is_comparable and logical_operator == 'or': - bool_ = bool(any(item > entity_values for item in search_values)) - case 'lesserThan' if is_comparable and logical_operator == 'and': - bool_ = bool(all(item > entity_values for item in search_values)) - case 'lesserThanEqual' if is_comparable and logical_operator == 'or': - bool_ = bool(any(item >= entity_values for item in search_values)) - case 'lesserThanEqual' if is_comparable and logical_operator == 'and': - bool_ = bool(all(item >= entity_values for item in search_values)) - return bool_ + found = bool(scope(item < entity_values for item in search_values)) + case 'greaterThanEqual': + found = bool(scope(item <= entity_values for item in search_values)) + case 'lesserThan': + found = bool(scope(item > entity_values for item in search_values)) + case 'lesserThanEqual': + found = bool(scope(item >= entity_values for item in search_values)) + + return found def value_to_be_searched( From ff0d6a286c27e42831135b9fc71ac1a79a13c6b9 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Tue, 5 Nov 2024 16:38:42 +0100 Subject: [PATCH 08/42] like operator done --- openatlas/api/resources/search.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 5cebde4c0..99de18026 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -66,12 +66,9 @@ def check_value_type(): case 'equal': found = bool(scope([item in entity_values for item in search_values])) case 'notEqual': - found = bool( - not scope(item in entity_values for item in search_values)) + found = bool(not scope(item in entity_values for item in search_values)) case 'like': - # Todo: this function seems to have been a word search but we want to have a %like% search - found = bool(any(item in value for item in search_values for value in entity_values)) - # found = bool(all(item in ' '.join(entity_values) for item in search_values)) + found = bool(scope(item in value for item in search_values for value in entity_values)) case True if not is_comparable: found = False case 'greaterThan': From ff05bfe2eaba0f951b13e1bab40cd82ccec2abc7 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Tue, 5 Nov 2024 16:58:43 +0100 Subject: [PATCH 09/42] Include operator --- openatlas/api/resources/search.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 99de18026..914fca8ac 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -1,4 +1,5 @@ import builtins +import operator from typing import Any, Optional from flask import g @@ -51,12 +52,19 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: bool_values.append(bool(not any( item in entity_values for item in item))) return all(bool_values) - # Todo: add to all comparison functions and replace > with operators from import operator - def check_value_type(): + # Todo: we never get here with valueTypeID. Test it + operator_mapping = { + 'greaterThan': 'gt', + 'greaterThanEqual': 'ge', + 'lesserThan': 'lt', + 'lesserThanEqual': 'le'} + + def check_value_type(op: str): + print("hello") b = True values = dict(entity_values) for i in search_values: - if i[0] not in values or not values[i[0]] > i[1]: + if i[0] not in values or not getattr(operator, op)(values[i[0]], i[1]): b = False break return b @@ -71,11 +79,10 @@ def check_value_type(): found = bool(scope(item in value for item in search_values for value in entity_values)) case True if not is_comparable: found = False + case True if param['category'] == 'valueTypeID': + found = check_value_type(operator_mapping['operator_']) case 'greaterThan': - if param['category'] == 'valueTypeID': - found = check_value_type() - else: - found = bool(scope(item < entity_values for item in search_values)) + found = bool(scope(item < entity_values for item in search_values)) case 'greaterThanEqual': found = bool(scope(item <= entity_values for item in search_values)) case 'lesserThan': From 4beaed4a1592f2f45968701ff448ab872ba09879 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 6 Nov 2024 15:38:40 +0100 Subject: [PATCH 10/42] bug fixing --- install/data_test_api.sql | 3 +- openatlas/api/resources/search.py | 11 ++++---- tests/test_api.py | 46 +++++++++++++++++++++++++------ 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/install/data_test_api.sql b/install/data_test_api.sql index 45a4e8a42..8c709f690 100644 --- a/install/data_test_api.sql +++ b/install/data_test_api.sql @@ -112,7 +112,8 @@ VALUES ('P67', (SELECT id FROM model.entity WHERE name='Shire'), (SELECT id FROM model.entity WHERE name='GeoNames'), '2761369', (SELECT id FROM model.entity WHERE name='close match') ), ('OA7', (SELECT id FROM model.entity WHERE name='Frodo'), (SELECT id FROM model.entity WHERE name='Sam'), NULL, (SELECT id FROM model.entity WHERE name='Economical') ), ('P67', (SELECT id FROM model.entity WHERE name='Shire'), (SELECT id FROM model.entity WHERE name='https://lotr.fandom.com/'), 'Fandom Wiki of lord of the rings', NULL), - ('P2', (SELECT id FROM model.entity WHERE name='Height'), (SELECT id FROM model.entity WHERE name='Shire'), '23.0', NULL ); + ('P2', (SELECT id FROM model.entity WHERE name='Height'), (SELECT id FROM model.entity WHERE name='Shire'), '23.0', NULL ), + ('P2', (SELECT id FROM model.entity WHERE name='Weight'), (SELECT id FROM model.entity WHERE name='Shire'), '999.0', NULL ); INSERT INTO web.entity_profile_image (entity_id, image_id) VALUES ( (SELECT id FROM model.entity WHERE name='Shire'), (SELECT id FROM model.entity WHERE name='Picture with a License') ) diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 914fca8ac..fc5cded7b 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -52,15 +52,14 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: bool_values.append(bool(not any( item in entity_values for item in item))) return all(bool_values) - # Todo: we never get here with valueTypeID. Test it + operator_mapping = { 'greaterThan': 'gt', 'greaterThanEqual': 'ge', 'lesserThan': 'lt', 'lesserThanEqual': 'le'} - + # Todo: include scope in check_value_type def check_value_type(op: str): - print("hello") b = True values = dict(entity_values) for i in search_values: @@ -77,10 +76,10 @@ def check_value_type(op: str): found = bool(not scope(item in entity_values for item in search_values)) case 'like': found = bool(scope(item in value for item in search_values for value in entity_values)) - case True if not is_comparable: + case _ if not is_comparable: found = False - case True if param['category'] == 'valueTypeID': - found = check_value_type(operator_mapping['operator_']) + case _ if param['category'] == 'valueTypeID': + found = check_value_type(operator_mapping[operator_]) case 'greaterThan': found = bool(scope(item < entity_values for item in search_values)) case 'greaterThanEqual': diff --git a/tests/test_api.py b/tests/test_api.py index eee1e5c79..0f0a20918 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -55,6 +55,8 @@ def test_api(self) -> None: alias = entity case 'Height': height = entity + case 'Weight': + weight_ = entity case 'Change of Property': change_of_property = entity case 'File not public': @@ -507,6 +509,31 @@ def test_api(self) -> None: "logicalOperator":"and"}]}""")) assert bool(rv.get_json()['pagination']['entities'] == 0) + rv = self.app.get(url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"entityAliases":[{"operator":"greaterThan", + "values":["Sûza"],"logicalOperator":"and"}], + "typeID":[{"operator":"equal","values":[1121212], + "logicalOperator":"and"}]}""")) + assert bool(rv.get_json()['pagination']['entities'] == 0) + + rv = self.app.get(url_for( + 'api_04.query', + entities=place.id, + classes='E18', + codes='place', + system_classes='person', + format='lp', + search=f"""{{"valueTypeID":[{{"operator":"greaterThanEqual", + "values":[({height.id},23.0), ({weight_.id}, 999.0)], + "logicalOperator":"and"}}]}}""")) + assert bool(rv.get_json()['pagination']['entities'] == 1) + for rv in [ self.app.get(url_for( 'api_04.query', @@ -561,6 +588,15 @@ def test_api(self) -> None: format='lp', search=f'{{"valueTypeID":[{{"operator":"equal",' f'"values":[({height.id},23.0)]}}]}}')), + self.app.get(url_for( + 'api_04.query', + entities=place.id, + classes='E18', + codes='place', + system_classes='person', + format='lp', + search=f'{{"valueTypeID":[{{"operator":"greaterThanEqual",' + f'"values":[({height.id},23.0)]}}]}}')), self.app.get(url_for( 'api_04.query', system_classes='place', @@ -701,7 +737,7 @@ def test_api(self) -> None: system_classes='person', format='lp', search='{"typeName": [{"operator": "like",' - '"values": ["Oun", "HeI"],' + '"values": ["Oun", "mark"],' '"logicalOperator": "and"}]}')), self.app.get(url_for( 'api_04.query', @@ -710,13 +746,7 @@ def test_api(self) -> None: format='lp', search=f'{{"typeIDWithSubs":[{{"operator":"notEqual",' f'"values":[{boundary_mark.id}],' - f'"logicalOperator":"and"}}]}}')), - self.app.get(url_for( - 'api_04.query', - system_classes='place', - search="""{"entityName":[{"operator":"notEqual", - "values":["Mordor"], - "logicalOperator":"or"}]}"""))]: + f'"logicalOperator":"and"}}]}}'))]: assert bool(rv.get_json()['pagination']['entities'] == 1) for rv in [ self.app.get(url_for( From 1faf8beb3196ca003036539a5ba14136d1a0b288 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Mon, 18 Nov 2024 16:10:58 +0100 Subject: [PATCH 11/42] included and/or into value type search --- openatlas/api/resources/search.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index fc5cded7b..0bf8df4a2 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -58,15 +58,22 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: 'greaterThanEqual': 'ge', 'lesserThan': 'lt', 'lesserThanEqual': 'le'} - # Todo: include scope in check_value_type - def check_value_type(op: str): - b = True + + def check_value_type(): + found_ = False values = dict(entity_values) + op = operator_mapping[operator_] for i in search_values: - if i[0] not in values or not getattr(operator, op)(values[i[0]], i[1]): - b = False - break - return b + if i[0] in values and getattr(operator, op)(values[i[0]], i[1]): + found_ = True + if logical_operator == 'or': + break + else: + if logical_operator == 'and': + found_ = False + break + return found_ + found = False scope = getattr(builtins, 'any' if logical_operator == 'or' else 'all') match operator_: @@ -79,7 +86,7 @@ def check_value_type(op: str): case _ if not is_comparable: found = False case _ if param['category'] == 'valueTypeID': - found = check_value_type(operator_mapping[operator_]) + found = check_value_type() case 'greaterThan': found = bool(scope(item < entity_values for item in search_values)) case 'greaterThanEqual': @@ -88,7 +95,6 @@ def check_value_type(op: str): found = bool(scope(item > entity_values for item in search_values)) case 'lesserThanEqual': found = bool(scope(item >= entity_values for item in search_values)) - return found From c065b0ddd88006047b397c37358b14c281394995 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Mon, 18 Nov 2024 16:48:38 +0100 Subject: [PATCH 12/42] tests, mypy, pylint --- .pylintrc | 2 +- openatlas/api/resources/search.py | 39 +++++++++++++++---------------- tests/test_api.py | 16 ++++++++++++- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/.pylintrc b/.pylintrc index 76459fcfd..6b0323fcf 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,7 +1,7 @@ [MASTER] ignore=openatlas.wsgi disable=C0111, broad-except, duplicate-code -good-names=bc, e, ex, f, i, id, ip, j, js, k, l, Run, rv, to, x, y, _ +good-names=bc, e, ex, f, i, id, ip, j, js, k, l, op, Run, rv, to, x, y, _ min-public-methods=1 # default=2 but isn't useful when working with inheritance [FORMAT] diff --git a/openatlas/api/resources/search.py b/openatlas/api/resources/search.py index 0bf8df4a2..53b1c0904 100644 --- a/openatlas/api/resources/search.py +++ b/openatlas/api/resources/search.py @@ -1,13 +1,12 @@ import builtins import operator -from typing import Any, Optional +from typing import Any from flask import g -from numpy import datetime64 from openatlas.api.resources.util import ( flatten_list_and_remove_duplicates, get_linked_entities_id_api) -from openatlas.models.entity import Entity, Link +from openatlas.models.entity import Entity def get_search_values( @@ -27,7 +26,7 @@ def get_search_values( return values -def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: +def search_entity(entity: Entity, param: dict[str, Any]) -> bool: entity_values = value_to_be_searched(entity, param) operator_ = param['operator'] search_values = param['search_values'] @@ -45,12 +44,13 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: for item in search_values: if operator_ == 'equal': if logical_operator == 'and': - bool_values.append(bool(any( - item in entity_values for item in item))) + bool_values.append( + bool(any(item in entity_values for item in item))) if operator_ == 'notEqual': if logical_operator == 'and': - bool_values.append(bool(not any( - item in entity_values for item in item))) + bool_values.append( + bool(not any( + item in entity_values for item in item))) return all(bool_values) operator_mapping = { @@ -59,7 +59,7 @@ def search_entity(entity: Entity | Link, param: dict[str, Any]) -> bool: 'lesserThan': 'lt', 'lesserThanEqual': 'le'} - def check_value_type(): + def check_value_type() -> bool: found_ = False values = dict(entity_values) op = operator_mapping[operator_] @@ -78,30 +78,29 @@ def check_value_type(): scope = getattr(builtins, 'any' if logical_operator == 'or' else 'all') match operator_: case 'equal': - found = bool(scope([item in entity_values for item in search_values])) + found = bool(scope([i in entity_values for i in search_values])) case 'notEqual': - found = bool(not scope(item in entity_values for item in search_values)) + found = bool(not scope(i in entity_values for i in search_values)) case 'like': - found = bool(scope(item in value for item in search_values for value in entity_values)) + found = bool(scope( + i in value for i in search_values for value in entity_values)) case _ if not is_comparable: found = False case _ if param['category'] == 'valueTypeID': found = check_value_type() case 'greaterThan': - found = bool(scope(item < entity_values for item in search_values)) + found = bool(scope(i < entity_values for i in search_values)) case 'greaterThanEqual': - found = bool(scope(item <= entity_values for item in search_values)) + found = bool(scope(i <= entity_values for i in search_values)) case 'lesserThan': - found = bool(scope(item > entity_values for item in search_values)) + found = bool(scope(i > entity_values for i in search_values)) case 'lesserThanEqual': - found = bool(scope(item >= entity_values for item in search_values)) + found = bool(scope(i >= entity_values for i in search_values)) return found -def value_to_be_searched( - entity: Entity, param: dict[str, Any]) \ - -> list[int | str | tuple[int, float]] | Optional[datetime64]: - value: list[int | str | tuple[int, float]] | Optional[datetime64] = [] +def value_to_be_searched(entity: Entity, param: dict[str, Any]) -> Any: + value: Any = [] match param['category']: case "entityID" | "relationToID": value = [entity.id] diff --git a/tests/test_api.py b/tests/test_api.py index 0f0a20918..b4f5f1dd6 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -522,6 +522,19 @@ def test_api(self) -> None: "logicalOperator":"and"}]}""")) assert bool(rv.get_json()['pagination']['entities'] == 0) + rv = self.app.get(url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search=f"""{{"valueTypeID": + [{{"operator":"lesserThanEqual", + "values":[({height.id},1.0), ({weight_.id}, 1.0)], + "logicalOperator":"and"}}]}}""")) + assert bool(rv.get_json()['pagination']['entities'] == 0) + rv = self.app.get(url_for( 'api_04.query', entities=place.id, @@ -529,7 +542,8 @@ def test_api(self) -> None: codes='place', system_classes='person', format='lp', - search=f"""{{"valueTypeID":[{{"operator":"greaterThanEqual", + search=f"""{{"valueTypeID": + [{{"operator":"greaterThanEqual", "values":[({height.id},23.0), ({weight_.id}, 999.0)], "logicalOperator":"and"}}]}}""")) assert bool(rv.get_json()['pagination']['entities'] == 1) From e72fb8a20326532374bd20a42010c407b9b0fc32 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Mon, 18 Nov 2024 17:12:46 +0100 Subject: [PATCH 13/42] fix for multiple searches --- openatlas/api/endpoints/parser.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index 970de5429..155361eaf 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -121,15 +121,13 @@ def set_search_param(self) -> None: "value_type_links": flatten_list_and_remove_duplicates(links)}) - # Todo: fix multiple valueTypeID searches, e.g. - # search={"valueTypeID":[{"operator":"equal","values":[(150412,34)], - # "logicalOperator":"or"}]}&search={"valueTypeID":[{"operator":"equal", - # "values":[(131994,13.5),(131997,3.7)],"logicalOperator":"or"}]} def search_filter(self, entity: Entity) -> bool: + found = False for param in self.search_param: - if not search_entity(entity, param): - return False - return True + if search_entity(entity, param): + found = True + break + return found def get_properties_for_links(self) -> Optional[list[str]]: if self.relation_type: From 3ea50eaf3124a4fa69081eaae0da73383a60b61d Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Mon, 18 Nov 2024 17:33:03 +0100 Subject: [PATCH 14/42] finding new issues --- openatlas/api/endpoints/endpoint.py | 1 + openatlas/api/endpoints/parser.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/openatlas/api/endpoints/endpoint.py b/openatlas/api/endpoints/endpoint.py index 53cc853e9..91b4b9354 100644 --- a/openatlas/api/endpoints/endpoint.py +++ b/openatlas/api/endpoints/endpoint.py @@ -35,6 +35,7 @@ def resolve_entities(self) -> Response | dict[str, Any]: if self.parser.type_id: self.entities = self.filter_by_type() if self.parser.search: + print(self.parser.search) self.entities = [ e for e in self.entities if self.parser.search_filter(e)] if self.parser.export == 'csv': diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index 155361eaf..f6ae0174c 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -110,6 +110,8 @@ def set_search_param(self) -> None: links.append(Entity.get_links_of_entities( value[0], inverse=True)) + # Todo: different between each search parameter. This + # list just puts every search param in a list self.search_param.append({ "search_values": get_search_values( category, From 13619cfd144476d038d26ba890612adcbb8e385d Mon Sep 17 00:00:00 2001 From: NinaBrundke Date: Tue, 19 Nov 2024 11:41:41 +0100 Subject: [PATCH 15/42] Manual adaptions and corrections for Examples --- .../source/examples/archaeological_data.rst | 187 ++++++++++++------ sphinx/source/examples/artifacts.rst | 66 +++---- sphinx/source/examples/index.rst | 9 +- sphinx/source/examples/journey.rst | 55 +++--- sphinx/source/examples/letters.rst | 41 ++-- sphinx/source/examples/move_event.rst | 17 +- sphinx/source/examples/places.rst | 44 +++-- sphinx/source/examples/profession.rst | 18 +- sphinx/source/examples/reference_systems.rst | 28 +-- sphinx/source/examples/time_spans.rst | 34 ++-- sphinx/source/examples/types.rst | 46 +++-- 11 files changed, 319 insertions(+), 226 deletions(-) diff --git a/sphinx/source/examples/archaeological_data.rst b/sphinx/source/examples/archaeological_data.rst index f43143bf7..662696985 100644 --- a/sphinx/source/examples/archaeological_data.rst +++ b/sphinx/source/examples/archaeological_data.rst @@ -3,90 +3,161 @@ Archaeological data .. toctree:: -The steps mentioned below describe how to enter archaeological data into OpenAtlas. -The following elements are involved in the procedure: - -* :doc:`/entity/place`: the archaeological site itself (Level 1) -* :doc:`/entity/feature`: a subunit of the place, e.g. graves, buildings, and pits. A place can consist of multiple subunits (Level 2) -* :doc:`/entity/stratigraphic_unit`: a subunit of the feature, e.g. burial. A feature can consist of multiple subunits (Level 3) -* :doc:`/entity/artifact`: an archaeological artifact, e.g. coin or knife (Level 4) -* :doc:`/entity/human_remains`: subunits of a burial, e.g. bones and teeth that carry anthropological information (Level 4) -* :doc:`/entity/type`: used for classification, can be extended by users -* :doc:`/entity/reference`: citation, e.g. book or article written a bout the site or any of the subunits -* :doc:`/entity/file`: an image or other file concerning the site or any of its subunits +The following steps describe how to enter archaeological data into OpenAtlas. +These elements are involved in the procedure: + +* :doc:`/entity/place`: The archaeological site itself (Level 1) +* :doc:`/entity/feature`: A subunit of the place, e.g. one or more graves, + buildings, or pits. Each place can consist of multiple subunits (Level 2) +* :doc:`/entity/stratigraphic_unit`: A subunit of a feature such as a burial + or the backfilling of a grave. A feature can consist of multiple subunits + (Level 3) +* :doc:`/entity/artifact`: An archaeological artifact, e.g. a coin or knife + (Level 4) +* :doc:`/entity/human_remains`: Bones and teeth that carry anthropological + information (Level 4) +* :doc:`/entity/type`: Used for classification, can be extended by most + users (depending on status) +* :doc:`/entity/reference`: Citation the information is coming from, such as + books, articles or online sources concerning the site or any of its subunits +* :doc:`/entity/file`: One or more images or other file concerning the site or + any of its subunits .. image:: /entity/sub_unit.jpg Adding a new place ------------------ -In order to store new archaeological information in the database, the first necessary step is to create a new -:doc:`/entity/place`. In the OpenAtlas database a place is a physical thing that has a certain position and or extend in -space that can be connected to various other information (temporal, spatial, events, sources etc.). - -* Click on :doc:`/entity/place` in the :doc:`/ui/menu` and create a new entry by using the **+ Place** button +In order to store new archaeological information in the database, the first +necessary step is to create a new :doc:`/entity/place`. A place is a +physical thing with a certain position and/or extend in +space that can be connected to various other information (temporal, spatial, +events, sources etc.). +To create a new place + +* Click on :doc:`/entity/place` in the :doc:`/ui/menu` and create a new + entry by using the **+ Place** button * State the site's name -* Select an appropriate :doc:`/entity/type` from the list, e.g. Burial Site or Settlement -* Use the magnifier button on the map to add the site to the map as well as a GeoNames reference if desired -* Add further information, e.g. evidence, an alias, a date or a description if available -* Press **Insert** to save the entry -* To add a citation click the **Reference tab** -* If you want to add an image e.g. a plot or photo of the site use the **File tab** +* Select an appropriate :doc:`/entity/type` from the list, e.g. burial site + or settlement +* Use the magnifier button on the map to add the site to the map as well as + a GeoNames reference if desired +* Add further information, e.g. evidence, an alias, a date or a description; + keep in mind that some additional form fields might be required to save + information +* Press **Insert** to save the entry. Press **Insert and continue** to save and + add another place. A new place form will open. Press + **Insert and add feature** to save and immediately add a feature to the + place. A feature form will open +* To add a citation click the **Reference tab** after saving the entry +* If you want to add an image e.g. a plot or photo of the site use the + **File tab** after saving the entry Adding a feature to the site ---------------------------- -Next, a :doc:`/entity/feature` connected to the :doc:`/entity/place` will be created. -This feature can be a grave of a graveyard, a building of a settlement, etc. +In a next step you can add a :doc:`/entity/feature` to the +:doc:`/entity/place`. A feature can be a grave of a graveyard, a building +of a settlement, etc. To add a feature to a place -* Click on the **Feature Tab** and create a new entry by using the **+ Feature** button +* Click on the **Feature Tab** and create a new entry by using the + **+ Feature** button or click **Insert and add feature** when saving a + place's information * Choose a descriptive name * Select an appropriate :doc:`/entity/type` from the list -* Add further information, e.g. dimensions or a description -* Press **Insert and add stratigraphic unit** to save the entry and go on with the workflow +* Add further information, e.g. dimensions or a description; keep in mind + that some additional form fields might be required to save information +* Press **Insert** to save the entry. Press **Insert and continue** to save and + add another feature to the same place. A new feature form will open. Press + **Insert and add stratigraphic unit** to save and immediately add a + stratigraphic unit to the feature. A stratigraphic unit form will open -If you want to link the created feature to a different citation or add an image you can use **Insert** and add those -information or go back later and do it then. In this case you would have to click the **Stratigraphic unit Tab** and the -**+ Stratigraphic unit** button to go on with the workflow. +After saving the information on the feature a different citation, an image, +etc. can be added in the same way as for place. Keep in mind, you can also +always come back to an entry later to add or change information. Adding a stratigraphic unit to the feature ------------------------------------------ -Every :doc:`/entity/feature` can consist of one or more :doc:`/entity/stratigraphic_unit`. -For a grave this would be the burial or a burial and the backfilling. - -* By clicking Insert and add stratigraphic unit in the before mentioned step, you can directly enter a stratigraphic unit connected to the created feature +Every :doc:`/entity/feature` can consist of one or more +:doc:`/entity/stratigraphic_unit`. +For a grave this would be one or more burials and/or the backfilling. + +* Click on the **Stratigraphic unit Tab** and create a new entry by using the + **+ Stratigraphic unit** button or click + **Insert and add stratigraphic unit** when saving information on a feature + to open the stratigraphic unit form * Choose a descriptive name -* Select an appropriate :doc:`/entity/type` from the list, e.g. burial or interface -* Add additional information on the stratigraphic unit if available -* Press **Insert and add artifact** or **Insert an add human remains** to go on with the workflow +* Select an appropriate :doc:`/entity/type` from the list, e.g. burial or + interface +* Add additional information on the stratigraphic unit; keep in mind that + some additional form fields might be required to save information +* Press **Insert** to save the entry. Press **Insert and continue** to save and + add another stratigraphic unit to the same feature. A new feature form + will open. Press **Insert and add artifact** to save and + immediately add an artifact to the stratigraphic unit. An artifact + form will open. Click **Insert an add human remains** to save and + immediately add anthropological information on bones to the stratigraphic + unit. A human remains form will open + +After saving the information on the stratigraphic unit a different citation, +an image, etc. can be added in the same way as for place. Keep in mind, you +can also always come back to an entry later to add or change information. Adding an artifact to the stratigraphic unit -------------------------------------------- -The following steps add a :doc:`/entity/artifact` to the before created :doc:`/entity/stratigraphic_unit`. You can now add grave goods to a burial or -artifacts to a certain layer of the feature. +The following steps add an :doc:`/entity/artifact` to a +:doc:`/entity/stratigraphic_unit`. -* By clicking Insert and add artifact in the before mentioned step, you can directly connect an artifact to the newly created stratigraphic unit +* Add an artifact to a stratigraphic unit by clicking the **Artifact tab** + and create a new entry by using the **+ Artifact** button or click + **Insert and add artifact** when saving information on a stratigraphic unit + to open the artifact unit form * Choose a descriptive name -* Select an appropriate :doc:`/entity/type` from the list, e.g. pottery or a finger ring -* Add additional information if available -* Press **Insert** to save the entry -* Add a file if desired by using the **File** tab +* Select an appropriate :doc:`/entity/type` from the list such as pottery or + finger ring +* Add additional information; keep in mind that some additional form fields + might be required to save information +* Press **Insert** to save the entry or **Insert and continue** to add + another artifact to the same super immediately +* Add a file or citation if desired by using the **File** tab + +Artifacts can also be added directly to a place or feature, e.g. to add +stray finds to a place. To do so, go to the place or feature you want to add +an artifact to. Click the **Artifact tab** and then the **+ Artifact** button. +The "super" of an artifact (a place, feature, or stratigraphic unit) can be +changed in the artifact's form after pressing the **Edit** button. +You can also create an artifact by clicking the artifact tab in the menu and +the **+ Artifact** button afterwards. The artifact can then be linked to an +existing super in the form. -You can also enter an artifact by going to the stratigraphic unit you want to link the artifact to. Click the **Artifact tab** and -**+ Artifact** afterwards. Adding human remains to the stratigraphic unit ---------------------------------------------- -Anthropological data can be entered into OpenAtlas by adding :doc:`/entity/human_remains`. You can do so by connecting a -certain bone to a :doc:`/entity/stratigraphic_unit` and add all the relevant information, e.g. pathological changes, -measurements, discoloration, or additional information. Please note that additional information can -be entered via custom types in the stratigraphic unit entry mask, e.g. biological sex, gender, +Anthropological data can be entered by adding :doc:`/entity/human_remains`. +You can do so by connecting a certain bone to a +:doc:`/entity/stratigraphic_unit` and add all the relevant information, e.g. +pathological changes, measurements, discoloration, or additional information. +Please note that additional information can be entered via custom types in +the stratigraphic unit entry mask, e.g. biological sex, gender, and age of an individual. -* By clicking Insert and add human remains in the before mentioned creation of a stratigraphic unit, you can directly connect human remains to it +* Add human remains to a stratigraphic unit by clicking the + **Human remains tab** and create a new entry by using the + **+ Human remains** button or click **Insert and add human remains** when + saving information on a stratigraphic unit to open the human remains form * Choose a descriptive name -* Select an appropriate :doc:`/entity/type` from the list, e.g. femur or canine -* Add additional information if available -* Press **Insert** to save the entry -* Add a file if desired by using the **File** tab - -You can also enter :doc:`/entity/human_remains` by going to the stratigraphic unit you want to link the information to. Click the -**Human remains tab** and **+ Human remains button** afterwards. +* Select an appropriate :doc:`/entity/type` from the list such as humerus or + skull +* Add additional information; keep in mind that some additional form fields + might be required to save information +* Press **Insert** to save the entry or **Insert and continue** to add + another bone or tooth to the same super immediately +* Add a file or citation if desired by using the **File** tab + +Human remains can also be added directly to a place or feature, e.g. to add +stray finds to a place. To do so, go to the place or feature you want to add +the remains to. Click the **Artifact tab** and then the **+ Human remains** +button. +The "super" of a human remains entry (a place, feature, or stratigraphic unit) +can be changed in the form after pressing the **Edit** button. +You can also create human remain entries by clicking the artifact tab in the +menu and the **+ Human remains** button afterwards. The remains can then be +linked to an existing super in the form. diff --git a/sphinx/source/examples/artifacts.rst b/sphinx/source/examples/artifacts.rst index 9b1f1e800..961775c5a 100644 --- a/sphinx/source/examples/artifacts.rst +++ b/sphinx/source/examples/artifacts.rst @@ -7,7 +7,7 @@ This tutorial describes how to create a new artifact and add information to it. The following elements are involved: * :doc:`/entity/artifact`: A physical object, made by humans – e.g. a coin, - a letter or a tool + a letter, or a tool * :doc:`/entity/actor`: As creator and/or owner of the artifact * :doc:`/entity/event`: Creation of the artifact * :doc:`/entity/file`: You can upload an image file connected to the artifact @@ -22,24 +22,25 @@ To create an artifact as representation of the object you want to add: * Choose a descriptive **name** * Select an appropriate :doc:`/entity/type` from the list * **Owned by**: If applicable, choose an owner of the artifact, e.g. a museum - it is stored at -* Add further information e.g. **date** or **description** or choose option + it is stored at or a person who possesses the artifact +* Add further information such as **date** or **description** or choose options from type trees * Press **Insert** to save the entry Regarding date: the begin date represents the creation of the artifact and can -be entered as a time span. Regarding the description field: this can be used -to record information that is not covered by the several types you can choose -from above. Keep in mind, it has several advantages to cover as much information -as possible by using types over free text in the description field. If there is -no fitting type, please follow this :doc:`instructions` -to add new types to the list. Please note, that “owned by” is not used to link -a creator of an artifact. You can link a creator by adding a creation event -(see below). +be entered as a time span. +Regarding the description field: this can be used to record information +that is not covered by the various types. Keep in mind, using types +has advantages over free text in the description field (Especially for the +presentation of an artifact on the presentation site). +If there is no fitting type, please follow this +:doc:`instruction` to add new types to the list. Please +note, that “owned by” is not used to link a creator of an artifact. You can +link a creator by adding a creation event (see below). Add a reference to the artifact ------------------------------- -To link a reference to the newly created artifact, choose +To link a reference to a newly created artifact, choose :doc:`/entity/reference` from the tabs .. image:: reference_tab.png @@ -49,30 +50,27 @@ Then choose from the following options: * Link the artifact to an already existing reference by using the **Link** button -* Create a new :doc:`/entity/reference` by using the **+Bibliography** or - **+Edition** button +* Create a new :doc:`/entity/reference` by using the **+ Bibliography** or + **+ Edition** button * Create a new :doc:`external reference` by using the - **+External** reference button + **+ External reference** button Add a file to the artifact -------------------------- -To add an image file to the artifact, choose **File** from the tabs. Then choose -from the following options: +To add an image file (or any other sort of file, really) to the artifact, +choose **File** from the tabs. Then choose from the following options: * Link the artifact to an already uploaded file -* Upload a new file by using the **+File** button, you can add information and +* Upload a new file by using the **+ File** button, you can add information and choose a file here Link a creation event --------------------- -To do so, click the **Event** tab. Here you can choose between a move event -(**+Move button**) and a creation event (**+Production button**). Tab the -+Production button (to learn how a move event can be used, please see the -tutorial on :doc:`/examples/letters`). +To do so, click the **Event** tab. Here click the **+ Production button**. * Choose a descriptive **name** for the creation event * Select an appropriate :doc:`/entity/type` from the list -* Add other information as needed, e.g. a date or add free text in the +* Add other information as needed such as a date or add free text in the description field * Press **Insert** to save the entry @@ -96,10 +94,10 @@ Please use **Link** here to be able to choose an actor as creator (or add a new actor, go back to the event page, choose actor - link again and follow the steps below). You can now add the following information: -* Type of the actor, in this case choose creator +* Type of actor, in this case choose creator * Actor: choose the creator of the artifact from a list of already added actors * Change activity “**from participated**” in to “**performed**” -* if wanted, add a date and/or description +* if known, add a date for the creation of an artifact and/or add a description With the above steps you have created an artifact connected to a creation event and actor as creator. @@ -110,13 +108,12 @@ First of all, adding an artifact to more than one :doc:`/entity/place` or :doc:`/entity/feature` is not possible. If an artifact has a link to multiple locations, it is possible to keep track of that in the following way: -* Choose the :doc:`/entity/place` the artifact has it's first occurrence at - - e.g. the production site or a place an artifact was found at during +* Choose the :doc:`/entity/place` the artifact has it's first occurrence at, +for example its production site or a place an artifact was found at during archaeological excavation. -* link any other place the artifact is linked to by adding a move event - - e.g. when an artifact is transfered to a place where it is later found - during an archaeological excavation after the production event or when it is - moved to a museum or sold to a new owner. Click here to see a short tutorial +* link any other place by adding a move event - for example when an artifact + is moved from an excavation site to a museum or from a production site to + a buyer's house. Click here to see a short tutorial on adding a :doc:`move_event` **Example:** Leonardo painted the Mona Lisa in his workshop in Florence, @@ -124,5 +121,8 @@ therefore Florence would be linked to the artifact as place. It was then acquired by King Francis of France and exhibited in Château d'Amboise. This change of location can also be tracked in the database by a :doc:`move_event`. Another :doc:`move_event` maps the transfer of the image to Fountainebleau. -By adding further move events the way of the picture to the Louvre in Paris -can be documented. +By adding further move events the way of the artwork to its present +location -the Louvre in Paris - can be documented. + +To learn more on how to use a move event, please see the tutorial on +:doc:`/examples/letters`). diff --git a/sphinx/source/examples/index.rst b/sphinx/source/examples/index.rst index 3015036c3..9dc041292 100644 --- a/sphinx/source/examples/index.rst +++ b/sphinx/source/examples/index.rst @@ -1,10 +1,11 @@ Examples ======== -Here, you can find step by step - examples for typical data entry scenarios, some of them are -very project-specific. Please keep in mind, that there are different ways to enter the same -set of data. The following examples are suggestions, but please discuss the best workflow for your project within -your team. +Here, you can find step by step - examples for typical data entry scenarios, +some of them are very project-specific, others have a broader scope. Please +keep in mind, that there are always several different ways to enter the same +set of data. The following examples are suggestions, but please discuss the +best workflow for your project within your team. General ------- diff --git a/sphinx/source/examples/journey.rst b/sphinx/source/examples/journey.rst index 3f82a2c98..cf75487ce 100644 --- a/sphinx/source/examples/journey.rst +++ b/sphinx/source/examples/journey.rst @@ -1,35 +1,38 @@ -Journey + Journey ======= .. toctree:: -The following steps describe how to enter a journey as move event. For more -information on move events in general see this :doc:`tutorial`. +A journey can be tracked in OpenAtlas as a series of move events as +described in the following steps. For more information on move events in +general see this :doc:`tutorial`. On move events concerning artifacts, have a look at the :doc:`letter tutorial`. -These steps describe how to enter a journey as special case of a **move -event**. To create a new move event following elements are involved in the +The following steps describe how to enter a journey as special case of a **move +events**. To create a new move event the following elements are involved in the procedure: -* :doc:`/entity/actor`: the person/persons that went on a journey -* :doc:`/entity/event`: the **Move** of the letter from one place to another -* :doc:`/entity/place`: start or end point of the journey -* :doc:`/entity/type`: used for classification, can be extended by users +* :doc:`/entity/actor`: The person/persons that moved/went on a journey +* :doc:`/entity/event`: The **Move** of a letter or person from one place to + another +* :doc:`/entity/place`: Start or end point of the move event +* :doc:`/entity/type`: Used for classification, list of types can be extended + by users Adding actors ------------- If not all :doc:`actors` involved in the journey were entered into the database already, add them via a click on the respective tab in the :doc:`menu`. Here, click the **+ Person** button to get to -the form. As for all other forms, a name is required to save the data. +the form. As for all other forms, at least a name is required to save the data. Adding locations ---------------- -If not all :doc:`locations` involved in the journey were -entered into the database already, add them via a click on the respective -tab in the :doc:`menu`. Here, click the **+ Place** button to get to -the form. As for all other forms, a name is required to save the data. +If not all :doc:`locations` involved in the journey were already +entered into the database, add them via a click on the respective tab in the +:doc:`menu`. Here, click the **+ Place** button to get to +the form. As for all other forms, at least a name is required to save the data. Creating the move event ----------------------- @@ -38,10 +41,10 @@ The following steps will create a move event: * Click on the **Event** tab in the menu then use the **+ Move** button * Fill out the form, for more information see the :doc:`move event tutorial`. -* Link persons in this form who made the journey +* Link one or more persons that went on the trip * **Please also note**: Use **preceding event** to document multiple parts of a trip. Unlike **sub events**, these can be put in chronological - order. Sub events are there to capture events that happen at the same time + order. Use **sub events** to capture events that happen at the same time (for more information see :doc:`move event tutorial`). * Click the **Insert** button to save the data or **Insert and continue** button to save and start to enter another move event @@ -53,15 +56,15 @@ creates a **moved by** relation to the event. Unfortunately this is not possible for groups in the current version of CIDOC CRM. Alternatively, actors (persons and groups) can be added via the actor tab where -it is also possible to create new ones via the **+ Person** and **+ Group** -button. In this case a more general **participated at** relation will be used -between actors and event. It is also possible to add additional information: +it is also possible to create new actor entities via the **+ Person** and +**+ Group** button. In this case a more general **participated at** relation +will be created between actors and events. It is also possible to add additional +information: -* At type you can define the role of the actor in the journey; if - there is no suitable entry in the list, a new type can be created - depending on the user's authorization, see the :doc:`types - tutorial`. +* Via type you can define the role of an actor in a journey; if + there is no suitable type in the list, a new one can be created + depending on the user's OpenAtlas status. For more see the + :doc:`types tutorial`. * The actor can be changed afterwards via the **Change** button -* The form of participation can be determined -* In addition, dates for the participation (in case they differ from the - event) and a free text description are possible +* In addition, dates for a participation (in case they differ from the + event) and a free text description can be added diff --git a/sphinx/source/examples/letters.rst b/sphinx/source/examples/letters.rst index 7b0d029d9..0c86a2420 100644 --- a/sphinx/source/examples/letters.rst +++ b/sphinx/source/examples/letters.rst @@ -3,28 +3,27 @@ Letters .. toctree:: -The following steps describe how to enter a letter exchange event. +The following step by step instruction describes how to enter a letter +exchange event. The following elements are involved in the procedure: -* :doc:`/entity/artifact`: the physical presentation of the letter -* :doc:`/entity/source`: the content of the letter -* :doc:`/entity/event`: the **Move** of the letter from one place to another +* :doc:`/entity/artifact`: The physical presentation of the letter +* :doc:`/entity/source`: The content of the letter +* :doc:`/entity/event`: The **Move** of the letter from one place to another * :doc:`/entity/place`: Start or end point of the letter exchange * :doc:`/entity/actor`: Sender/recipient of the letter -* :doc:`/entity/type`: used for classification, can be extended by users +* :doc:`/entity/type`: Used for classification, can be extended by users Adding an artifact ------------------ -The created artifact is the physical presentation of the letter and the -following data concerns the object e.g. the begin date would be the creation of -the letter, the description can be used to record e.g. the material of -the object. +The created artifact is the physical presentation of the letter. So the +begin of the date field would be the creation of the letter, etc. * Click on :doc:`/entity/artifact` in the :doc:`/ui/menu` and create a new entry by using the **+ Artifact** button * Choose a descriptive name -* Select an appropriate :doc:`/entity/type` from the list, e.g. letter -* Add further information as date or description if available +* Select an appropriate :doc:`/entity/type` from the list, such as letter +* Add further information e.g. a date or description * Press **Insert** to save the entry Adding a source @@ -38,37 +37,39 @@ example, if there are copies of the letter, they all have the same text * Choose a descriptive name * Select an appropriate :doc:`/entity/type` from the list * Click on **Artifact** and choose the before created letter from the list +* Add more information as desired * Press **Insert** to save the entry -It is important to link the artifact to the source in this way to reflect that -it is the source written on the letter. +**Please note**: It is important to link the artifact to the source in this way +to reflect that it is the source written on the letter. If you would link it using the tab **Artifact** it means the source refers to the artifact instead. Adding the move event --------------------- -This creates an entry concerning the movement of the letter. +Now you can create a move event to track the sending of the letter from +one location to the other: * After saving the source, you can see the linked artifact with its name in the - source view and click on it + source view. Click on it * In the artifact view click on the **Event** tab in the menu and create a new move with the **+ Move** button * Choose a descriptive name * Select an appropriate :doc:`/entity/type` from the list, e.g. letter exchange -* With *from* and *to* you can choose the starting and ending location of the +* With *from* and *to* you can choose the start and end location of the move -* The respective artifact should already be preset +* The respective artifact should already be selected * If available, enter the dates for the letter exchange * Press **Insert** to save the entry Adding sender and recipient --------------------------- -Now you can link one actor at a time to the move event by the following steps. +Now you can link one actor at by using the following steps: * Open the created event by clicking on it in the event tab of the move * Click on the **Actor** tab -* Either link an already entered person with **Link** or create a new one with - **+ Person** button +* Either link an already exiting person from the list with **Link** or + create a new one by using the **+ Person** button * When entering the involvement information, choose the actor and add the respective type (sender/recipient) * Press **Insert** to save the entry diff --git a/sphinx/source/examples/move_event.rst b/sphinx/source/examples/move_event.rst index eff7788bb..ce92e113e 100644 --- a/sphinx/source/examples/move_event.rst +++ b/sphinx/source/examples/move_event.rst @@ -11,7 +11,7 @@ Create a new move event - general instruction As move events are a subgroup of :doc:`events`, click **Event** in the menu to create a new entry. This will bring you to the -event overview page where you can find the **+Move** button. +event overview page where you can find the **+ Move** button. By clicking it a form will open in which you can add the following information: @@ -25,18 +25,17 @@ information: cannot be added in a temporal order and are used to represent events that occur simultaneously. Examples are a music festival with parallel concerts or a war with overlapping battles at different locations. To represent a - temporal sequence, use **preceding event** (for a short - introduction see the :doc:`journey` tutorial). You can - select the event from a list of already entered events. If the event you are - looking for cannot be found in this list, please add it via **Event** in the - menu and then link it + temporal sequence, use **preceding event** (for a short introduction see + the :doc:`journey` tutorial). You can select the event from a list of + already entered events. If the event you are looking for cannot be found + in this list, please add it via **Event** in the menu and then link it * You can add a **preceding event**, for more information see above or the :doc:`journey` tutorial * Via **from** you can add a location from where the move event started, think of the starting point of a journey or the place a letter was sent from. You can choose a location from a list of already added locations. If the place you are looking for is not in this list yet, please add it via - **Place** menu and then link it + **Place** in the menu and then link it * Via **to**, you can add the end location of the move event. For more information check **from** (above in this tutorial) * If an **artifact** was moved by the event, e.g. a letter that was sent, you @@ -50,12 +49,12 @@ information: :doc:`journey` tutorial. * It is possible to link the move event by using external references (find more information :doc:`here`) -* Enter a start and end **date** of the move event +* Enter a start and end **date** of the move event if known * Additionally you can enter a **description** of the event as free text By clicking the **Insert** or **Insert and continue** button you can save the entered data. After saving the information, you can link sources, actors, -references, files and notes via the respective buttons on the landing page of +references, files, and notes via the respective buttons on the landing page of your new entry. For more information on move events including an artifact, please see the diff --git a/sphinx/source/examples/places.rst b/sphinx/source/examples/places.rst index 7758fb403..cb9cef782 100644 --- a/sphinx/source/examples/places.rst +++ b/sphinx/source/examples/places.rst @@ -3,7 +3,7 @@ Places .. toctree:: -Here you can find out how to enter new places and how to use the map. +Below, you can find out how to enter new places and how to use the map. Create a new place ------------------ @@ -16,7 +16,7 @@ to the respective form. The following information can be entered: required to save data * If a place has several designations or is also known by other names, note them under :doc:`/ui/alias`. Please keep in mind: Place names in other - languages can be covered by using **Geonames** as + languages can be covered by using **Geonames** as a :doc:`/entity/reference_system` * Select a fitting :doc:`/entity/type` from the list. If none can be found, you can add new types (depending on your user group). You can find more @@ -32,7 +32,7 @@ How to use the map The :doc:`/tools/map` has multiple functionalities: * You can zoom in and out by using the **+** and **-** button or make the - map full screen as well + map full screen * Use the magnifying glass to search for places. Type a place name in the search field, press enter and choose the correct place from the list. The map will zoom to the chosen location and a pop-up will be shown. @@ -44,31 +44,33 @@ The :doc:`/tools/map` has multiple functionalities: * **Import ID and Coordinates** * The map on which the visualization is based can be changed by hovering - over the layer button Here, for example, "Landscape", "Street Map" or " - Satellite" views are available. In addition, various settings for the maps - can be made here, e.g. whether clusters or markers are to be displayed + over the layer button. "Landscape", "Street Map" or "Satellite" views are + available. In addition, various settings for the maps can be made, e.g. + whether clusters or markers are to be displayed * The map can also be used to set your own markers for locations. Four different modes are available for this: * **Centerpoint**: Sets a point at the position a physical thing is located at * **Linestring**: A line can be drawn to show the location of e.g. a - border or an old river bed. Double-click on the last drawn point to end - the drawing mode - * **Shape**: via the rectangle you can draw a shape that represents - the location - use this if the exact location of a physical thing is - known e.g. for a certain building with known location or a grave in a - burial ground plot. To close the polygon click on the first drawn point; - **please note**: drawing shapes with holes is not possible. - * **Area**: Use the polygon to describe an area where the + border, a street, or an old river bed. Double-click on the last drawn + point to end the drawing mode + * **Shape** (rectangular symbol): You can use the this to draw any shape + that represents the location - use this if the exact location of a + physical thing is known such as the outline of a certain building with + or the exact shape of a grave in a georeferenced burial ground plot. To + close the polygon click on the first drawn point; **please note**: + drawing doughnut shapes with holes is not possible. + * **Area**: You can use the polygon to mark an area where the physical thing is/was located, but whose exact location is unknown. - **Please note**: Select the marked area large enough to be 100% sure that + **Please note**: Select the area big enough to be 100% sure that the object is/was located in it. To close the polygon click on the first - drawn point; **please note**: drawing shapes with holes is not possible. - * After the marker/polygon has been drawn, further information can be entered - into the pop-up, e.g. a name or a description as free text. This is - optional but useful in case you draw multiple geometries for one entry. - In addition, data about the polygon and coordinates can be + drawn point; **please note**: drawing doughnut shapes with holes is not + possible. + * After the marker/polygon has been drawn/set, further information can be + entered into the pop-up, such as a name or a description as free text. + This is optional but useful in case you draw multiple geometries for one + entry. In addition, data about the polygon and coordinates can be copied from the corresponding field of the pop-up window * By clicking on the drawn shape or marker, these can be edited and/or deleted @@ -77,7 +79,7 @@ The :doc:`/tools/map` has multiple functionalities: Reference Systems - GeoNames **************************** You can also link your data to GeoNames without using the map. To do so, -type the respective GeoNames identifier in the dedicated field and choose if +add the respective GeoNames identifier in the dedicated field and choose if it is an exact match or close match. **Please note**: As for all references systems, information can not be saved without stating which kind of match it is. diff --git a/sphinx/source/examples/profession.rst b/sphinx/source/examples/profession.rst index 6d2d9947c..2382b5979 100644 --- a/sphinx/source/examples/profession.rst +++ b/sphinx/source/examples/profession.rst @@ -3,19 +3,21 @@ Profession .. toctree:: -The following steps describe how to enter a profession connected to a person. -In OpenAtlas a profession exists in connection to a group (e.g. an institute, country, etc.). +The following steps describe how to enter the profession of a person +In OpenAtlas a profession exists in connection to a group e.g. a group of +people working as bakers or professors at a university. To add a profession to a person, follow the steps below: -* Create a person, see :doc:`/entity/actor` -* Create a group, see :doc:`/entity/actor` -* Press the **Member of** tab in the actor +* Create a person, see :doc:`/entity/actor`, for example "Max Mustermann" +* Create a group, see :doc:`/entity/actor`, such as "Historians" +* In the actor form, press the **Member of** tab * Click the **Link** button * In the form use **Type** to choose the function of the person within the group * Choose the specific group or groups in the **Actor** field * Add date and/or description if desired -You can get the same result by using the **Member** tab in the group view and link a person there. +You can get the same result by using the **Member** tab in the group view +and link a person there. -Keep in mind that it is possible to edit the available functions or add new ones in :doc:`/entity/type` -via **Standard types** and **Actor function**. +Keep in mind that it is possible to edit the available functions or add new +ones in :doc:`/entity/type` via **Standard types** and **Actor function**. diff --git a/sphinx/source/examples/reference_systems.rst b/sphinx/source/examples/reference_systems.rst index e56f12ef1..b64942c4b 100644 --- a/sphinx/source/examples/reference_systems.rst +++ b/sphinx/source/examples/reference_systems.rst @@ -3,11 +3,11 @@ References Systems .. toctree:: -To create **Linked Open Data** (LOD) it is possible to link data entered -into the database with a :doc:`/entity/reference_system`. Online available +To create **Linked Open Data** (LOD) it is possible to connect entered +information with a :doc:`/entity/reference_system`. Online available **controlled vocabularies** and **gazetteers** are particularly suitable for this. But it is also possible to link your own data with analog resources, -e.g. card catalogs or inventory data from museums. +such as card catalogs or inventory data from museums. `Wikidata `_ and `GeoNames `_ are available in OpenAtlas by default but other applications can be @@ -26,17 +26,17 @@ Create a new reference system To create a new reference system click the **Reference System** button on the starting page of your OpenAtlas instance. You will then see a list with -all already added external references. -If permissions to create additional external references are available, a -**+Reference system** button can also be found here. Click it to get into -the form. Here you can fill in the following fields: +already added external references. +If you user group has permission to create additional external references a +**+ Reference system** button is displayed. Click it to get into the form. +Here you can add the following information: * **Name**: Choose a descriptive name; as for other forms, a name is required to save data. * **Website URL**: State the vocabulary's/gazetteer's URL, e.g. https://www.wikidata.org for Wikidata * **Resolver URL**: Put in an URL that brings you to the respective entry - when combined with an ID e.g. https://www.wikidata.org/wiki/ see for + when combined with an ID e.g. https://www.wikidata.org/wiki/ - see for example https://www.wikidata.org/wiki/Q3044 where Q3044 is an ID (the link will bring you directly to Charlemagne's entry in Wikidata) * **Example ID**: An example ID can be specified, which is then used as an @@ -51,24 +51,24 @@ the form. Here you can fill in the following fields: Close match and exact match are `SKOS `_ based definitions of confidence - * choose **Close match** if the data base entry and the entity in the - vocabulary are sufficiently similar and can be used interchangeably in some + * choose **Close match** if your entry and the entity in the vocabulary + are sufficiently similar and can be used interchangeably in some information retrieval application (think a D-shaped belt buckle is a close match to a belt buckle (Wikidata ID Q3180027) or the historic Vienna is a close match to today's Vienna as it is included in Geonames) * choose **Exact match** if there is a high degree of confidence that the entered data and the vocabulary's entity are interchangeable (think - Charlemagne - the King of Franks, King of Lombards and became Holy Roman + Charlemagne - the King of Franks, King of Lombards who became Holy Roman Emperor in 800 AD is an exact match to Q3044 in Wikidata or the Venus of Willendorf in the Natural History Museum Vienna is an exact match to the entity Q131397 (Venus of Willendorf) in Wikidata) -* **Classes**: Select here in which forms the new external reference should +* **Classes**: Select in which forms the new external reference should be displayed. This can appear in one or more forms * **Description**: you can add a description as free text if desired Save the information to the database by clicking the **Insert** button. **Please keep in mind**: When information is entered into a reference system -field in a form, the data in this form can only be saved if an -external reference match is also specified. +field in a form, the data in this form can only be saved if an external +reference match is also specified. diff --git a/sphinx/source/examples/time_spans.rst b/sphinx/source/examples/time_spans.rst index 2eab7c56b..4aea98326 100644 --- a/sphinx/source/examples/time_spans.rst +++ b/sphinx/source/examples/time_spans.rst @@ -4,19 +4,19 @@ Time Spans .. toctree:: This section is focused on how the :doc:`Date` input fields work -and how to put in time spans correctly. +and how to enter time spans correctly. Where to find the input fields ------------------------------ -:doc:`Date` input fields can be found on the following: +:doc:`Date` input fields can be found on the following forms: * All forms connected to :doc:`Events` * All forms connected to :doc:`Actors` * All forms connected to :doc:`Types` * :doc:`Places` * :doc:`Features` -* :doc:`Statigraphic Units` +* :doc:`Stratigraphic Units` * :doc:`Artifacts` It is not provided for the input of: @@ -41,12 +41,12 @@ Begin and end each provide two lines for data entry. This can be used for entering precise, known data as well as for tracking time spans. The following values can be put in: -* Year (YYYY) as four digits: -4713 to 9999, the year 0 is not allowed -* Month (MM) as two digits: 1 to 12 -* Day (DD) as two digits: 1 to 31 -* Hour (hh) as two digits: 0 to 23 -* Minute (mm) as two digits: 0 to 59 -* Seconds (ss) as two digits: 0 to 59 +* Year (YYYY) as four digits: -4713 to 9999, **the year 0 is not allowed** +* Month (MM) as two digits: 01 to 12 +* Day (DD) as two digits: 01 to 31 +* Hour (hh) as two digits: 00 to 23 +* Minute (mm) as two digits: 00 to 59 +* Seconds (ss) as two digits: 00 to 59 * Comments as free text for additional information Years before the year 0 can be indicated by a preceding minus. Please note that @@ -83,8 +83,8 @@ Time spans If dating is uncertain, time spans for the beginning, end or beginning and end of the time span can be given. -This is possible via the four input fields of the date field - 2 for begin -and to for end: +This is possible via the four input fields of the date field - two for begin +and two for end: * The first line represents the **beginning of the begin** * The second line represents the **end of the begin** @@ -92,8 +92,8 @@ and to for end: * The fourth line represents the **ending of the end** In the case of unknown start and end dates, the time span must be selected -large enough so that the actual time frame lies within the specified span with -a 100 % certainty. +big enough to be sure the actual time frame lies within the specified +span with a 100 % certainty. Example: The exact date of death of King Stephen I of Hungary is known - 15 August 1038 AD - but for the date of birth only a time span from 01.01.975 AD @@ -101,6 +101,8 @@ to 31.12.975 AD can be given. As first input field corresponds to the earliest possible start of the time span, 975 - 01 - 01 should be entered. The second line corresponds to the latest possible end of the time span, in this case 975 - 12 - 31. +As end 15 August 1038 can be stated in the third line (the fourth line will +be filled automatically). .. image:: date_stephen.png @@ -109,11 +111,11 @@ Activate hours, minutes, and seconds ------------------------------------ By default, years, months and days can be entered into the date input field. -However, some projects might want to also track hours, minutes, and seconds. +However, some projects might need to also track hours, minutes, and seconds. Those additional input fields can be activated in your :doc:`profile`. To do so click the **gear** and go to **Profile**. Here click **Modules**. Click on the **Edit** button and check -**"Time"** to turn it on. You might have to refresh your page for it to show in -the form. +**Time** to turn it on. You might have to refresh your form page afterwards +(keyboard buttons ctrl + F5). .. image:: date_hours.png diff --git a/sphinx/source/examples/types.rst b/sphinx/source/examples/types.rst index 0e652157d..04ebe186b 100644 --- a/sphinx/source/examples/types.rst +++ b/sphinx/source/examples/types.rst @@ -5,47 +5,59 @@ Types :doc:`Types` are used to add information to all entities. They are organized hierarchically into trees and specific for each project. +Furthermore, types help to show information in an organized way on a +presentation site. So use types instead of free text wherever possible. There are different kind of types: A distinction is made between different groups of types: -* Standard types -* Custom types -* Value types +* Standard types - These are the types displayed as "Type" in each form. + They are used to specify each entity. They are single select only and can + not be renamed or deleted (the subtypes can); some standard types are + pre-installed +* Custom types - These types help to customize each instance of OpenAtlas; + they can be created, edited, renamed, and deleted by each project to cover + as much information on their data as possible; only few types come + pre-installed as examples +* Value types - These are used to add numerical information such as + measurements Different user groups have different permissions regarding the creation and modification of types. Further information can be found in the manual entry -regarding :doc:`/entity/type`. Please note that possibility to add and edit +regarding :doc:`/entity/type`. Please note that the possibility to add and edit types depends on the user group, see :doc:`/admin/user`. -An overview of the types already created can be accessed by clicking Types menu -item. Furthermore, new types can be created here if necessary. +An overview of the types already created can be accessed by clicking the Types +menu item. Furthermore, new types can be created here if necessary. .. image:: type_1.png :width: 400px Create a new type tree ---------------------- -To create a new custom type or value type tree press the +Type button on the -bottom of the page. Please fill out the form: +To create a new custom type or value type tree press the +Type button. +Please fill out the form: * Choose a descriptive **name** for the new type -* Decide if the type is single or **multiple choice** (only available for custom +* Decide if the type is single or multiple select (only available for custom types) -* Choose to which classes the new type will be added to e.g. - :doc:`/entity/artifact` or :doc:`/entity/place`. -* You can also enter text into the **description** field which will be displayed - when you mouse-over the information button next to the type’s name in forms. +* Choose to which classes the new type will be added, e.g. + :doc:`/entity/artifact` or :doc:`/entity/place`; the typ will only be + shown in the related form +* You can also enter text into the **description** field which will be + displayed when you mouse-over the information button next to the type’s + name in forms. -By pressing insert you can create a new type tree. +By pressing **insert** you can create a new type tree. -To edit an already existing type tree, go to the type you want to edit, click on -its name and push the edit button next to the name. +To edit an already existing type tree, go to the type you want to edit, +click on its name and push the edit button next to the name. .. image:: type_2.png :width: 400px You can edit the type’s name, chosen classes and description. Please note that -changing multiple to single choice is not possible. +changing multiple to single choice is not always possible. For more +information see :doc:`/entity/type`. Add a type to an existing type tree ----------------------------------- From e87587fcf0501d7df9ef71635c6bb05b4d330216 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Tue, 19 Nov 2024 11:59:54 +0100 Subject: [PATCH 16/42] solved AND issue in search --- openatlas/api/endpoints/parser.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index f6ae0174c..b67af693a 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -18,8 +18,7 @@ from openatlas.api.resources.error import ( EntityDoesNotExistError, InvalidSearchSyntax, InvalidSearchValueError, LastEntityError, UrlNotValid) -from openatlas.api.resources.search import ( - get_search_values, search_entity) +from openatlas.api.resources.search import get_search_values, search_entity from openatlas.api.resources.search_validation import ( check_if_date_search, validate_search_parameters) from openatlas.api.resources.templates import ( @@ -39,7 +38,7 @@ class Parser: sort = None column: str = '' search: str = '' - search_param: list[dict[str, Any]] + search_param: list[list[dict[str, Any]]] limit: int = 0 first = None last = None @@ -98,6 +97,7 @@ def set_search_param(self) -> None: values["values"]) from e for search in url_parameters: + set_of_search_parameter = [] for category, value_list in search.items(): for values in value_list: is_comparable = False @@ -112,7 +112,7 @@ def set_search_param(self) -> None: inverse=True)) # Todo: different between each search parameter. This # list just puts every search param in a list - self.search_param.append({ + set_of_search_parameter.append({ "search_values": get_search_values( category, values), @@ -122,15 +122,27 @@ def set_search_param(self) -> None: "is_comparable": is_comparable, "value_type_links": flatten_list_and_remove_duplicates(links)}) + self.search_param.append(set_of_search_parameter) def search_filter(self, entity: Entity) -> bool: found = False - for param in self.search_param: - if search_entity(entity, param): + for set_of_param in self.search_param: + if self.search_through_set_of_param(set_of_param, entity): found = True break return found + # Todo: Refactor this function into search_filter(). + # Then above todo is resolved + def search_through_set_of_param(self, set_of_param, entity) -> bool: + found = [] + for param in set_of_param: + if search_entity(entity, param): + found.append(True) + else: + found.append(False) + return all(found) + def get_properties_for_links(self) -> Optional[list[str]]: if self.relation_type: codes = self.relation_type From 5b6c3eefc830c72d7420704d47e24b693e87a37a Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 20 Nov 2024 16:38:43 +0100 Subject: [PATCH 17/42] refactor --- openatlas/api/endpoints/endpoint.py | 1 - openatlas/api/endpoints/parser.py | 44 ++++++++++------------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/openatlas/api/endpoints/endpoint.py b/openatlas/api/endpoints/endpoint.py index 91b4b9354..53cc853e9 100644 --- a/openatlas/api/endpoints/endpoint.py +++ b/openatlas/api/endpoints/endpoint.py @@ -35,7 +35,6 @@ def resolve_entities(self) -> Response | dict[str, Any]: if self.parser.type_id: self.entities = self.filter_by_type() if self.parser.search: - print(self.parser.search) self.entities = [ e for e in self.entities if self.parser.search_filter(e)] if self.parser.export == 'csv': diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index b67af693a..8d1e6be27 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -82,8 +82,8 @@ def set_search_param(self) -> None: for search in url_parameters: for category, value_list in search.items(): for values in value_list: - values['logicalOperator'] = ( - values.get('logicalOperator') or 'or') + values['logicalOperator'] = \ + values.get('logicalOperator') or 'or' validate_search_parameters(category, values) if category in app.config['INT_VALUES']: values['values'] = list(map(int, values['values'])) @@ -97,52 +97,38 @@ def set_search_param(self) -> None: values["values"]) from e for search in url_parameters: - set_of_search_parameter = [] + search_parameter = [] for category, value_list in search.items(): for values in value_list: - is_comparable = False links = [] - if check_if_date_search(category): - is_comparable = True + is_comparable = check_if_date_search(category) if category == 'valueTypeID': is_comparable = True for value in values["values"]: - links.append(Entity.get_links_of_entities( - value[0], - inverse=True)) - # Todo: different between each search parameter. This - # list just puts every search param in a list - set_of_search_parameter.append({ - "search_values": get_search_values( - category, - values), + links.append( + Entity.get_links_of_entities( + value[0], + inverse=True)) + search_parameter.append({ + "search_values": get_search_values(category, values), "logical_operator": values['logicalOperator'], "operator": values['operator'], "category": category, "is_comparable": is_comparable, "value_type_links": flatten_list_and_remove_duplicates(links)}) - self.search_param.append(set_of_search_parameter) + self.search_param.append(search_parameter) def search_filter(self, entity: Entity) -> bool: found = False for set_of_param in self.search_param: - if self.search_through_set_of_param(set_of_param, entity): + for param in set_of_param: + if not search_entity(entity, param): + found = False + break found = True - break return found - # Todo: Refactor this function into search_filter(). - # Then above todo is resolved - def search_through_set_of_param(self, set_of_param, entity) -> bool: - found = [] - for param in set_of_param: - if search_entity(entity, param): - found.append(True) - else: - found.append(False) - return all(found) - def get_properties_for_links(self) -> Optional[list[str]]: if self.relation_type: codes = self.relation_type From 8c7ec68f36eb339d9e254fd106b66282feaa66c7 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 20 Nov 2024 16:41:52 +0100 Subject: [PATCH 18/42] refactor --- openatlas/api/endpoints/parser.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index 8d1e6be27..e9d74dd18 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -129,7 +129,8 @@ def search_filter(self, entity: Entity) -> bool: found = True return found - def get_properties_for_links(self) -> Optional[list[str]]: + def get_properties_for_links(self) -> list[str]: + codes = [] if self.relation_type: codes = self.relation_type if 'geometry' in self.show: @@ -138,8 +139,7 @@ def get_properties_for_links(self) -> Optional[list[str]]: codes.append('P2') if any(i in ['depictions', 'links'] for i in self.show): codes.append('P67') - return codes - return None + return codes def get_key(self, entity: Entity) -> datetime64 | str: if self.column == 'cidoc_class': From 8c053ba932d94d7104db5bb03443e0a7b8162dc3 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 20 Nov 2024 16:53:44 +0100 Subject: [PATCH 19/42] changes class name for edoints --- openatlas/api/endpoints/entities.py | 15 +++++------ openatlas/api/endpoints/parser.py | 1 + openatlas/api/routes.py | 6 ++--- tests/test_api.py | 40 ++++++++++++++--------------- 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/openatlas/api/endpoints/entities.py b/openatlas/api/endpoints/entities.py index e3c912c44..666cb417d 100644 --- a/openatlas/api/endpoints/entities.py +++ b/openatlas/api/endpoints/entities.py @@ -15,28 +15,25 @@ class GetByCidocClass(Resource): @staticmethod - def get(cidoc_class: str) \ - -> tuple[Resource, int] | Response | dict[str, Any]: + def get(class_: str) -> tuple[Resource, int] | Response | dict[str, Any]: return Endpoint( - ApiEntity.get_by_cidoc_classes([cidoc_class]), + ApiEntity.get_by_cidoc_classes([class_]), entity_.parse_args()).resolve_entities() class GetBySystemClass(Resource): @staticmethod - def get(system_class: str) \ - -> tuple[Resource, int] | Response | dict[str, Any]: + def get(class_: str) -> tuple[Resource, int] | Response | dict[str, Any]: return Endpoint( - ApiEntity.get_by_system_classes([system_class]), + ApiEntity.get_by_system_classes([class_]), entity_.parse_args()).resolve_entities() class GetByViewClass(Resource): @staticmethod - def get(view_class: str) \ - -> tuple[Resource, int] | Response | dict[str, Any]: + def get(class_: str) -> tuple[Resource, int] | Response | dict[str, Any]: return Endpoint( - ApiEntity.get_by_view_classes([view_class]), + ApiEntity.get_by_view_classes([class_]), entity_.parse_args()).resolve_entities() diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index e9d74dd18..719a5c587 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -32,6 +32,7 @@ class Parser: + # Todo: Group attributes to reduce the long list download = None count = None locale = None diff --git a/openatlas/api/routes.py b/openatlas/api/routes.py index d75d65509..479b0def0 100644 --- a/openatlas/api/routes.py +++ b/openatlas/api/routes.py @@ -16,12 +16,12 @@ GetTypeByViewClass, GetTypeOverview, GetTypeTree) entity = [ - [GetByViewClass, '/view_class/', 'view_class'], - [GetByCidocClass, '/cidoc_class/', 'cidoc_class'], + [GetByViewClass, '/view_class/', 'view_class'], + [GetByCidocClass, '/cidoc_class/', 'cidoc_class'], [GetEntity, '/entity/', 'entity'], [GetLatest, '/latest/', 'latest'], [GetQuery, '/query/', 'query'], - [GetBySystemClass, '/system_class/', 'system_class'], + [GetBySystemClass, '/system_class/', 'system_class'], [GetTypeEntities, '/type_entities/', 'type_entities'], [GetTypeEntitiesAll, '/type_entities_all/', 'type_entities_all'], [GetLinkedEntitiesByPropertyRecursive, diff --git a/tests/test_api.py b/tests/test_api.py index 170613d6f..3ded25c47 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -322,24 +322,24 @@ def test_api(self) -> None: # Test Entities endpoints for rv in [ - self.app.get(url_for('api_04.cidoc_class', cidoc_class='E21')), + self.app.get(url_for('api_04.cidoc_class', class_='E21')), self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', sort='desc', column='id', relation_type='P2', type_id=boundary_mark.id)), self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', sort='desc', column='begin_from', relation_type='P2', type_id=boundary_mark.id)), self.app.get(url_for('api_04.latest', limit=2)), self.app.get( - url_for('api_04.system_class', system_class='artifact')), + url_for('api_04.system_class', class_='artifact')), self.app.get( url_for('api_04.entities_linked_to_entity', id_=event.id)), self.app.get( @@ -383,7 +383,7 @@ def test_api(self) -> None: # Test Entities with show=none rv = self.app.get(url_for( - 'api_04.cidoc_class', cidoc_class='E21', show='none')) + 'api_04.cidoc_class', class_='E21', show='none')) rv = rv.get_json()['results'][0]['features'][0] assert self.get_bool_inverse(rv, 'geometry') assert self.get_no_key(rv, 'depictions') @@ -873,7 +873,7 @@ def test_api(self) -> None: assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') rv = self.app.get(url_for( - 'api_04.view_class', view_class='all', centroid=True, limit=0)) + 'api_04.view_class', class_='all', centroid=True, limit=0)) assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') @@ -887,7 +887,7 @@ def test_api(self) -> None: for rv in [ self.app.get(url_for('api_04.entity', id_=233423424)), self.app.get(url_for( - 'api_04.cidoc_class', cidoc_class='E18', last=1231))]: + 'api_04.cidoc_class', class_='E18', last=1231))]: rv = rv.get_json() assert 'Entity does not exist' in rv['title'] @@ -908,18 +908,18 @@ def test_api(self) -> None: assert 'ID is last entity' in rv.get_json()['title'] rv = self.app.get( - url_for('api_04.system_class', system_class='Wrong')) + url_for('api_04.system_class', class_='Wrong')) assert 'Invalid system_classes value' in rv.get_json()['title'] rv = self.app.get(url_for('api_04.query')) assert 'No query parameters given' in rv.get_json()['title'] rv = self.app.get( - url_for('api_04.cidoc_class', cidoc_class='e99999999')) + url_for('api_04.cidoc_class', class_='e99999999')) assert 'Invalid cidoc_classes value' in rv.get_json()['title'] rv = self.app.get( - url_for('api_04.view_class', view_class='Invalid')) + url_for('api_04.view_class', class_='Invalid')) assert 'Invalid view_classes value' in rv.get_json()['title'] rv = self.app.get(url_for('api_04.latest', limit='99999999')) @@ -927,7 +927,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"typeID":[{"operator":"equal",' '"values":["Boundary Mark", "Height", "Dimension"],' '"logicalOperator":"and"}]}')) @@ -935,7 +935,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"typeID":[{"operator":"like",' '"values":["Boundary Mark", "Height", "Dimension"],' '"logicalOperator":"and"}]}')) @@ -943,7 +943,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"All":[{"operator":"notEqual",' '"values":["Boundary Mark", "Height"],' '"logicalOperator":"or"}]}')) @@ -951,7 +951,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"typeName":[{"operator":"notEqual",' '"values":[],' '"logicalOperator":"or"}]}')) @@ -959,7 +959,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"beginFrom":[{"operator":"notEqual",' '"values":["Help"],' '"logicalOperator":"or"}]}')) @@ -967,7 +967,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"beginFrom":[{"operator":"notEqual",' '"values":["800-1-1", "Help"],' '"logicalOperator":"or"}]}')) @@ -975,7 +975,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='"beginFrom":[{"operator":"lesserThan",' '"values":["2000-01-01"],' '"logicalOperator":"or"}]}')) @@ -993,7 +993,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"typeName":[{"operator":"notEqualT",' '"values":["Boundary Mark", "Height"],' '"logicalOperator":"and"}]}')) @@ -1001,7 +1001,7 @@ def test_api(self) -> None: rv = self.app.get(url_for( 'api_04.view_class', - view_class='place', + class_='place', search='{"typeName":[{"operator":"notEqual",' '"values":["Boundary Mark", "Height"],' '"logicalOperator":"xor"}]}')) @@ -1034,5 +1034,5 @@ def test_api(self) -> None: self.app.get(url_for('logout')) app.config['ALLOWED_IPS'] = [] - rv = self.app.get(url_for('api_04.view_class', view_class='place')) + rv = self.app.get(url_for('api_04.view_class', class_='place')) assert 'Access denied' in rv.get_json()['title'] From d5de29654edffa9744196bcc7e48f0fe45894d80 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 20 Nov 2024 17:03:14 +0100 Subject: [PATCH 20/42] formating tests --- tests/test_api.py | 928 ++++++++++++++++++++++++---------------------- 1 file changed, 494 insertions(+), 434 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 3ded25c47..80af708a0 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -14,7 +14,7 @@ class Api(ApiTestCase): def test_api(self) -> None: with app.app_context(): logo = Path(app.root_path) \ - / 'static' / 'images' / 'layout' / 'logo.png' + / 'static' / 'images' / 'layout' / 'logo.png' with open(logo, 'rb') as img: self.app.post( @@ -323,20 +323,22 @@ def test_api(self) -> None: # Test Entities endpoints for rv in [ self.app.get(url_for('api_04.cidoc_class', class_='E21')), - self.app.get(url_for( - 'api_04.view_class', - class_='place', - sort='desc', - column='id', - relation_type='P2', - type_id=boundary_mark.id)), - self.app.get(url_for( - 'api_04.view_class', - class_='place', - sort='desc', - column='begin_from', - relation_type='P2', - type_id=boundary_mark.id)), + self.app.get( + url_for( + 'api_04.view_class', + class_='place', + sort='desc', + column='id', + relation_type='P2', + type_id=boundary_mark.id)), + self.app.get( + url_for( + 'api_04.view_class', + class_='place', + sort='desc', + column='begin_from', + relation_type='P2', + type_id=boundary_mark.id)), self.app.get(url_for('api_04.latest', limit=2)), self.app.get( url_for('api_04.system_class', class_='artifact')), @@ -350,27 +352,29 @@ def test_api(self) -> None: url_for('api_04.type_entities_all', id_=unit_node.id)), self.app.get( url_for('api_04.type_entities_all', id_=relation_sub.id)), - self.app.get(url_for( - 'api_04.query', - entities=location.id, - classes='E18', - codes='artifact', - sort='desc', - column='cidoc_class', - system_classes='person', - download=True, - last=actor.id)), - self.app.get(url_for( - 'api_04.query', - entities=location.id, - classes='E18', - codes='artifact', - system_classes='person', - linked_entities=place.id, - sort='desc', - column='system_class', - download=True, - actor=place.id))]: + self.app.get( + url_for( + 'api_04.query', + entities=location.id, + classes='E18', + codes='artifact', + sort='desc', + column='cidoc_class', + system_classes='person', + download=True, + last=actor.id)), + self.app.get( + url_for( + 'api_04.query', + entities=location.id, + classes='E18', + codes='artifact', + system_classes='person', + linked_entities=place.id, + sort='desc', + column='system_class', + download=True, + actor=place.id))]: assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json() rv_results = rv['results'][0]['features'][0] @@ -382,8 +386,9 @@ def test_api(self) -> None: assert self.get_bool(rv_page, 'totalPages') # Test Entities with show=none - rv = self.app.get(url_for( - 'api_04.cidoc_class', class_='E21', show='none')) + rv = self.app.get( + url_for( + 'api_04.cidoc_class', class_='E21', show='none')) rv = rv.get_json()['results'][0]['features'][0] assert self.get_bool_inverse(rv, 'geometry') assert self.get_no_key(rv, 'depictions') @@ -391,37 +396,40 @@ def test_api(self) -> None: assert self.get_no_key(rv, 'types') # Test if Query returns enough entities - rv = self.app.get(url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - limit=0, - first=actor2.id)).get_json() + rv = self.app.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + limit=0, + first=actor2.id)).get_json() assert bool(rv['pagination']['entities'] == 8) # Test page parameter - rv = self.app.get(url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - limit=1, - page=7)).get_json() + rv = self.app.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + limit=1, + page=7)).get_json() properties = rv['results'][0]['features'][0]['properties'] assert bool(properties['title'] == place.name) assert bool(len(rv['results']) == 1) # Test Entities count - rv = self.app.get(url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - count=True)) + rv = self.app.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + count=True)) assert bool(rv.get_json() == 8) rv = self.app.get(url_for('api_04.geometric_entities', count=True)) @@ -429,33 +437,36 @@ def test_api(self) -> None: # Test entities with GeoJSON Format for rv in [ - self.app.get(url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='geojson')), - self.app.get(url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='geojson-v2'))]: + self.app.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='geojson')), + self.app.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='geojson-v2'))]: rv = rv.get_json()['results'][0]['features'][0] assert self.get_bool(rv['properties'], '@id') assert self.get_bool(rv['properties'], 'systemClass') # Test entities with Linked Open Usable Data Format - rv = self.app.get(url_for( - 'api_04.query', - entities=location.id, - cidoc_classes=['E18', 'E53'], - view_classes='artifact', - system_classes=['person', 'type'], - format='loud', - limit=0)) + rv = self.app.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes=['E18', 'E53'], + view_classes='artifact', + system_classes=['person', 'type'], + format='loud', + limit=0)) rv = rv.get_json()['results'][0] assert bool(rv['type'] == 'Type') assert bool(rv['_label'] == 'Abbot') @@ -463,8 +474,7 @@ def test_api(self) -> None: # ---Type Endpoints--- for rv in [ self.app.get(url_for('api_04.type_overview')), - self.app.get( - url_for('api_04.type_overview', download=True))]: + self.app.get(url_for('api_04.type_overview', download=True))]: found = False for item in rv.get_json()['place']: if found: @@ -495,46 +505,50 @@ def test_api(self) -> None: rv = self.app.get(url_for('api_04.type_tree', count=True)) assert rv.get_json() > 0 - rv = self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityAliases":[{"operator":"equal", + rv = self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"entityAliases":[{"operator":"equal", "values":["Sûza"],"logicalOperator":"and"}], "typeID":[{"operator":"equal","values":[1121212], "logicalOperator":"and"}]}""")) assert bool(rv.get_json()['pagination']['entities'] == 0) - rv = self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityAliases":[{"operator":"greaterThan", + rv = self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"entityAliases":[{"operator":"greaterThan", "values":["Sûza"],"logicalOperator":"and"}], "typeID":[{"operator":"equal","values":[1121212], "logicalOperator":"and"}]}""")) assert bool(rv.get_json()['pagination']['entities'] == 0) - rv = self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f"""{{"valueTypeID": + rv = self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search=f"""{{"valueTypeID": [{{"operator":"lesserThanEqual", "values":[({height.id},1.0), ({weight_.id}, 1.0)], "logicalOperator":"and"}}]}}""")) assert bool(rv.get_json()['pagination']['entities'] == 0) - rv = self.app.get(url_for( + rv = self.app.get( + url_for( 'api_04.query', entities=place.id, classes='E18', @@ -548,280 +562,309 @@ def test_api(self) -> None: assert bool(rv.get_json()['pagination']['entities'] == 1) for rv in [ - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityCidocClass":[{"operator":"equal", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"entityCidocClass":[{"operator":"equal", "values":["E21"],"logicalOperator":"and"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entitySystemClass":[{"operator":"equal", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"entitySystemClass":[{"operator":"equal", "values":["person"],"logicalOperator":"and"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - classes='E18', - codes='artifact', - system_classes='activity', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"equal",' - f'"values":[{boundary_mark.id},' - f'{height.id},' - f'{change_of_property.id}],' - f'"logicalOperator":"or"}}]}}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"entityDescription":[{"operator":"like",' - '"values":["FrOdO", "sam"],' - '"logicalOperator":"or"}]}'))]: + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + classes='E18', + codes='artifact', + system_classes='activity', + format='lp', + search=f'{{"typeIDWithSubs":[{{"operator":"equal",' + f'"values":[{boundary_mark.id},' + f'{height.id},' + f'{change_of_property.id}],' + f'"logicalOperator":"or"}}]}}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search='{"entityDescription":[{"operator":"like",' + '"values":["FrOdO", "sam"],' + '"logicalOperator":"or"}]}'))]: assert bool(rv.get_json()['pagination']['entities'] == 2) # Test search parameter for rv in [ - self.app.get(url_for( - 'api_04.query', - entities=place.id, - classes='E18', - codes='place', - system_classes='person', - format='lp', - search=f'{{"valueTypeID":[{{"operator":"equal",' - f'"values":[({height.id},23.0)]}}]}}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - classes='E18', - codes='place', - system_classes='person', - format='lp', - search=f'{{"valueTypeID":[{{"operator":"greaterThanEqual",' - f'"values":[({height.id},23.0)]}}]}}')), - self.app.get(url_for( - 'api_04.query', - system_classes='place', - search="""{"entityName":[{"operator":"notEqual", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + classes='E18', + codes='place', + system_classes='person', + format='lp', + search=f'{{"valueTypeID":[{{"operator":"equal",' + f'"values":[({height.id},23.0)]}}]}}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + classes='E18', + codes='place', + system_classes='person', + format='lp', + search=f'{{"valueTypeID":[{{' + f'"operator":"greaterThanEqual",' + f'"values":[({height.id},23.0)]}}]}}')), + self.app.get( + url_for( + 'api_04.query', + system_classes='place', + search="""{"entityName":[{"operator":"notEqual", "values":["Mordor"],"logicalOperator":"or"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"typeName":[{"operator":"equal", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"typeName":[{"operator":"equal", "values":["Boundary Mark", "Height"], "logicalOperator":"and"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"relationToID":[{{"operator":"equal",' - f'"values":[{place.id}],' - f'"logicalOperator":"or"}}]}}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginFrom":[{"operator":"lesserThan", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search=f'{{"relationToID":[{{"operator":"equal",' + f'"values":[{place.id}],' + f'"logicalOperator":"or"}}]}}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"beginFrom":[{"operator":"lesserThan", "values":["2020-01-01"], "logicalOperator":"and"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginFrom":[{"operator":"lesserThan", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"beginFrom":[{"operator":"lesserThan", "values":["2020-01-01"],"logicalOperator":"or"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginTo":[{"operator":"lesserThanEqual", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"beginTo":[{"operator":"lesserThanEqual", "values":["2018-03-01"], "logicalOperator":"and"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginTo":[{"operator":"lesserThanEqual", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"beginTo":[{"operator":"lesserThanEqual", "values":["2018-03-01"],"logicalOperator":"or"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"endFrom":[{"operator":"greaterThan", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"endFrom":[{"operator":"greaterThan", "values":["2013-02-01"], "logicalOperator":"and"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"endFrom":[{"operator":"greaterThan", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"endFrom":[{"operator":"greaterThan", "values":["2013-02-01"],"logicalOperator":"or"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"endTo":[{"operator":"greaterThanEqual", ' - '"values":["2019-03-01"],"logicalOperator":"and"}]}' - )), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"endTo":[{"operator":"greaterThanEqual", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search='{"endTo":[{"operator":"greaterThanEqual", ' + '"values":["2019-03-01"],' + '"logicalOperator":"and"}]}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"endTo":[{"operator":"greaterThanEqual", "values":["2019-03-01"],"logicalOperator":"or"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='all', - system_classes='all', - format='lp', - search='{"entityDescription":[{"operator":"equal",' - '"values":["the shirE Was the Homeland of the' - ' hobbits.", "homeland"],' - '"logicalOperator":"or"}]}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"entityName":[{"operator":"like",' - '"values":["Fr"],' - '"logicalOperator":"or"}]}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"entityAliases":[{"operator":"like",' - '"values":["S"],' - '"logicalOperator":"or"}]}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"typeName": [{"operator": "like",' - '"values": ["Oun", "mark"],' - '"logicalOperator": "and"}]}')), - self.app.get(url_for( - 'api_04.query', - system_classes='place', - view_classes='artifact', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"notEqual",' - f'"values":[{boundary_mark.id}],' - f'"logicalOperator":"and"}}]}}'))]: + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='all', + system_classes='all', + format='lp', + search='{"entityDescription":[{"operator":"equal",' + '"values":["the shirE Was the Homeland of the' + ' hobbits.", "homeland"],' + '"logicalOperator":"or"}]}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search='{"entityName":[{"operator":"like",' + '"values":["Fr"],' + '"logicalOperator":"or"}]}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search='{"entityAliases":[{"operator":"like",' + '"values":["S"],' + '"logicalOperator":"or"}]}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search='{"typeName": [{"operator": "like",' + '"values": ["Oun", "mark"],' + '"logicalOperator": "and"}]}')), + self.app.get( + url_for( + 'api_04.query', + system_classes='place', + view_classes='artifact', + format='lp', + search=f'{{"typeIDWithSubs":[{{"operator":"notEqual",' + f'"values":[{boundary_mark.id}],' + f'"logicalOperator":"and"}}]}}'))]: assert bool(rv.get_json()['pagination']['entities'] == 1) for rv in [ - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"typeID":[{{"operator":"equal",' - f'"values":[{boundary_mark.id},' - f'{height.id}],' - f'"logicalOperator":"or"}}]}}')), - self.app.get(url_for( - 'api_04.query', - system_classes='place', - view_classes='artifact', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"equal",' - f'"values":[{boundary_mark.id}],' - f'"logicalOperator":"and"}}]}}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"equal",' - f'"values":[{boundary_mark.id},' - f'{height.id}],' - f'"logicalOperator":"or"}}]}}'))]: + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search=f'{{"typeID":[{{"operator":"equal",' + f'"values":[{boundary_mark.id},' + f'{height.id}],' + f'"logicalOperator":"or"}}]}}')), + self.app.get( + url_for( + 'api_04.query', + system_classes='place', + view_classes='artifact', + format='lp', + search=f'{{"typeIDWithSubs":[{{"operator":"equal",' + f'"values":[{boundary_mark.id}],' + f'"logicalOperator":"and"}}]}}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search=f'{{"typeIDWithSubs":[{{"operator":"equal",' + f'"values":[{boundary_mark.id},' + f'{height.id}],' + f'"logicalOperator":"or"}}]}}'))]: assert bool(rv.get_json()['pagination']['entities'] == 2) for rv in [ - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"typeName":[{"operator":"notEqual", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"typeName":[{"operator":"notEqual", "values":["Boundary Mark", "Height"], "logicalOperator":"and"}]}""")), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"entityID":[{{"operator":"notEqual",' - f'"values":[{place.id}],' - f'"logicalOperator":"and"}}]}}')), - self.app.get(url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityAliases":[{"operator":"notEqual", + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search=f'{{"entityID":[{{"operator":"notEqual",' + f'"values":[{place.id}],' + f'"logicalOperator":"and"}}]}}')), + self.app.get( + url_for( + 'api_04.query', + entities=place.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + format='lp', + search="""{"entityAliases":[{"operator":"notEqual", "values":["Sûza"],"logicalOperator":"and"}]}"""))]: assert bool(rv.get_json()['pagination']['entities'] == 6) for rv in [ @@ -851,43 +894,50 @@ def test_api(self) -> None: for rv in [ self.app.get( url_for('api_04.subunits', id_=place.id, format='xml')), - self.app.get(url_for( - 'api_04.subunits', - id_=place.id, - format='xml', - download=True))]: + self.app.get( + url_for( + 'api_04.subunits', + id_=place.id, + format='xml', + download=True))]: assert b'Shire' in rv.data # Test centroid for id_ in [feature.id, feature_location.id]: for format_ in ['lp', 'geojson', 'geojson-v2']: - rv = self.app.get(url_for( - 'api_04.entity', - id_=id_, - format=format_, - centroid=True)) + rv = self.app.get( + url_for( + 'api_04.entity', + id_=id_, + format=format_, + centroid=True)) assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') rv = self.app.get( url_for('api_04.subunits', id_=place.id, centroid=True)) assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') - rv = self.app.get(url_for( - 'api_04.view_class', class_='all', centroid=True, limit=0)) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='all', + centroid=True, + limit=0)) assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') - rv = self.app.get(url_for( - 'api_04.display', - filename=f'{file.id}', - image_size='table')) + rv = self.app.get( + url_for( + 'api_04.display', + filename=f'{file.id}', + image_size='table')) self.assertTrue(rv.headers['Content-Type'].startswith('image')) # Test Error Handling for rv in [ self.app.get(url_for('api_04.entity', id_=233423424)), - self.app.get(url_for( - 'api_04.cidoc_class', class_='E18', last=1231))]: + self.app.get( + url_for('api_04.cidoc_class', class_='E18', last=1231))]: rv = rv.get_json() assert 'Entity does not exist' in rv['title'] @@ -925,60 +975,67 @@ def test_api(self) -> None: rv = self.app.get(url_for('api_04.latest', limit='99999999')) assert 'Invalid limit value' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"typeID":[{"operator":"equal",' - '"values":["Boundary Mark", "Height", "Dimension"],' - '"logicalOperator":"and"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"typeID":[{"operator":"equal",' + '"values":["Boundary Mark", "Height", "Dimension"],' + '"logicalOperator":"and"}]}')) assert 'Invalid search value' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"typeID":[{"operator":"like",' - '"values":["Boundary Mark", "Height", "Dimension"],' - '"logicalOperator":"and"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"typeID":[{"operator":"like",' + '"values":["Boundary Mark", "Height", "Dimension"],' + '"logicalOperator":"and"}]}')) assert 'Operator not supported' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"All":[{"operator":"notEqual",' - '"values":["Boundary Mark", "Height"],' - '"logicalOperator":"or"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"All":[{"operator":"notEqual",' + '"values":["Boundary Mark", "Height"],' + '"logicalOperator":"or"}]}')) assert 'Invalid search category' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"typeName":[{"operator":"notEqual",' - '"values":[],' - '"logicalOperator":"or"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"typeName":[{"operator":"notEqual",' + '"values":[],' + '"logicalOperator":"or"}]}')) assert 'No search value' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"beginFrom":[{"operator":"notEqual",' - '"values":["Help"],' - '"logicalOperator":"or"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"beginFrom":[{"operator":"notEqual",' + '"values":["Help"],' + '"logicalOperator":"or"}]}')) assert 'Invalid search values' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"beginFrom":[{"operator":"notEqual",' - '"values":["800-1-1", "Help"],' - '"logicalOperator":"or"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"beginFrom":[{"operator":"notEqual",' + '"values":["800-1-1", "Help"],' + '"logicalOperator":"or"}]}')) assert 'Invalid search values' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='"beginFrom":[{"operator":"lesserThan",' - '"values":["2000-01-01"],' - '"logicalOperator":"or"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='"beginFrom":[{"operator":"lesserThan",' + '"values":["2000-01-01"],' + '"logicalOperator":"or"}]}')) assert 'Invalid search syntax' in rv.get_json()['title'] rv = self.app.get(url_for('api_04.type_entities', id_=1234)) @@ -991,20 +1048,22 @@ def test_api(self) -> None: url_for('api_04.system_class_count', type_id=999)) assert 'Entity is not a type' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"typeName":[{"operator":"notEqualT",' - '"values":["Boundary Mark", "Height"],' - '"logicalOperator":"and"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"typeName":[{"operator":"notEqualT",' + '"values":["Boundary Mark", "Height"],' + '"logicalOperator":"and"}]}')) assert 'Invalid compare operator' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.view_class', - class_='place', - search='{"typeName":[{"operator":"notEqual",' - '"values":["Boundary Mark", "Height"],' - '"logicalOperator":"xor"}]}')) + rv = self.app.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"typeName":[{"operator":"notEqual",' + '"values":["Boundary Mark", "Height"],' + '"logicalOperator":"xor"}]}')) assert 'Invalid logical operator' in rv.get_json()['title'] rv = self.app.get( @@ -1025,9 +1084,10 @@ def test_api(self) -> None: url_for('api_04.iiif_sequence', version=2, id_=place.id)) assert 'File not found' in rv.get_json()['title'] - rv = self.app.get(url_for( - 'api_04.display', - filename=f'{file_not_public.id}')) + rv = self.app.get( + url_for( + 'api_04.display', + filename=f'{file_not_public.id}')) assert 'Not public' in rv.get_json()['title'] assert b'Endpoint not found' in self.app.get('/api/entity2').data From 6905f56920804b920c04d4d9a668c0f03f2c06cf Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Thu, 21 Nov 2024 16:45:18 +0100 Subject: [PATCH 21/42] reduced api tests --- tests/test_api.py | 529 +++++++++++++--------------------------------- 1 file changed, 150 insertions(+), 379 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 80af708a0..ee183d97d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -505,388 +505,158 @@ def test_api(self) -> None: rv = self.app.get(url_for('api_04.type_tree', count=True)) assert rv.get_json() > 0 - rv = self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityAliases":[{"operator":"equal", - "values":["Sûza"],"logicalOperator":"and"}], - "typeID":[{"operator":"equal","values":[1121212], - "logicalOperator":"and"}]}""")) - assert bool(rv.get_json()['pagination']['entities'] == 0) - - rv = self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityAliases":[{"operator":"greaterThan", - "values":["Sûza"],"logicalOperator":"and"}], - "typeID":[{"operator":"equal","values":[1121212], - "logicalOperator":"and"}]}""")) - assert bool(rv.get_json()['pagination']['entities'] == 0) - - rv = self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f"""{{"valueTypeID": - [{{"operator":"lesserThanEqual", - "values":[({height.id},1.0), ({weight_.id}, 1.0)], - "logicalOperator":"and"}}]}}""")) - assert bool(rv.get_json()['pagination']['entities'] == 0) - - rv = self.app.get( - url_for( - 'api_04.query', - entities=place.id, - classes='E18', - codes='place', - system_classes='person', - format='lp', - search=f"""{{"valueTypeID": - [{{"operator":"greaterThanEqual", - "values":[({height.id},23.0), ({weight_.id}, 999.0)], - "logicalOperator":"and"}}]}}""")) - assert bool(rv.get_json()['pagination']['entities'] == 1) - - for rv in [ - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityCidocClass":[{"operator":"equal", - "values":["E21"],"logicalOperator":"and"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entitySystemClass":[{"operator":"equal", - "values":["person"],"logicalOperator":"and"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - classes='E18', - codes='artifact', - system_classes='activity', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"equal",' - f'"values":[{boundary_mark.id},' - f'{height.id},' - f'{change_of_property.id}],' - f'"logicalOperator":"or"}}]}}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"entityDescription":[{"operator":"like",' - '"values":["FrOdO", "sam"],' - '"logicalOperator":"or"}]}'))]: - assert bool(rv.get_json()['pagination']['entities'] == 2) - - # Test search parameter - for rv in [ - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - classes='E18', - codes='place', - system_classes='person', - format='lp', - search=f'{{"valueTypeID":[{{"operator":"equal",' - f'"values":[({height.id},23.0)]}}]}}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - classes='E18', - codes='place', - system_classes='person', - format='lp', - search=f'{{"valueTypeID":[{{' - f'"operator":"greaterThanEqual",' - f'"values":[({height.id},23.0)]}}]}}')), - self.app.get( - url_for( - 'api_04.query', - system_classes='place', - search="""{"entityName":[{"operator":"notEqual", - "values":["Mordor"],"logicalOperator":"or"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"typeName":[{"operator":"equal", - "values":["Boundary Mark", "Height"], - "logicalOperator":"and"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"relationToID":[{{"operator":"equal",' - f'"values":[{place.id}],' - f'"logicalOperator":"or"}}]}}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginFrom":[{"operator":"lesserThan", - "values":["2020-01-01"], - "logicalOperator":"and"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginFrom":[{"operator":"lesserThan", - "values":["2020-01-01"],"logicalOperator":"or"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginTo":[{"operator":"lesserThanEqual", - "values":["2018-03-01"], - "logicalOperator":"and"}]}""")), - self.app.get( + # ---Test search--- + search_string_constructor = { + 0: [{ + "entityAliases": [{ + "operator": "equal", + "values": ["Sûza"], + "logicalOperator": "and"}], + "typeID": [{ + "operator": "equal", "values": [1121212], + "logicalOperator": "and"}]}, { + "valueTypeID": [{ + "operator": "lesserThanEqual", + "values": [(height.id, 1.0), (weight_.id, 1.0)], + "logicalOperator": "and"}]}, { + "entityAliases": [{ + "operator": "greaterThan", "values": ["Sûza"]}], + "typeID": [{"operator": "equal", "values": [1121212]}]}], + 1: [{ + "valueTypeID": [{ + "operator": "equal", + "values": [(height.id, 23.0)]}]}, { + "valueTypeID": [{ + "operator": "greaterThanEqual", + "values": [(height.id, 23.0)]}]}, { + "typeName": [{ + "operator": "equal", + "values": ["Boundary Mark", "Height"], + "logicalOperator": "and"}]}, { + "beginFrom": [{ + "operator": "lesserThan", + "values": ["2020-01-01"], + "logicalOperator": "and"}]}, { + "beginFrom": [{ + "operator": "lesserThan", + "values": ["2020-01-01"]}]}, { + "beginTo": [{ + "operator": "lesserThanEqual", + "values": ["2018-03-01"], + "logicalOperator": "and"}]}, { + "beginTo": [{ + "operator": "lesserThanEqual", + "values": ["2018-03-01"]}]}, { + "endFrom": [{ + "operator": "greaterThan", + "values": ["2013-02-01"], + "logicalOperator": "and"}]}, { + "endFrom": [{ + "operator": "greaterThan", + "values": ["2013-02-01"]}]}, { + "endTo": [{ + "operator": "greaterThanEqual", + "values": ["2019-03-01"], + "logicalOperator": "and"}]}, { + "endTo": [{ + "operator": "greaterThanEqual", + "values": ["2019-03-01"]}]}, { + "entityAliases": [ + {"operator": "like", "values": ["S"]}]}, { + "typeName": [{ + "operator": "like", + "values": ["Oun", "mark"], + "logicalOperator": "and"}]}, { + "entityDescription": [{ + "operator": "equal", + "values": [ + "the shirE Was the Homeland of the hobbits.", + "homeland"]}]}, { + "valueTypeID": [{ + "operator": "greaterThanEqual", + "values": [(height.id, 23.0), (weight_.id, 999.0)], + "logicalOperator": "and"}]}], + 2: [{ + "entityCidocClass": [{ + "operator": "equal", + "values": ["E21"], + "logicalOperator": "and"}]}, { + "entitySystemClass": [{ + "operator": "equal", + "values": ["person"], + "logicalOperator": "and"}]}, { + "typeIDWithSubs": [{ + "operator": "equal", + "values": [boundary_mark.id, height.id]}]}, { + "typeIDWithSubs": [{ + "operator": "equal", + "values": [boundary_mark.id], + "logicalOperator": "and"}]}, { + "typeID": [{ + "operator": "equal", + "values": [boundary_mark.id, height.id]}]}], + 3: [{ + "typeIDWithSubs": [{ + "operator": "equal", + "values": [ + boundary_mark.id, height.id, + change_of_property.id]}]}, { + "entityDescription": [{ + "operator": "like", + "values": ["FrOdO", "sam"]}]}], + 5: [{"entityName": [{"operator": "like", "values": ["Fr"]}]}], + 9: [{ + "relationToID": [{ + "operator": "equal", "values": [place.id]}]}], + 161: [{ + "typeIDWithSubs": [{ + "operator": "notEqual", + "values": [boundary_mark.id], + "logicalOperator": "and"}]}], + 162: [{ + "typeName": [{ + "operator": "notEqual", + "values": ["Boundary Mark", "Height"], + "logicalOperator": "and"}]}, { + "entityID": [{ + "operator": "notEqual", + "values": [place.id], + "logicalOperator": "and"}]}, { + "entityAliases": [{ + "operator": "notEqual", + "values": ["Sûza"], + "logicalOperator": "and"}]}, { + "entityName": [ + {"operator": "notEqual", "values": ["Mordor"]}]}]} + + for count, search_string in search_string_constructor.items(): + rv = self.app.get( url_for( 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"beginTo":[{"operator":"lesserThanEqual", - "values":["2018-03-01"],"logicalOperator":"or"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"endFrom":[{"operator":"greaterThan", - "values":["2013-02-01"], - "logicalOperator":"and"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"endFrom":[{"operator":"greaterThan", - "values":["2013-02-01"],"logicalOperator":"or"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"endTo":[{"operator":"greaterThanEqual", ' - '"values":["2019-03-01"],' - '"logicalOperator":"and"}]}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"endTo":[{"operator":"greaterThanEqual", - "values":["2019-03-01"],"logicalOperator":"or"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='all', system_classes='all', - format='lp', - search='{"entityDescription":[{"operator":"equal",' - '"values":["the shirE Was the Homeland of the' - ' hobbits.", "homeland"],' - '"logicalOperator":"or"}]}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"entityName":[{"operator":"like",' - '"values":["Fr"],' - '"logicalOperator":"or"}]}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"entityAliases":[{"operator":"like",' - '"values":["S"],' - '"logicalOperator":"or"}]}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search='{"typeName": [{"operator": "like",' - '"values": ["Oun", "mark"],' - '"logicalOperator": "and"}]}')), - self.app.get( - url_for( - 'api_04.query', - system_classes='place', - view_classes='artifact', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"notEqual",' - f'"values":[{boundary_mark.id}],' - f'"logicalOperator":"and"}}]}}'))]: - assert bool(rv.get_json()['pagination']['entities'] == 1) - for rv in [ - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"typeID":[{{"operator":"equal",' - f'"values":[{boundary_mark.id},' - f'{height.id}],' - f'"logicalOperator":"or"}}]}}')), - self.app.get( - url_for( - 'api_04.query', - system_classes='place', - view_classes='artifact', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"equal",' - f'"values":[{boundary_mark.id}],' - f'"logicalOperator":"and"}}]}}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"typeIDWithSubs":[{{"operator":"equal",' - f'"values":[{boundary_mark.id},' - f'{height.id}],' - f'"logicalOperator":"or"}}]}}'))]: - assert bool(rv.get_json()['pagination']['entities'] == 2) - for rv in [ - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"typeName":[{"operator":"notEqual", - "values":["Boundary Mark", "Height"], - "logicalOperator":"and"}]}""")), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search=f'{{"entityID":[{{"operator":"notEqual",' - f'"values":[{place.id}],' - f'"logicalOperator":"and"}}]}}')), - self.app.get( - url_for( - 'api_04.query', - entities=place.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='lp', - search="""{"entityAliases":[{"operator":"notEqual", - "values":["Sûza"],"logicalOperator":"and"}]}"""))]: - assert bool(rv.get_json()['pagination']['entities'] == 6) + search=search_string)) + assert bool(rv.get_json()['pagination']['entities'] == count) + for rv in [ self.app.get(url_for('api_04.subunits', id_=place.id)), self.app.get( url_for('api_04.subunits', id_=place.id, download=True))]: assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json()[str(place.id)] - for item in rv: - if item['id'] == place.id: - assert bool(item['id'] == place.id) - assert bool(item['openatlasClassName'] == "place") - assert bool(item['children'] == [feature.id]) - item = item['properties'] - assert bool(item['name'] == place.name) - assert bool(item['description'] == place.description) - assert bool(item['aliases'] == [alias.name]) - assert bool(item['externalReferences']) - assert bool(item['timespan']) - assert bool(item['standardType']) - assert bool(item['files']) - assert bool(item['types']) + rv = rv.get_json()[str(place.id)] + for item in rv: + if item['id'] == place.id: + assert bool(item['id'] == place.id) + assert bool(item['openatlasClassName'] == "place") + assert bool(item['children'] == [feature.id]) + item = item['properties'] + assert bool(item['name'] == place.name) + assert bool(item['description'] == place.description) + assert bool(item['aliases'] == [alias.name]) + assert bool(item['externalReferences']) + assert bool(item['timespan']) + assert bool(item['standardType']) + assert bool(item['files']) + assert bool(item['types']) rv = self.app.get( url_for('api_04.subunits', id_=place.id, count=True)) @@ -913,10 +683,11 @@ def test_api(self) -> None: centroid=True)) assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') - rv = self.app.get( - url_for('api_04.subunits', id_=place.id, centroid=True)) - assert b'(autogenerated)' in rv.data - assert 'application/json' in rv.headers.get('Content-Type') + rv = self.app.get( + url_for('api_04.subunits', id_=place.id, + centroid=True)) + assert b'(autogenerated)' in rv.data + assert 'application/json' in rv.headers.get('Content-Type') rv = self.app.get( url_for( 'api_04.view_class', @@ -939,7 +710,7 @@ def test_api(self) -> None: self.app.get( url_for('api_04.cidoc_class', class_='E18', last=1231))]: rv = rv.get_json() - assert 'Entity does not exist' in rv['title'] + assert 'Entity does not exist' in rv['title'] rv = self.app.get(url_for('api_04.subunits', id_=actor.id)) assert 'ID is not a valid place' in rv.get_json()['title'] From 1f944dc6983e0cc1059dde9266ac3b93af6f2d68 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Thu, 21 Nov 2024 16:56:44 +0100 Subject: [PATCH 22/42] refactored search calls --- tests/test_api.py | 93 +++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 40 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index ee183d97d..12e9f161a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -98,9 +98,9 @@ def test_api(self) -> None: rv = self.app.get( url_for('api_04.class_mapping', locale='de')).get_json() assert self.get_class_mapping(rv, 'de') - rv = self.app.get(url_for( - 'api_04.class_mapping', locale='ca', download=True)).get_json() - assert self.get_class_mapping(rv, 'ca') + rv = self.app.get( + url_for('api_04.class_mapping', locale='ca', download=True)) + assert self.get_class_mapping(rv.get_json(), 'ca') rv = self.app.get( url_for('api_04.properties', locale='de')).get_json() @@ -111,9 +111,9 @@ def test_api(self) -> None: assert bool(rv['P2']['i18nInverse']) assert bool(rv['P2']['code']) - rv = self.app.get(url_for( - 'api_04.properties', locale='fr', download=True)).get_json() - assert rv['P2']['name'] == 'est de type' + rv = self.app.get( + url_for('api_04.properties', locale='fr', download=True)) + assert rv.get_json()['P2']['name'] == 'est de type' rv = self.app.get(url_for('api_04.backend_details')).get_json() assert bool(rv['version'] == app.config['VERSION']) rv = self.app.get( @@ -121,17 +121,15 @@ def test_api(self) -> None: assert bool(rv['version'] == app.config['VERSION']) rv = self.app.get(url_for('api_04.system_class_count')).get_json() assert bool(rv['person']) - rv = self.app.get(url_for( - 'api_04.system_class_count', - type_id=boundary_mark.id)).get_json() - assert bool(rv['place']) + rv = self.app.get( + url_for('api_04.system_class_count', type_id=boundary_mark.id)) + assert bool(rv.get_json()['place']) with app.test_request_context(): app.preprocess_request() file.link('P2', open_license) - rv = self.app.get(url_for( - 'api.licensed_file_overview', - file_id=file.id)) + rv = self.app.get( + url_for('api.licensed_file_overview', file_id=file.id)) assert self.get_bool( rv.get_json()[str(file.id)], 'license', @@ -145,7 +143,8 @@ def test_api(self) -> None: exclude_system_classes='type')) rv = rv.get_json() assert bool(len(rv['results']) == 65) - rv = self.app.get(url_for( + rv = self.app.get( + url_for( 'api_04.network_visualisation', linked_to_ids=boundary_mark.id)) rv = rv.get_json() @@ -230,8 +229,12 @@ def test_api(self) -> None: rv['depictions'][0], 'license', 'Public domain') assert self.get_bool(rv['depictions'][0], 'url') - rv = self.app.get(url_for( - 'api_04.entity', id_=place.id, format='lpx', locale='de')) + rv = self.app.get( + url_for( + 'api_04.entity', + id_=place.id, + format='lpx', + locale='de')) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()['features'][0] rel = rv['relations'] @@ -246,8 +249,8 @@ def test_api(self) -> None: 'begin_latest', 'begin_comment', 'end_earliest', 'end_latest', 'end_comment', 'types'] # Test entity in GeoJSON format - rv = self.app.get(url_for( - 'api_04.entity', id_=place.id, format='geojson')) + rv = self.app.get( + url_for('api_04.entity', id_=place.id, format='geojson')) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()['features'][0] assert self.get_bool(rv['geometry'], 'type') @@ -289,7 +292,8 @@ def test_api(self) -> None: for rv in [ self.app.get( url_for('api_04.entity', id_=place.id, export='csv')), - self.app.get(url_for( + self.app.get( + url_for( 'api_04.query', entities=location.id, cidoc_classes='E18', @@ -300,9 +304,11 @@ def test_api(self) -> None: assert 'text/csv' in rv.headers.get('Content-Type') for rv in [ - self.app.get(url_for( + self.app.get( + url_for( 'api_04.entity', id_=place.id, export='csvNetwork')), - self.app.get(url_for( + self.app.get( + url_for( 'api_04.query', entities=location.id, cidoc_classes='E18', @@ -311,7 +317,8 @@ def test_api(self) -> None: export='csvNetwork'))]: assert b'Shire' in rv.data assert 'application/zip' in rv.headers.get('Content-Type') - rv = self.app.get(url_for( + rv = self.app.get( + url_for( 'api_04.linked_entities_by_properties_recursive', id_=place.id, properties='P46')) @@ -768,36 +775,38 @@ def test_api(self) -> None: url_for( 'api_04.view_class', class_='place', - search='{"All":[{"operator":"notEqual",' - '"values":["Boundary Mark", "Height"],' - '"logicalOperator":"or"}]}')) + search={ + "All":[{ + "operator":"notEqual", + "values":["Boundary Mark", "Height"]}]})) assert 'Invalid search category' in rv.get_json()['title'] rv = self.app.get( url_for( 'api_04.view_class', class_='place', - search='{"typeName":[{"operator":"notEqual",' - '"values":[],' - '"logicalOperator":"or"}]}')) + search={ + "typeName":[{"operator":"notEqual","values":[]}]})) assert 'No search value' in rv.get_json()['title'] rv = self.app.get( url_for( 'api_04.view_class', class_='place', - search='{"beginFrom":[{"operator":"notEqual",' - '"values":["Help"],' - '"logicalOperator":"or"}]}')) + search={ + "beginFrom":[{ + "operator":"notEqual", + "values":["Help"]}]})) assert 'Invalid search values' in rv.get_json()['title'] rv = self.app.get( url_for( 'api_04.view_class', class_='place', - search='{"beginFrom":[{"operator":"notEqual",' - '"values":["800-1-1", "Help"],' - '"logicalOperator":"or"}]}')) + search={ + "beginFrom":[{ + "operator":"notEqual", + "values":["800-1-1", "Help"]}]})) assert 'Invalid search values' in rv.get_json()['title'] rv = self.app.get( @@ -823,18 +832,22 @@ def test_api(self) -> None: url_for( 'api_04.view_class', class_='place', - search='{"typeName":[{"operator":"notEqualT",' - '"values":["Boundary Mark", "Height"],' - '"logicalOperator":"and"}]}')) + search={ + "typeName":[{ + "operator":"notEqualT", + "values":["Boundary Mark", "Height"], + "logicalOperator":"and"}]})) assert 'Invalid compare operator' in rv.get_json()['title'] rv = self.app.get( url_for( 'api_04.view_class', class_='place', - search='{"typeName":[{"operator":"notEqual",' - '"values":["Boundary Mark", "Height"],' - '"logicalOperator":"xor"}]}')) + search={ + "typeName":[{ + "operator":"notEqual", + "values":["Boundary Mark", "Height"], + "logicalOperator":"xor"}]})) assert 'Invalid logical operator' in rv.get_json()['title'] rv = self.app.get( From 7633bd7a7968b9c4f9ba11c6037f9a71e61b8eb9 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Fri, 22 Nov 2024 17:26:10 +0100 Subject: [PATCH 23/42] minor refactors --- openatlas/api/endpoints/endpoint.py | 48 ++++++++++----------------- openatlas/api/formats/csv.py | 2 +- openatlas/api/resources/api_entity.py | 3 +- openatlas/api/resources/util.py | 10 +++--- 4 files changed, 27 insertions(+), 36 deletions(-) diff --git a/openatlas/api/endpoints/endpoint.py b/openatlas/api/endpoints/endpoint.py index 53cc853e9..41bbfd58a 100644 --- a/openatlas/api/endpoints/endpoint.py +++ b/openatlas/api/endpoints/endpoint.py @@ -11,7 +11,7 @@ from openatlas import app from openatlas.api.endpoints.parser import Parser from openatlas.api.formats.csv import ( - build_entity_dataframe, build_link_dataframe) + build_dataframe, build_link_dataframe) from openatlas.api.formats.loud import get_loud_entities from openatlas.api.resources.api_entity import ApiEntity from openatlas.api.resources.resolve_endpoints import ( @@ -44,8 +44,7 @@ def resolve_entities(self) -> Response | dict[str, Any]: self.remove_duplicate_entities() self.sorting() result = self.get_json_output() - if (self.parser.format - in app.config['RDF_FORMATS']): # pragma: no cover + if self.parser.format in app.config['RDF_FORMATS']: # pragma: no cover return Response( self.parser.rdf_output(result['results']), mimetype=app.config['RDF_FORMATS'][self.parser.format]) @@ -100,8 +99,7 @@ def filter_by_type(self) -> list[Entity]: return result def export_entities_csv(self) -> Response: - frames = \ - [build_entity_dataframe(e, relations=True) for e in self.entities] + frames = [build_dataframe(e, relations=True) for e in self.entities] return Response( pd.DataFrame(data=frames).to_csv(), mimetype='text/csv', @@ -118,7 +116,7 @@ def export_csv_for_network_analysis(self) -> Response: link_frame = [ build_link_dataframe(link_) for link_ in (self.link_parser_check() - + self.link_parser_check_inverse())] + + self.link_parser_check(inverse=True))] file.write(bytes( pd.DataFrame(data=link_frame).to_csv(), encoding='utf8')) return Response( @@ -134,25 +132,18 @@ def get_entities_grouped_by_class(self) -> dict[str, Any]: sorted(entities, key=lambda entity: entity.class_.name), key=lambda entity: entity.class_.name): grouped_entities[class_] = \ - [build_entity_dataframe(entity) for entity in entities_] + [build_dataframe(entity) for entity in entities_] return grouped_entities - def link_parser_check(self) -> list[Link]: - if any(i in ['relations', 'types', 'depictions', 'links', 'geometry'] - for i in self.parser.show): - return Entity.get_links_of_entities( - [entity.id for entity in self.entities], - self.parser.get_properties_for_links()) - return [] - - def link_parser_check_inverse(self) -> list[Link]: - if any(i in ['relations', 'types', 'depictions', 'links', 'geometry'] - for i in self.parser.show): - return Entity.get_links_of_entities( + def link_parser_check(self, inverse: bool = False) -> list[Link]: + links = [] + show_ = {'relations', 'types', 'depictions', 'links', 'geometry'} + if set(self.parser.show) & show_: + links = Entity.get_links_of_entities( [entity.id for entity in self.entities], self.parser.get_properties_for_links(), - inverse=True) - return [] + inverse=inverse) + return links def sorting(self) -> None: if 'latest' in request.path: @@ -172,8 +163,8 @@ def remove_duplicate_entities(self) -> None: def get_json_output(self) -> dict[str, Any]: total = [e.id for e in self.entities] count = len(total) - self.parser.limit = count \ - if self.parser.limit == 0 else self.parser.limit + if self.parser.limit == 0: + self.parser.limit = count e_list = [] if total: e_list = list(itertools.islice(total, 0, None, self.parser.limit)) @@ -211,7 +202,7 @@ def get_entities_formatted(self) -> list[dict[str, Any]]: 'links_inverse': []} for link_ in self.link_parser_check(): entities_dict[link_.domain.id]['links'].append(link_) - for link_ in self.link_parser_check_inverse(): + for link_ in self.link_parser_check(inverse=True): entities_dict[link_.range.id]['links_inverse'].append(link_) if self.parser.format == 'loud' \ or self.parser.format in app.config['RDF_FORMATS']: @@ -242,12 +233,9 @@ def get_geojson(self) -> dict[str, Any]: def get_geojson_v2(self) -> dict[str, Any]: out = [] - links = [ - link_ for link_ in self.link_parser_check() if link_.property.code - in ['P53', 'P74', - 'OA8', 'OA9', - 'P7', 'P26', - 'P27']] + property_codes = ['P53', 'P74', 'OA8', 'OA9', 'P7', 'P26', 'P27'] + link_parser = self.link_parser_check() + links = [l for l in link_parser if l.property.code in property_codes] for entity in self.entities: entity_links = [ link_ for link_ in links if link_.domain.id == entity.id] diff --git a/openatlas/api/formats/csv.py b/openatlas/api/formats/csv.py index 14aefc9a0..d9930e47a 100644 --- a/openatlas/api/formats/csv.py +++ b/openatlas/api/formats/csv.py @@ -11,7 +11,7 @@ from openatlas.models.gis import Gis -def build_entity_dataframe( +def build_dataframe( entity: Entity, relations: bool = False) -> dict[str, Any]: geom = get_csv_geom_entry(entity) diff --git a/openatlas/api/resources/api_entity.py b/openatlas/api/resources/api_entity.py index 945a779f8..4835e5694 100644 --- a/openatlas/api/resources/api_entity.py +++ b/openatlas/api/resources/api_entity.py @@ -47,7 +47,8 @@ def get_by_system_classes(classes: list[str]) -> list[Entity]: def get_linked_entities_with_properties( id_: int, properties: list[str]) -> list[Entity]: - properties = list(g.properties) if 'all' in properties else properties + if 'all' in properties: + properties = list(g.properties) entity = ApiEntity.get_by_id(id_, types=True) return ([entity] + entity.get_linked_entities_recursive(properties, types=True) diff --git a/openatlas/api/resources/util.py b/openatlas/api/resources/util.py index c339ba3fb..5f45723bc 100644 --- a/openatlas/api/resources/util.py +++ b/openatlas/api/resources/util.py @@ -238,10 +238,12 @@ def get_crm_relation_x(link_: Link, inverse: bool = False) -> str: def get_crm_code(link_: Link, inverse: bool = False) -> str: - name = link_.domain.cidoc_class.i18n['en'] \ - if inverse else link_.range.cidoc_class.i18n['en'] - code = link_.domain.cidoc_class.code \ - if inverse else link_.range.cidoc_class.code + name = link_.range.cidoc_class.i18n['en'] + if inverse: + name = link_.domain.cidoc_class.i18n['en'] + code = link_.range.cidoc_class.code + if inverse: + code = link_.domain.cidoc_class.code return f"crm:{code} {name}" From 633d0df767476318d241088cccd323c088acd63f Mon Sep 17 00:00:00 2001 From: NinaBrundke Date: Mon, 25 Nov 2024 11:15:02 +0100 Subject: [PATCH 24/42] Manual adaptions and corrections for Model --- sphinx/source/model/cidoc_crm.rst | 65 +++++++++++---------- sphinx/source/model/index.rst | 64 ++++++++++---------- sphinx/source/model/link_checker.rst | 6 +- sphinx/source/model/openatlas_classes.rst | 28 +++++---- sphinx/source/model/openatlas_shortcuts.rst | 38 ++++++------ sphinx/source/model/references.rst | 39 +++++++------ 6 files changed, 126 insertions(+), 114 deletions(-) diff --git a/sphinx/source/model/cidoc_crm.rst b/sphinx/source/model/cidoc_crm.rst index 9cf823f90..4af6ec142 100644 --- a/sphinx/source/model/cidoc_crm.rst +++ b/sphinx/source/model/cidoc_crm.rst @@ -10,61 +10,64 @@ It is a formal ontology, developed by an developed by an interdisciplinary team in connection with the International Council of Museums (`ICOM `_). -It is used as basis for the underlying data model of OpenAtlas and the -currently used version is +In OpenAtlas its current version, `CIDOC CRM v7.1.2 `_ published in -May 2021. +May 2021, is used as underlying data model of the database. + A script is used to parse the specification and import it into a `PostgreSQL `_ database (more information is -available on `GitHub `_) +available on `GitHub `_). +In this way all data is mapped to CIDOC CRM automatically without the +users having to familiarise themselves with the ontology. The ontology consists of classes, linked together by properties. CIDOC classes ------------- -Classes are indicated by a preceding **E** followed by a numeric code-e.g. +Classes are indicated by a preceding **E** followed by a numeric code - e.g. “:cidoc_entity:`E39 - Actor`” or “:cidoc_entity:`E67 - Birth`”. All entities used within OpenAtlas can be characterised as CIDOC classes. -An overview of all CIDOC CRM classes can be found on this -`page `_. The count -indicates how many times each class has been used in this database instance. -A click on the class name will get you to an overview of the class with +An overview of all CIDOC CRM classes can be found +`here `_. +The displayed count indicates how many times each class has been used in +your OpenAtlas instance. +A click on the class name will bring you to an overview of the class with detailed information, such as a short description, sub- and super classes as well as possible properties. CIDOC Properties ---------------- -CIDOC entities are indicated by a combination of “P” and a numerical sequence - -think “:cidoc_property:`P11 - had participant`” or -":cidoc_property:`P2 - has type`“. They are used to link classes -to other classes. So when an activity to place at a certain location, this can -be modelled in the following way +CIDOC properties are indicated by a combination of the letter “P” and a +numerical sequence - think +“:cidoc_property:`P11 - had participant`” or +":cidoc_property:`P2 - has type`“. They are used to link a +class to another class. So an activity taking place at a certain location, +can be modelled in the following way .. image:: properties.png An overview of all CIDOC CRM properties can be found -`here `_. The count -indicates how many times each property has been used in this database instance. -A click on the property name will get you to an overview of the property with +`here `_. The displayed +count indicates how many times each property has been used in your OpenAtlas +instance. +A click on the property name will bring you to an overview of the property with detailed information, such as a short description. -OpenAtlas does not import nor use inverse properties (ending with i) since our -links are directed anyway. Nevertheless their labels are imported for more -convenient browsing possibilities of relations. -Properties with URLs as domain/range are ignored because the system used here +OpenAtlas does not import nor use inverse properties (properties ending with +the letter i) since all used links are directed anyway. Nevertheless their +labels are imported for more convenient browsing possibilities of relations. +Properties with URLs as domain/range are ignored as the system used here has a foreign key on domain which must match an existing class. -Also some properties are linked as sub_properties_of properties with the i +Also some properties are linked as "sub_properties_of" properties with the i suffix. Since we don't use inverse properties in the database -(direction is determined through domain/range selection)they are linked to +(direction is determined through domain/range selection) they are linked to their counterpart without i. -There are some "special" properties we ignore, e.g. -:cidoc_property:`P3 - has note`, you can look them up in the -OpenAtlas CIDOC parser script where they are defined at the top: -https://github.com/craws/OpenAtlas/blob/main/install/crm/cidoc_rtfs_parser.py -We don't import them because of technical reasons, e.g. they are missing some -definitions that "normal" properties have and the import script would have -troubles to deal with them. E.g. they have no defined range but this is a -foreign key in our database that can't be empty. +There are some "special" properties that are not included in OpenAtlas, e.g. +:cidoc_property:`P3 - has note`. They can be found in the +`OpenAtlas CIDOC parser script `_ +on GitHub, where they are defined on the top: +These properties are not import due to technical reasons, e.g. missing +definitions that "normal" properties have or no defined range. diff --git a/sphinx/source/model/index.rst b/sphinx/source/model/index.rst index 8348bba69..0a1343df6 100644 --- a/sphinx/source/model/index.rst +++ b/sphinx/source/model/index.rst @@ -12,46 +12,48 @@ Model **Data Model** -While the model uses `CIDOC CRM `_ as -ontology, it can be used without prior knowledge of data models, ontologies, -etc. The software automatically maps information to the model. As the -definitions of the CIDOC Conceptual Reference Model was imported into the -system, its +OpenAtlas automatically maps information to +`CIDOC CRM `_ which is used to build the model +of the database. This happens in the background of the application without +the user noticing. Therefore, the database can be used by anyone without +prior knowledge of data modeling, ontologies, CIDOC CRM +and the alike. +As the definitions of the CIDOC Conceptual Reference Model are imported into +the system, its `classes `_ and `properties `_ can be -browsed directly in OpenAtlas (see also :doc:`here`). +browsed directly in OpenAtlas (for more information see +:doc:`here`). Furthermore, it is possible to verify link-conformity between entities via the -`link-checker `_ (for more -information click here :doc:`here`). +`link-checker `_ (more +information is available :doc:`here`). -During the development much emphasis was put on the fact that users do not have -to concern themselves with the model or its ontology. Nevertheless, it is -possible to display the CIDOC classes used in the user interface and thus gain -insight into how the data is mapped. +During the development of the database emphasis is put on easy usage without +prior knowledge on data models or it ontologies. -Pressing the **Model** button on the start page leads to a -graphical presentation of the model (see below), a -:doc:`link checking tool` and links to the classes and -properties. +For everyone interested, a graphical representation of the current data model +can be found by clicking the **Model** button on the start page. Furthermore, a +link checker that helps you find valid CIDOC CRM links as well as links to +all classes and properties is provided :doc:`here`. .. image:: openatlas_schema.png .. image:: openatlas_schema2.png -Furthermore, it is possible to active **Show CIDOC classes** in the user -interface. This will displays the CIDOC class of an entity in the detail view -of a data base entry. -To do so click the gear symbol and choose :doc:`profile`. Go -to **Display**, press the **Edit** button and choose **Show CIDOC classes**. +It is possible to show the CIDOC class of each entity in the detail view +of the user interface. To enable this, click the gear symbol and choose +:doc:`profile`. Go to **Display**, press the **Edit** button +and choose **Show CIDOC classes**. -While we try to only use CIDOC CRM classes and properties where possible -(instead of introducing own classes or using extensions), some shortcuts are -used to increase performance and to keep the code base maintainable. -For more information, see :doc:`OpenAtlas shortcuts`. +Instead of introducing own classes or using extensions, OpenAtlas uses only +basic CIDOC CRM classes and properties wherever possible. In addition, some +shortcuts are used to increase performance and to keep the code base +maintainable. For more information, see +:doc:`OpenAtlas shortcuts`. While OpenAtlas uses the CIDOC CRM within the application, a finer grained -model is needed to deal with any contextual differences needed for the user -interface. Therefore, e.g. -:cidoc_entity:`E33 - Lingustic Object` can be a source -or a source translation with different forms in different context. -An overview of internal mapping and CIDOC CRM classes can be found here -`here `_ +model is needed to deal with contextual differences in the user interface. +Therefore, :cidoc_entity:`E33 - Lingustic Object` is +used as class for sources as well as source translations with different user +interface forms. +An overview of the internal mapping and CIDOC CRM classes can be found +`here `_. diff --git a/sphinx/source/model/link_checker.rst b/sphinx/source/model/link_checker.rst index 7865cad8d..edb602cc6 100644 --- a/sphinx/source/model/link_checker.rst +++ b/sphinx/source/model/link_checker.rst @@ -3,6 +3,6 @@ Link checker With the `link checker `_ -you can test if certain class and property connections -are CIDOC CRM conform. It can be reached via the **Model** button at the -overview. +the validity of CIDOC CRM class - property connections can be checked. The +link checker can also be accessed by clicking the **Model** button at the +overview page of each OpenAtlas instance. diff --git a/sphinx/source/model/openatlas_classes.rst b/sphinx/source/model/openatlas_classes.rst index bedbdf132..242bfe641 100644 --- a/sphinx/source/model/openatlas_classes.rst +++ b/sphinx/source/model/openatlas_classes.rst @@ -5,27 +5,35 @@ OpenAtlas classes These special classes are used within the software to further refine `CIDOC CRM `_ classes for the user interface. +While OpenAtlas uses the CIDOC CRM within the application, a finer grained +model is needed to deal with contextual differences in the user +interface. Therefore, +:cidoc_entity:`E33 - Lingustic Object` is used as class +for sources as well as source translations with different user interface forms. +An overview of the internal mapping and CIDOC CRM classes can be found +`here `_. -All OpenAtlas classes can be mapped directly to the corresponding CIDOC CRM -classes. For all available classes and properties of CIDOC CRM (version 7.1.2) -`see here `_. +All of these so called OpenAtlas classes can be mapped directly to the +corresponding CIDOC CRM class. For all available classes and properties of +CIDOC CRM (version 7.1.2) see +`the CIDOC CRM documentation `_. Example: -The CIDOC class :cidoc_entity:`E18 - Physical Thing` -"comprises all persistent physical items with a relatively stable form, -human-made or natural" (for more information see +:cidoc_entity:`E18 - Physical Thing` "comprises all +persistent physical items with a relatively stable form, human-made or +natural" (for more information see :cidoc_entity:`CIDOC CRM` documentation). In OpenAtlas E18 is used to represent :doc:`place `, :doc:`stratigraphic unit `, and -:doc:`feature `, which are all physical things according to -`CIDOC CRM `_. +:doc:`feature `, which are all considered physical things +according to `CIDOC CRM `_. To differentiate between those different entities, the corresponding OpenAtlas classes were created. While :doc:`place `, :doc:`stratigraphic unit `, and :doc:`feature ` are all considered E18 and mapped to this CIDOC CRM class in the background of the application, the user interface -displays the OpenAtlas class name for user's convenience and to avoid -confusion. +displays the OpenAtlas class name and a corresponding, entity-specific form +for user's convenience and to avoid confusion. The same is true for bibliography, edition, external reference and file, which are all considered to be :cidoc_entity:`E31 - Documents` in diff --git a/sphinx/source/model/openatlas_shortcuts.rst b/sphinx/source/model/openatlas_shortcuts.rst index 81be2129d..6b774ea7a 100644 --- a/sphinx/source/model/openatlas_shortcuts.rst +++ b/sphinx/source/model/openatlas_shortcuts.rst @@ -4,16 +4,15 @@ OpenAtlas shortcuts .. toctree:: OpenAtlas uses several shortcuts in order to simplify connections between -entities that are always used the same way. All shortcuts can be resolved -according to :doc:`CIDOC CRM` specifications and are valid -links. These shortcuts are indicated by a preceding OA in combination with a -number. Currently OpenAtlas uses 3 shortcuts: +entities that are continuously used in the same way. All shortcuts can be +resolved in accordance with the:doc:`CIDOC CRM` specifications and +are valid links. These shortcuts are indicated by a preceding OA in +combination with a number. Currently OpenAtlas uses 3 shortcuts: OA7 - has relationship to ------------------------- -OA7 is used to link two instances of :cidoc_entity:`E39 - Actor` via -a certain relationship; in that way an actor can be linked with an actor. +OA7 is used to link two instances of :cidoc_entity:`E39 - Actor` :cidoc_entity:`E39 - Actor` linked with :cidoc_entity:`E39 - Actor` @@ -28,13 +27,13 @@ a certain relationship; in that way an actor can be linked with an actor. Example: [Stefan (:cidoc_entity:`E21`)] participated in -(:cidoc_property:`P11i`) [Relationship from Stefan to +(:cidoc_property:`P11i`) [Relationship between Stefan and Joachim (:cidoc_entity:`E5`)] had participant (:cidoc_property:`P11` [Joachim (:cidoc_entity:`E21`)] The connecting event is defined by an entity of class -:cidoc_entity:`E55`: [Relationship from Stefan to Joachim +:cidoc_entity:`E55`: [Relationship between Stefan and Joachim (:cidoc_entity:`E5`)] has type (:cidoc_property:`P2`) [Son to Father (:cidoc_entity:`E55`)] @@ -42,9 +41,9 @@ The connecting event is defined by an entity of class OA8 - appears for the first time in ----------------------------------- -OA8 is used to link the beginning of a Persistent Item's +OA8 is used to link the beginning of a persistent item's (:cidoc_entity:`E77`) life -span (or time of usage) with a certain place. E.g to document the birthplace of +span (or time of usage) with a certain place, e.g to document a birthplace of a person. :cidoc_entity:`E77 - Persistent Item` linked with a @@ -62,18 +61,17 @@ a person. Example: [Albert Einstein (:cidoc_entity:`E521` was brought into existence -by -(:cidoc_property:`P92`) [Birth of Albert Einstein -(:cidoc_entity:`E567`)] took place at +by (:cidoc_property:`P92`) [Birth of Albert +Einstein (:cidoc_entity:`E567`)] took place at (:cidoc_property:`P7`) [Ulm (:cidoc_entity:`E53`)] OA9 - appears for the last time in ---------------------------------- -OA9 is used to link the end of a Persistent Item's +OA9 is used to link the end of a persistent item's (:cidoc_entity:`E77`) life -span (or time of usage) with a certain place (:cidoc_entity:`E53`). -E.g to document a person's place of death. +span (or time of usage) with a certain place +(:cidoc_entity:`E53`), e.g to document a person's place of death. :cidoc_entity:`E77 - Persistent Item` linked with a :cidoc_entity:`E53 - Place`. @@ -97,12 +95,12 @@ by (:cidoc_property:`P93i`) Dates ----- -For dates, data is stored in the table model.entity respectively model.link in +Dates are stored in the table model.entity/model.link in the fields begin_from, begin_to, begin_comment, end_from, end_to, end_comment as timestamps. -Depending on class of the entity respectively the domain and range classes of -the link, these dates can be mapped as CIDOC CRM -:cidoc_entity:`E61 - Time Primitive` entities. +Depending on the class of the entity as well as the domain and range of the +link, these dates can be mapped as CIDOC CRM +:cidoc_entity:`E61 - Time Primitive`. E77 - Persistent Item +++++++++++++++++++++ diff --git a/sphinx/source/model/references.rst b/sphinx/source/model/references.rst index 91d7904f4..a28615b6a 100644 --- a/sphinx/source/model/references.rst +++ b/sphinx/source/model/references.rst @@ -11,14 +11,14 @@ link various entities to references. References can be: * Documents (:cidoc_entity:`E31`) such as files, bibliographic - entities or references like URLs, DOIs, etc. + entities, or references like URLs, DOIs, etc. * Linguistic Objects (:cidoc_entity:`E33`) such as the content of a medieval charter In order to record which part of the document contains the respective reference a delimiter respectively a certain value to determine the position in the -reference, is stored along with the link between the entities. This can be page -numbers of a book, chapters, figure numbers etc. +reference, is stored along with the link between the entities. This can be +a page numbers of a book, a chapter, a figure number, etc. .. image:: references.png @@ -42,8 +42,7 @@ Reference systems include sources such as vocabularies, gazetteers, etc. They are considered authority documents (:cidoc_entity:`E32`). -Users can define a reference system respectively authority document by defining -a name, class, and description. +Users can define a reference system by defining a name, class, and description. Example: @@ -56,8 +55,8 @@ Example: OpenAtlas distinguishes between: * Functional web resources, implemented via an API, etc. -* Non-digital respectively non-web-functional resources such as printed - encyclopedia, card catalogs, inventory records, etc. +* Non-digital/non-web-functional resources such as printed encyclopedia, + card catalogs, inventory records, etc. The link between an entity and the Authority Document is stored in the model.link table in the following way: @@ -65,12 +64,13 @@ model.link table in the following way: * domain_id: ID of the Authority Document * property_code: P67 * range_id: ID of the entity -* description: delimiter (alphanumeric) +* description: delimiter (alphanumerical) This combination of :cidoc_entity:`E32` and delimiter -could furthermore be resolved as :cidoc_entity:`E31 Document` as -it is a unique reference documenting the entity while the E32 alone is the -container for all possible references from this authority document. +can be resolved as :cidoc_entity:`E31 Document` as it is a +unique reference documenting the entity while the E32 by itself can be +considered as container for all possible references from this authority +document. .. image:: reference_system.png @@ -87,6 +87,8 @@ Example: (:cidoc_property:`P71i`)[`WikiData `_ (:cidoc_entity:`E32`)] +For more information on reference systems see the following links: +:doc:`/examples/reference_systems` and :doc:`/entity/reference_system`. References and Files -------------------- @@ -96,17 +98,16 @@ Various entities can be connected to files. This is mapped as: :cidoc_entity:`E31` (Document = file) - refers to (:cidoc_property:`P67`) - :cidoc_entity:`E1` -Files can refer to any of the "top level" entities and can -(but need not necessarily) be images. Files are stored with a certain +Files can refer to any of the "top level" entities and can be +(but don't have to be) images. Files are stored with a certain system type (i.e. file). If the file is an image, this is most probably a depiction of the entity. -A file can also have a further reference - e.g. the source where the file comes -from. This can be a bibliographical reference to the publication -where a file (e.g. a scanned image) is extracted from. In this case there is a -link between a document :cidoc_entity:`E31` with a type -"Bibliography" (or sub type) via :cidoc_property:`P67` to +A file can be linked to a reference, such as a bibliographical reference to +the publication the file originates from. +In this creates a link between a document :cidoc_entity:`E31` +and a type "Bibliography" via :cidoc_property:`P67` to another document :cidoc_entity:`E31` with a system type "file". In this case the file is not the depiction of the reference but the reference is the origin of the file. This is mostly needed to document the copyright -respectively right holder or source of the file. +respectively right holder or source of a file. From 7e92df24f59e2ef9c24b523d7b5457d39736345d Mon Sep 17 00:00:00 2001 From: NinaBrundke Date: Mon, 25 Nov 2024 13:01:11 +0100 Subject: [PATCH 25/42] Manual adaptions and corrections for Technical --- sphinx/source/technical/api.rst | 110 ++++++++++-------- .../technical/application_structure.rst | 14 +-- .../source/technical/database_structure.rst | 6 +- 3 files changed, 69 insertions(+), 61 deletions(-) diff --git a/sphinx/source/technical/api.rst b/sphinx/source/technical/api.rst index dbb7074f8..843c3714b 100644 --- a/sphinx/source/technical/api.rst +++ b/sphinx/source/technical/api.rst @@ -6,33 +6,34 @@ API Introduction ============ -This page provides an overview of the OpenAtlas Application Programming -Interface (`API `_). An API allows easy -and controlled access from external sources (e.g. presentation sites or -analytical tools) to your data. It is human and mashine readable and -provides different approaches to query your data. +This page provides an overview of the OpenAtlas API. An (`API `_) allows easy and controlled access to the data +stored in an OpenAtlas instance from external sources, such as presentation +sites or analytical tools. The information provided is readable for human and +machines alike. By using the API data can be queried in several different ways. -The OpenAtlas API tries to follow the +The development of the OpenAtlas API follows the `RESTful `_ constraints. -To try out the API first hand at our demo site: https://demo.openatlas.eu/swagger. -If you have your own OpenAtlas instance just visit /swagger. Be aware -that the :doc:`/admin/api` has to be set to public at the admin section. - +Testing the API is possible via: https://demo.openatlas.eu/swagger. +Using it with the data from a specific OpenAtlas instance is possible by +visiting /swagger. Be aware +that the :doc:`/admin/api` has to be set to public in the admin setting +section of the instance. Quick Start Guide ================= -The API can be accessed via the OpenAtlas user interface or through URL GET +The API can be accessed via the OpenAtlas user interface or through an URL GET requests. 1. UI access ------------ -Each detail view of an entity provide two buttons (JSON and RDF) where the -formats, in which the entity should be exported, can be selected. If the -buttons are not visible, please change the **Show API links** -at the :ref:`display` tab in your :doc:`/tools/profile`. +Each detail view of an entity provides two buttons (JSON and RDF). Via those +buttons the format, in which the entity will be exported, can be selected. +If the buttons are not visible, please change the **Show API links** +in the :ref:`display` tab of your :doc:`/tools/profile` in the settings. -Through the UI, only a single entity can be accessed. +By using the UI in this way, only a single entity can be accessed. .. figure:: api_ui_json.jpg :align: center @@ -44,11 +45,12 @@ Through the UI, only a single entity can be accessed. Possible RDF API formats + 2. URL / GET access ------------------- The most common way to communicate with the OpenAtlas API is through GET -request, either manually from the local browser or with other applications -following a specific URL schema: +request. This can be done either manually from the local browser or with other +applications following a specific URL schema: .. code-block:: @@ -58,29 +60,29 @@ following a specific URL schema: https://demo.openatlas.eu/api/0.3/entity/5117 **Domain** Location of the OpenAtlas instance from which information should be - retrieved; e.g. https://demo-openatlas.eu/ for the demo version. + retrieved, e.g. https://demo-openatlas.eu/ for the demo version **API Version** - Input without version number leads to the current stable version + Input without a version number leads to the current stable version (`https://demo.openatlas.eu/api/entity/5117 `_). If another version of the API is to be used, the version number can be - specified (demo.openatlas.eu/api/**0.4**/entity/5117). A version overview - can be found under point Versioning_. + specified (e.g. demo.openatlas.eu/api/**0.4**/entity/5117). A version + overview can be found under Versioning_. **Endpoints** Specific data can be queried by attaching an endpoint - (demo.openatlas.eu/api/0.4/**entity**/5117). The information is provided - in a human - and machine-readable form. Further information under - Endpoints_. + (e.g. demo.openatlas.eu/api/0.4/**entity**/5117). The information is + provided in a human - and machine-readable form. For further information + see Endpoints_. **Required path values** Must be included to create a valid URL. Different endpoints require - different values (demo.openatlas.eu/api/0.4/entity/**5117**. **5117** is - an ID as required by the entity endpoint) - all required values are state - in **{** **}** at the Endpoints_ definition. + different values (e.g. demo.openatlas.eu/api/0.4/entity/**5117**. + **5117** is an ID as required by the entity endpoint) - all required + values are state in **{** **}** at the Endpoints_ definition. **Parameters** Used to structure additional information for a given URL. They are added to the end of an URL after the "?" symbol - (demo.openatlas.eu/api/0.4/entity/5117**?**download=true). All available - Parameters can be found under Parameters_. For more general information - see this + (e.g. demo.openatlas.eu/api/0.4/entity/5117**?**download=true). All + available Parameters can be found under Parameters_. For more general + information see this `article `_. Versioning @@ -108,42 +110,47 @@ A **stable** version of the API will be available at all times. In addition, warning will be posted in the `roadmap `_ and `release notes `_ before -these versions will be discontinued. **Unstable** versions are currently -developed, so breaking changes may occur at any time without prior notice. +a versions is discontinued. **Unstable** versions are currently +still under development, so breaking changes may occur at any time without +prior notice. Endpoints ========= Through different endpoints, data can be retrieved from OpenAtlas. Each version -has an own set of endpoints, be sure to use the right one. +has an own set of endpoints, make sure to use the correct one. The current version 0.4 endpoint descriptions are available at: -* `Current OpenAPI specification `_ at the OpenAtlas demo version -* `Local OpenAPI specification `_: this link is only available if called from a OpenAtlas installation +* `Current OpenAPI specification `_ for + the OpenAtlas demo version +* `Local OpenAPI specification `_: this link is only available if + called from an OpenAtlas instance -The requested information is provided in Linked Places format -`Linked Places format (LPF) `_. Alternatively, +The requested information is provided in the +`Linked Places format (LPF) `_. +Alternatively, `GeoJSON `_, `Linked Open Usable Data `_ -or RDFs, derived from the `Linked Open Usable Data `_ data, can be accessed. +or RDFs, derived from `Linked Open Usable Data `_ +data, can be accessed. Parameters ========== -With parameters the result of the requested endpoint can be manipulated -(filtered, searched, sorted, etc.). Each endpoint provide another set of -parameters which can be used. So please consult the `Endpoints`_ listing for -more details. +By using parameters the result of the requested endpoint can be manipulated +(filtered, searched, sorted, etc.). Each endpoint provides another set of +parameters which can be used. Consult the `Endpoints`_ list for more details. Parameters are added to the end of an URL after the "**?**" symbol (e.g. demo.openatlas.eu/api/0.4/entity/5117**?download=true**) and are connected with the "**&**" sign. -For more general information on this topic see this +For more general information on this, see this `article `_. -* `Current OpenAPI parameters `_ at the OpenAtlas demo version -* `Local OpenAPI parameters `_: this link is only available if called from a OpenAtlas installation - +* `Current OpenAPI parameters `_ at the + OpenAtlas demo version +* `Local OpenAPI parameters `_: this link is only available if + called from an OpenAtlas instance Error handling ============== @@ -168,15 +175,16 @@ Example: If an invalid endpoint parameter value e.g. ?sort=kfs instead of ?sort=desc is entered, Flask catches this via its own -`Flask-RESTful `_ extension. -An error message is provided by its own error handler +`Flask-RESTful `_ extension +and displays an error message provided by its own `error handler `_ Proxy ===== -If the server is behind a proxy, there are some issues with the RDF export of entities. -To provide the OpenAtlas API with a proxy server, add following line to **instance/production.py** +If the server is behind a proxy, issues with the RDF export of entities can +occur. To provide the OpenAtlas API with a proxy server, add the following +line to **instance/production.py** .. code-block:: python diff --git a/sphinx/source/technical/application_structure.rst b/sphinx/source/technical/application_structure.rst index de3bf933f..2039c5f89 100644 --- a/sphinx/source/technical/application_structure.rst +++ b/sphinx/source/technical/application_structure.rst @@ -5,7 +5,7 @@ Application Structure The website's software is written in `Python `_ and uses the `Flask `_ framework. -Below you find an overview of the file structure: +Below you can find an overview of the file structure: * **config** - default configuration * **files**: @@ -24,9 +24,9 @@ Below you find an overview of the file structure: * **openatlas**: * **api** - * **database** - the SQL code lives here + * **database** - SQL code lives here * **display** - display manager and utility functions - * **forms** - form manager and other forms related files + * **forms** - form manager and other form related files * **models** - classes used in the application * **static** - the web root containing CSS, JavaScript, layout images, etc. @@ -34,12 +34,12 @@ Below you find an overview of the file structure: * **translations** - source and compiled files for translations * **views** - files concerning routing, redirects, etc. -* **sphinx** - source files for the user manual, used with +* **sphinx** - source files of the user manual, for more details see `Sphinx `_ * **test** -To retrace for example a call that was made from a web browser such as -/entity/15883 +To retrace a call that was made from a web browser (for example +/entity/15883) the following steps will be executed: * **openatlas/init.py** is processed and **before_request()** is executed * The URL is resolved and a function in **views** is called, in this case @@ -51,6 +51,6 @@ To retrace for example a call that was made from a web browser such as * A template is called from the view, in this case **openatlas/templates/entity/view.html** * The template may use filters defined in **openatlas/display/util.py** - like: some_data|some_filter + such as: some_data|some_filter diff --git a/sphinx/source/technical/database_structure.rst b/sphinx/source/technical/database_structure.rst index 271b91063..aa95272b3 100644 --- a/sphinx/source/technical/database_structure.rst +++ b/sphinx/source/technical/database_structure.rst @@ -14,10 +14,10 @@ Regarding the database structure, the following PostgreSQL schemas are used: * Entities (OpenAtlas class instances) * Links (CIDOC property instances) -* **public** - general PostgreSQL functionality, e.g. PostGIS functions -* **web** - none model data related to the website, e.g. +* **public** - general PostgreSQL functionality such as PostGIS functions +* **web** - non-model data related to the website such as: * website settings (upload size limit, email configuration, ...) - * groups, users and their preferences, notes, bookmarks, ... + * groups, users, user's preferences, notes, bookmarks, ... * image annotations * external reference system specifications From 396ee86b53095cb124e456000dc7add469c25625 Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Mon, 25 Nov 2024 16:54:54 +0100 Subject: [PATCH 26/42] Refactored tests: self.app to self.client --- .pylintrc | 2 +- install/data_test.sql | 4 +- tests/base.py | 5 +- tests/test_actor.py | 40 +++++------ tests/test_admin.py | 51 +++++++------- tests/test_artifact.py | 41 ++++++----- tests/test_date.py | 13 ++-- tests/test_event.py | 73 ++++++++++---------- tests/test_export_import.py | 88 +++++++++++------------- tests/test_file.py | 120 +++++++++++++++------------------ tests/test_hierarchy.py | 44 ++++++------ tests/test_image.py | 31 ++++----- tests/test_index.py | 35 +++++----- tests/test_involvement.py | 11 +-- tests/test_mail.py | 39 +++++------ tests/test_model.py | 25 +++---- tests/test_note.py | 43 ++++++------ tests/test_place.py | 96 +++++++++++++------------- tests/test_profile.py | 17 ++--- tests/test_reference.py | 11 +-- tests/test_reference_system.py | 53 ++++++--------- tests/test_relation.py | 18 ++--- tests/test_search.py | 11 +-- tests/test_source.py | 32 ++++----- tests/test_type.py | 63 +++++++++-------- tests/test_user.py | 71 +++++++++---------- 26 files changed, 495 insertions(+), 542 deletions(-) diff --git a/.pylintrc b/.pylintrc index 76459fcfd..a7661de1b 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,7 +1,7 @@ [MASTER] ignore=openatlas.wsgi disable=C0111, broad-except, duplicate-code -good-names=bc, e, ex, f, i, id, ip, j, js, k, l, Run, rv, to, x, y, _ +good-names=bc, c, e, ex, f, i, id, ip, j, js, k, l, Run, rv, to, x, y, _ min-public-methods=1 # default=2 but isn't useful when working with inheritance [FORMAT] diff --git a/install/data_test.sql b/install/data_test.sql index da8989e99..646a3c76b 100644 --- a/install/data_test.sql +++ b/install/data_test.sql @@ -1,9 +1,9 @@ -- Create test user INSERT INTO web.user (group_id, username, password, active, email, password_reset_code, password_reset_date, unsubscribe_code) VALUES - ((SELECT id FROM web.group WHERE name = 'admin'), 'Alice', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', True, 'alice@example.com', '1234', current_timestamp, NULL), + ((SELECT id FROM web.group WHERE name = 'admin'), 'Alice', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', True, 'alice@example.com', '123', current_timestamp, NULL), ((SELECT id FROM web.group WHERE name = 'admin'), 'Inactive', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', False, 'inactive@example.com', NULL, NULL, NULL), - ((SELECT id FROM web.group WHERE name = 'manager'), 'Manager', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', True, 'manager@example.com', '5678', '2020-02-02', '1234'), + ((SELECT id FROM web.group WHERE name = 'manager'), 'Manager', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', True, 'manager@example.com', '5678', '2020-02-02', '123'), ((SELECT id FROM web.group WHERE name = 'contributor'), 'Contributor', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', True, 'contirbutor@example.com', NULL, NULL, NULL), ((SELECT id FROM web.group WHERE name = 'editor'), 'Editor', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', True, 'editor@example.com', NULL, NULL, NULL), ((SELECT id FROM web.group WHERE name = 'readonly'), 'Readonly', '$2b$12$yPQCBsSQdZxESEz79SFiOOZBLG2GZ9Cc2rzVMgZxXyW2y3T499LYK', True, 'readonly@example.com', NULL, NULL, NULL); diff --git a/tests/base.py b/tests/base.py index 12cbe218c..9ce8e35bc 100644 --- a/tests/base.py +++ b/tests/base.py @@ -17,9 +17,10 @@ def setUp(self) -> None: app.config.from_pyfile('testing.py') self.setup_database() - self.app = app.test_client() + self.client = app.test_client() + self.app = self.client # Remove after updated API tests app.app_context().push() # Always provide app.app_context - self.app.post( + self.client.post( url_for('login'), data={'username': 'Alice', 'password': 'test'}) with app.test_request_context(): diff --git a/tests/test_actor.py b/tests/test_actor.py index d88dd82ed..d5972247b 100644 --- a/tests/test_actor.py +++ b/tests/test_actor.py @@ -9,14 +9,14 @@ class ActorTests(TestBaseCase): def test_actor(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() place = insert('place', 'Vienna') event = insert('acquisition', 'Event Horizon') group = insert('group', 'LV-426 colony') - rv: Any = self.app.get( - url_for('insert', class_='person', origin_id=place.id)) + rv: Any = c.get(url_for('insert', class_='person', origin_id=place.id)) assert b'Vienna' in rv.data sex = get_hierarchy('Sex') @@ -46,22 +46,22 @@ def test_actor(self) -> None: 'end_hour_to': '13', 'end_minute_to': '33', 'end_second_to': '37'} - rv = self.app.post(url_for('insert', class_='person'), data=data) + rv = c.post(url_for('insert', class_='person'), data=data) actor_id = rv.location.split('/')[-1] - rv = self.app.post( + rv = c.post( url_for('insert', class_='group'), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='person', origin_id=place.id), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.post( + rv = c.post( url_for('type_move_entities', id_=sex.subs[0]), data={ sex.id: sex.subs[1], @@ -70,26 +70,26 @@ def test_actor(self) -> None: follow_redirects=True) assert b'Entities were updated' in rv.data - rv = self.app.get(url_for('remove_class', id_=sex.id, name='person')) + rv = c.get(url_for('remove_class', id_=sex.id, name='person')) assert b'403' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='person', origin_id=actor_id), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='person', origin_id=event.id), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - self.app.get(url_for('logout')) - self.app.post( + c.get(url_for('logout')) + c.post( url_for('login'), data={'username': 'Manager', 'password': 'test'}) - rv = self.app.get(url_for('update', id_=actor_id)) + rv = c.get(url_for('update', id_=actor_id)) assert b'American actress' in rv.data data.update({ @@ -100,13 +100,13 @@ def test_actor(self) -> None: 'begin_year_to': '1950', 'begin_day_from': ''}) - rv = self.app.post( + rv = c.post( url_for('update', id_=actor_id), data=data, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.post( + rv = c.post( url_for('ajax_create_entity'), data={ 'entityName': 'artifact', @@ -115,27 +115,27 @@ def test_actor(self) -> None: 'description': 'AI'}) assert rv.data.isdigit() - rv = self.app.post( + rv = c.post( url_for('ajax_get_entity_table', content_domain='artifact'), data={'filterIds': str([])}) assert b'Bishop' in rv.data - rv = self.app.get( + rv = c.get( url_for('link_delete', origin_id=actor_id, id_=666), follow_redirects=True) assert b'removed' in rv.data - rv = self.app.get( + rv = c.get( url_for('insert_relation', origin_id=group.id, type_='member')) assert b'Actor function' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert_relation', origin_id=actor_id, type_='membership'), data={'group': str([group.id])}, follow_redirects=True) assert b'LV-426 colony' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert_relation', origin_id=group.id, type_='member'), data={'actor': str([actor_id]), 'continue_': 'yes'}, follow_redirects=True) @@ -145,7 +145,7 @@ def test_actor(self) -> None: app.preprocess_request() link_ = group.get_links('P107')[0] - rv = self.app.post( + rv = c.post( url_for('link_update', id_=link_.id, origin_id=group.id), data={'description': 'We are here to help you'}, follow_redirects=True) diff --git a/tests/test_admin.py b/tests/test_admin.py index b23c755ac..0cf99757a 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -12,6 +12,7 @@ class AdminTests(TestBaseCase): def test_admin(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() person = insert('person', 'Oliver Twist') @@ -26,14 +27,14 @@ def test_admin(self) -> None: 'description': '', 'type_id': None}) - assert b'Oliver Twist' in self.app.get(url_for('orphans')).data - assert b'Login' in self.app.get(url_for('log')).data - assert b'Login' not in self.app.get(url_for('log_delete')).data + assert b'Oliver Twist' in c.get(url_for('orphans')).data + assert b'Login' in c.get(url_for('log')).data + assert b'Login' not in c.get(url_for('log_delete')).data - rv = self.app.get(url_for('check_dates')) + rv = c.get(url_for('check_dates')) assert b'Congratulations, everything looks fine!' in rv.data - rv = self.app.get(url_for('check_links')) + rv = c.get(url_for('check_links')) assert b'Invalid linked entity' in rv.data file_ = 'Test77.txt' @@ -44,22 +45,22 @@ def test_admin(self) -> None: with open(iiif_path, 'w', encoding='utf8') as _: pass - rv = self.app.get( + rv = c.get( url_for('admin_file_delete', filename=file_), follow_redirects=True) assert b'Test77.txt was deleted' in rv.data - rv = self.app.get( + rv = c.get( url_for('admin_file_delete', filename=file_), follow_redirects=True) assert b'An error occurred when trying to delete' in rv.data - rv = self.app.get( + rv = c.get( url_for('admin_file_iiif_delete', filename=file_), follow_redirects=True) assert b'Test77.txt was deleted' in rv.data - rv = self.app.get( + rv = c.get( url_for('admin_file_iiif_delete', filename=file_), follow_redirects=True) assert b'An error occurred when trying to delete' in rv.data @@ -94,18 +95,18 @@ def test_admin(self) -> None: source.link('P2', g.types[source_type.subs[0]]) source.link('P2', g.types[source_type.subs[1]]) - rv = self.app.get(url_for('check_dates')) + rv = c.get(url_for('check_dates')) assert b'' in rv.data - rv = self.app.get(url_for('check_link_duplicates')) + rv = c.get(url_for('check_link_duplicates')) assert b'Event Horizon' in rv.data - rv = self.app.get( + rv = c.get( url_for('check_link_duplicates', delete='delete'), follow_redirects=True) assert b'Remove' in rv.data - rv = self.app.get( + rv = c.get( url_for( 'delete_single_type_duplicate', entity_id=source.id, @@ -113,45 +114,45 @@ def test_admin(self) -> None: follow_redirects=True) assert b'Congratulations, everything looks fine!' in rv.data - rv = self.app.post( + rv = c.post( url_for('check_similar'), data={'classes': 'person', 'ratio': 100}, follow_redirects=True) assert b'Oliver Twist' in rv.data - rv = self.app.get(url_for('settings', category='mail')) + rv = c.get(url_for('settings', category='mail')) assert b'mail from' in rv.data - rv = self.app.get(url_for('settings', category='general')) + rv = c.get(url_for('settings', category='general')) assert b'log level' in rv.data - rv = self.app.get(url_for('settings', category='iiif')) + rv = c.get(url_for('settings', category='iiif')) assert b'on upload' in rv.data - rv = self.app.get(url_for('settings', category='file')) + rv = c.get(url_for('settings', category='file')) assert b'file size in MB' in rv.data - rv = self.app.post( + rv = c.post( url_for('admin_content', item='citation_example'), data={'en': 'cool citation'}, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get(url_for('insert', class_='edition')) + rv = c.get(url_for('insert', class_='edition')) assert b'cool citation' in rv.data - rv = self.app.get(url_for('admin_content', item='legal_notice')) + rv = c.get(url_for('admin_content', item='legal_notice')) assert b'Save' in rv.data - rv = self.app.get(url_for('arche_index')) + rv = c.get(url_for('arche_index')) assert b'https://arche-curation.acdh-dev.oeaw.ac.at/' in rv.data - rv = self.app.post( + rv = c.post( url_for('admin_content', item='legal_notice'), data={'en': 'My legal notice', 'de': 'German notice'}, follow_redirects=True) assert b'My legal notice' in rv.data - self.app.get('/index/setlocale/de') - rv = self.app.get(url_for('index_content', item='legal_notice')) + c.get('/index/setlocale/de') + rv = c.get(url_for('index_content', item='legal_notice')) assert b'German notice' in rv.data diff --git a/tests/test_artifact.py b/tests/test_artifact.py index 0857c5031..c0806769e 100644 --- a/tests/test_artifact.py +++ b/tests/test_artifact.py @@ -9,6 +9,7 @@ class ArtifactTest(TestBaseCase): def test_artifact(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() source = insert('source', 'Necronomicon') @@ -16,11 +17,11 @@ def test_artifact(self) -> None: place = insert('place', 'Home') sub_artifact = insert('artifact', 'Sub artifact') - rv: Any = self.app.get( + rv: Any = c.get( url_for('insert', class_='artifact', origin_id=place.id)) assert b'+ Artifact' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='artifact'), data={ 'name': 'Love-letter', @@ -28,25 +29,25 @@ def test_artifact(self) -> None: 'super': place.id}) artifact_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('view', id_=actor.id)) + rv = c.get(url_for('view', id_=actor.id)) assert b'Love-letter' in rv.data - rv = self.app.get(url_for('add_subunit', super_id=place.id)) + rv = c.get(url_for('add_subunit', super_id=place.id)) assert b'Love-letter' not in rv.data - rv = self.app.post( + rv = c.post( url_for('add_subunit', super_id=place.id), data={'checkbox_values': [sub_artifact.id]}, follow_redirects=True) assert b'Sub artifact' in rv.data - rv = self.app.get(url_for('index', view='artifact')) + rv = c.get(url_for('index', view='artifact')) assert b'Love-letter' in rv.data - rv = self.app.get(url_for('update', id_=artifact_id)) + rv = c.get(url_for('update', id_=artifact_id)) assert b'Love-letter' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=artifact_id), data={ 'name': 'A little hate', @@ -55,48 +56,46 @@ def test_artifact(self) -> None: follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get(url_for('entity_add_source', id_=artifact_id)) + rv = c.get(url_for('entity_add_source', id_=artifact_id)) assert b'link source' in rv.data - rv = self.app.post( + rv = c.post( url_for('entity_add_source', id_=artifact_id), data={'checkbox_values': str([source.id])}, follow_redirects=True) assert b'Necronomicon' in rv.data - rv = self.app.get( - url_for('insert', class_='move', origin_id=artifact_id)) + rv = c.get(url_for('insert', class_='move', origin_id=artifact_id)) assert b'A little hate' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='move', origin_id=artifact_id), data={'name': 'Event Zero', 'moved_artifact': [artifact_id]}, follow_redirects=True) assert b'Event Zero' in rv.data - rv = self.app.get( - url_for('insert', class_='artifact', origin_id=actor.id)) + rv = c.get(url_for('insert', class_='artifact', origin_id=actor.id)) assert b'Conan' in rv.data - rv = self.app.get( + rv = c.get( url_for('delete', id_=artifact_id), follow_redirects=True) assert b'The entry has been deleted' in rv.data - rv = self.app.get(url_for('user_view', id_=self.alice_id)) + rv = c.get(url_for('user_view', id_=self.alice_id)) assert b'1' in rv.data - rv = self.app.get(url_for('admin_index')) + rv = c.get(url_for('admin_index')) assert b'>1' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='artifact'), data={'name': 'This will be continued', 'continue_': 'yes'}, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.get(url_for('user_view', id_=self.alice_id)) + rv = c.get(url_for('user_view', id_=self.alice_id)) assert b'2' in rv.data - rv = self.app.get(url_for('user_entities', id_=self.alice_id)) + rv = c.get(url_for('user_entities', id_=self.alice_id)) assert b'This will be continued' in rv.data diff --git a/tests/test_date.py b/tests/test_date.py index f125e9b53..0e538ed92 100644 --- a/tests/test_date.py +++ b/tests/test_date.py @@ -7,6 +7,7 @@ class DateTest(TestBaseCase): def test_date(self) -> None: + c = self.client with app.app_context(): data = { # Don't change year values, needed for leap years 'name': 'Date place', @@ -17,14 +18,14 @@ def test_date(self) -> None: 'end_year_from': 1996, 'end_year_to': 1996} - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data=data, follow_redirects=True) assert b'Date place' in rv.data data['begin_day_from'] = 31 - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data=data, follow_redirects=True) @@ -32,7 +33,7 @@ def test_date(self) -> None: data['begin_day_from'] = 5 data['begin_year_from'] = 20 - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data=data, follow_redirects=True) @@ -40,21 +41,21 @@ def test_date(self) -> None: data['begin_year_from'] = -1949 data['end_year_from'] = -2000 - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data=data, follow_redirects=True) assert b'Begin dates cannot start after end dates' in rv.data data['end_year_to'] = '' - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data=data, follow_redirects=True) assert b'Begin dates cannot start after end dates' in rv.data data['begin_year_from'] = '' - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data=data, follow_redirects=True) diff --git a/tests/test_event.py b/tests/test_event.py index 9bda61852..503ee2f77 100644 --- a/tests/test_event.py +++ b/tests/test_event.py @@ -9,6 +9,7 @@ class EventTest(TestBaseCase): def test_event(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() actor = insert('person', 'Captain Miller') @@ -18,29 +19,26 @@ def test_event(self) -> None: reference = insert('external_reference', 'https://d-nb.info') data = {'name': 'Event Horizon', 'location': residence.id} - rv: Any = self.app.post( - url_for('insert', class_='activity'), - data=data) + rv: Any = c.post(url_for('insert', class_='activity'), data=data) activity_id = rv.location.split('/')[-1] - rv = self.app.post( + rv = c.post( url_for('insert', class_='activity', origin_id=actor.id), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='activity', origin_id=file.id), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.get( + rv = c.get( url_for('insert', class_='activity', origin_id=residence.id)) assert b'location' in rv.data - rv = self.app.get( - url_for('insert', class_='move', origin_id=residence.id)) + rv = c.get(url_for('insert', class_='move', origin_id=residence.id)) assert b'Moved artifact' in rv.data data = { @@ -57,14 +55,14 @@ def test_event(self) -> None: f'reference_system_id_{g.wikidata.id}': ['Q123', self.precision_type.subs[0]]} - rv = self.app.post(url_for('insert', class_='acquisition'), data=data) + rv = c.post(url_for('insert', class_='acquisition'), data=data) event_id = rv.location.split('/')[-1] data['end_year_from'] = '7' - rv = self.app.post(url_for('insert', class_='acquisition'), data=data) + rv = c.post(url_for('insert', class_='acquisition'), data=data) assert b'Begin dates cannot start after end dates' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='move'), data={ 'name': 'Keep it moving', @@ -74,31 +72,30 @@ def test_event(self) -> None: 'moved_person': actor.id}) move_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('view', id_=move_id)) + rv = c.get(url_for('view', id_=move_id)) assert b'Keep it moving' in rv.data - rv = self.app.get(url_for('view', id_=artifact.id)) + rv = c.get(url_for('view', id_=artifact.id)) assert b'Keep it moving' in rv.data - rv = self.app.get(url_for('update', id_=move_id)) + rv = c.get(url_for('update', id_=move_id)) assert b'Keep it moving' in rv.data - rv = self.app.get( - url_for('insert', class_='creation', origin_id=file.id)) + rv = c.get(url_for('insert', class_='creation', origin_id=file.id)) assert b'+ Creation' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='creation'), data={'name': 'A creation event', 'file': file.id}) creation_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('view', id_=creation_id, origin_id=file.id)) + rv = c.get(url_for('view', id_=creation_id, origin_id=file.id)) assert b'File' in rv.data - rv = self.app.get(url_for('update', id_=creation_id)) + rv = c.get(url_for('update', id_=creation_id)) assert b'A creation event' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='modification'), data={ 'name': 'A modification event', @@ -106,69 +103,69 @@ def test_event(self) -> None: 'modified_place': residence.id}) modification_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('view', id_=modification_id)) + rv = c.get(url_for('view', id_=modification_id)) assert b'A modification event' in rv.data - rv = self.app.get(url_for('update', id_=modification_id)) + rv = c.get(url_for('update', id_=modification_id)) assert b'A modification event' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='production'), data={'name': 'A productive event', 'artifact': artifact.id}) production_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('view', id_=production_id)) + rv = c.get(url_for('view', id_=production_id)) assert b'artifact' in rv.data - rv = self.app.get(url_for('view', id_=artifact.id)) + rv = c.get(url_for('view', id_=artifact.id)) assert b'A productive event' in rv.data - rv = self.app.get(url_for('update', id_=production_id)) + rv = c.get(url_for('update', id_=production_id)) assert b'A productive event' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='acquisition'), data={'name': 'Third event', 'given_place': [residence.id]}, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.get(url_for('view', id_=residence.id)) + rv = c.get(url_for('view', id_=residence.id)) assert bytes('Lewis and Clark', 'utf-8') in rv.data - rv = self.app.get(url_for('view', id_=actor.id)) + rv = c.get(url_for('view', id_=actor.id)) assert bytes('Captain Miller', 'utf-8') in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='acquisition'), data={'name': 'Event Horizon', 'continue_': 'yes'}, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.get(url_for('view', id_=activity_id)) + rv = c.get(url_for('view', id_=activity_id)) assert b'1949' in rv.data - rv = self.app.get(url_for('entity_add_file', id_=event_id)) + rv = c.get(url_for('entity_add_file', id_=event_id)) assert b'link file' in rv.data - rv = self.app.post( + rv = c.post( url_for('entity_add_file', id_=event_id), data={'checkbox_values': str([file.id])}, follow_redirects=True) assert b'X-Files' in rv.data - rv = self.app.post( + rv = c.post( url_for('entity_add_reference', id_=event_id), data={'reference': reference.id, 'page': '777'}, follow_redirects=True) assert b'777' in rv.data - rv = self.app.get(url_for('update', id_=activity_id)) + rv = c.get(url_for('update', id_=activity_id)) assert b'Event Horizon' in rv.data - rv = self.app.get(url_for('update', id_=event_id)) + rv = c.get(url_for('update', id_=event_id)) assert b'Event Horizon' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=event_id), data={ 'name': 'Event with preceding', @@ -177,5 +174,5 @@ def test_event(self) -> None: follow_redirects=True) assert b'Event with preceding' in rv.data - rv = self.app.get(url_for('update', id_=event_id)) + rv = c.get(url_for('update', id_=event_id)) assert b'Event with preceding' in rv.data diff --git a/tests/test_export_import.py b/tests/test_export_import.py index 794898720..45b96ab39 100644 --- a/tests/test_export_import.py +++ b/tests/test_export_import.py @@ -13,104 +13,99 @@ class ExportImportTest(ExportImportTestCase): def test_export(self) -> None: - assert b'Export SQL' in self.app.get(url_for('export_sql')).data + c = self.client + assert b'Export SQL' in c.get(url_for('export_sql')).data date_ = current_date_for_filename() - rv: Any = self.app.get( + rv: Any = c.get( url_for('export_execute', format_='sql'), follow_redirects=True) assert b'Data was exported' in rv.data - rv = self.app.get( - url_for('download_sql', filename=f'{date_}_export.sql.7z')) + rv = c.get(url_for('download_sql', filename=f'{date_}_export.sql.7z')) assert b'7z' in rv.data date_ = current_date_for_filename() - rv = self.app.get( + rv = c.get( url_for('export_execute', format_='dump'), follow_redirects=True) assert b'Data was exported' in rv.data - rv = self.app.get( - url_for('download_sql', filename=f'{date_}_export.dump.7z')) + rv = c.get(url_for('download_sql', filename=f'{date_}_export.dump.7z')) assert b'7z' in rv.data - assert b'Warning' in self.app.get(url_for('sql_index')).data - assert b'execute' in self.app.get(url_for('sql_execute')).data + assert b'Warning' in c.get(url_for('sql_index')).data + assert b'execute' in c.get(url_for('sql_execute')).data - rv = self.app.post( + rv = c.post( url_for('sql_execute'), data={'statement': 'SELECT * FROM web.user;'}) assert b'Alice' in rv.data - rv = self.app.post(url_for('sql_execute'), data={'statement': 'e'}) + rv = c.post(url_for('sql_execute'), data={'statement': 'e'}) assert b'syntax error' in rv.data - rv = self.app.get(url_for('import_project_insert')) + rv = c.get(url_for('import_project_insert')) assert b'name *' in rv.data - rv = self.app.post( - url_for('import_project_insert'), - data={'name': 'Project X'}) + rv = c.post(url_for('import_project_insert'), data={'name': 'X-Files'}) p_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('import_project_update', id_=p_id)) + rv = c.get(url_for('import_project_update', id_=p_id)) assert b'name *' in rv.data - rv = self.app.post( + rv = c.post( url_for('import_project_update', id_=p_id), - data={'name': 'Project X', 'description': 'whoa!'}, + data={'name': 'X-Files', 'description': 'whoa!'}, follow_redirects=True) assert b'whoa!' in rv.data - rv = self.app.post( - url_for('import_project_insert'), - data={'name': 'Project X'}) + rv = c.post(url_for('import_project_insert'), data={'name': 'X-Files'}) assert b'The name is already in use' in rv.data - assert b'Project X' in self.app.get(url_for('import_index')).data + rv = c.get(url_for('import_index')) + assert b'X-Files' in rv.data - rv = self.app.get( - url_for('import_data', class_='person', project_id=p_id)) + rv = c.get(url_for('import_data', class_='person', project_id=p_id)) assert b'file *' in rv.data with open(self.test_path / 'bibliography.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='bibliography', project_id=p_id), data={'file': file, 'duplicate': True}, follow_redirects=True) assert b'OpenAtlas 2024' in rv.data with open(self.static_path / 'example.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file, 'duplicate': True}, follow_redirects=True) assert b'Vienna' in rv.data with open(self.static_path / 'example.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file, 'duplicate': True}, follow_redirects=True) assert b'IDs already in database' in rv.data with open(self.static_path / 'favicon.ico', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) assert b'File type not allowed' in rv.data with open(self.test_path / 'invalid_1.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='source', project_id=p_id), data={'file': file}, follow_redirects=True) assert b'missing name column' in rv.data with open(self.test_path / 'invalid_2.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) @@ -125,7 +120,7 @@ def test_export(self) -> None: assert b'double IDs in import' in rv.data with open(self.test_path / 'invalid_3.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) @@ -146,7 +141,7 @@ def test_export(self) -> None: self.test_path / 'invalid_3_modified.csv', index=False) with open(self.test_path / 'invalid_3_modified.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) @@ -158,7 +153,7 @@ def test_export(self) -> None: self.test_path / 'invalid_3_modified.csv', index=False) with open(self.test_path / 'invalid_3_modified.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) @@ -166,9 +161,8 @@ def test_export(self) -> None: (self.test_path / 'invalid_3_modified.csv').unlink() def test_export2(self) -> None: - rv = self.app.post( - url_for('import_project_insert'), - data={'name': 'Project X'}) + c = self.client + rv = c.post(url_for('import_project_insert'), data={'name': 'X-Files'}) p_id = rv.location.split('/')[-1] with app.test_request_context(): app.preprocess_request() @@ -199,7 +193,7 @@ def test_export2(self) -> None: self.test_path / 'invalid_3_modified.csv', index=False) with open(self.test_path / 'invalid_3_modified.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) @@ -210,7 +204,7 @@ def test_export2(self) -> None: self.test_path / 'invalid_3_modified.csv', index=False) with open(self.test_path / 'invalid_3_modified.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) @@ -221,7 +215,7 @@ def test_export2(self) -> None: self.test_path / 'invalid_3_modified.csv', index=False) with open(self.test_path / 'invalid_3_modified.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file}, follow_redirects=True) @@ -248,7 +242,7 @@ def test_export2(self) -> None: data_frame.at[0, 'wkt'] = "POLYGON((16.1203 BLA, 16.606275))" data_frame.to_csv(self.test_path / 'example.csv', index=False) with open(self.test_path / 'example.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file, 'duplicate': True}, follow_redirects=True) @@ -257,7 +251,7 @@ def test_export2(self) -> None: assert b'Vienna' in rv.data with open(self.test_path / 'example.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='source', project_id=p_id), data={'file': file, 'duplicate': True}, follow_redirects=True) @@ -274,35 +268,35 @@ def test_export2(self) -> None: with open( self.test_path / 'example_place_hierarchy.csv', 'rb') as file: - rv = self.app.post( + rv = c.post( url_for('import_data', class_='place', project_id=p_id), data={'file': file, 'duplicate': True}, follow_redirects=True) assert b'Bone' in rv.data (self.test_path / 'example_place_hierarchy.csv').unlink() - rv = self.app.get(url_for('import_project_view', id_=p_id)) + rv = c.get(url_for('import_project_view', id_=p_id)) assert b'London' in rv.data - rv = self.app.get( + rv = c.get( url_for('import_project_delete', id_=p_id), follow_redirects=True) assert b'Project deleted' in rv.data date_ = current_date_for_filename() - rv = self.app.get( + rv = c.get( url_for('delete_export', filename=f'{date_}_export.sql.7z'), follow_redirects=True) if os.name == 'posix': assert b'File deleted' in rv.data - rv = self.app.get( + rv = c.get( url_for('delete_export', filename=f'{date_}_export.dump.7z'), follow_redirects=True) if os.name == 'posix': assert b'File deleted' in rv.data - rv = self.app.get( + rv = c.get( url_for('delete_export', filename='non_existing'), follow_redirects=True) assert b'An error occurred when trying to delete the f' in rv.data diff --git a/tests/test_file.py b/tests/test_file.py index b9220f167..e146bac40 100644 --- a/tests/test_file.py +++ b/tests/test_file.py @@ -11,7 +11,7 @@ class FileTest(TestBaseCase): def test_file(self) -> None: - + c = self.client with app.test_request_context(): app.preprocess_request() place = insert('place', 'File keeper') @@ -21,7 +21,7 @@ def test_file(self) -> None: logo = Path( app.root_path) / 'static' / 'images' / 'layout' / 'logo.png' with open(logo, 'rb') as img_1, open(logo, 'rb') as img_2: - rv: Any = self.app.post( + rv: Any = c.post( url_for('insert', class_='file', origin_id=place.id), data={ 'name': 'OpenAtlas logo', @@ -35,11 +35,11 @@ def test_file(self) -> None: files = Entity.get_by_class('file') file_without_creator_id = files[0].id - rv = self.app.get(url_for('view', id_=file_without_creator_id)) + rv = c.get(url_for('view', id_=file_without_creator_id)) assert b'but license is missing ' in rv.data with open(logo, 'rb') as img: - rv = self.app.post( + rv = c.post( url_for('insert', class_='file', origin_id=reference.id), data={ 'name': 'OpenAtlas logo', @@ -56,7 +56,7 @@ def test_file(self) -> None: 'creator': 'Max', 'license_holder': 'Moritz', 'public': True} - rv = self.app.post(url_for('insert', class_='file'), data=data) + rv = c.post(url_for('insert', class_='file'), data=data) iiif_id = rv.location.split('/')[-1] license_ = [] @@ -71,105 +71,99 @@ def test_file(self) -> None: iiif_file = Entity.get_by_id(iiif_id) iiif_file.link('P2', license_) - rv = self.app.get(url_for('update', id_=iiif_id)) + rv = c.get(url_for('update', id_=iiif_id)) assert b'License' in rv.data - rv = self.app.post( - url_for( - 'insert', - class_='external_reference', - origin_id=iiif_id), + rv = c.post( + url_for('insert', class_='external_reference', origin_id=iiif_id), data={'name': 'https://openatlas.eu'}, follow_redirects=True) assert b'page' in rv.data - rv = self.app.get( + rv = c.get( url_for('delete_iiif_file', id_=iiif_id), follow_redirects=True) assert b'IIIF file deleted' in rv.data - rv = self.app.get( - url_for('convert_iiif_files'), - follow_redirects=True) + rv = c.get(url_for('convert_iiif_files'), follow_redirects=True) assert b'All image files are converted' in rv.data - rv = self.app.get( - url_for('delete_iiif_files'), follow_redirects=True) + rv = c.get(url_for('delete_iiif_files'), follow_redirects=True) assert b'IIIF files are deleted' in rv.data filename = f'{iiif_id}.png' - with self.app.get(url_for('display_logo', filename=filename)): + with c.get(url_for('display_logo', filename=filename)): pass - with self.app.get(url_for('download', filename=filename)): + with c.get(url_for('download', filename=filename)): pass - rv = self.app.get(url_for('logo'), data={'file': iiif_id}) + rv = c.get(url_for('logo'), data={'file': iiif_id}) assert b'OpenAtlas logo' in rv.data - rv = self.app.get(url_for('logo', id_=iiif_id), follow_redirects=True) + rv = c.get(url_for('logo', id_=iiif_id), follow_redirects=True) assert b'remove custom logo' in rv.data - rv = self.app.get( + rv = c.get( url_for('logo_remove', action='remove_logo'), follow_redirects=True) assert b'Logo' in rv.data with open(Path(app.root_path) / 'views' / 'index.py', 'rb') \ as invalid_file: - rv = self.app.post( + rv = c.post( url_for('insert', class_='file', origin_id=place.id), data={'name': 'Invalid file', 'file': invalid_file}, follow_redirects=True) assert b'File type not allowed' in rv.data - rv = self.app.get( + rv = c.get( url_for('remove_profile_image', entity_id=place.id), follow_redirects=True) assert b'Unset' not in rv.data - rv = self.app.post( + rv = c.post( url_for('reference_add', id_=reference.id, view='file'), data={'file': iiif_id, 'page': '777'}, follow_redirects=True) assert b'777' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=iiif_id), data={'name': 'Updated file'}, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get(url_for('file_add', id_=iiif_id, view='actor')) + rv = c.get(url_for('file_add', id_=iiif_id, view='actor')) assert b'link actor' in rv.data - rv = self.app.post( + rv = c.post( url_for('file_add', id_=iiif_id, view='actor'), data={'checkbox_values': [place.id]}, follow_redirects=True) assert b'File keeper' in rv.data - rv = self.app.get(url_for('update', id_=place.id)) + rv = c.get(url_for('update', id_=place.id)) assert b'File keeper' in rv.data - rv = self.app.post( + rv = c.post( url_for('entity_add_file', id_=get_hierarchy('Sex').subs[0]), data={'checkbox_values': str([iiif_id])}, follow_redirects=True) assert b'Updated file' in rv.data - rv = self.app.get(url_for('view', id_=iiif_id)) + rv = c.get(url_for('view', id_=iiif_id)) assert b'enable IIIF view' in rv.data - rv = self.app.get( + rv = c.get( url_for('make_iiif_available', id_=iiif_id), follow_redirects=True) assert b'IIIF converted' in rv.data - rv = self.app.get(url_for('view', id_=iiif_id)) + rv = c.get(url_for('view', id_=iiif_id)) assert b'View in IIIF' in rv.data - rv = self.app.get(url_for('view', id_=place.id)) + rv = c.get(url_for('view', id_=place.id)) assert b'view all IIIF images' in rv.data with app.test_request_context(): @@ -179,50 +173,50 @@ def test_file(self) -> None: iiif_file = Entity.get_by_id(iiif_id) iiif_file.link('P2', license_) - rv = self.app.get( + rv = c.get( url_for( 'api.iiif_manifest', id_=iiif_id, version=g.settings['iiif_version'])) + rv = rv.get_json() assert bool(rv['label'] == 'Updated file') - rv = self.app.get(url_for('api.iiif_sequence', id_=iiif_id)) + rv = c.get(url_for('api.iiif_sequence', id_=iiif_id)) assert bool(str(iiif_id) in rv.get_json()['@id']) - rv = self.app.get(url_for('api.iiif_image', id_=iiif_id)) + rv = c.get(url_for('api.iiif_image', id_=iiif_id)) assert bool(str(iiif_id) in rv.get_json()['@id']) - rv = self.app.get(url_for('api.iiif_canvas', id_=iiif_id)) + rv = c.get(url_for('api.iiif_canvas', id_=iiif_id)) assert bool(str(iiif_id) in rv.get_json()['@id']) with app.test_request_context(): app.preprocess_request() files[0].link('P2', g.types[get_hierarchy('License').subs[0]]) - rv = self.app.get(url_for('api.licensed_file_overview')) + rv = c.get(url_for('api.licensed_file_overview')) assert bool(len(rv.get_json().keys()) == 4) - rv = self.app.get(url_for('api.licensed_file_overview', download=True)) + rv = c.get(url_for('api.licensed_file_overview', download=True)) assert bool(len(rv.get_json().keys()) == 4) - rv = self.app.get( - url_for('api.licensed_file_overview', file_id=iiif_id)) + rv = c.get(url_for('api.licensed_file_overview', file_id=iiif_id)) assert bool(len(rv.get_json().keys()) == 1) - rv = self.app.get(url_for('view_iiif', id_=place.id)) + rv = c.get(url_for('view_iiif', id_=place.id)) assert b'Mirador' in rv.data - rv = self.app.get(url_for('view', id_=place.id)) + rv = c.get(url_for('view', id_=place.id)) assert b'/full/!100,100/0/default.jpg' in rv.data - rv = self.app.get(url_for('view', id_=place.id)) + rv = c.get(url_for('view', id_=place.id)) assert b'Logo' in rv.data - rv = self.app.get(url_for('annotation_insert', id_=iiif_id)) + rv = c.get(url_for('annotation_insert', id_=iiif_id)) assert b'annotate' in rv.data - rv = self.app.post( + rv = c.post( url_for('annotation_insert', id_=iiif_id), data={ 'coordinate': '1.5,1.6,1.4,9.6,8.6,9.6,8.6,1.6', @@ -231,10 +225,10 @@ def test_file(self) -> None: follow_redirects=True) assert b'An interesting annotation' in rv.data - rv = self.app.get(url_for('view_iiif', id_=iiif_id)) + rv = c.get(url_for('view_iiif', id_=iiif_id)) assert b'Mirador' in rv.data - rv = self.app.get( + rv = c.get( url_for( 'api.iiif_manifest', id_=iiif_id, @@ -242,7 +236,7 @@ def test_file(self) -> None: url="https://openatlas.eu")) assert b'openatlas.eu' in rv.data - rv = self.app.get( + rv = c.get( url_for( 'api.iiif_manifest', id_=iiif_id, @@ -250,10 +244,10 @@ def test_file(self) -> None: url="https://openatlaseu")) assert b'URL not valid' in rv.data - rv = self.app.get(url_for('annotation_update', id_=1)) + rv = c.get(url_for('annotation_update', id_=1)) assert b'An interesting annotation' in rv.data - rv = self.app.get( + rv = c.get( url_for( 'api.iiif_annotation_list', image_id=iiif_id, @@ -262,7 +256,7 @@ def test_file(self) -> None: assert bool(str(iiif_id) in json['@id']) annotation_id = json['resources'][0]['@id'].rsplit('/', 1)[-1] - rv = self.app.get( + rv = c.get( url_for( 'api.iiif_annotation', annotation_id=annotation_id.replace('.json', ''))) @@ -272,10 +266,10 @@ def test_file(self) -> None: app.preprocess_request() iiif_file.delete_links(['P67']) - rv = self.app.get(url_for('orphans')) + rv = c.get(url_for('orphans')) assert b'File keeper' in rv.data - rv = self.app.get(url_for( + rv = c.get(url_for( 'admin_annotation_relink', image_id=iiif_id, entity_id=place.id), @@ -286,7 +280,7 @@ def test_file(self) -> None: app.preprocess_request() iiif_file.delete_links(['P67']) - rv = self.app.get( + rv = c.get( url_for( 'admin_annotation_remove_entity', annotation_id=1, @@ -294,18 +288,16 @@ def test_file(self) -> None: follow_redirects=True) assert b'Entity removed from annotation' in rv.data - rv = self.app.post( + rv = c.post( url_for('annotation_update', id_=1), data={'text': 'A boring annotation'}, follow_redirects=True) assert b'A boring annotation' in rv.data - rv = self.app.get( - url_for('annotation_delete', id_=1), - follow_redirects=True) + rv = c.get(url_for('annotation_delete', id_=1), follow_redirects=True) assert b'Annotation deleted' in rv.data - self.app.post( + c.post( url_for('annotation_insert', id_=iiif_id), data={ 'coordinate': '1.5,1.6,1.4,9.6,8.6,9.6,8.6,1.6', @@ -316,7 +308,7 @@ def test_file(self) -> None: app.preprocess_request() iiif_file.delete_links(['P67']) - rv = self.app.get( + rv = c.get( url_for('admin_annotation_delete', id_=2), follow_redirects=True) assert b'Annotation deleted' in rv.data @@ -326,7 +318,5 @@ def test_file(self) -> None: files = Entity.get_by_class('file') for file in files: - rv = self.app.get( - url_for('delete', id_=file.id), - follow_redirects=True) + rv = c.get(url_for('delete', id_=file.id), follow_redirects=True) assert b'The entry has been deleted' in rv.data diff --git a/tests/test_hierarchy.py b/tests/test_hierarchy.py index ad45dffa8..f8e9ca568 100644 --- a/tests/test_hierarchy.py +++ b/tests/test_hierarchy.py @@ -8,18 +8,19 @@ class HierarchyTest(TestBaseCase): def test_hierarchy(self) -> None: + c = self.client data = { 'name': 'Geronimo', 'classes': ['file', 'group', 'move', 'person', 'place', 'source'], 'multiple': True, 'description': 'Very important!'} - rv: Any = self.app.post( + rv: Any = c.post( url_for('hierarchy_insert', category='custom'), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.post( + rv = c.post( url_for('hierarchy_insert', category='custom'), data=data, follow_redirects=True) @@ -30,77 +31,72 @@ def test_hierarchy(self) -> None: = ['Q123', self.precision_type.subs[0]] data['classes'] = ['acquisition'] data['entity_id'] = hierarchy.id - rv = self.app.post( + rv = c.post( url_for('hierarchy_update', id_=hierarchy.id), data=data, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get(url_for('hierarchy_update', id_=hierarchy.id)) + rv = c.get(url_for('hierarchy_update', id_=hierarchy.id)) assert b'checked class="" id="multiple"' in rv.data - rv = self.app.get(url_for('hierarchy_insert', category='custom')) + rv = c.get(url_for('hierarchy_insert', category='custom')) assert b'+ Custom' in rv.data sex = get_hierarchy('Sex') - rv = self.app.get(url_for('required_risk', id_=sex.id)) + rv = c.get(url_for('required_risk', id_=sex.id)) assert b'Be careful with making types required' in rv.data - rv = self.app.get( - url_for('required_add', id_=sex.id), - follow_redirects=True) + rv = c.get(url_for('required_add', id_=sex.id), follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get(url_for('insert', class_='person')) + rv = c.get(url_for('insert', class_='person')) assert b'Sex *' in rv.data - rv = self.app.get( + rv = c.get( url_for('required_remove', id_=sex.id), follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='type', origin_id=hierarchy.id), data={'name': 'Secret type', 'description': 'Very important!'}) type_id = rv.location.split('/')[-1] - rv = self.app.get( + rv = c.get( url_for('remove_class', id_=hierarchy.id, name='person'), follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get( - url_for('type_delete', id_=type_id), - follow_redirects=True) + rv = c.get(url_for('type_delete', id_=type_id), follow_redirects=True) assert b'deleted' in rv.data - rv = self.app.post( + rv = c.post( url_for('hierarchy_update', id_=hierarchy.id), data={'name': 'Actor relation', 'entity_id': hierarchy.id}, follow_redirects=True) assert b'The name is already in use' in rv.data - rv = self.app.post( + rv = c.post( url_for('hierarchy_delete', id_=hierarchy.id), follow_redirects=True) assert b'deleted' in rv.data - rv = self.app.get(url_for('hierarchy_insert', category='value')) + rv = c.get(url_for('hierarchy_insert', category='value')) assert b'+ Value' in rv.data - rv = self.app.post( + rv = c.post( url_for('hierarchy_insert', category='value'), data={'name': 'Valued', 'classes': ['file']}, follow_redirects=True,) assert b'An entry has been created' in rv.data - rv = self.app.get( - url_for('hierarchy_update', id_=get_hierarchy('Valued').id)) + rv = c.get(url_for('hierarchy_update', id_=get_hierarchy('Valued').id)) assert b'Valued' in rv.data type_ = get_hierarchy('Actor relation') - rv = self.app.get(url_for('hierarchy_update', id_=type_.id)) + rv = c.get(url_for('hierarchy_update', id_=type_.id)) assert b'Forbidden' in rv.data - rv = self.app.get(url_for('hierarchy_delete', id_=type_.id)) + rv = c.get(url_for('hierarchy_delete', id_=type_.id)) assert b'Forbidden' in rv.data diff --git a/tests/test_image.py b/tests/test_image.py index 6d2d09f53..d2d6e9b5b 100644 --- a/tests/test_image.py +++ b/tests/test_image.py @@ -13,6 +13,7 @@ class ImageTest(TestBaseCase): def test_image(self) -> None: + c = self.client app.config['IMAGE_SIZE']['tmp'] = '1' with app.test_request_context(): app.preprocess_request() @@ -21,7 +22,7 @@ def test_image(self) -> None: # Resizing through UI insert with open(Path(app.root_path) / 'static' / 'images' / 'layout' / 'logo.png', 'rb') as img: - rv = self.app.post( + rv = c.post( url_for('insert', class_='file', origin_id=place.id), data={'name': 'OpenAtlas logo', 'file': img}, follow_redirects=True) @@ -32,14 +33,12 @@ def test_image(self) -> None: files = Entity.get_by_class('file') file_id = files[0].id - rv = self.app.get( + rv = c.get( url_for('set_profile_image', id_=file_id, origin_id=place.id), follow_redirects=True) assert b'Remove' in rv.data - rv = self.app.get( - url_for('delete', id_=file_id), - follow_redirects=True) + rv = c.get(url_for('delete', id_=file_id), follow_redirects=True) assert b'The entry has been deleted' in rv.data with app.test_request_context(): @@ -65,38 +64,38 @@ def test_image(self) -> None: safe_resize_image(file2.id, '.png', size="???") profile_image(file_pathless) - rv = self.app.get(url_for('view', id_=file_json.id)) + rv = c.get(url_for('view', id_=file_json.id)) assert b'no preview available' in rv.data - rv = self.app.get(url_for('view', id_=file_pathless.id)) + rv = c.get(url_for('view', id_=file_pathless.id)) assert b'Missing file' in rv.data - rv = self.app.get(url_for('index', view='file')) + rv = c.get(url_for('index', view='file')) assert b'Test_File' in rv.data - rv = self.app.get(url_for('display_file', filename=file_name)) + rv = c.get(url_for('display_file', filename=file_name)) assert b'\xff' in rv.data - self.app.get( + c.get( url_for( 'display_file', filename=file_name, size=app.config['IMAGE_SIZE']['thumbnail'])) # assert b'\xff' in rv.data # GitHub struggles with this test - self.app.get( + c.get( url_for('api.display', filename=file_name, image_size='thumbnail')) # assert b'\xff' in rv.data # GitHub struggles with this test app.config['IMAGE_SIZE']['tmp'] = '<' - rv = self.app.get(url_for('view', id_=file.id)) + rv = c.get(url_for('view', id_=file.id)) assert b'Test_File' in rv.data app.config['IMAGE_SIZE']['tmp'] = '1' - rv = self.app.get(url_for('resize_images'), follow_redirects=True) + rv = c.get(url_for('resize_images'), follow_redirects=True) assert b'Images were created' in rv.data - rv = self.app.get( + rv = c.get( url_for('admin_delete_orphaned_resized_images'), follow_redirects=True) assert b'Resized orphaned images were deleted' in rv.data @@ -106,7 +105,5 @@ def test_image(self) -> None: files = Entity.get_by_class('file') for file in files: - rv = self.app.get( - url_for('delete', id_=file.id), - follow_redirects=True) + rv = c.get(url_for('delete', id_=file.id), follow_redirects=True) assert b'The entry has been deleted' in rv.data diff --git a/tests/test_index.py b/tests/test_index.py index b66aa26c6..ae2e9116f 100644 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -9,66 +9,63 @@ class IndexTests(TestBaseCase): def test_index(self) -> None: - assert 'x00' in str(self.app.get('/static/favicon.ico').data) + c = self.client + assert 'x00' in str(c.get('/static/favicon.ico').data) - rv = self.app.get(url_for('index_changelog')) + rv = c.get(url_for('index_changelog')) assert b'is needed but current version is' not in rv.data with app.app_context(): - rv = self.app.get(url_for('login'), follow_redirects=True) + rv = c.get(url_for('login'), follow_redirects=True) assert b'first' in rv.data - rv = self.app.get( + rv = c.get( url_for('set_locale', language='non_existing_locale'), follow_redirects=True) assert b'Source' in rv.data - rv = self.app.get( - url_for('set_locale', language='de'), - follow_redirects=True) + rv = c.get(url_for('set_locale', language='de'), follow_redirects=True) assert b'Quelle' in rv.data assert b'messages_de.js' in rv.data - self.app.get(url_for('set_locale', language='en')) + c.get(url_for('set_locale', language='en')) g.writable_paths.append(Path(app.root_path) / 'error') app.config['DATABASE_VERSION'] = 'error' app.config['EXPORT_PATH'] = Path('error') - rv = self.app.get(url_for('view', id_=666), follow_redirects=True) + rv = c.get(url_for('view', id_=666), follow_redirects=True) assert b'teapot' in rv.data assert b'OpenAtlas with default password is still' in rv.data assert b'Database version error is needed but current' in rv.data assert b'directory not writable' in rv.data - rv = self.app.get('/static/non_existing_file.js') + rv = c.get('/static/non_existing_file.js') assert b'The site does not exist.' in rv.data - rv = self.app.get(url_for('logout'), follow_redirects=True) + rv = c.get(url_for('logout'), follow_redirects=True) assert b'Password' in rv.data - rv = self.app.get('/') + rv = c.get('/') assert b'overview' in rv.data - rv = self.app.get(url_for('login')) + rv = c.get(url_for('login')) assert b'Password' in rv.data - rv = self.app.post( - url_for('login'), - data={'username': 'Never', 'password': 'wrong'}) + rv = c.post(url_for('login'), data={'username': '-', 'password': '?'}) assert b'No user with this name found' in rv.data - rv = self.app.post( + rv = c.post( url_for('login'), data={'username': 'Alice', 'password': 'wrong'}) assert b'Wrong Password' in rv.data - rv = self.app.post( + rv = c.post( url_for('login'), data={'username': 'inactive', 'password': 'test'}) assert b'This user is not activated' in rv.data for _i in range(4): - rv = self.app.post( + rv = c.post( url_for('login'), data={'username': 'inactive', 'password': '?'}) assert b'Too many login attempts' in rv.data diff --git a/tests/test_involvement.py b/tests/test_involvement.py index 6aee1830f..f94b16153 100644 --- a/tests/test_involvement.py +++ b/tests/test_involvement.py @@ -7,12 +7,13 @@ class InvolvementTests(TestBaseCase): def test_involvement(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() actor = insert('person', 'Captain Miller') event = insert('acquisition', 'Event Horizon') - rv = self.app.post( + rv = c.post( url_for('update', id_=event.id), data={ 'name': 'Event Horizon', @@ -23,7 +24,7 @@ def test_involvement(self) -> None: follow_redirects=True) assert b'Event Horizon' in rv.data - rv = self.app.post( + rv = c.post( url_for( 'insert_relation', type_='involvement', @@ -36,7 +37,7 @@ def test_involvement(self) -> None: follow_redirects=True) assert b'Event Horizon' in rv.data - rv = self.app.post( + rv = c.post( url_for( 'insert_relation', type_='involvement', @@ -48,14 +49,14 @@ def test_involvement(self) -> None: follow_redirects=True) assert b'Event Horizon' in rv.data - rv = self.app.get(url_for('view', id_=event.id)) + rv = c.get(url_for('view', id_=event.id)) assert b'Event Horizon' in rv.data with app.test_request_context(): app.preprocess_request() link_ = event.get_links('P22')[0] - rv = self.app.post( + rv = c.post( url_for('link_update', id_=link_.id, origin_id=actor.id), data={ 'description': 'Infinite Space - Infinite Terror', diff --git a/tests/test_mail.py b/tests/test_mail.py index 35f6e7ed5..3a4e71ad1 100644 --- a/tests/test_mail.py +++ b/tests/test_mail.py @@ -8,13 +8,14 @@ class MailTests(TestBaseCase): def test_mail(self) -> None: - rv: Any = self.app.post( + c = self.client + rv: Any = c.post( url_for('newsletter'), data={'subject': 'test', 'body': 'test', 'recipient': []}, follow_redirects=True) assert b'Newsletter send: 0' in rv.data - rv = self.app.post( + rv = c.post( url_for('settings', category='mail'), data={ 'mail': True, @@ -27,22 +28,22 @@ def test_mail(self) -> None: follow_redirects=True) assert b'Max Headroom' in rv.data - rv = self.app.get(url_for('index_unsubscribe', code='666')) + rv = c.get(url_for('index_unsubscribe', code='666')) assert b'invalid' in rv.data - rv = self.app.get(url_for('index_unsubscribe', code='1234')) + rv = c.get(url_for('index_unsubscribe', code='123')) assert b'You have successfully unsubscribed' in rv.data - rv = self.app.post( + rv = c.post( url_for('admin_index'), data={'receiver': 'test@example.com'}, follow_redirects=True) assert b'A test mail was sent' in rv.data - rv = self.app.get(url_for('newsletter')) + rv = c.get(url_for('newsletter')) assert b'Newsletter' in rv.data - rv = self.app.post( + rv = c.post( url_for('newsletter'), data={ 'subject': 'test', @@ -51,16 +52,16 @@ def test_mail(self) -> None: follow_redirects=True) assert b'Newsletter send: 1' in rv.data - rv = self.app.get(url_for('index_feedback')) + rv = c.get(url_for('index_feedback')) assert b'Thank you' in rv.data - rv = self.app.post( + rv = c.post( url_for('index_feedback'), data={'subject': 'question', 'description': 'Why me?'}, follow_redirects=True) assert b'Thank you for your feedback' in rv.data - rv = self.app.post( + rv = c.post( url_for('user_insert'), data={ 'active': '', @@ -76,28 +77,24 @@ def test_mail(self) -> None: follow_redirects=True) assert b'A user was created' in rv.data - rv = self.app.get(url_for('reset_password')) + rv = c.get(url_for('reset_password')) assert b'Forgot your password?' not in rv.data - self.app.get(url_for('logout')) - rv = self.app.get(url_for('reset_confirm', code='6666')) + c.get(url_for('logout')) + rv = c.get(url_for('reset_confirm', code='6666')) assert b'Invalid' in rv.data - rv = self.app.get( - url_for('reset_confirm', code='1234'), - follow_redirects=True) + rv = c.get(url_for('reset_confirm', code='123'), follow_redirects=True) assert b'A new password was sent to' in rv.data - rv = self.app.get(url_for('reset_confirm', code='5678')) + rv = c.get(url_for('reset_confirm', code='5678')) assert b'expired' in rv.data - rv = self.app.post( + rv = c.post( url_for('reset_password'), data={'email': 'alice@example.com'}, follow_redirects=True) assert b'password reset confirmation mail was send' in rv.data - rv = self.app.post( - url_for('reset_password'), - data={'email': 'non-exising@example.com'}) + rv = c.post(url_for('reset_password'), data={'email': 'non@exist.com'}) assert b'this email address is unknown to us' in rv.data diff --git a/tests/test_model.py b/tests/test_model.py index 30f55960e..0b1d7b853 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -7,16 +7,17 @@ class ModelTests(TestBaseCase): def test_model(self) -> None: - rv = self.app.get(url_for('openatlas_class_index')) + c = self.client + rv = c.get(url_for('openatlas_class_index')) assert b'Involvement' in rv.data - rv = self.app.get(url_for('cidoc_class_index')) + rv = c.get(url_for('cidoc_class_index')) assert b'E1' in rv.data - rv = self.app.get(url_for('property_index')) + rv = c.get(url_for('property_index')) assert b'P1' in rv.data - rv = self.app.post( + rv = c.post( url_for('model_index'), data={'domain': 'E1', 'range': 'E1', 'property': 'P13'}) assert b'Wrong domain' in rv.data @@ -31,16 +32,16 @@ def test_model(self) -> None: place = insert('place', 'Camelot') actor.link('P74', place.get_linked_entity_safe('P53')) - rv = self.app.get(url_for('network', dimensions=0, id_=place.id)) + rv = c.get(url_for('network', dimensions=0, id_=place.id)) assert b'Depth' in rv.data - rv = self.app.get(url_for('network', dimensions=2)) + rv = c.get(url_for('network', dimensions=2)) assert b'Show orphans' in rv.data - rv = self.app.get(url_for('network', dimensions=0)) + rv = c.get(url_for('network', dimensions=0)) assert b'Show orphans' in rv.data - rv = self.app.post( + rv = c.post( url_for('network', dimensions=0), data={ 'orphans': True, @@ -50,12 +51,12 @@ def test_model(self) -> None: 'charge': 500}) assert b'666' in rv.data - rv = self.app.get(url_for('class_entities', code='E21')) + rv = c.get(url_for('class_entities', code='E21')) assert b'King Arthur' in rv.data - self.app.get('/index/setlocale/de') - rv = self.app.get(url_for('cidoc_class_view', code='E18')) + c.get('/index/setlocale/de') + rv = c.get(url_for('cidoc_class_view', code='E18')) assert b'Materielles' in rv.data - rv = self.app.get(url_for('property_view', code='P166')) + rv = c.get(url_for('property_view', code='P166')) assert b'was a presence of' in rv.data diff --git a/tests/test_note.py b/tests/test_note.py index c83c3835a..7159bd1a9 100644 --- a/tests/test_note.py +++ b/tests/test_note.py @@ -8,75 +8,74 @@ class NoteTest(TestBaseCase): def test_note(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() actor = insert('person', 'Ripley') - rv = self.app.get(url_for('note_insert', entity_id=actor.id)) + rv = c.get(url_for('note_insert', entity_id=actor.id)) assert b'description' in rv.data - rv = self.app.post( + rv = c.post( url_for('note_insert', entity_id=actor.id), data={'description': 'A nice description'}, follow_redirects=True) assert b'Note added' in rv.data - rv = self.app.get(url_for('overview')) + rv = c.get(url_for('overview')) assert b'A nice description' in rv.data with app.test_request_context(): app.preprocess_request() note_id = User.get_notes_by_user_id(self.alice_id)[0]['id'] - rv = self.app.get(url_for('note_update', id_=note_id)) + rv = c.get(url_for('note_update', id_=note_id)) assert b'A nice description' in rv.data - rv = self.app.post( + rv = c.post( url_for('note_update', id_=note_id), data={'description': 'A sad description', 'public': True}, follow_redirects=True) assert b'Note updated' in rv.data - rv = self.app.get(url_for('note_view', id_=note_id)) + rv = c.get(url_for('note_view', id_=note_id)) assert b'A sad description' in rv.data - self.app.get(url_for('logout')) - self.app.post( + c.get(url_for('logout')) + c.post( url_for('login'), data={'username': 'manager', 'password': 'test'}) - rv = self.app.get(url_for('note_view', id_=note_id)) + rv = c.get(url_for('note_view', id_=note_id)) assert b'set private' in rv.data - rv = self.app.get( + rv = c.get( url_for('note_set_private', id_=note_id), follow_redirects=True) assert b'Note updated' in rv.data - self.app.get(url_for('logout')) - self.app.post( + c.get(url_for('logout')) + c.post( url_for('login'), data={'username': 'editor', 'password': 'test'}) - rv = self.app.get(url_for('note_view', id_=note_id)) + rv = c.get(url_for('note_view', id_=note_id)) assert b'403 - Forbidden' in rv.data - self.app.post( + c.post( url_for('login'), data={'username': 'Editor', 'password': 'test'}) - rv = self.app.get(url_for('note_set_private', id_=note_id)) + rv = c.get(url_for('note_set_private', id_=note_id)) assert b'403 - Forbidden' in rv.data - rv = self.app.get(url_for('note_update', id_=note_id)) + rv = c.get(url_for('note_update', id_=note_id)) assert b'403 - Forbidden' in rv.data - rv = self.app.get(url_for('note_delete', id_=note_id)) + rv = c.get(url_for('note_delete', id_=note_id)) assert b'403 - Forbidden' in rv.data - self.app.get(url_for('logout')) - self.app.post( + c.get(url_for('logout')) + c.post( url_for('login'), data={'username': 'Alice', 'password': 'test'}) - rv = self.app.get( - url_for('note_delete', id_=note_id), - follow_redirects=True) + rv = c.get(url_for('note_delete', id_=note_id), follow_redirects=True) assert b'Note deleted' in rv.data diff --git a/tests/test_place.py b/tests/test_place.py index 39ae3b471..d9789b390 100644 --- a/tests/test_place.py +++ b/tests/test_place.py @@ -12,6 +12,7 @@ class PlaceTest(TestBaseCase): def test_place(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() reference = insert('external_reference', 'https://d-nb.info') @@ -24,7 +25,7 @@ def test_place(self) -> None: unit_type.id: str([unit_type.subs[0], unit_type.subs[1]]), f'reference_system_id_{g.geonames.id}': ['123456', self.precision_type.subs[0]]} - rv: Any = self.app.post( + rv: Any = c.post( url_for('insert', class_='place', origin_id=reference.id), data=data, follow_redirects=True) @@ -64,7 +65,7 @@ def test_place(self) -> None: "name": "", "description": "", "shapeType": "shape"}}]""" - rv = self.app.post( + rv = c.post( url_for('insert', class_='place', origin_id=source.id), data=data, follow_redirects=True) @@ -82,17 +83,17 @@ def test_place(self) -> None: data['continue_'] = '' data['alias-1'] = 'Val-hall' data['geonames_id'] = '321' - rv = self.app.post( + rv = c.post( url_for('update', id_=place.id), data=data, follow_redirects=True) assert b'Val-hall' in rv.data - rv = self.app.get(url_for('view', id_=place.id+1)) + rv = c.get(url_for('view', id_=place.id+1)) assert b"can't be viewed directly" in rv.data data['geonames_id'] = '' - rv = self.app.post( + rv = c.post( url_for('update', id_=place.id), data=data, follow_redirects=True) @@ -112,7 +113,7 @@ def test_place(self) -> None: "name": "", "description": "", "shapeType": "shape"}}]""" - rv = self.app.post( + rv = c.post( url_for('update', id_=place.id), data=data, follow_redirects=True) @@ -120,7 +121,7 @@ def test_place(self) -> None: with open(Path(app.root_path) / 'static' / 'images' / 'layout' / 'logo.png', 'rb') as img: - rv = self.app.post( + rv = c.post( url_for('insert', class_='file', origin_id=place.id), data={'name': 'X-Files', 'file': img}, follow_redirects=True) @@ -131,7 +132,7 @@ def test_place(self) -> None: file = Entity.get_by_class('file')[0] link_id = file.link('P67', place)[0] - rv = self.app.get( + rv = c.get( url_for( 'overlay_insert', image_id=file.id, @@ -146,7 +147,7 @@ def test_place(self) -> None: 'top_right_northing': 13, 'bottom_left_easting': 10, 'bottom_left_northing': 20} - rv = self.app.post( + rv = c.post( url_for( 'overlay_insert', image_id=file.id, @@ -161,14 +162,14 @@ def test_place(self) -> None: overlay = Overlay.get_by_object(place) overlay_id = overlay[list(overlay.keys())[0]].id - rv = self.app.get( + rv = c.get( url_for( 'overlay_update', overlay_id=overlay_id, place_id=place.id)) assert b'42' in rv.data - rv = self.app.post( + rv = c.post( url_for( 'overlay_update', overlay_id=overlay_id, @@ -177,25 +178,24 @@ def test_place(self) -> None: follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get( + rv = c.get( url_for('overlay_remove', id_=overlay_id, place_id=place.id), follow_redirects=True) assert b'42' in rv.data - rv = self.app.post( + rv = c.post( url_for('entity_add_file', id_=place.id), data={'checkbox_values': str([file.id])}, follow_redirects=True) assert b'X-Files' in rv.data - rv = self.app.get( - url_for('reference_add', id_=reference.id, view='place')) + rv = c.get(url_for('reference_add', id_=reference.id, view='place')) assert b'Val-hall' in rv.data - rv = self.app.get(url_for('entity_add_reference', id_=place.id)) + rv = c.get(url_for('entity_add_reference', id_=place.id)) assert b'link reference' in rv.data - rv = self.app.post( + rv = c.post( url_for('type_move_entities', id_=unit_type.subs[0]), data={ unit_type.id: unit_type.subs[1], @@ -204,7 +204,7 @@ def test_place(self) -> None: follow_redirects=True) assert b'Entities were updated' in rv.data - rv = self.app.post( + rv = c.post( url_for('type_move_entities', id_=unit_type.subs[1]), data={ unit_type.id: unit_type.subs[0], @@ -214,57 +214,57 @@ def test_place(self) -> None: assert b'Entities were updated' in rv.data data = {'name': 'Try', 'continue_': 'sub', 'super': place.id} - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data=data, follow_redirects=True) assert b'insert and add strati' in rv.data data['name'] = "It's not a bug, it's a feature!" - rv = self.app.post( + rv = c.post( url_for('insert', class_='feature', origin_id=place.id), data=data) feat_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('update', id_=feat_id)) + rv = c.get(url_for('update', id_=feat_id)) assert b'Val-hall' in rv.data - rv = self.app.get( + rv = c.get( url_for('insert', class_='stratigraphic_unit', origin_id=feat_id), data=data) assert b'insert and add human remains' in rv.data data['name'] = "I'm a stratigraphic unit" data['super'] = feat_id - rv = self.app.post( + rv = c.post( url_for('insert', class_='stratigraphic_unit', origin_id=feat_id), data=data) strati_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('update', id_=strati_id)) + rv = c.get(url_for('update', id_=strati_id)) assert b'a stratigraphic unit' in rv.data data = { 'name': 'You never find me', 'super': strati_id, get_hierarchy('Dimensions').subs[0]: 50} - rv = self.app.post( + rv = c.post( url_for('insert', class_='artifact', origin_id=strati_id), data=data) find_id = rv.location.split('/')[-1] # Create a second artifact to test siblings pager - rv = self.app.post( + rv = c.post( url_for('insert', class_='artifact', origin_id=strati_id), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.get(url_for('update', id_=find_id)) + rv = c.get(url_for('update', id_=find_id)) assert b'You never find me' in rv.data remains_type = get_hierarchy('Human remains') - rv = self.app.post( + rv = c.post( url_for('insert', class_='human_remains', origin_id=strati_id), data={ 'name': 'My human remains', @@ -273,37 +273,37 @@ def test_place(self) -> None: remains_type.id: str([remains_type.subs[0]])}) human_remains_id = rv.location.split('/')[-1] - rv = self.app.get( + rv = c.get( url_for('insert', class_='human_remains', origin_id=strati_id)) assert b'exists' in rv.data - rv = self.app.get(url_for('update', id_=human_remains_id)) + rv = c.get(url_for('update', id_=human_remains_id)) assert b'My human remains' in rv.data - rv = self.app.get('/') + rv = c.get('/') assert b'My human remains' in rv.data - rv = self.app.get(url_for('view', id_=remains_type.subs[0])) + rv = c.get(url_for('view', id_=remains_type.subs[0])) assert b'My human remains' in rv.data - rv = self.app.get( + rv = c.get( url_for('delete', id_=human_remains_id), follow_redirects=True) assert b'The entry has been deleted' in rv.data - rv = self.app.post( + rv = c.post( url_for('sex_update', id_=strati_id), data={'Glabella': 'Female'}, follow_redirects=True) assert b'-2.0' in rv.data - rv = self.app.post( + rv = c.post( url_for('sex_update', id_=strati_id), data={'Glabella': 'Female'}, follow_redirects=True) assert b'-2.0' in rv.data - rv = self.app.get(url_for('sex_update', id_=strati_id)) + rv = c.get(url_for('sex_update', id_=strati_id)) assert b'Glabella' in rv.data data = { @@ -311,46 +311,42 @@ def test_place(self) -> None: 'spec_id': 'S', 'radiocarbon_year': 1, 'range': 1} - rv = self.app.post( + rv = c.post( url_for('carbon_update', id_=strati_id), data=data, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.post( + rv = c.post( url_for('carbon_update', id_=strati_id), data=data, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get(url_for('view', id_=strati_id)) + rv = c.get(url_for('view', id_=strati_id)) assert b'radiocarbon dating' in rv.data assert b'sex estimation' in rv.data - rv = self.app.get(url_for('carbon_update', id_=strati_id)) + rv = c.get(url_for('carbon_update', id_=strati_id)) assert b'VERA' in rv.data - rv = self.app.get(url_for('carbon', id_=strati_id)) + rv = c.get(url_for('carbon', id_=strati_id)) assert b'VERA' in rv.data - rv = self.app.get( - url_for('sex_delete', id_=strati_id), - follow_redirects=True) + rv = c.get(url_for('sex_delete', id_=strati_id), follow_redirects=True) assert b'tools' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=strati_id), data={'name': 'New name', 'super': feat_id}, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get(url_for('view', id_=feat_id)) + rv = c.get(url_for('view', id_=feat_id)) assert b'not a bug' in rv.data - rv = self.app.get(url_for('view', id_=find_id)) + rv = c.get(url_for('view', id_=find_id)) assert b'You never' in rv.data - rv = self.app.get( - url_for('delete', id_=place.id), - follow_redirects=True) + rv = c.get(url_for('delete', id_=place.id), follow_redirects=True) assert b'not possible if subunits' in rv.data diff --git a/tests/test_profile.py b/tests/test_profile.py index 0dc39bdd4..ed89ebc83 100644 --- a/tests/test_profile.py +++ b/tests/test_profile.py @@ -6,10 +6,11 @@ class ProfileTests(TestBaseCase): def test_profile(self) -> None: - rv = self.app.get(url_for('profile_settings', category='profile')) + c = self.client + rv = c.get(url_for('profile_settings', category='profile')) assert b'alice@example.com' in rv.data - rv = self.app.post( + rv = c.post( url_for('profile_settings', category='profile'), data={ 'name': 'Alice Abernathy', @@ -18,7 +19,7 @@ def test_profile(self) -> None: follow_redirects=True) assert b'saved' in rv.data and b'Alice Abernathy' in rv.data - rv = self.app.post( + rv = c.post( url_for('profile_settings', category='display'), data={ 'language': 'en', @@ -28,7 +29,7 @@ def test_profile(self) -> None: follow_redirects=True) assert b'saved' in rv.data - rv = self.app.get(url_for('profile_password')) + rv = c.get(url_for('profile_password')) assert b'old password' in rv.data new_pass = 'you_never_guess_this' @@ -36,28 +37,28 @@ def test_profile(self) -> None: 'password_old': 'test', 'password': new_pass, 'password2': new_pass} - rv = self.app.post( + rv = c.post( url_for('profile_password'), data=data, follow_redirects=True) assert b'Your password has been updated' in rv.data data['password2'] = 'short' - rv = self.app.post( + rv = c.post( url_for('profile_password'), data=data, follow_redirects=True) assert b'match' in rv.data data['password_old'] = new_pass - rv = self.app.post( + rv = c.post( url_for('profile_password'), data=data, follow_redirects=True) assert b'New password is like old one' in rv.data data['password'] = 'short' - rv = self.app.post( + rv = c.post( url_for('profile_password'), data=data, follow_redirects=True) diff --git a/tests/test_reference.py b/tests/test_reference.py index f17a1acbb..27381c2ea 100644 --- a/tests/test_reference.py +++ b/tests/test_reference.py @@ -9,25 +9,26 @@ class ReferenceTest(TestBaseCase): def test_reference(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() batman = insert('person', 'Batman') - rv: Any = self.app.post( + rv: Any = c.post( url_for('insert', class_='external_reference'), data={'name': 'https://openatlas.eu', 'description': 'No'}) reference_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('update', id_=reference_id)) + rv = c.get(url_for('update', id_=reference_id)) assert b'https://openatlas.eu' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=reference_id), data={'name': 'https://d-nb.info', 'description': 'No'}, follow_redirects=True) assert b'https://d-nb.info' in rv.data - rv = self.app.post( + rv = c.post( url_for('reference_add', id_=reference_id, view='actor'), data={'actor': batman.id}, follow_redirects=True) @@ -37,7 +38,7 @@ def test_reference(self) -> None: app.preprocess_request() link_id = batman.get_links('P67', True)[0].id - rv = self.app.post( + rv = c.post( url_for('link_update', id_=link_id, origin_id=reference_id), data={'page': '666'}, follow_redirects=True) diff --git a/tests/test_reference_system.py b/tests/test_reference_system.py index fd61f1ca9..52590e8d1 100644 --- a/tests/test_reference_system.py +++ b/tests/test_reference_system.py @@ -8,25 +8,20 @@ class ReferenceSystemTest(TestBaseCase): def test_reference_system(self) -> None: - rv = self.app.post( - url_for('ajax_wikidata_info'), - data={'id_': 'Q304037'}) + c = self.client + rv = c.post(url_for('ajax_wikidata_info'), data={'id_': 'Q304037'}) assert b'National Library of Austria' in rv.data - rv = self.app.post( - url_for('ajax_geonames_info'), - data={'id_': '747712'}) + rv = c.post(url_for('ajax_geonames_info'), data={'id_': '747712'}) assert b'Edirne' in rv.data - rv = self.app.post( - url_for('ajax_gnd_info'), - data={'id_': '118584596'}) + rv = c.post(url_for('ajax_gnd_info'), data={'id_': '118584596'}) assert b'Mozart' in rv.data - rv = self.app.get(url_for('insert', class_='reference_system')) + rv = c.get(url_for('insert', class_='reference_system')) assert b'resolver URL' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='reference_system'), data={ 'name': 'Wikipedia', @@ -35,7 +30,7 @@ def test_reference_system(self) -> None: 'classes': ['place']}) wikipedia_id = rv.location.split('/')[-1] - rv = self.app.post( + rv = c.post( url_for('insert', class_='reference_system'), data={ 'name': 'Another system to test forms with more than 3', @@ -45,15 +40,13 @@ def test_reference_system(self) -> None: follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.get(url_for('insert', class_='place')) + rv = c.get(url_for('insert', class_='place')) assert b'reference-system-switch' in rv.data - rv = self.app.get( - url_for('delete', id_=wikipedia_id), - follow_redirects=True) + rv = c.get(url_for('delete', id_=wikipedia_id), follow_redirects=True) assert b'Deletion not possible if classes are attached' in rv.data - rv = self.app.get( + rv = c.get( url_for( 'reference_system_remove_class', system_id=wikipedia_id, @@ -61,12 +54,10 @@ def test_reference_system(self) -> None: follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.get( - url_for('delete', id_=wikipedia_id), - follow_redirects=True) + rv = c.get(url_for('delete', id_=wikipedia_id), follow_redirects=True) assert b'The entry has been deleted' in rv.data - rv = self.app.get(url_for('update', id_=g.geonames.id)) + rv = c.get(url_for('update', id_=g.geonames.id)) assert b'website URL' in rv.data data: dict[Any, Any] = { @@ -75,13 +66,13 @@ def test_reference_system(self) -> None: 'website_url': 'https://www.geonames2.org/', 'resolver_url': 'https://www.geonames2.org/', 'placeholder': ''} - rv = self.app.post( + rv = c.post( url_for('update', id_=g.geonames.id), data=data, follow_redirects=True) assert b'Changes have been saved' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='person'), data={ 'name': 'Actor test', @@ -91,25 +82,25 @@ def test_reference_system(self) -> None: ['1158433263', self.precision_type.subs[0]]}) person_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('view', id_=g.wikidata.id)) + rv = c.get(url_for('view', id_=g.wikidata.id)) assert b'Actor test' in rv.data - rv = self.app.get(url_for('view', id_=person_id)) + rv = c.get(url_for('view', id_=person_id)) assert b'Wikidata' in rv.data - rv = self.app.get(url_for('update', id_=person_id)) + rv = c.get(url_for('update', id_=person_id)) assert b'Q123' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='reference_system'), data={'name': 'GeoNames'}, follow_redirects=True) assert b'A transaction error occurred' in rv.data - rv = self.app.get(url_for('delete', id_=g.geonames.id)) + rv = c.get(url_for('delete', id_=g.geonames.id)) assert b'403 - Forbidden' in rv.data - rv = self.app.get( + rv = c.get( url_for( 'reference_system_remove_class', system_id=g.wikidata.id, @@ -117,7 +108,7 @@ def test_reference_system(self) -> None: follow_redirects=True) assert b'403 - Forbidden' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='person'), data={ 'name': 'Test', @@ -127,7 +118,7 @@ def test_reference_system(self) -> None: f'reference_system_id_{g.wikidata.id}': ['invalid id', '']}) assert b'Wrong id format' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='place'), data={ 'name': 'Test', diff --git a/tests/test_relation.py b/tests/test_relation.py index 07a96e599..2ee7394b6 100644 --- a/tests/test_relation.py +++ b/tests/test_relation.py @@ -7,12 +7,13 @@ class RelationTests(TestBaseCase): def test_relation(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() actor = insert('person', 'Connor MacLeod') related = insert('person', 'The Kurgan') - rv = self.app.get( + rv = c.get( url_for( 'insert_relation', origin_id=actor.id, @@ -31,7 +32,7 @@ def test_relation(self) -> None: 'begin_year_to': '-1948', 'end_year_from': '2049', 'end_year_to': '2050'} - rv = self.app.post( + rv = c.post( url_for( 'insert_relation', origin_id=actor.id, @@ -40,17 +41,17 @@ def test_relation(self) -> None: follow_redirects=True) assert b'The Kurgan' in rv.data - rv = self.app.get(url_for('view', id_=sub_id)) + rv = c.get(url_for('view', id_=sub_id)) assert b'Connor' in rv.data - rv = self.app.get(url_for('type_move_entities', id_=sub_id)) + rv = c.get(url_for('type_move_entities', id_=sub_id)) assert b'The Kurgan' in rv.data with app.test_request_context(): app.preprocess_request() link_ = actor.get_links('OA7')[0] - rv = self.app.post( + rv = c.post( url_for('type_move_entities', id_=sub_id), data={ relation.id: relation.subs[1], @@ -59,7 +60,7 @@ def test_relation(self) -> None: follow_redirects=True) assert b'Entities were updated' in rv.data - rv = self.app.post( + rv = c.post( url_for('type_move_entities', id_=relation.subs[1]), data={ relation.id: '', @@ -68,11 +69,10 @@ def test_relation(self) -> None: follow_redirects=True) assert b'Entities were updated' in rv.data - rv = self.app.get( - url_for('link_update', id_=link_.id, origin_id=related.id)) + rv = c.get(url_for('link_update', id_=link_.id, origin_id=related.id)) assert b'Connor' in rv.data - rv = self.app.post( + rv = c.post( url_for('link_update', id_=link_.id, origin_id=actor.id), data={'description': 'There can be only one', 'inverse': True}, follow_redirects=True) diff --git a/tests/test_search.py b/tests/test_search.py index d2f72dd2c..3843115b2 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -7,6 +7,7 @@ class SearchTest(TestBaseCase): def test_search(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() person = insert('person', 'Waldo') @@ -16,10 +17,10 @@ def test_search(self) -> None: object_.link('P1', insert('appellation', 'Waldorf alias')) insert('person', 'Waldo without date') - rv = self.app.post(url_for('search_index'), data={'global-term': ''}) + rv = c.post(url_for('search_index'), data={'global-term': ''}) assert b'no entries' in rv.data - rv = self.app.post( + rv = c.post( url_for('search_index'), data={ 'global-term': 'wal', @@ -27,17 +28,17 @@ def test_search(self) -> None: 'begin_year': -100}) assert b'Waldo' in rv.data - rv = self.app.post( + rv = c.post( url_for('search_index'), data={'term': 'do', 'end_year': 3000, 'classes': 'person'}) assert b'Waldo' in rv.data - rv = self.app.post( + rv = c.post( url_for('search_index'), data={'term': 'do', 'classes': 'person'}) assert b'Waldo' in rv.data - rv = self.app.post( + rv = c.post( url_for('search_index'), data={'term': 'x', 'begin_year': 2, 'end_year': -1}) assert b'cannot start after' in rv.data diff --git a/tests/test_source.py b/tests/test_source.py index ccefecf59..4a4523088 100644 --- a/tests/test_source.py +++ b/tests/test_source.py @@ -9,34 +9,34 @@ class SourceTest(TestBaseCase): def test_source(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() gillian = insert('person', 'Gillian Anderson Gillian Anderson') artifact = insert('artifact', 'Artifact with inscription') reference = insert('external_reference', 'https://d-nb.info') - rv: Any = self.app.post( + rv: Any = c.post( url_for('insert', class_='source'), data={'name': 'Necronomicon'}) source_id = rv.location.split('/')[-1] - rv = self.app.get( - url_for('insert', class_='source', origin_id=artifact.id)) + rv = c.get(url_for('insert', class_='source', origin_id=artifact.id)) assert b'Artifact with inscription' in rv.data - rv = self.app.get(url_for('link_insert', id_=source_id, view='actor')) + rv = c.get(url_for('link_insert', id_=source_id, view='actor')) assert b'Gillian' in rv.data - rv = self.app.post( + rv = c.post( url_for('link_insert', id_=source_id, view='actor'), data={'checkbox_values': [gillian.id]}, follow_redirects=True) assert b'Gillian' in rv.data - rv = self.app.get(url_for('update', id_=source_id)) + rv = c.get(url_for('update', id_=source_id)) assert b'Necronomicon' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=source_id), data={ 'name': 'Source updated', @@ -45,23 +45,23 @@ def test_source(self) -> None: follow_redirects=True) assert b'Source updated' in rv.data - rv = self.app.get(url_for('entity_add_reference', id_=source_id)) + rv = c.get(url_for('entity_add_reference', id_=source_id)) assert b'link reference' in rv.data - rv = self.app.post( + rv = c.post( url_for('entity_add_reference', id_=source_id), data={'reference': reference.id, 'page': '777'}, follow_redirects=True) assert b'777' in rv.data - rv = self.app.get( + rv = c.get( url_for( 'insert', class_='source_translation', origin_id=source_id)) assert b'+ Source translation' in rv.data - rv = self.app.post( + rv = c.post( url_for( 'insert', class_='source_translation', @@ -70,7 +70,7 @@ def test_source(self) -> None: follow_redirects=True) assert b'+' in rv.data - rv = self.app.post( + rv = c.post( url_for( 'insert', class_='source_translation', @@ -78,22 +78,22 @@ def test_source(self) -> None: data={'name': 'Test translation'}) translation_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('update', id_=translation_id)) + rv = c.get(url_for('update', id_=translation_id)) assert b'Test translation' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=translation_id), data={'name': 'Translation updated', 'opened': '9999999999'}, follow_redirects=True) assert b'Translation updated' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=translation_id), data={'name': 'Translation updated', 'opened': '1000000000'}, follow_redirects=True) assert b'because it has been modified' in rv.data - rv = self.app.get( + rv = c.get( url_for('delete', id_=translation_id), follow_redirects=True) assert b'The entry has been deleted' in rv.data diff --git a/tests/test_type.py b/tests/test_type.py index 7a8fa456b..1201a16c1 100644 --- a/tests/test_type.py +++ b/tests/test_type.py @@ -9,6 +9,7 @@ class TypeTest(TestBaseCase): def test_type(self) -> None: + c = self.client with app.test_request_context(): app.preprocess_request() actor_type = get_hierarchy('Actor relation') @@ -19,11 +20,10 @@ def test_type(self) -> None: location = place.get_linked_entity_safe('P53') location.link('P89', g.types[historical_type.subs[0]]) - rv: Any = self.app.get(url_for('view', id_=historical_type.subs[0])) + rv: Any = c.get(url_for('view', id_=historical_type.subs[0])) assert b'Historical place' in rv.data - rv = self.app.get( - url_for('insert', class_='type', origin_id=actor_type.id)) + rv = c.get(url_for('insert', class_='type', origin_id=actor_type.id)) assert b'Actor relation' in rv.data data = { @@ -31,32 +31,32 @@ def test_type(self) -> None: 'name_inverse': 'Do I look inverse?', 'description': 'Very important!', actor_type.id: actor_type.subs[0]} - rv = self.app.post( + rv = c.post( url_for('insert', class_='type', origin_id=actor_type.id), data=data) type_id = rv.location.split('/')[-1] - rv = self.app.get(url_for('update', id_=type_id)) + rv = c.get(url_for('update', id_=type_id)) assert b'My secret type' in rv.data assert b'super' in rv.data - rv = self.app.get(url_for('update', id_=dimension_type.subs[0])) + rv = c.get(url_for('update', id_=dimension_type.subs[0])) assert b'unit' in rv.data - rv = self.app.post( + rv = c.post( url_for('update', id_=type_id), data=data, follow_redirects=True) assert b'Changes have been saved' in rv.data data['continue_'] = 'yes' - rv = self.app.post( + rv = c.post( url_for('insert', class_='type', origin_id=actor_type.id), data=data, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.post( + rv = c.post( url_for('ajax_add_type'), data={ 'name': 'New dynamic', @@ -64,14 +64,14 @@ def test_type(self) -> None: 'superType': actor_type.id}) assert rv.data.isdigit() - rv = self.app.get(url_for('ajax_get_type_tree', root_id=actor_type.id)) + rv = c.get(url_for('ajax_get_type_tree', root_id=actor_type.id)) assert b'New dynamic' in rv.data - rv = self.app.post(url_for('update', id_=actor_type.id), data=data) + rv = c.post(url_for('update', id_=actor_type.id), data=data) assert b'Forbidden' in rv.data admin_unit = get_hierarchy('Administrative unit') - rv = self.app.post( + rv = c.post( url_for( 'insert', class_='administrative_unit', @@ -80,27 +80,27 @@ def test_type(self) -> None: follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.get(url_for('update', id_=admin_unit.subs[0])) + rv = c.get(url_for('update', id_=admin_unit.subs[0])) assert b'admin unit' in rv.data - rv = self.app.get(url_for('view', id_=dimension_type.subs[0])) + rv = c.get(url_for('view', id_=dimension_type.subs[0])) assert b'Unit' in rv.data sex = get_hierarchy('Sex') sex_sub = g.types[sex.subs[0]] - rv = self.app.get( + rv = c.get( url_for('type_unset_selectable', id_=sex_sub.id), follow_redirects=True) assert b'set selectable' in rv.data - rv = self.app.get(url_for('insert', class_='person')) + rv = c.get(url_for('insert', class_='person')) assert b'sex' in rv.data - rv = self.app.get(url_for('type_index')) + rv = c.get(url_for('type_index')) assert b'sex' in rv.data - rv = self.app.get( + rv = c.get( url_for('type_set_selectable', id_=sex_sub.id), follow_redirects=True) assert b'set unselectable' in rv.data @@ -110,14 +110,13 @@ def test_type(self) -> None: actor = insert('person', 'Connor MacLeod') actor.link('P2', sex_sub) - rv = self.app.get(url_for('show_untyped_entities', id_=sex.id)) + rv = c.get(url_for('show_untyped_entities', id_=sex.id)) assert b'no entries' in rv.data - rv = self.app.get( - url_for('show_untyped_entities', id_=admin_unit.id)) + rv = c.get(url_for('show_untyped_entities', id_=admin_unit.id)) assert b'Home' in rv.data - rv = self.app.get( + rv = c.get( url_for('type_delete', id_=actor_type.id), follow_redirects=True) assert b'Forbidden' in rv.data @@ -126,23 +125,22 @@ def test_type(self) -> None: app.preprocess_request() actor.link('P2', g.types[sex.subs[1]]) - rv = self.app.get(url_for('update', id_=actor.id)) + rv = c.get(url_for('update', id_=actor.id)) assert b'422' in rv.data - rv = self.app.post( - url_for('type_move_entities', id_=dimension_type.subs[0])) + rv = c.post(url_for('type_move_entities', id_=dimension_type.subs[0])) assert b'403' in rv.data - rv = self.app.get(url_for('show_multiple_linked_entities', id_=sex.id)) + rv = c.get(url_for('show_multiple_linked_entities', id_=sex.id)) assert b'Connor' in rv.data - self.app.post( + c.post( url_for('hierarchy_update', id_=sex.id), data={'multiple': True}) - rv = self.app.get(url_for('hierarchy_update', id_=sex.id)) + rv = c.get(url_for('hierarchy_update', id_=sex.id)) assert b'disabled="disabled" id="multiple"' in rv.data - rv = self.app.get( + rv = c.get( url_for('hierarchy_delete', id_=sex.id), follow_redirects=True) assert b'Warning' in rv.data @@ -151,17 +149,16 @@ def test_type(self) -> None: app.preprocess_request() actor.link('P74', location, type_id=actor_type.subs[0]) - rv = self.app.get( - url_for('type_delete_recursive', id_=actor_type.subs[0])) + rv = c.get(url_for('type_delete_recursive', id_=actor_type.subs[0])) assert b'Warning' in rv.data - rv = self.app.post( + rv = c.post( url_for('type_delete_recursive', id_=sex.id), data={'confirm_delete': True}, follow_redirects=True) assert b'Types deleted' in rv.data - rv = self.app.post( + rv = c.post( url_for('type_delete_recursive', id_=actor_type.id), data={'confirm_delete': True}) assert b'403 - Forbidden' in rv.data diff --git a/tests/test_user.py b/tests/test_user.py index 422f8eb41..96f481b65 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -10,6 +10,7 @@ class UserTests(TestBaseCase): def test_user(self) -> None: + c = self.client data = { 'active': '', 'username': 'Ripley', @@ -20,14 +21,14 @@ def test_user(self) -> None: 'name': 'Ripley Weaver', 'real_name': '', 'description': ''} - rv: Any = self.app.post(url_for('user_insert'), data=data) + rv: Any = c.post(url_for('user_insert'), data=data) user_id = rv.location.split('/')[-1] data['password'] = 'too short' - rv = self.app.post(url_for('user_insert'), data=data) + rv = c.post(url_for('user_insert'), data=data) assert b'match' in rv.data - rv = self.app.post( + rv = c.post( url_for('user_insert'), data={ 'active': '', @@ -43,39 +44,37 @@ def test_user(self) -> None: follow_redirects=True) assert b'Newt' not in rv.data - rv = self.app.get(url_for('user_view', id_=666)) + rv = c.get(url_for('user_view', id_=666)) assert b'404' in rv.data - rv = self.app.get(url_for('user_update', id_=self.alice_id)) + rv = c.get(url_for('user_update', id_=self.alice_id)) assert b'Alice' in rv.data data['description'] = 'The warrant officer' - rv = self.app.post( + rv = c.post( url_for('user_update', id_=user_id), data=data, follow_redirects=True) assert b'The warrant officer' in rv.data - rv = self.app.post(url_for('user_update', id_=1234), data=data) + rv = c.post(url_for('user_update', id_=1234), data=data) assert b'404' in rv.data - rv = self.app.get( - url_for('user_delete', id_=user_id), - follow_redirects=True) + rv = c.get(url_for('user_delete', id_=user_id), follow_redirects=True) assert b'User deleted' in rv.data - rv = self.app.post( + rv = c.post( url_for('insert', class_='bibliography'), data={'name': 'test', 'description': 'test'}, follow_redirects=True) assert b'An entry has been created' in rv.data - rv = self.app.post( + rv = c.post( url_for('user_activity', user_id=user_id), data={'limit': 100, 'user': 0, 'action': 'all'}) assert b'activity' in rv.data - rv = self.app.get(url_for('user_delete', id_=self.alice_id)) + rv = c.get(url_for('user_delete', id_=self.alice_id)) assert b'403 - Forbidden' in rv.data with app.test_request_context(): @@ -83,64 +82,60 @@ def test_user(self) -> None: person = insert('person', 'Hugo') insert('activity', 'Event Horizon').link('P11', person) - rv = self.app.post( - url_for('ajax_bookmark'), - data={'entity_id': person.id}) + rv = c.post(url_for('ajax_bookmark'), data={'entity_id': person.id}) assert b'Remove bookmark' in rv.data with app.test_request_context(): current_user.bookmarks = [person.id] - rv = self.app.get('/') + rv = c.get('/') assert b'Hugo' in rv.data - rv = self.app.post( - url_for('ajax_bookmark'), - data={'entity_id': person.id}) + rv = c.post(url_for('ajax_bookmark'), data={'entity_id': person.id}) assert b'Bookmark' in rv.data - self.app.get(url_for('logout')) - rv = self.app.get(url_for('user_insert'), follow_redirects=True) + c.get(url_for('logout')) + rv = c.get(url_for('user_insert'), follow_redirects=True) assert b'Forgot your password?' not in rv.data - self.app.post( + c.post( url_for('login'), data={'username': 'Editor', 'password': 'test'}) - rv = self.app.get(url_for('user_insert')) + rv = c.get(url_for('user_insert')) assert b'403 - Forbidden' in rv.data - rv = self.app.post(url_for('insert', class_='reference_system')) + rv = c.post(url_for('insert', class_='reference_system')) assert b'403 - Forbidden' in rv.data - rv = self.app.get(url_for('delete', id_=g.wikidata.id)) + rv = c.get(url_for('delete', id_=g.wikidata.id)) assert b'403 - Forbidden' in rv.data - self.app.get(url_for('logout')) - self.app.post( + c.get(url_for('logout')) + c.post( url_for('login'), data={'username': 'Manager', 'password': 'test'}) - rv = self.app.get(url_for('settings', category='mail')) + rv = c.get(url_for('settings', category='mail')) assert b'403 - Forbidden' in rv.data - rv = self.app.get(url_for('user_update', id_=self.alice_id)) + rv = c.get(url_for('user_update', id_=self.alice_id)) assert b'403 - Forbidden' in rv.data - self.app.get(url_for('logout')) - self.app.post( + c.get(url_for('logout')) + c.post( url_for('login'), data={'username': 'Contributor', 'password': 'test'}) - rv = self.app.get(url_for('delete', id_=person.id)) + rv = c.get(url_for('delete', id_=person.id)) assert b'403 - Forbidden' in rv.data - rv = self.app.get(url_for('update', id_=person.id)) + rv = c.get(url_for('update', id_=person.id)) assert b'Hugo' in rv.data - rv = self.app.get(url_for('view', id_=person.id)) + rv = c.get(url_for('view', id_=person.id)) assert b'Hugo' in rv.data - self.app.get(url_for('logout')) - self.app.post( + c.get(url_for('logout')) + c.post( url_for('login'), data={'username': 'Readonly', 'password': 'test'}) - rv = self.app.get(url_for('view', id_=person.id)) + rv = c.get(url_for('view', id_=person.id)) assert b'Hugo' in rv.data From 5de3bff84d84de9f8eab8a4f70e50070db97cf74 Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Mon, 25 Nov 2024 17:34:50 +0100 Subject: [PATCH 27/42] Minor reformatting --- tests/test_file.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/test_file.py b/tests/test_file.py index e146bac40..f997c6598 100644 --- a/tests/test_file.py +++ b/tests/test_file.py @@ -269,10 +269,11 @@ def test_file(self) -> None: rv = c.get(url_for('orphans')) assert b'File keeper' in rv.data - rv = c.get(url_for( - 'admin_annotation_relink', - image_id=iiif_id, - entity_id=place.id), + rv = c.get( + url_for( + 'admin_annotation_relink', + image_id=iiif_id, + entity_id=place.id), follow_redirects=True) assert b'Entities relinked' in rv.data From 68ea71038885597fd426703b677b2d4e8d4fdf6b Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Tue, 26 Nov 2024 17:05:19 +0100 Subject: [PATCH 28/42] Refactoring for loops --- openatlas/database/network.py | 2 +- openatlas/models/checks.py | 4 +--- openatlas/models/entity.py | 12 ++++-------- openatlas/models/imports.py | 4 ++-- openatlas/models/type.py | 37 +++++++++++++++-------------------- 5 files changed, 24 insertions(+), 35 deletions(-) diff --git a/openatlas/database/network.py b/openatlas/database/network.py index cdf47e474..c825121c1 100644 --- a/openatlas/database/network.py +++ b/openatlas/database/network.py @@ -16,7 +16,7 @@ def get_ego_network(ids: set[int]) -> list[dict[str, Any]]: def get_edges( classes: list[str], - properties: list[str]) -> list[dict[str, int]]: + properties: list[str]) -> list[dict[Any, int]]: g.cursor.execute( """ SELECT l.id, l.domain_id, l.range_id diff --git a/openatlas/models/checks.py b/openatlas/models/checks.py index 3cf441b89..98e6a765c 100644 --- a/openatlas/models/checks.py +++ b/openatlas/models/checks.py @@ -28,9 +28,7 @@ def single_type_duplicates() -> list[dict[str, Any]]: def invalid_dates() -> list[Entity]: - return [ - Entity.get_by_id(row['id'], types=True) - for row in date.invalid_dates()] + return [Entity.get_by_id(row['id'], True) for row in date.invalid_dates()] def orphans() -> list[Entity]: diff --git a/openatlas/models/entity.py b/openatlas/models/entity.py index 99ebb50b6..64d923b31 100644 --- a/openatlas/models/entity.py +++ b/openatlas/models/entity.py @@ -328,8 +328,8 @@ def check_too_many_single_type_links(self) -> bool: for type_ in self.types: if type_.root[0] in type_dict: type_dict[type_.root[0]] += 1 - else: - type_dict[type_.root[0]] = 1 + continue + type_dict[type_.root[0]] = 1 for id_, count in type_dict.items(): if count > 1 and not g.types[id_].multiple: return True @@ -648,15 +648,11 @@ def invalid_preceding_dates() -> list[Link]: @staticmethod def invalid_sub_dates() -> list[Link]: - return [ - Link.get_by_id(row['id']) - for row in date.invalid_sub_dates()] + return [Link.get_by_id(row['id']) for row in date.invalid_sub_dates()] @staticmethod def get_invalid_link_dates() -> list[Link]: - return [ - Link.get_by_id(row['id']) - for row in date.invalid_link_dates()] + return [Link.get_by_id(row['id']) for row in date.invalid_link_dates()] @staticmethod def check_link_duplicates() -> list[dict[str, Any]]: diff --git a/openatlas/models/imports.py b/openatlas/models/imports.py index db501a8d3..b324cc371 100644 --- a/openatlas/models/imports.py +++ b/openatlas/models/imports.py @@ -100,9 +100,9 @@ def import_data_(project: Project, class_: str, data: list[Any]) -> None: entities: dict[str | int, dict[str, Any]] = {} for row in data: if value := row.get('openatlas_class'): - if (value.lower().replace(' ', '_') in ( + if value.lower().replace(' ', '_') in ( g.view_class_mapping['place'] + - g.view_class_mapping['artifact'])): + g.view_class_mapping['artifact']): class_ = value.lower().replace(' ', '_') entity = Entity.insert(class_, row['name'], row.get('description')) db.import_data( diff --git a/openatlas/models/type.py b/openatlas/models/type.py index 773c5b2a4..5c0a1ff95 100644 --- a/openatlas/models/type.py +++ b/openatlas/models/type.py @@ -99,12 +99,11 @@ def move_entities(self, new_type_id: int, checkbox_values: str) -> None: if new_type_id: # A new type was selected if root.multiple: cleaned_entity_ids = [] - for entity in Entity.get_by_ids(entity_ids, types=True): - if any(type_.id == int(new_type_id) - for type_ in entity.types): - delete_ids.append(entity.id) - else: - cleaned_entity_ids.append(entity.id) + for e in Entity.get_by_ids(entity_ids, types=True): + if any(type_.id == int(new_type_id) for type_ in e.types): + delete_ids.append(e.id) + continue + cleaned_entity_ids.append(e.id) entity_ids = cleaned_entity_ids if entity_ids: data = { @@ -151,14 +150,14 @@ def populate_subs(types: dict[int, Type]) -> None: type_.root[-1], type_.root) type_.category = hierarchies[type_.root[0]]['category'] - else: - type_.category = hierarchies[type_.id]['category'] - type_.multiple = hierarchies[type_.id]['multiple'] - type_.required = hierarchies[type_.id]['required'] - type_.directional = hierarchies[type_.id]['directional'] - for class_ in g.classes.values(): - if class_.hierarchies and type_.id in class_.hierarchies: - type_.classes.append(class_.name) + continue + type_.category = hierarchies[type_.id]['category'] + type_.multiple = hierarchies[type_.id]['multiple'] + type_.required = hierarchies[type_.id]['required'] + type_.directional = hierarchies[type_.id]['directional'] + for class_ in g.classes.values(): + if class_.hierarchies and type_.id in class_.hierarchies: + type_.classes.append(class_.name) @staticmethod def get_root_path( @@ -175,16 +174,12 @@ def get_root_path( @staticmethod def check_hierarchy_exists(name: str) -> list[Type]: - hierarchies = [ - root for root in g.types.values() - if root.name == name and not root.root] - return hierarchies + return [x for x in g.types.values() if x.name == name and not x.root] @staticmethod def get_hierarchy(name: str) -> Type: - return [ - root for root in g.types.values() - if root.name == name and not root.root][0] + return \ + [x for x in g.types.values() if x.name == name and not x.root][0] @staticmethod def get_tree_data( From 8d4a5479fd2e3532126eb7479caf0c519bf88beb Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Wed, 27 Nov 2024 12:20:04 +0100 Subject: [PATCH 29/42] Update manual --- .../manual/.doctrees/environment.pickle | Bin 177131 -> 179038 bytes .../manual/.doctrees/model/cidoc_crm.doctree | Bin 14912 -> 15440 bytes .../manual/.doctrees/model/index.doctree | Bin 12610 -> 12599 bytes .../.doctrees/model/link_checker.doctree | Bin 3736 -> 3845 bytes .../.doctrees/model/openatlas_classes.doctree | Bin 11099 -> 12886 bytes .../model/openatlas_shortcuts.doctree | Bin 47495 -> 47161 bytes .../manual/.doctrees/model/references.doctree | Bin 21108 -> 21924 bytes openatlas/static/manual/model/cidoc_crm.html | 68 +++++++++--------- openatlas/static/manual/model/index.html | 64 +++++++++-------- .../static/manual/model/link_checker.html | 6 +- .../manual/model/openatlas_classes.html | 34 +++++---- .../manual/model/openatlas_shortcuts.html | 38 +++++----- openatlas/static/manual/model/references.html | 39 +++++----- openatlas/static/manual/searchindex.js | 2 +- sphinx/source/model/cidoc_crm.rst | 6 +- sphinx/source/model/openatlas_classes.rst | 4 +- 16 files changed, 136 insertions(+), 125 deletions(-) diff --git a/openatlas/static/manual/.doctrees/environment.pickle b/openatlas/static/manual/.doctrees/environment.pickle index 58fa26077c2f66cca6b9e6f0b9642a039155d501..538c75d59323772cec5308f23ceb1aee8b6de731 100644 GIT binary patch literal 179038 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 ZWXUKUWDkIuN$iAGF^*DipgOtv{|Dfo`_2FW literal 177131 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 R#tJNjs(yw>1GVX`{}&j!6*B+; diff --git a/openatlas/static/manual/.doctrees/model/cidoc_crm.doctree b/openatlas/static/manual/.doctrees/model/cidoc_crm.doctree index 5ec51e83ecd46e167280bf3c0f4418b53b5b3510..44e9bc27ed8434ec76890d2f213692b67f6163e2 100644 GIT binary patch delta 3152 zcmcguTWl0%6lS)rl=-8Bek4FpO{gd33XRKdp5fuiW`0$dCRpljY-_^`AGIoC@QG4T7EAC7=b6#2h;m8 z<>bltY>7|~ljSEIgXBdU9Pzn?Di~d`6=EJYd>{0}g$2b8JJB0n!;5$=@8oqGyy(nO zAfv@Oe8_>>eY&z4f)%WY1sQCr_!27o-EgIP!J^TTkoW-An_?tlQW8@f)+{VjxY1Mx zk9j?1Vp6m8TrIyXAhHK0}n9LHzbtHrF+ zgV3<(04R+vTh1%2g`|L|E^*L^2@?28CQMhK8K!$a+zDuZp_v@b!uTjdVq^4jK^Zg@tI?x1VrX4eL z8Cn`r-7B$I465G{e$Z)QUX~Q(#U7i9MYZsA!-7&NGxGddT}=*(-CJ_o3t>f)98Wx2>&YUaW1vv?e178NU*O&}I}9;atcSZaX+})JK(FIHzsWJ*k}fmsN`}tHtO$-{CGQ~t zTRWE4*a=87>c}yfjpMYog)ms+C_ELagTp0F5bJ6mUNt%*YARc=nDSgKf+H+_%omX2>hz{dTRx$zYf8B-V2n`a^8V{@FtG{XraVQQ}AxgvN!T zvENl#(6tz|T36nU7iM~Au3)o@(p-ffLxbMgxkTgwk#j^oC32QDd_Y7ZvXjVLL{1^G zrskq4|TqJ0k0zQeEbuQO2T?T~@Gg1&61^g_!({fNG7sI*)N>ijv;;aRNF*G_-4{6XPY DSX3_6 delta 2825 zcmc&$>rWI{6lazqFgz9n7FZr$9t#WmKopE(ZSmE(J}L%{*p|ZV?q%;R?94h3kq`s@ z&}3V#w4qsu&|<3tlIvrpu~=QQ&~sXY-42rEoh;6`XS=S$2QY%^cIx zzii@ticLhA%ddd%%JXKM^Ckr07@QFu3!CnTKk^Is3>4V|HugIRrA^SCodeVM4p@_4 z2)FE^;v7ubWF8i06Z-^K#csilqHSr%_lsT^obYE!i{;l?9I*Vxi;arb)qZ9W6BAkx zO)vbk_B~+-y7}Pak{qE7J}WsQ^y0X^wg=rCXiO88n!zi-U0~0=3TWd_OtNC<&>iVu*03tix{2ldxn+s1hYm+*k>IM^R>k z8cEdOW*-< z!o6~jaLP(P-sS*zWdjUV)R440`dlEY_C(j~6&_(`nQOP0cAJ9v(#f)PdaHNM+LcN; zP=txoWz(0fc$b{HnVgX;&HyGi?|k!+wM=3S{YmEPPfov(8aLy(1;=YNI%H~cGJ0*L zVrd@wM4Wg^azDVmd+Iy0Dv{3~n6Ex2R6tKnuka%m*>{%{y(Dte3XunJa%W)I!JPzq zMmA)4;BbJm*4}~=^l(afTS-JQV^otv(g@M%ag!<`N_-*~gfdK^zxMR{5O$zWbV0;0yn{Qa%3)_4Y$|!v;8Bwh6v*<=9^u99UI2wQ#=4S;!lA zMPqtXO<4tn&D-H(V~)@XH!EvkuwiY<5O#D}Tvq7qwi##TnyrJVDurKM9k9)n2N9>; zwq=2(OU`1Lacvda;g;(N9IkRV1rYhNLoC|P$DH%~PY-XOt=$HP>N}im%eYv+(LAjm#AuLA~@VWfxy+)YC#0aEoBF3NW%LB+C5{%x)~gZYigWo zhD`MVbqH>HJTTr8ghSr-P}rI+?0wGB&tT*(o5ZQ}^5eLw^Pln}Hn{I?${nRdjwmW} z-{{*|>m_5VNw8(eh^h|r`z}VzIFb43Ohq`ez6KuqD)J?RkFn3YAiPC<&Sz4wflC zl86^P#iYqFuE*3+MiOpXyjTo|*&zd%N01U4iyLG9^i{qYF8SR>Y0kXFx=vuyi>2<& zgYvdE+vs9*zvfmK3v=LEcufTr4x||NDwyzA!$5sg*2}!^;gyX8LeuQ08^bo?-fZ5c zUo$7ZLSCX@qG99gB)iByWH;D#Hpd=E*CIJlJ2xHNv~%+VH+Q(X$<4Rie8D4J=BAgM z9yI23t|G;#F&3vf|GSCuU8dN0f?Z6o8woa-u%aiT9TONKVTGNtLME(mQ&y;i$?CYX zg)Se_X^8GDqPxZ(v)>k=<#GfTG!K8Xpz*(~1!!OMHwzj+)-7n!y%xTLAyqXL)tJrR H8W8>l(TJ=Y diff --git a/openatlas/static/manual/.doctrees/model/index.doctree b/openatlas/static/manual/.doctrees/model/index.doctree index 22f918e72f5f05dcc0e861364d98707b076a6d44..a1fece965b801513123d7861390447b7c2740784 100644 GIT binary patch delta 2874 zcmd5;U1%It6wYjtZ8QDJO0%2pUvf9G-Q8r})&3F+l9;v{trTjJSPXb~=5Frn&dzM- zCt<<5ttdnd{`5ppG?DgAd{DcJK1n0^QY+}AmSUlTK8T=LA4Jh}XS16W(LS{mlHHj- z_ndp~cfRkO`)U58e8~v*5j`)S-E5vn)BvaW$tEjAj$f@T_^Nl%_4yHB_>)9__lO zP)9QjGOIbwro}SXZ9^1lki55CCHX3$M%6S}D^kVM zOpBBZb5>{SG!vVO1RE)1;0!Sh$JEVfjoBG8KC%DsI2k|kuuL&QkpNbc4-ve*_iD8 zmtw%l&C&X=8^i4hLQ?-#4o2Yk9b4-U1fG;?^C$MZ7V@RRJvPI1vr=Y;(`0dz^@Nox zoZ47a{HwTVHwdG473oZoeocb^gO39$mMJy~&a;OAUsEwk?5K5*kTEUJ%bz(92GT4(+T+0%Gt;$bck#50j z2dG^I8$k&U^$gXrL0!((&-2*&YG_lZb9wCsj5DP|Osdu|H0H5`~ zCnaHK>*8n{jZ^7U3nvy*ymPV*S5G(|lBR8Id7X(_VRLiVlTM?hy+eGh+ycEazmSa1kI`l<=i`YgHM#3RG`coL4plhU6cb*JH_;Ci?_ z+65oPk3u!RuWJjAPscG084mRsu)c2}T{Ile-0mu-Lylnjx)eAO<3K21BpP zI9@dciv7tfYL8S_aL$qmgHTn~#3;=W+blB~akm`Bb&%;el;DT{J>7DdBF6YHkj)af zi-Zx$#YC>VMfSyg#va$>~&%*9QN231)~WD zD%*IOFo=nTo6*>8b9{Jf3~ZKV3VV|&_~Op-4Xtv_pMl6WE{>4B@e$VGP=e#h2>h~b z%x5EvDVW-xua%mJy^RvR_2-04a_4o$7CE}UIWNCJ>Jg~~YU-KPYa&ZN%z>YMNWwa| zvX-)I&)2B)?)tX0>XRqoVR?=yz@0m!G zKB@lc(5r9pSEwXLu_SB<)f#B8cJ!rpcBy2HP*Vy57n(na=7o(e+DtbrTo$Qg2#aJ* zBRfVovth*7?O*@MU}i4+#Uuh1GAV7{gGbg`V}gcVDiN<$Kr$`XQtc~N-gY1Y97brfW_BsoDW;Sf&8 znT~1B3M@6@$H8xep@>r$tQ z$!HGgBnZ_%H1?Eve#Kz%{N;^pY(~SQyCu8deGJpIYJi=<37k@M2r&t;jN1 z?LVOn!}WE6-G9?@r4Wj-Wr6tPLV%sEskJQ+hX!M<-)tj1R1nA_Osjt?`PlFthzD*8Smq*7SwE*^@MSpE*Pk*G{{ zOhsYCH0vyKo8)3?f=E&eV!>#L5|<+xDj7kb?P^*dLi!2pxnPE3=;Ya8ho-}a!6dG4 z1~+Qm$}_L)8LW&l?OT{#6M?}z_8fDAxmUBKETO5_}d*dXB18?QJ@YkAl02r$9S~LTOC=0B*a9*V6aN z-{{!disz5W>emqN96La*sv0#8d(|mpXUZA*JhK^&9!V_5ayazW;8QK-VM5?VJY+qD zrAN~`%y#ag3y%bZWm z{^+X5_|L@KQj7Niw}Nmoe$4aEJ=X@8_+UOhpiRKDiL>iIQcm)X9QgYK8WxCh8h%bB zw9PZYWX_}gICFaA4~@sa!0o~;e)vUxp3m`X{5Jo-(2I;K^r+8Ob$$gu<*B6>Ei$KC sVp7eyf|7iLU!3G~ll=CiD>CU`pDgp3x-bjZd&A92w(#-Ht==Qr?~Kj7asU7T diff --git a/openatlas/static/manual/.doctrees/model/link_checker.doctree b/openatlas/static/manual/.doctrees/model/link_checker.doctree index 261ce96a6dd90decbd023bd5da4910242ea74f38..734ec3a2546eb21de59bc99f0a0aedeffbb5f3d6 100644 GIT binary patch delta 325 zcmbOs+bYM>z&iEUMwShXtPxC%3=EUEF}f(0WTYyTCFW$NWR_Gaw)F zDkSG578fh%PEKGEby7%9%u`58RY=ZAP0mhD(NhS?Naf1O%*%#~6oC~a<`n0HR3#=S zrxq8drYIy;0!_(G&d$tBpB&4is-RGin4SueBg+Oxrk=BtcQU#pSLT;0Bq!!6l%y7yC}gH7B&QaYBxdF*BfvChsgtXJyyWAOeXO@{+ zpaL$wlA1I|ISWR@A7V7YV8m2ojQptyAs7=hCMJqT5Mn|!Kz|xz^xWA#rnIF%V*E3^ zbMKk&eCK@UoO>@n{e8@H#B*%R%8xw@-JWNkbLHhhiTjO=_zY7Llx$B?t=mdSCP|yr zBo?EjXY*s*dq~fdTgiUKVv1%jN~u&rktIvfwKgJ=xS~;m>^3C)jfqJ;MiWFaiAHIR z#)zep7?l$C_e9n;iypAj_#RW@acWRare=nW1EX6*RM5nTOEQg+9Skkvx{7+#0bANi!36gt&*1PtvtGkb#89NfJa#nh~*EBl{IA| zqQ~tt*)|%6n#6=5DI#exM?!5P=w6m!V|`7>ZuF8Kh{$>}DjU*%Gdih8)G{cICNaHH zMKdiakwA;&+Wx+glkN+G@Fg5}lmA=7#`z_L-`zFf^@{5&XBRKa7VOHh%Hg@TU(3Ff zJ)CW3wd_^6?W+OZ+X(A|jiq;L4ts;u8MY%mfLN#JQU1RYz8$OMUX<6!0L2PQYq5#! z>|Ec^i=M1umX$KQqR|Jai-}C;bENE4-rlkEmdUTk{jfaM1sbk zyS5x|c>;n6-U7eJZgOZXh^!W;23Rw;r->trJQ8V-tPBy8Qn7#fjKc|&PU48M8y}7= zSOFgvi2k$p=d*PlpAJDrk9z%q-g!uLHrL*Tr33BaguD%R{Qy;Og-k)KI4R*MtX;UJ zhkq2dr)(Iylw?^qVtm%(u>-;U(8#hyhlLhCcqKf141<~}UE>CABzKgA z%@mcDI36K-{eJ*u5eCw+fTH#bx5Qvt4a9esn zUBZEGlx`?dTkzjRAFJD;tE^dgg8TKT4|AK*Dl+MPD_@xK{ych*2pgevaZ}k0|IoeI zzj$n>$4yny@N|zRVve5x3*uC=($3MPrsrU?*U2O^&SYD4RrL%ewlw9swU{Cm3??~_Gwya;w5!7eS zpw9E4)^Eh6VQ(~7v(Z!nuSdLnXOD79Z(aiCoFe~hi~P$REG|1)+?Yq?@rR_4Usl`EBqP9lxJ;FRfYXceeY~VL4`xDc?w@ z<~t!jg!FkSB@IEwu-n$*b}_?oPRx9h#a9=_|J*qtg*Rm#y?xXJNF z9bOD4F900KVXq*wmHB)TE|6Y9f{KQL3fpFCzUQ{vJ>`qlL4Rikkcyr*iw(*})+; zGQ_S8*@i=D*1)%Hlp;hi5ak1Qh5e|W!9q~q=MN61zF;GIMHpjNHN69z|Bol89f=UX1C2;lpK1mlBp33yw#{R^X~ULgPg delta 1823 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 hEq%Gss{vnbbW7>WjXa5SM|I(B9p>yEDV=%w}g6 z+C<&fN2EF=hC7&$_#l?V_)fEb{DCC?(I1!yiNR<{co+qLl_>H{i096>yQ@Oe5KVSx zXYTpVx!?KDxo7tF8Fc0&Buoe=Pdz;&oDs zzZP{l(Mq?#hSHSF8U3ij-(*U<*>`(5Y)7l~cN z&CJudl*PRzW$GSHZ3|0L$skGx3)K6UV5)}3Ly8usVTt(NY^;7mS!@xgrWJG2n2SQQ zPa67AH=AvUpf1ibtu{6y6yWKxFPc6UdV%U^Hq{YtHJfREQRst}ujW=hMg8ni-*)6> z$9)Yeh~jf+HV^wIt>-PTD45OMQVN!NR`!B}DC~-_U)Tb%ZqLP9$_}-(pk5&Hm}7qj zd#`2KK~z@Q8Ysq+fh8RiH{02|ekD{&GIXj$aEPclNZlb#)uk{^&@d)CX2)B*kehwo zdT&`BCTbYUsz@;jI>`-q_KSbE>EHdajJ$Ph1AFxu(g<#t##cz%?D?b>4IX@C8?kQ&GVN1d@K7Rm%)(fZo4Fh*mUjsg;8#1&uu)9-iK!&yHH%tW;?f_X?A|o zIy8ME(234w4R1WY4Gd=k72M!qvw=!4&`87Q3Q3?|#Xo?zatQ25-Oyu!|Hu4T7+ zsy%$9d4ovZ3#=Gkd+qcb^-NfM)*i7f7I~)B5+r0g1`MgBA@y!9e^99*% zXLT@&4y7**QU^+=H|_e(>6!$9`~q7yRJU(XfZMHbNt(qfiBVn&oxjE9&tY*&=FlnG z0gZD^o^kT)UHi)Yrjp_+j(h^{#Zq|!!Ot+n{a~os#Y4hTx-|3$dWn7Wo|czQ XRJaPO(TdY*)aJFJ_VWK delta 1943 zcmcgsUrbw781HGhh227=*}~Ss@U#Qk3#FNe(}KW82LzcU1DEiCgxlNG-dk_)t@jUD zmt{3(X2cp2zb-LENjCT7jB}}GZ;L)^7GLybBoZEyBz0X}IX-z#n9t#p-qwO~8F7L=W1__iAG< zcZP6|PZL%#vk9WXHZ)Nr=+y05nS~lh7c`@wXc@MrWqUK znO$R)m4@RUq=LuS7SV{FBZ46<5IK)|(-2inGV(a73TBol22Rj5NlA*Nq*>_q;kpWS z@n1#%fDV@%{ST14M{LflA-Ia4hx=hq`9#Y}gq|(09`v|SFMNVis0X}(kI@Uz=;vTP z@Ga9v10?tihv2I=uNC7zJ*g_)NhvKEyo?{K0ycw@r&yv0c|lflBq{L`4Bc%VFn7r7 ze{;8CAy_|DyZf*-(@#?_Y^B_f`e;E1%KO^e5gN3s5;{Ib$DlFv4H|~E&@CoT-G7Aj zP#kr@!*JVPj;%~N$-PxNQwobrvE8z>+}7|bTX>fnM#tehE=9q-f&I>zE|~0`YE(@* ziBqO#h(yb(8i7ll1AAD>z>-cS20wQmY2am5A=aMyurSaSLl_pj{t6t%ypp6tm!+&k z703$zz&aoKrQvrcRAw^bB{)vjjfj&-2X@?6yAfiDNXKwaP+=3t#MX&fxH7nkV)pT}uiiaJI}@&fi@v?^!O(SjkG#V}uzWO*#^C#-z0R>3_`Jmr zve%F1?W4i*(dID%=IDWEo(X*38v0B?%!6vPgPxIX# z_RKp@hvOK%`!c}-uV7x*RV?xggidd3tW@+VqEVR>S|N$1qt+m?u9_OPEYi6X+fac} zvqWc8nwpK`S428<3o}75^o+F5+ip2CAxi>pNUFkCf+>;39=4%*tkV#MwnEC%7mKrW zL*6hnUNESw0z9rzBpX||sc8aq$FuO>NDPKX>jFkTN7&%7M48mI#^=O*5QkL_>t+I5 zXIyz>q#vEN%CM*_&s>-e@z4Lh6ZGBP$_ri`+4q0+#W$ zcu_J$I&Qmbw+kOW+PB+CIDOC CRMICOM).

-

It is used as basis for the underlying data model of OpenAtlas and the -currently used version is +

In OpenAtlas its current version, CIDOC CRM v7.1.2 published in -May 2021. -A script is used to parse the specification and import it into a +May 2021, is used as underlying data model of the database.

+

A script is used to parse the specification and import it into a PostgreSQL database (more information is -available on GitHub)

+available on GitHub). +In this way all data is mapped to CIDOC CRM automatically without the +users having to familiarise themselves with the ontology.

The ontology consists of classes, linked together by properties.

CIDOC classes

-

Classes are indicated by a preceding E followed by a numeric code-e.g. +

Classes are indicated by a preceding E followed by a numeric code - e.g. “E39 - Actor” or “E67 - Birth”. All entities used within OpenAtlas can be characterised as CIDOC classes. -An overview of all CIDOC CRM classes can be found on this -page. The count -indicates how many times each class has been used in this database instance. -A click on the class name will get you to an overview of the class with +An overview of all CIDOC CRM classes can be found +here. +The displayed count indicates how many times each class has been used in +your OpenAtlas instance. +A click on the class name will bring you to an overview of the class with detailed information, such as a short description, sub- and super classes as well as possible properties.

CIDOC Properties

-

CIDOC entities are indicated by a combination of “P” and a numerical sequence - -think “P11 - had participant” or -“P2 - has type“. They are used to link classes -to other classes. So when an activity to place at a certain location, this can -be modelled in the following way

+

CIDOC properties are indicated by a combination of the letter “P” and a +numerical sequence - think +“P11 - had participant” or +“P2 - has type“. They are used to link a +class to another class. So an activity taking place at a certain location, +can be modelled in the following way

../_images/properties.png -

An overview of all CIDOC CRM properties can be found -here. The count -indicates how many times each property has been used in this database instance. -A click on the property name will get you to an overview of the property with +

An overview of all CIDOC CRM properties can be at the +demo. The displayed +count indicates how many times each property has been used in your OpenAtlas +instance. +A click on the property name will bring you to an overview of the property with detailed information, such as a short description.

-

OpenAtlas does not import nor use inverse properties (ending with i) since our -links are directed anyway. Nevertheless their labels are imported for more -convenient browsing possibilities of relations. -Properties with URLs as domain/range are ignored because the system used here +

OpenAtlas does not import nor use inverse properties (properties ending with +the letter i) since all used links are directed anyway. Nevertheless their +labels are imported for more convenient browsing possibilities of relations. +Properties with URLs as domain/range are ignored as the system used here has a foreign key on domain which must match an existing class. -Also some properties are linked as sub_properties_of properties with the i +Also some properties are linked as “sub_properties_of” properties with the i suffix. Since we don’t use inverse properties in the database -(direction is determined through domain/range selection)they are linked to +(direction is determined through domain/range selection) they are linked to their counterpart without i.

-

There are some “special” properties we ignore, e.g. -P3 - has note, you can look them up in the -OpenAtlas CIDOC parser script where they are defined at the top: -https://github.com/craws/OpenAtlas/blob/main/install/crm/cidoc_rtfs_parser.py -We don’t import them because of technical reasons, e.g. they are missing some -definitions that “normal” properties have and the import script would have -troubles to deal with them. E.g. they have no defined range but this is a -foreign key in our database that can’t be empty.

+

There are some “special” properties that are not included in OpenAtlas, e.g. +P3 - has note. They can be found in the +OpenAtlas CIDOC parser script +on GitHub, where they are defined on the top: +These properties are not import due to technical reasons, e.g. missing +definitions that “normal” properties have or no defined range.

diff --git a/openatlas/static/manual/model/index.html b/openatlas/static/manual/model/index.html index 8be0def8f..b1d2667ec 100644 --- a/openatlas/static/manual/model/index.html +++ b/openatlas/static/manual/model/index.html @@ -109,43 +109,45 @@

Model

Data Model

-

While the model uses CIDOC CRM as -ontology, it can be used without prior knowledge of data models, ontologies, -etc. The software automatically maps information to the model. As the -definitions of the CIDOC Conceptual Reference Model was imported into the -system, its +

OpenAtlas automatically maps information to +CIDOC CRM which is used to build the model +of the database. This happens in the background of the application without +the user noticing. Therefore, the database can be used by anyone without +prior knowledge of data modeling, ontologies, CIDOC CRM +and the alike. +As the definitions of the CIDOC Conceptual Reference Model are imported into +the system, its classes and properties can be -browsed directly in OpenAtlas (see also here). +browsed directly in OpenAtlas (for more information see +here). Furthermore, it is possible to verify link-conformity between entities via the -link-checker (for more -information click here here).

-

During the development much emphasis was put on the fact that users do not have -to concern themselves with the model or its ontology. Nevertheless, it is -possible to display the CIDOC classes used in the user interface and thus gain -insight into how the data is mapped.

-

Pressing the Model button on the start page leads to a -graphical presentation of the model (see below), a -link checking tool and links to the classes and -properties.

+link-checker (more +information is available here).

+

During the development of the database emphasis is put on easy usage without +prior knowledge on data models or it ontologies.

+

For everyone interested, a graphical representation of the current data model +can be found by clicking the Model button on the start page. Furthermore, a +link checker that helps you find valid CIDOC CRM links as well as links to +all classes and properties is provided here.

../_images/openatlas_schema.png ../_images/openatlas_schema2.png -

Furthermore, it is possible to active Show CIDOC classes in the user -interface. This will displays the CIDOC class of an entity in the detail view -of a data base entry. -To do so click the gear symbol and choose profile. Go -to Display, press the Edit button and choose Show CIDOC classes.

-

While we try to only use CIDOC CRM classes and properties where possible -(instead of introducing own classes or using extensions), some shortcuts are -used to increase performance and to keep the code base maintainable. -For more information, see OpenAtlas shortcuts.

+

It is possible to show the CIDOC class of each entity in the detail view +of the user interface. To enable this, click the gear symbol and choose +profile. Go to Display, press the Edit button +and choose Show CIDOC classes.

+

Instead of introducing own classes or using extensions, OpenAtlas uses only +basic CIDOC CRM classes and properties wherever possible. In addition, some +shortcuts are used to increase performance and to keep the code base +maintainable. For more information, see +OpenAtlas shortcuts.

While OpenAtlas uses the CIDOC CRM within the application, a finer grained -model is needed to deal with any contextual differences needed for the user -interface. Therefore, e.g. -E33 - Lingustic Object can be a source -or a source translation with different forms in different context. -An overview of internal mapping and CIDOC CRM classes can be found here -here

+model is needed to deal with contextual differences in the user interface. +Therefore, E33 - Lingustic Object is +used as class for sources as well as source translations with different user +interface forms. +An overview of the internal mapping and CIDOC CRM classes can be found +here.

diff --git a/openatlas/static/manual/model/link_checker.html b/openatlas/static/manual/model/link_checker.html index d2ca75a19..5b46e0e0b 100644 --- a/openatlas/static/manual/model/link_checker.html +++ b/openatlas/static/manual/model/link_checker.html @@ -102,9 +102,9 @@

Link checker

With the link checker -you can test if certain class and property connections -are CIDOC CRM conform. It can be reached via the Model button at the -overview.

+the validity of CIDOC CRM class - property connections can be checked. The +link checker can also be accessed by clicking the Model button at the +overview page of each OpenAtlas instance.

diff --git a/openatlas/static/manual/model/openatlas_classes.html b/openatlas/static/manual/model/openatlas_classes.html index 68f091dde..1fef39b94 100644 --- a/openatlas/static/manual/model/openatlas_classes.html +++ b/openatlas/static/manual/model/openatlas_classes.html @@ -103,34 +103,42 @@

OpenAtlas classes

These special classes are used within the software to further refine -CIDOC CRM classes for the user interface.

-

All OpenAtlas classes can be mapped directly to the corresponding CIDOC CRM -classes. For all available classes and properties of CIDOC CRM (version 7.1.2) -see here.

+CIDOC CRM classes for the user interface. +While OpenAtlas uses the CIDOC CRM within the application, a finer grained +model is needed to deal with contextual differences in the user +interface. Therefore, +E33 - Lingustic Object is used as class +for sources as well as source translations with different user interface forms. +An overview of the internal mapping and CIDOC CRM classes can be found +here.

+

All of these so called OpenAtlas classes can be mapped directly to the +corresponding CIDOC CRM class. For all available classes and properties of +CIDOC CRM (version 7.1.2) see +the CIDOC CRM documentation.

Example: -The CIDOC class E18 - Physical Thing -“comprises all persistent physical items with a relatively stable form, -human-made or natural” (for more information see +E18 - Physical Thing “comprises all +persistent physical items with a relatively stable form, human-made or +natural” (for more information see CIDOC CRM documentation). In OpenAtlas E18 is used to represent place, stratigraphic unit, and -feature, which are all physical things according to -CIDOC CRM. +feature, which are all considered physical things +according to CIDOC CRM. To differentiate between those different entities, the corresponding OpenAtlas classes were created. While place, stratigraphic unit, and feature are all considered E18 and mapped to this CIDOC CRM class in the background of the application, the user interface -displays the OpenAtlas class name for user’s convenience and to avoid -confusion.

+displays the OpenAtlas class name and a corresponding, entity-specific form +for user’s convenience and to avoid confusion.

The same is true for bibliography, edition, external reference and file, which are all considered to be E31 - Documents in CIDOC CRM or the OpenAtlas classes source and source translation which correspond to the CIDOC class E33 - Linguistic object.

An overview of all OpenAtlas classes used and how they correspond to CIDOC CRM -classes can be found -here.

+classes can be found at the +demo.

diff --git a/openatlas/static/manual/model/openatlas_shortcuts.html b/openatlas/static/manual/model/openatlas_shortcuts.html index dfca213b5..968758bc3 100644 --- a/openatlas/static/manual/model/openatlas_shortcuts.html +++ b/openatlas/static/manual/model/openatlas_shortcuts.html @@ -103,14 +103,13 @@

OpenAtlas shortcuts

OpenAtlas uses several shortcuts in order to simplify connections between -entities that are always used the same way. All shortcuts can be resolved -according to CIDOC CRM specifications and are valid -links. These shortcuts are indicated by a preceding OA in combination with a -number. Currently OpenAtlas uses 3 shortcuts:

+entities that are continuously used in the same way. All shortcuts can be +resolved in accordance with the:doc:CIDOC CRM<cidoc_crm> specifications and +are valid links. These shortcuts are indicated by a preceding OA in +combination with a number. Currently OpenAtlas uses 3 shortcuts:

OA7 - has relationship to

-

OA7 is used to link two instances of E39 - Actor via -a certain relationship; in that way an actor can be linked with an actor. +

OA7 is used to link two instances of E39 - Actor E39 - Actor linked with E39 - Actor

    @@ -123,21 +122,21 @@

    OA7 - has relationship toE21)] participated in -(P11i) [Relationship from Stefan to +(P11i) [Relationship between Stefan and Joachim (E5)] had participant (P11 [Joachim (E21)]

    The connecting event is defined by an entity of class -E55: [Relationship from Stefan to Joachim +E55: [Relationship between Stefan and Joachim (E5)] has type (P2) [Son to Father (E55)]

OA8 - appears for the first time in

-

OA8 is used to link the beginning of a Persistent Item’s +

OA8 is used to link the beginning of a persistent item’s (E77) life -span (or time of usage) with a certain place. E.g to document the birthplace of +span (or time of usage) with a certain place, e.g to document a birthplace of a person.

E77 - Persistent Item linked with a E53 - Place.

@@ -152,17 +151,16 @@

OA8 - appears for the first time inE521 was brought into existence -by -(P92) [Birth of Albert Einstein -(E567)] took place at +by (P92) [Birth of Albert +Einstein (E567)] took place at (P7) [Ulm (E53)]

OA9 - appears for the last time in

-

OA9 is used to link the end of a Persistent Item’s +

OA9 is used to link the end of a persistent item’s (E77) life -span (or time of usage) with a certain place (E53). -E.g to document a person’s place of death. +span (or time of usage) with a certain place +(E53), e.g to document a person’s place of death. E77 - Persistent Item linked with a E53 - Place.

    @@ -183,12 +181,12 @@

    OA9 - appears for the last time in

    Dates

    -

    For dates, data is stored in the table model.entity respectively model.link in +

    Dates are stored in the table model.entity/model.link in the fields begin_from, begin_to, begin_comment, end_from, end_to, end_comment as timestamps. -Depending on class of the entity respectively the domain and range classes of -the link, these dates can be mapped as CIDOC CRM -E61 - Time Primitive entities.

    +Depending on the class of the entity as well as the domain and range of the +link, these dates can be mapped as CIDOC CRM +E61 - Time Primitive.

    E77 - Persistent Item

    E77 Persistent Item begin linked with a E61 Time Primitive:

    diff --git a/openatlas/static/manual/model/references.html b/openatlas/static/manual/model/references.html index 39245c5f4..206d937cd 100644 --- a/openatlas/static/manual/model/references.html +++ b/openatlas/static/manual/model/references.html @@ -109,14 +109,14 @@

    References
  • Documents (E31) such as files, bibliographic -entities or references like URLs, DOIs, etc.

  • +entities, or references like URLs, DOIs, etc.

  • Linguistic Objects (E33) such as the content of a medieval charter

In order to record which part of the document contains the respective reference a delimiter respectively a certain value to determine the position in the -reference, is stored along with the link between the entities. This can be page -numbers of a book, chapters, figure numbers etc.

+reference, is stored along with the link between the entities. This can be +a page numbers of a book, a chapter, a figure number, etc.

../_images/references.png
E31(Document) - P67(refers to) - E21(Person) at delimiter: "Folio 7v"
 
@@ -134,8 +134,7 @@

Reference SystemsE32).

-

Users can define a reference system respectively authority document by defining -a name, class, and description.

+

Users can define a reference system by defining a name, class, and description.

Example:

The link between an entity and the Authority Document is stored in the model.link table in the following way:

@@ -156,12 +155,13 @@

Reference SystemsE32 and delimiter -could furthermore be resolved as E31 Document as -it is a unique reference documenting the entity while the E32 alone is the -container for all possible references from this authority document.

+can be resolved as E31 Document as it is a +unique reference documenting the entity while the E32 by itself can be +considered as container for all possible references from this authority +document.

../_images/reference_system.png
E21(Person) - P67i(is referred to by) - E31(Document) - P71(is listed in) -
 E32(Authority Document)
@@ -174,25 +174,26 @@ 

Reference SystemsE31 Document)] is listed in (P71i)[WikiData (E32)]

+

For more information on reference systems see the following links: +References Systems and Reference System.

References and Files

Various entities can be connected to files. This is mapped as:

E31 (Document = file) - refers to (P67) - E1

-

Files can refer to any of the “top level” entities and can -(but need not necessarily) be images. Files are stored with a certain +

Files can refer to any of the “top level” entities and can be +(but don’t have to be) images. Files are stored with a certain system type (i.e. file). If the file is an image, this is most probably a depiction of the entity.

-

A file can also have a further reference - e.g. the source where the file comes -from. This can be a bibliographical reference to the publication -where a file (e.g. a scanned image) is extracted from. In this case there is a -link between a document E31 with a type -“Bibliography” (or sub type) via P67 to +

A file can be linked to a reference, such as a bibliographical reference to +the publication the file originates from. +In this creates a link between a document E31 +and a type “Bibliography” via P67 to another document E31 with a system type “file”. In this case the file is not the depiction of the reference but the reference is the origin of the file. This is mostly needed to document the copyright -respectively right holder or source of the file.

+respectively right holder or source of a file.

diff --git a/openatlas/static/manual/searchindex.js b/openatlas/static/manual/searchindex.js index d38eed08f..69528e7f1 100644 --- a/openatlas/static/manual/searchindex.js +++ b/openatlas/static/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["admin/api", "admin/arche", "admin/content", "admin/data_integrity_checks", "admin/execute_sql", "admin/export", "admin/general", "admin/iiif", "admin/import", "admin/index", "admin/mail", "admin/map", "admin/modules", "admin/presentation_site", "admin/user", "admin/vocabs", "entity/actor", "entity/artifact", "entity/event", "entity/feature", "entity/file", "entity/human_remains", "entity/index", "entity/navigation", "entity/place", "entity/reference", "entity/reference_system", "entity/source", "entity/stratigraphic_unit", "entity/type", "examples/archaeological_data", "examples/artifacts", "examples/index", "examples/journey", "examples/letters", "examples/move_event", "examples/places", "examples/profession", "examples/reference_systems", "examples/time_spans", "examples/types", "faq", "features", "index", "model/cidoc_crm", "model/index", "model/link_checker", "model/openatlas_classes", "model/openatlas_shortcuts", "model/references", "overview", "technical/api", "technical/application_structure", "technical/database_structure", "tools/anthropological_analyses", "tools/image_annotation", "tools/index", "tools/map", "tools/network", "tools/notes", "tools/profile", "tools/radiocarbon_dating", "tools/search", "troubleshooting/display", "troubleshooting/error_codes", "troubleshooting/index", "troubleshooting/login", "ui/alias", "ui/date", "ui/description", "ui/form", "ui/menu", "ui/name", "ui/table"], "filenames": ["admin/api.rst", "admin/arche.rst", "admin/content.rst", "admin/data_integrity_checks.rst", "admin/execute_sql.rst", "admin/export.rst", "admin/general.rst", "admin/iiif.rst", "admin/import.rst", "admin/index.rst", "admin/mail.rst", "admin/map.rst", "admin/modules.rst", "admin/presentation_site.rst", "admin/user.rst", "admin/vocabs.rst", "entity/actor.rst", "entity/artifact.rst", "entity/event.rst", "entity/feature.rst", "entity/file.rst", "entity/human_remains.rst", "entity/index.rst", "entity/navigation.rst", "entity/place.rst", "entity/reference.rst", "entity/reference_system.rst", "entity/source.rst", "entity/stratigraphic_unit.rst", "entity/type.rst", "examples/archaeological_data.rst", "examples/artifacts.rst", "examples/index.rst", "examples/journey.rst", "examples/letters.rst", "examples/move_event.rst", "examples/places.rst", "examples/profession.rst", "examples/reference_systems.rst", "examples/time_spans.rst", "examples/types.rst", "faq.rst", "features.rst", "index.rst", "model/cidoc_crm.rst", "model/index.rst", "model/link_checker.rst", "model/openatlas_classes.rst", "model/openatlas_shortcuts.rst", "model/references.rst", "overview.rst", "technical/api.rst", "technical/application_structure.rst", "technical/database_structure.rst", "tools/anthropological_analyses.rst", "tools/image_annotation.rst", "tools/index.rst", "tools/map.rst", "tools/network.rst", "tools/notes.rst", "tools/profile.rst", "tools/radiocarbon_dating.rst", "tools/search.rst", "troubleshooting/display.rst", "troubleshooting/error_codes.rst", "troubleshooting/index.rst", "troubleshooting/login.rst", "ui/alias.rst", "ui/date.rst", "ui/description.rst", "ui/form.rst", "ui/menu.rst", "ui/name.rst", "ui/table.rst"], "titles": ["API", "ARCHE", "Content", "Data integrity checks", "Execute SQL", "Export", "General", "IIIF", "Import", "Admin", "Mail", "Map", "Modules", "Presentation site", "User", "Vocabs", "Actor", "Artifact", "Event", "Feature", "File", "Human remains", "Entity", "<no title>", "Place", "Reference", "Reference System", "Source", "Stratigraphic unit", "Type", "Archaeological data", "Artifacts", "Examples", "Journey", "Letters", "Move events", "Places", "Profession", "References Systems", "Time Spans", "Types", "FAQ", "Features", "OpenAtlas manual", "CIDOC CRM", "Model", "Link checker", "OpenAtlas classes", "OpenAtlas shortcuts", "References", "Overview", "API", "Application Structure", "Database Structure", "Anthropological Analyses", "Image annotation", "Tools", "Map", "Network visualization", "Notes", "Profile", "Radiocarbon Dating", "Search", "Display Errors", "Error Codes", "Troubleshooting", "Login", "Alias", "Date", "Description", "Form", "Menu", "Name", "Table"], "terms": {"descript": [0, 1, 8, 12, 16, 17, 18, 19, 20, 21, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 41, 44, 48, 49, 51, 55, 57, 62, 70, 73], "public": [0, 7, 26, 43, 49, 51, 53, 59], "default": [0, 3, 6, 7, 8, 11, 12, 14, 15, 20, 29, 38, 39, 52, 57, 58, 59, 60], "off": [0, 73], "If": [0, 1, 3, 4, 8, 13, 15, 17, 20, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 49, 51, 57, 58, 62, 66, 68], "turn": [0, 39, 66, 68], "file": [0, 1, 5, 7, 8, 9, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 35, 42, 43, 47, 52, 55, 57, 60], "licens": [0, 1, 20, 26, 41], "can": [0, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 22, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 54, 55, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 71, 73], "still": [0, 18, 41, 51, 60], "access": [0, 4, 7, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 40, 42, 43, 54, 60, 61, 64], "A": [0, 1, 3, 4, 5, 13, 15, 16, 17, 19, 20, 21, 24, 26, 28, 29, 30, 31, 35, 36, 40, 41, 44, 49, 50, 51, 52, 63, 69], "browser": [0, 6, 20, 51, 52, 58], "us": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 62, 63, 64, 67, 68, 69, 70, 72, 73], "b": 0, "log": [0, 2, 6, 14, 50, 60, 63], "user": [0, 1, 3, 5, 6, 8, 9, 10, 12, 15, 26, 29, 30, 33, 34, 35, 36, 38, 40, 45, 47, 49, 51, 52, 53, 59, 60, 64, 71], "ip": 0, "request": [0, 6, 51, 64, 66], "comput": [0, 20], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 68, 72], "whitelist": 0, "link": [0, 1, 2, 5, 8, 9, 13, 15, 22, 26, 30, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 48, 49, 50, 51, 53, 55, 57, 58, 60, 63, 64, 66, 71], "without": [0, 7, 8, 9, 10, 18, 36, 41, 44, 45, 51, 58, 62], "being": [0, 26, 41], "thi": [0, 3, 4, 5, 7, 8, 13, 14, 16, 17, 18, 20, 22, 24, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51, 52, 54, 55, 57, 58, 61, 62, 63, 64, 65, 68], "might": [0, 3, 4, 16, 29, 35, 39, 41], "you": [0, 3, 4, 7, 8, 11, 12, 14, 15, 20, 22, 24, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 46, 51, 52, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 71, 73], "want": [0, 3, 8, 29, 30, 31, 39, 40, 41, 58], "allow": [0, 3, 6, 15, 18, 20, 39, 41, 42, 51, 55, 62, 72], "other": [0, 3, 8, 14, 16, 18, 20, 24, 26, 30, 31, 33, 35, 36, 38, 41, 42, 44, 51, 52, 58, 59, 60], "system": [0, 5, 9, 14, 16, 17, 18, 21, 22, 24, 29, 32, 41, 42, 43, 44, 45, 53, 68, 69], "your": [0, 1, 3, 4, 8, 20, 32, 35, 36, 38, 39, 41, 50, 51, 57, 58, 59, 60, 64, 66, 73], "data": [0, 4, 5, 8, 9, 14, 19, 21, 22, 24, 26, 28, 29, 32, 33, 34, 35, 36, 38, 39, 40, 43, 44, 45, 48, 51, 53, 57, 58, 59, 61, 62, 69, 70], "restrict": [0, 39, 41, 64], "resourc": [1, 38, 49], "centr": 1, "human": [1, 8, 16, 17, 18, 22, 24, 28, 31, 42, 43, 44, 47, 51, 54], "servic": [1, 15, 26, 42], "aim": 1, "offer": [1, 8, 42, 55], "stabl": [1, 47, 51], "persist": [1, 47], "host": [1, 10, 26], "well": [1, 21, 24, 30, 36, 39, 40, 41, 42, 44, 71], "dissemin": 1, "digit": [1, 7, 22, 39, 42, 44, 49], "research": [1, 29, 42, 61], "In": [1, 3, 5, 7, 14, 19, 20, 21, 24, 25, 28, 30, 33, 34, 36, 37, 39, 41, 42, 47, 49, 51, 54, 55, 56, 61, 63, 65], "order": [1, 15, 30, 33, 35, 42, 48, 49], "import": [1, 3, 9, 14, 34, 36, 41, 42, 43, 44, 45, 52, 53, 56, 60, 72], "openatla": [1, 3, 5, 7, 8, 13, 15, 18, 19, 20, 21, 24, 26, 28, 29, 30, 35, 37, 38, 41, 42, 44, 45, 49, 51, 52, 53, 63, 68], "chang": [1, 6, 10, 18, 20, 26, 29, 30, 31, 33, 36, 40, 41, 51, 56, 57, 58], "instanc": [1, 7, 8, 10, 15, 20, 29, 38, 42, 44, 48, 51, 52, 53], "product": [1, 10, 15, 17, 20, 21, 31, 51, 54], "py": [1, 10, 15, 20, 44, 51, 52], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, 64, 66, 68, 69, 70, 72, 73], "need": [1, 15, 29, 31, 41, 45, 49, 51, 52, 57], "ask": [1, 22, 41], "administr": [1, 8, 36], "further": [1, 8, 30, 31, 34, 36, 38, 40, 47, 49, 51, 57], "detail": [1, 3, 6, 8, 13, 14, 16, 17, 18, 20, 22, 23, 24, 25, 26, 27, 29, 40, 41, 42, 44, 45, 51, 55, 58, 68], "id": [1, 8, 13, 36, 38, 49, 51, 57, 61, 64], "0": [1, 39, 41, 51, 54, 68], "top": [1, 2, 15, 41, 44, 49, 57, 58, 60, 63, 71, 73], "collect": [1, 15, 39], "project": [1, 3, 9, 13, 20, 26, 32, 39, 40, 42, 43, 53, 60, 66], "acdh": [1, 15], "topcollect": 1, "url": [1, 7, 11, 13, 15, 20, 25, 26, 38, 41, 44, 49, 52], "http": [1, 7, 13, 15, 26, 38, 44, 51], "curat": 1, "dev": 1, "oeaw": 1, "ac": 1, "base": [1, 15, 21, 26, 36, 38, 42, 45, 48, 51, 53, 57, 68], "get": [1, 7, 8, 33, 36, 37, 38, 44, 59, 66], "The": [1, 3, 5, 7, 8, 10, 16, 18, 20, 22, 24, 26, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 48, 49, 50, 51, 52, 54, 55, 57, 64, 71, 72], "button": [1, 3, 5, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 51, 54, 55, 57, 58, 60, 61, 66, 71, 73], "displai": [1, 2, 3, 4, 6, 8, 10, 13, 14, 15, 20, 25, 26, 29, 36, 38, 40, 43, 45, 47, 50, 51, 52, 56, 59, 61, 65, 73], "admin": [1, 4, 5, 8, 13, 14, 15, 20, 26, 38, 43, 51, 57, 59, 60], "menu": [1, 7, 20, 22, 27, 29, 30, 31, 33, 34, 35, 36, 40], "onli": [1, 3, 4, 6, 7, 8, 14, 15, 16, 19, 20, 26, 29, 38, 39, 40, 41, 45, 48, 51, 55, 57, 58, 59, 61, 62, 64, 68], "mention": [1, 16, 17, 20, 21, 30], "abov": [1, 3, 31, 35, 42, 60, 63], "made": [1, 10, 17, 31, 33, 36, 40, 41, 47, 52], "click": [1, 3, 4, 5, 14, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 50, 54, 55, 57, 60, 66, 68, 73], "section": [1, 39, 51], "provid": [1, 7, 8, 15, 20, 25, 26, 39, 41, 51, 54, 60, 61, 62, 63, 64], "part": [1, 3, 17, 18, 19, 21, 27, 28, 33, 39, 41, 49, 55, 59], "manag": [1, 5, 8, 14, 15, 26, 29, 38, 43, 52, 59, 60, 66, 68], "group": [1, 8, 9, 15, 16, 17, 18, 21, 26, 29, 31, 33, 35, 36, 37, 38, 40, 41, 42, 53, 55, 64], "list": [1, 3, 5, 8, 16, 17, 18, 20, 23, 24, 25, 26, 27, 30, 31, 33, 34, 35, 36, 38, 41, 42, 49, 50, 51, 55], "tabl": [1, 6, 8, 14, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 42, 48, 49, 50, 60, 72], "artifact": [1, 3, 8, 15, 16, 18, 21, 22, 24, 27, 28, 29, 32, 33, 35, 39, 40, 43, 55, 71], "wa": [1, 8, 16, 17, 18, 22, 29, 31, 35, 36, 39, 45, 48, 51, 52, 55, 60, 66, 68], "shown": [1, 3, 4, 5, 8, 13, 20, 25, 26, 29, 36, 38, 41, 58, 60, 68], "all": [1, 5, 8, 10, 11, 14, 15, 20, 29, 30, 31, 33, 34, 36, 38, 39, 40, 41, 44, 47, 48, 49, 51, 52, 60, 63, 69], "metadata": 1, "gather": 1, "exif": 1, "endpoint": [1, 15, 43], "first": [1, 3, 4, 8, 10, 20, 21, 22, 30, 31, 36, 39, 42, 51, 68], "imag": [1, 6, 7, 18, 30, 31, 41, 43, 49, 52, 53, 56, 57, 58, 60], "2_jpg": 1, "addition": [1, 35, 62], "correspond": [1, 3, 7, 8, 26, 29, 36, 38, 39, 47, 60], "png": [1, 7, 20, 58], "4_orthophoto": 1, "taken": [1, 48], "necessari": [1, 20, 29, 30, 38, 40, 41, 49, 61], "new": [1, 8, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 29, 33, 34, 37, 41, 55, 56, 60, 66], "person": [1, 3, 4, 8, 16, 17, 18, 21, 22, 26, 31, 33, 34, 35, 37, 41, 42, 49, 55, 59, 60, 62], "etc": [1, 3, 6, 19, 21, 24, 28, 30, 37, 45, 49, 51, 52, 71], "ad": [1, 14, 15, 18, 21, 26, 29, 31, 35, 38, 39, 40, 43, 51, 55, 56, 59, 61, 62], "dure": [1, 3, 18, 25, 31, 45], "process": [1, 5, 6, 8, 20, 41, 52], "custom": [1, 5, 8, 14, 15, 20, 30, 40, 43], "hierarchi": [1, 5, 9, 15, 18, 24], "relev": [1, 30], "actor": [1, 17, 18, 20, 21, 22, 24, 25, 27, 29, 31, 34, 35, 37, 39, 43, 44, 48, 60, 67, 68], "e21": [1, 16, 49], "involv": [1, 9, 18, 30, 31, 33, 34], "e65": [1, 18], "creation": [1, 6, 30, 34, 38, 40], "p": [1, 44], "cidoc_ent": 1, "e12": [1, 18, 48], "event": [1, 3, 16, 17, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 32, 39, 43, 48], "addit": [1, 14, 30, 33, 36, 38, 39, 41, 42, 51, 54, 59, 68, 69], "copyright": [1, 49], "name": [1, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 44, 47, 48, 49, 60, 62, 70, 73], "e22": [1, 17, 48], "object": [1, 7, 17, 21, 27, 31, 34, 36, 42, 45, 47, 49, 57], "graffito": 1, "iptc": 1, "objectnam": 1, "xmp": 1, "p67": [1, 49], "e32": [1, 26, 49], "e53": [1, 24, 48], "place": [1, 3, 9, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31, 32, 33, 34, 35, 39, 40, 41, 42, 43, 44, 47, 48, 49, 51, 57, 60, 62, 63, 67, 71], "locat": [1, 16, 18, 19, 24, 34, 35, 36, 42, 44, 51, 52, 57, 66], "p53": 1, "gpslatitud": 1, "gpslongitud": 1, "date": [1, 5, 9, 14, 16, 17, 18, 19, 21, 24, 28, 29, 30, 31, 33, 34, 35, 36, 37, 40, 43, 56, 60, 62, 63, 70], "created": 1, "p11": [1, 44, 48], "p108": 1, "p14": 1, "p92": [1, 48], "e31": [1, 20, 25, 47, 49], "document": [1, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33, 47, 48, 49, 51, 67, 69], "p2": [1, 44, 48], "artist": 1, "cutomis": 2, "text": [2, 5, 8, 14, 25, 27, 29, 31, 33, 34, 35, 36, 38, 39, 40, 43, 55, 57, 62, 68], "avail": [2, 4, 5, 7, 8, 12, 15, 16, 26, 30, 34, 35, 36, 37, 38, 40, 42, 43, 44, 47, 49, 51, 57, 58, 62, 73], "languag": [2, 6, 15, 36, 60, 71], "intro": 2, "start": [2, 3, 5, 8, 18, 26, 33, 34, 35, 36, 38, 39, 43, 45, 63, 71], "page": [2, 4, 8, 12, 13, 16, 17, 18, 20, 23, 24, 25, 26, 27, 31, 35, 38, 39, 40, 44, 45, 49, 50, 51, 54, 58, 60, 63, 64, 71, 73], "befor": [2, 3, 8, 29, 30, 34, 39, 51, 58, 68], "contact": [2, 10, 66], "site": [2, 6, 9, 19, 20, 31, 41, 43, 51, 55, 59, 60, 63, 64], "e": [2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 48, 49, 51, 52, 53, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "g": [2, 3, 4, 5, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 48, 49, 51, 52, 53, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "inform": [2, 3, 6, 8, 14, 17, 18, 20, 21, 22, 24, 26, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 54, 57, 60, 61, 68, 69], "websit": [2, 13, 25, 26, 38, 43, 52, 53], "maintain": [2, 42, 45], "legal": 2, "notic": [2, 6, 51], "about": [2, 4, 8, 14, 26, 35, 36, 41, 43, 68], "institut": [2, 16, 37], "citat": [2, 16, 17, 18, 19, 30], "exampl": [2, 3, 5, 8, 10, 13, 16, 18, 21, 22, 24, 26, 27, 28, 29, 31, 34, 35, 36, 38, 39, 42, 43, 47, 48, 49, 51, 52, 57, 68], "underneath": 2, "form": [2, 9, 10, 26, 33, 35, 36, 37, 38, 39, 40, 41, 45, 47, 51, 52, 55, 60, 61, 68], "field": [2, 9, 26, 31, 36, 37, 38, 40, 42, 43, 48, 55, 57, 60, 61, 68, 70, 71, 72, 73], "an": [2, 3, 4, 5, 6, 7, 8, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 35, 36, 37, 38, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 55, 57, 58, 59, 60, 61, 64, 68, 70, 72], "insert": [2, 4, 14, 25, 30, 31, 33, 34, 35, 36, 38, 40, 57, 60], "updat": [2, 3, 4, 8, 14, 25, 26, 29, 57, 60], "edit": [2, 9, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 36, 37, 38, 39, 40, 42, 45, 47, 55, 60, 61, 62, 64], "bibliographi": [2, 25, 31, 47, 49], "entri": [2, 3, 8, 14, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 45, 50, 58, 60, 70, 72, 73], "cogwheel": 2, "icon": [2, 20, 26, 29, 57, 60], "right": [2, 8, 29, 49, 51, 57, 58, 60, 71, 72, 73], "corner": [2, 57, 71], "thei": [2, 3, 8, 18, 20, 21, 26, 28, 29, 33, 34, 40, 41, 44, 47, 49, 51, 54, 57, 59, 62, 63, 72], "contain": [2, 5, 8, 26, 28, 49, 52, 62, 71, 73], "put": [3, 33, 38, 39, 41, 45], "great": 3, "emphasi": [3, 42, 45], "qualiti": [3, 7, 29, 42], "even": [3, 8, 60, 62], "respons": [3, 20, 41, 51], "enter": [3, 6, 8, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 42, 43, 50, 51, 55, 57, 60, 66, 68], "ultim": 3, "li": [3, 39], "individu": [3, 21, 30, 54], "avoid": [3, 41, 47], "inconsist": 3, "technic": [3, 41, 44], "level": [3, 6, 11, 14, 30, 42, 49, 58, 60, 61], "develop": [3, 20, 41, 42, 43, 44, 45, 51], "applic": [3, 4, 26, 31, 38, 40, 42, 43, 45, 47, 51, 57], "It": [3, 8, 18, 20, 24, 26, 28, 29, 31, 33, 34, 35, 39, 41, 44, 46, 51, 62, 63, 71, 72], "therefor": [3, 18, 20, 26, 29, 31, 41, 45, 54], "possibl": [3, 9, 18, 20, 24, 28, 29, 31, 33, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 49, 51, 54, 57, 61, 71], "after": [3, 4, 6, 9, 10, 20, 31, 34, 35, 36, 40, 51, 57, 61, 63, 66], "end": [3, 8, 13, 16, 33, 34, 35, 36, 39, 44, 48, 51, 62, 68], "same": [3, 8, 19, 21, 28, 32, 33, 34, 37, 41, 47, 48], "nevertheless": [3, 44, 45], "mistak": [3, 66], "happen": [3, 18, 33, 68], "also": [3, 8, 10, 20, 26, 30, 31, 33, 36, 38, 39, 40, 41, 42, 44, 45, 48, 49, 55, 58, 62, 66, 71], "when": [3, 5, 8, 14, 20, 26, 29, 31, 34, 36, 38, 40, 41, 44, 50, 51, 57, 58, 59, 60, 62, 66, 68], "from": [3, 8, 9, 10, 15, 18, 20, 22, 26, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 48, 49, 51, 52, 54, 57, 60, 62, 68], "delet": [3, 4, 5, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 36, 55, 59], "outsid": 3, "function": [3, 4, 8, 10, 11, 26, 36, 37, 42, 49, 52, 53], "were": [3, 6, 18, 20, 29, 33, 47, 54, 60], "implement": [3, 41, 42, 49], "describ": [3, 30, 31, 33, 34, 36, 37, 51], "below": [3, 4, 14, 24, 30, 31, 37, 42, 45, 52, 55, 66, 73], "here": [3, 8, 12, 18, 26, 29, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 52, 55, 60, 63, 64, 65, 68], "unlink": 3, "These": [3, 7, 29, 33, 42, 47, 48, 54], "so": [3, 4, 8, 20, 22, 30, 31, 36, 39, 41, 44, 45, 51, 52, 58, 68], "call": [3, 19, 41, 51, 52, 54], "could": [3, 38, 41, 49, 68, 72], "result": [3, 5, 9, 13, 37, 41, 42, 51, 54, 57, 58, 61, 62, 68], "bug": [3, 63, 64], "seem": 3, "appear": [3, 5, 29, 38, 54], "regularli": 3, "known": [3, 8, 31, 36, 39, 42, 57], "pleas": [3, 8, 15, 18, 20, 21, 24, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 51, 57, 63, 64, 65, 66], "report": [3, 63, 65], "issu": [3, 51, 56, 65], "team": [3, 20, 32, 41, 44], "via": [3, 8, 12, 30, 33, 35, 36, 37, 39, 42, 43, 45, 46, 48, 49, 51, 53, 54, 55], "redmin": [3, 43], "have": [3, 6, 7, 8, 13, 18, 20, 24, 26, 29, 30, 31, 33, 34, 38, 39, 40, 41, 44, 45, 49, 51, 57, 60, 62, 63, 64], "relat": [3, 16, 18, 20, 33, 36, 42, 44, 52, 53, 66], "Of": [3, 41], "cours": [3, 22, 41, 57], "normal": [3, 44], "set": [3, 6, 7, 8, 10, 12, 14, 26, 29, 32, 36, 38, 41, 42, 51, 53, 57, 58, 59, 62, 66, 71], "should": [3, 7, 8, 20, 29, 34, 38, 39, 51, 58, 63], "correct": [3, 8, 20, 36, 41], "accid": 3, "creat": [3, 4, 5, 7, 8, 9, 13, 14, 17, 18, 22, 24, 26, 28, 29, 30, 31, 34, 37, 41, 47, 51, 57, 60, 62, 68], "associ": [3, 8, 14, 24], "been": [3, 7, 36, 44], "pre": [3, 26, 29], "instal": [3, 7, 26, 29, 41, 44, 51, 52], "never": 3, "most": [3, 18, 22, 41, 49, 51, 52, 66, 68], "like": [3, 8, 13, 22, 24, 29, 40, 41, 49, 52, 54, 63, 69], "caus": [3, 8], "dataset": [3, 26, 49], "themselv": [3, 19, 28, 45], "There": [3, 8, 40, 41, 44, 60, 63, 69], "three": 3, "option": [3, 7, 9, 14, 20, 26, 29, 31, 36, 41, 56, 57, 60, 62, 69], "proce": [3, 8, 66], "relink": 3, "add": [3, 7, 8, 14, 16, 17, 18, 19, 25, 26, 27, 29, 30, 33, 34, 35, 36, 37, 38, 39, 41, 51, 59, 60, 61, 69], "between": [3, 18, 31, 33, 39, 40, 45, 47, 48, 49, 54, 58], "remov": [3, 26], "whole": [3, 8, 27, 49], "featur": [3, 4, 8, 11, 17, 21, 22, 24, 26, 28, 29, 31, 39, 43, 47, 54, 55, 60, 63], "connect": [3, 24, 28, 30, 31, 37, 39, 41, 44, 46, 48, 49, 51, 57, 58], "itself": [3, 21, 28, 30, 39, 41], "ha": [3, 4, 6, 7, 8, 15, 20, 24, 26, 30, 31, 36, 41, 44, 51, 58], "marri": [3, 16], "themself": 3, "super": [3, 8, 17, 29, 40, 44], "shouldn": [3, 64], "t": [3, 4, 5, 8, 14, 18, 20, 43, 44, 55, 59, 63, 64, 65, 66, 68, 72], "within": [3, 8, 15, 17, 26, 32, 37, 39, 42, 44, 45, 47, 57], "": [3, 4, 5, 13, 18, 24, 28, 29, 30, 31, 33, 38, 40, 41, 42, 47, 48, 52, 54, 72], "databas": [3, 4, 8, 9, 19, 21, 26, 28, 30, 31, 33, 35, 38, 41, 42, 43, 44, 49, 52, 68], "through": [3, 8, 18, 20, 26, 44, 51], "find": [3, 8, 21, 26, 32, 35, 36, 40, 41, 42, 43, 52, 62, 65, 68, 71, 72], "previou": [3, 51], "view": [3, 6, 8, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 34, 36, 37, 45, 51, 52, 55, 57, 58, 59, 60], "variou": [3, 24, 26, 30, 35, 36, 42, 49], "tab": [3, 6, 7, 26, 30, 31, 33, 34, 35, 37, 51, 55, 57, 59], "combin": [3, 8, 26, 38, 42, 44, 48, 49, 57], "begin": [3, 4, 5, 8, 16, 31, 34, 39, 48, 62, 68], "That": 3, "later": [3, 8, 30, 31, 41], "than": [3, 8, 24, 31, 41, 58], "fix": [3, 4, 8, 51, 63], "otherwis": 3, "interfac": [3, 29, 30, 45, 47, 51, 60, 64, 71], "won": [3, 8, 20, 41, 59], "soon": 3, "incompat": 3, "particip": [3, 16, 18, 22, 31, 33, 44, 48], "longer": [3, 43], "last": [3, 4, 14, 36, 62], "chain": 3, "succeed": 3, "show": [3, 8, 9, 20, 26, 36, 39, 41, 45, 51, 58, 59, 60, 62, 63, 66, 68, 73], "hierarch": [3, 29, 40], "began": 3, "everi": [3, 4, 7, 29, 30, 41], "its": [3, 17, 24, 29, 30, 34, 39, 40, 45, 51, 57, 58], "cidoc": [3, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 33, 42, 43, 45, 46, 47, 48, 52, 53, 60, 67, 68, 69], "valid": [3, 6, 8, 15, 26, 42, 48, 51, 57, 68], "amount": [3, 60, 61, 73], "take": [3, 4, 5, 8, 18, 54], "some": [3, 4, 5, 26, 29, 32, 38, 39, 41, 44, 45, 51, 52, 57, 58, 63, 64], "time": [3, 4, 5, 8, 20, 31, 32, 33, 34, 41, 44, 51, 60, 62, 68, 73], "while": [3, 25, 42, 45, 47, 49, 51, 54], "alwai": [3, 8, 48], "conform": [3, 45, 46], "found": [3, 8, 24, 29, 31, 35, 36, 38, 39, 40, 44, 45, 47, 51, 62, 71], "problem": [3, 8, 24, 41, 65, 66], "resolv": [3, 13, 26, 38, 48, 49, 52], "origin": [3, 9, 49, 60], "sourc": [3, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 35, 39, 43, 45, 47, 49, 51, 52, 71], "two": [3, 8, 39, 41, 48, 51], "test": [3, 4, 7, 10, 46, 52], "ident": 3, "afterward": [3, 29, 30, 33], "case": [3, 4, 7, 8, 18, 20, 25, 29, 30, 31, 33, 36, 39, 43, 49, 51, 52, 56, 59, 60, 62, 63, 65, 66], "singl": [3, 15, 16, 29, 40, 51], "multipl": [3, 4, 7, 8, 15, 20, 29, 30, 33, 36, 40, 42, 43, 49, 73], "castl": 3, "citi": [3, 24, 26], "one": [3, 4, 8, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 41, 48, 51, 58, 60, 62, 68, 72], "would": [3, 8, 13, 19, 24, 26, 30, 31, 34, 41, 44, 63], "automat": [3, 4, 6, 8, 9, 20, 26, 41, 45, 66, 68], "anyon": 3, "given": [3, 8, 15, 18, 39, 42, 51, 54, 61], "look": [3, 8, 13, 18, 24, 26, 33, 35, 41, 44], "wrong": 3, "ones": [3, 33, 36, 37, 60], "next": [3, 22, 30, 40], "column": [3, 8, 57], "By": [3, 26, 30, 31, 35, 36, 39, 40, 57], "due": [3, 39, 42], "reoccur": 3, "search": [3, 6, 8, 26, 36, 42, 43, 51, 56, 69, 71, 72, 73], "select": [3, 4, 7, 8, 15, 18, 20, 26, 29, 30, 31, 34, 35, 36, 38, 39, 44, 51, 55, 58, 60, 62], "volum": 3, "follow": [3, 5, 7, 8, 13, 18, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 44, 49, 50, 51, 53, 54, 57, 61], "class": [3, 5, 9, 15, 26, 29, 38, 40, 41, 43, 45, 46, 48, 49, 52, 53, 58, 60, 62], "ratio": [3, 54], "how": [3, 6, 11, 26, 29, 30, 31, 33, 34, 35, 37, 43, 44, 45, 47, 52, 60], "100": [3, 36, 39], "mean": [3, 34, 41, 57], "fuzzywuzzi": 3, "packag": 3, "which": [3, 7, 8, 11, 15, 16, 17, 18, 21, 24, 25, 28, 29, 33, 35, 36, 38, 39, 40, 41, 42, 44, 47, 49, 51, 52, 55, 57, 58, 62, 63, 66, 68, 71, 72], "levenshtein": 3, "distanc": [3, 58], "direct": [4, 42, 44, 58], "warn": [4, 5, 8, 51, 63], "manipul": [4, 51, 57], "loss": [4, 7], "unus": 4, "backup": [4, 5, 8], "export": [4, 9, 14, 42, 43, 51, 52], "download": [4, 5, 49, 51, 56], "lose": 4, "crash": 4, "local": [4, 51], "version": [4, 7, 13, 33, 43, 44, 47], "note": [4, 7, 21, 30, 31, 33, 35, 36, 38, 39, 40, 42, 43, 44, 48, 50, 51, 53, 56], "recent": 4, "max": [4, 11, 20, 60], "dai": [4, 8, 39, 68], "old": [4, 36], "either": [4, 15, 20, 34, 39, 41, 51, 57, 66], "simpl": 4, "power": 4, "unlik": [4, 33], "rest": [4, 15, 51], "safeguard": 4, "prevent": 4, "total": [4, 20], "make": [4, 8, 13, 14, 18, 36, 42, 43, 60, 63, 66], "lost": [4, 8], "server": [4, 7, 41, 42, 51, 55], "depend": [4, 9, 33, 35, 36, 40, 41, 48, 54, 66], "situat": [4, 29, 41], "effort": [4, 42], "transact": [4, 8], "commit": 4, "build": [4, 19, 30, 36], "around": [4, 58], "statement": 4, "don": [4, 20, 41, 44, 64, 72], "refresh": [4, 39], "press": [4, 30, 31, 34, 36, 37, 40, 45, 61], "f5": [4, 63], "again": [4, 31, 66], "termin": 4, "queri": [4, 51], "row": [4, 6, 8, 39, 60, 68], "count": [4, 6, 41, 44], "veri": [4, 24, 32, 41, 63], "readabl": [4, 51, 58], "affect": 4, "error": [4, 6, 8, 43, 61, 65, 66], "noth": [4, 8, 63], "worri": [4, 41], "becaus": [4, 41, 44, 62, 63], "Be": [5, 7, 41, 51, 55, 58], "awar": [5, 7, 20, 41, 51, 55, 58], "especi": [5, 8, 41], "share": 5, "email": [5, 6, 10, 14, 53, 60, 66], "address": [5, 10, 13, 60], "includ": [5, 11, 18, 20, 35, 38, 41, 42, 49, 51, 60, 62], "save": [5, 14, 30, 31, 33, 34, 35, 36, 38, 61], "folder": [5, 7], "directori": [5, 7], "isn": [5, 66], "writabl": 5, "2018": 5, "08": [5, 48], "23_1533_export": 5, "exist": [5, 8, 13, 16, 19, 20, 24, 28, 29, 31, 37, 41, 44, 48, 51, 64, 66], "pg_dump": 5, "plain": 5, "format": [5, 7, 8, 26, 42, 43, 51, 69], "fill": [5, 8, 20, 24, 33, 38, 39, 40, 62, 68], "empti": [5, 10, 20, 44], "psql": 5, "archiv": [5, 20, 26, 41, 59], "fc": 5, "pg_restor": 5, "restor": 5, "regardless": 5, "oper": [5, 8], "line": [5, 36, 39, 51, 57, 69], "break": [5, 51, 69], "d": [5, 31, 38, 54], "1": [5, 8, 30, 39, 44, 47, 54, 68], "zip": 5, "sever": [5, 20, 31, 36, 41, 48], "entiti": [5, 8, 9, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 38, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 55, 58, 59, 60, 62, 64, 67], "divid": [5, 24, 42, 54], "properti": [5, 18, 45, 46, 47, 48, 53], "geometri": [5, 8, 36, 56], "current": [5, 7, 8, 26, 33, 42, 44, 48, 51, 57, 60, 63], "2022": [5, 51], "10": [5, 39, 48, 57], "04_1610": 5, "kei": [5, 44, 63], "tag": [5, 41, 51], "prefer": [6, 15, 42, 53, 60], "profil": [6, 8, 12, 14, 20, 39, 42, 43, 45, 51, 56, 57, 68, 73], "valu": [6, 9, 12, 13, 39, 40, 41, 49, 51, 54, 61, 62, 68], "choos": [6, 8, 15, 17, 20, 29, 30, 31, 34, 35, 36, 37, 38, 40, 45, 58], "much": [6, 7, 31, 45], "At": [6, 16, 17, 18, 20, 23, 24, 25, 27, 33, 41, 48, 55], "moment": [6, 39, 48, 58], "info": [6, 14, 20, 25], "minimum": 6, "jstree": 6, "charact": [6, 8, 69], "filter": [6, 41, 42, 51, 52, 62, 73], "tree": [6, 31, 41], "type": [6, 9, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 49, 54, 58, 72, 73], "random": 6, "password": [6, 10, 14, 15, 42, 56], "length": 6, "reset": [6, 10, 14, 42, 60], "upon": 6, "requir": [6, 8, 14, 20, 26, 33, 35, 36, 38, 41, 42, 51, 63, 70, 72], "confirm": [6, 42], "hour": [6, 60, 68], "long": [6, 20, 41, 73], "code": [6, 43, 44, 45, 51, 52, 65], "fail": [6, 66], "login": [6, 7, 10, 14, 43, 65], "often": [6, 22, 52], "attempt": 6, "specif": [6, 8, 20, 26, 29, 32, 37, 40, 41, 42, 43, 44, 48, 51, 53, 57, 66], "usernam": [6, 10, 11, 14, 15, 66], "forget": [6, 41], "minut": [6, 60, 66, 68], "mani": [6, 13, 20, 24, 26, 41, 44, 63], "wait": [6, 66], "chosen": [6, 8, 36, 38, 40, 41], "number": [6, 8, 26, 48, 49, 51, 66], "exceed": 6, "activ": [6, 14, 18, 20, 31, 42, 44, 45, 57, 60, 62, 63, 68], "preview": [6, 8], "open": [7, 26, 34, 35, 38, 41, 42, 43, 51, 55, 57], "standard": [7, 37, 40, 42, 44, 72], "deliv": [7, 42], "high": [7, 26, 38, 42, 57], "attribut": [7, 26, 41, 42], "onlin": [7, 38, 42], "scale": [7, 20, 42], "onc": [7, 55], "see": [7, 8, 14, 21, 22, 24, 28, 31, 33, 34, 35, 36, 37, 38, 40, 42, 45, 47, 51, 55, 58, 60, 63, 64, 66], "configur": [7, 13, 20, 52, 53, 55], "item": [7, 20, 27, 29, 40, 47], "enabl": [7, 8, 20, 26, 42, 55, 57, 58], "expos": 7, "checkbox": [7, 26, 29, 57, 66], "complet": 7, "api": [7, 9, 15, 20, 26, 41, 42, 43, 49, 52, 60], "yourserv": 7, "eu": [7, 13, 51], "manifest": [7, 42], "2": [7, 30, 39, 44, 47, 54], "path": [7, 51], "absolut": 7, "drop": [7, 20, 38, 58], "zone": 7, "var": 7, "www": [7, 15, 26, 38], "iipsrv": 7, "write": 7, "execut": [7, 9, 43, 52], "webserv": 7, "convers": 7, "control": [7, 15, 38, 51], "convert": [7, 55, 68], "pyramid": 7, "tiff": 7, "none": [7, 36, 41, 51, 53, 63], "deflat": 7, "lossless": 7, "size": [7, 20, 53], "mai": [7, 24, 39, 41, 44, 51, 52, 58, 63, 64], "larg": [7, 20, 36, 39, 58], "jpeg": [7, 20], "smaller": [7, 52], "transpar": 7, "run": [7, 8, 13, 41, 52], "sub": [7, 8, 9, 17, 18, 29, 33, 35, 44, 49], "accordingli": 7, "successfulli": 7, "bmp": [7, 20], "gif": [7, 20], "ico": [7, 20], "jpg": [7, 20], "svg": [7, 20], "tif": 7, "directli": [8, 30, 38, 41, 45, 47, 54], "csv": [8, 9, 42], "gi": 8, "unit": [8, 17, 19, 21, 22, 29, 36, 39, 43, 47, 48, 54, 61], "histor": [8, 22, 26, 36, 38, 39, 43], "regard": [8, 31, 38, 40, 53], "integr": [8, 9, 26, 43, 58], "caution": 8, "consum": 8, "we": [8, 41, 44, 45, 63], "strongli": 8, "advis": 8, "sql": [8, 9, 43, 52], "ani": [8, 30, 31, 41, 45, 49, 51], "older": [8, 63], "enforc": 8, "check": [8, 9, 10, 14, 26, 29, 35, 39, 42, 43, 45, 58, 60, 62], "alright": 8, "encapsul": 8, "script": [8, 44], "example_place_hierarchi": 8, "sure": [8, 36, 51, 63, 66, 68], "extens": [8, 20, 45, 51], "spell": [8, 39, 67], "correctli": [8, 39], "lower": [8, 24], "my_data": 8, "header": [8, 73], "each": [8, 15, 20, 21, 24, 39, 40, 42, 44, 49, 51, 54], "separ": [8, 41], "comma": 8, "enclos": 8, "doubl": [8, 36], "quot": 8, "To": [8, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 45, 47, 48, 51, 52, 57, 62, 67, 68, 73], "said": [8, 34], "titl": [8, 18, 51, 57], "messag": [8, 51, 63, 64, 66], "uniqu": [8, 26, 49], "per": [8, 73], "prefix": 8, "them": [8, 18, 22, 29, 32, 33, 36, 41, 44, 55, 60, 63], "person_1": 8, "place_1": 8, "underscor": 8, "_": 8, "hyphen": 8, "miss": [8, 9, 41, 44, 63, 68], "begin_from": [8, 48], "begin_to": [8, 48], "end_from": [8, 48], "end_to": [8, 48], "type_id": 8, "value_typ": 8, "reference_id": 8, "alreadi": [8, 13, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35, 38, 40, 41, 50, 55, 60, 68], "origin_reference_id": 8, "reference_system_": 8, "administrative_unit_id": 8, "historical_place_id": 8, "parent_id": 8, "openatlas_parent_id": 8, "openatlas_class": 8, "string": [8, 48, 69], "alias": [8, 60, 62, 67, 73], "semicolon": 8, "surround": 8, "yyyi": [8, 39, 62], "mm": [8, 39], "dd": [8, 39], "out": [8, 18, 29, 33, 36, 40, 41, 48, 51, 57, 62, 63, 68], "timefram": 8, "For": [8, 15, 18, 19, 21, 22, 24, 26, 28, 30, 33, 34, 35, 41, 45, 47, 48, 51, 54, 66, 68], "timespan": [8, 68], "more": [8, 18, 19, 20, 21, 24, 26, 28, 29, 30, 31, 33, 35, 36, 38, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 62], "keep": [8, 9, 14, 29, 31, 32, 35, 36, 37, 38, 41, 45, 69], "mind": [8, 9, 29, 31, 32, 35, 36, 37, 38, 41], "incorrect": 8, "red": 8, "advanc": [8, 14, 62, 63, 69], "studi": [8, 29, 43], "space": [8, 20, 24, 30], "1234": [8, 13], "13": [8, 51], "65": 8, "pair": 8, "56": 8, "78": 8, "wrap": 8, "cell": 8, "quotat": 8, "mark": [8, 20, 29, 36, 41, 55, 70, 72], "iv": 8, "542": 8, "34": 8, "23": [8, 39, 48, 68], "66": 8, "just": [8, 20, 51, 68], "5678": 8, "literature_1": 8, "book_2": 8, "multi": 8, "point": [8, 18, 33, 34, 35, 36, 51, 57], "polygon": [8, 36, 57], "linestr": [8, 36, 57], "geometriccollect": 8, "wgs84": [8, 57], "geodet": 8, "epsg": [8, 57], "4326": [8, 57], "sinc": [8, 44, 72], "tall": 8, "12": [8, 39, 48, 62, 68], "458533781141528": 8, "41": 8, "922205268362234": 8, "53062334955289": 8, "917606998887024": 8, "52169797441624": 8, "888476931243254": 8, "coulmn": 8, "append": 8, "reference_system_wikidata": 8, "occur": [8, 35, 51], "substitut": 8, "reference_system_getty_aat": 8, "consist": [8, 19, 21, 26, 28, 30, 39, 41, 42, 44], "identifi": [8, 14, 22, 26, 36, 60], "q54123": 8, "second": [8, 60, 68, 73], "match": [8, 26, 36, 38, 44, 57], "close_match": 8, "exact_match": 8, "gener": [8, 9, 18, 33, 43, 51, 52, 53, 56, 63, 68], "togeth": [8, 20, 41, 44], "stratigraph": [8, 17, 19, 21, 22, 24, 43, 47, 48, 54, 61], "remain": [8, 16, 17, 22, 24, 28, 43, 54], "declar": 8, "insensit": 8, "question": [8, 22, 41], "structur": [8, 19, 22, 28, 41, 42, 43, 51], "archaeolog": [8, 19, 21, 22, 24, 28, 31, 42, 43], "model": [8, 41, 43, 44, 46, 48, 49, 50, 52, 53, 55, 59], "ll": [8, 43, 66], "duplic": [8, 9, 41, 72], "sensit": [8, 62], "king": [8, 31, 38, 39], "arthur": 8, "print": [8, 49], "doesn": [8, 18, 64, 65, 66], "stop": 8, "went": [8, 33], "summari": [8, 27], "brows": [8, 14, 44, 45], "layout": [8, 20, 52], "did": 8, "good": [8, 20, 24, 30], "idea": 8, "doc": 8, "data_integrity_check": 8, "authent": [9, 10, 15, 43], "mail": [9, 14, 43], "modul": [9, 39, 43, 56, 57, 68], "map": [9, 17, 18, 19, 21, 22, 24, 26, 28, 30, 31, 35, 42, 43, 45, 47, 48, 49, 56, 60], "iiif": [9, 41, 43, 55], "content": [9, 25, 27, 34, 43, 49, 57, 63], "present": [9, 20, 34, 41, 42, 43, 45, 51, 57, 59], "orphan": [9, 58], "annot": [9, 43, 53, 56], "subunit": [9, 22, 27, 30], "circular": 9, "invalid": [9, 51], "preced": [9, 18, 33, 35, 39, 44, 48], "similar": [9, 26, 38, 41, 57, 68], "prepar": 9, "alia": [9, 16, 24, 30, 36, 70], "refer": [9, 14, 16, 17, 18, 19, 20, 21, 22, 24, 27, 28, 29, 30, 32, 34, 35, 39, 40, 41, 42, 43, 44, 45, 47, 53, 57], "wkt": [9, 56], "coordin": [9, 26, 36, 57], "extern": [9, 20, 25, 26, 31, 35, 38, 40, 41, 47, 51, 53], "dump": 9, "json": [9, 51], "xml": 9, "arch": [9, 20, 41, 43], "overview": [9, 13, 14, 20, 29, 35, 40, 43, 44, 45, 46, 47, 51, 52, 58, 59, 61], "fetch": 9, "reference_system": 9, "index": [9, 16, 17, 18, 20, 23, 24, 25, 27], "vocab": [9, 43], "vocabulari": [9, 38, 49], "ensur": [10, 20, 41], "disabl": [10, 11, 26], "leav": 10, "send": [10, 14, 35], "mail_password": 10, "smtp": 10, "net": [10, 13], "port": 10, "587": 10, "recipi": [10, 18], "feedback": [10, 63], "receiv": [10, 35, 60, 66], "zoom": [11, 36, 57, 58, 60], "defin": [11, 14, 20, 25, 33, 44, 48, 49, 52, 58, 60], "lowest": [11, 60], "adjust": [11, 12, 60], "far": [11, 60], "disableclusteringatzoom": 11, "cluster": [11, 36], "maxclusterradiu": 11, "maxim": 11, "rang": [11, 44, 48, 51, 61], "geonam": [11, 30, 38, 49, 56], "own": [12, 14, 16, 17, 21, 31, 36, 38, 41, 42, 45, 51], "wider": 13, "audienc": 13, "area": [13, 36, 54, 55, 57], "backend": [13, 53], "frontend": 13, "demo": [13, 51], "specifi": [13, 16, 20, 25, 29, 38, 39, 41, 42, 51], "newslett": [14, 42, 60], "subscript": 14, "registr": 14, "account": [14, 61], "sent": [14, 35], "cannot": [14, 26, 29, 35, 39, 64], "anymor": [14, 29, 64, 66], "inact": [14, 59], "modifi": [14, 18, 60], "full": [14, 36, 57, 60, 62], "easier": [14, 42, 60], "free": [14, 31, 33, 35, 36, 38, 39, 43, 49], "guest": 14, "who": [14, 16, 17, 21, 22, 33], "aren": [14, 20, 41, 68], "editor": [14, 20, 29, 40, 57, 60], "contributor": 14, "readonli": 14, "ye": 14, "skosmo": 15, "As": [15, 18, 31, 33, 35, 36, 38, 39, 45, 61], "ch": 15, "trail": 15, "slash": 15, "vocabs_pw": 15, "differ": [15, 18, 20, 30, 32, 33, 35, 36, 38, 40, 41, 42, 45, 47, 51, 58, 67, 69, 72], "confer": 15, "w3": 15, "org": [15, 26, 38, 51], "tr": 15, "sko": [15, 26, 38, 57], "primer": 15, "concept": [15, 26, 57], "child": 15, "conceptu": [15, 44, 45], "decid": [15, 40], "choic": [15, 29, 40], "what": [15, 58], "choosen": 15, "e74": 16, "albert": [16, 48], "einstein": [16, 48], "queen": 16, "victoria": 16, "peopl": [16, 18, 41], "famili": 16, "tribe": 16, "greenpeac": 16, "nation": 16, "museum": [16, 17, 21, 26, 31, 38, 44], "denmark": 16, "resid": 16, "main": [16, 41, 44, 53, 71], "born": [16, 48], "where": [16, 18, 22, 29, 31, 33, 35, 36, 38, 41, 44, 45, 49, 51, 57, 58, 62, 68], "came": 16, "di": [16, 48], "mother": 16, "member": [16, 37], "kept": 16, "pictur": [16, 17, 19, 31, 55], "coin": [17, 30, 31], "potteri": [17, 30], "collector": 17, "carrier": 17, "carri": [17, 18, 30], "e7": [18, 48], "e8": 18, "e5": [18, 48], "e11": 18, "e9": 18, "common": [18, 26, 51, 65], "battl": [18, 35, 39], "meet": [18, 62], "wed": 18, "owner": [18, 31], "anoth": [18, 20, 24, 29, 31, 33, 34, 41, 49, 51, 60], "natur": [18, 38, 47], "disast": 18, "track": [18, 31, 39, 42, 48, 53, 61], "conserv": 18, "treatment": 18, "movement": [18, 34], "crm": [18, 24, 33, 42, 43, 45, 46, 47, 48, 52], "war": [18, 35, 39, 48], "up": [18, 20, 36, 41, 44, 62, 63, 66, 68], "journei": [18, 32, 35], "wai": [18, 19, 24, 26, 28, 31, 32, 34, 40, 44, 48, 49, 51], "donor": 18, "step": [18, 22, 24, 26, 30, 31, 32, 33, 34, 37, 41, 42], "instruct": [18, 24, 26, 31], "our": [18, 24, 26, 41, 43, 44, 51], "ownership": 18, "acquir": [18, 31, 41], "surrend": 18, "creator": [18, 20, 41], "destin": 18, "unfortun": [18, 33], "background": [18, 42, 47, 58, 68], "tutori": [18, 31, 33, 35, 36, 41], "produc": 18, "e18": [19, 24, 28, 47, 48], "physic": [19, 24, 28, 30, 31, 34, 36, 47, 48, 57], "thing": [19, 24, 28, 30, 36, 47, 48, 57], "record": [19, 21, 24, 28, 31, 34, 49, 54], "grave": [19, 21, 24, 28, 30, 36], "consid": [19, 24, 47, 49], "referenc": [19, 25, 28], "skeleton": [19, 21], "pit": [19, 30], "ditch": 19, "rampart": 19, "label": [19, 29, 44, 58, 68], "disk": 20, "display": 20, "upload": [20, 31, 42, 52, 53], "exce": 20, "limit": [20, 53, 68], "both": [20, 68], "go": [20, 24, 29, 30, 31, 39, 40, 45, 57], "drag": [20, 57, 58], "left": [20, 38, 50, 55, 57, 58], "furthermor": [20, 24, 26, 39, 40, 45, 49], "practic": [20, 41], "licenc": 20, "besid": [20, 68], "plan": [20, 41], "indic": [20, 39, 41, 44, 48, 51], "design": [20, 36, 41, 42, 54], "holder": [20, 49], "Not": [20, 62], "maximum": 20, "mb": 20, "width": [20, 58], "pixel": [20, 58], "pdf": 20, "display_file_ext": 20, "chose": [20, 68], "do": [20, 29, 30, 31, 36, 39, 45, 63], "height": [20, 29, 58], "120": 20, "px": 20, "larger": 20, "try": [20, 45, 51, 58, 63, 64, 66, 68], "small": [20, 60], "impact": 20, "perform": [20, 31, 45, 56], "suppos": 20, "met": [20, 41], "must": [20, 39, 41, 44, 51], "those": [20, 24, 30, 39, 47, 51], "numer": [20, 44, 61], "flag": [20, 41], "viewer": [20, 41, 42, 55], "e20": 21, "biolog": [21, 30], "anthropolog": [21, 24, 30, 43, 56, 61], "bone": [21, 30, 54], "sex": [21, 29, 30, 42, 56], "gender": [21, 30], "ag": [21, 30, 42], "mask": [21, 30], "workflow": [21, 22, 24, 28, 30, 32, 42, 59], "acquisit": [21, 42], "modif": [21, 38, 40], "move": [21, 24, 31, 32, 58], "femur": [21, 30, 54], "humeru": [21, 54], "molar": 21, "historian": 22, "work": [22, 39, 42, 43, 63], "come": [22, 29, 41, 49, 68], "usual": [22, 41], "facilit": [22, 26], "bit": 22, "hi": [22, 31, 39], "life": [22, 48], "archaeologist": 22, "reflect": [22, 34, 51], "contin": 24, "graveyard": [24, 30], "under": [24, 25, 26, 36, 38, 51, 66], "austria": 24, "itali": 24, "respect": [24, 26, 33, 34, 35, 36, 38, 41, 48, 49, 57], "styria": 24, "duchi": 24, "bavaria": 24, "lombard": [24, 38], "kingdom": 24, "newli": [24, 28, 30, 31], "though": [24, 28], "e18phys": 24, "certain": [24, 29, 30, 36, 44, 46, 48, 49, 57], "posit": [24, 30, 36, 49, 57], "extend": [24, 30, 33, 34, 57], "tempor": [24, 30, 35, 42], "spatial": [24, 30, 42, 57], "superior": 24, "cemeteri": 24, "compos": 24, "burial": [24, 28, 30, 36], "primari": 24, "secondari": [24, 27], "back": [24, 30, 31], "solv": [24, 63, 65], "book": [25, 30, 49], "inbook": 25, "articl": [25, 30, 51], "charter": [25, 27, 49], "chronicl": 25, "doi": [25, 49], "instead": [25, 34, 45, 51], "author": [26, 33, 49], "advantag": [26, 31], "abl": [26, 31, 41], "futhermor": 26, "merg": 26, "lod": [26, 38, 42], "analogu": 26, "librari": 26, "catalogu": 26, "inventori": [26, 38, 49], "collabor": 26, "multilingu": 26, "knowledg": [26, 45], "graph": [26, 58], "wikimedia": 26, "foundat": 26, "wikipedia": 26, "everyon": 26, "cc0": 26, "domain": [26, 44, 48, 51], "usabl": [26, 51, 69], "geograph": [26, 49], "web": [26, 49, 52, 53], "creativ": 26, "over": [26, 29, 31, 36, 40, 41, 49, 61, 73], "25": [26, 48], "000": 26, "11": [26, 48, 51], "800": [26, 38, 68], "gemeinsam": 26, "normdatei": 26, "translat": [26, 27, 45, 47, 52, 53], "intern": [26, 42, 44, 45], "organis": 26, "subject": 26, "head": 26, "corpor": 26, "bodi": 26, "mainli": 26, "increasingli": 26, "definit": [26, 38, 44, 45, 51], "confid": [26, 38, 57], "degre": [26, 38, 54, 57], "close": [26, 36, 38, 57], "suffici": [26, 38, 57], "interchang": [26, 38, 57], "retriev": [26, 38, 51, 57], "exact": [26, 36, 38, 39, 57, 68], "vienna": [26, 38, 61], "suitabl": [26, 33, 38, 52], "deal": [26, 41, 44, 45, 58], "primarili": [26, 28, 54], "wiki": [26, 38, 43], "q123": 26, "septemb": 26, "desir": [26, 30, 37, 38], "short": [26, 31, 35, 44], "mous": [26, 29, 40, 57, 58, 73], "yet": [26, 35], "attach": [26, 41, 51], "e33": [27, 45, 47, 49], "linguist": [27, 47, 49], "written": [27, 30, 34, 52], "mediev": [27, 49], "letter": [27, 31, 32, 33, 35], "literatur": [27, 54], "comment": [27, 39, 62, 68], "tool": [28, 31, 42, 43, 45, 51, 54, 57, 59, 61, 73], "lead": [28, 29, 41, 45, 51], "backfil": [28, 30], "e55": [29, 48], "With": [29, 31, 34, 42, 46, 51, 57, 58, 66], "adapt": [29, 42, 60], "interest": 29, "dynam": [29, 40], "statu": [29, 51], "higher": 29, "basic": [29, 40], "root": [29, 52], "untyp": 29, "switch": [29, 57, 58, 71], "except": [29, 51, 60, 69], "unselect": 29, "categori": [29, 54], "permiss": [29, 38, 40, 42, 64], "renam": 29, "subtyp": 29, "grei": 29, "least": [29, 40, 41, 62], "decim": [29, 57], "dimens": [29, 30, 48], "weight": [29, 54], "centimetr": 29, "gram": 29, "percentag": 29, "unabl": 29, "fit": [29, 31, 35, 36], "reduc": 29, "typ": 29, "element": [30, 31, 33, 34, 60, 63], "procedur": [30, 33, 34], "3": [30, 48, 51, 54], "knife": 30, "4": [30, 41, 51, 62, 68], "teeth": 30, "classif": [30, 33, 34], "bout": 30, "concern": [30, 33, 34, 45, 52], "store": [30, 31, 42, 48, 49], "state": [30, 36, 38, 51, 61], "appropri": [30, 31, 34], "settlement": 30, "magnifi": [30, 36, 57], "evid": 30, "plot": [30, 36], "photo": 30, "now": [30, 31, 34], "layer": [30, 36, 57], "finger": 30, "ring": [30, 48], "patholog": 30, "measur": [30, 61], "discolor": 30, "canin": 30, "represent": 31, "repres": [31, 35, 36, 39, 47], "span": [31, 32, 48, 62, 68], "cover": [31, 36], "Then": [31, 36], "learn": 31, "On": [31, 33, 35], "land": [31, 35, 54], "kind": [31, 36, 40], "occurr": 31, "excav": [31, 55], "transfer": 31, "sold": 31, "leonardo": 31, "paint": 31, "mona": 31, "lisa": 31, "workshop": 31, "florenc": 31, "franci": 31, "franc": 31, "exhibit": 31, "ch\u00e2teau": 31, "ambois": 31, "fountainebleau": 31, "louvr": 31, "pari": 31, "typic": 32, "scenario": 32, "suggest": [32, 63, 65], "discuss": 32, "best": 32, "profess": [32, 43], "special": [33, 41, 42, 44, 47, 69], "trip": 33, "chronolog": 33, "captur": 33, "continu": [33, 35, 36], "altern": [33, 41, 51], "role": [33, 38, 41], "determin": [33, 42, 44, 49, 54], "exchang": [34, 43], "materi": 34, "copi": [34, 36], "preset": 34, "subgroup": 35, "bring": [35, 38], "simultan": 35, "music": 35, "festiv": 35, "parallel": 35, "concert": 35, "overlap": 35, "sequenc": [35, 44, 51], "introduct": [35, 43], "think": [35, 38, 39, 44, 64, 66], "screen": [36, 57], "glass": [36, 57], "pop": 36, "marker": [36, 57], "visual": [36, 42, 43, 50, 56], "hover": 36, "landscap": 36, "street": 36, "satellit": 36, "whether": [36, 73], "four": [36, 39], "mode": [36, 57, 58], "centerpoint": 36, "drawn": [36, 57], "border": 36, "river": 36, "bed": 36, "draw": [36, 55, 57], "shape": [36, 38, 54, 57], "rectangl": [36, 55, 57], "ground": 36, "hole": 36, "whose": 36, "unknown": [36, 39], "enough": [36, 39, 68], "window": 36, "dedic": 36, "countri": [37, 49], "gazett": [38, 49], "particularli": [38, 42], "But": [38, 41], "analog": 38, "card": [38, 49], "catalog": [38, 49], "wikidata": [38, 49], "manual": [38, 40, 41, 42, 50, 51, 52, 57], "q3044": 38, "charlemagn": 38, "input": [38, 51, 68], "2761369": 38, "AT": 38, "precis": [38, 57], "down": 38, "blank": 38, "belt": 38, "buckl": 38, "q3180027": 38, "todai": 38, "frank": 38, "becam": 38, "holi": [38, 48], "roman": 38, "emperor": 38, "venu": 38, "willendorf": 38, "histori": 38, "q131397": 38, "focus": 39, "statigraph": 39, "bottom": [39, 40, 57], "initi": [39, 68], "hidden": [39, 68], "year": [39, 48, 61, 62, 68], "4713": [39, 68], "9999": [39, 51, 68], "month": [39, 62, 68], "31": [39, 48, 54, 62, 68], "hh": 39, "59": [39, 51, 68], "ss": 39, "minu": 39, "bc": [39, 68], "softwar": [39, 42, 45, 47, 52], "postgresql": [39, 44, 53, 68], "prolept": [39, 68], "gregorian": [39, 68], "calendar": [39, 68], "hast": 39, "fought": 39, "william": 39, "duke": 39, "normandi": 39, "norman": 39, "french": [39, 42], "troop": 39, "harold": 39, "godwinson": 39, "english": [39, 42], "armi": 39, "14th": 39, "octob": 39, "1066": 39, "14": 39, "alik": 39, "Or": 39, "peac": 39, "westphalia": 39, "treati": 39, "sign": [39, 51], "1648": [39, 48], "osnabr\u00fcck": 39, "15th": 39, "m\u00fcnster": 39, "24th": 39, "thirti": [39, 48], "eighti": 39, "05": [39, 48], "15": 39, "24": [39, 48], "uncertain": 39, "third": 39, "fourth": 39, "actual": 39, "frame": 39, "certainti": 39, "death": [39, 48], "stephen": 39, "hungari": 39, "august": 39, "1038": 39, "birth": [39, 44, 48, 68], "01": [39, 62, 68], "975": 39, "earliest": 39, "latest": [39, 50], "howev": 39, "gear": [39, 45], "organ": 40, "distinct": [40, 49], "push": 40, "blue": 40, "light": 40, "answer": 41, "frequent": 41, "approach": [41, 51], "probabl": [41, 49, 63], "analys": [41, 43, 56, 61], "decis": 41, "regist": [41, 66], "hide": [41, 60], "reason": [41, 44, 51, 63, 66], "conflict": 41, "core": 41, "strict": 41, "better": 41, "lot": 41, "sai": 41, "alex": 41, "him": 41, "pick": 41, "he": 41, "although": 41, "filenam": 41, "cc": 41, "BY": 41, "unstructur": 41, "nor": [41, 44], "searchabl": [41, 60], "solut": [41, 63], "happi": 41, "help": [41, 63, 65], "tailor": 41, "hesit": 41, "reach": [41, 46, 50], "u": [41, 64], "topic": [41, 42, 51, 63], "linebreak": 41, "html": [41, 52], "markdown": 41, "bold": 41, "font": 41, "underlin": 41, "necessarili": [41, 49], "handl": [41, 43], "interoper": 41, "easi": [42, 51], "conveni": [42, 44, 47], "contribut": 42, "significantli": 42, "ontologi": [42, 44, 45], "easili": 42, "fair": 42, "principl": 42, "wide": [42, 44, 68], "uncertainti": [42, 68], "checker": [42, 43, 45], "quick": [42, 43, 62], "accord": [42, 47, 48, 66], "flexibli": 42, "thu": [42, 45], "interact": [42, 57], "navig": [42, 56, 62, 73], "network": [42, 43, 50, 56], "bookmark": [42, 50, 53, 64], "context": [42, 45], "internation": 42, "gettext": 42, "catalan": 42, "german": 42, "spanish": 42, "mirador": 42, "grant": 42, "autom": 42, "unsubscrib": [42, 60], "interdisciplinari": [42, 44], "method": [42, 54], "futur": 42, "ferembach": [42, 54], "et": [42, 54], "al": [42, 54, 71], "estim": [42, 56], "1979": [42, 54], "ment": [42, 61], "archeolog": 43, "geospati": 43, "radiocarbon": [43, 56], "shortcut": [43, 45, 68], "guid": 43, "paramet": [43, 58], "proxi": 43, "troubleshoot": 43, "faq": 43, "doe": [43, 44, 51], "why": 43, "iso": 44, "formal": 44, "council": 44, "icom": 44, "basi": 44, "underli": 44, "v7": 44, "publish": [44, 54], "2021": 44, "pars": 44, "github": 44, "e39": [44, 48], "e67": [44, 48], "characteris": 44, "had": [44, 48, 68], "invers": 44, "anywai": 44, "ignor": 44, "foreign": 44, "sub_properties_of": 44, "suffix": 44, "counterpart": 44, "p3": [44, 48], "parser": 44, "com": 44, "craw": 44, "blob": 44, "cidoc_rtfs_pars": 44, "troubl": 44, "prior": [45, 51], "verifi": 45, "fact": 45, "gain": 45, "insight": 45, "graphic": 45, "symbol": [45, 51, 69], "introduc": 45, "increas": 45, "finer": 45, "grain": 45, "contextu": 45, "lingust": 45, "refin": [47, 62], "7": [47, 54], "compris": 47, "rel": 47, "differenti": 47, "confus": 47, "true": [47, 51], "simplifi": 48, "oa": 48, "p11i": 48, "stefan": 48, "joachim": 48, "son": 48, "father": 48, "usag": [48, 56], "birthplac": 48, "p92i": 48, "brought": 48, "e63": 48, "p7": 48, "took": 48, "e521": 48, "e567": 48, "ulm": 48, "p93i": 48, "e64": 48, "e69": 48, "princeton": 48, "begin_com": 48, "end_com": 48, "timestamp": [48, 51], "e61": 48, "primit": 48, "p4": 48, "e52": 48, "p81": 48, "ongo": 48, "throughout": 48, "lanc": 48, "forg": 48, "durat": 48, "0770": 48, "destroi": [48, 68], "p13": 48, "destruct": 48, "e6": 48, "throw": 48, "lava": 48, "3019": 48, "03": 48, "p98i": 48, "1981": 48, "p100i": 48, "ladi": 48, "diana": 48, "1997": 48, "1618": 48, "purpos": 48, "e62": [48, 69], "p43": 48, "e54": 48, "bibliograph": 49, "delimit": 49, "along": 49, "chapter": 49, "figur": 49, "folio": 49, "7v": 49, "kell": 49, "saint": 49, "mari": 49, "21": 49, "less": 49, "eleven": 49, "million": 49, "charg": [49, 58], "distinguish": 49, "non": 49, "encyclopedia": 49, "domain_id": 49, "property_cod": 49, "range_id": 49, "alphanumer": [49, 61], "alon": 49, "p67i": 49, "p71": 49, "terri": 49, "prattchet": 49, "q46248": 49, "p71i": 49, "e1": 49, "depict": 49, "scan": 49, "extract": 49, "mostli": 49, "logo": [50, 71], "upper": [50, 57], "program": 51, "analyt": 51, "mashin": 51, "tri": [51, 64], "constraint": 51, "hand": 51, "swagger": 51, "visit": 51, "rdf": 51, "visibl": [51, 57, 59], "commun": 51, "schema": [51, 53], "5117": 51, "machin": 51, "deprec": 51, "unstabl": 51, "unavail": 51, "notion": 51, "signific": 51, "major": [51, 54, 63], "minor": 51, "post": 51, "roadmap": 51, "releas": 51, "discontinu": 51, "openapi": 51, "lpf": 51, "geojson": 51, "deriv": 51, "sort": [51, 73], "consult": 51, "convent": 51, "success": 51, "failur": 51, "2xx": 51, "4xx": 51, "signal": 51, "5xx": 51, "tue": 51, "19": 51, "jul": 51, "gmt": 51, "404": 51, "kf": 51, "desc": 51, "flask": [51, 52], "catch": 51, "handler": 51, "behind": 51, "someurl": 51, "8080": 51, "No": 51, "python": 52, "framework": 52, "config": 52, "upgrad": 52, "live": [52, 62], "util": 52, "static": 52, "css": 52, "javascript": 52, "templat": 52, "compil": 52, "rout": 52, "redirect": 52, "sphinx": 52, "retrac": 52, "15883": 52, "init": 52, "before_request": 52, "get_by_id": 52, "some_data": 52, "some_filt": 52, "postgi": [53, 57], "assess": 54, "schwidetzki": 54, "m": 54, "stloukal": 54, "empfehlungen": 54, "f\u00fcr": 54, "die": 54, "alter": 54, "und": 54, "geschlechtsdiagnos": 54, "am": 54, "skelett": 54, "homo": 54, "30": [54, 57, 61], "32": 54, "skull": 54, "pelvi": 54, "examin": 54, "propos": 54, "margo": 54, "supramastoideu": 54, "o": 54, "sacrum": 54, "robust": 54, "supplement": 54, "glabella": 54, "w": 54, "arcu": 54, "superciliari": 54, "tuber": 54, "frontali": 54, "parietali": 54, "inclinatio": 54, "processu": 54, "mastoideu": 54, "relief": 54, "planum": 54, "nuchal": 54, "protuberantia": 54, "occipitali": 54, "externa": 54, "zygomaticu": 54, "zygomaticum": 54, "crista": 54, "supramastoideum": 54, "supraorbitali": 54, "orbita": 54, "mandibl": 54, "overal": 54, "mentum": 54, "angulu": 54, "inferior": 54, "m2": 54, "angl": 54, "sulcu": 54, "praeauriculari": 54, "incisura": 54, "ischiadica": 54, "pubi": 54, "arc": 54, "compos\u00e9": 54, "coxa": 54, "foramen": 54, "obturatum": 54, "corpu": 54, "ossi": 54, "ischii": 54, "iliaca": 54, "fossa": 54, "auricular": 54, "acetabuli": 54, "express": 54, "assign": 54, "femal": 54, "indiffer": 54, "male": 54, "preserv": 54, "sum": 54, "69": 54, "70": 54, "prerequisit": 55, "wasn": 55, "side": [55, 63], "guarante": 55, "overlai": [56, 60], "leaflet": 57, "mousewheel": 57, "hold": 57, "basemap": 57, "popup": 57, "40": 57, "20": 57, "characterist": 57, "road": 57, "toggl": 57, "east": 57, "north": 57, "d3": 58, "j": 58, "egocentr": 58, "classic": 58, "wheel": 58, "node": 58, "rotat": 58, "pan": 58, "color": 58, "depth": 58, "too": [58, 62], "hardwar": 58, "acceler": [58, 61], "faster": 58, "exactli": 58, "remind": 59, "privat": 59, "seen": 59, "everybodi": 59, "anybodi": 59, "els": 59, "got": 59, "twice": 60, "uncheck": 60, "deactiv": [60, 66], "disappear": 60, "whom": 60, "laboratori": 61, "abbrevi": 61, "lab": 61, "conduct": 61, "vera": 61, "environment": 61, "specimen": 61, "sampl": 61, "analysi": 61, "1015": 61, "big": 62, "global": [62, 72], "term": [62, 73], "ada": 62, "lovelac": 62, "da": 62, "love": 62, "unacc": 62, "lov\u0113": 62, "vice": 62, "versa": 62, "placehold": 62, "l": 62, "ce": 62, "me": 62, "dateless": 62, "criteria": 62, "1540": 62, "1560": 62, "1550": 62, "intend": 63, "support": [63, 69], "sometim": 63, "cach": 63, "rememb": 63, "firefox": 63, "haven": 63, "screenshot": 63, "explan": 64, "encount": 64, "let": 64, "know": 64, "read": [64, 73], "mayb": 64, "obsolet": 64, "keyboard": 66, "capslock": 66, "forgot": 66, "misspel": 66, "secur": 66, "attack": 66, "lock": 66, "few": [66, 72], "until": 66, "e41": 67, "appel": 67, "oa8": 68, "oa9": 68, "knew": 68, "1356": 68, "unsur": 68, "church": 68, "fist": 68, "decad": 68, "1800": 68, "1809": 68, "autocomplet": 68, "5": 68, "zero": 68, "leap": 68, "almost": 69, "cyril": 69, "mathemat": 69, "asterisk": [70, 72], "serv": 71, "quit": 72, "difficult": 72, "glanc": 73, "quickli": 73, "invert": 73, "cut": 73}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"api": [0, 51], "arch": 1, "overview": [1, 50], "fetch": 1, "data": [1, 3, 30, 41, 42], "from": 1, "automat": 1, "creat": [1, 33, 35, 36, 38, 40], "entiti": [1, 3, 22, 48], "type": [1, 3, 8, 29, 40, 41, 48], "refer": [1, 8, 25, 26, 31, 36, 38, 49], "system": [1, 8, 26, 36, 38, 49], "content": 2, "integr": [3, 42], "check": [3, 20, 41], "orphan": 3, "without": 3, "link": [3, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 31, 33, 46], "miss": 3, "file": [3, 20, 31, 41, 49, 64], "iiif": [3, 7, 42], "annot": [3, 42, 55], "subunit": [3, 19, 21, 24, 28], "circular": 3, "depend": 3, "date": [3, 8, 39, 42, 48, 61, 68], "invalid": 3, "involv": 3, "preced": 3, "sub": 3, "duplic": 3, "similar": 3, "name": [3, 66, 72], "execut": 4, "sql": [4, 5], "prepar": [4, 8], "keep": 4, "mind": 4, "result": 4, "export": 5, "databas": [5, 53], "dump": 5, "csv": 5, "json": 5, "xml": 5, "gener": [6, 32, 35, 60], "authent": [6, 51], "import": [8, 15, 20, 57], "project": [8, 41], "class": [8, 44, 47], "possibl": 8, "field": [8, 14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 39, 41], "alia": [8, 67], "valu": [8, 29], "origin": 8, "wkt": [8, 57], "coordin": 8, "extern": 8, "place": [8, 24, 30, 36], "hierarchi": 8, "option": [8, 58], "after": 8, "admin": 9, "mail": 10, "map": [11, 36, 57], "modul": [12, 60], "present": 13, "site": [13, 30], "user": [14, 20, 41, 42, 43, 66], "form": [14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 70], "group": 14, "vocab": 15, "edit": 15, "show": 15, "vocabulari": 15, "actor": [16, 33], "can": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "via": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "tab": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29], "artifact": [17, 30, 31, 34], "event": [18, 31, 33, 34, 35], "acquisit": 18, "creation": [18, 31], "modif": 18, "move": [18, 33, 34, 35], "product": 18, "featur": [19, 30, 42], "super": [19, 21, 28], "public": [20, 41], "share": [20, 41], "set": 20, "logo": 20, "imag": [20, 42, 55], "preview": 20, "how": [20, 36, 39, 41], "make": [20, 29, 41], "avail": [20, 41], "criteria": [20, 41], "softwar": [20, 41], "manag": [20, 41, 42], "human": [21, 30], "remain": [21, 30], "administr": 24, "unit": [24, 28, 30], "histor": [24, 32], "ad": [24, 30, 33, 34, 41, 57], "multipl": [24, 31, 41], "citat": 25, "exampl": [25, 32], "includ": 26, "default": 26, "wikidata": 26, "geonam": [26, 36, 57], "gnd": 26, "usag": [26, 55], "id": 26, "precis": [26, 39], "configur": [26, 73], "sourc": [27, 34], "stratigraph": [28, 30], "anthropolog": [28, 42, 54], "analys": [28, 42, 54], "standard": 29, "custom": [29, 41], "requir": 29, "archaeolog": [30, 32], "new": [30, 31, 35, 36, 38, 40, 57], "an": [30, 31, 34, 40], "add": [31, 40], "creator": 31, "locat": [31, 33], "journei": 33, "letter": 34, "sender": 34, "recipi": 34, "instruct": 35, "us": 36, "profess": [37, 41], "time": [39, 48], "span": 39, "where": 39, "find": 39, "input": 39, "enter": [39, 41], "activ": [39, 66], "hour": 39, "minut": 39, "second": 39, "tree": 40, "exist": 40, "faq": 41, "case": [41, 58], "studi": 41, "instanc": 41, "doe": 41, "access": [41, 51], "work": 41, "why": 41, "t": 41, "free": 41, "text": 41, "longer": 41, "format": 41, "model": [42, 45], "interfac": [42, 43], "exchang": 42, "radiocarbon": [42, 48, 61], "openatla": [43, 47, 48], "manual": 43, "document": 43, "help": 43, "cidoc": 44, "crm": 44, "properti": 44, "checker": 46, "shortcut": 48, "oa7": 48, "ha": 48, "relationship": 48, "oa8": 48, "appear": 48, "first": 48, "oa9": 48, "last": 48, "e77": 48, "persist": [48, 63], "item": 48, "e21": 48, "person": 48, "e2": 48, "tempor": 48, "introduct": 51, "quick": 51, "start": 51, "guid": 51, "1": 51, "ui": 51, "2": 51, "url": 51, "get": 51, "version": [51, 63], "endpoint": 51, "paramet": 51, "error": [51, 63, 64], "handl": 51, "proxi": 51, "applic": 52, "structur": [52, 53], "sex": 54, "estim": 54, "tool": 56, "navig": [57, 58], "search": [57, 62], "geometri": 57, "overlai": 57, "network": 58, "visual": 58, "2d": 58, "3d": 58, "In": 58, "perform": 58, "issu": 58, "download": 58, "note": 59, "profil": 60, "chang": 60, "password": [60, 66], "displai": [60, 63], "browser": 63, "refresh": 63, "your": 63, "javascript": 63, "If": 63, "problem": 63, "code": 64, "403": 64, "forbidden": 64, "404": 64, "found": [64, 66], "418": 64, "i": [64, 66], "m": 64, "teapot": 64, "troubleshoot": 65, "login": 66, "wrong": 66, "No": 66, "thi": 66, "too": 66, "mani": 66, "attempt": 66, "descript": 69, "menu": 71, "tabl": 73}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"API": [[0, "api"], [51, "api"]], "ARCHE": [[1, "arche"]], "Overview": [[1, "overview"], [50, "overview"]], "Fetch": [[1, "fetch"]], "Data from ARCHE": [[1, "data-from-arche"]], "Automatically created entities": [[1, "automatically-created-entities"]], "Type": [[1, "entity-type"], [3, "type"], [29, "type"]], "Reference System": [[1, "entity-reference-system"], [26, "reference-system"]], "Entity": [[1, "entity-index"], [22, "entity"]], "Content": [[2, "content"]], "Data integrity checks": [[3, "data-integrity-checks"]], "Orphans": [[3, "orphans"], [3, "id1"]], "Entities without links": [[3, "entities-without-links"]], "Missing files": [[3, "missing-files"]], "Orphaned files": [[3, "orphaned-files"]], "Orphaned IIIF files": [[3, "orphaned-iiif-files"]], "Orphaned annotations": [[3, "orphaned-annotations"]], "Orphaned subunits": [[3, "orphaned-subunits"]], "Circular dependencies": [[3, "circular-dependencies"]], "Dates": [[3, "dates"], [8, "dates"], [48, "dates"]], "Invalid dates": [[3, "invalid-dates"]], "Invalid link dates": [[3, "invalid-link-dates"]], "Invalid involvement dates": [[3, "invalid-involvement-dates"]], "Invalid preceding dates": [[3, "invalid-preceding-dates"]], "Invalid sub dates": [[3, "invalid-sub-dates"]], "Check links": [[3, "check-links"]], "Check link duplicates": [[3, "check-link-duplicates"]], "Check similar names": [[3, "check-similar-names"]], "Execute SQL": [[4, "execute-sql"]], "Preparation": [[4, "preparation"], [8, "preparation"]], "Keep in mind": [[4, "keep-in-mind"]], "Result": [[4, "result"]], "Export": [[5, "export"]], "Export SQL": [[5, "export-sql"], [5, "id1"]], "Export database dump": [[5, "export-database-dump"]], "Export CSV": [[5, "export-csv"]], "Export JSON": [[5, "export-json"]], "Export XML": [[5, "export-xml"]], "General": [[6, "general"], [32, "general"], [60, "general"]], "Authentication": [[6, "authentication"]], "IIIF": [[7, "iiif"]], "Import": [[8, "import"], [15, "import"]], "Project": [[8, "project"]], "Import class": [[8, "import-class"]], "Possible import fields": [[8, "possible-import-fields"]], "Alias": [[8, "alias"], [67, "alias"]], "Types": [[8, "types"], [40, "types"]], "Value types": [[8, "value-types"], [29, "value-types"]], "References": [[8, "references"], [49, "references"], [49, "id1"]], "Origin references": [[8, "origin-references"]], "WKT coordinates": [[8, "wkt-coordinates"]], "External reference systems": [[8, "external-reference-systems"]], "Place hierarchy": [[8, "place-hierarchy"]], "Import options": [[8, "import-options"]], "After the import": [[8, "after-the-import"]], "Admin": [[9, "admin"]], "Mail": [[10, "mail"]], "Map": [[11, "map"], [57, "map"]], "Modules": [[12, "modules"], [60, "modules"]], "Presentation site": [[13, "presentation-site"]], "User": [[14, "user"]], "Form fields": [[14, "form-fields"], [16, "form-fields"], [17, "form-fields"], [18, "form-fields"], [19, "form-fields"], [20, "form-fields"], [21, "form-fields"], [24, "form-fields"], [25, "form-fields"], [27, "form-fields"], [28, "form-fields"], [29, "form-fields"]], "Groups": [[14, "groups"]], "Vocabs": [[15, "vocabs"]], "Edit": [[15, "edit"]], "Show vocabularies": [[15, "show-vocabularies"]], "Actor": [[16, "actor"]], "Can be linked via tabs to": [[16, "can-be-linked-via-tabs-to"], [17, "can-be-linked-via-tabs-to"], [18, "can-be-linked-via-tabs-to"], [19, "can-be-linked-via-tabs-to"], [20, "can-be-linked-via-tabs-to"], [21, "can-be-linked-via-tabs-to"], [24, "can-be-linked-via-tabs-to"], [25, "can-be-linked-via-tabs-to"], [27, "can-be-linked-via-tabs-to"], [28, "can-be-linked-via-tabs-to"], [29, "can-be-linked-via-tabs-to"]], "Artifact": [[17, "artifact"]], "Event": [[18, "event"]], "Acquisition": [[18, "acquisition"]], "Creation": [[18, "creation"]], "Modification": [[18, "modification"]], "Move": [[18, "move"]], "Production": [[18, "production"]], "Feature": [[19, "feature"]], "Super and subunits": [[19, "super-and-subunits"], [21, "super-and-subunits"], [28, "super-and-subunits"]], "File": [[20, "file"]], "Form fields important for public sharing": [[20, "form-fields-important-for-public-sharing"]], "Settings": [[20, "settings"]], "Logo": [[20, "logo"]], "Image preview": [[20, "image-preview"]], "How to make files available for the public": [[20, "how-to-make-files-available-for-the-public"], [41, "how-to-make-files-available-for-the-public"]], "Criteria checked by the software": [[20, "criteria-checked-by-the-software"], [41, "criteria-checked-by-the-software"]], "Criteria checked by managers and users": [[20, "criteria-checked-by-managers-and-users"]], "Human remains": [[21, "human-remains"]], "Place": [[24, "place"]], "Administrative Unit": [[24, "administrative-unit"]], "Historical Place": [[24, "historical-place"]], "Places and their subunits": [[24, "places-and-their-subunits"]], "Adding multiple places": [[24, "adding-multiple-places"]], "Reference": [[25, "reference"]], "Citation example": [[25, "citation-example"]], "Included by default": [[26, "included-by-default"]], "Wikidata": [[26, "wikidata"]], "GeoNames": [[26, "geonames"], [57, "id1"]], "GND": [[26, "gnd"]], "Usage": [[26, "usage"], [55, "usage"]], "ID": [[26, "id"]], "Precision": [[26, "precision"]], "Configuration": [[26, "configuration"], [73, "configuration"]], "Source": [[27, "source"]], "Stratigraphic unit": [[28, "stratigraphic-unit"]], "Anthropological analyses": [[28, "anthropological-analyses"]], "Standard types": [[29, "standard-types"]], "Custom types": [[29, "custom-types"]], "Making types required": [[29, "making-types-required"]], "Archaeological data": [[30, "archaeological-data"]], "Adding a new place": [[30, "adding-a-new-place"]], "Adding a feature to the site": [[30, "adding-a-feature-to-the-site"]], "Adding a stratigraphic unit to the feature": [[30, "adding-a-stratigraphic-unit-to-the-feature"]], "Adding an artifact to the stratigraphic unit": [[30, "adding-an-artifact-to-the-stratigraphic-unit"]], "Adding human remains to the stratigraphic unit": [[30, "adding-human-remains-to-the-stratigraphic-unit"]], "Artifacts": [[31, "artifacts"]], "Add a new artifact": [[31, "add-a-new-artifact"]], "Add a reference to the artifact": [[31, "add-a-reference-to-the-artifact"]], "Add a file to the artifact": [[31, "add-a-file-to-the-artifact"]], "Link a creation event": [[31, "link-a-creation-event"]], "Add a creator to the creation event": [[31, "add-a-creator-to-the-creation-event"]], "Add multiple locations to an artifact": [[31, "add-multiple-locations-to-an-artifact"]], "Examples": [[32, "examples"]], "Archaeological": [[32, "archaeological"]], "Historical": [[32, "historical"]], "Journey": [[33, "journey"]], "Adding actors": [[33, "adding-actors"]], "Adding locations": [[33, "adding-locations"]], "Creating the move event": [[33, "creating-the-move-event"]], "Link actors to the journey": [[33, "link-actors-to-the-journey"]], "Letters": [[34, "letters"]], "Adding an artifact": [[34, "adding-an-artifact"]], "Adding a source": [[34, "adding-a-source"]], "Adding the move event": [[34, "adding-the-move-event"]], "Adding sender and recipient": [[34, "adding-sender-and-recipient"]], "Move events": [[35, "move-events"]], "Create a new move event - general instruction": [[35, "create-a-new-move-event-general-instruction"]], "Places": [[36, "places"]], "Create a new place": [[36, "create-a-new-place"]], "How to use the map": [[36, "how-to-use-the-map"]], "Reference Systems - GeoNames": [[36, "reference-systems-geonames"]], "Profession": [[37, "profession"]], "References Systems": [[38, "references-systems"]], "Create a new reference system": [[38, "create-a-new-reference-system"]], "Time Spans": [[39, "time-spans"]], "Where to find the input fields": [[39, "where-to-find-the-input-fields"]], "How to enter dates and time spans": [[39, "how-to-enter-dates-and-time-spans"]], "Precise dates": [[39, "precise-dates"]], "Time spans": [[39, "id1"]], "Activate hours, minutes, and seconds": [[39, "activate-hours-minutes-and-seconds"]], "Create a new type tree": [[40, "create-a-new-type-tree"]], "Add a type to an existing type tree": [[40, "add-a-type-to-an-existing-type-tree"]], "FAQ": [[41, "faq"]], "How to manage multiple projects or case studies": [[41, "how-to-manage-multiple-projects-or-case-studies"]], "Multiple instances": [[41, "multiple-instances"]], "Shared instance": [[41, "shared-instance"]], "How does data access work": [[41, "how-does-data-access-work"]], "How to enter professions": [[41, "how-to-enter-professions"]], "Criteria checked by users": [[41, "criteria-checked-by-users"]], "Why can\u2019t a free text field be added via custom types": [[41, "why-can-t-a-free-text-field-be-added-via-custom-types"]], "Why can\u2019t longer texts be formatted": [[41, "why-can-t-longer-texts-be-formatted"]], "Features": [[42, "features"]], "Model": [[42, "model"], [45, "model"]], "User Interface": [[42, "user-interface"]], "IIIF Integration": [[42, "iiif-integration"]], "Image Annotation": [[42, "image-annotation"]], "Data Exchange": [[42, "data-exchange"]], "User Management": [[42, "user-management"]], "Anthropological Analyses": [[42, "anthropological-analyses"], [54, "anthropological-analyses"]], "Radiocarbon Dating": [[42, "radiocarbon-dating"], [61, "radiocarbon-dating"]], "OpenAtlas manual": [[43, "openatlas-manual"]], "User interface": [[43, null]], "Documentation": [[43, null]], "Help": [[43, null]], "CIDOC CRM": [[44, "cidoc-crm"]], "CIDOC classes": [[44, "cidoc-classes"]], "CIDOC Properties": [[44, "cidoc-properties"]], "Link checker": [[46, "link-checker"]], "OpenAtlas classes": [[47, "openatlas-classes"]], "OpenAtlas shortcuts": [[48, "openatlas-shortcuts"]], "OA7 - has relationship to": [[48, "oa7-has-relationship-to"]], "OA8 - appears for the first time in": [[48, "oa8-appears-for-the-first-time-in"]], "OA9 - appears for the last time in": [[48, "oa9-appears-for-the-last-time-in"]], "E77 - Persistent Item": [[48, "e77-persistent-item"]], "E21 Person": [[48, "e21-person"]], "E2 Temporal Entity": [[48, "e2-temporal-entity"]], "Radiocarbon dating type": [[48, "radiocarbon-dating-type"]], "Reference Systems": [[49, "reference-systems"]], "References and Files": [[49, "references-and-files"]], "Introduction": [[51, "introduction"]], "Quick Start Guide": [[51, "quick-start-guide"]], "1. UI access": [[51, "ui-access"]], "2. URL / GET access": [[51, "url-get-access"]], "Versioning": [[51, "versioning"]], "Endpoints": [[51, "endpoints"]], "Parameters": [[51, "parameters"]], "Error handling": [[51, "error-handling"]], "Proxy": [[51, "proxy"]], "Authentication guide": [[51, "authentication-guide"]], "Application Structure": [[52, "application-structure"]], "Database Structure": [[53, "database-structure"]], "Sex Estimation": [[54, "sex-estimation"]], "Image annotation": [[55, "image-annotation"]], "Tools": [[56, "tools"]], "Navigation": [[57, "navigation"], [58, "navigation"]], "Search": [[57, "search"], [62, "search"]], "WKT import": [[57, "wkt-import"]], "Adding new geometries": [[57, "adding-new-geometries"]], "Map Overlay": [[57, "map-overlay"]], "Network visualization": [[58, "network-visualization"]], "2D": [[58, "d"]], "3D": [[58, "id1"]], "Options": [[58, "options"]], "In case of performance issues": [[58, "in-case-of-performance-issues"]], "Download": [[58, "download"]], "Notes": [[59, "notes"]], "Profile": [[60, "profile"]], "Change password": [[60, "change-password"]], "Display": [[60, "display"]], "Display Errors": [[63, "display-errors"]], "Browser Version": [[63, "browser-version"]], "Refresh your Browser": [[63, "refresh-your-browser"]], "JavaScript": [[63, "javascript"]], "If the problem persists": [[63, "if-the-problem-persists"]], "Error Codes": [[64, "error-codes"]], "403 - Forbidden": [[64, "forbidden"]], "404 - File not found": [[64, "file-not-found"]], "418 - I\u2019m a teapot": [[64, "im-a-teapot"]], "Troubleshooting": [[65, "troubleshooting"]], "Login": [[66, "login"]], "Wrong Password": [[66, "wrong-password"]], "No user with this name found.": [[66, "no-user-with-this-name-found"]], "This user is not activated.": [[66, "this-user-is-not-activated"]], "Too many login attempts.": [[66, "too-many-login-attempts"]], "Date": [[68, "date"]], "Description": [[69, "description"]], "Form": [[70, "form"]], "Menu": [[71, "menu"]], "Name": [[72, "name"]], "Table": [[73, "table"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["admin/api", "admin/arche", "admin/content", "admin/data_integrity_checks", "admin/execute_sql", "admin/export", "admin/general", "admin/iiif", "admin/import", "admin/index", "admin/mail", "admin/map", "admin/modules", "admin/presentation_site", "admin/user", "admin/vocabs", "entity/actor", "entity/artifact", "entity/event", "entity/feature", "entity/file", "entity/human_remains", "entity/index", "entity/navigation", "entity/place", "entity/reference", "entity/reference_system", "entity/source", "entity/stratigraphic_unit", "entity/type", "examples/archaeological_data", "examples/artifacts", "examples/index", "examples/journey", "examples/letters", "examples/move_event", "examples/places", "examples/profession", "examples/reference_systems", "examples/time_spans", "examples/types", "faq", "features", "index", "model/cidoc_crm", "model/index", "model/link_checker", "model/openatlas_classes", "model/openatlas_shortcuts", "model/references", "overview", "technical/api", "technical/application_structure", "technical/database_structure", "tools/anthropological_analyses", "tools/image_annotation", "tools/index", "tools/map", "tools/network", "tools/notes", "tools/profile", "tools/radiocarbon_dating", "tools/search", "troubleshooting/display", "troubleshooting/error_codes", "troubleshooting/index", "troubleshooting/login", "ui/alias", "ui/date", "ui/description", "ui/form", "ui/menu", "ui/name", "ui/table"], "filenames": ["admin/api.rst", "admin/arche.rst", "admin/content.rst", "admin/data_integrity_checks.rst", "admin/execute_sql.rst", "admin/export.rst", "admin/general.rst", "admin/iiif.rst", "admin/import.rst", "admin/index.rst", "admin/mail.rst", "admin/map.rst", "admin/modules.rst", "admin/presentation_site.rst", "admin/user.rst", "admin/vocabs.rst", "entity/actor.rst", "entity/artifact.rst", "entity/event.rst", "entity/feature.rst", "entity/file.rst", "entity/human_remains.rst", "entity/index.rst", "entity/navigation.rst", "entity/place.rst", "entity/reference.rst", "entity/reference_system.rst", "entity/source.rst", "entity/stratigraphic_unit.rst", "entity/type.rst", "examples/archaeological_data.rst", "examples/artifacts.rst", "examples/index.rst", "examples/journey.rst", "examples/letters.rst", "examples/move_event.rst", "examples/places.rst", "examples/profession.rst", "examples/reference_systems.rst", "examples/time_spans.rst", "examples/types.rst", "faq.rst", "features.rst", "index.rst", "model/cidoc_crm.rst", "model/index.rst", "model/link_checker.rst", "model/openatlas_classes.rst", "model/openatlas_shortcuts.rst", "model/references.rst", "overview.rst", "technical/api.rst", "technical/application_structure.rst", "technical/database_structure.rst", "tools/anthropological_analyses.rst", "tools/image_annotation.rst", "tools/index.rst", "tools/map.rst", "tools/network.rst", "tools/notes.rst", "tools/profile.rst", "tools/radiocarbon_dating.rst", "tools/search.rst", "troubleshooting/display.rst", "troubleshooting/error_codes.rst", "troubleshooting/index.rst", "troubleshooting/login.rst", "ui/alias.rst", "ui/date.rst", "ui/description.rst", "ui/form.rst", "ui/menu.rst", "ui/name.rst", "ui/table.rst"], "titles": ["API", "ARCHE", "Content", "Data integrity checks", "Execute SQL", "Export", "General", "IIIF", "Import", "Admin", "Mail", "Map", "Modules", "Presentation site", "User", "Vocabs", "Actor", "Artifact", "Event", "Feature", "File", "Human remains", "Entity", "<no title>", "Place", "Reference", "Reference System", "Source", "Stratigraphic unit", "Type", "Archaeological data", "Artifacts", "Examples", "Journey", "Letters", "Move events", "Places", "Profession", "References Systems", "Time Spans", "Types", "FAQ", "Features", "OpenAtlas manual", "CIDOC CRM", "Model", "Link checker", "OpenAtlas classes", "OpenAtlas shortcuts", "References", "Overview", "API", "Application Structure", "Database Structure", "Anthropological Analyses", "Image annotation", "Tools", "Map", "Network visualization", "Notes", "Profile", "Radiocarbon Dating", "Search", "Display Errors", "Error Codes", "Troubleshooting", "Login", "Alias", "Date", "Description", "Form", "Menu", "Name", "Table"], "terms": {"descript": [0, 1, 8, 12, 16, 17, 18, 19, 20, 21, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 41, 44, 48, 49, 51, 55, 57, 62, 70, 73], "public": [0, 7, 26, 43, 49, 51, 53, 59], "default": [0, 3, 6, 7, 8, 11, 12, 14, 15, 20, 29, 38, 39, 52, 57, 58, 59, 60], "off": [0, 73], "If": [0, 1, 3, 4, 8, 13, 15, 17, 20, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 49, 51, 57, 58, 62, 66, 68], "turn": [0, 39, 66, 68], "file": [0, 1, 5, 7, 8, 9, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 35, 42, 43, 47, 52, 55, 57, 60], "licens": [0, 1, 20, 26, 41], "can": [0, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 22, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 54, 55, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 71, 73], "still": [0, 18, 41, 51, 60], "access": [0, 4, 7, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 40, 42, 43, 46, 54, 60, 61, 64], "A": [0, 1, 3, 4, 5, 13, 15, 16, 17, 19, 20, 21, 24, 26, 28, 29, 30, 31, 35, 36, 40, 41, 44, 49, 50, 51, 52, 63, 69], "browser": [0, 6, 20, 51, 52, 58], "us": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 62, 63, 64, 67, 68, 69, 70, 72, 73], "b": 0, "log": [0, 2, 6, 14, 50, 60, 63], "user": [0, 1, 3, 5, 6, 8, 9, 10, 12, 15, 26, 29, 30, 33, 34, 35, 36, 38, 40, 44, 45, 47, 49, 51, 52, 53, 59, 60, 64, 71], "ip": 0, "request": [0, 6, 51, 64, 66], "comput": [0, 20], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 68, 72], "whitelist": 0, "link": [0, 1, 2, 5, 8, 9, 13, 15, 22, 26, 30, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 48, 49, 50, 51, 53, 55, 57, 58, 60, 63, 64, 66, 71], "without": [0, 7, 8, 9, 10, 18, 36, 41, 44, 45, 51, 58, 62], "being": [0, 26, 41], "thi": [0, 3, 4, 5, 7, 8, 13, 14, 16, 17, 18, 20, 22, 24, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51, 52, 54, 55, 57, 58, 61, 62, 63, 64, 65, 68], "might": [0, 3, 4, 16, 29, 35, 39, 41], "you": [0, 3, 4, 7, 8, 11, 12, 14, 15, 20, 22, 24, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 51, 52, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 71, 73], "want": [0, 3, 8, 29, 30, 31, 39, 40, 41, 58], "allow": [0, 3, 6, 15, 18, 20, 39, 41, 42, 51, 55, 62, 72], "other": [0, 3, 8, 14, 16, 18, 20, 24, 26, 30, 31, 33, 35, 36, 38, 41, 42, 51, 52, 58, 59, 60], "system": [0, 5, 9, 14, 16, 17, 18, 21, 22, 24, 29, 32, 41, 42, 43, 44, 45, 53, 68, 69], "your": [0, 1, 3, 4, 8, 20, 32, 35, 36, 38, 39, 41, 44, 50, 51, 57, 58, 59, 60, 64, 66, 73], "data": [0, 4, 5, 8, 9, 14, 19, 21, 22, 24, 26, 28, 29, 32, 33, 34, 35, 36, 38, 39, 40, 43, 44, 45, 51, 53, 57, 58, 59, 61, 62, 69, 70], "restrict": [0, 39, 41, 64], "resourc": [1, 38, 49], "centr": 1, "human": [1, 8, 16, 17, 18, 22, 24, 28, 31, 42, 43, 44, 47, 51, 54], "servic": [1, 15, 26, 42], "aim": 1, "offer": [1, 8, 42, 55], "stabl": [1, 47, 51], "persist": [1, 47], "host": [1, 10, 26], "well": [1, 21, 24, 30, 36, 39, 40, 41, 42, 44, 45, 47, 48, 71], "dissemin": 1, "digit": [1, 7, 22, 39, 42, 44, 49], "research": [1, 29, 42, 61], "In": [1, 3, 5, 7, 14, 19, 20, 21, 24, 25, 28, 30, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 49, 51, 54, 55, 56, 61, 63, 65], "order": [1, 15, 30, 33, 35, 42, 48, 49], "import": [1, 3, 9, 14, 34, 36, 41, 42, 43, 44, 45, 52, 53, 56, 60, 72], "openatla": [1, 3, 5, 7, 8, 13, 15, 18, 19, 20, 21, 24, 26, 28, 29, 30, 35, 37, 38, 41, 42, 44, 45, 46, 49, 51, 52, 53, 63, 68], "chang": [1, 6, 10, 18, 20, 26, 29, 30, 31, 33, 36, 40, 41, 51, 56, 57, 58], "instanc": [1, 7, 8, 10, 15, 20, 29, 38, 42, 44, 46, 48, 51, 52, 53], "product": [1, 10, 15, 17, 20, 21, 31, 51, 54], "py": [1, 10, 15, 20, 51, 52], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, 64, 66, 68, 69, 70, 72, 73], "need": [1, 15, 29, 31, 41, 45, 47, 49, 51, 52, 57], "ask": [1, 22, 41], "administr": [1, 8, 36], "further": [1, 8, 30, 31, 34, 36, 38, 40, 47, 51, 57], "detail": [1, 3, 6, 8, 13, 14, 16, 17, 18, 20, 22, 23, 24, 25, 26, 27, 29, 40, 41, 42, 44, 45, 51, 55, 58, 68], "id": [1, 8, 13, 36, 38, 49, 51, 57, 61, 64], "0": [1, 39, 41, 51, 54, 68], "top": [1, 2, 15, 41, 44, 49, 57, 58, 60, 63, 71, 73], "collect": [1, 15, 39], "project": [1, 3, 9, 13, 20, 26, 32, 39, 40, 42, 43, 53, 60, 66], "acdh": [1, 15], "topcollect": 1, "url": [1, 7, 11, 13, 15, 20, 25, 26, 38, 41, 44, 49, 52], "http": [1, 7, 13, 15, 26, 38, 51], "curat": 1, "dev": 1, "oeaw": 1, "ac": 1, "base": [1, 15, 21, 26, 36, 38, 42, 45, 48, 51, 53, 57, 68], "get": [1, 7, 8, 33, 36, 37, 38, 59, 66], "The": [1, 3, 5, 7, 8, 10, 16, 18, 20, 22, 24, 26, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 64, 71, 72], "button": [1, 3, 5, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 51, 54, 55, 57, 58, 60, 61, 66, 71, 73], "displai": [1, 2, 3, 4, 6, 8, 10, 13, 14, 15, 20, 25, 26, 29, 36, 38, 40, 43, 44, 45, 47, 50, 51, 52, 56, 59, 61, 65, 73], "admin": [1, 4, 5, 8, 13, 14, 15, 20, 26, 38, 43, 51, 57, 59, 60], "menu": [1, 7, 20, 22, 27, 29, 30, 31, 33, 34, 35, 36, 40], "onli": [1, 3, 4, 6, 7, 8, 14, 15, 16, 19, 20, 26, 29, 38, 39, 40, 41, 45, 48, 51, 55, 57, 58, 59, 61, 62, 64, 68], "mention": [1, 16, 17, 20, 21, 30], "abov": [1, 3, 31, 35, 42, 60, 63], "made": [1, 10, 17, 31, 33, 36, 40, 41, 47, 52], "click": [1, 3, 4, 5, 14, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 46, 50, 54, 55, 57, 60, 66, 68, 73], "section": [1, 39, 51], "provid": [1, 7, 8, 15, 20, 25, 26, 39, 41, 45, 51, 54, 60, 61, 62, 63, 64], "part": [1, 3, 17, 18, 19, 21, 27, 28, 33, 39, 41, 49, 55, 59], "manag": [1, 5, 8, 14, 15, 26, 29, 38, 43, 52, 59, 60, 66, 68], "group": [1, 8, 9, 15, 16, 17, 18, 21, 26, 29, 31, 33, 35, 36, 37, 38, 40, 41, 42, 53, 55, 64], "list": [1, 3, 5, 8, 16, 17, 18, 20, 23, 24, 25, 26, 27, 30, 31, 33, 34, 35, 36, 38, 41, 42, 49, 50, 51, 55], "tabl": [1, 6, 8, 14, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 42, 48, 49, 50, 60, 72], "artifact": [1, 3, 8, 15, 16, 18, 21, 22, 24, 27, 28, 29, 32, 33, 35, 39, 40, 43, 55, 71], "wa": [1, 8, 16, 17, 18, 22, 29, 31, 35, 36, 39, 48, 51, 52, 55, 60, 66, 68], "shown": [1, 3, 4, 5, 8, 13, 20, 25, 26, 29, 36, 38, 41, 58, 60, 68], "all": [1, 5, 8, 10, 11, 14, 15, 20, 29, 30, 31, 33, 34, 36, 38, 39, 40, 41, 44, 45, 47, 48, 49, 51, 52, 60, 63, 69], "metadata": 1, "gather": 1, "exif": 1, "endpoint": [1, 15, 43], "first": [1, 3, 4, 8, 10, 20, 21, 22, 30, 31, 36, 39, 42, 51, 68], "imag": [1, 6, 7, 18, 30, 31, 41, 43, 49, 52, 53, 56, 57, 58, 60], "2_jpg": 1, "addition": [1, 35, 62], "correspond": [1, 3, 7, 8, 26, 29, 36, 38, 39, 47, 60], "png": [1, 7, 20, 58], "4_orthophoto": 1, "taken": [1, 48], "necessari": [1, 20, 29, 30, 38, 40, 41, 49, 61], "new": [1, 8, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 29, 33, 34, 37, 41, 55, 56, 60, 66], "person": [1, 3, 4, 8, 16, 17, 18, 21, 22, 26, 31, 33, 34, 35, 37, 41, 42, 49, 55, 59, 60, 62], "etc": [1, 3, 6, 19, 21, 24, 28, 30, 37, 49, 51, 52, 71], "ad": [1, 14, 15, 18, 21, 26, 29, 31, 35, 38, 39, 40, 43, 51, 55, 56, 59, 61, 62], "dure": [1, 3, 18, 25, 31, 45], "process": [1, 5, 6, 8, 20, 41, 52], "custom": [1, 5, 8, 14, 15, 20, 30, 40, 43], "hierarchi": [1, 5, 9, 15, 18, 24], "relev": [1, 30], "actor": [1, 17, 18, 20, 21, 22, 24, 25, 27, 29, 31, 34, 35, 37, 39, 43, 44, 48, 60, 67, 68], "e21": [1, 16, 49], "involv": [1, 9, 18, 30, 31, 33, 34], "e65": [1, 18], "creation": [1, 6, 30, 34, 38, 40], "p": [1, 44], "cidoc_ent": 1, "e12": [1, 18, 48], "event": [1, 3, 16, 17, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 32, 39, 43, 48], "addit": [1, 14, 30, 33, 36, 38, 39, 41, 42, 45, 51, 54, 59, 68, 69], "copyright": [1, 49], "name": [1, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 44, 47, 48, 49, 60, 62, 70, 73], "e22": [1, 17, 48], "object": [1, 7, 17, 21, 27, 31, 34, 36, 42, 45, 47, 49, 57], "graffito": 1, "iptc": 1, "objectnam": 1, "xmp": 1, "p67": [1, 49], "e32": [1, 26, 49], "e53": [1, 24, 48], "place": [1, 3, 9, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31, 32, 33, 34, 35, 39, 40, 41, 42, 43, 44, 47, 48, 49, 51, 57, 60, 62, 63, 67, 71], "locat": [1, 16, 18, 19, 24, 34, 35, 36, 42, 44, 51, 52, 57, 66], "p53": 1, "gpslatitud": 1, "gpslongitud": 1, "date": [1, 5, 9, 14, 16, 17, 18, 19, 21, 24, 28, 29, 30, 31, 33, 34, 35, 36, 37, 40, 43, 56, 60, 62, 63, 70], "created": 1, "p11": [1, 44, 48], "p108": 1, "p14": 1, "p92": [1, 48], "e31": [1, 20, 25, 47, 49], "document": [1, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33, 47, 48, 49, 51, 67, 69], "p2": [1, 44, 48], "artist": 1, "cutomis": 2, "text": [2, 5, 8, 14, 25, 27, 29, 31, 33, 34, 35, 36, 38, 39, 40, 43, 55, 57, 62, 68], "avail": [2, 4, 5, 7, 8, 12, 15, 16, 26, 30, 34, 35, 36, 37, 38, 40, 42, 43, 44, 45, 47, 49, 51, 57, 58, 62, 73], "languag": [2, 6, 15, 36, 60, 71], "intro": 2, "start": [2, 3, 5, 8, 18, 26, 33, 34, 35, 36, 38, 39, 43, 45, 63, 71], "page": [2, 4, 8, 12, 13, 16, 17, 18, 20, 23, 24, 25, 26, 27, 31, 35, 38, 39, 40, 45, 46, 49, 50, 51, 54, 58, 60, 63, 64, 71, 73], "befor": [2, 3, 8, 29, 30, 34, 39, 51, 58, 68], "contact": [2, 10, 66], "site": [2, 6, 9, 19, 20, 31, 41, 43, 51, 55, 59, 60, 63, 64], "e": [2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 49, 51, 52, 53, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "g": [2, 3, 4, 5, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 51, 52, 53, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "inform": [2, 3, 6, 8, 14, 17, 18, 20, 21, 22, 24, 26, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 54, 57, 60, 61, 68, 69], "websit": [2, 13, 25, 26, 38, 43, 52, 53], "maintain": [2, 42, 45], "legal": 2, "notic": [2, 6, 45, 51], "about": [2, 4, 8, 14, 26, 35, 36, 41, 43, 68], "institut": [2, 16, 37], "citat": [2, 16, 17, 18, 19, 30], "exampl": [2, 3, 5, 8, 10, 13, 16, 18, 21, 22, 24, 26, 27, 28, 29, 31, 34, 35, 36, 38, 39, 42, 43, 47, 48, 49, 51, 52, 57, 68], "underneath": 2, "form": [2, 9, 10, 26, 33, 35, 36, 37, 38, 39, 40, 41, 45, 47, 51, 52, 55, 60, 61, 68], "field": [2, 9, 26, 31, 36, 37, 38, 40, 42, 43, 48, 55, 57, 60, 61, 68, 70, 71, 72, 73], "an": [2, 3, 4, 5, 6, 7, 8, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 35, 36, 37, 38, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 55, 57, 58, 59, 60, 61, 64, 68, 70, 72], "insert": [2, 4, 14, 25, 30, 31, 33, 34, 35, 36, 38, 40, 57, 60], "updat": [2, 3, 4, 8, 14, 25, 26, 29, 57, 60], "edit": [2, 9, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 36, 37, 38, 39, 40, 42, 45, 47, 55, 60, 61, 62, 64], "bibliographi": [2, 25, 31, 47, 49], "entri": [2, 3, 8, 14, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 50, 58, 60, 70, 72, 73], "cogwheel": 2, "icon": [2, 20, 26, 29, 57, 60], "right": [2, 8, 29, 49, 51, 57, 58, 60, 71, 72, 73], "corner": [2, 57, 71], "thei": [2, 3, 8, 18, 20, 21, 26, 28, 29, 33, 34, 40, 41, 44, 47, 49, 51, 54, 57, 59, 62, 63, 72], "contain": [2, 5, 8, 26, 28, 49, 52, 62, 71, 73], "put": [3, 33, 38, 39, 41, 45], "great": 3, "emphasi": [3, 42, 45], "qualiti": [3, 7, 29, 42], "even": [3, 8, 60, 62], "respons": [3, 20, 41, 51], "enter": [3, 6, 8, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 42, 43, 50, 51, 55, 57, 60, 66, 68], "ultim": 3, "li": [3, 39], "individu": [3, 21, 30, 54], "avoid": [3, 41, 47], "inconsist": 3, "technic": [3, 41, 44], "level": [3, 6, 11, 14, 30, 42, 49, 58, 60, 61], "develop": [3, 20, 41, 42, 43, 44, 45, 51], "applic": [3, 4, 26, 31, 38, 40, 42, 43, 45, 47, 51, 57], "It": [3, 8, 18, 20, 24, 26, 28, 29, 31, 33, 34, 35, 39, 41, 44, 45, 51, 62, 63, 71, 72], "therefor": [3, 18, 20, 26, 29, 31, 41, 45, 47, 54], "possibl": [3, 9, 18, 20, 24, 28, 29, 31, 33, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 49, 51, 54, 57, 61, 71], "after": [3, 4, 6, 9, 10, 20, 31, 34, 35, 36, 40, 51, 57, 61, 63, 66], "end": [3, 8, 13, 16, 33, 34, 35, 36, 39, 44, 48, 51, 62, 68], "same": [3, 8, 19, 21, 28, 32, 33, 34, 37, 41, 47, 48], "nevertheless": [3, 44], "mistak": [3, 66], "happen": [3, 18, 33, 45, 68], "also": [3, 8, 10, 20, 26, 30, 31, 33, 36, 38, 39, 40, 41, 42, 44, 46, 48, 55, 58, 62, 66, 71], "when": [3, 5, 8, 14, 20, 26, 29, 31, 34, 36, 38, 40, 41, 50, 51, 57, 58, 59, 60, 62, 66, 68], "from": [3, 8, 9, 10, 15, 18, 20, 22, 26, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 49, 51, 52, 54, 57, 60, 62, 68], "delet": [3, 4, 5, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 36, 55, 59], "outsid": 3, "function": [3, 4, 8, 10, 11, 26, 36, 37, 42, 49, 52, 53], "were": [3, 6, 18, 20, 29, 33, 47, 54, 60], "implement": [3, 41, 42, 49], "describ": [3, 30, 31, 33, 34, 36, 37, 51], "below": [3, 4, 14, 24, 30, 31, 37, 42, 52, 55, 66, 73], "here": [3, 8, 12, 18, 26, 29, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 52, 55, 60, 63, 64, 65, 68], "unlink": 3, "These": [3, 7, 29, 33, 42, 44, 47, 48, 54], "so": [3, 4, 8, 20, 22, 30, 31, 36, 39, 41, 44, 47, 51, 52, 58, 68], "call": [3, 19, 41, 47, 51, 52, 54], "could": [3, 38, 41, 68, 72], "result": [3, 5, 9, 13, 37, 41, 42, 51, 54, 57, 58, 61, 62, 68], "bug": [3, 63, 64], "seem": 3, "appear": [3, 5, 29, 38, 54], "regularli": 3, "known": [3, 8, 31, 36, 39, 42, 57], "pleas": [3, 8, 15, 18, 20, 21, 24, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 51, 57, 63, 64, 65, 66], "report": [3, 63, 65], "issu": [3, 51, 56, 65], "team": [3, 20, 32, 41, 44], "via": [3, 8, 12, 30, 33, 35, 36, 37, 39, 42, 43, 45, 48, 49, 51, 53, 54, 55], "redmin": [3, 43], "have": [3, 6, 7, 8, 13, 18, 20, 24, 26, 29, 30, 31, 33, 34, 38, 39, 40, 41, 44, 49, 51, 57, 60, 62, 63, 64], "relat": [3, 16, 18, 20, 33, 36, 42, 44, 52, 53, 66], "Of": [3, 41], "cours": [3, 22, 41, 57], "normal": [3, 44], "set": [3, 6, 7, 8, 10, 12, 14, 26, 29, 32, 36, 38, 41, 42, 51, 53, 57, 58, 59, 62, 66, 71], "should": [3, 7, 8, 20, 29, 34, 38, 39, 51, 58, 63], "correct": [3, 8, 20, 36, 41], "accid": 3, "creat": [3, 4, 5, 7, 8, 9, 13, 14, 17, 18, 22, 24, 26, 28, 29, 30, 31, 34, 37, 41, 47, 49, 51, 57, 60, 62, 68], "associ": [3, 8, 14, 24], "been": [3, 7, 36, 44], "pre": [3, 26, 29], "instal": [3, 7, 26, 29, 41, 51, 52], "never": 3, "most": [3, 18, 22, 41, 49, 51, 52, 66, 68], "like": [3, 8, 13, 22, 24, 29, 40, 41, 49, 52, 54, 63, 69], "caus": [3, 8], "dataset": [3, 26, 49], "themselv": [3, 19, 28, 44], "There": [3, 8, 40, 41, 44, 60, 63, 69], "three": 3, "option": [3, 7, 9, 14, 20, 26, 29, 31, 36, 41, 56, 57, 60, 62, 69], "proce": [3, 8, 66], "relink": 3, "add": [3, 7, 8, 14, 16, 17, 18, 19, 25, 26, 27, 29, 30, 33, 34, 35, 36, 37, 38, 39, 41, 51, 59, 60, 61, 69], "between": [3, 18, 31, 33, 39, 40, 45, 47, 48, 49, 54, 58], "remov": [3, 26], "whole": [3, 8, 27, 49], "featur": [3, 4, 8, 11, 17, 21, 22, 24, 26, 28, 29, 31, 39, 43, 47, 54, 55, 60, 63], "connect": [3, 24, 28, 30, 31, 37, 39, 41, 44, 46, 48, 49, 51, 57, 58], "itself": [3, 21, 28, 30, 39, 41, 49], "ha": [3, 4, 6, 7, 8, 15, 20, 24, 26, 30, 31, 36, 41, 44, 51, 58], "marri": [3, 16], "themself": 3, "super": [3, 8, 17, 29, 40, 44], "shouldn": [3, 64], "t": [3, 4, 5, 8, 14, 18, 20, 43, 44, 49, 55, 59, 63, 64, 65, 66, 68, 72], "within": [3, 8, 15, 17, 26, 32, 37, 39, 42, 44, 45, 47, 57], "": [3, 4, 5, 13, 18, 24, 28, 29, 30, 31, 33, 38, 40, 41, 42, 47, 48, 52, 54, 72], "databas": [3, 4, 8, 9, 19, 21, 26, 28, 30, 31, 33, 35, 38, 41, 42, 43, 44, 45, 49, 52, 68], "through": [3, 8, 18, 20, 26, 44, 51], "find": [3, 8, 21, 26, 32, 35, 36, 40, 41, 42, 43, 45, 52, 62, 65, 68, 71, 72], "previou": [3, 51], "view": [3, 6, 8, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 34, 36, 37, 45, 51, 52, 55, 57, 58, 59, 60], "variou": [3, 24, 26, 30, 35, 36, 42, 49], "tab": [3, 6, 7, 26, 30, 31, 33, 34, 35, 37, 51, 55, 57, 59], "combin": [3, 8, 26, 38, 42, 44, 48, 49, 57], "begin": [3, 4, 5, 8, 16, 31, 34, 39, 48, 62, 68], "That": 3, "later": [3, 8, 30, 31, 41], "than": [3, 8, 24, 31, 41, 58], "fix": [3, 4, 8, 51, 63], "otherwis": 3, "interfac": [3, 29, 30, 45, 47, 51, 60, 64, 71], "won": [3, 8, 20, 41, 59], "soon": 3, "incompat": 3, "particip": [3, 16, 18, 22, 31, 33, 44, 48], "longer": [3, 43], "last": [3, 4, 14, 36, 62], "chain": 3, "succeed": 3, "show": [3, 8, 9, 20, 26, 36, 39, 41, 45, 51, 58, 59, 60, 62, 63, 66, 68, 73], "hierarch": [3, 29, 40], "began": 3, "everi": [3, 4, 7, 29, 30, 41], "its": [3, 17, 24, 29, 30, 34, 39, 40, 44, 45, 51, 57, 58], "cidoc": [3, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 33, 42, 43, 45, 46, 47, 48, 52, 53, 60, 67, 68, 69], "valid": [3, 6, 8, 15, 26, 42, 45, 46, 48, 51, 57, 68], "amount": [3, 60, 61, 73], "take": [3, 4, 5, 8, 18, 44, 54], "some": [3, 4, 5, 26, 29, 32, 38, 39, 41, 44, 45, 51, 52, 57, 58, 63, 64], "time": [3, 4, 5, 8, 20, 31, 32, 33, 34, 41, 44, 51, 60, 62, 68, 73], "while": [3, 25, 42, 45, 47, 49, 51, 54], "alwai": [3, 8], "conform": [3, 45], "found": [3, 8, 24, 29, 31, 35, 36, 38, 39, 40, 44, 45, 47, 51, 62, 71], "problem": [3, 8, 24, 41, 65, 66], "resolv": [3, 13, 26, 38, 48, 49, 52], "origin": [3, 9, 49, 60], "sourc": [3, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 35, 39, 43, 45, 47, 49, 51, 52, 71], "two": [3, 8, 39, 41, 48, 51], "test": [3, 4, 7, 10, 52], "ident": 3, "afterward": [3, 29, 30, 33], "case": [3, 4, 7, 8, 18, 20, 25, 29, 30, 31, 33, 36, 39, 43, 49, 51, 52, 56, 59, 60, 62, 63, 65, 66], "singl": [3, 15, 16, 29, 40, 51], "multipl": [3, 4, 7, 8, 15, 20, 29, 30, 33, 36, 40, 42, 43, 49, 73], "castl": 3, "citi": [3, 24, 26], "one": [3, 4, 8, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 41, 48, 51, 58, 60, 62, 68, 72], "would": [3, 8, 13, 19, 24, 26, 30, 31, 34, 41, 63], "automat": [3, 4, 6, 8, 9, 20, 26, 41, 44, 45, 66, 68], "anyon": [3, 45], "given": [3, 8, 15, 18, 39, 42, 51, 54, 61], "look": [3, 8, 13, 18, 24, 26, 33, 35, 41], "wrong": 3, "ones": [3, 33, 36, 37, 60], "next": [3, 22, 30, 40], "column": [3, 8, 57], "By": [3, 26, 30, 31, 35, 36, 39, 40, 57], "due": [3, 39, 42, 44], "reoccur": 3, "search": [3, 6, 8, 26, 36, 42, 43, 51, 56, 69, 71, 72, 73], "select": [3, 4, 7, 8, 15, 18, 20, 26, 29, 30, 31, 34, 35, 36, 38, 39, 44, 51, 55, 58, 60, 62], "volum": 3, "follow": [3, 5, 7, 8, 13, 18, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 44, 49, 50, 51, 53, 54, 57, 61], "class": [3, 5, 9, 15, 26, 29, 38, 40, 41, 43, 45, 46, 48, 49, 52, 53, 58, 60, 62], "ratio": [3, 54], "how": [3, 6, 11, 26, 29, 30, 31, 33, 34, 35, 37, 43, 44, 47, 52, 60], "100": [3, 36, 39], "mean": [3, 34, 41, 57], "fuzzywuzzi": 3, "packag": 3, "which": [3, 7, 8, 11, 15, 16, 17, 18, 21, 24, 25, 28, 29, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 49, 51, 52, 55, 57, 58, 62, 63, 66, 68, 71, 72], "levenshtein": 3, "distanc": [3, 58], "direct": [4, 42, 44, 58], "warn": [4, 5, 8, 51, 63], "manipul": [4, 51, 57], "loss": [4, 7], "unus": 4, "backup": [4, 5, 8], "export": [4, 9, 14, 42, 43, 51, 52], "download": [4, 5, 49, 51, 56], "lose": 4, "crash": 4, "local": [4, 51], "version": [4, 7, 13, 33, 43, 44, 47], "note": [4, 7, 21, 30, 31, 33, 35, 36, 38, 39, 40, 42, 43, 44, 48, 50, 51, 53, 56], "recent": 4, "max": [4, 11, 20, 60], "dai": [4, 8, 39, 68], "old": [4, 36], "either": [4, 15, 20, 34, 39, 41, 51, 57, 66], "simpl": 4, "power": 4, "unlik": [4, 33], "rest": [4, 15, 51], "safeguard": 4, "prevent": 4, "total": [4, 20], "make": [4, 8, 13, 14, 18, 36, 42, 43, 60, 63, 66], "lost": [4, 8], "server": [4, 7, 41, 42, 51, 55], "depend": [4, 9, 33, 35, 36, 40, 41, 48, 54, 66], "situat": [4, 29, 41], "effort": [4, 42], "transact": [4, 8], "commit": 4, "build": [4, 19, 30, 36, 45], "around": [4, 58], "statement": 4, "don": [4, 20, 41, 44, 49, 64, 72], "refresh": [4, 39], "press": [4, 30, 31, 34, 36, 37, 40, 45, 61], "f5": [4, 63], "again": [4, 31, 66], "termin": 4, "queri": [4, 51], "row": [4, 6, 8, 39, 60, 68], "count": [4, 6, 41, 44], "veri": [4, 24, 32, 41, 63], "readabl": [4, 51, 58], "affect": 4, "error": [4, 6, 8, 43, 61, 65, 66], "noth": [4, 8, 63], "worri": [4, 41], "becaus": [4, 41, 62, 63], "Be": [5, 7, 41, 51, 55, 58], "awar": [5, 7, 20, 41, 51, 55, 58], "especi": [5, 8, 41], "share": 5, "email": [5, 6, 10, 14, 53, 60, 66], "address": [5, 10, 13, 60], "includ": [5, 11, 18, 20, 35, 38, 41, 42, 44, 49, 51, 60, 62], "save": [5, 14, 30, 31, 33, 34, 35, 36, 38, 61], "folder": [5, 7], "directori": [5, 7], "isn": [5, 66], "writabl": 5, "2018": 5, "08": [5, 48], "23_1533_export": 5, "exist": [5, 8, 13, 16, 19, 20, 24, 28, 29, 31, 37, 41, 44, 48, 51, 64, 66], "pg_dump": 5, "plain": 5, "format": [5, 7, 8, 26, 42, 43, 51, 69], "fill": [5, 8, 20, 24, 33, 38, 39, 40, 62, 68], "empti": [5, 10, 20], "psql": 5, "archiv": [5, 20, 26, 41, 59], "fc": 5, "pg_restor": 5, "restor": 5, "regardless": 5, "oper": [5, 8], "line": [5, 36, 39, 51, 57, 69], "break": [5, 51, 69], "d": [5, 31, 38, 54], "1": [5, 8, 30, 39, 44, 47, 54, 68], "zip": 5, "sever": [5, 20, 31, 36, 41, 48], "entiti": [5, 8, 9, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 38, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 55, 58, 59, 60, 62, 64, 67], "divid": [5, 24, 42, 54], "properti": [5, 18, 45, 46, 47, 48, 53], "geometri": [5, 8, 36, 56], "current": [5, 7, 8, 26, 33, 42, 44, 45, 48, 51, 57, 60, 63], "2022": [5, 51], "10": [5, 39, 48, 57], "04_1610": 5, "kei": [5, 44, 63], "tag": [5, 41, 51], "prefer": [6, 15, 42, 53, 60], "profil": [6, 8, 12, 14, 20, 39, 42, 43, 45, 51, 56, 57, 68, 73], "valu": [6, 9, 12, 13, 39, 40, 41, 49, 51, 54, 61, 62, 68], "choos": [6, 8, 15, 17, 20, 29, 30, 31, 34, 35, 36, 37, 38, 40, 45, 58], "much": [6, 7, 31], "At": [6, 16, 17, 18, 20, 23, 24, 25, 27, 33, 41, 48, 55], "moment": [6, 39, 48, 58], "info": [6, 14, 20, 25], "minimum": 6, "jstree": 6, "charact": [6, 8, 69], "filter": [6, 41, 42, 51, 52, 62, 73], "tree": [6, 31, 41], "type": [6, 9, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 49, 54, 58, 72, 73], "random": 6, "password": [6, 10, 14, 15, 42, 56], "length": 6, "reset": [6, 10, 14, 42, 60], "upon": 6, "requir": [6, 8, 14, 20, 26, 33, 35, 36, 38, 41, 42, 51, 63, 70, 72], "confirm": [6, 42], "hour": [6, 60, 68], "long": [6, 20, 41, 73], "code": [6, 43, 44, 45, 51, 52, 65], "fail": [6, 66], "login": [6, 7, 10, 14, 43, 65], "often": [6, 22, 52], "attempt": 6, "specif": [6, 8, 20, 26, 29, 32, 37, 40, 41, 42, 43, 44, 47, 48, 51, 53, 57, 66], "usernam": [6, 10, 11, 14, 15, 66], "forget": [6, 41], "minut": [6, 60, 66, 68], "mani": [6, 13, 20, 24, 26, 41, 44, 63], "wait": [6, 66], "chosen": [6, 8, 36, 38, 40, 41], "number": [6, 8, 26, 48, 49, 51, 66], "exceed": 6, "activ": [6, 14, 18, 20, 31, 42, 44, 57, 60, 62, 63, 68], "preview": [6, 8], "open": [7, 26, 34, 35, 38, 41, 42, 43, 51, 55, 57], "standard": [7, 37, 40, 42, 44, 72], "deliv": [7, 42], "high": [7, 26, 38, 42, 57], "attribut": [7, 26, 41, 42], "onlin": [7, 38, 42], "scale": [7, 20, 42], "onc": [7, 55], "see": [7, 8, 14, 21, 22, 24, 28, 31, 33, 34, 35, 36, 37, 38, 40, 42, 45, 47, 49, 51, 55, 58, 60, 63, 64, 66], "configur": [7, 13, 20, 52, 53, 55], "item": [7, 20, 27, 29, 40, 47], "enabl": [7, 8, 20, 26, 42, 45, 55, 57, 58], "expos": 7, "checkbox": [7, 26, 29, 57, 66], "complet": 7, "api": [7, 9, 15, 20, 26, 41, 42, 43, 49, 52, 60], "yourserv": 7, "eu": [7, 13, 51], "manifest": [7, 42], "2": [7, 30, 39, 44, 47, 54], "path": [7, 51], "absolut": 7, "drop": [7, 20, 38, 58], "zone": 7, "var": 7, "www": [7, 15, 26, 38], "iipsrv": 7, "write": 7, "execut": [7, 9, 43, 52], "webserv": 7, "convers": 7, "control": [7, 15, 38, 51], "convert": [7, 55, 68], "pyramid": 7, "tiff": 7, "none": [7, 36, 41, 51, 53, 63], "deflat": 7, "lossless": 7, "size": [7, 20, 53], "mai": [7, 24, 39, 41, 44, 51, 52, 58, 63, 64], "larg": [7, 20, 36, 39, 58], "jpeg": [7, 20], "smaller": [7, 52], "transpar": 7, "run": [7, 8, 13, 41, 52], "sub": [7, 8, 9, 17, 18, 29, 33, 35, 44], "accordingli": 7, "successfulli": 7, "bmp": [7, 20], "gif": [7, 20], "ico": [7, 20], "jpg": [7, 20], "svg": [7, 20], "tif": 7, "directli": [8, 30, 38, 41, 45, 47, 54], "csv": [8, 9, 42], "gi": 8, "unit": [8, 17, 19, 21, 22, 29, 36, 39, 43, 47, 48, 54, 61], "histor": [8, 22, 26, 36, 38, 39, 43], "regard": [8, 31, 38, 40, 53], "integr": [8, 9, 26, 43, 58], "caution": 8, "consum": 8, "we": [8, 41, 44, 63], "strongli": 8, "advis": 8, "sql": [8, 9, 43, 52], "ani": [8, 30, 31, 41, 49, 51], "older": [8, 63], "enforc": 8, "check": [8, 9, 10, 14, 26, 29, 35, 39, 42, 43, 46, 58, 60, 62], "alright": 8, "encapsul": 8, "script": [8, 44], "example_place_hierarchi": 8, "sure": [8, 36, 51, 63, 66, 68], "extens": [8, 20, 45, 51], "spell": [8, 39, 67], "correctli": [8, 39], "lower": [8, 24], "my_data": 8, "header": [8, 73], "each": [8, 15, 20, 21, 24, 39, 40, 42, 44, 45, 46, 49, 51, 54], "separ": [8, 41], "comma": 8, "enclos": 8, "doubl": [8, 36], "quot": 8, "To": [8, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 45, 47, 48, 51, 52, 57, 62, 67, 68, 73], "said": [8, 34], "titl": [8, 18, 51, 57], "messag": [8, 51, 63, 64, 66], "uniqu": [8, 26, 49], "per": [8, 73], "prefix": 8, "them": [8, 18, 22, 29, 32, 33, 36, 41, 55, 60, 63], "person_1": 8, "place_1": 8, "underscor": 8, "_": 8, "hyphen": 8, "miss": [8, 9, 41, 44, 63, 68], "begin_from": [8, 48], "begin_to": [8, 48], "end_from": [8, 48], "end_to": [8, 48], "type_id": 8, "value_typ": 8, "reference_id": 8, "alreadi": [8, 13, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35, 38, 40, 41, 50, 55, 60, 68], "origin_reference_id": 8, "reference_system_": 8, "administrative_unit_id": 8, "historical_place_id": 8, "parent_id": 8, "openatlas_parent_id": 8, "openatlas_class": 8, "string": [8, 48, 69], "alias": [8, 60, 62, 67, 73], "semicolon": 8, "surround": 8, "yyyi": [8, 39, 62], "mm": [8, 39], "dd": [8, 39], "out": [8, 18, 29, 33, 36, 40, 41, 48, 51, 57, 62, 63, 68], "timefram": 8, "For": [8, 15, 18, 19, 21, 22, 24, 26, 28, 30, 33, 34, 35, 41, 45, 47, 49, 51, 54, 66, 68], "timespan": [8, 68], "more": [8, 18, 19, 20, 21, 24, 26, 28, 29, 30, 31, 33, 35, 36, 38, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 62], "keep": [8, 9, 14, 29, 31, 32, 35, 36, 37, 38, 41, 45, 69], "mind": [8, 9, 29, 31, 32, 35, 36, 37, 38, 41], "incorrect": 8, "red": 8, "advanc": [8, 14, 62, 63, 69], "studi": [8, 29, 43], "space": [8, 20, 24, 30], "1234": [8, 13], "13": [8, 51], "65": 8, "pair": 8, "56": 8, "78": 8, "wrap": 8, "cell": 8, "quotat": 8, "mark": [8, 20, 29, 36, 41, 55, 70, 72], "iv": 8, "542": 8, "34": 8, "23": [8, 39, 48, 68], "66": 8, "just": [8, 20, 51, 68], "5678": 8, "literature_1": 8, "book_2": 8, "multi": 8, "point": [8, 18, 33, 34, 35, 36, 51, 57], "polygon": [8, 36, 57], "linestr": [8, 36, 57], "geometriccollect": 8, "wgs84": [8, 57], "geodet": 8, "epsg": [8, 57], "4326": [8, 57], "sinc": [8, 44, 72], "tall": 8, "12": [8, 39, 48, 62, 68], "458533781141528": 8, "41": 8, "922205268362234": 8, "53062334955289": 8, "917606998887024": 8, "52169797441624": 8, "888476931243254": 8, "coulmn": 8, "append": 8, "reference_system_wikidata": 8, "occur": [8, 35, 51], "substitut": 8, "reference_system_getty_aat": 8, "consist": [8, 19, 21, 26, 28, 30, 39, 41, 42, 44], "identifi": [8, 14, 22, 26, 36, 60], "q54123": 8, "second": [8, 60, 68, 73], "match": [8, 26, 36, 38, 44, 57], "close_match": 8, "exact_match": 8, "gener": [8, 9, 18, 33, 43, 51, 52, 53, 56, 63, 68], "togeth": [8, 20, 41, 44], "stratigraph": [8, 17, 19, 21, 22, 24, 43, 47, 48, 54, 61], "remain": [8, 16, 17, 22, 24, 28, 43, 54], "declar": 8, "insensit": 8, "question": [8, 22, 41], "structur": [8, 19, 22, 28, 41, 42, 43, 51], "archaeolog": [8, 19, 21, 22, 24, 28, 31, 42, 43], "model": [8, 41, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55, 59], "ll": [8, 43, 66], "duplic": [8, 9, 41, 72], "sensit": [8, 62], "king": [8, 31, 38, 39], "arthur": 8, "print": [8, 49], "doesn": [8, 18, 64, 65, 66], "stop": 8, "went": [8, 33], "summari": [8, 27], "brows": [8, 14, 44, 45], "layout": [8, 20, 52], "did": 8, "good": [8, 20, 24, 30], "idea": 8, "doc": [8, 48], "data_integrity_check": 8, "authent": [9, 10, 15, 43], "mail": [9, 14, 43], "modul": [9, 39, 43, 56, 57, 68], "map": [9, 17, 18, 19, 21, 22, 24, 26, 28, 30, 31, 35, 42, 43, 44, 45, 47, 48, 49, 56, 60], "iiif": [9, 41, 43, 55], "content": [9, 25, 27, 34, 43, 49, 57, 63], "present": [9, 20, 34, 41, 42, 43, 51, 57, 59], "orphan": [9, 58], "annot": [9, 43, 53, 56], "subunit": [9, 22, 27, 30], "circular": 9, "invalid": [9, 51], "preced": [9, 18, 33, 35, 39, 44, 48], "similar": [9, 26, 38, 41, 57, 68], "prepar": 9, "alia": [9, 16, 24, 30, 36, 70], "refer": [9, 14, 16, 17, 18, 19, 20, 21, 22, 24, 27, 28, 29, 30, 32, 34, 35, 39, 40, 41, 42, 43, 44, 45, 47, 53, 57], "wkt": [9, 56], "coordin": [9, 26, 36, 57], "extern": [9, 20, 25, 26, 31, 35, 38, 40, 41, 47, 51, 53], "dump": 9, "json": [9, 51], "xml": 9, "arch": [9, 20, 41, 43], "overview": [9, 13, 14, 20, 29, 35, 40, 43, 44, 45, 46, 47, 51, 52, 58, 59, 61], "fetch": 9, "reference_system": 9, "index": [9, 16, 17, 18, 20, 23, 24, 25, 27], "vocab": [9, 43], "vocabulari": [9, 38, 49], "ensur": [10, 20, 41], "disabl": [10, 11, 26], "leav": 10, "send": [10, 14, 35], "mail_password": 10, "smtp": 10, "net": [10, 13], "port": 10, "587": 10, "recipi": [10, 18], "feedback": [10, 63], "receiv": [10, 35, 60, 66], "zoom": [11, 36, 57, 58, 60], "defin": [11, 14, 20, 25, 33, 44, 48, 49, 52, 58, 60], "lowest": [11, 60], "adjust": [11, 12, 60], "far": [11, 60], "disableclusteringatzoom": 11, "cluster": [11, 36], "maxclusterradiu": 11, "maxim": 11, "rang": [11, 44, 48, 51, 61], "geonam": [11, 30, 38, 49, 56], "own": [12, 14, 16, 17, 21, 31, 36, 38, 41, 42, 45, 51], "wider": 13, "audienc": 13, "area": [13, 36, 54, 55, 57], "backend": [13, 53], "frontend": 13, "demo": [13, 44, 47, 51], "specifi": [13, 16, 20, 25, 29, 38, 39, 41, 42, 51], "newslett": [14, 42, 60], "subscript": 14, "registr": 14, "account": [14, 61], "sent": [14, 35], "cannot": [14, 26, 29, 35, 39, 64], "anymor": [14, 29, 64, 66], "inact": [14, 59], "modifi": [14, 18, 60], "full": [14, 36, 57, 60, 62], "easier": [14, 42, 60], "free": [14, 31, 33, 35, 36, 38, 39, 43, 49], "guest": 14, "who": [14, 16, 17, 21, 22, 33], "aren": [14, 20, 41, 68], "editor": [14, 20, 29, 40, 57, 60], "contributor": 14, "readonli": 14, "ye": 14, "skosmo": 15, "As": [15, 18, 31, 33, 35, 36, 38, 39, 45, 61], "ch": 15, "trail": 15, "slash": 15, "vocabs_pw": 15, "differ": [15, 18, 20, 30, 32, 33, 35, 36, 38, 40, 41, 42, 45, 47, 51, 58, 67, 69, 72], "confer": 15, "w3": 15, "org": [15, 26, 38, 51], "tr": 15, "sko": [15, 26, 38, 57], "primer": 15, "concept": [15, 26, 57], "child": 15, "conceptu": [15, 44, 45], "decid": [15, 40], "choic": [15, 29, 40], "what": [15, 58], "choosen": 15, "e74": 16, "albert": [16, 48], "einstein": [16, 48], "queen": 16, "victoria": 16, "peopl": [16, 18, 41], "famili": 16, "tribe": 16, "greenpeac": 16, "nation": 16, "museum": [16, 17, 21, 26, 31, 38, 44], "denmark": 16, "resid": 16, "main": [16, 41, 53, 71], "born": [16, 48], "where": [16, 18, 22, 29, 31, 33, 35, 36, 38, 41, 44, 51, 57, 58, 62, 68], "came": 16, "di": [16, 48], "mother": 16, "member": [16, 37], "kept": 16, "pictur": [16, 17, 19, 31, 55], "coin": [17, 30, 31], "potteri": [17, 30], "collector": 17, "carrier": 17, "carri": [17, 18, 30], "e7": [18, 48], "e8": 18, "e5": [18, 48], "e11": 18, "e9": 18, "common": [18, 26, 51, 65], "battl": [18, 35, 39], "meet": [18, 62], "wed": 18, "owner": [18, 31], "anoth": [18, 20, 24, 29, 31, 33, 34, 41, 44, 49, 51, 60], "natur": [18, 38, 47], "disast": 18, "track": [18, 31, 39, 42, 48, 53, 61], "conserv": 18, "treatment": 18, "movement": [18, 34], "crm": [18, 24, 33, 42, 43, 45, 46, 47, 48, 52], "war": [18, 35, 39, 48], "up": [18, 20, 36, 41, 62, 63, 66, 68], "journei": [18, 32, 35], "wai": [18, 19, 24, 26, 28, 31, 32, 34, 40, 44, 48, 49, 51], "donor": 18, "step": [18, 22, 24, 26, 30, 31, 32, 33, 34, 37, 41, 42], "instruct": [18, 24, 26, 31], "our": [18, 24, 26, 41, 43, 51], "ownership": 18, "acquir": [18, 31, 41], "surrend": 18, "creator": [18, 20, 41], "destin": 18, "unfortun": [18, 33], "background": [18, 42, 45, 47, 58, 68], "tutori": [18, 31, 33, 35, 36, 41], "produc": 18, "e18": [19, 24, 28, 47, 48], "physic": [19, 24, 28, 30, 31, 34, 36, 47, 48, 57], "thing": [19, 24, 28, 30, 36, 47, 48, 57], "record": [19, 21, 24, 28, 31, 34, 49, 54], "grave": [19, 21, 24, 28, 30, 36], "consid": [19, 24, 47, 49], "referenc": [19, 25, 28], "skeleton": [19, 21], "pit": [19, 30], "ditch": 19, "rampart": 19, "label": [19, 29, 44, 58, 68], "disk": 20, "display": 20, "upload": [20, 31, 42, 52, 53], "exce": 20, "limit": [20, 53, 68], "both": [20, 68], "go": [20, 24, 29, 30, 31, 39, 40, 45, 57], "drag": [20, 57, 58], "left": [20, 38, 50, 55, 57, 58], "furthermor": [20, 24, 26, 39, 40, 45], "practic": [20, 41], "licenc": 20, "besid": [20, 68], "plan": [20, 41], "indic": [20, 39, 41, 44, 48, 51], "design": [20, 36, 41, 42, 54], "holder": [20, 49], "Not": [20, 62], "maximum": 20, "mb": 20, "width": [20, 58], "pixel": [20, 58], "pdf": 20, "display_file_ext": 20, "chose": [20, 68], "do": [20, 29, 30, 31, 36, 39, 63], "height": [20, 29, 58], "120": 20, "px": 20, "larger": 20, "try": [20, 51, 58, 63, 64, 66, 68], "small": [20, 60], "impact": 20, "perform": [20, 31, 45, 56], "suppos": 20, "met": [20, 41], "must": [20, 39, 41, 44, 51], "those": [20, 24, 30, 39, 47, 51], "numer": [20, 44, 61], "flag": [20, 41], "viewer": [20, 41, 42, 55], "e20": 21, "biolog": [21, 30], "anthropolog": [21, 24, 30, 43, 56, 61], "bone": [21, 30, 54], "sex": [21, 29, 30, 42, 56], "gender": [21, 30], "ag": [21, 30, 42], "mask": [21, 30], "workflow": [21, 22, 24, 28, 30, 32, 42, 59], "acquisit": [21, 42], "modif": [21, 38, 40], "move": [21, 24, 31, 32, 58], "femur": [21, 30, 54], "humeru": [21, 54], "molar": 21, "historian": 22, "work": [22, 39, 42, 43, 63], "come": [22, 29, 41, 68], "usual": [22, 41], "facilit": [22, 26], "bit": 22, "hi": [22, 31, 39], "life": [22, 48], "archaeologist": 22, "reflect": [22, 34, 51], "contin": 24, "graveyard": [24, 30], "under": [24, 25, 26, 36, 38, 51, 66], "austria": 24, "itali": 24, "respect": [24, 26, 33, 34, 35, 36, 38, 41, 49, 57], "styria": 24, "duchi": 24, "bavaria": 24, "lombard": [24, 38], "kingdom": 24, "newli": [24, 28, 30, 31], "though": [24, 28], "e18phys": 24, "certain": [24, 29, 30, 36, 44, 48, 49, 57], "posit": [24, 30, 36, 49, 57], "extend": [24, 30, 33, 34, 57], "tempor": [24, 30, 35, 42], "spatial": [24, 30, 42, 57], "superior": 24, "cemeteri": 24, "compos": 24, "burial": [24, 28, 30, 36], "primari": 24, "secondari": [24, 27], "back": [24, 30, 31], "solv": [24, 63, 65], "book": [25, 30, 49], "inbook": 25, "articl": [25, 30, 51], "charter": [25, 27, 49], "chronicl": 25, "doi": [25, 49], "instead": [25, 34, 45, 51], "author": [26, 33, 49], "advantag": [26, 31], "abl": [26, 31, 41], "futhermor": 26, "merg": 26, "lod": [26, 38, 42], "analogu": 26, "librari": 26, "catalogu": 26, "inventori": [26, 38, 49], "collabor": 26, "multilingu": 26, "knowledg": [26, 45], "graph": [26, 58], "wikimedia": 26, "foundat": 26, "wikipedia": 26, "everyon": [26, 45], "cc0": 26, "domain": [26, 44, 48, 51], "usabl": [26, 51, 69], "geograph": [26, 49], "web": [26, 49, 52, 53], "creativ": 26, "over": [26, 29, 31, 36, 40, 41, 49, 61, 73], "25": [26, 48], "000": 26, "11": [26, 48, 51], "800": [26, 38, 68], "gemeinsam": 26, "normdatei": 26, "translat": [26, 27, 45, 47, 52, 53], "intern": [26, 42, 44, 45, 47], "organis": 26, "subject": 26, "head": 26, "corpor": 26, "bodi": 26, "mainli": 26, "increasingli": 26, "definit": [26, 38, 44, 45, 51], "confid": [26, 38, 57], "degre": [26, 38, 54, 57], "close": [26, 36, 38, 57], "suffici": [26, 38, 57], "interchang": [26, 38, 57], "retriev": [26, 38, 51, 57], "exact": [26, 36, 38, 39, 57, 68], "vienna": [26, 38, 61], "suitabl": [26, 33, 38, 52], "deal": [26, 41, 45, 47, 58], "primarili": [26, 28, 54], "wiki": [26, 38, 43], "q123": 26, "septemb": 26, "desir": [26, 30, 37, 38], "short": [26, 31, 35, 44], "mous": [26, 29, 40, 57, 58, 73], "yet": [26, 35], "attach": [26, 41, 51], "e33": [27, 45, 47, 49], "linguist": [27, 47, 49], "written": [27, 30, 34, 52], "mediev": [27, 49], "letter": [27, 31, 32, 33, 35, 44], "literatur": [27, 54], "comment": [27, 39, 62, 68], "tool": [28, 31, 42, 43, 51, 54, 57, 59, 61, 73], "lead": [28, 29, 41, 51], "backfil": [28, 30], "e55": [29, 48], "With": [29, 31, 34, 42, 46, 51, 57, 58, 66], "adapt": [29, 42, 60], "interest": [29, 45], "dynam": [29, 40], "statu": [29, 51], "higher": 29, "basic": [29, 40, 45], "root": [29, 52], "untyp": 29, "switch": [29, 57, 58, 71], "except": [29, 51, 60, 69], "unselect": 29, "categori": [29, 54], "permiss": [29, 38, 40, 42, 64], "renam": 29, "subtyp": 29, "grei": 29, "least": [29, 40, 41, 62], "decim": [29, 57], "dimens": [29, 30, 48], "weight": [29, 54], "centimetr": 29, "gram": 29, "percentag": 29, "unabl": 29, "fit": [29, 31, 35, 36], "reduc": 29, "typ": 29, "element": [30, 31, 33, 34, 60, 63], "procedur": [30, 33, 34], "3": [30, 48, 51, 54], "knife": 30, "4": [30, 41, 51, 62, 68], "teeth": 30, "classif": [30, 33, 34], "bout": 30, "concern": [30, 33, 34, 52], "store": [30, 31, 42, 48, 49], "state": [30, 36, 38, 51, 61], "appropri": [30, 31, 34], "settlement": 30, "magnifi": [30, 36, 57], "evid": 30, "plot": [30, 36], "photo": 30, "now": [30, 31, 34], "layer": [30, 36, 57], "finger": 30, "ring": [30, 48], "patholog": 30, "measur": [30, 61], "discolor": 30, "canin": 30, "represent": [31, 45], "repres": [31, 35, 36, 39, 47], "span": [31, 32, 48, 62, 68], "cover": [31, 36], "Then": [31, 36], "learn": 31, "On": [31, 33, 35], "land": [31, 35, 54], "kind": [31, 36, 40], "occurr": 31, "excav": [31, 55], "transfer": 31, "sold": 31, "leonardo": 31, "paint": 31, "mona": 31, "lisa": 31, "workshop": 31, "florenc": 31, "franci": 31, "franc": 31, "exhibit": 31, "ch\u00e2teau": 31, "ambois": 31, "fountainebleau": 31, "louvr": 31, "pari": 31, "typic": 32, "scenario": 32, "suggest": [32, 63, 65], "discuss": 32, "best": 32, "profess": [32, 43], "special": [33, 41, 42, 44, 47, 69], "trip": 33, "chronolog": 33, "captur": 33, "continu": [33, 35, 36, 48], "altern": [33, 41, 51], "role": [33, 38, 41], "determin": [33, 42, 44, 49, 54], "exchang": [34, 43], "materi": 34, "copi": [34, 36], "preset": 34, "subgroup": 35, "bring": [35, 38, 44], "simultan": 35, "music": 35, "festiv": 35, "parallel": 35, "concert": 35, "overlap": 35, "sequenc": [35, 44, 51], "introduct": [35, 43], "think": [35, 38, 39, 44, 64, 66], "screen": [36, 57], "glass": [36, 57], "pop": 36, "marker": [36, 57], "visual": [36, 42, 43, 50, 56], "hover": 36, "landscap": 36, "street": 36, "satellit": 36, "whether": [36, 73], "four": [36, 39], "mode": [36, 57, 58], "centerpoint": 36, "drawn": [36, 57], "border": 36, "river": 36, "bed": 36, "draw": [36, 55, 57], "shape": [36, 38, 54, 57], "rectangl": [36, 55, 57], "ground": 36, "hole": 36, "whose": 36, "unknown": [36, 39], "enough": [36, 39, 68], "window": 36, "dedic": 36, "countri": [37, 49], "gazett": [38, 49], "particularli": [38, 42], "But": [38, 41], "analog": 38, "card": [38, 49], "catalog": [38, 49], "wikidata": [38, 49], "manual": [38, 40, 41, 42, 50, 51, 52, 57], "q3044": 38, "charlemagn": 38, "input": [38, 51, 68], "2761369": 38, "AT": 38, "precis": [38, 57], "down": 38, "blank": 38, "belt": 38, "buckl": 38, "q3180027": 38, "todai": 38, "frank": 38, "becam": 38, "holi": [38, 48], "roman": 38, "emperor": 38, "venu": 38, "willendorf": 38, "histori": 38, "q131397": 38, "focus": 39, "statigraph": 39, "bottom": [39, 40, 57], "initi": [39, 68], "hidden": [39, 68], "year": [39, 48, 61, 62, 68], "4713": [39, 68], "9999": [39, 51, 68], "month": [39, 62, 68], "31": [39, 48, 54, 62, 68], "hh": 39, "59": [39, 51, 68], "ss": 39, "minu": 39, "bc": [39, 68], "softwar": [39, 42, 47, 52], "postgresql": [39, 44, 53, 68], "prolept": [39, 68], "gregorian": [39, 68], "calendar": [39, 68], "hast": 39, "fought": 39, "william": 39, "duke": 39, "normandi": 39, "norman": 39, "french": [39, 42], "troop": 39, "harold": 39, "godwinson": 39, "english": [39, 42], "armi": 39, "14th": 39, "octob": 39, "1066": 39, "14": 39, "alik": [39, 45], "Or": 39, "peac": 39, "westphalia": 39, "treati": 39, "sign": [39, 51], "1648": [39, 48], "osnabr\u00fcck": 39, "15th": 39, "m\u00fcnster": 39, "24th": 39, "thirti": [39, 48], "eighti": 39, "05": [39, 48], "15": 39, "24": [39, 48], "uncertain": 39, "third": 39, "fourth": 39, "actual": 39, "frame": 39, "certainti": 39, "death": [39, 48], "stephen": 39, "hungari": 39, "august": 39, "1038": 39, "birth": [39, 44, 48, 68], "01": [39, 62, 68], "975": 39, "earliest": 39, "latest": [39, 50], "howev": 39, "gear": [39, 45], "organ": 40, "distinct": [40, 49], "push": 40, "blue": 40, "light": 40, "answer": 41, "frequent": 41, "approach": [41, 51], "probabl": [41, 49, 63], "analys": [41, 43, 56, 61], "decis": 41, "regist": [41, 66], "hide": [41, 60], "reason": [41, 44, 51, 63, 66], "conflict": 41, "core": 41, "strict": 41, "better": 41, "lot": 41, "sai": 41, "alex": 41, "him": 41, "pick": 41, "he": 41, "although": 41, "filenam": 41, "cc": 41, "BY": 41, "unstructur": 41, "nor": [41, 44], "searchabl": [41, 60], "solut": [41, 63], "happi": 41, "help": [41, 45, 63, 65], "tailor": 41, "hesit": 41, "reach": [41, 50], "u": [41, 64], "topic": [41, 42, 51, 63], "linebreak": 41, "html": [41, 52], "markdown": 41, "bold": 41, "font": 41, "underlin": 41, "necessarili": 41, "handl": [41, 43], "interoper": 41, "easi": [42, 45, 51], "conveni": [42, 44, 47], "contribut": 42, "significantli": 42, "ontologi": [42, 44, 45], "easili": 42, "fair": 42, "principl": 42, "wide": [42, 44, 68], "uncertainti": [42, 68], "checker": [42, 43, 45], "quick": [42, 43, 62], "accord": [42, 47, 48, 66], "flexibli": 42, "thu": 42, "interact": [42, 57], "navig": [42, 56, 62, 73], "network": [42, 43, 50, 56], "bookmark": [42, 50, 53, 64], "context": 42, "internation": 42, "gettext": 42, "catalan": 42, "german": 42, "spanish": 42, "mirador": 42, "grant": 42, "autom": 42, "unsubscrib": [42, 60], "interdisciplinari": [42, 44], "method": [42, 54], "futur": 42, "ferembach": [42, 54], "et": [42, 54], "al": [42, 54, 71], "estim": [42, 56], "1979": [42, 54], "ment": [42, 61], "archeolog": 43, "geospati": 43, "radiocarbon": [43, 56], "shortcut": [43, 45, 68], "guid": 43, "paramet": [43, 58], "proxi": 43, "troubleshoot": 43, "faq": 43, "doe": [43, 44, 51], "why": 43, "iso": 44, "formal": 44, "council": 44, "icom": 44, "basi": [], "underli": 44, "v7": 44, "publish": [44, 54], "2021": 44, "pars": 44, "github": 44, "e39": [44, 48], "e67": [44, 48], "characteris": 44, "had": [44, 48, 68], "invers": 44, "anywai": 44, "ignor": 44, "foreign": 44, "sub_properties_of": 44, "suffix": 44, "counterpart": 44, "p3": [44, 48], "parser": 44, "com": [], "craw": [], "blob": [], "cidoc_rtfs_pars": [], "troubl": [], "prior": [45, 51], "verifi": 45, "fact": [], "gain": [], "insight": [], "graphic": 45, "symbol": [45, 51, 69], "introduc": 45, "increas": 45, "finer": [45, 47], "grain": [45, 47], "contextu": [45, 47], "lingust": [45, 47], "refin": [47, 62], "7": [47, 54], "compris": 47, "rel": 47, "differenti": 47, "confus": 47, "true": [47, 51], "simplifi": 48, "oa": 48, "p11i": 48, "stefan": 48, "joachim": 48, "son": 48, "father": 48, "usag": [45, 48, 56], "birthplac": 48, "p92i": 48, "brought": 48, "e63": 48, "p7": 48, "took": 48, "e521": 48, "e567": 48, "ulm": 48, "p93i": 48, "e64": 48, "e69": 48, "princeton": 48, "begin_com": 48, "end_com": 48, "timestamp": [48, 51], "e61": 48, "primit": 48, "p4": 48, "e52": 48, "p81": 48, "ongo": 48, "throughout": 48, "lanc": 48, "forg": 48, "durat": 48, "0770": 48, "destroi": [48, 68], "p13": 48, "destruct": 48, "e6": 48, "throw": 48, "lava": 48, "3019": 48, "03": 48, "p98i": 48, "1981": 48, "p100i": 48, "ladi": 48, "diana": 48, "1997": 48, "1618": 48, "purpos": 48, "e62": [48, 69], "p43": 48, "e54": 48, "bibliograph": 49, "delimit": 49, "along": 49, "chapter": 49, "figur": 49, "folio": 49, "7v": 49, "kell": 49, "saint": 49, "mari": 49, "21": 49, "less": 49, "eleven": 49, "million": 49, "charg": [49, 58], "distinguish": 49, "non": 49, "encyclopedia": 49, "domain_id": 49, "property_cod": 49, "range_id": 49, "alphanumer": [49, 61], "alon": [], "p67i": 49, "p71": 49, "terri": 49, "prattchet": 49, "q46248": 49, "p71i": 49, "e1": 49, "depict": 49, "scan": [], "extract": [], "mostli": 49, "logo": [50, 71], "upper": [50, 57], "program": 51, "analyt": 51, "mashin": 51, "tri": [51, 64], "constraint": 51, "hand": 51, "swagger": 51, "visit": 51, "rdf": 51, "visibl": [51, 57, 59], "commun": 51, "schema": [51, 53], "5117": 51, "machin": 51, "deprec": 51, "unstabl": 51, "unavail": 51, "notion": 51, "signific": 51, "major": [51, 54, 63], "minor": 51, "post": 51, "roadmap": 51, "releas": 51, "discontinu": 51, "openapi": 51, "lpf": 51, "geojson": 51, "deriv": 51, "sort": [51, 73], "consult": 51, "convent": 51, "success": 51, "failur": 51, "2xx": 51, "4xx": 51, "signal": 51, "5xx": 51, "tue": 51, "19": 51, "jul": 51, "gmt": 51, "404": 51, "kf": 51, "desc": 51, "flask": [51, 52], "catch": 51, "handler": 51, "behind": 51, "someurl": 51, "8080": 51, "No": 51, "python": 52, "framework": 52, "config": 52, "upgrad": 52, "live": [52, 62], "util": 52, "static": 52, "css": 52, "javascript": 52, "templat": 52, "compil": 52, "rout": 52, "redirect": 52, "sphinx": 52, "retrac": 52, "15883": 52, "init": 52, "before_request": 52, "get_by_id": 52, "some_data": 52, "some_filt": 52, "postgi": [53, 57], "assess": 54, "schwidetzki": 54, "m": 54, "stloukal": 54, "empfehlungen": 54, "f\u00fcr": 54, "die": 54, "alter": 54, "und": 54, "geschlechtsdiagnos": 54, "am": 54, "skelett": 54, "homo": 54, "30": [54, 57, 61], "32": 54, "skull": 54, "pelvi": 54, "examin": 54, "propos": 54, "margo": 54, "supramastoideu": 54, "o": 54, "sacrum": 54, "robust": 54, "supplement": 54, "glabella": 54, "w": 54, "arcu": 54, "superciliari": 54, "tuber": 54, "frontali": 54, "parietali": 54, "inclinatio": 54, "processu": 54, "mastoideu": 54, "relief": 54, "planum": 54, "nuchal": 54, "protuberantia": 54, "occipitali": 54, "externa": 54, "zygomaticu": 54, "zygomaticum": 54, "crista": 54, "supramastoideum": 54, "supraorbitali": 54, "orbita": 54, "mandibl": 54, "overal": 54, "mentum": 54, "angulu": 54, "inferior": 54, "m2": 54, "angl": 54, "sulcu": 54, "praeauriculari": 54, "incisura": 54, "ischiadica": 54, "pubi": 54, "arc": 54, "compos\u00e9": 54, "coxa": 54, "foramen": 54, "obturatum": 54, "corpu": 54, "ossi": 54, "ischii": 54, "iliaca": 54, "fossa": 54, "auricular": 54, "acetabuli": 54, "express": 54, "assign": 54, "femal": 54, "indiffer": 54, "male": 54, "preserv": 54, "sum": 54, "69": 54, "70": 54, "prerequisit": 55, "wasn": 55, "side": [55, 63], "guarante": 55, "overlai": [56, 60], "leaflet": 57, "mousewheel": 57, "hold": 57, "basemap": 57, "popup": 57, "40": 57, "20": 57, "characterist": 57, "road": 57, "toggl": 57, "east": 57, "north": 57, "d3": 58, "j": 58, "egocentr": 58, "classic": 58, "wheel": 58, "node": 58, "rotat": 58, "pan": 58, "color": 58, "depth": 58, "too": [58, 62], "hardwar": 58, "acceler": [58, 61], "faster": 58, "exactli": 58, "remind": 59, "privat": 59, "seen": 59, "everybodi": 59, "anybodi": 59, "els": 59, "got": 59, "twice": 60, "uncheck": 60, "deactiv": [60, 66], "disappear": 60, "whom": 60, "laboratori": 61, "abbrevi": 61, "lab": 61, "conduct": 61, "vera": 61, "environment": 61, "specimen": 61, "sampl": 61, "analysi": 61, "1015": 61, "big": 62, "global": [62, 72], "term": [62, 73], "ada": 62, "lovelac": 62, "da": 62, "love": 62, "unacc": 62, "lov\u0113": 62, "vice": 62, "versa": 62, "placehold": 62, "l": 62, "ce": 62, "me": 62, "dateless": 62, "criteria": 62, "1540": 62, "1560": 62, "1550": 62, "intend": 63, "support": [63, 69], "sometim": 63, "cach": 63, "rememb": 63, "firefox": 63, "haven": 63, "screenshot": 63, "explan": 64, "encount": 64, "let": 64, "know": 64, "read": [64, 73], "mayb": 64, "obsolet": 64, "keyboard": 66, "capslock": 66, "forgot": 66, "misspel": 66, "secur": 66, "attack": 66, "lock": 66, "few": [66, 72], "until": 66, "e41": 67, "appel": 67, "oa8": 68, "oa9": 68, "knew": 68, "1356": 68, "unsur": 68, "church": 68, "fist": 68, "decad": 68, "1800": 68, "1809": 68, "autocomplet": 68, "5": 68, "zero": 68, "leap": 68, "almost": 69, "cyril": 69, "mathemat": 69, "asterisk": [70, 72], "serv": 71, "quit": 72, "difficult": 72, "glanc": 73, "quickli": 73, "invert": 73, "cut": 73, "familiaris": 44, "wherev": 45, "cidoc_crm": 48}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"api": [0, 51], "arch": 1, "overview": [1, 50], "fetch": 1, "data": [1, 3, 30, 41, 42], "from": 1, "automat": 1, "creat": [1, 33, 35, 36, 38, 40], "entiti": [1, 3, 22, 48], "type": [1, 3, 8, 29, 40, 41, 48], "refer": [1, 8, 25, 26, 31, 36, 38, 49], "system": [1, 8, 26, 36, 38, 49], "content": 2, "integr": [3, 42], "check": [3, 20, 41], "orphan": 3, "without": 3, "link": [3, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 31, 33, 46], "miss": 3, "file": [3, 20, 31, 41, 49, 64], "iiif": [3, 7, 42], "annot": [3, 42, 55], "subunit": [3, 19, 21, 24, 28], "circular": 3, "depend": 3, "date": [3, 8, 39, 42, 48, 61, 68], "invalid": 3, "involv": 3, "preced": 3, "sub": 3, "duplic": 3, "similar": 3, "name": [3, 66, 72], "execut": 4, "sql": [4, 5], "prepar": [4, 8], "keep": 4, "mind": 4, "result": 4, "export": 5, "databas": [5, 53], "dump": 5, "csv": 5, "json": 5, "xml": 5, "gener": [6, 32, 35, 60], "authent": [6, 51], "import": [8, 15, 20, 57], "project": [8, 41], "class": [8, 44, 47], "possibl": 8, "field": [8, 14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 39, 41], "alia": [8, 67], "valu": [8, 29], "origin": 8, "wkt": [8, 57], "coordin": 8, "extern": 8, "place": [8, 24, 30, 36], "hierarchi": 8, "option": [8, 58], "after": 8, "admin": 9, "mail": 10, "map": [11, 36, 57], "modul": [12, 60], "present": 13, "site": [13, 30], "user": [14, 20, 41, 42, 43, 66], "form": [14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 70], "group": 14, "vocab": 15, "edit": 15, "show": 15, "vocabulari": 15, "actor": [16, 33], "can": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "via": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "tab": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29], "artifact": [17, 30, 31, 34], "event": [18, 31, 33, 34, 35], "acquisit": 18, "creation": [18, 31], "modif": 18, "move": [18, 33, 34, 35], "product": 18, "featur": [19, 30, 42], "super": [19, 21, 28], "public": [20, 41], "share": [20, 41], "set": 20, "logo": 20, "imag": [20, 42, 55], "preview": 20, "how": [20, 36, 39, 41], "make": [20, 29, 41], "avail": [20, 41], "criteria": [20, 41], "softwar": [20, 41], "manag": [20, 41, 42], "human": [21, 30], "remain": [21, 30], "administr": 24, "unit": [24, 28, 30], "histor": [24, 32], "ad": [24, 30, 33, 34, 41, 57], "multipl": [24, 31, 41], "citat": 25, "exampl": [25, 32], "includ": 26, "default": 26, "wikidata": 26, "geonam": [26, 36, 57], "gnd": 26, "usag": [26, 55], "id": 26, "precis": [26, 39], "configur": [26, 73], "sourc": [27, 34], "stratigraph": [28, 30], "anthropolog": [28, 42, 54], "analys": [28, 42, 54], "standard": 29, "custom": [29, 41], "requir": 29, "archaeolog": [30, 32], "new": [30, 31, 35, 36, 38, 40, 57], "an": [30, 31, 34, 40], "add": [31, 40], "creator": 31, "locat": [31, 33], "journei": 33, "letter": 34, "sender": 34, "recipi": 34, "instruct": 35, "us": 36, "profess": [37, 41], "time": [39, 48], "span": 39, "where": 39, "find": 39, "input": 39, "enter": [39, 41], "activ": [39, 66], "hour": 39, "minut": 39, "second": 39, "tree": 40, "exist": 40, "faq": 41, "case": [41, 58], "studi": 41, "instanc": 41, "doe": 41, "access": [41, 51], "work": 41, "why": 41, "t": 41, "free": 41, "text": 41, "longer": 41, "format": 41, "model": [42, 45], "interfac": [42, 43], "exchang": 42, "radiocarbon": [42, 48, 61], "openatla": [43, 47, 48], "manual": 43, "document": 43, "help": 43, "cidoc": 44, "crm": 44, "properti": 44, "checker": 46, "shortcut": 48, "oa7": 48, "ha": 48, "relationship": 48, "oa8": 48, "appear": 48, "first": 48, "oa9": 48, "last": 48, "e77": 48, "persist": [48, 63], "item": 48, "e21": 48, "person": 48, "e2": 48, "tempor": 48, "introduct": 51, "quick": 51, "start": 51, "guid": 51, "1": 51, "ui": 51, "2": 51, "url": 51, "get": 51, "version": [51, 63], "endpoint": 51, "paramet": 51, "error": [51, 63, 64], "handl": 51, "proxi": 51, "applic": 52, "structur": [52, 53], "sex": 54, "estim": 54, "tool": 56, "navig": [57, 58], "search": [57, 62], "geometri": 57, "overlai": 57, "network": 58, "visual": 58, "2d": 58, "3d": 58, "In": 58, "perform": 58, "issu": 58, "download": 58, "note": 59, "profil": 60, "chang": 60, "password": [60, 66], "displai": [60, 63], "browser": 63, "refresh": 63, "your": 63, "javascript": 63, "If": 63, "problem": 63, "code": 64, "403": 64, "forbidden": 64, "404": 64, "found": [64, 66], "418": 64, "i": [64, 66], "m": 64, "teapot": 64, "troubleshoot": 65, "login": 66, "wrong": 66, "No": 66, "thi": 66, "too": 66, "mani": 66, "attempt": 66, "descript": 69, "menu": 71, "tabl": 73}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"API": [[0, "api"], [51, "api"]], "ARCHE": [[1, "arche"]], "Overview": [[1, "overview"], [50, "overview"]], "Fetch": [[1, "fetch"]], "Data from ARCHE": [[1, "data-from-arche"]], "Automatically created entities": [[1, "automatically-created-entities"]], "Type": [[1, "entity-type"], [3, "type"], [29, "type"]], "Reference System": [[1, "entity-reference-system"], [26, "reference-system"]], "Entity": [[1, "entity-index"], [22, "entity"]], "Content": [[2, "content"]], "Data integrity checks": [[3, "data-integrity-checks"]], "Orphans": [[3, "orphans"], [3, "id1"]], "Entities without links": [[3, "entities-without-links"]], "Missing files": [[3, "missing-files"]], "Orphaned files": [[3, "orphaned-files"]], "Orphaned IIIF files": [[3, "orphaned-iiif-files"]], "Orphaned annotations": [[3, "orphaned-annotations"]], "Orphaned subunits": [[3, "orphaned-subunits"]], "Circular dependencies": [[3, "circular-dependencies"]], "Dates": [[3, "dates"], [8, "dates"], [48, "dates"]], "Invalid dates": [[3, "invalid-dates"]], "Invalid link dates": [[3, "invalid-link-dates"]], "Invalid involvement dates": [[3, "invalid-involvement-dates"]], "Invalid preceding dates": [[3, "invalid-preceding-dates"]], "Invalid sub dates": [[3, "invalid-sub-dates"]], "Check links": [[3, "check-links"]], "Check link duplicates": [[3, "check-link-duplicates"]], "Check similar names": [[3, "check-similar-names"]], "Execute SQL": [[4, "execute-sql"]], "Preparation": [[4, "preparation"], [8, "preparation"]], "Keep in mind": [[4, "keep-in-mind"]], "Result": [[4, "result"]], "Export": [[5, "export"]], "Export SQL": [[5, "export-sql"], [5, "id1"]], "Export database dump": [[5, "export-database-dump"]], "Export CSV": [[5, "export-csv"]], "Export JSON": [[5, "export-json"]], "Export XML": [[5, "export-xml"]], "General": [[6, "general"], [60, "general"], [32, "general"]], "Authentication": [[6, "authentication"]], "IIIF": [[7, "iiif"]], "Admin": [[9, "admin"]], "Mail": [[10, "mail"]], "Map": [[11, "map"], [57, "map"]], "Modules": [[12, "modules"], [60, "modules"]], "Presentation site": [[13, "presentation-site"]], "User": [[14, "user"]], "Form fields": [[14, "form-fields"], [16, "form-fields"], [17, "form-fields"], [19, "form-fields"], [21, "form-fields"], [24, "form-fields"], [25, "form-fields"], [27, "form-fields"], [28, "form-fields"], [18, "form-fields"], [20, "form-fields"], [29, "form-fields"]], "Groups": [[14, "groups"]], "Import": [[15, "import"], [8, "import"]], "Vocabs": [[15, "vocabs"]], "Edit": [[15, "edit"]], "Show vocabularies": [[15, "show-vocabularies"]], "Actor": [[16, "actor"]], "Can be linked via tabs to": [[16, "can-be-linked-via-tabs-to"], [17, "can-be-linked-via-tabs-to"], [19, "can-be-linked-via-tabs-to"], [21, "can-be-linked-via-tabs-to"], [24, "can-be-linked-via-tabs-to"], [25, "can-be-linked-via-tabs-to"], [27, "can-be-linked-via-tabs-to"], [28, "can-be-linked-via-tabs-to"], [18, "can-be-linked-via-tabs-to"], [20, "can-be-linked-via-tabs-to"], [29, "can-be-linked-via-tabs-to"]], "Artifact": [[17, "artifact"]], "Feature": [[19, "feature"]], "Super and subunits": [[19, "super-and-subunits"], [21, "super-and-subunits"], [28, "super-and-subunits"]], "Human remains": [[21, "human-remains"]], "Place": [[24, "place"]], "Administrative Unit": [[24, "administrative-unit"]], "Historical Place": [[24, "historical-place"]], "Places and their subunits": [[24, "places-and-their-subunits"]], "Adding multiple places": [[24, "adding-multiple-places"]], "Reference": [[25, "reference"]], "Citation example": [[25, "citation-example"]], "Included by default": [[26, "included-by-default"]], "Wikidata": [[26, "wikidata"]], "GeoNames": [[26, "geonames"], [57, "id1"]], "GND": [[26, "gnd"]], "Usage": [[26, "usage"], [55, "usage"]], "ID": [[26, "id"]], "Precision": [[26, "precision"]], "Configuration": [[26, "configuration"], [73, "configuration"]], "Source": [[27, "source"]], "Stratigraphic unit": [[28, "stratigraphic-unit"]], "Anthropological analyses": [[28, "anthropological-analyses"]], "How to make files available for the public": [[41, "how-to-make-files-available-for-the-public"], [20, "how-to-make-files-available-for-the-public"]], "Criteria checked by the software": [[41, "criteria-checked-by-the-software"], [20, "criteria-checked-by-the-software"]], "FAQ": [[41, "faq"]], "How to manage multiple projects or case studies": [[41, "how-to-manage-multiple-projects-or-case-studies"]], "Multiple instances": [[41, "multiple-instances"]], "Shared instance": [[41, "shared-instance"]], "How does data access work": [[41, "how-does-data-access-work"]], "How to enter professions": [[41, "how-to-enter-professions"]], "Criteria checked by users": [[41, "criteria-checked-by-users"]], "Why can\u2019t a free text field be added via custom types": [[41, "why-can-t-a-free-text-field-be-added-via-custom-types"]], "Why can\u2019t longer texts be formatted": [[41, "why-can-t-longer-texts-be-formatted"]], "Features": [[42, "features"]], "Model": [[42, "model"], [45, "model"]], "User Interface": [[42, "user-interface"]], "IIIF Integration": [[42, "iiif-integration"]], "Image Annotation": [[42, "image-annotation"]], "Data Exchange": [[42, "data-exchange"]], "User Management": [[42, "user-management"]], "Anthropological Analyses": [[42, "anthropological-analyses"], [54, "anthropological-analyses"]], "Radiocarbon Dating": [[42, "radiocarbon-dating"], [61, "radiocarbon-dating"]], "OpenAtlas manual": [[43, "openatlas-manual"]], "User interface": [[43, null]], "Documentation": [[43, null]], "Help": [[43, null]], "Introduction": [[51, "introduction"]], "Quick Start Guide": [[51, "quick-start-guide"]], "1. UI access": [[51, "ui-access"]], "2. URL / GET access": [[51, "url-get-access"]], "Versioning": [[51, "versioning"]], "Endpoints": [[51, "endpoints"]], "Parameters": [[51, "parameters"]], "Error handling": [[51, "error-handling"]], "Proxy": [[51, "proxy"]], "Authentication guide": [[51, "authentication-guide"]], "Application Structure": [[52, "application-structure"]], "Database Structure": [[53, "database-structure"]], "Sex Estimation": [[54, "sex-estimation"]], "Image annotation": [[55, "image-annotation"]], "Tools": [[56, "tools"]], "Navigation": [[57, "navigation"], [58, "navigation"]], "Search": [[57, "search"], [62, "search"]], "WKT import": [[57, "wkt-import"]], "Adding new geometries": [[57, "adding-new-geometries"]], "Map Overlay": [[57, "map-overlay"]], "Network visualization": [[58, "network-visualization"]], "2D": [[58, "d"]], "3D": [[58, "id1"]], "Options": [[58, "options"]], "In case of performance issues": [[58, "in-case-of-performance-issues"]], "Download": [[58, "download"]], "Notes": [[59, "notes"]], "Profile": [[60, "profile"]], "Change password": [[60, "change-password"]], "Display": [[60, "display"]], "Display Errors": [[63, "display-errors"]], "Browser Version": [[63, "browser-version"]], "Refresh your Browser": [[63, "refresh-your-browser"]], "JavaScript": [[63, "javascript"]], "If the problem persists": [[63, "if-the-problem-persists"]], "Error Codes": [[64, "error-codes"]], "403 - Forbidden": [[64, "forbidden"]], "404 - File not found": [[64, "file-not-found"]], "418 - I\u2019m a teapot": [[64, "im-a-teapot"]], "Troubleshooting": [[65, "troubleshooting"]], "Login": [[66, "login"]], "Wrong Password": [[66, "wrong-password"]], "No user with this name found.": [[66, "no-user-with-this-name-found"]], "This user is not activated.": [[66, "this-user-is-not-activated"]], "Too many login attempts.": [[66, "too-many-login-attempts"]], "Alias": [[67, "alias"], [8, "alias"]], "Date": [[68, "date"]], "Description": [[69, "description"]], "Form": [[70, "form"]], "Menu": [[71, "menu"]], "Name": [[72, "name"]], "Table": [[73, "table"]], "Project": [[8, "project"]], "Import class": [[8, "import-class"]], "Possible import fields": [[8, "possible-import-fields"]], "Types": [[8, "types"], [40, "types"]], "Value types": [[8, "value-types"], [29, "value-types"]], "References": [[8, "references"], [49, "references"], [49, "id1"]], "Origin references": [[8, "origin-references"]], "WKT coordinates": [[8, "wkt-coordinates"]], "External reference systems": [[8, "external-reference-systems"]], "Place hierarchy": [[8, "place-hierarchy"]], "Import options": [[8, "import-options"]], "After the import": [[8, "after-the-import"]], "Event": [[18, "event"]], "Acquisition": [[18, "acquisition"]], "Creation": [[18, "creation"]], "Modification": [[18, "modification"]], "Move": [[18, "move"]], "Production": [[18, "production"]], "File": [[20, "file"]], "Form fields important for public sharing": [[20, "form-fields-important-for-public-sharing"]], "Settings": [[20, "settings"]], "Logo": [[20, "logo"]], "Image preview": [[20, "image-preview"]], "Criteria checked by managers and users": [[20, "criteria-checked-by-managers-and-users"]], "Standard types": [[29, "standard-types"]], "Custom types": [[29, "custom-types"]], "Making types required": [[29, "making-types-required"]], "Archaeological data": [[30, "archaeological-data"]], "Adding a new place": [[30, "adding-a-new-place"]], "Adding a feature to the site": [[30, "adding-a-feature-to-the-site"]], "Adding a stratigraphic unit to the feature": [[30, "adding-a-stratigraphic-unit-to-the-feature"]], "Adding an artifact to the stratigraphic unit": [[30, "adding-an-artifact-to-the-stratigraphic-unit"]], "Adding human remains to the stratigraphic unit": [[30, "adding-human-remains-to-the-stratigraphic-unit"]], "Artifacts": [[31, "artifacts"]], "Add a new artifact": [[31, "add-a-new-artifact"]], "Add a reference to the artifact": [[31, "add-a-reference-to-the-artifact"]], "Add a file to the artifact": [[31, "add-a-file-to-the-artifact"]], "Link a creation event": [[31, "link-a-creation-event"]], "Add a creator to the creation event": [[31, "add-a-creator-to-the-creation-event"]], "Add multiple locations to an artifact": [[31, "add-multiple-locations-to-an-artifact"]], "Examples": [[32, "examples"]], "Archaeological": [[32, "archaeological"]], "Historical": [[32, "historical"]], "Journey": [[33, "journey"]], "Adding actors": [[33, "adding-actors"]], "Adding locations": [[33, "adding-locations"]], "Creating the move event": [[33, "creating-the-move-event"]], "Link actors to the journey": [[33, "link-actors-to-the-journey"]], "Letters": [[34, "letters"]], "Adding an artifact": [[34, "adding-an-artifact"]], "Adding a source": [[34, "adding-a-source"]], "Adding the move event": [[34, "adding-the-move-event"]], "Adding sender and recipient": [[34, "adding-sender-and-recipient"]], "Move events": [[35, "move-events"]], "Create a new move event - general instruction": [[35, "create-a-new-move-event-general-instruction"]], "Places": [[36, "places"]], "Create a new place": [[36, "create-a-new-place"]], "How to use the map": [[36, "how-to-use-the-map"]], "Reference Systems - GeoNames": [[36, "reference-systems-geonames"]], "Profession": [[37, "profession"]], "References Systems": [[38, "references-systems"]], "Create a new reference system": [[38, "create-a-new-reference-system"]], "Time Spans": [[39, "time-spans"]], "Where to find the input fields": [[39, "where-to-find-the-input-fields"]], "How to enter dates and time spans": [[39, "how-to-enter-dates-and-time-spans"]], "Precise dates": [[39, "precise-dates"]], "Time spans": [[39, "id1"]], "Activate hours, minutes, and seconds": [[39, "activate-hours-minutes-and-seconds"]], "Create a new type tree": [[40, "create-a-new-type-tree"]], "Add a type to an existing type tree": [[40, "add-a-type-to-an-existing-type-tree"]], "Link checker": [[46, "link-checker"]], "OpenAtlas shortcuts": [[48, "openatlas-shortcuts"]], "OA7 - has relationship to": [[48, "oa7-has-relationship-to"]], "OA8 - appears for the first time in": [[48, "oa8-appears-for-the-first-time-in"]], "OA9 - appears for the last time in": [[48, "oa9-appears-for-the-last-time-in"]], "E77 - Persistent Item": [[48, "e77-persistent-item"]], "E21 Person": [[48, "e21-person"]], "E2 Temporal Entity": [[48, "e2-temporal-entity"]], "Radiocarbon dating type": [[48, "radiocarbon-dating-type"]], "Reference Systems": [[49, "reference-systems"]], "References and Files": [[49, "references-and-files"]], "CIDOC CRM": [[44, "cidoc-crm"]], "CIDOC classes": [[44, "cidoc-classes"]], "CIDOC Properties": [[44, "cidoc-properties"]], "OpenAtlas classes": [[47, "openatlas-classes"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/sphinx/source/model/cidoc_crm.rst b/sphinx/source/model/cidoc_crm.rst index 4af6ec142..1db7968ee 100644 --- a/sphinx/source/model/cidoc_crm.rst +++ b/sphinx/source/model/cidoc_crm.rst @@ -1,5 +1,5 @@ CIDOC CRM -========== +========= .. toctree:: @@ -48,8 +48,8 @@ can be modelled in the following way .. image:: properties.png -An overview of all CIDOC CRM properties can be found -`here `_. The displayed +An overview of all CIDOC CRM properties can be at the +`demo `_. The displayed count indicates how many times each property has been used in your OpenAtlas instance. A click on the property name will bring you to an overview of the property with diff --git a/sphinx/source/model/openatlas_classes.rst b/sphinx/source/model/openatlas_classes.rst index 242bfe641..3651ff4d8 100644 --- a/sphinx/source/model/openatlas_classes.rst +++ b/sphinx/source/model/openatlas_classes.rst @@ -42,5 +42,5 @@ correspond to the CIDOC class :cidoc_entity:`E33 - Linguistic object`. An overview of all OpenAtlas classes used and how they correspond to CIDOC CRM -classes can be found -`here `_. +classes can be found at the +`demo `_. From 754e9fe8b621cc5429700c9a7b137fcab9f4b60b Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Wed, 27 Nov 2024 12:21:59 +0100 Subject: [PATCH 30/42] Update manual --- .../manual/.doctrees/environment.pickle | Bin 179038 -> 178954 bytes .../manual/.doctrees/technical/api.doctree | Bin 42114 -> 42596 bytes .../technical/application_structure.doctree | Bin 18437 -> 18528 bytes .../technical/database_structure.doctree | Bin 7668 -> 7672 bytes openatlas/static/manual/searchindex.js | 2 +- openatlas/static/manual/technical/api.html | 106 ++++++++++-------- .../technical/application_structure.html | 14 +-- .../manual/technical/database_structure.html | 6 +- 8 files changed, 68 insertions(+), 60 deletions(-) diff --git a/openatlas/static/manual/.doctrees/environment.pickle b/openatlas/static/manual/.doctrees/environment.pickle index 538c75d59323772cec5308f23ceb1aee8b6de731..5aa87fc67040472f95a74d43b6561b8e20f1512b 100644 GIT binary patch literal 178954 zcmdsgd7K<&nSYMCGLxCiTx}_u#X71*Gh~%$(fJMcuW`I0;hU zLArBMf3}n}QsaeE_7Hx5rCF_+#YuWow^uWAuzxDUZAqKZ+=jjMmoK;p&<|${b<`Wg z$e*5njJ*^#sA!WT0n zY-^uWDV1tBY<`aO?uO@pjW;yJ4-=C{t%m1xrci)*Ow_NxekNV3WQtW75Vi-icCY+~ zNpM>J(c+hV1eOhfEXkjof0TH&LfRLj2nK-UAVm*au zD)HlCvlw_|FFEr}r>V^ z!q3A)aG=oGvxo2vi!!oA(rw;=H+Zoej=c;QSxwg~&_MyAuV~iFX75V5M4^I^pvGDtSYd0*KI@4z~o--eJ}Nsji9~Eu^nuDmRK2zNyaHuLmUD+Avy!~ zVgJaKG>p1{cao6KG@_AwrfR}T!K-AAd`bLF>cb#Ai*dv*Y_IZ<$zRLtot{;<>_fNN72I~ z@hj09wv^Cjvb1Iqei~pstnh?AqIj5LBE-&COpa%WhWrEZ1}+|UXuMuSSn9kP;onSG zOo|Q2L%?PBBW^XX$H$q1K$yQMf3dWyo|s7n*Zd+smVdG|h~f(tGy5bJ_i~_~fC;Qq z+{?~Ynotq4p|O=(8euL4F~{^f5mSozS(x|y1^Ej_EtYdFCJ>!bTqECJp5G}ddqsYi z_~&u?$BXY*@b}Q(O2!F4#fvrk0ug;JT`%X*seqs50EMl;h~cV`!|@C(0ip^n7C(Z^ z1yxHFFS22FUgs~F6`zTqmOQfx#2Sb-MaR&wFPo_b=o(QljK~hgxm=MRo4O}ANt~hu z9zZW)B>AiJPZj?>QDT+kE*H$26E%wuo+LjIu^|he2xKTigqU;F)-pX*x!Z~A+FXO} z6Ca6&k$gfGid7?1$>u4{V+aC2>6!Ce>6^t1Lgs&wzf@Liy}(Uzynu=CrpR|Xm2)Kt z9|)%@Yc0fq|Qfr*<3Vgqs8(Rau59NrRRQei`3LqA(f@N;bTXT9f-{| z8FF4oTS$I)$+I>gVtUpY4MS9);|{8h?8C8hUh=GG(nr@gAGv@a5EN}lhB&|7f>3X+ z@^hQZoxX#V4sf7CPI%ZUr%nnP0O!SW=S7|T+pPF{rBetmTuQUj<9qge8{JpRlGHL4 zl&bE+I_DcUQBKc=@(vp=yXwj-6MM#XZ%;g7`|h!wS6(`{ZQK6s2M#>3Auz8|KNZ;( zBuOYYvHHrfJv*)%+kxL*dF7=AlhO;$Z6;^n?-3x2@(tn_wNklY95xCtG#n^WFHYiJExu^VMZClZ z*5kRC6ic#NtHcla9XSNVz!VN}b%w+{B(XRvL?(*M*NSqFD{%u9em^4K3(p{2p+kiM z`HI6U>+PiB{1aJ?=Dde^DTyjxIu71jL$EdrQDa}n<-=sK5yNEmQ8aUD_?wRGOda8T|LaK!tG=-%#HEPm~I zRWqjy_yLE-o;TB_${`B!cXbDTlqqHrvyeMrLabMq8m^2@#%6J%MEMVn=NwJqWEKhOYQNIKGl!NBJMV%@~^Hczpk-FxOGspmcFvCo#h z%|ZU8XiO7f@VcvBL|Q=@{#E>r0z)^taC@;-GX^a?*S@GjbeN7H1B*084XIt}NmgXj zW-g6X6Nmpm2T9>?S7sqyaP)J%8%Exl1L8x*4AdaUJhpq0Fq|w>hFknsnn2yhOC^M; zz2pcn76AiKogK4Cp_$!BnTA@ug8uQK$mgbEKhS?i&Z3sDKwptAMl=KO%vBo7%48gx zkUo4aXwJp!vz(ksBL(9a3i*L-&@<$~{mr>@^?t>{1nZ;Z1a*%rc zwHbGy=;RtCq&k{GS`q^alo~U^@^l8BqZvw5+9w)EG9*0s2AzeB;eLWXR|dh10}l~S z&77=c5Z-4&H4{=an8{6<#Zjbxj0(iaUgd%!qe|IFq*v`>>f07ZJ-TYI6_w(SIjVxJ zr3lyTzPgD)HIs!L|584_VV@w-P<(uiUUVx(#kd2+)ce zQ}}h7d5s}2@pCb1V#5|?^F`vwC?j4|tCW!EF(A|>$_tFj@8qwDLkRv9WJt*bvZoa4 z+JWB^uTj2Sww!ZdF4IIx8rAHZFj!6S?{ZPM!!Qct^eBHQYraA7(RG95-zv3i9RiGj z7e|Olhfr`rb3-r&S*pN3&^RPhox1c5`xGw$&@&csJ9MW~&yw;YPdJgejt~g3mX(E6 zxfm@Bi53mmy8$6plmiEj6BT5V9O{>O!H$Tw8b=JY0B^2?^f=>+D_z(~WttP{e*)gR z=H_!WMwpfhyt21#uaH%BehU&qoH$T)No-D)K|7=k1yC{}LZH#VW9o<@6sce^A4odm z^8tqn=)-$SP%vmL169FD4r%*T2EysE&lNR(g&rYARxY*tZ%LjQwu6b-*|66Ou$4^C zgltsCY0wQCO9Lz;vPx<^&Q(d%G~uF#>Z5$EgUe_#@PG{967I=*=+)^=~LL`5X@hq$wikO<7=DF92*A-4yGCn%I4U?fysq!1)J7{x#+ zMg#T8e1ovF_L?ldI)v0d?0p)68Vw#n314C_FJpX(wVcu~Hd0n%z#hfb&7$qppB{zy z(U-0`lKWj=naFy6d%E*mG92)GS#(4;n?`Md0l?j2Ho#PYAkpu9kcP~nFQ=8Cv4`*j z&aS49us;LQDEzP1$Ni-vPN$%16edJwX%-pb3`QKeM~t43y_U0g@LY)EVDym=pv+_r z&0pmmLvaRaG5*a%$oZvq*chQbh&}*M^yzumwIqpq3DpCBR_bhQD1;>!d7k^kWzi$_xz4-8L_8it)ynM;oBaYjWN-oN0 zjpsT@o$y4y_{J+7l-iz9w@e%5S~1Kj?eJtHvik5%8em z&1=qis6}Wb-oLIq;Ue===5=3QGneTXKYINTYA(&bh&n|18xC%n!ySlsZ(MO}>*!5< za@!>@ZVqqdi*MgQUz{pFdeh6lB4P>g_>aTC_Jls7?7c^3oftqCeC4yA&`*@Tf6*a3 zET|S=e(2I~w2XA+7w_(Mq82Z4KXmu0UQaH*{qWtlAYAnMaPi_Je}B0HM1(%F_^EOB6rvOZSF!)Wml; zK6?s7(M~MxM4-YHeeC|{ryk{r)D^Mu=CeEIh^Ph3o0tEy=baO3igz!*>P}B@#M93a zuV1q9gD^=>b!2QOUd>(!pQT=@evEwmZ$tC;uEbX_9iR39@pL-H>z93f(9>SgGZAm> zcb;c8mMmICPai+GYw7{(R`;oU@qbu1s;BCm)^psao<-+aMfa)i@~>D2-KS+Qf4r4* zp9bFhZL8uwEq~D)t!ejZaO8}-jp;;`KgZ}7&HTxqVh_m4Hb|+{^hYtz0g)4;;iVK* z-r9IkV}E0l^%=mSo_<0^#bf)oUcMc}Q54~(_W~qOgWPPDCmTntJLR`)0#Q0otUPM{ zSJ(&NkRPm)5D>O-?_VOgd;Z^pJ2D;N|Jk?a|JhON-mnk8Gk?9lCtvr}O`ZpN)cTPu z84_jbyx8%eO%BJFTW$_08*W4R4vl8S3666~35nVCDRI8PW0_KUL zJlLUW!A>kn1Bn3ld+tl)3)#_^5fchj-bKBYK?e$2 zrEBP0(Gc19ML~1w1VwI+1^;`3Mm#kokWeyrng%cCO#&&v)bqvD9KBMMdOMYPY?&;= zJ6|pV&nf|gho){hN@V5$|F!I^;$2wSK%fOZ9gmHY05^pX#2cb3`!4xE=M3<_N;lxa zn;yesOXrPuPRQnpi!WD&4`jQY_*OyZNE(mxW_@mHSihHIeX1k3oOu+pv(kA?Rib{w z%;s$Mut&D}8!kI){g0zpbK5hx3}J5A(|RD%ROqAD!}I_8sP#wrK?|$(C;9qh*KdiQ z7&@~E`FXffsP|lXK_q~raxYyf4ETr(##M2Tlc%!uG)C4ihYcCgX2AR!v)j09EnaT$ z!9%y%DCZ4naMt6ST5&lR9NzSt8AKrR#z5^R~U zM0p@KK$%JzVS>FO@XD&f6>^M%w1S*?ooiUVkVUH>7ZK_>;maK6T!k)k zzI5V}IbS-_$DA*n$Yaizj{TYQrDI;^dReyzF`U7bvRRJ)D)|6p!_3yyyH? zy=E4wn~NfQ-_2jB@u+2$%(R%7MuS>?**vD_Vq_CToz`94q=Ohdqlk9t*uI?zVrf~G z-6Q6*H>|tyNp(B}N2LZyDdoD<{MUyGpz47}_#l_`P2KLT zWiawbD-dKw>*E|VTi*gEv8Kzq2mj`;weH0Ywfr7#b~gvovU=7JQDi-Y3#w-Q2zOM; z`U&p%`~h)$P~3hlZolMP-TF1|)^BhD*3W``Ay|92%G|yni@>|6D;nO7)F{h`7HHj=N{O7!>d}`7sgEelZ+v?+!Uy z>cx9rM7&=L$J@1Y=g!M~G#-nH^gqIpc8}2ju@CE>h*-ZIjmg z>2CBqyg2g_asFpG&feWJ)9l4tkBIlH;dn>(c}C(AJQC-v!Sf^5;A`PE=(>sq2E9mc ziHP*;;YfR~76ap6v~P@vmLi-G7tuY&W0GF1e;*MmWqm@h_KnG*Zy%N49}zKSlR^;p zUMA)v`0#!zBHp{g@eW>2GeZ*2%n&cRzZwzyH^Z^_Z0C-vuhHL$i1u6IX#1Z~EG0Oc zd!i5Z&my9x@H>Rh-TP=wmJjRyM8ryQeF)ZN`<=y+KFnR+(IT#U!Z8oKm=g!YoFuP^ zjYO;f^;$xj-g7|g9pFWKazwP0g$+Tw@_={dSb}Gcd8_c)h*kJ*comjjHue-ByDy4} zld{Vp&F+(Ctm;F&JtE@!!VwRb9DnzfJe%3u z>b{<6K^rAkLqxrMj3=Xev95`TmGZYCSi7K9{>b=I5s^}cI0WgyHqY{PZ-Yl8;-*w| z2=1=SXrjLt=@TL%rDS&)(%rPM$cuDmM5Mnx2Bdo^Gwnrsbws3;!w+d`_d(vF$cr@_ z5i5=4hG6a4DJHpl(U$#awUhjuX7}XxXafg7TKQe`2O?trb2#R{?Q)izkL;h0i1;tzh255e?kUKSbEWDJwtPha;k0 z9FDf1;(R%2!b|P$-e{I&NjU12ZqlkMvsV7ruZ&m)nhFy_^!|fbOPDyoYYDxrKP4h+ zn)VWcx|{5%zrklk#7Z+xLa;8|x^vs!t%qPp*6`|dW01-4 zCy{pft747e8GduCxNR4=9pbi=Z_;l{tTekegb2&8#0nrWD%~{D^E3eT`p@G+NWti!?ZI`k{u_X*PBu;P z;W;>BjtotC5%X4P5{kt$NoXR7#j`nRT871QD`=*K#nT;V?t;Y=5NJYy#j^rvkl*5w zdK!7Rc=(*g!z~`vrV(n3hnZ=l*y7<{8osr743Q-K8rrdVe1^tYcw)Il!yXooUC`)*#X|@*CSY-5 zpOW+zXWA)SZgI++($^N}pecWBaT1skxfW+*DY?oM%q>cJTAa6}w4=qjLrMi&oX?}= zoW&V7%8^-|=%Tch#knWSAX%ISqI{0UNg2wlSezcAY=^}u3(7$7G%$WcAvT8p|tqAx>z6N@_-)M4Q1uoi{w7RTNc zMq3;UQ(S9ta7vM;#o;2weijFC6p2|JPEl}VafCy$ip2p3g$x$^ee&QIyJ7OGJQ>p> zFDJYbIT>DuVUfk>H5e9IUY<~Ck^SRoix!z9UUy-Uk>E8K7AY#Px3EZG>ewDqE?VRn zZDLm1z<3>dPm7(!+_`K`6T^7=+A`XEERE&HQ!PHj#>H}}E!LyTIdUV;#$}l1mf>9! zTKrg4W?97@mUK4mZmJ5;Q483`FQ9o|XBa+1jb>Yly_B(Nvvr7coSydyyuhqJvHf~0G9LRJJvH@^r#JQ@ zE5MuYVpidDITMw#>OA4F5Bo%l9VoB(EB-JUF(dYO++%l57E0q-kld3ub6CZL{|4o+ z-GV-`Qw-MU?pkE`3!_^q7O>e5cCXD$E5wr4ZX2=1hZw81FBuKpXkN&k-0)*m%&f;| z61>2NS5g~|U0s6G_v`Y`rz~Es8OJ?25_`J3`XnHIP_tH6FZO12CU>@!o;zBI)h6px zE#6q4Z}pqo5! zprd8nsD-0t)?bJYkKkfINmIFK7Zz48YY`~vDA##{s;%TrSKQ_vPQMDsVv#s|S<>C> zM)um2?Cs|!Mv}d~x*&$|L!kjN5xV;_qlVp5y#fD`*r?o-oM3DL64!O3ECu%B`Q0SNXzs|qGfQo z$!ep$rtSjo=%$0{1@9no-GnUY)f1;k|VxGND5lYU(gofMPRelg)?uuZZt=*Wgx zBkPS>p4<_Ec+znb@>m68&=CmHw15;m;kYpeq~Ky*5Y19>{Jmf9vkG%7Jd*|pRSOXb zYk;7hv#7;-{8t~>0HJEJhCyib3S|GCmr1tjjJCAL+QHDAOD=DjPiy9Mr*q3QwI!?v zZ|jPma(A-~qGeRm-VQvsX+d`2$MibzavQo}7yg~PoKgBDI1@>qZjMq5dcL5tdvt)P~LY1g-Osi(B-8w{eQcC|S_#*JE#>a|x-y{NMt*r++EY`+#%Zq@(N zx9@v-vjqRVjg|c|Nub@A6q_^Pa7VHDU!}`d0O|2X&4Ey5IfIx-6kCx`H{IAf7xlKp zM!l}2nL8&)xzXs9J4+XY3T)00#BVo=*KU`2m&CM*edy~oI-&tv$a|yst74=0IuTzZ z?URz|Qv!WJeD~{8P+8Kwx*%d_LRVmp?2*_=-kqE~?@`yKjv{bH7ewp?rjteJFq4EB zO!W%)8)BpMP;yFOO$n?4nSQMnjm&P4<{yoX<}0KFG;*zo{$X8; zDWc!53nF%+uX2e_JFLt>`TJv|{Axvc+JUbX`M;}6J4OC`bV0;U{?#t|)pA?EEA1MH zEA(5V=}_f!8du~C1eqP~kcK>E|7lm1j)5V6bt znyqFfTQ6iPINr;%m$28>UJ)Dl*Cw+Pd&-ABz=9pR^i$?%n=XiE7HH&URBA``#WX;u zTEx}o?Z&`*(>U%-Y@F|*;dEdNaQd(=n-r(345EYm-NBv3!`L?Og9qP>jRzZD9(ZcdiWT?j(owPEZe0+uvtpgY3Y>+M#eVeYD+i6x zlI3wluj^e#xcFPK;jg+hRBZUOE{NFKFygQQQREy9cyw$GSm`nVm|KzlQ9vKD?{JDP zh-T7jggz>I5}sWHgsMeI^rV~e9@t8UD9@3EJs2D7mnV6{-By{`r|5D_>DwM%5V4bc zjUsmfyEyZik4=%+bZmr2uZ5V+gim>}2V&WpF8ve>uG0k(I}26`7F2NnHuWB9se!-O z{`%M$uv#)e;!X+N0rI~_mv)N$4P6k;?A&~S zmYaHiy-h+z?FpL&@SnQOSMu{83}T+HXj@mwaHAIFEP(BLvj99N>juaEe=2C(?w;iU zHm0TpmvlC!Z#Z??V0)tIfaqarGooh~XTXm20CB|dZK*B@WkF&h_wrqaQN|$x32gG7 z^U?dP*yuf&JOrdEvzTI}0fL{QOD(1Nr|W`|99q+`BR*D=#kkwKq)n;>f|pR7F}uU{Or5;)`Kqj5={J&+V98>Xt)6@td= z!_g)1_Am)-MMT{cMJpP9H#Qo!n3#7@bmDzW7lg98-w^a~H?co0P=wAeMFaf%6|Sy7eq4yH2kJ=y+VgHK&V=TSgfeZw)Mc( zzM%H(*qHAcEIRoz!15IEM(jhJsS6@@Vk28X?kI7^fxUZt)IJa!wXqtNai-`H!XUZ# z>C#GR*lt}Av6I_zBv0GzKXC1EY}9sT`^eNB&bX>eDMjqEE{JAgYuF-X&O}hE0YcT{ zdAfF4_9S>aw$Ak=<~+&npV}lx)RwTW#6RdVUdhh88APYL65OZ-*_F^-NH=K|ab|NN z*q8XUpliDWv?1(cfg_D+AB#YW??-V-p1p$ht?;4^c8ED5M9FrDJv%Q zK?8)U#XEHyBCQy2CD}PE7Caa8q!sOn@u?wUCTt^cMGWoMF^HBXti4NtxlIewf;~|$ z8A9{sgXZg8UA8Dq5^Ra2NvosO0^@$X6>H}-X^z8QO|+mL>wc*vVX8EtODz=*WEn(< zREgW1DY{elkTT+vb+@e1hW|C%ak#sOqdgPQb! zE?bl)3ARMiq%TIP1vH7bU+q)6PR1*u4y zJ5M9*2(Wc< zlEEN4q)XhU1*uD#=`|VE2leSDUCt#J11))Y@Vj_3X4x9j9 z_EY+r*eKnboD}E+M1F=Yg_QGrsxF9TB5T-o zWNmiG+^GK>?pPeiGnyd*2)g5E3$nJ`9k=YU-4vJ9h4t8;7hMFOqYFZrjhM*2VQZ$C z7&mxl6Ko25*vurbu%())m3%3hcf>~gjmd1Lm>M^DyAA9QiyEY;1}W4a;78u7OGjl5 z-lPknnH3sNK=~12lQcl6T8!y7MEa5c>Z~8>8>`gJ3D^>!T;1CyxuV8|xstne38sYS zE(XylSHg{2kgjCw@ut)rS0ZH~=uLhjDBCe_vT9X(qTqnwg?W=+j zAEP(9AU5J3mp3_AmyXIHoUIF@nH3tYKzS2kmNY=9THL8?9Hlq;MrXZA?`1d_v|cfM z&ZO8Tv7)wwIg>-Wj90RgXAqroCfuk6=}exi=}abs2n2n}3k6|2=1blgm)wQ&MV3aC>q>Oi;fr@E9=#Q%{lh-Ttzcwyzpg-g%?p=x31Hbgq|yE^O02QRNrAp=n{ zFuS_wA2?2~Zcm6#Eednz3E+wtm7l~QI_1u}Q47+YU#{uS^CSpqDF{KQez72L$DH~z z;*!2Fr~cIFqIggjgfb&Bk^2~(`VFxW|G1p`^}2Laeq~x0MC_~xbLwx2jR(i()Nj+J zoFe|~bwM-}U&A9Sr!E|W1_)J)jk*nyPW_vmb?QCa>GaAOU+4T=Z4xJHN|-nQhAz33 z=zN_)wDjifT{6#Y@;Gy>^Bt5K(`u<+$r@r2tt>JQ;~!rMkI?x_%7u*l)sXy^>@D+G z8yw&@+6Q;Ck}2oSY?=<{;@7L?YoABvH!I|ujFZc!6}ZE)uwqOY6{9He4#-kI){;JR z3h3NH2DYyGcj@X(wPsA=9UM219Tar%L=-T&}9`a z-c`H17TdkqOqurv*<*K27E0rdS-U51=5j_6{|%bOY@wbr+=9MheQF#H%QbdE@F3S% zL|rNtX7Fu)B{Pji@RXKooYAVk^aAT6xY)-%|49<0dCl%B>xWAL^B1~OtxS=S>PV*O zKcmzF(-*!quPOQw8hS%xll2qauW48hh}(nW_H%LjCEsKxP#UCY?23R#ln`f9+c6*17#8u?+yh{AW*r>TW$s1R=xKr$H z1DUMXMW^bkbwQ|b^H#x_c9Vbjax}kG!OmQTM9_eKEH>JYB=aufl!%N1g#U;x)l|s% zL0u5dgxB!T%Eb$%(g2}q5n{x2weJ}F{=bM#4vwqu|DY~6l|cMd7exH5VD+nVMjzYO znU%To`Xg&&ifQbPN!G(EC-%7p^Q8BOP>qP;&VVk6*jcf5EXT+CP2m&;vs^F|f-pX} zbY5(HSO>R6=u-}QVISu>xb+-e3MzfrtP7%<2^!W-8AuWNYJgC+c!I8C%ihYjJKI}X zw%_fUdxM=qo1}_b6V_ufby=^ZXM#a=s>i~OT97@KZJOgNZh9uzYk9sPZM);WmYtTj z$0d1TotC#8s~Em&(W1qR=nqK#dphgUhh2}JI3RN7UdMjwy7q+a)Tl7Well=HjLlDA5S?=D+^7ZV z*pGXknik_HLH~ZCpl~byuAK&7wNs3hm!Sy&4B&^Egc|H9nJa za0lGYRnf(Bf0%f-BCBqmr0=QbA(Qsf^||dMv5|6Fa@s){pkF;Y{VKX3lyxo%7POtv zJB-qvz`4e6h>_5fMybVN#;?_-l5)nc(ghJap_lI1v&|>WAB~O1UCBwDGa8WN59`uK zk@t385Y6P(2vk(8Bdn1I2vv)?yg~O>)y$;7ukrKP_}r7MGqwPyf2PYO#p$0ghrR(pPsglTZ9eY#?AU1B zPscq=i~;dX>C#Dw=b5@7nn|r;MU){DN}>Tm)gr_Y=`wt9YpFP4PS)o*<2xN2(}$8c zEy05|!1!nBa!oP*>AE1ANv^>)#dy(O(*U7rv0m3k%ii|Ao$YP+91xT6ynXD~v`Lbv zDPeu=hA!Wg=)8hK%;VC2gb8bB+|;1CSNC9kRsLG*UNPJ1*k@$fJvieYebR=-jara> z?Bm{LS@yBTG|XVn`n`g#?G6Z9X3oD7m)M16&c76020yP0LK%*j$bF1?+h4~<{Nu{o z{z8|I${akX3!<478g4*&5@D1yK&V>0T(=?8lYFPMo@C_#?~LmN&jIs#l`}T9C-A3c zg?W|Jfh%IrpJWi7@+#b@1?g3GYYxeZiHP3$_dyTyBthejd6;L%C4yld=9=j8_zYbT z%AmwV?ql>YFNlr!$K_#e)TN{HFgNIeh@BPd$BMOlrBp5zN|QVlHB-zKW~w+D&ufX_ z6&oiuBs2aBU=EzDK%mq3c3mneM!ZEAMC^Y(FUP*twNe867GU5b;Y^`Tlq)66$kwWfQYDei zRES+5 z(n=R}iNE4N9=X3N0-=*}+`Ns3vIEN+Oem>QxidrOF|n7`!JoG1$l!k7|&j8l*%GQe1<89{!y! zHsIX~3B6Aog2xrEz#s?=vC9vu#QLc{{%&bpKeia*U9_#RCDs#xd z`BbP<%B@lgRZ5{sDOsfew|=fmYQ?ReF^GAh+ID-T#MX)lJ;0vk*}RcG1pkD2ibVHn zX`(g_$Kj*=@Ch;X5$scwSy_>ktO!k7Bx<`A3DA2GwTYOX?bijNw4;|nv^`eaFc)L! zU^u^>IyW|sARRUbM??(*tTL+r-ZblrVq@899+ru^Fw3gMEmfBQgPyNTUB#fk(FM`WAPq%Tx-L>k8X#0H9@b4{ z$)w-+I-B(ClY4^ujlvymk}zsaSmy6Tx|~3NB+e@b zwt(8*9i4J_>4H!Kf2SaRyTj0-s}R{Fc2buN2cYlK(Gjh&NC7j1y(f7Yd# z64yWIf{2~y!#j8Gyo`yC@pazq&Fgm_bz*yB{eV@lN0O##PB7UW!~w#e0_+iE`xA9R zbb#=NN(uTOObqB7ewqNU%{4rH;?~J(bQM3jd@vYL?0HWU5xKA-T>KO zqDwPH_7~}bh@I?#DI85AI}tyf6%3(V#K?3LB!68mHRU}6X$hT#!JNn z%nx=F@~ObrVq?LoWJRH-tUsX+Xu(%>DW{14C0!8B#MkJGsotFE7HEJ_wfJ}4P)+vc z?(1xCZg_9mD2~+%nJSI1*E9Yu%CeK%6TeZT!g_T*z!foCTgo8j>D9G$`2{!1GoJ(7 zN%zU^pR2s{a$o7NQ8{cH)BLntu5sXPhq+{+Rw@;$qn-lZywWY0YkTI+XrgsCUAEBW zJi1(fi*N7cC2H?wTl9)l_oS_RG4s~U&Nk216HpIn8~)<%&V2Fl&Mj%)mU+3@miZI{ zKHlC9!RO%M0Qa0-7GQ_)nvu;HX$IqHrff3bPEsdZ3jW*#vMSYPe zmofIlT_fK|b1`>6aq}QuuBOY=aB0cc!EL2%oq`h4>xz-B*P|JX+ z%AX;*<&jry*3>E`jPMyahQ34&%EP^-n5hJw%|+}gwV+OyX; zU@9_t1A}Pk)Y@wixlJCQws3Y3f5P$l5y$xkCn|nGmnlk@1XCjE(rcsC0-o^uozkR%JjcSK(QRBjN>u0(IRJ!#O2GLTt+PpnKH)=sD*Z$*GE)lslt*}TtD=dO4xAbI= z-rAn>KVTe5Y_HZ#jCnTiJaHOO#v+RLie%L|k}?$9K!^BLZmx!(RHAvZE(qnV1<^H( zl(KU|K{P<9TKrH~O=ZmRgU;Hy;hmgU_oTPIvBR_4BvjO>F#Gm&T?tS^bTxzMlzrny zElB%zg`RzbS(!9o)tr%zpk1p70=L_)&9TSRt#L^nMvGhQ@pLr00RF8m2xUJ6i8V}+ zvSLCFG(f0Y9MEluv|>N(tQG4%NU0@XlK4w)5+G_xnCbewF13{D`V50;X}a3m?cp|g zEEiIF%SDJ&H8PcKp3^>qqJ$<}J7=rO3?A$Q=EzavXRY|A*>Lc?W#ZjbrtAe*G-^D7 zo_>9@_@Y%<#XnmwzVW2x(=shTcbel@priF0y8ME)k!KNN7s*t7GDm*$ic=XxOGDA-J{&j7V<{F+g5(lCRf0JRD$*r_rtJ=E`uAiGo0Gw=+O=^>oIQ{% zDwKh4+B2g|-_vwKsL&!NV)q;nuFI?1H^oNiUi69CQwE6qJY5PY6@QK{h}enT|I}Rv z6XsO8RPj$rc}Hx79!O3fs-+~#0I}byODRR{H|c_io!D#S8BRrGI)N>orwnl(p;)qdNuP%sYa%+U!QC?9GK~-W6XL&!jnRF{lEfDXr5@Dflw$TzbwR{V=96|7#ZFwMi9{Kz z@MtYEHi$}?)oQ(I5&6ie?TKXrL5F=Zj;s>Vl8gU#T#%vUy3e^pVtMUEJ#db@7-Y(jY`wftzXAR?!M%t#1|m*FLY_7RQ^F- z5b={4TX@v5%ET8*t$tK{;@E&ewfkrj55^ZD^9Ybej97_GlF~DNL)nfGc8jxtKw;)T%bm$>c^Y zNVVE^+-lXdl3m88K@B@eP`K?q_$OCN)3lA=)z~Dsc}3k5;}Syj;Kv2t6sDjs-as(^ z_~=r3kuC@o2FFD9)%y+Xc3aISW^e>hPUd1Xl8>(D5Rn(;gB^z zs9HP{F`D}C&PG!M97QFzVk2C?V12Jmf<^5K3#IPWWxkT1yBS2MLMd+4f()hhMh&G5 zimKCDl80b8^*cf3wue*aoqcX1mAI@_88@-9e$nUB*Phm%m_8tgc7GC6FC@l*O?NzOWFhb$x`9`yiTXeV8tH;Nn|c zzF2Ke8S~=uol!%E=B+4u#TxPVFdsE`_fd*0L?MzQzbr~Epvb@ItRi<`$-?HHjPzr) zpdCX6)RHju{edpEl=|MsAX=(#o0FQ{D3AUwoQ39*)r!qdFb4m#pl`cl@S&$xa7I#M z-&}K&PI`1q5{Ny*rU~slQ<63Ucf>e+oh}F!4#Y(CllGJnbS_F_+N|Y~>@ll}VrGht zr$S)7+2_PBjg1EO} zGTEAWID@0Y{QStq#*Y({%mU^Ju>u_>w+_M1(zA6*skm{CE{NEX@iurW-~ zk!@4uTGh{rn`2|e`Xp8Z(#hpBDXu`usX&kqFVH2T;=_%)Ae#B05iqHkOZaaM5ULj6 z(TyTx=joRnj=9DPX2zfW{Aim*idqsDbA4Es?MiZPXAmu8uJ(4BxJ?T(3dHFA0rYJ=cOo^mO?~76kbY6bdSw-r?p)3BQp88L3Pvl4q3Dcuq;EEV2 zb}@(!=@GYSLF&=tk2fO#J;LsKhNrV4)hMCM6QxFiCy~@>agjegx(H5%Avhym~B znI%`F9qq^jP3}ZHlvmovAUdQ?+@=MoO;6U*CM5wur7GyMMk$qGO(dn-9i>@m?5tN(*ozyw8c8 z_=#ST{pW`vdQjrqBJ=$@w8r`ZUA{z@FXQ4(e_!!e{BlW53nnnD)A%u03Q3yn_^{KBhe^qlSdB>}255QZmJ|6BtB?j48LtV@wy$7=@1E zBOl-~d|kruU8u_wW%vY7A{oB*QECA-`dw$$sQX|BGdq2HG=&zl!}L*0!t}_}rIym8 zNe0nUkJ>!g$BkN$ilmcy!jXstuO`VZ^9uw?+daNFxV2QAFemGC96$e#xMa>AN@jgn z15=LP8eIh6qzgiMUqNyW%cG2!Py`JSsunrjhR7J;_nkFfJv)Q@Ip5nPNk@7XExM** zT`z9W6}RV!+l_p)`}oXNoS5BsiQR)G7WInRu&60>S}%JUJ~1i=w##Y=$8&cR)xuE< zA+$%brKvIo*3#unB{Nycl=BkeT?{dbO$)Ds-2<$2M7wC}!m(*~Z>^NARSb~#kzO$2 zxK}*Nvw2xIf?>jM1#R1H+y?el3}R#8bhEXa{OMb*JSH+P7lt;G#p&bzQOav#qxB$W3e#@=DS`EXFpWaaPx~8Vqy4&MS)!Nc7o;Tm02gl1C86TN^$cPjXV-31-5nfk ze@kqn>`C(Qt}|OhndjT0Q||S;Ae8*RMi9U4B&K0lzqEcTMiNuzw;Ckz$93tWg!2wv z5b=}v;7qxR#6OOa#5Kki(ElIk(npc_K3x#8lX&3jOrdThMAN;g#${*37t5Ri3nF&Xub`u-vL$T0X%+)+vJxBNhxt4zFWvyz zOS&{uWH0D~h@I>kw;!n)6{LBT%qOZdRrFE)=H^wgao~icA*-N-Kjl;*z>HVwQc^MF z7F`grGh@ZRLI(TI=S^&fiep>-$0yw$8wZAy*swBdq!iu&+25y2Ge!1))dkT^c9qOM z*5r*nFkUYdj9Qu!Ff#WdI#|aK%Tm>eDX%aj^9s%(3|F85ZB@-@uu1g|;Kf3?b$XT_oZF;roC+Vtm`J3!<6u8VYj{ zm@X1=B7?61Le=6NtUQ3bB@JWDxGqv zF58vLUcw;eNkoNi-Wtv#HR{5RS~#OF))2bkngcH2yIGqVHAn!011?V&WNmkfX@F)^ z&XpFuJ}#-lfD28zYncn3jxK^VT@cD_gpgZ1BfVj3rkEHv5(Tq($jIT8LhKxp8LuX4 zC7;gU78~_9CbOAhYTQVP8l+Hz6xASw8U!54>vajK%)x6I#60Gp?Ginfy{>Ln&A<@i z9kJ1Lc{1a{8KB~aqEqn$x*(K9|GQvByUE?RwPFN^YwwGV*2|Jv2VsEF-_fO#64!6* zf{2~a%W)ioIbmjl#9sQ?_5_=O0Kp!lGZ_@p0KpdlbHqUNFAJ97UAu8Wu+J)=9vh*% zL1-Wg5I7l~zzJOtu}gG6rXA$!Se0M$ZxpvPHZl*;%mW8yfY_JmQc9VRt-2tZiLKG+ zQQaotb2UJyT8Q{Z1B9x@C9K&RAXF_Lr)wN!=k4LncHX*ZA3mSO_}ey#GBqTu@Agt% z*;C^CVg@l!u-4YT8#ih}_T8Rzyes`=-;Fjz40he#E~wh>$g5@7?bC4yU0B!c6VWB` zqq-oJ(TIuMn>;;bIh`m|q#ZXaiE@3sU}h85e5PU+Cw&IsC$aJ33~x7DPB21+u-Q)~ zB`TD1DirW^Kh&kNG8Omhf{2|_$JoX0KdU`abHFs)$JNE|MKvOZ&|SJ9VrNC)0i#xf zO8AEcQ?XHgS+eRN49NVMx>Qm!{}^2mu@kxryAAp?Nc&9+O10+Mc^xR zLBvkr!JSi?Nh5)&;)hLR+Gpacu~B*mLu|mBaOS$#jT?ZVx9oK-9ctzYX$2MDrP2;%^O)tS&z@~pl7u-QJcon7a!%{ z9~_r87Qq1w* zhknOcw@>rW*6V3OJSuHcj|&@W|Bs(LZv%|YHEN`wGcfQ4G^jp zq6e=5Le=7hx{qOQ$xa%E*pU>V)(v}LCj;*+nRLYM*W{k zy3i!=VAADWLDhDf-Jt_D7_&?zH^+STgK^0nc2}-Sw5_JJKP9>x?$HIIOh-&aU%s_o zt(B(cAo+A`Bp*y>8EGqm*L10+{ML24AYvzY%OxAHkB#2Tlk+awc#STt6uBF^AmS&t zC$;GFWOu|!ZsZADPr~_-F0B-~KcEXDc5)wMg7CiBh<{uO!tdzPQL*CNx*%d_#hTrj zL&y&b%Z?QVn7LCi{0CSq-5gUiXRl478xQQl#A7jm#2)BKEcl%Wp$c)p%LS&Zi0w8H9)9ZtoFC)*c&3d34iQtH(}Kn7D!}_5^evU#p)F-cFp)~ z?c>`dXVk8+Uc*Jv1?qeT(WzboH)=ul8ulIcQ0-dBX?((1iAxymRmlva#_@4Lof4=67OxatKnuDcl!=Ln_$Ru= zpTN|`dIf8fOCqO<45NEyvvd5UYI>$t?SL#wzMFF?yf{2|VXSxij z)@bh^-oyz5>h+>ob9f`EFQBy!b0$Kfh%I4?ra9psSunSwIDYv4i!LPT_SvYrV&lWwB&`aCYB<B+LB!62q|gVZ0cLm0NZBFD91QtGYz#R~Du%3!qZ>|LTCwN%y0lg7 zc}N#T?Cg0ov1h7YsF_IP;XF~XB9ePF=-;?D-0MqDJUgbq(mtITB^eyz5Kbey_df2GKK83$_LvdW7L?i z&dXDDIj{744}+Me^U^Bv)}GGWyTd4ApQ?h7YSp-?X7?p0CBA^}m7|kyYJT#CAJiH? z?x!|6VUh53{cwoaN<$4}$UYPw+O^6prv=4n;l6Kf?6Ft4FF562<*zrog>EdIc6L&u zA1P=xbIM3p%bBA1;gI`7vBl=i4I^+E&L-=1Ad>Y4y4*&WH`C>r8AMB6KZeuXj=`6^Cm(U6JmG1;ad});C(eUa!QM9QkqK#|JmH=kmw2uq zZL2^__w3X`BsF+KP!?{-KPq-xT(XB#-7<16kiZ&nJFkx}im%ZHp$te&Bp;R}cXKvA zPyg}QsE!?61=SVe0O9Y@rJAw9Q2G&4gZAW|`v@Xi__R4uO2l`5(QVyZ_v98+B>gL|)BJ+V!4MQsU-sUEM( zc%{e}F^EpZRNSclV=TwC6XOi`NLqL`2LRr!Up-f3k z#9!eAw23PEQ#j?-tNO2vjq<}zaFt0(ya7M*DqWf>TkuL<5V4bejU@X#k=2J|BmP>4 z_+fF??Yi_+EO?(Th}c_7y zSH#GCm_c+Zy5dGH$mnW^cE(DL_XY#3vjlb99bl!nBX3}~8m(ee9r;8mF=_Bve*#Ml zYLz+mc-|eCc-m))?!6(W+N$n-O4cdmty91jUJ+fEcj$spR!A^R!;mRkC^Sj~gsR1$ zZbPIkT!ewtmMY!;vFe_EbSjzO48EvMaz;%FGlS39C6{uef5RYJ(yYyidv4T%G=p2U z&7hdw5;TEt5R`3Y0<~u~t@PPIv7FZ1)%i$V0*Fo~PXl!foj@J1XCI6%lb| z_Mt9e5G{j;_RjF(HZ925LB9*7CL0Cgho|fEM=6%zPb9^9T$Ea1+-FH=6>FvIORA1D z@j3Ea(42NmtD$CvDVVKGI^`v18AMA3YjbqYjarZzwnsZUcip-(%{-`R?-WFCcUW_h zFHU#sA(Ey=pakFki zWKglRv$n7QAeKxd4)Br*Z&2|_o1}}H6K3=Nq)Reo^B!gpow9k{s0C^B^rH&3bS7x* zR-ez)G1_hHPJU|M5ZhW!VATruq0M5sj?;=vqmc7w$j(O<+Tnu(@@SuuoTh5f#2%^! z_oulUEzkbl!sO7HHm&4!R2PIYG$BmUP8FRh(;65D#JC{#o1+6Qh&^N|#M&yap?F$s zjCquEj0M*u#WmqELaIqh)FjZ$zDk#{iZ}Zi#5}g7-Fh&%k48O_MdBv4IpcvPRsa zLMNd$8X#0HLM)nYp7yjc9Nu~ub}W&{9G~i0i7B&KhgCa^&05vSmWoZz=8LgOK@w+h zi^`<9GAUUXwrfsR0!Hm~x*S$Q@@ZWV&Fs=me?%cL_YhvsE-M+p=qe;ZZu%!St5ZEei+r@2%xb5VdJ?BOU)S9{d&gbwe zu`Ku%O{@>cCGEo}T@Wv45K;V2I8wEF2{&p1`JEpU9Uj5OKJG~-Q>C0y7|oiwQZ}8f zOa&d!djw_M?RW--*kucuYPBik`BGe>hsB}X(3FE!ijk7U&qtTU&**~qh%3x7k$hN? z90S8;1AEmrQT-ROQGG;G9Yc{0;sD_v)TNp-0YB9R(M)({{ljg7Y{&;(-U&mb0YcT{ zWx5TaS|CQewX+VSdpDU7pYu5VLVu?voQ`ul4{Ax6^GE`hcalLku7LAMFo>4UBYcuU zI8Nm|xJ@44fo()qG#O#uMP!{Qgvt~%HCV~CW3*@!s}0RBtNBu;maW&sUL(WewL2Ck zN>_?f+72@<4xFvD*nngg2x9G~%U-%Xg)Rqh>F8D@%Bel+c*kZ%Lz_3ZlDi!|0S(a- z7^UPwU?M5`Nl|J6CBIQi$#t`0%XwY3BQ)NO{&Ud|?@-GzsKT6aBDE(>)n{~RrkuoK zT@cDVS9L*1^ZXnw&S{U(jO>L486yjla4d+Ie}C5|{!y#K`1cN7$|?T6l|gjKRCAj= zruu(-6BuO?cj;NgfHMh(`*-N_NLfe0qe#~AO;KtA>saipj;&HUrW~QB zU13`GD_z8!5johbMvMg8*fepZ!Qk-hAPsU zHB-8DRjjdeK^!w{v;)@eZ8VF>ry94$M*g0pm_`#2|D(DDQZ)Ws1~HEpZFf#}&Grk) z_V2@%qZmHIM5x5hnla_0Xk9Qce;7Azcu$6Mx5qH=Di57zQnz#hd_Dwrh{q#n3>3fAP2xT^6qVkAK zNZ3=?p$Xb_tLR_JALu!n#Z*#9;J4K zdF++I6*25w!5}*2vAIzT(qoSuZx+60Wb;Kj=VmlhHiPc^v4XDccGt^y7HgGKZjO!N zu8d3W?7^hzMH=XX?u;&lm+68~b|Zw~+L^+Ur_{~tp~Qh2j-*WNsGB+ey!BFSWM7%Q zjxeXHggG_Im;t;$~3=q+d zPQ+PV5K4e=7JO(owO4HcwfA3{7)|WhesC_L|7&bSUy-a=3fOw0`lF`?a`#AewNV}R6)fi_}z_{f4Kb^pFh1>4&3(RbcqkjKPE z>w#ohp$riFwCKb>RTo6;ay_)YQo-DUJa%2c%wE4Cxgs`#uSgn%7V|tL+5pja=u%7> zlWn>nVkdex7Ev7W4>wK4M(ZAIzChRlB(`+vqewid3nF$BuO6#opHz&kiPPs3BFgrf zlcTXwd`&XrL*6RH|65(^DF(b$7eq4yGy)tIBZ*Xl1_)J)<+|=jCWk7WO%AOYE0+t7 zY#reJ-0Ky8|MBx}k}qmmSi0ylx?-Rt>5~kiWoNOyt5~>A3o=`DAWF8#6^XRi;vXUr z%pZMMmsd*P1g|3L+sC5R0#l@?JF9OiF{>*xp25CFb1U2GC$uLHr)GsI+X!$)48DgL zM2D1(+q58+ZJ)lfVbTW6!+e@{rY@tDrU^zx(zJmnwWyER?G-gFt}fQ6(gTc4*}m-Pj@^;%z~+Y;+bbX#owhq!%N+`b}i|0!-? z6}PX^ZK?Hjx^-E1il_e)w{M8TyTt9AbX#nFi*AdoyXn?zeOtV{hi=QPd+D~+`VQT? zt?$xp!1|tecOTsrTlb6G_vyC8`hmFpP!#@%ZoSrz#qB4e@TYX^wjK~qKNGhHMd5$b zt;_nkDEx&e{H1vMmAL&{+nAL!O={gG}x z)}O@FpXt`cCvu}obVea=beImH&|wmINBcsfnY4K=3Tab7{G9fl0bLsO2rWu7L=?dC&Lf ztLgGuy1bq)Z=}nc=<*i2yp1mJpv$}H@@~4k2N%O4c?4*ZN8CsraU*%ejpPwGl1JP~ z9&sai#Es+;H9UM219Tar%L=-T&}9`a28%IZ zkr?AfVvHM!F>WNrxRDs+M)FJOHlKtapG}u7bUBYM7tm!tT@KRaYPvj)E>*hJ=`xLr z!O{;{B>lLN^y5a-Pmq6gGQRr_U4BcK-_zw`y8MwYf2PYLxWGP%-;ti+=cFLGk%Hhx z3W6Ic2yUbxxRHVoh7X`4X$)SI#^6R8gBxiKZlp2vo6nt&&%Z#IFVW@8 zxEK~G5WXP=!i^LNH&P(nNP%!81;ULK2sct7+(>~4=2M>Z!;O>kYBH~7hh#M&)Zls9UH0t&+PXI{QO6iI*UN;Llw$h{`w*UpH%u&`A^+Zaeo=AJt z6RDAUB7IU%q*&^SG)z5_s;MW^IrT)!r=Ca))f1_sdLq44Po$vgiByZ8NY#$Aj;SY7 zHuXeWr=Cdt)D!8UdLo5XPo$aZiBwcQk*=yIQd;#y+N+*OC+UfF^e8K*dLk`VPo%Eu ziS$-IkpinH(q#2SDy^PKx78CVxq2dPS5Kt&>WMU*o=D@5vZ|{m(s}hn%CDZt3aBSC z2kMFJf_fqYp`J+J>526JC@a2tA`76NNXzMowEifoyLuwMS5IUB)DtN(J&|G`WsO!( zq}u9WM6adLq@PCsOsJyd{BpqP+>!6KztUo@loM z_o;3VP8Lez&~0|2)y6Fidqj9wBj+pa&y}V!*f#*NDXG7`ILo(zN~u)C_U=>Tr9#7c zJ?dij91u^pHqN+-EyWLEn)cYstL8YRVaLXCh9Nd;aGsxR6iU;0?#3W>v4(#Jat4-T zS9pOQ9(%F>4jl#4*kdi~BS0(6>VCuf&8)o)yEecsRg7Zenua}?&J;_o`Fr zb$e;HTqcm#Lx_*9+knpcE&lTp#CjM-d#pdu)n3Mp-&@&RMvI4N0zDQ88a!A~Magof zWUMlYXX{V=(?9c-iDLZ)|Ib>F;0nXN=n^*E<94?=L&wwRZr=KVD<{ZcyS*o>@TXB% z0MLw^+8XL`=#9Ei=#ASk#4Hqg<4X~`%olt#g%lKe<9Ej#SsX(kVNvJ}n9(AK_Cx_3 zdZR8BdgFEs9=~ocu}G3PSxX>Eh`W0+)3;8O0B=y*(>0Z;<-H#bVr6UExUSCnB7RQd zG|SR7%R%@o$KbOZg3odUKFb04EXUuo981iy6wPwHJj>zoEJw?;94yartUSx1@+?Qn zvm7YTa-2NNzI&EMXO<;rmIY^)W8GN}b!R!!o#jAxmb+`SEHbk!F|!=4&T_Ci%bshN zrDc};X|oo|$}Ee@EXSa;9D>er1UkzB=q&r6Sr(F64mM{w)|}-~bC!M1EX&6%i^nX- zm9rdH&T>>a%R%KV$CR@iQqFQjIm>=$mZbu^&NZRPaFzqZS&j>5IV_yzsBo5p!dZ?9 zXW388vMkK9D9o}X%yQ^A%aPwK2Y$00_s!N_Gr6QZ<6*OPh(*GEyA+Fdy{{ePy0lv3 zIME)!5Y1$%%*(AwexykC6f)yRfyKn`n=~-epEHg$tQ!G6f2}=OE$7YRk!#Sc8~ZyBp09!EQ4y;-8&gWt#MPs zdJ%qS-AtDk)8!?&yciq)jK8>H_d(P}T~PCxl>3yw)_MUx+tl=1d--lwjYMncM?KJc zs#x-z%{Q!9qp%gofdl+eVqa#`Xv|gL*LWcMD%o6Rd)2;~S|00=e3e8iSC{K>#^_$> zGZpw`P!P-zoj>PYO1?{pclMcbKl`c7Ap<81z#1enhchPL7Vs?Ba0{>vVCc=6RXDL3 zVOQ0o-MdY`z(>n71ry8hO3xLCE*mF~E86LK@lI{8Oq-|Ma1nzZO*D{%FNhcO6V*OQi~g+@aNa z7q~nhr>Pn0y?Z>L!<~)Wk6K5>}UKH6K_-QTUE(@bhNAb z89>!3b6qMbqrsL!nv0to*2|$1)-9}5cp~kRDu$=q=;=+)ySLI4WjU<3;Xk~7Cl!$M zx85ZR{+So7gL|%VdwkPW32)bnj;%)(~QO`kErdqxQzJ z{aY{Jo)*%OcDH(AnE3b<`7s4%NBIebr^-S~>m0TFj2!Av#_SBddbE5+sh*?us-jVw zE>*B28`k_+&8+iP()ZPn^VOD|^TBCze{in*!DHkHltem8Ip|U$JzlTXN<|06Cf^rp zJxeOnusE=o&WC5p4=I~;)LusB=p5(W_3|BMiqIV6Fi4+vrQP}JCixZRjE;J2Ng9Iy z&NnyuzFC7Kt+7pI8je-Ysdm15f&7kgLZB_x#(DK3->VUNl}5luZK*onywLZ}D*k5L zsMgAPveV92H~YRC=C81(zKkge&L=PSeKI7F(V+p(2ea}6%32+@`^oaAUAnz=j+a}U zU%qUPm*+Y!Z<8-63wG2V0)gbVn$8DrmLG7Z*7dvm>?RztbO#{;72AqTQ{_lP72k1TK(K&D5=6gGc z#qa5Hvr@}D@821GpED4`JMaI__kOvt#gF_S!r)%=<*1?eV8tT^thKUC(`8-T#h0Okt>MBRM!3Y$R6BQnl2VfnH(AG zsnLn(sNt;($A`OheB8(OU2I0tB5<&8jAv(hce*t@GfdEGZF6TF zfU*0G&W!IIa5gqh=R4o)JKH#)&pF4#27@y=Vaz%G&OYAn^HlXz_w$h!v%^(%Tm9@C z>o?Rl*~?SKVtudOpDCm(CBw*=rMkUsJX@GC##1@t=yAF26TjM3bUJ!SXh zQu*m>Y8n`q8Tq>13t03U0NT3w(#_|iq-5lbRN1I!H`v1!W2Tr(Rg7}7n5tw6Zhx{- z25>{7`pI&2YRWuXw+GUNTn@D3TG#{oN*SYMWVV~>N*(n-P`A4_m&%p;-m=|4lPXt? zQWC@iZZn@T@bg|t`ntVhALu?obO&it)k?MiCapY_HDZkyv5JwJsoTTFxoKi~Ia#jE z<%p7^<#oHS(Qe}UVA=$(B)&8&b9H+>Td5Swj~^!{Z{}BtbZKUDp)@_dgFhKRvpg<| zlelE_1$BGG4Ip-AxqcIni!xNZXp{)-1+BsEmmm26k9mOz&{caywlb4T<_gmVG=*-P zi+RXLKNnZB#thmzD%zSXRWeDZh~EnlZE&p@#37jl%U1FGOkpNv=98einT8|rjh zmJKQcFKYHEm!u2Dxug`*n*4D&TbNDKi;_8=t>Dv@{3%x;Stttb6U|35W*PD`mvp4; z7JD^wDM`Xw%BRpi7R+1h(R}KNIgL6N^2v-*gs|;iR<(zXVs$c^E|-&2W)Ag)0E&uw ziiQ}y<@#tSU!8$AC8r9dnN)?fzPBvo5)?cr{v$%$J@~9z0x5ehH>WpqQFkRZNrKdO zi0)j}pDtvK#AL3JK8)XAWtJ;uewyA??bVDN?4L<-TaqR;w{9 z*|V~bwU@(2)%V_9&u+?|oqZPmvB#vyyXa{zfu0al`qEyZ2%Wtyo1`DF&u-u!XE(}! z?Cwe-lbWmJ0|vT+ACprvP&M)8+Uz>DUP-d_G0O zw)T0YLZNcQ=I1%@Zg?Kpctc(MFg9&eDtJz&ayf{{RQ0*fol90qseBm*gzZ7i?v>v# z2_BO@Q~a`zz_KBbCD~K6XNXrL(!LmZFaRV6IjWVZ#MVUFoR)Y;jic#YHDi#hlT1;o z#E(bKyzh;@?3{C)rVeI|sZ=#rNtOy=w;+_gK9$L!@_DvlfLVgU$Qotv@D>S`KA0(F zsvsiKrSW2A1?HtNNv?yeOvzNQPV>J?vJwgSB!)sEWzA2)uV)~BM|!$nXnRhok+k#U2ED?%k$AqMmC z^Y9QHDAf1vC48fzj4Y9Kn>XMMUJSyq7vUny$!ZBYC?NFZ%}UWsAD*k%_@iO@oHVEN z1=x>k#cx-8i@~~S7*qMOM_46?f2*XCf?>jcj@4T#=zmpqk3c*E1C~wVgGqQx=$7;A zF)lZ*2N4}JC#yQ(`~s@%(5AnVE0YyAr{0CY%(!O4`U4#LuKY46(DAMC`)$D*M>%b<9pKc0AC|%lbHK zTw-@oIh)vi{zCZA?ETsM=~pXNnaib#ck+9)0%GC!I0B$X=e^DKH9}IriA| zku698J1Cv|asgD-oQe^|NQ4?hs8)j%b}f)BCO_m&7@>`a@NdH^sq$y zO0Tw#wW9%YyavC}1!;~AnM|3JKfi-#SWtX2?~I&a4KH?t*^ zVgvFJaGCvxTg~U<<5W%{%x=wID($K(W|F}*zsOExpDGQa_=3gEK1Id79H_@&0;?4F zvU8OtRD^73Y^jn&m`g#-3H?sQlp=l><~@6H_7YKxL9WFVqBDwX(6(N~hyVg{WG_*o86*!qhYt_(SxOu-T$s^DVrBe+~p zwLtMA8)oNq_DMDInFwmhGpj(Xj#yK43?2KjnQDNp5e37D>|mUWCF!xLdvc@1DO%tH zbPFTNUXy*g_~*$It0Z?ZXI7l3S$yym`GJTHS@=XCLlGjxoSU|m>7mLSov5zO71%!U zk!TpnCsZL{Hd3W@mcl%SAn=o(Ilq;@S-c=*-WS=+WX0AC+!V(PnD}mne5X^nh9uzw z;WTBfg*cG>lYw^FBpO<%R*F>$ew<*fn}apk6wyh5??()Sm;^C2`4bnHg&!n0=X58R zZH~zwOG>zxI5z1N;H-H3B>^p z(NAX5QGbBD1M~|cUvPS#))S^G0PnUz|bifxo@%!f~VgxN-0zF*B1(q^WNB*b!t0Vlz#K zofpy;lHXnS>`jQ6o_%)R5Y^|ngQ_F@aO|9yJ^Qcdqiday8h{`W6m3X`IKSP3P;b8S z3!BTGzJrtwaG*p^c+@GUP6`Dyb4m zRd->X^9`FQr{_X>hYgosebrU5y%T$O#Gbfg&%~~)E}PiC{lJcc2cKLQnAfPEitGxK zB$S(2ebvO?omWrn#P6=U>av_k=>_LEgOpb}3T2rlZ)EosGYDo;Lc)orkBHZfmFL(f zd!{`^W`Ofio9SCmo@CziNRP-;)hp=rFyMXxnDYvIMbW4zLRt)R%J~4qP#MFch{7@Ig0om0kSCHAbwFP6m!NABL_pnfg<(dB;M8Hi>6$}EgrBg z&%G>Pkkwixe#r00As_~(aDb~bEZ!lB#aSUTQCz-Ol)GF>BS7KzW8%H=48j#UR2Y!2 zIJ~mnLK@CLk=1C5ab(WwxyPEv22=*le^ zzK^&I4x5JDn^^+c6^>yAiDFeKwfOM{RbDc#N6Mm-%o-^U${hlZxjzxz+ucjWuU)Sy z=8OS9;IP>BX0}i|OhNwcZr_hm`7~k{atBO^^$L@GqX=RzyY6&HluuUQm7qE>#WV24 zP7QWmR{A)H`U2<*D1wY0VD6wwD;lZ3S zgqzYT_^$v*DnD6OhQQ|x;cuPj#(G@CON>E{&HPk>@*f<}IhyXO9{Lz(TYtn)?9=w; zjTl;O#9XmytS}XmStO*7_n76hk;|p>U_)7{{YnSVJX${Lyz?uK^Jab>ZB$-S#_n^{ z7E-d-I3V(9qftqjIp}58A^KL^K#4aY0@`L9?t~NQDN*_j6v7B{Ubb4_PBLw**`Jih4dW_0Y zKRJ`E%oUv^olK9NmrV#FoCb!F`6!c6LS>T>tqetVpdl4Y(ADasJtTq{PN74kb}zM8 zc}fItA?|h$934g?Fu0^fGKOU*q@kg``^ET@=yD)4+!!{>uAt1P-3L=3GK;t3<#5#; zcPTqqoyyFZ`Ehfmh;AMPL_DU7Cc2yAe~1>`p9cN6dDHlhyj)tsMkF1#G3Y)Xo+#uNLOLm%h!`qfD&vw_&-YR zW57wa9^E1YQA6Sh=_{iIHLwR|EoIv!<&Ho{CQ*w%z>}%|QR=Se#$D#8@mq9OC9kVU_Cq22g=q*2Jw zsag(ag!r8#9?_pq!DLj7Y4mC4k{re0V`3R~^?_G>2SbDOoJd+gqv_4bin0WS`demPDAQGBW zsp}j1HIph5HH6eV1Ol;T3B{7=uQX8S3>u681vbbJASmd;OqWvVO{Za`Og7rAi?Ubm zubIO_2ZS6d9uPH^Z>0vvr(vf)2AfL30Wo}oK_Sw7Zpe`MpER5+PO1Q-Nxo>Uc*Qw3 zm<5Qc=y};28;xt09sEjK9+&~Bog#yUD(4Njt_`BjN_wI4r3!Q#zm=6i*Oo#=MN={s zb$h+2Pbrl#p|_<;8XrWBXe?+{HnvfpMmzPHkHL&LhPuh*%7Igi-LvJ| zoW^jYy2P-Z?W68b8DYgWY|N{F75Gc!cjaG{Le`M^Yly zNY!wL?wy}eXPwH|H2q3Az54FuKKwMsjvq8vt6a&TID78yOEGLI6XGBwb;d=0jfQeP z<;c~*v|->*)&;#OyAK2*`iq4AFn6{Q5<#wL&qV3e59)}5_ zFB?KY?su>>m3IC1Ea$gm0-%U#bVN3rMrDctz};dtz)X%H(eFHvhRwVur zt|pJN69UmF{4ZB0y`^JLr=V=)rbK3`hKz6uBaYl7Mo-9I%h@~lPDF8Vv`7a~W-^23 zuX2x}ID@np|K=g&>~cG3jL;rJAAqNNutTY5*V%&%GU<%vRP8>*f7J01taL>ZJ16e` z+L~KmeAdgn4ptPuf%%bnVT}N{?eNHA{OzZ*9@cP5}k-LMEPqEZJEaii+8t=+}1kS z5TCs6NjGC$NVG!a!DS;}_uU^H&vA-hzy9T47A{&mzI*gxm%$fh?>Sm?Voh1_=U1U;FG@$h-1WeAKdx2zzAG?`Jv0c)zTHqFYfGh;z>6n zKXmu$w#(IvZ|}PM)@C;=UVQi+S2#dKP%4Wbz2EuXi4nw$kNoWH<9KB8%|~}bo`u(z zp^Ys6&Q`l+#4kSi*mcv#kBa4I@Az7)Xi0u>@38*^5$K5zK7M|N<9`wK$g(59RROCg z`b7FXUk6OS`6m%uu?LVv51y;~D5B_-u{UrLM_{sO|B$QaAD6 zH#hW7^kGE#^DleY8+nT28$NYjqnLvyQT*3mxW_(zP%OTC!Ec}aH z``8a&`01Un0#0Ys3HijYZW?^A>zxx7i+49){S8-d)7428uW#A-L4Wr{ysBLV|JcCj z>Zi)r|1x~sXjOdm(#csD5LbUyynfl&hg|Iy9ar(jzT+a>6N8K5zkTGN?D;w?;_b^% z`RMV2VDZthhf21;D=OZ-V(C9y&tJA=2|ay$&Hs1jgVy23)B7*Dr)pz56XowQ`bIO4 zvZvVtav<;83O^Cc0=72ew_Y1H)m|zf0}| zNS=nd*(y%gk6GW4->#8nTXk-EV&^gIn?WCZOMbA*G5na|N8KTb;O^tSwp*h8ZV=jg zfpo9iACzxai#M`kl)Nw_W`H&oZ;{0tykB#Az)VY!zmyLgf+MoIS(f}pwc!d^>w)$-*XomUwD%WC{P_z^;QN=C}`D3 zrEf(Gq~k$BbN&oPjYJaucLlw8YDyrXWd2wRFOD1ND!>#_;%S~_5K7(oIy|<_&EVbf zvn2SylUl;FN|E3}w#y0EQ6f`t_^)MV2JeEhg#=m<+zAs<;$ydPym&)|XNQUZ0~2cU zdv=}pUuEm?;7&K-v1L?&cTU{ekU3An1RpeI$P{$$PT=vlX}VkM)}N$qG=!hiuA9^4 zBX#?9MyG3)QbiwBmYl`#A|~=7-y~jd z@cabn0i&2Tgyn%wIDrNKG>e21djFJDP}LD{FtLcT60$nIvN|eEAQzt8B7WOcdcnM< z7fMil64Xh)92QNuOG%I$=YK0<^h+2+@~hNViBdcpTP{dWnx#tCSDHZzOO`f%dx`g} zOD;)H8pvUa(lH4UrHBSZnG8#eE$$B+;4bBlj#&e;jFU)3s9>C_{K|z-UnEU ztV7~YZ&#k#&8kg zixZN}V`5b}GVe<#)|mID6H(0j(upSKed(z4ye}PXo$qDU9>OFc8pccIW>a%zavXg# z7&C={r)0ZF&~Cd+hIE1ezXk1(m+L8%pj4O=dR>{_byLxQ`M>&|zv%b=qCfhIs&)@& zx;SlQeG2b6CswVPx$@?`7`^D`FVq;M3mzzA6it$pKNrA8z39@c6c834@FsW2M z(5NBAmcFUly_FP36KPe0tY~$T<6!F^U=r)Zto!h9_B!i++)&FO;bwPpa4f55J%A$X z54fOe)`PgCO4cuM$LGHiw}-^-VR3teZ&mAexLd!+1z0}~@&#b+-6qGB1X%>$uC8!+ zKNF01&34FLtTCz+lcPHBT8xFP#b<+SF|b1n0>%zL?J5uDPYsFtbHTWKb{yqlE_aj9 z4T<*i!DxGT$`MRA-mM|=ejyld*REZ=F89!QM@Xb!3`W{LLF3sTtOr73{ZcU2u01qV z<)&{kB+@SjBVE1+y#Y7QTu7W>3C7vGM`o|xc;`am{c14YvHh;0-WU({x@&M#$Qpbt zxCUKU(>w?_(%V8J{dzFco@>PH0yo+>hD1vdPJoN(p5SQ;ZmjPKiIp-r0a*JcET_jQMhxV{&R zd9;B!c2G>qaf{fRkQJa_OF+|m4vI-8ZnS5FL`#{~0JJL)x~Ip)czTSx3gaQG@crN_ zEWdo>X&!bzF(gjP7zZ@FPnxl^2l1|ui0=7YeH7w2f-ES+viN+ za;;ZQEbc@j6u@nj6rwHZwOh79|zZBCH3ZLK23`% zyfkDLeiB@T^%LG{r?ClV+Nqls{}8ewKMk(P=q_498gor=b64Q4AuI5+;0kmfqRDt3 zt^4PYSZO>dNcfxkA0G{glSZlnaIV=a=Jmynm}Q!n{ai7f&`s|zgsjESgKN>fm#5si zvHoXBtiK4xN>jagf~6bpPeS6Qp}YW^uRNe;OU9t~GzZUJh2Ms(!mom>&~s3%Rdu6% zG$h(z2csR{E_R%W?VzdDUIiQM2^YUT6pVg=(Z;rM4%FTB4Iy#=CK&g~A@5{*56906 ziT~kX{M}daL~3`dFARy5GTQ;7-aWz7mfct{3yGD+x&yFwL8-jml06}jQhGiB>A-f^ zegy6YKPx0|8V3l#-E}!Fw{Rn!4vCaT8iJ7Sp_O88q?M3J|8N3G_tLO{8|jT9k?<&KYD9p zy#>!0T)9Ks-Y#zM5Vv>nO%ATS2M-urq0zPgtX-GW3J5m|?!s@~BRUI3`sWisdWhCG zxRHJ~BvKmW4`}JC3D0_%ScXOw-F5g@$U4wWf`B@#a59Eo*Zjkfm>&(s+_ytcB=9u( zp^%7|&`93##|(R~l#5{8r2cbAyh~32?^Rf*L2HoQcvtj>lkH`}cn9`iaaN4yuy}E= z4T*bsFzz1C7kbggL!#{pM%zzuzFaElruO+EQFjNUUfIYPmSxJ&+xjPktO8Bz2@vr9 zLs;t>JIHH2-L1beBx;(%6M(v#?5MZFPY;QeX8QzT#gLleO_^mvVqFo8b?_>zp%P>8 zO~YE(heS@3lLDH&N+k@{$~`x;|2kwHX!21&9r~51du-avLZYU*M**l;Y}>Vc-?rGc z1A9D}U**LdE?Ba@2NED=p=sR#)frRVa3;REdGStfwX8Sd8Bx=l#qF))_BL_5lW#I= z5;dsW{kcMZx@n3J&%qIMWN6BZn72ZcP%NHFLK8tOp3OniGAy23K{F*Rp6)<%7c8ED zKobfqo)tiY{1%VY)5yEU!{;;}ZtX1{ z77aUEJa$L}ffkSE(V(2gBWpBHX7OMb4O>|}_C!NT7LNzf(2m99Gc?9x@jwX;dssYn zL8A{A4O5#|YiJ`oT#mNy$aaf$EpoD|P zSp(|&Tik!A?zqK$YU(2MBr%KntrmAasTXN+SCG1P7WdDnzh!Z!i8?_R_hhJJ!gF3N z>MQW%Rg26A z$$MMug2|a$>=DVQS?rj|#aQeo$n0BeyU7$=Y){E9T5R0NI`RBQi;M-Yqp(PMg|d;p zRI%lxTnNcC+Qh81fypZNvlhFRHRiH4O$_7dYb$6!vn1BD&$Rdqn<2~PyIA8Y=g5sY zo1tNvTZ)&4xA?KB%!*QDSkl=Hys0WYN6k0F@g+3R-Jc1bp+>VUX)j%j3*BP(0ByBo z*2P4>ez7AD&z;L&C+vpps+ky6`7BXXV^W+w4@m^XPclU7!??{mJ?}s80<-$WmhP>{ zc;a*P)YL%mq8(9tq()Z)=HYbjc9EyKlril%bWjx?-ZRu{lH%C%KcwUxZ-irf6d z>CXhRNF>f)5pQh3B11v`>S<9 zoG{t7UDl}+*fte=&Cn)axw%*x3sJB~a|{6p_FisEvV1Z!Hk=lx4P_eDz@aQ$jYOjw zKCXOBm!yg-A7&6OgUd};8|^i97kHOoPYiFbdOY@FdHi$6xt(+4v{>yqbwJ?9;r0(CG8YRd`K8vEC7i=I=ZL zvTnt30)b7|!>GbS#KZane&834)xff_PTz@&#(GCI8m&yoUF&?-U~Iva@QKN=E{INw z$!f2d@apC!*%)$ULo9uE$1In3L?E^;n2;wb5JQeYh^G0Z;Iai{_DR8$bU`#r!NPmL z+-DW$R(K{25ULg;64n4gJ!esilks15QUipl#RdkU(JPSscU~shsx#Ws9%~0f^Deo( z?RZ)%hysGW=cmcj$6P>6740 zD1CZqm|7qo#)CGU)295(yqH1L`&^zbAF5)wJ6nVpPqVA zXWO@7uwU7JC#c-2|D|u=_wi;4-l+p?`y-M-yDu&_XTX7xV)4I9m#qTQg+*gGHfE{=?PU2!vWfuC|0hNs;5x*$|wlMuvjH;LEoka?Hbtcktts}(x- z0o&5Mqxfe=M)7qbzDC+7A<-uUdY|}Sqf0?$Ne}9Rh@1&szG<4zkBsEq@%i%}bGp<~ z1U{k*B60%LX(e<(N=yuyq9MeoIYDIb4(5@Bvf2d14MgIGA zK}1ge)eZ8i6`x*L+BXnY=(k4E-;La7bh=T4ka6HLT@aBoV64Fa?2=Eb`@PgZH!|w4 zRMc-^_K|**F5Q&upQ#HXa?-EaW|q>`T&jd4!(96VyIt+x$jHAoo|f1X9_&6A?AE29 zV!;)sB62p2Icz`_IS&KQ zj*I~-8w>#ER-`{mmu^Y};<_N3Nv{$5sOU*}b`21!76H+dZpwRL8y(C%PZIVSk+FU- z&KvHw%Di5!%Q40D1G*q0C-)jf?ihA)=JPh2BCqE~MtJmEh}lf|gbTYbmOZLVKgEKo zE{Mokuu8C?j6=1l_ee_(yuJ3Sgxs6{yo zV29o;0N44>{;~gG3fi{2XE}h4scFF_oww;3P8}L*PZaGFJxpyz^xVMdvt#{095Qn5 z)dis}NJQiw+-(>|93l|IChr*!z0Z$~-b3-jK$+9X2Mlpx1^i!R@l=)8nMbjmSvqZXxOzD(CK)43;ppZq34)>b}Qdp=&jIB3Op z#>*$8k~(`JZt&SIiSqS1zw!E5cnSP)kOa0OqHcs6ohp^3irNK*Mh; z*DG{L1B4QT0E-n?*|r_L#uL`rPtyevIk_E2@{B#+1J|A#8MPa-eRO6XXFRJ*DMjpx zE{JAgYuF-X&O}hE0YcT{g}QcG_9S>aw$Ak=<~_;oeQlB>YD-X8;=Q_zSF-bN2GOam z1UG6?b|o|y(oKuA4E=qH&kDM>J3t%8J{CAWnD(*orT89abr%Cf1_Bw+Wv}4^b zwIoQDEM01;XkeN_bV!xBO)gd1v==R;<8sHVbhhbD^}Y6xc$Qw4i{vLWbi%Fc6P(;$ zr7bI|XodLI49=saNBIj9boVdh8h9>RCw_r}tTLP{yVfM1>Po*qNxY=Agl|zV|9Vh- zV2T4L=qIv7^s@MyG4YLSOpuFZRk2$oKMshm#1>sHKu5&6t2fmR-wvIdtXF_(R-GNR?lb&GguFwF-+H|W zZP9Wn%6bV+2xYx8VQK;E#oI@B&U*O|js6ZA&<^884GA({-_#|RGG1R}5FIjJ+$NXt z^6BOOnks3=0c249n)EAOwkS;!Yzd`FUk+0XXcBL~-Z@S3orE4AZI2>RJAxD`23%UU zPbtzV45CAd#BExXiln*oG{O$Q9$l)-6{SalE1~pgW0+b%kNEI{&goGvjw0cp&b^+m zfHt(lDN$R3bSbAxFQrQ+gXoYhahn#UE@`IMWK{3hruKcQWiXdvcM}r3F;96|BV&pR3)hkbqO6D-zdkQ$Q(F)`AjRQR)yZ~<1 z1))Y@A|iLsP8>pA^inz%8KryU(*m83$k*voNIB2H(go2>WDVP{+=H++8X#0H{wJh+ z;1kz6=N@{l5t&@KgLrkDM2MOaSCF;c zE~0Bk#`G?i_-a(*W_QQ2hJT*L5?=~0bf4D+p)5s21Rgt>EzHK4tF#eO^I;;7L`LnE zaU51UoA6-vxr*QD(oO06uXI5~PWt(dcwf7+J<+z$nA*K@Il$*5@+#mA8Fi29f@mhP zhBHcbpMqZMQpa*<*W2R8kkzV|!tE5&Ron5Xx*sMD7jS zQu)}V!8@B^Q`jSBDu#tEJ3l5Go3sXMMj%7EXS{9aJDW8P%ls`f;|KEVs}CaZxsWGFnQ3ql!> zh{%0{-sJI-5r0A6rHwu$GM=@ zlHqYCr8bEbwI#@z6m%J{WGBZUI^|5bQH#=tDBO-F2pfCAiWW-;PFZrA<9hE)!v@VFqS+Vk9wP=)LseC5Z*hb$yKJ!py zJXjSk6Y2y|CmN`I-NIk$Qce;7L0u5d#Mkh`%8?6~paDYF!qjbubmZUetRo+~qB?^N zM9IMH>b!U0__3?o6QWa#g53FIfGcEFemaBblso4}ElPKOg{C{tk{~3dAo!j7lLUD? z=G3o?O8SDF`d@_?#b@Y(P-Y||a-X16zcDi6FUYC?wJsf%UwNJ`h{#zHOwv@hj05!saZ6Fr?gz_j8-khFuk=57kk0;pCmz=*X*vc9#{^Tztxp$Wr~DU zhcZRq2vZA8U--}CnxY5M&>QNTtY6@MZQc5nxIH9p4~yF)e3P9(Y2fZYF4R^*qxOE4 z-TPU;+f%W%Nl7g&l z7r2(QB3=-c*adY{ZU`@f&kd5nR%F!OwQ&s-lE<9CVqYFZXoBtpf({A#QUV-KpO4ykz7xNp?e~*mzWASVQaY95!KEi)o zmuf0x{D>}yX2NUuXXWCBQfYutwFod`y4rVwegEG^CI<`Z`#+@1O(hV&)CCbeD_H%? zoYBX&b!KV)y#AWC5ydq2#yIO?nG^e5gX5(4SE3pr!<`Xb5RtQD?L>x;^_#&d3T829 z!~|hHZfR>|d{_s!MCcO^dSM^uIk@$4x)fCUutgU{GZQqdn=+6h^3?#LYH^vaV$0sj zcRSl#S#hAzGj|6&#WqP5wI-;?GNa3SB|R2{=v0q|8?`8VEZa55R~qRVf3M{xLE3i5 zdo4RHZ*QaIy>j`IrAz3~BZ5J_m$!zO$2aMMPlqKHo;- zducv~r>4dDiQm6JK~T7rf7ecfui7QXN;0v@xmd=SN;Mxm_w1-7(O!*%v3Z;( zlbD=KIJkY{`ONU*c}uIF73hIB}>k}u}*WZ?!)}5>~+@tVz$+Z&&aZSaK=6Q zq;-oMwJ7`83*Kc}_OZn@On=Y%p9Njp9T2q4oPRwku?tF=eoN zczL`|7lbk>5s~`@J>Vk-z5kU(OzZ4k@PHX|<=XEKki2oT~ z5Y5Eb2$EEsCETNw$oVEP&iKltgxqD-K0xN1qP++wTxIzY2k21MC z6{$wC9GsnqrU5b7jmNXx{s_VD-k71-ChQix&S0t|e_oGG-iVyR#m=}I|P zD8Dk-c(^?LMYM@H~fafkH@h1y5cXNITgHM$^_AwMYC((dlW z$iXaff0>xmevk3}o5(0XiXGkwZ-egsk>BU*(oA{rIb9IVWY=)P%8Lty(g2}q5nu>) zHE#pi!A!v@$7t3{ER}}pm1DDo(qWGn{9|Ndu#qhu)gVDNNQfFFxCTBwe3vdal|bC7 z3nFq>td}kcX=`lQ1xGXmR$%DUYYM*>87DS4zK1K2a96;`h%f6>Q8D5Rx*$%N5!%7Q zIgQ}puz>@puxUUnbp$5}rzWw+2PZ_uu<9vRtWM_4v`0(+D>B}k>+ohKb=bi9RH#y- zQKbZ`lt7gdvPwQ~J*-P=#jRg6h~q@H?ejpuuqStWknLQA~b1{sNJZDkKSXbO~_uvur3It9Rm!a?XlX1`4~e7!+Gu0 zC6RFi>9Bb?B5L4c#YMVwRHA=@E{JAUX!w5>LI?%a0HJCTQ3!F#)3bBvE9HOqf>&2! zsn}G>Fk%(sXhj^|M+X#OouWLSAYH{O@|hTIEaMfIsmR3T;`nTK4t=J4qLN4@sCEge zojBx=4lm%^@!18Ub_r2CpD3ku$Ib_oBzRo87 z`sAMAUZe1dHc1#YCMfgwQC-d};kk=JbTCHh#u4&H&ZCs~M@2HbCyw*Vfz79O_lBq3 zcXdH1f&Y#me!Iia;j0nZ#CB1a3cpV9>pImt)ZvhU&XpBb9^>b5brMn?2eVcNy`4&(Ka-PWaC24|GvoRzmO>$@71NEV#K?3K}61ol?PH86X$i8CJXr(%nx=F@~FVKB4fd- zcuAqAtUsalX~EZZDW{1469UnBkH^Kc_wq8e z_p&W|MXGyZw{tIM-kRCj=GnRo^^mqf?aqAZLg$t=Z_7L=wq=eJ@X7XW2tE%72e{|l zU;%aruNdiUo@OwPr-~-??POI%QQ0KscqB2$xSHmp(r6Rz)6^HKVi99c+%@uiG#_)X zA#Of{F3+ONvvFz3*P-o&bd`b<(d&wkt&^xmGh3})RKYHotleun%AaAm<&j%$)>KLb zjPMyahQ2@!%Ei6qn5hJw%}4B6YQY>`o`*|II(J=Rk5a&BEz*U6N1;;YqU%cOJrL1&#?-#*6xy93rc(1>2q7Q9FXv=-0ZmQfl-I2GLTD+Po7#H)>Jp(Sn!exBF&u z6`VQ~+gUX;-rVNy$jH7jem!BvG-+T?OfzO5?XS=!oTB{>25}q<&~_QVU~}y1U2>wP z$95i$jF|oLswpRC`tvl|@I*9pK_~&96ntnmwO4HcwGUhs8;|YWacDlGzdSOcV+^pA zOH3P>wZfBf{gi*1F4>g$-l7YlnerM@iwb;%5@~=?wFod^y3?ckufe=FIE&`w=tm-B z`#>Ds3kRjoVtq)LUy9}brVAo+Vz1bd&lC%Am)=<*_eVzS{F z$VuJ5KUKo+iI~;krSJsy~kMYij3Ah*fx%^`AB@ZE`5|-Z_@=4 zIf++KR51@8$AyYabWB9q?yOiYGK#N>r##48h4`i}^%Mi9bU`#TKqJ6WF_K6%Xn;_) zctAJdArq}X>TGgo&4e1|Ko8Ox3USNVTiYaG)Uu#-(VKL|KuOZ;8AQv@Vtcc$+@?jD zEjqZ+tgAa)G|#}7KY#QgU0x}D6TAwgZ?6qg3nXKI+*y5FiAf+l?$|=veuL(;BS%Kf z3R1RT>5@(<+s_$9hm?)mv?!HrzrM2h$D#e2))UhV+?A#YMupO}pXrK=^lU%rtfrmV z9JnWfwC&J0YFv=MU8>7QrEeEAh?e@+=CKfN)S^_l0}EC-p0Lxju~gF8Sjw+*2Lz$p zo$4GuXdI30C|67@^=cj-DMuxWSm{tUjwTF+*4Kq9h8N8lT@WgE7DU%DQp(N=1xzSr|jDu45Cx^jT^Nn?c0@l_6=rb z+JIGa7I^sW+9w2o+iln8Iojffz|;=U>XSSyl526a#eLkkP{X|U=z>u8;}Z-*!vrZS zCe%O!gsR1xbsHkB*v~p^#kvoXgZ2!yZalp`0z@qdGF|I{D`aYXHG^nry4ss};5NA| z7iKUIiaE(;BUMUgdA942D4{)Ou$PH@;xg<5wg#a2u50B?<|f0z?^cL+GpV8*T;8bg zzCrZsQ^gmp!YcmRdhv~GH9}IZMwowg=TksOYl1G@=(2+@JL$5EF1zWn2bWgUKKHhD z!lw+B)THRAXd32x#yIM?#^<9UT4JY6g%G{qo_V29(o-dvBflcqf~M^bYx?)5j+oQ_uG)K| zk~n)Ho>wS+-L!Xxm%g{_f>5DFM8xhnC|s9YwZ9q}p?lFMW>4uO@|Sceq*VO#x*#Ga za{tqJABveX#X`xu7Wa|J2t5#=JzPmhls;nrMwe2G*uT;R5jnBfOk^^cixA5jvoV}( ziK!r^=3Q>ro)MAnve(A3=Mu0dfE_d38rXd-ScNKR1tE$Bqq-m>XF=b*N0?q38P&UR ze&7ZEDGC?s5=hbbLR}D%(|7;@S&SC!gOLfbQ549(=uh}d5m$4&e8H<|D=lY|s zdYiB@VkO5<#E{JC8YPd$_U4>d`fKasvFhaWe)4Q)o&@I zbYHw6@%cij$Ln%RIlxPFK}1gGQ+DOW0VIW~SP`2K(iW^Z7b9kt%hjg6bDt9#@lVC# zMRD9nVJhLOMMBoX$C7Jx>8V)qEL{+hv!ri(VK$#Dq%xiq?~5X%{)%|ULFgm&3v{WZ z2z`Sth-N}-SSe-bLuh*QhN)T>FtOy%g8(XAqt0>v5z0 zFZK20P_@6W_h&)Zc8Ag<+juL`STR*DV^G`cb540od*W)J=-H!ju?1*98$hnXz+u6`N~$BB^wQ zWX29`jL%2r=jhT%k@;F(5Ydx)yIC$ar@n8Bkjxp0&qwAL>C#A%`31Tln#rsYY^r!w zxKRxdsuuU^I&&HP{IavbPtZoOA8nI7QL}>Lpu2QsK#9=@7(~lBsJ)ZnxJ`>P47y5h zii>})oIfJ^rY@6|mI)?>(z5r5sRgEv{i?HCHs2JJ{xjPX=226EG^-c5LPm9645CAt z#cf)Ynsu3;W{EjJer<~BGDc~WU`!}&S{kMn(57E^R-1-p;1lDmH@soyHE2pZ2Fs{P zL0WZCmu$*k?Pm}zwW`fywA`pgsaCretX54M_{!MSuVFbs;kNhSpIR!+(&<5R4=GPy z=WnADLiFG#1>S_*NXkD4<)z`J@@8ESDh!T@?5htLIOMOKjm;IRrI_S_hxY#z8SU4^ zO9FXYw5aSJHR0;R9(`Bhy? zDPn&~7ewU5UbkyXoJL$KV6*ZW8Y(QC<)$6fejgd-*T->Q79Tw<@Y5in!0%(jBf2zH zZ1{~Xh-NlughDEs5)N4dgsR0J-G;~vz(bvlrUt|YX4`Q7pEs1+d{%oxDQZtpD0MDy zh3uegVi27QrMOXxGL+gEHk9I><&tTV2Y)!VT~N90;nYRvUl>coE-#cOO`Ip3_qcQ; zDnYdSVi<#BqD;ZzUcgmh~QYD8N;efoB~|UdxxQJiHzzaaT;z- z04)yuCA2=$zeJaA%ALGW7eoh0f5BFeeix3^o{6P!5Ob&8b8d3(ej3;Lrr2^6&{$d%u( zOE)D$_cDl6j{K21eML{XD5QR{R{M|6MKz8%t&MI>E zRV-}o$w-fbXtX1#Ni7Ld-z~ruG7=wW5G~cW%}GseluLgX&qDLiYQ<*9AA|1}^lf(x zKK%4j0gFcW&o?J27nKBJkFZ%ndz>jrW_XF5(gmTyfryBH%HBeZj)RZQnw2b)J!UzU z$42TR9^dS7;R#ii{QO1FnGYHPlZv^7|JDGZ zYH^-!LuBXaw;hhTCUR!VoBbTx)Sj4&S`rj<^#fPPn5&mTw2Zmh+hyW5Ey|EKs)*_)Q})Ox<;2+ z$^su`5FOGZZquUFqbDphBLF?Z?s|r+vm(`~pvx1bMuI1y)M$U0T0o8dtFvk}u-y;? z-pzY8-+^|tLz}2QLE7|YU79IvdIN*#kT!9f7Ns^lRY#kY1o)NeE?w3rr4p8?FSzUtA;9iU=6G?Us9q?u3E<(SgUr|5!E zJ?1Csf{+~hgBHiM7fpBVB}3pIq$swDWz>)$md)rAOR>yi5FIk6+$NVXT|8qHI);yY zfXnc83Bz}jE>D!<6FdoJ_@=|u0*3F8omHdmLn+Mc^ytxt(SmlEK59vj9(_=kT1t=p zl|i)Bqc#uraibQcBI#tFa3WjItx2-W{B=Rnc8~83Z7bxb%;{>$zq8>ZQOTS=98Y_& z`lcNHCcFs#N*9FkzJlZ$mPZ*cp$HlvR4x8Rw;?hH_)}+%SI;j0e$MBfH6-XU)9;+x%vL&1$w9@{e9V)tN)MYUwsEo#cV*2`XjPmGd*?Xv2^@oWN0 zcf=ixQV5|vmM+W`F|d}T!>gxDsbW?_Jd+`Yv1!3|uzP?N=j+O*E*_g^_f`t&O346u zm!UIYFL=dcDl=o|$Hm6m{xD&ipl!R2+ra*kL2UG$Ze~O!koF+Xg;qGFVS57539+2y zhN?q>f<;1tcxnSgQWJ!|B8O!nNfSe*QlcZGI&Ga~8ENnA)f#H;4q$>Ceu5^z?xT~q z8J~~ZH))c}Qq+EtE{GT6hl1x3k$F%U+E_Y=xjCL-@!gTpdI&RxX}A7_Kv!*5GPD9O1Js3YiI1??%eYGyF6uA%Rf{2{l{a9NsI#yoG@w~{WJwPk!9h5%VKB`M8 zMeM3Bh{%aOwy$JjO-al}0Jns{J~EoGj29Sl!iCvK`q%2xO_Bapx*#Ga{RkaJl`df0 zO*8Lvlb?u;@S}Vll^d^*>>t&onIijLx*#Ga`^FtdMVd#+e5^cIMjzE{ZhjmY2TqC` zvI?)ZXoWl?eu?Hrrxtvi+QUXTiUPK3L;jk=Korv-Z!!obn9KzuC zK$k=&1S3vn!9nYjfs1q*s8sI)T@aBIeRN_9c98dV5g8UwLg!hLk$o(lBE-C*i$v@r z{L^)*rU-vX7eq7RH5BF?;1-EEk-^shp=xo4ZttFIfsy3@*V)0C?j1*HG{LRHuRulG zk%*<1%sUoisdUP%x@=dHV+*>qI`ZuVMv{ZAv>J8cMlGIE7wcMxo92KE_-wmnUBCFUFs+T7j!{HPT+n_JIGYAD!<^}DDG8}k$He-9ylm{ z#D1kNr4+GWp$np!*cyEv)ol_!R|ABqg@}JNK&V=Xj(`RTRg0Q#{2@DU|J~WnTNmxa z=dl>~v`LhyAwhk&yLDwxiSM@=#BqYP2YZ(+Is3-?4fRddean|D$zEsOj~iwNK8PEY zE~M|qjarm_x2G(0rJwA((T0fruG?<~RXf&oTeZ18fv!*JUisv^mhfLtA8r&i2pRDX z>4H$!BO_8qhgAEw!1$qXBweG*!8EB z5EV)|74o^f3w5ciY{vPzAR=ef3HG(085w65)Yra7myU`R2X#S2&WgT+Mx_Fk@Qx8a zKQhX%h?gCNKAE4>rII4_5nT|G6S@oA4ti5bZ-|V@-Er)tG*8y(c3tWy0>4@pMC1e> z+BK7!He#4Fe#A6pJtqE>kx_aWV{O2iaIpGh`eVBEQY8PdE{GE*xpva@oGS{m$dF4>49bhO;Eh9Id-zzl+lir0?}GG7eq6YG?Er7?;%uE1B9xD=(%WsP_+^+r6j2}Sy#F}Cd$Fb>c&AxD> z{!e9JXtuXM`|?6T)pncR;e!4xc@`J*%V`%}V@RSViNmd6UW5e1wy79m+OgvTcDHdF%3!<3?8lk=F z9f(j<1B9wYTGxuo-oalw+dEh_fdvvNqd?ogr&GBY7Q3cACibOm5-)03P-o$0T_I3% z^kN3lsm=m7YEgC;_Ahv-_GoIRhD zBo;kv_;F-xI7P8RR)Vt0lr+Z7)p;g@{XmzR%3^$97ewR?Ij6ypa)tK(;Z2+{j$X~1 z6^A#HN*?y~UeKPX*k`isa}|3$RZ38m98Nh^@@Y>O>J>6*UaAWsa%P?9Fe@KRl`7^G zcHVM$^BB4byg!LEG5sg%PdPoQY;2*JE@+M9#3yl402@((nka zXHsUK790qZ=TkTj%l1UZvT=uHTrI@hT&;yL?MhvWE2iz#1<}kjjYwJr<06#P0HJDe zqpoe2!TA4lHW*(qAuWe@Sn4Hhk~V5hPze4)UDhk<`5Ok&sSunSwJ1aI%R_|V!hyKY z?UDNszg7@8iojb&-HxO17`zWhC4wUGmQi;DwJ&t|V0f|oS6vXwoJ2(Y)8L6f{Kl3g zjuUE-!@cbFzQ{NcBi92?H0t4aokl%;Y`I65rpj8}tqUS@wrmt^p;;`)<;b!v?FqMi z=Gi_;a)hc7%#25MDXEz8XI&7HGh@wFSQ!c>aaOs-cs;PkMx7ZMAJ)ccRVY-$!JZJ< zefn?)st~e=bDA!Q$XO5<`oJ{6q;450J0zKhAy-7kkjF^Hkacl%!>LOv_UzE5tVk-zJ!cYoW~#Z0i8LP06BR2WxkrQkO~Zz}eaYd-7<3jh$f*qu7nQXkPGOyOqc%Pb z%IeZrvB=N`(aa)^u7~Qqh$vVCgsR2!b*-`Ny*%34-b>#OnL_qh<+rp+#;7qtotHQ2 za$X6~>lnmwIxnpvZ|zyUy*rIO_NmHwsP@UIsD@pprzJk0?tLsg`96Gn@&zB%x{!r( zEE2A+9}e+aX{ccg*@xmoyH+*IX+d#PxbK_ld+m|N3r_i$`Rk31!bU8dbaqmsA1P=R zbH+%Pi>bW$;c(-JVvEh2>W1$yoK4mPAd>ZSy8MzZzoyG?=<-`!+^2-?UK;TcVQO2J z1s~$qXsMac7)Mah*p2|V7S)vn9ApqJEnu`Nyw^UtAz0qF@<1fCGv!k#Yb$D;vioLIM>9sT zlC5`6ZLCL0ZM$%g#O{qk?9bL^fD(JbfJG_x{a0Y)KkTrInF1b>e>z&-j=i}2B0mt% zDwIBtbx4=mO5C5uApV!c9Ug16A@5e9TFM)9?15A%wp+yd65(Ey-@$$jQwH|%#}*Ou z`;?d zB^4M_4hJ}mPBjw9(>#=S9t1kTrQW@ ziSuApu(w@%WJ1~~SGXs~CB7g?+p2e@yN%Wmk{UcAC=Ivc9Tod!RI-Ot-BNNckihD5 zI}e5z#h>bePzEF-l8;J~H*z)}Pd{=|L>g~n2UkILh1f^ zXtpob?NUE=o}B8I$mqXb?jT3=eKFsP@VCmNj_cA;nd0+wK}61mjbfyMRo_W+JE57| z_gx(sCr*;X4O|5$x9wEHrxOQsDXEyTPZvZpGc*Ds6;lcCtN}vR;@!Gdm1=>QYH5dK zs;gvh@0P2-ZIfJ4TY_S$m+CTJ$f&Ykx_os39eEJiPz^xeymF~ zWea|w3nFr|uaRUwPGr^pxb{T0KD%qLb%-AnSM{O_A;a4)T@aD8;3Ua{vVj4E67RrK zGSX(zY~I*E5g8*+b{HY*z}s%9I`}l=99>!}jd-jsh-P+ZgheW{5{Q=hV1a;dT zU?sRCZ^XnZHr0`jC1TTJ>^+9129?r0dpzGBm3Z3ciSE52r`oFSeL~hL;jWX<7QQ;X zEdRYO2xWx?!!!(;vV}sUG(f0YJX^OR(iSf7tS#)>Pp6W3&EPlNBxlr=AT#(iU2-Wi z_+wJb_OS_4G@&V^C-`GKMt|#32PNT3lHPd8U_eREslj4o}XwJ!=@ZNGi|=Yk~~hD+H#p*k8MR4u-xtH3g-=;^HO>pz4g6S0H5WWpU(>}iv9QFDT9-j%w% zS2k}agXoma<3=q?o2MUDsHHQ0W0w}xZMU&I_32qdY-=@zRV&E>x4Gl9cfkHC(_vY6vjJ})+7=Bu!3=doEU z8|gy6$=Ph!+Mdwb7yQ_9oWU(BliuKD?pK)7m6m)RLgkdao|qpV~O@V>g31jyr7Yc^}-UMHyP_ zFUjV`=l-aAS`fC~u5GO+g+RDtm6G9|*?3D-B51Gk<_-vbg3 zTn<)&kIWDS$J1t}kWQvcGrS0VohU36jeM$-OO=ypT*`3nv6Auyqo{JUXlfkCSkT1u|lsTt&DagNZq6Ec@VEZQ+zMePYv^^1WkWXI$}T@cDV zpRWr-n&*Bk&S@vuR_%iYnIH>-BiJ1y;pSkbO&p|l1#vK?OFLz(uVWA`jdh#H8@W*~ zYrS}u@$Xsacw*IygB?;iiHn$2ta`FC5*{i}!>MM0YC|eT|BjWoewt^9(s`Hz z13o`*eh?XNP6ux;_3?%((wa5j*QKjs&G&RcoG@#&ooV-W8ldv1M%Uxp69D<#r`;15 zBQ!qoUka2VMTk{{7g^3YiIvvBh>(j2RCl9}^iRSI3P@E=d#{ zxDz-|XvS|=P7hDlQ*}Wo**%FtwA{l3LKXwgshkrXGqxwMH*m40=9VmT5 zyj_=4%1}(`f{2{hD|c*(9WrK$1#Ima+mWxBl{pX5t;mSJ3Pevpx*2r>dPb;y#Glrs zoFaZk7ewU5Uw0stF|p@#X|j-~L2f4v>fylOM#h2l@sh$%!`;BosZT!}UaCt&#fF=8 zK{T^LBb%WTBEp?$fKas%p{@o9Rg3G`scC>vwfHOD*h6;i2Rhri??2$IOYsIJUu%^ieCP>@vaITf$^*y0I(XdbO z>=rXxx`8lcEWAt?gfbfuQF*MP-t(>$I5#q4uk^1q^LwvNx^z>Df2J;o$VtDtL3%MC z@p7EPNq@y^wU= z&+qJU87sE!+P-gFY}-+gru$ZQ^z(-|RkRvvjMVNarb_6?$VM$9zx@Ew zVHvi6w->xJU-<3DfUn;5|!v-M_q1c!oe!VNJ-*{!b{@6 z>4NxpLzp8X`KTZ{R?{N?R56>J$o-K~eN0jv>o*<5KEmItOEqNzzN-tOnefW`2ipYM zkh>bZ6NX3wgsR02x(%UPU_kzGXC26x8rF66%B{`opXiOlgK0XyBcWCWIg&NN+^J5W_^KfORX=8 z+n2=c%i{JGar>&ceT{C*t*_Iq%ld|R`lh&jOB8-v+`dD%rPhDaZHaX^-FmI>ig(|m z+Y0L*x-GZvrCYc4eYy=;_lbA+(`~8s19AJIc=sdm^kZ@R3Eh@iKNYv1iNXiy)@wZ| zZa)`=zo1*U^-J;eD{=d^D13-+UDj_z;lrZvx8ms$ar-ZE`<=M`Uflj5ZhxfPGV4!t z8@2u)-TJKmrdz-DXS(%Tf1z8CMF*PVi4JuEJ~|EoRif=Naigu~0EM>i!8_VD0d1$H z-6*704EQ>%7|j0}XN6+SY7diaU{M3aW0KBHxuGtK zrp#$q(I~#68Nx|3pUzb?E)hbUO(KLFi4bliLb#C#;YK2a8;KBZBtp262we*ie8mVt z!8%?3o-VJV%WLRzJ6&E+mp9Vo&2)JyUEW5QJL&RHy1bh%|A>oWkvsx4$s=wgkGPRM z;zsg_8_6SXB#*d}JmN<3h#ScxZX}OXv!!bQcsX6V>C#J=6?7S(%Me{g=rTr^RdiWH zmvy)pEXIIEVvHM!F>WNrxRDs+Mq-Q`$uFVXateNY5nV2(%T~HPo-WtWG88|iW~E`~)4gl|ZJa3cl6jT8tsQXt$&fp8-Q!i^LNH&P%1dfap4 z_!KOw>DV7uIzS+$!;O>Na=7RrNfPs4mVOd+(_xT?MQ~tI}MZ-5g(Ew;zo*y z8!6(o^{PF}>562fkSrOKRWp}iD@`hLE80OSbBuLGJ(1F=C(<7EL~5j-NT1XbDVBO7 z4O35~YU+t}PCb$GsVCAx^+f8Zo=7j%6Dg>ABGsZNQnh2OW9o^NO+As;sV7oD^+bB8 zo=73p6KSS;A{A9nq^s(QlvX{F_Nph+NqQn3J;utZo=8j86RE3uBE3~lq`>NlG+8~7 zN~WNgF zo=DY?v5u=JQg-!33QbR>;Kx|A)f1_>dLms{Po%T-L^^zo4}DZmbo!%uqGKS{6P*XC zp6Fmm^+f00sV7o-^+ZR0sV6%7OFhw?Zh9i+Mr%D!G|OAPqv_u2iROJbo~riHbgnQ7 z-DW3RuHRa>$Aot^GM>`@OkpO48Q7^xiqzj;n&#U;sZgk3pOcx%LauJT26VA|4vMGS z>Sy1`mf``_aIZaBHYYJveR^UNoB3kOyYu{1BUhNkbGMnHtk7P2AY&lxE%9_hJoaJ| zJ?)8B-^)kyVRpS)K47@Nso5(q{~dM-X{GwLb$ck8$`|t6R7rKx?k!AOMjF%UZ>U?Z zLM?YMsoE>j*;IboC>s@SO0Rr$f6|vWE21K3v-}}`Ckr_y8FHRr9jB{*A^>z=;a+Pg{;yffaE0OS;u~7sEjE*LwYi%o(R1Yl8SF;Ki7HH?HvnkHO>GTz zIP^wcDD=kd1Y#Bnz44_8T^1aCG=&rtdIQ)AM;0d#NLUnl17^6$A!HQ5p*Jc)p*L>x zdi<)r%pytNWc5Ij5O?>k zlS@q+ITjPUZ`#NUyJWo>(6iUsL*-)D%pcuMr-$VX_@v~a5{_jSbG(syJvvvv4dVF{ zd~J^;bE)UfB`fj+18?je@q0)vK=XOrcK0qi+PGe+-&nV5_?`7qy1a}oHZC_~>D1)S zb)4c?z!`P)C2Bs0gR|sQ_B!ike733SxAx#3R*hI|=yezLo-!tAr?c>sC~O6C;2?h# z+n<^?=B@8*T@XE$Y_77sYX4j%i&;~iN}`pki&Z#dbg#3i5_~c!2xf@RpYtvu-zCI5 z`y9Ek%S`Gp%`AsCh^3CCOuWtESO{%1geSq8|rKEKsuZ#v;3TZBGs#~vs zN?5nCQsIfTOR5;2-b7DtcHZ4VPn6}b-iH71`W;k2e%^YgD0mMQkStpNC<^|$QSd%d z@cu@@zlwqnHVQr@3O>>(_^2rOM5Ex7qToLo1)mlLpKBC+UKD((QSfCha7?n@4Voh^ zM5tM{d(0V_i88E}G?~?knXB8QG{1qOzpL}+_1n#K1y&K^_$Hio&r?Xp%hkzbHE&in zTg7Qa{hQc}vTJ1j!p`#;f^_$1Al4dq7y6na#AEixi38iN*pU>{kZg=#Fid=Wmi(9k zvt#^(!n0)|WrdE}BdMa9teQ!yT*x~=+vNFTSbkB;OgSH%D?gwl&@sEu$eIgGCJ;YIR8$~_&kSCB=!z-RT42D zwWaKQ^9s*5tN5E)qg*Lw$<#Yv-RAjfl)u6vf@0Qakgx9fWLO}h4R{X#Pch zMp;O}QRCh6gDTmdCqEhHd4ev>=yD!i{zUdNPXGO${_Cdy#^~~EdK{+z&Zf(s>G2f$ z?-BZMKmB(WUDnZMfG&IJvYjrEqf3k~tLgF!`o%%|kBpnOlm5GsE|1cSjr8AEx@@7# z6X-Hdmp)vMAq$boiK$=KPw=@tw7oE!&lOS`GS+2jp{*Co_LB!XW}lbd^0+ON#`)(P z7vYlHn%O!vXx_pEz;7dF|f8yl%k2`XNCg7hjm(a^cpCrnWrp;!BOkO`Y%jJjt%wWm^Qes=ZP~D5)IGJUmU3<|Cm?xPnp= ZWXUKUWDkIuN$iAGF^*DipgOtv{|Dfo`_2FW diff --git a/openatlas/static/manual/.doctrees/technical/api.doctree b/openatlas/static/manual/.doctrees/technical/api.doctree index de5a8f75daeba1a038eaeead549bac8781afe8cd..1db94c4b2dd7ee1ebc4dfe5a989943ccbab48d34 100644 GIT binary patch delta 5997 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 delta 5586 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 diff --git a/openatlas/static/manual/.doctrees/technical/application_structure.doctree b/openatlas/static/manual/.doctrees/technical/application_structure.doctree index 0915510b856a25f2baa2a7cf9382cc0463ef24c5..5fc508afef8c2e32c05606afd057f68a71ca6b7d 100644 GIT binary patch delta 560 zcmbtQJxc>Y6l8P6#1j-jLSi&-1kt-B1{FWS1RJrlP)m#T^3FTl+{N2HqKKe{U|}J? zSXuZB1Z4|tZEWpDh>btN-l$mEDR%SbF~iIposySR5@HGq{}=>NTBUOAGc#d)*0O!h{krRIQX!!x zXx-(UZa_-{R@jeI=-pw1N@`K5j-r5KB N?|;6ORORwR{2fZVzmfm| delta 497 zcmaDbfw6T0BWnZe)L-r!SrwTX4^38Qo;~?5o5tpM%wL$qY!%Xq5_40_^NX_exSUdR z^2-$}^Gi4XVQUj)d^ovT!ic#fBXx4VwCLoM63L9kn{^~rnUwZ2GB9WOKxruqDi8(qTPKrW#W=RIuQ>ZeDh5E;~W4;JgFW4 diff --git a/openatlas/static/manual/.doctrees/technical/database_structure.doctree b/openatlas/static/manual/.doctrees/technical/database_structure.doctree index 6e861dc39fb6b9b354f1fc8cd3ff68c29ac8a4d5..267d4389e47e31ce51db3139a9825afa734749fd 100644 GIT binary patch delta 220 zcmexj{ll82fpzNJjV#Z37~Lno;nC$#C@xLTP)IDEEYCZQ(RT7T9%Y2kecok^x|1jJ zD{{hASxsKY7s8>VP+FW?q+UFkhrg8HLQAVWHAzcLL02I!KM!5`4*qNoL+nz)0%451 zCU4|(ocvmVAK6Tm%^HGbjA9n)Mfs%##SqJ&6xdGX$v1^Gxgg??8fF%6<`I6u1pua+ BNWB06 delta 243 zcmexi{l%K4fpzN3jV#Z37+oj7;n8K&QApKG*PE=!JB`tL@(x~Qgn;nmZ@iP4QWYi} z3Mg_zlyPw>XemtY6SSNBollTUAu%sSp(G9och=#q6Na3_dv{);?hz`FUl`1DArLZElw>eMloMyvz}lXql6W170Q$E3TYxa KYO{dw3oZb*O-b(n diff --git a/openatlas/static/manual/searchindex.js b/openatlas/static/manual/searchindex.js index 69528e7f1..a992f994f 100644 --- a/openatlas/static/manual/searchindex.js +++ b/openatlas/static/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["admin/api", "admin/arche", "admin/content", "admin/data_integrity_checks", "admin/execute_sql", "admin/export", "admin/general", "admin/iiif", "admin/import", "admin/index", "admin/mail", "admin/map", "admin/modules", "admin/presentation_site", "admin/user", "admin/vocabs", "entity/actor", "entity/artifact", "entity/event", "entity/feature", "entity/file", "entity/human_remains", "entity/index", "entity/navigation", "entity/place", "entity/reference", "entity/reference_system", "entity/source", "entity/stratigraphic_unit", "entity/type", "examples/archaeological_data", "examples/artifacts", "examples/index", "examples/journey", "examples/letters", "examples/move_event", "examples/places", "examples/profession", "examples/reference_systems", "examples/time_spans", "examples/types", "faq", "features", "index", "model/cidoc_crm", "model/index", "model/link_checker", "model/openatlas_classes", "model/openatlas_shortcuts", "model/references", "overview", "technical/api", "technical/application_structure", "technical/database_structure", "tools/anthropological_analyses", "tools/image_annotation", "tools/index", "tools/map", "tools/network", "tools/notes", "tools/profile", "tools/radiocarbon_dating", "tools/search", "troubleshooting/display", "troubleshooting/error_codes", "troubleshooting/index", "troubleshooting/login", "ui/alias", "ui/date", "ui/description", "ui/form", "ui/menu", "ui/name", "ui/table"], "filenames": ["admin/api.rst", "admin/arche.rst", "admin/content.rst", "admin/data_integrity_checks.rst", "admin/execute_sql.rst", "admin/export.rst", "admin/general.rst", "admin/iiif.rst", "admin/import.rst", "admin/index.rst", "admin/mail.rst", "admin/map.rst", "admin/modules.rst", "admin/presentation_site.rst", "admin/user.rst", "admin/vocabs.rst", "entity/actor.rst", "entity/artifact.rst", "entity/event.rst", "entity/feature.rst", "entity/file.rst", "entity/human_remains.rst", "entity/index.rst", "entity/navigation.rst", "entity/place.rst", "entity/reference.rst", "entity/reference_system.rst", "entity/source.rst", "entity/stratigraphic_unit.rst", "entity/type.rst", "examples/archaeological_data.rst", "examples/artifacts.rst", "examples/index.rst", "examples/journey.rst", "examples/letters.rst", "examples/move_event.rst", "examples/places.rst", "examples/profession.rst", "examples/reference_systems.rst", "examples/time_spans.rst", "examples/types.rst", "faq.rst", "features.rst", "index.rst", "model/cidoc_crm.rst", "model/index.rst", "model/link_checker.rst", "model/openatlas_classes.rst", "model/openatlas_shortcuts.rst", "model/references.rst", "overview.rst", "technical/api.rst", "technical/application_structure.rst", "technical/database_structure.rst", "tools/anthropological_analyses.rst", "tools/image_annotation.rst", "tools/index.rst", "tools/map.rst", "tools/network.rst", "tools/notes.rst", "tools/profile.rst", "tools/radiocarbon_dating.rst", "tools/search.rst", "troubleshooting/display.rst", "troubleshooting/error_codes.rst", "troubleshooting/index.rst", "troubleshooting/login.rst", "ui/alias.rst", "ui/date.rst", "ui/description.rst", "ui/form.rst", "ui/menu.rst", "ui/name.rst", "ui/table.rst"], "titles": ["API", "ARCHE", "Content", "Data integrity checks", "Execute SQL", "Export", "General", "IIIF", "Import", "Admin", "Mail", "Map", "Modules", "Presentation site", "User", "Vocabs", "Actor", "Artifact", "Event", "Feature", "File", "Human remains", "Entity", "<no title>", "Place", "Reference", "Reference System", "Source", "Stratigraphic unit", "Type", "Archaeological data", "Artifacts", "Examples", "Journey", "Letters", "Move events", "Places", "Profession", "References Systems", "Time Spans", "Types", "FAQ", "Features", "OpenAtlas manual", "CIDOC CRM", "Model", "Link checker", "OpenAtlas classes", "OpenAtlas shortcuts", "References", "Overview", "API", "Application Structure", "Database Structure", "Anthropological Analyses", "Image annotation", "Tools", "Map", "Network visualization", "Notes", "Profile", "Radiocarbon Dating", "Search", "Display Errors", "Error Codes", "Troubleshooting", "Login", "Alias", "Date", "Description", "Form", "Menu", "Name", "Table"], "terms": {"descript": [0, 1, 8, 12, 16, 17, 18, 19, 20, 21, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 41, 44, 48, 49, 51, 55, 57, 62, 70, 73], "public": [0, 7, 26, 43, 49, 51, 53, 59], "default": [0, 3, 6, 7, 8, 11, 12, 14, 15, 20, 29, 38, 39, 52, 57, 58, 59, 60], "off": [0, 73], "If": [0, 1, 3, 4, 8, 13, 15, 17, 20, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 49, 51, 57, 58, 62, 66, 68], "turn": [0, 39, 66, 68], "file": [0, 1, 5, 7, 8, 9, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 35, 42, 43, 47, 52, 55, 57, 60], "licens": [0, 1, 20, 26, 41], "can": [0, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 22, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 54, 55, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 71, 73], "still": [0, 18, 41, 51, 60], "access": [0, 4, 7, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 40, 42, 43, 46, 54, 60, 61, 64], "A": [0, 1, 3, 4, 5, 13, 15, 16, 17, 19, 20, 21, 24, 26, 28, 29, 30, 31, 35, 36, 40, 41, 44, 49, 50, 51, 52, 63, 69], "browser": [0, 6, 20, 51, 52, 58], "us": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 62, 63, 64, 67, 68, 69, 70, 72, 73], "b": 0, "log": [0, 2, 6, 14, 50, 60, 63], "user": [0, 1, 3, 5, 6, 8, 9, 10, 12, 15, 26, 29, 30, 33, 34, 35, 36, 38, 40, 44, 45, 47, 49, 51, 52, 53, 59, 60, 64, 71], "ip": 0, "request": [0, 6, 51, 64, 66], "comput": [0, 20], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 68, 72], "whitelist": 0, "link": [0, 1, 2, 5, 8, 9, 13, 15, 22, 26, 30, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 48, 49, 50, 51, 53, 55, 57, 58, 60, 63, 64, 66, 71], "without": [0, 7, 8, 9, 10, 18, 36, 41, 44, 45, 51, 58, 62], "being": [0, 26, 41], "thi": [0, 3, 4, 5, 7, 8, 13, 14, 16, 17, 18, 20, 22, 24, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51, 52, 54, 55, 57, 58, 61, 62, 63, 64, 65, 68], "might": [0, 3, 4, 16, 29, 35, 39, 41], "you": [0, 3, 4, 7, 8, 11, 12, 14, 15, 20, 22, 24, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 51, 52, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 71, 73], "want": [0, 3, 8, 29, 30, 31, 39, 40, 41, 58], "allow": [0, 3, 6, 15, 18, 20, 39, 41, 42, 51, 55, 62, 72], "other": [0, 3, 8, 14, 16, 18, 20, 24, 26, 30, 31, 33, 35, 36, 38, 41, 42, 51, 52, 58, 59, 60], "system": [0, 5, 9, 14, 16, 17, 18, 21, 22, 24, 29, 32, 41, 42, 43, 44, 45, 53, 68, 69], "your": [0, 1, 3, 4, 8, 20, 32, 35, 36, 38, 39, 41, 44, 50, 51, 57, 58, 59, 60, 64, 66, 73], "data": [0, 4, 5, 8, 9, 14, 19, 21, 22, 24, 26, 28, 29, 32, 33, 34, 35, 36, 38, 39, 40, 43, 44, 45, 51, 53, 57, 58, 59, 61, 62, 69, 70], "restrict": [0, 39, 41, 64], "resourc": [1, 38, 49], "centr": 1, "human": [1, 8, 16, 17, 18, 22, 24, 28, 31, 42, 43, 44, 47, 51, 54], "servic": [1, 15, 26, 42], "aim": 1, "offer": [1, 8, 42, 55], "stabl": [1, 47, 51], "persist": [1, 47], "host": [1, 10, 26], "well": [1, 21, 24, 30, 36, 39, 40, 41, 42, 44, 45, 47, 48, 71], "dissemin": 1, "digit": [1, 7, 22, 39, 42, 44, 49], "research": [1, 29, 42, 61], "In": [1, 3, 5, 7, 14, 19, 20, 21, 24, 25, 28, 30, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 49, 51, 54, 55, 56, 61, 63, 65], "order": [1, 15, 30, 33, 35, 42, 48, 49], "import": [1, 3, 9, 14, 34, 36, 41, 42, 43, 44, 45, 52, 53, 56, 60, 72], "openatla": [1, 3, 5, 7, 8, 13, 15, 18, 19, 20, 21, 24, 26, 28, 29, 30, 35, 37, 38, 41, 42, 44, 45, 46, 49, 51, 52, 53, 63, 68], "chang": [1, 6, 10, 18, 20, 26, 29, 30, 31, 33, 36, 40, 41, 51, 56, 57, 58], "instanc": [1, 7, 8, 10, 15, 20, 29, 38, 42, 44, 46, 48, 51, 52, 53], "product": [1, 10, 15, 17, 20, 21, 31, 51, 54], "py": [1, 10, 15, 20, 51, 52], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, 64, 66, 68, 69, 70, 72, 73], "need": [1, 15, 29, 31, 41, 45, 47, 49, 51, 52, 57], "ask": [1, 22, 41], "administr": [1, 8, 36], "further": [1, 8, 30, 31, 34, 36, 38, 40, 47, 51, 57], "detail": [1, 3, 6, 8, 13, 14, 16, 17, 18, 20, 22, 23, 24, 25, 26, 27, 29, 40, 41, 42, 44, 45, 51, 55, 58, 68], "id": [1, 8, 13, 36, 38, 49, 51, 57, 61, 64], "0": [1, 39, 41, 51, 54, 68], "top": [1, 2, 15, 41, 44, 49, 57, 58, 60, 63, 71, 73], "collect": [1, 15, 39], "project": [1, 3, 9, 13, 20, 26, 32, 39, 40, 42, 43, 53, 60, 66], "acdh": [1, 15], "topcollect": 1, "url": [1, 7, 11, 13, 15, 20, 25, 26, 38, 41, 44, 49, 52], "http": [1, 7, 13, 15, 26, 38, 51], "curat": 1, "dev": 1, "oeaw": 1, "ac": 1, "base": [1, 15, 21, 26, 36, 38, 42, 45, 48, 51, 53, 57, 68], "get": [1, 7, 8, 33, 36, 37, 38, 59, 66], "The": [1, 3, 5, 7, 8, 10, 16, 18, 20, 22, 24, 26, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 64, 71, 72], "button": [1, 3, 5, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 51, 54, 55, 57, 58, 60, 61, 66, 71, 73], "displai": [1, 2, 3, 4, 6, 8, 10, 13, 14, 15, 20, 25, 26, 29, 36, 38, 40, 43, 44, 45, 47, 50, 51, 52, 56, 59, 61, 65, 73], "admin": [1, 4, 5, 8, 13, 14, 15, 20, 26, 38, 43, 51, 57, 59, 60], "menu": [1, 7, 20, 22, 27, 29, 30, 31, 33, 34, 35, 36, 40], "onli": [1, 3, 4, 6, 7, 8, 14, 15, 16, 19, 20, 26, 29, 38, 39, 40, 41, 45, 48, 51, 55, 57, 58, 59, 61, 62, 64, 68], "mention": [1, 16, 17, 20, 21, 30], "abov": [1, 3, 31, 35, 42, 60, 63], "made": [1, 10, 17, 31, 33, 36, 40, 41, 47, 52], "click": [1, 3, 4, 5, 14, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 46, 50, 54, 55, 57, 60, 66, 68, 73], "section": [1, 39, 51], "provid": [1, 7, 8, 15, 20, 25, 26, 39, 41, 45, 51, 54, 60, 61, 62, 63, 64], "part": [1, 3, 17, 18, 19, 21, 27, 28, 33, 39, 41, 49, 55, 59], "manag": [1, 5, 8, 14, 15, 26, 29, 38, 43, 52, 59, 60, 66, 68], "group": [1, 8, 9, 15, 16, 17, 18, 21, 26, 29, 31, 33, 35, 36, 37, 38, 40, 41, 42, 53, 55, 64], "list": [1, 3, 5, 8, 16, 17, 18, 20, 23, 24, 25, 26, 27, 30, 31, 33, 34, 35, 36, 38, 41, 42, 49, 50, 51, 55], "tabl": [1, 6, 8, 14, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 42, 48, 49, 50, 60, 72], "artifact": [1, 3, 8, 15, 16, 18, 21, 22, 24, 27, 28, 29, 32, 33, 35, 39, 40, 43, 55, 71], "wa": [1, 8, 16, 17, 18, 22, 29, 31, 35, 36, 39, 48, 51, 52, 55, 60, 66, 68], "shown": [1, 3, 4, 5, 8, 13, 20, 25, 26, 29, 36, 38, 41, 58, 60, 68], "all": [1, 5, 8, 10, 11, 14, 15, 20, 29, 30, 31, 33, 34, 36, 38, 39, 40, 41, 44, 45, 47, 48, 49, 51, 52, 60, 63, 69], "metadata": 1, "gather": 1, "exif": 1, "endpoint": [1, 15, 43], "first": [1, 3, 4, 8, 10, 20, 21, 22, 30, 31, 36, 39, 42, 51, 68], "imag": [1, 6, 7, 18, 30, 31, 41, 43, 49, 52, 53, 56, 57, 58, 60], "2_jpg": 1, "addition": [1, 35, 62], "correspond": [1, 3, 7, 8, 26, 29, 36, 38, 39, 47, 60], "png": [1, 7, 20, 58], "4_orthophoto": 1, "taken": [1, 48], "necessari": [1, 20, 29, 30, 38, 40, 41, 49, 61], "new": [1, 8, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 29, 33, 34, 37, 41, 55, 56, 60, 66], "person": [1, 3, 4, 8, 16, 17, 18, 21, 22, 26, 31, 33, 34, 35, 37, 41, 42, 49, 55, 59, 60, 62], "etc": [1, 3, 6, 19, 21, 24, 28, 30, 37, 49, 51, 52, 71], "ad": [1, 14, 15, 18, 21, 26, 29, 31, 35, 38, 39, 40, 43, 51, 55, 56, 59, 61, 62], "dure": [1, 3, 18, 25, 31, 45], "process": [1, 5, 6, 8, 20, 41, 52], "custom": [1, 5, 8, 14, 15, 20, 30, 40, 43], "hierarchi": [1, 5, 9, 15, 18, 24], "relev": [1, 30], "actor": [1, 17, 18, 20, 21, 22, 24, 25, 27, 29, 31, 34, 35, 37, 39, 43, 44, 48, 60, 67, 68], "e21": [1, 16, 49], "involv": [1, 9, 18, 30, 31, 33, 34], "e65": [1, 18], "creation": [1, 6, 30, 34, 38, 40], "p": [1, 44], "cidoc_ent": 1, "e12": [1, 18, 48], "event": [1, 3, 16, 17, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 32, 39, 43, 48], "addit": [1, 14, 30, 33, 36, 38, 39, 41, 42, 45, 51, 54, 59, 68, 69], "copyright": [1, 49], "name": [1, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 44, 47, 48, 49, 60, 62, 70, 73], "e22": [1, 17, 48], "object": [1, 7, 17, 21, 27, 31, 34, 36, 42, 45, 47, 49, 57], "graffito": 1, "iptc": 1, "objectnam": 1, "xmp": 1, "p67": [1, 49], "e32": [1, 26, 49], "e53": [1, 24, 48], "place": [1, 3, 9, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31, 32, 33, 34, 35, 39, 40, 41, 42, 43, 44, 47, 48, 49, 51, 57, 60, 62, 63, 67, 71], "locat": [1, 16, 18, 19, 24, 34, 35, 36, 42, 44, 51, 52, 57, 66], "p53": 1, "gpslatitud": 1, "gpslongitud": 1, "date": [1, 5, 9, 14, 16, 17, 18, 19, 21, 24, 28, 29, 30, 31, 33, 34, 35, 36, 37, 40, 43, 56, 60, 62, 63, 70], "created": 1, "p11": [1, 44, 48], "p108": 1, "p14": 1, "p92": [1, 48], "e31": [1, 20, 25, 47, 49], "document": [1, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33, 47, 48, 49, 51, 67, 69], "p2": [1, 44, 48], "artist": 1, "cutomis": 2, "text": [2, 5, 8, 14, 25, 27, 29, 31, 33, 34, 35, 36, 38, 39, 40, 43, 55, 57, 62, 68], "avail": [2, 4, 5, 7, 8, 12, 15, 16, 26, 30, 34, 35, 36, 37, 38, 40, 42, 43, 44, 45, 47, 49, 51, 57, 58, 62, 73], "languag": [2, 6, 15, 36, 60, 71], "intro": 2, "start": [2, 3, 5, 8, 18, 26, 33, 34, 35, 36, 38, 39, 43, 45, 63, 71], "page": [2, 4, 8, 12, 13, 16, 17, 18, 20, 23, 24, 25, 26, 27, 31, 35, 38, 39, 40, 45, 46, 49, 50, 51, 54, 58, 60, 63, 64, 71, 73], "befor": [2, 3, 8, 29, 30, 34, 39, 51, 58, 68], "contact": [2, 10, 66], "site": [2, 6, 9, 19, 20, 31, 41, 43, 51, 55, 59, 60, 63, 64], "e": [2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 49, 51, 52, 53, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "g": [2, 3, 4, 5, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 51, 52, 53, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "inform": [2, 3, 6, 8, 14, 17, 18, 20, 21, 22, 24, 26, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 54, 57, 60, 61, 68, 69], "websit": [2, 13, 25, 26, 38, 43, 52, 53], "maintain": [2, 42, 45], "legal": 2, "notic": [2, 6, 45, 51], "about": [2, 4, 8, 14, 26, 35, 36, 41, 43, 68], "institut": [2, 16, 37], "citat": [2, 16, 17, 18, 19, 30], "exampl": [2, 3, 5, 8, 10, 13, 16, 18, 21, 22, 24, 26, 27, 28, 29, 31, 34, 35, 36, 38, 39, 42, 43, 47, 48, 49, 51, 52, 57, 68], "underneath": 2, "form": [2, 9, 10, 26, 33, 35, 36, 37, 38, 39, 40, 41, 45, 47, 51, 52, 55, 60, 61, 68], "field": [2, 9, 26, 31, 36, 37, 38, 40, 42, 43, 48, 55, 57, 60, 61, 68, 70, 71, 72, 73], "an": [2, 3, 4, 5, 6, 7, 8, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 35, 36, 37, 38, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 55, 57, 58, 59, 60, 61, 64, 68, 70, 72], "insert": [2, 4, 14, 25, 30, 31, 33, 34, 35, 36, 38, 40, 57, 60], "updat": [2, 3, 4, 8, 14, 25, 26, 29, 57, 60], "edit": [2, 9, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 36, 37, 38, 39, 40, 42, 45, 47, 55, 60, 61, 62, 64], "bibliographi": [2, 25, 31, 47, 49], "entri": [2, 3, 8, 14, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 50, 58, 60, 70, 72, 73], "cogwheel": 2, "icon": [2, 20, 26, 29, 57, 60], "right": [2, 8, 29, 49, 51, 57, 58, 60, 71, 72, 73], "corner": [2, 57, 71], "thei": [2, 3, 8, 18, 20, 21, 26, 28, 29, 33, 34, 40, 41, 44, 47, 49, 51, 54, 57, 59, 62, 63, 72], "contain": [2, 5, 8, 26, 28, 49, 52, 62, 71, 73], "put": [3, 33, 38, 39, 41, 45], "great": 3, "emphasi": [3, 42, 45], "qualiti": [3, 7, 29, 42], "even": [3, 8, 60, 62], "respons": [3, 20, 41, 51], "enter": [3, 6, 8, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 42, 43, 50, 51, 55, 57, 60, 66, 68], "ultim": 3, "li": [3, 39], "individu": [3, 21, 30, 54], "avoid": [3, 41, 47], "inconsist": 3, "technic": [3, 41, 44], "level": [3, 6, 11, 14, 30, 42, 49, 58, 60, 61], "develop": [3, 20, 41, 42, 43, 44, 45, 51], "applic": [3, 4, 26, 31, 38, 40, 42, 43, 45, 47, 51, 57], "It": [3, 8, 18, 20, 24, 26, 28, 29, 31, 33, 34, 35, 39, 41, 44, 45, 51, 62, 63, 71, 72], "therefor": [3, 18, 20, 26, 29, 31, 41, 45, 47, 54], "possibl": [3, 9, 18, 20, 24, 28, 29, 31, 33, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 49, 51, 54, 57, 61, 71], "after": [3, 4, 6, 9, 10, 20, 31, 34, 35, 36, 40, 51, 57, 61, 63, 66], "end": [3, 8, 13, 16, 33, 34, 35, 36, 39, 44, 48, 51, 62, 68], "same": [3, 8, 19, 21, 28, 32, 33, 34, 37, 41, 47, 48], "nevertheless": [3, 44], "mistak": [3, 66], "happen": [3, 18, 33, 45, 68], "also": [3, 8, 10, 20, 26, 30, 31, 33, 36, 38, 39, 40, 41, 42, 44, 46, 48, 55, 58, 62, 66, 71], "when": [3, 5, 8, 14, 20, 26, 29, 31, 34, 36, 38, 40, 41, 50, 51, 57, 58, 59, 60, 62, 66, 68], "from": [3, 8, 9, 10, 15, 18, 20, 22, 26, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 49, 51, 52, 54, 57, 60, 62, 68], "delet": [3, 4, 5, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 36, 55, 59], "outsid": 3, "function": [3, 4, 8, 10, 11, 26, 36, 37, 42, 49, 52, 53], "were": [3, 6, 18, 20, 29, 33, 47, 54, 60], "implement": [3, 41, 42, 49], "describ": [3, 30, 31, 33, 34, 36, 37, 51], "below": [3, 4, 14, 24, 30, 31, 37, 42, 52, 55, 66, 73], "here": [3, 8, 12, 18, 26, 29, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 52, 55, 60, 63, 64, 65, 68], "unlink": 3, "These": [3, 7, 29, 33, 42, 44, 47, 48, 54], "so": [3, 4, 8, 20, 22, 30, 31, 36, 39, 41, 44, 47, 51, 52, 58, 68], "call": [3, 19, 41, 47, 51, 52, 54], "could": [3, 38, 41, 68, 72], "result": [3, 5, 9, 13, 37, 41, 42, 51, 54, 57, 58, 61, 62, 68], "bug": [3, 63, 64], "seem": 3, "appear": [3, 5, 29, 38, 54], "regularli": 3, "known": [3, 8, 31, 36, 39, 42, 57], "pleas": [3, 8, 15, 18, 20, 21, 24, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 51, 57, 63, 64, 65, 66], "report": [3, 63, 65], "issu": [3, 51, 56, 65], "team": [3, 20, 32, 41, 44], "via": [3, 8, 12, 30, 33, 35, 36, 37, 39, 42, 43, 45, 48, 49, 51, 53, 54, 55], "redmin": [3, 43], "have": [3, 6, 7, 8, 13, 18, 20, 24, 26, 29, 30, 31, 33, 34, 38, 39, 40, 41, 44, 49, 51, 57, 60, 62, 63, 64], "relat": [3, 16, 18, 20, 33, 36, 42, 44, 52, 53, 66], "Of": [3, 41], "cours": [3, 22, 41, 57], "normal": [3, 44], "set": [3, 6, 7, 8, 10, 12, 14, 26, 29, 32, 36, 38, 41, 42, 51, 53, 57, 58, 59, 62, 66, 71], "should": [3, 7, 8, 20, 29, 34, 38, 39, 51, 58, 63], "correct": [3, 8, 20, 36, 41], "accid": 3, "creat": [3, 4, 5, 7, 8, 9, 13, 14, 17, 18, 22, 24, 26, 28, 29, 30, 31, 34, 37, 41, 47, 49, 51, 57, 60, 62, 68], "associ": [3, 8, 14, 24], "been": [3, 7, 36, 44], "pre": [3, 26, 29], "instal": [3, 7, 26, 29, 41, 51, 52], "never": 3, "most": [3, 18, 22, 41, 49, 51, 52, 66, 68], "like": [3, 8, 13, 22, 24, 29, 40, 41, 49, 52, 54, 63, 69], "caus": [3, 8], "dataset": [3, 26, 49], "themselv": [3, 19, 28, 44], "There": [3, 8, 40, 41, 44, 60, 63, 69], "three": 3, "option": [3, 7, 9, 14, 20, 26, 29, 31, 36, 41, 56, 57, 60, 62, 69], "proce": [3, 8, 66], "relink": 3, "add": [3, 7, 8, 14, 16, 17, 18, 19, 25, 26, 27, 29, 30, 33, 34, 35, 36, 37, 38, 39, 41, 51, 59, 60, 61, 69], "between": [3, 18, 31, 33, 39, 40, 45, 47, 48, 49, 54, 58], "remov": [3, 26], "whole": [3, 8, 27, 49], "featur": [3, 4, 8, 11, 17, 21, 22, 24, 26, 28, 29, 31, 39, 43, 47, 54, 55, 60, 63], "connect": [3, 24, 28, 30, 31, 37, 39, 41, 44, 46, 48, 49, 51, 57, 58], "itself": [3, 21, 28, 30, 39, 41, 49], "ha": [3, 4, 6, 7, 8, 15, 20, 24, 26, 30, 31, 36, 41, 44, 51, 58], "marri": [3, 16], "themself": 3, "super": [3, 8, 17, 29, 40, 44], "shouldn": [3, 64], "t": [3, 4, 5, 8, 14, 18, 20, 43, 44, 49, 55, 59, 63, 64, 65, 66, 68, 72], "within": [3, 8, 15, 17, 26, 32, 37, 39, 42, 44, 45, 47, 57], "": [3, 4, 5, 13, 18, 24, 28, 29, 30, 31, 33, 38, 40, 41, 42, 47, 48, 52, 54, 72], "databas": [3, 4, 8, 9, 19, 21, 26, 28, 30, 31, 33, 35, 38, 41, 42, 43, 44, 45, 49, 52, 68], "through": [3, 8, 18, 20, 26, 44, 51], "find": [3, 8, 21, 26, 32, 35, 36, 40, 41, 42, 43, 45, 52, 62, 65, 68, 71, 72], "previou": [3, 51], "view": [3, 6, 8, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 34, 36, 37, 45, 51, 52, 55, 57, 58, 59, 60], "variou": [3, 24, 26, 30, 35, 36, 42, 49], "tab": [3, 6, 7, 26, 30, 31, 33, 34, 35, 37, 51, 55, 57, 59], "combin": [3, 8, 26, 38, 42, 44, 48, 49, 57], "begin": [3, 4, 5, 8, 16, 31, 34, 39, 48, 62, 68], "That": 3, "later": [3, 8, 30, 31, 41], "than": [3, 8, 24, 31, 41, 58], "fix": [3, 4, 8, 51, 63], "otherwis": 3, "interfac": [3, 29, 30, 45, 47, 51, 60, 64, 71], "won": [3, 8, 20, 41, 59], "soon": 3, "incompat": 3, "particip": [3, 16, 18, 22, 31, 33, 44, 48], "longer": [3, 43], "last": [3, 4, 14, 36, 62], "chain": 3, "succeed": 3, "show": [3, 8, 9, 20, 26, 36, 39, 41, 45, 51, 58, 59, 60, 62, 63, 66, 68, 73], "hierarch": [3, 29, 40], "began": 3, "everi": [3, 4, 7, 29, 30, 41], "its": [3, 17, 24, 29, 30, 34, 39, 40, 44, 45, 51, 57, 58], "cidoc": [3, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 33, 42, 43, 45, 46, 47, 48, 52, 53, 60, 67, 68, 69], "valid": [3, 6, 8, 15, 26, 42, 45, 46, 48, 51, 57, 68], "amount": [3, 60, 61, 73], "take": [3, 4, 5, 8, 18, 44, 54], "some": [3, 4, 5, 26, 29, 32, 38, 39, 41, 44, 45, 51, 52, 57, 58, 63, 64], "time": [3, 4, 5, 8, 20, 31, 32, 33, 34, 41, 44, 51, 60, 62, 68, 73], "while": [3, 25, 42, 45, 47, 49, 51, 54], "alwai": [3, 8], "conform": [3, 45], "found": [3, 8, 24, 29, 31, 35, 36, 38, 39, 40, 44, 45, 47, 51, 62, 71], "problem": [3, 8, 24, 41, 65, 66], "resolv": [3, 13, 26, 38, 48, 49, 52], "origin": [3, 9, 49, 60], "sourc": [3, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 35, 39, 43, 45, 47, 49, 51, 52, 71], "two": [3, 8, 39, 41, 48, 51], "test": [3, 4, 7, 10, 52], "ident": 3, "afterward": [3, 29, 30, 33], "case": [3, 4, 7, 8, 18, 20, 25, 29, 30, 31, 33, 36, 39, 43, 49, 51, 52, 56, 59, 60, 62, 63, 65, 66], "singl": [3, 15, 16, 29, 40, 51], "multipl": [3, 4, 7, 8, 15, 20, 29, 30, 33, 36, 40, 42, 43, 49, 73], "castl": 3, "citi": [3, 24, 26], "one": [3, 4, 8, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 41, 48, 51, 58, 60, 62, 68, 72], "would": [3, 8, 13, 19, 24, 26, 30, 31, 34, 41, 63], "automat": [3, 4, 6, 8, 9, 20, 26, 41, 44, 45, 66, 68], "anyon": [3, 45], "given": [3, 8, 15, 18, 39, 42, 51, 54, 61], "look": [3, 8, 13, 18, 24, 26, 33, 35, 41], "wrong": 3, "ones": [3, 33, 36, 37, 60], "next": [3, 22, 30, 40], "column": [3, 8, 57], "By": [3, 26, 30, 31, 35, 36, 39, 40, 57], "due": [3, 39, 42, 44], "reoccur": 3, "search": [3, 6, 8, 26, 36, 42, 43, 51, 56, 69, 71, 72, 73], "select": [3, 4, 7, 8, 15, 18, 20, 26, 29, 30, 31, 34, 35, 36, 38, 39, 44, 51, 55, 58, 60, 62], "volum": 3, "follow": [3, 5, 7, 8, 13, 18, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 44, 49, 50, 51, 53, 54, 57, 61], "class": [3, 5, 9, 15, 26, 29, 38, 40, 41, 43, 45, 46, 48, 49, 52, 53, 58, 60, 62], "ratio": [3, 54], "how": [3, 6, 11, 26, 29, 30, 31, 33, 34, 35, 37, 43, 44, 47, 52, 60], "100": [3, 36, 39], "mean": [3, 34, 41, 57], "fuzzywuzzi": 3, "packag": 3, "which": [3, 7, 8, 11, 15, 16, 17, 18, 21, 24, 25, 28, 29, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 49, 51, 52, 55, 57, 58, 62, 63, 66, 68, 71, 72], "levenshtein": 3, "distanc": [3, 58], "direct": [4, 42, 44, 58], "warn": [4, 5, 8, 51, 63], "manipul": [4, 51, 57], "loss": [4, 7], "unus": 4, "backup": [4, 5, 8], "export": [4, 9, 14, 42, 43, 51, 52], "download": [4, 5, 49, 51, 56], "lose": 4, "crash": 4, "local": [4, 51], "version": [4, 7, 13, 33, 43, 44, 47], "note": [4, 7, 21, 30, 31, 33, 35, 36, 38, 39, 40, 42, 43, 44, 48, 50, 51, 53, 56], "recent": 4, "max": [4, 11, 20, 60], "dai": [4, 8, 39, 68], "old": [4, 36], "either": [4, 15, 20, 34, 39, 41, 51, 57, 66], "simpl": 4, "power": 4, "unlik": [4, 33], "rest": [4, 15, 51], "safeguard": 4, "prevent": 4, "total": [4, 20], "make": [4, 8, 13, 14, 18, 36, 42, 43, 60, 63, 66], "lost": [4, 8], "server": [4, 7, 41, 42, 51, 55], "depend": [4, 9, 33, 35, 36, 40, 41, 48, 54, 66], "situat": [4, 29, 41], "effort": [4, 42], "transact": [4, 8], "commit": 4, "build": [4, 19, 30, 36, 45], "around": [4, 58], "statement": 4, "don": [4, 20, 41, 44, 49, 64, 72], "refresh": [4, 39], "press": [4, 30, 31, 34, 36, 37, 40, 45, 61], "f5": [4, 63], "again": [4, 31, 66], "termin": 4, "queri": [4, 51], "row": [4, 6, 8, 39, 60, 68], "count": [4, 6, 41, 44], "veri": [4, 24, 32, 41, 63], "readabl": [4, 51, 58], "affect": 4, "error": [4, 6, 8, 43, 61, 65, 66], "noth": [4, 8, 63], "worri": [4, 41], "becaus": [4, 41, 62, 63], "Be": [5, 7, 41, 51, 55, 58], "awar": [5, 7, 20, 41, 51, 55, 58], "especi": [5, 8, 41], "share": 5, "email": [5, 6, 10, 14, 53, 60, 66], "address": [5, 10, 13, 60], "includ": [5, 11, 18, 20, 35, 38, 41, 42, 44, 49, 51, 60, 62], "save": [5, 14, 30, 31, 33, 34, 35, 36, 38, 61], "folder": [5, 7], "directori": [5, 7], "isn": [5, 66], "writabl": 5, "2018": 5, "08": [5, 48], "23_1533_export": 5, "exist": [5, 8, 13, 16, 19, 20, 24, 28, 29, 31, 37, 41, 44, 48, 51, 64, 66], "pg_dump": 5, "plain": 5, "format": [5, 7, 8, 26, 42, 43, 51, 69], "fill": [5, 8, 20, 24, 33, 38, 39, 40, 62, 68], "empti": [5, 10, 20], "psql": 5, "archiv": [5, 20, 26, 41, 59], "fc": 5, "pg_restor": 5, "restor": 5, "regardless": 5, "oper": [5, 8], "line": [5, 36, 39, 51, 57, 69], "break": [5, 51, 69], "d": [5, 31, 38, 54], "1": [5, 8, 30, 39, 44, 47, 54, 68], "zip": 5, "sever": [5, 20, 31, 36, 41, 48], "entiti": [5, 8, 9, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 38, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 55, 58, 59, 60, 62, 64, 67], "divid": [5, 24, 42, 54], "properti": [5, 18, 45, 46, 47, 48, 53], "geometri": [5, 8, 36, 56], "current": [5, 7, 8, 26, 33, 42, 44, 45, 48, 51, 57, 60, 63], "2022": [5, 51], "10": [5, 39, 48, 57], "04_1610": 5, "kei": [5, 44, 63], "tag": [5, 41, 51], "prefer": [6, 15, 42, 53, 60], "profil": [6, 8, 12, 14, 20, 39, 42, 43, 45, 51, 56, 57, 68, 73], "valu": [6, 9, 12, 13, 39, 40, 41, 49, 51, 54, 61, 62, 68], "choos": [6, 8, 15, 17, 20, 29, 30, 31, 34, 35, 36, 37, 38, 40, 45, 58], "much": [6, 7, 31], "At": [6, 16, 17, 18, 20, 23, 24, 25, 27, 33, 41, 48, 55], "moment": [6, 39, 48, 58], "info": [6, 14, 20, 25], "minimum": 6, "jstree": 6, "charact": [6, 8, 69], "filter": [6, 41, 42, 51, 52, 62, 73], "tree": [6, 31, 41], "type": [6, 9, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 49, 54, 58, 72, 73], "random": 6, "password": [6, 10, 14, 15, 42, 56], "length": 6, "reset": [6, 10, 14, 42, 60], "upon": 6, "requir": [6, 8, 14, 20, 26, 33, 35, 36, 38, 41, 42, 51, 63, 70, 72], "confirm": [6, 42], "hour": [6, 60, 68], "long": [6, 20, 41, 73], "code": [6, 43, 44, 45, 51, 52, 65], "fail": [6, 66], "login": [6, 7, 10, 14, 43, 65], "often": [6, 22, 52], "attempt": 6, "specif": [6, 8, 20, 26, 29, 32, 37, 40, 41, 42, 43, 44, 47, 48, 51, 53, 57, 66], "usernam": [6, 10, 11, 14, 15, 66], "forget": [6, 41], "minut": [6, 60, 66, 68], "mani": [6, 13, 20, 24, 26, 41, 44, 63], "wait": [6, 66], "chosen": [6, 8, 36, 38, 40, 41], "number": [6, 8, 26, 48, 49, 51, 66], "exceed": 6, "activ": [6, 14, 18, 20, 31, 42, 44, 57, 60, 62, 63, 68], "preview": [6, 8], "open": [7, 26, 34, 35, 38, 41, 42, 43, 51, 55, 57], "standard": [7, 37, 40, 42, 44, 72], "deliv": [7, 42], "high": [7, 26, 38, 42, 57], "attribut": [7, 26, 41, 42], "onlin": [7, 38, 42], "scale": [7, 20, 42], "onc": [7, 55], "see": [7, 8, 14, 21, 22, 24, 28, 31, 33, 34, 35, 36, 37, 38, 40, 42, 45, 47, 49, 51, 55, 58, 60, 63, 64, 66], "configur": [7, 13, 20, 52, 53, 55], "item": [7, 20, 27, 29, 40, 47], "enabl": [7, 8, 20, 26, 42, 45, 55, 57, 58], "expos": 7, "checkbox": [7, 26, 29, 57, 66], "complet": 7, "api": [7, 9, 15, 20, 26, 41, 42, 43, 49, 52, 60], "yourserv": 7, "eu": [7, 13, 51], "manifest": [7, 42], "2": [7, 30, 39, 44, 47, 54], "path": [7, 51], "absolut": 7, "drop": [7, 20, 38, 58], "zone": 7, "var": 7, "www": [7, 15, 26, 38], "iipsrv": 7, "write": 7, "execut": [7, 9, 43, 52], "webserv": 7, "convers": 7, "control": [7, 15, 38, 51], "convert": [7, 55, 68], "pyramid": 7, "tiff": 7, "none": [7, 36, 41, 51, 53, 63], "deflat": 7, "lossless": 7, "size": [7, 20, 53], "mai": [7, 24, 39, 41, 44, 51, 52, 58, 63, 64], "larg": [7, 20, 36, 39, 58], "jpeg": [7, 20], "smaller": [7, 52], "transpar": 7, "run": [7, 8, 13, 41, 52], "sub": [7, 8, 9, 17, 18, 29, 33, 35, 44], "accordingli": 7, "successfulli": 7, "bmp": [7, 20], "gif": [7, 20], "ico": [7, 20], "jpg": [7, 20], "svg": [7, 20], "tif": 7, "directli": [8, 30, 38, 41, 45, 47, 54], "csv": [8, 9, 42], "gi": 8, "unit": [8, 17, 19, 21, 22, 29, 36, 39, 43, 47, 48, 54, 61], "histor": [8, 22, 26, 36, 38, 39, 43], "regard": [8, 31, 38, 40, 53], "integr": [8, 9, 26, 43, 58], "caution": 8, "consum": 8, "we": [8, 41, 44, 63], "strongli": 8, "advis": 8, "sql": [8, 9, 43, 52], "ani": [8, 30, 31, 41, 49, 51], "older": [8, 63], "enforc": 8, "check": [8, 9, 10, 14, 26, 29, 35, 39, 42, 43, 46, 58, 60, 62], "alright": 8, "encapsul": 8, "script": [8, 44], "example_place_hierarchi": 8, "sure": [8, 36, 51, 63, 66, 68], "extens": [8, 20, 45, 51], "spell": [8, 39, 67], "correctli": [8, 39], "lower": [8, 24], "my_data": 8, "header": [8, 73], "each": [8, 15, 20, 21, 24, 39, 40, 42, 44, 45, 46, 49, 51, 54], "separ": [8, 41], "comma": 8, "enclos": 8, "doubl": [8, 36], "quot": 8, "To": [8, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 45, 47, 48, 51, 52, 57, 62, 67, 68, 73], "said": [8, 34], "titl": [8, 18, 51, 57], "messag": [8, 51, 63, 64, 66], "uniqu": [8, 26, 49], "per": [8, 73], "prefix": 8, "them": [8, 18, 22, 29, 32, 33, 36, 41, 55, 60, 63], "person_1": 8, "place_1": 8, "underscor": 8, "_": 8, "hyphen": 8, "miss": [8, 9, 41, 44, 63, 68], "begin_from": [8, 48], "begin_to": [8, 48], "end_from": [8, 48], "end_to": [8, 48], "type_id": 8, "value_typ": 8, "reference_id": 8, "alreadi": [8, 13, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35, 38, 40, 41, 50, 55, 60, 68], "origin_reference_id": 8, "reference_system_": 8, "administrative_unit_id": 8, "historical_place_id": 8, "parent_id": 8, "openatlas_parent_id": 8, "openatlas_class": 8, "string": [8, 48, 69], "alias": [8, 60, 62, 67, 73], "semicolon": 8, "surround": 8, "yyyi": [8, 39, 62], "mm": [8, 39], "dd": [8, 39], "out": [8, 18, 29, 33, 36, 40, 41, 48, 51, 57, 62, 63, 68], "timefram": 8, "For": [8, 15, 18, 19, 21, 22, 24, 26, 28, 30, 33, 34, 35, 41, 45, 47, 49, 51, 54, 66, 68], "timespan": [8, 68], "more": [8, 18, 19, 20, 21, 24, 26, 28, 29, 30, 31, 33, 35, 36, 38, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 62], "keep": [8, 9, 14, 29, 31, 32, 35, 36, 37, 38, 41, 45, 69], "mind": [8, 9, 29, 31, 32, 35, 36, 37, 38, 41], "incorrect": 8, "red": 8, "advanc": [8, 14, 62, 63, 69], "studi": [8, 29, 43], "space": [8, 20, 24, 30], "1234": [8, 13], "13": [8, 51], "65": 8, "pair": 8, "56": 8, "78": 8, "wrap": 8, "cell": 8, "quotat": 8, "mark": [8, 20, 29, 36, 41, 55, 70, 72], "iv": 8, "542": 8, "34": 8, "23": [8, 39, 48, 68], "66": 8, "just": [8, 20, 51, 68], "5678": 8, "literature_1": 8, "book_2": 8, "multi": 8, "point": [8, 18, 33, 34, 35, 36, 51, 57], "polygon": [8, 36, 57], "linestr": [8, 36, 57], "geometriccollect": 8, "wgs84": [8, 57], "geodet": 8, "epsg": [8, 57], "4326": [8, 57], "sinc": [8, 44, 72], "tall": 8, "12": [8, 39, 48, 62, 68], "458533781141528": 8, "41": 8, "922205268362234": 8, "53062334955289": 8, "917606998887024": 8, "52169797441624": 8, "888476931243254": 8, "coulmn": 8, "append": 8, "reference_system_wikidata": 8, "occur": [8, 35, 51], "substitut": 8, "reference_system_getty_aat": 8, "consist": [8, 19, 21, 26, 28, 30, 39, 41, 42, 44], "identifi": [8, 14, 22, 26, 36, 60], "q54123": 8, "second": [8, 60, 68, 73], "match": [8, 26, 36, 38, 44, 57], "close_match": 8, "exact_match": 8, "gener": [8, 9, 18, 33, 43, 51, 52, 53, 56, 63, 68], "togeth": [8, 20, 41, 44], "stratigraph": [8, 17, 19, 21, 22, 24, 43, 47, 48, 54, 61], "remain": [8, 16, 17, 22, 24, 28, 43, 54], "declar": 8, "insensit": 8, "question": [8, 22, 41], "structur": [8, 19, 22, 28, 41, 42, 43, 51], "archaeolog": [8, 19, 21, 22, 24, 28, 31, 42, 43], "model": [8, 41, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55, 59], "ll": [8, 43, 66], "duplic": [8, 9, 41, 72], "sensit": [8, 62], "king": [8, 31, 38, 39], "arthur": 8, "print": [8, 49], "doesn": [8, 18, 64, 65, 66], "stop": 8, "went": [8, 33], "summari": [8, 27], "brows": [8, 14, 44, 45], "layout": [8, 20, 52], "did": 8, "good": [8, 20, 24, 30], "idea": 8, "doc": [8, 48], "data_integrity_check": 8, "authent": [9, 10, 15, 43], "mail": [9, 14, 43], "modul": [9, 39, 43, 56, 57, 68], "map": [9, 17, 18, 19, 21, 22, 24, 26, 28, 30, 31, 35, 42, 43, 44, 45, 47, 48, 49, 56, 60], "iiif": [9, 41, 43, 55], "content": [9, 25, 27, 34, 43, 49, 57, 63], "present": [9, 20, 34, 41, 42, 43, 51, 57, 59], "orphan": [9, 58], "annot": [9, 43, 53, 56], "subunit": [9, 22, 27, 30], "circular": 9, "invalid": [9, 51], "preced": [9, 18, 33, 35, 39, 44, 48], "similar": [9, 26, 38, 41, 57, 68], "prepar": 9, "alia": [9, 16, 24, 30, 36, 70], "refer": [9, 14, 16, 17, 18, 19, 20, 21, 22, 24, 27, 28, 29, 30, 32, 34, 35, 39, 40, 41, 42, 43, 44, 45, 47, 53, 57], "wkt": [9, 56], "coordin": [9, 26, 36, 57], "extern": [9, 20, 25, 26, 31, 35, 38, 40, 41, 47, 51, 53], "dump": 9, "json": [9, 51], "xml": 9, "arch": [9, 20, 41, 43], "overview": [9, 13, 14, 20, 29, 35, 40, 43, 44, 45, 46, 47, 51, 52, 58, 59, 61], "fetch": 9, "reference_system": 9, "index": [9, 16, 17, 18, 20, 23, 24, 25, 27], "vocab": [9, 43], "vocabulari": [9, 38, 49], "ensur": [10, 20, 41], "disabl": [10, 11, 26], "leav": 10, "send": [10, 14, 35], "mail_password": 10, "smtp": 10, "net": [10, 13], "port": 10, "587": 10, "recipi": [10, 18], "feedback": [10, 63], "receiv": [10, 35, 60, 66], "zoom": [11, 36, 57, 58, 60], "defin": [11, 14, 20, 25, 33, 44, 48, 49, 52, 58, 60], "lowest": [11, 60], "adjust": [11, 12, 60], "far": [11, 60], "disableclusteringatzoom": 11, "cluster": [11, 36], "maxclusterradiu": 11, "maxim": 11, "rang": [11, 44, 48, 51, 61], "geonam": [11, 30, 38, 49, 56], "own": [12, 14, 16, 17, 21, 31, 36, 38, 41, 42, 45, 51], "wider": 13, "audienc": 13, "area": [13, 36, 54, 55, 57], "backend": [13, 53], "frontend": 13, "demo": [13, 44, 47, 51], "specifi": [13, 16, 20, 25, 29, 38, 39, 41, 42, 51], "newslett": [14, 42, 60], "subscript": 14, "registr": 14, "account": [14, 61], "sent": [14, 35], "cannot": [14, 26, 29, 35, 39, 64], "anymor": [14, 29, 64, 66], "inact": [14, 59], "modifi": [14, 18, 60], "full": [14, 36, 57, 60, 62], "easier": [14, 42, 60], "free": [14, 31, 33, 35, 36, 38, 39, 43, 49], "guest": 14, "who": [14, 16, 17, 21, 22, 33], "aren": [14, 20, 41, 68], "editor": [14, 20, 29, 40, 57, 60], "contributor": 14, "readonli": 14, "ye": 14, "skosmo": 15, "As": [15, 18, 31, 33, 35, 36, 38, 39, 45, 61], "ch": 15, "trail": 15, "slash": 15, "vocabs_pw": 15, "differ": [15, 18, 20, 30, 32, 33, 35, 36, 38, 40, 41, 42, 45, 47, 51, 58, 67, 69, 72], "confer": 15, "w3": 15, "org": [15, 26, 38, 51], "tr": 15, "sko": [15, 26, 38, 57], "primer": 15, "concept": [15, 26, 57], "child": 15, "conceptu": [15, 44, 45], "decid": [15, 40], "choic": [15, 29, 40], "what": [15, 58], "choosen": 15, "e74": 16, "albert": [16, 48], "einstein": [16, 48], "queen": 16, "victoria": 16, "peopl": [16, 18, 41], "famili": 16, "tribe": 16, "greenpeac": 16, "nation": 16, "museum": [16, 17, 21, 26, 31, 38, 44], "denmark": 16, "resid": 16, "main": [16, 41, 53, 71], "born": [16, 48], "where": [16, 18, 22, 29, 31, 33, 35, 36, 38, 41, 44, 51, 57, 58, 62, 68], "came": 16, "di": [16, 48], "mother": 16, "member": [16, 37], "kept": 16, "pictur": [16, 17, 19, 31, 55], "coin": [17, 30, 31], "potteri": [17, 30], "collector": 17, "carrier": 17, "carri": [17, 18, 30], "e7": [18, 48], "e8": 18, "e5": [18, 48], "e11": 18, "e9": 18, "common": [18, 26, 51, 65], "battl": [18, 35, 39], "meet": [18, 62], "wed": 18, "owner": [18, 31], "anoth": [18, 20, 24, 29, 31, 33, 34, 41, 44, 49, 51, 60], "natur": [18, 38, 47], "disast": 18, "track": [18, 31, 39, 42, 48, 53, 61], "conserv": 18, "treatment": 18, "movement": [18, 34], "crm": [18, 24, 33, 42, 43, 45, 46, 47, 48, 52], "war": [18, 35, 39, 48], "up": [18, 20, 36, 41, 62, 63, 66, 68], "journei": [18, 32, 35], "wai": [18, 19, 24, 26, 28, 31, 32, 34, 40, 44, 48, 49, 51], "donor": 18, "step": [18, 22, 24, 26, 30, 31, 32, 33, 34, 37, 41, 42], "instruct": [18, 24, 26, 31], "our": [18, 24, 26, 41, 43, 51], "ownership": 18, "acquir": [18, 31, 41], "surrend": 18, "creator": [18, 20, 41], "destin": 18, "unfortun": [18, 33], "background": [18, 42, 45, 47, 58, 68], "tutori": [18, 31, 33, 35, 36, 41], "produc": 18, "e18": [19, 24, 28, 47, 48], "physic": [19, 24, 28, 30, 31, 34, 36, 47, 48, 57], "thing": [19, 24, 28, 30, 36, 47, 48, 57], "record": [19, 21, 24, 28, 31, 34, 49, 54], "grave": [19, 21, 24, 28, 30, 36], "consid": [19, 24, 47, 49], "referenc": [19, 25, 28], "skeleton": [19, 21], "pit": [19, 30], "ditch": 19, "rampart": 19, "label": [19, 29, 44, 58, 68], "disk": 20, "display": 20, "upload": [20, 31, 42, 52, 53], "exce": 20, "limit": [20, 53, 68], "both": [20, 68], "go": [20, 24, 29, 30, 31, 39, 40, 45, 57], "drag": [20, 57, 58], "left": [20, 38, 50, 55, 57, 58], "furthermor": [20, 24, 26, 39, 40, 45], "practic": [20, 41], "licenc": 20, "besid": [20, 68], "plan": [20, 41], "indic": [20, 39, 41, 44, 48, 51], "design": [20, 36, 41, 42, 54], "holder": [20, 49], "Not": [20, 62], "maximum": 20, "mb": 20, "width": [20, 58], "pixel": [20, 58], "pdf": 20, "display_file_ext": 20, "chose": [20, 68], "do": [20, 29, 30, 31, 36, 39, 63], "height": [20, 29, 58], "120": 20, "px": 20, "larger": 20, "try": [20, 51, 58, 63, 64, 66, 68], "small": [20, 60], "impact": 20, "perform": [20, 31, 45, 56], "suppos": 20, "met": [20, 41], "must": [20, 39, 41, 44, 51], "those": [20, 24, 30, 39, 47, 51], "numer": [20, 44, 61], "flag": [20, 41], "viewer": [20, 41, 42, 55], "e20": 21, "biolog": [21, 30], "anthropolog": [21, 24, 30, 43, 56, 61], "bone": [21, 30, 54], "sex": [21, 29, 30, 42, 56], "gender": [21, 30], "ag": [21, 30, 42], "mask": [21, 30], "workflow": [21, 22, 24, 28, 30, 32, 42, 59], "acquisit": [21, 42], "modif": [21, 38, 40], "move": [21, 24, 31, 32, 58], "femur": [21, 30, 54], "humeru": [21, 54], "molar": 21, "historian": 22, "work": [22, 39, 42, 43, 63], "come": [22, 29, 41, 68], "usual": [22, 41], "facilit": [22, 26], "bit": 22, "hi": [22, 31, 39], "life": [22, 48], "archaeologist": 22, "reflect": [22, 34, 51], "contin": 24, "graveyard": [24, 30], "under": [24, 25, 26, 36, 38, 51, 66], "austria": 24, "itali": 24, "respect": [24, 26, 33, 34, 35, 36, 38, 41, 49, 57], "styria": 24, "duchi": 24, "bavaria": 24, "lombard": [24, 38], "kingdom": 24, "newli": [24, 28, 30, 31], "though": [24, 28], "e18phys": 24, "certain": [24, 29, 30, 36, 44, 48, 49, 57], "posit": [24, 30, 36, 49, 57], "extend": [24, 30, 33, 34, 57], "tempor": [24, 30, 35, 42], "spatial": [24, 30, 42, 57], "superior": 24, "cemeteri": 24, "compos": 24, "burial": [24, 28, 30, 36], "primari": 24, "secondari": [24, 27], "back": [24, 30, 31], "solv": [24, 63, 65], "book": [25, 30, 49], "inbook": 25, "articl": [25, 30, 51], "charter": [25, 27, 49], "chronicl": 25, "doi": [25, 49], "instead": [25, 34, 45, 51], "author": [26, 33, 49], "advantag": [26, 31], "abl": [26, 31, 41], "futhermor": 26, "merg": 26, "lod": [26, 38, 42], "analogu": 26, "librari": 26, "catalogu": 26, "inventori": [26, 38, 49], "collabor": 26, "multilingu": 26, "knowledg": [26, 45], "graph": [26, 58], "wikimedia": 26, "foundat": 26, "wikipedia": 26, "everyon": [26, 45], "cc0": 26, "domain": [26, 44, 48, 51], "usabl": [26, 51, 69], "geograph": [26, 49], "web": [26, 49, 52, 53], "creativ": 26, "over": [26, 29, 31, 36, 40, 41, 49, 61, 73], "25": [26, 48], "000": 26, "11": [26, 48, 51], "800": [26, 38, 68], "gemeinsam": 26, "normdatei": 26, "translat": [26, 27, 45, 47, 52, 53], "intern": [26, 42, 44, 45, 47], "organis": 26, "subject": 26, "head": 26, "corpor": 26, "bodi": 26, "mainli": 26, "increasingli": 26, "definit": [26, 38, 44, 45, 51], "confid": [26, 38, 57], "degre": [26, 38, 54, 57], "close": [26, 36, 38, 57], "suffici": [26, 38, 57], "interchang": [26, 38, 57], "retriev": [26, 38, 51, 57], "exact": [26, 36, 38, 39, 57, 68], "vienna": [26, 38, 61], "suitabl": [26, 33, 38, 52], "deal": [26, 41, 45, 47, 58], "primarili": [26, 28, 54], "wiki": [26, 38, 43], "q123": 26, "septemb": 26, "desir": [26, 30, 37, 38], "short": [26, 31, 35, 44], "mous": [26, 29, 40, 57, 58, 73], "yet": [26, 35], "attach": [26, 41, 51], "e33": [27, 45, 47, 49], "linguist": [27, 47, 49], "written": [27, 30, 34, 52], "mediev": [27, 49], "letter": [27, 31, 32, 33, 35, 44], "literatur": [27, 54], "comment": [27, 39, 62, 68], "tool": [28, 31, 42, 43, 51, 54, 57, 59, 61, 73], "lead": [28, 29, 41, 51], "backfil": [28, 30], "e55": [29, 48], "With": [29, 31, 34, 42, 46, 51, 57, 58, 66], "adapt": [29, 42, 60], "interest": [29, 45], "dynam": [29, 40], "statu": [29, 51], "higher": 29, "basic": [29, 40, 45], "root": [29, 52], "untyp": 29, "switch": [29, 57, 58, 71], "except": [29, 51, 60, 69], "unselect": 29, "categori": [29, 54], "permiss": [29, 38, 40, 42, 64], "renam": 29, "subtyp": 29, "grei": 29, "least": [29, 40, 41, 62], "decim": [29, 57], "dimens": [29, 30, 48], "weight": [29, 54], "centimetr": 29, "gram": 29, "percentag": 29, "unabl": 29, "fit": [29, 31, 35, 36], "reduc": 29, "typ": 29, "element": [30, 31, 33, 34, 60, 63], "procedur": [30, 33, 34], "3": [30, 48, 51, 54], "knife": 30, "4": [30, 41, 51, 62, 68], "teeth": 30, "classif": [30, 33, 34], "bout": 30, "concern": [30, 33, 34, 52], "store": [30, 31, 42, 48, 49], "state": [30, 36, 38, 51, 61], "appropri": [30, 31, 34], "settlement": 30, "magnifi": [30, 36, 57], "evid": 30, "plot": [30, 36], "photo": 30, "now": [30, 31, 34], "layer": [30, 36, 57], "finger": 30, "ring": [30, 48], "patholog": 30, "measur": [30, 61], "discolor": 30, "canin": 30, "represent": [31, 45], "repres": [31, 35, 36, 39, 47], "span": [31, 32, 48, 62, 68], "cover": [31, 36], "Then": [31, 36], "learn": 31, "On": [31, 33, 35], "land": [31, 35, 54], "kind": [31, 36, 40], "occurr": 31, "excav": [31, 55], "transfer": 31, "sold": 31, "leonardo": 31, "paint": 31, "mona": 31, "lisa": 31, "workshop": 31, "florenc": 31, "franci": 31, "franc": 31, "exhibit": 31, "ch\u00e2teau": 31, "ambois": 31, "fountainebleau": 31, "louvr": 31, "pari": 31, "typic": 32, "scenario": 32, "suggest": [32, 63, 65], "discuss": 32, "best": 32, "profess": [32, 43], "special": [33, 41, 42, 44, 47, 69], "trip": 33, "chronolog": 33, "captur": 33, "continu": [33, 35, 36, 48], "altern": [33, 41, 51], "role": [33, 38, 41], "determin": [33, 42, 44, 49, 54], "exchang": [34, 43], "materi": 34, "copi": [34, 36], "preset": 34, "subgroup": 35, "bring": [35, 38, 44], "simultan": 35, "music": 35, "festiv": 35, "parallel": 35, "concert": 35, "overlap": 35, "sequenc": [35, 44, 51], "introduct": [35, 43], "think": [35, 38, 39, 44, 64, 66], "screen": [36, 57], "glass": [36, 57], "pop": 36, "marker": [36, 57], "visual": [36, 42, 43, 50, 56], "hover": 36, "landscap": 36, "street": 36, "satellit": 36, "whether": [36, 73], "four": [36, 39], "mode": [36, 57, 58], "centerpoint": 36, "drawn": [36, 57], "border": 36, "river": 36, "bed": 36, "draw": [36, 55, 57], "shape": [36, 38, 54, 57], "rectangl": [36, 55, 57], "ground": 36, "hole": 36, "whose": 36, "unknown": [36, 39], "enough": [36, 39, 68], "window": 36, "dedic": 36, "countri": [37, 49], "gazett": [38, 49], "particularli": [38, 42], "But": [38, 41], "analog": 38, "card": [38, 49], "catalog": [38, 49], "wikidata": [38, 49], "manual": [38, 40, 41, 42, 50, 51, 52, 57], "q3044": 38, "charlemagn": 38, "input": [38, 51, 68], "2761369": 38, "AT": 38, "precis": [38, 57], "down": 38, "blank": 38, "belt": 38, "buckl": 38, "q3180027": 38, "todai": 38, "frank": 38, "becam": 38, "holi": [38, 48], "roman": 38, "emperor": 38, "venu": 38, "willendorf": 38, "histori": 38, "q131397": 38, "focus": 39, "statigraph": 39, "bottom": [39, 40, 57], "initi": [39, 68], "hidden": [39, 68], "year": [39, 48, 61, 62, 68], "4713": [39, 68], "9999": [39, 51, 68], "month": [39, 62, 68], "31": [39, 48, 54, 62, 68], "hh": 39, "59": [39, 51, 68], "ss": 39, "minu": 39, "bc": [39, 68], "softwar": [39, 42, 47, 52], "postgresql": [39, 44, 53, 68], "prolept": [39, 68], "gregorian": [39, 68], "calendar": [39, 68], "hast": 39, "fought": 39, "william": 39, "duke": 39, "normandi": 39, "norman": 39, "french": [39, 42], "troop": 39, "harold": 39, "godwinson": 39, "english": [39, 42], "armi": 39, "14th": 39, "octob": 39, "1066": 39, "14": 39, "alik": [39, 45], "Or": 39, "peac": 39, "westphalia": 39, "treati": 39, "sign": [39, 51], "1648": [39, 48], "osnabr\u00fcck": 39, "15th": 39, "m\u00fcnster": 39, "24th": 39, "thirti": [39, 48], "eighti": 39, "05": [39, 48], "15": 39, "24": [39, 48], "uncertain": 39, "third": 39, "fourth": 39, "actual": 39, "frame": 39, "certainti": 39, "death": [39, 48], "stephen": 39, "hungari": 39, "august": 39, "1038": 39, "birth": [39, 44, 48, 68], "01": [39, 62, 68], "975": 39, "earliest": 39, "latest": [39, 50], "howev": 39, "gear": [39, 45], "organ": 40, "distinct": [40, 49], "push": 40, "blue": 40, "light": 40, "answer": 41, "frequent": 41, "approach": [41, 51], "probabl": [41, 49, 63], "analys": [41, 43, 56, 61], "decis": 41, "regist": [41, 66], "hide": [41, 60], "reason": [41, 44, 51, 63, 66], "conflict": 41, "core": 41, "strict": 41, "better": 41, "lot": 41, "sai": 41, "alex": 41, "him": 41, "pick": 41, "he": 41, "although": 41, "filenam": 41, "cc": 41, "BY": 41, "unstructur": 41, "nor": [41, 44], "searchabl": [41, 60], "solut": [41, 63], "happi": 41, "help": [41, 45, 63, 65], "tailor": 41, "hesit": 41, "reach": [41, 50], "u": [41, 64], "topic": [41, 42, 51, 63], "linebreak": 41, "html": [41, 52], "markdown": 41, "bold": 41, "font": 41, "underlin": 41, "necessarili": 41, "handl": [41, 43], "interoper": 41, "easi": [42, 45, 51], "conveni": [42, 44, 47], "contribut": 42, "significantli": 42, "ontologi": [42, 44, 45], "easili": 42, "fair": 42, "principl": 42, "wide": [42, 44, 68], "uncertainti": [42, 68], "checker": [42, 43, 45], "quick": [42, 43, 62], "accord": [42, 47, 48, 66], "flexibli": 42, "thu": 42, "interact": [42, 57], "navig": [42, 56, 62, 73], "network": [42, 43, 50, 56], "bookmark": [42, 50, 53, 64], "context": 42, "internation": 42, "gettext": 42, "catalan": 42, "german": 42, "spanish": 42, "mirador": 42, "grant": 42, "autom": 42, "unsubscrib": [42, 60], "interdisciplinari": [42, 44], "method": [42, 54], "futur": 42, "ferembach": [42, 54], "et": [42, 54], "al": [42, 54, 71], "estim": [42, 56], "1979": [42, 54], "ment": [42, 61], "archeolog": 43, "geospati": 43, "radiocarbon": [43, 56], "shortcut": [43, 45, 68], "guid": 43, "paramet": [43, 58], "proxi": 43, "troubleshoot": 43, "faq": 43, "doe": [43, 44, 51], "why": 43, "iso": 44, "formal": 44, "council": 44, "icom": 44, "basi": [], "underli": 44, "v7": 44, "publish": [44, 54], "2021": 44, "pars": 44, "github": 44, "e39": [44, 48], "e67": [44, 48], "characteris": 44, "had": [44, 48, 68], "invers": 44, "anywai": 44, "ignor": 44, "foreign": 44, "sub_properties_of": 44, "suffix": 44, "counterpart": 44, "p3": [44, 48], "parser": 44, "com": [], "craw": [], "blob": [], "cidoc_rtfs_pars": [], "troubl": [], "prior": [45, 51], "verifi": 45, "fact": [], "gain": [], "insight": [], "graphic": 45, "symbol": [45, 51, 69], "introduc": 45, "increas": 45, "finer": [45, 47], "grain": [45, 47], "contextu": [45, 47], "lingust": [45, 47], "refin": [47, 62], "7": [47, 54], "compris": 47, "rel": 47, "differenti": 47, "confus": 47, "true": [47, 51], "simplifi": 48, "oa": 48, "p11i": 48, "stefan": 48, "joachim": 48, "son": 48, "father": 48, "usag": [45, 48, 56], "birthplac": 48, "p92i": 48, "brought": 48, "e63": 48, "p7": 48, "took": 48, "e521": 48, "e567": 48, "ulm": 48, "p93i": 48, "e64": 48, "e69": 48, "princeton": 48, "begin_com": 48, "end_com": 48, "timestamp": [48, 51], "e61": 48, "primit": 48, "p4": 48, "e52": 48, "p81": 48, "ongo": 48, "throughout": 48, "lanc": 48, "forg": 48, "durat": 48, "0770": 48, "destroi": [48, 68], "p13": 48, "destruct": 48, "e6": 48, "throw": 48, "lava": 48, "3019": 48, "03": 48, "p98i": 48, "1981": 48, "p100i": 48, "ladi": 48, "diana": 48, "1997": 48, "1618": 48, "purpos": 48, "e62": [48, 69], "p43": 48, "e54": 48, "bibliograph": 49, "delimit": 49, "along": 49, "chapter": 49, "figur": 49, "folio": 49, "7v": 49, "kell": 49, "saint": 49, "mari": 49, "21": 49, "less": 49, "eleven": 49, "million": 49, "charg": [49, 58], "distinguish": 49, "non": 49, "encyclopedia": 49, "domain_id": 49, "property_cod": 49, "range_id": 49, "alphanumer": [49, 61], "alon": [], "p67i": 49, "p71": 49, "terri": 49, "prattchet": 49, "q46248": 49, "p71i": 49, "e1": 49, "depict": 49, "scan": [], "extract": [], "mostli": 49, "logo": [50, 71], "upper": [50, 57], "program": 51, "analyt": 51, "mashin": 51, "tri": [51, 64], "constraint": 51, "hand": 51, "swagger": 51, "visit": 51, "rdf": 51, "visibl": [51, 57, 59], "commun": 51, "schema": [51, 53], "5117": 51, "machin": 51, "deprec": 51, "unstabl": 51, "unavail": 51, "notion": 51, "signific": 51, "major": [51, 54, 63], "minor": 51, "post": 51, "roadmap": 51, "releas": 51, "discontinu": 51, "openapi": 51, "lpf": 51, "geojson": 51, "deriv": 51, "sort": [51, 73], "consult": 51, "convent": 51, "success": 51, "failur": 51, "2xx": 51, "4xx": 51, "signal": 51, "5xx": 51, "tue": 51, "19": 51, "jul": 51, "gmt": 51, "404": 51, "kf": 51, "desc": 51, "flask": [51, 52], "catch": 51, "handler": 51, "behind": 51, "someurl": 51, "8080": 51, "No": 51, "python": 52, "framework": 52, "config": 52, "upgrad": 52, "live": [52, 62], "util": 52, "static": 52, "css": 52, "javascript": 52, "templat": 52, "compil": 52, "rout": 52, "redirect": 52, "sphinx": 52, "retrac": 52, "15883": 52, "init": 52, "before_request": 52, "get_by_id": 52, "some_data": 52, "some_filt": 52, "postgi": [53, 57], "assess": 54, "schwidetzki": 54, "m": 54, "stloukal": 54, "empfehlungen": 54, "f\u00fcr": 54, "die": 54, "alter": 54, "und": 54, "geschlechtsdiagnos": 54, "am": 54, "skelett": 54, "homo": 54, "30": [54, 57, 61], "32": 54, "skull": 54, "pelvi": 54, "examin": 54, "propos": 54, "margo": 54, "supramastoideu": 54, "o": 54, "sacrum": 54, "robust": 54, "supplement": 54, "glabella": 54, "w": 54, "arcu": 54, "superciliari": 54, "tuber": 54, "frontali": 54, "parietali": 54, "inclinatio": 54, "processu": 54, "mastoideu": 54, "relief": 54, "planum": 54, "nuchal": 54, "protuberantia": 54, "occipitali": 54, "externa": 54, "zygomaticu": 54, "zygomaticum": 54, "crista": 54, "supramastoideum": 54, "supraorbitali": 54, "orbita": 54, "mandibl": 54, "overal": 54, "mentum": 54, "angulu": 54, "inferior": 54, "m2": 54, "angl": 54, "sulcu": 54, "praeauriculari": 54, "incisura": 54, "ischiadica": 54, "pubi": 54, "arc": 54, "compos\u00e9": 54, "coxa": 54, "foramen": 54, "obturatum": 54, "corpu": 54, "ossi": 54, "ischii": 54, "iliaca": 54, "fossa": 54, "auricular": 54, "acetabuli": 54, "express": 54, "assign": 54, "femal": 54, "indiffer": 54, "male": 54, "preserv": 54, "sum": 54, "69": 54, "70": 54, "prerequisit": 55, "wasn": 55, "side": [55, 63], "guarante": 55, "overlai": [56, 60], "leaflet": 57, "mousewheel": 57, "hold": 57, "basemap": 57, "popup": 57, "40": 57, "20": 57, "characterist": 57, "road": 57, "toggl": 57, "east": 57, "north": 57, "d3": 58, "j": 58, "egocentr": 58, "classic": 58, "wheel": 58, "node": 58, "rotat": 58, "pan": 58, "color": 58, "depth": 58, "too": [58, 62], "hardwar": 58, "acceler": [58, 61], "faster": 58, "exactli": 58, "remind": 59, "privat": 59, "seen": 59, "everybodi": 59, "anybodi": 59, "els": 59, "got": 59, "twice": 60, "uncheck": 60, "deactiv": [60, 66], "disappear": 60, "whom": 60, "laboratori": 61, "abbrevi": 61, "lab": 61, "conduct": 61, "vera": 61, "environment": 61, "specimen": 61, "sampl": 61, "analysi": 61, "1015": 61, "big": 62, "global": [62, 72], "term": [62, 73], "ada": 62, "lovelac": 62, "da": 62, "love": 62, "unacc": 62, "lov\u0113": 62, "vice": 62, "versa": 62, "placehold": 62, "l": 62, "ce": 62, "me": 62, "dateless": 62, "criteria": 62, "1540": 62, "1560": 62, "1550": 62, "intend": 63, "support": [63, 69], "sometim": 63, "cach": 63, "rememb": 63, "firefox": 63, "haven": 63, "screenshot": 63, "explan": 64, "encount": 64, "let": 64, "know": 64, "read": [64, 73], "mayb": 64, "obsolet": 64, "keyboard": 66, "capslock": 66, "forgot": 66, "misspel": 66, "secur": 66, "attack": 66, "lock": 66, "few": [66, 72], "until": 66, "e41": 67, "appel": 67, "oa8": 68, "oa9": 68, "knew": 68, "1356": 68, "unsur": 68, "church": 68, "fist": 68, "decad": 68, "1800": 68, "1809": 68, "autocomplet": 68, "5": 68, "zero": 68, "leap": 68, "almost": 69, "cyril": 69, "mathemat": 69, "asterisk": [70, 72], "serv": 71, "quit": 72, "difficult": 72, "glanc": 73, "quickli": 73, "invert": 73, "cut": 73, "familiaris": 44, "wherev": 45, "cidoc_crm": 48}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"api": [0, 51], "arch": 1, "overview": [1, 50], "fetch": 1, "data": [1, 3, 30, 41, 42], "from": 1, "automat": 1, "creat": [1, 33, 35, 36, 38, 40], "entiti": [1, 3, 22, 48], "type": [1, 3, 8, 29, 40, 41, 48], "refer": [1, 8, 25, 26, 31, 36, 38, 49], "system": [1, 8, 26, 36, 38, 49], "content": 2, "integr": [3, 42], "check": [3, 20, 41], "orphan": 3, "without": 3, "link": [3, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 31, 33, 46], "miss": 3, "file": [3, 20, 31, 41, 49, 64], "iiif": [3, 7, 42], "annot": [3, 42, 55], "subunit": [3, 19, 21, 24, 28], "circular": 3, "depend": 3, "date": [3, 8, 39, 42, 48, 61, 68], "invalid": 3, "involv": 3, "preced": 3, "sub": 3, "duplic": 3, "similar": 3, "name": [3, 66, 72], "execut": 4, "sql": [4, 5], "prepar": [4, 8], "keep": 4, "mind": 4, "result": 4, "export": 5, "databas": [5, 53], "dump": 5, "csv": 5, "json": 5, "xml": 5, "gener": [6, 32, 35, 60], "authent": [6, 51], "import": [8, 15, 20, 57], "project": [8, 41], "class": [8, 44, 47], "possibl": 8, "field": [8, 14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 39, 41], "alia": [8, 67], "valu": [8, 29], "origin": 8, "wkt": [8, 57], "coordin": 8, "extern": 8, "place": [8, 24, 30, 36], "hierarchi": 8, "option": [8, 58], "after": 8, "admin": 9, "mail": 10, "map": [11, 36, 57], "modul": [12, 60], "present": 13, "site": [13, 30], "user": [14, 20, 41, 42, 43, 66], "form": [14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 70], "group": 14, "vocab": 15, "edit": 15, "show": 15, "vocabulari": 15, "actor": [16, 33], "can": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "via": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "tab": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29], "artifact": [17, 30, 31, 34], "event": [18, 31, 33, 34, 35], "acquisit": 18, "creation": [18, 31], "modif": 18, "move": [18, 33, 34, 35], "product": 18, "featur": [19, 30, 42], "super": [19, 21, 28], "public": [20, 41], "share": [20, 41], "set": 20, "logo": 20, "imag": [20, 42, 55], "preview": 20, "how": [20, 36, 39, 41], "make": [20, 29, 41], "avail": [20, 41], "criteria": [20, 41], "softwar": [20, 41], "manag": [20, 41, 42], "human": [21, 30], "remain": [21, 30], "administr": 24, "unit": [24, 28, 30], "histor": [24, 32], "ad": [24, 30, 33, 34, 41, 57], "multipl": [24, 31, 41], "citat": 25, "exampl": [25, 32], "includ": 26, "default": 26, "wikidata": 26, "geonam": [26, 36, 57], "gnd": 26, "usag": [26, 55], "id": 26, "precis": [26, 39], "configur": [26, 73], "sourc": [27, 34], "stratigraph": [28, 30], "anthropolog": [28, 42, 54], "analys": [28, 42, 54], "standard": 29, "custom": [29, 41], "requir": 29, "archaeolog": [30, 32], "new": [30, 31, 35, 36, 38, 40, 57], "an": [30, 31, 34, 40], "add": [31, 40], "creator": 31, "locat": [31, 33], "journei": 33, "letter": 34, "sender": 34, "recipi": 34, "instruct": 35, "us": 36, "profess": [37, 41], "time": [39, 48], "span": 39, "where": 39, "find": 39, "input": 39, "enter": [39, 41], "activ": [39, 66], "hour": 39, "minut": 39, "second": 39, "tree": 40, "exist": 40, "faq": 41, "case": [41, 58], "studi": 41, "instanc": 41, "doe": 41, "access": [41, 51], "work": 41, "why": 41, "t": 41, "free": 41, "text": 41, "longer": 41, "format": 41, "model": [42, 45], "interfac": [42, 43], "exchang": 42, "radiocarbon": [42, 48, 61], "openatla": [43, 47, 48], "manual": 43, "document": 43, "help": 43, "cidoc": 44, "crm": 44, "properti": 44, "checker": 46, "shortcut": 48, "oa7": 48, "ha": 48, "relationship": 48, "oa8": 48, "appear": 48, "first": 48, "oa9": 48, "last": 48, "e77": 48, "persist": [48, 63], "item": 48, "e21": 48, "person": 48, "e2": 48, "tempor": 48, "introduct": 51, "quick": 51, "start": 51, "guid": 51, "1": 51, "ui": 51, "2": 51, "url": 51, "get": 51, "version": [51, 63], "endpoint": 51, "paramet": 51, "error": [51, 63, 64], "handl": 51, "proxi": 51, "applic": 52, "structur": [52, 53], "sex": 54, "estim": 54, "tool": 56, "navig": [57, 58], "search": [57, 62], "geometri": 57, "overlai": 57, "network": 58, "visual": 58, "2d": 58, "3d": 58, "In": 58, "perform": 58, "issu": 58, "download": 58, "note": 59, "profil": 60, "chang": 60, "password": [60, 66], "displai": [60, 63], "browser": 63, "refresh": 63, "your": 63, "javascript": 63, "If": 63, "problem": 63, "code": 64, "403": 64, "forbidden": 64, "404": 64, "found": [64, 66], "418": 64, "i": [64, 66], "m": 64, "teapot": 64, "troubleshoot": 65, "login": 66, "wrong": 66, "No": 66, "thi": 66, "too": 66, "mani": 66, "attempt": 66, "descript": 69, "menu": 71, "tabl": 73}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"API": [[0, "api"], [51, "api"]], "ARCHE": [[1, "arche"]], "Overview": [[1, "overview"], [50, "overview"]], "Fetch": [[1, "fetch"]], "Data from ARCHE": [[1, "data-from-arche"]], "Automatically created entities": [[1, "automatically-created-entities"]], "Type": [[1, "entity-type"], [3, "type"], [29, "type"]], "Reference System": [[1, "entity-reference-system"], [26, "reference-system"]], "Entity": [[1, "entity-index"], [22, "entity"]], "Content": [[2, "content"]], "Data integrity checks": [[3, "data-integrity-checks"]], "Orphans": [[3, "orphans"], [3, "id1"]], "Entities without links": [[3, "entities-without-links"]], "Missing files": [[3, "missing-files"]], "Orphaned files": [[3, "orphaned-files"]], "Orphaned IIIF files": [[3, "orphaned-iiif-files"]], "Orphaned annotations": [[3, "orphaned-annotations"]], "Orphaned subunits": [[3, "orphaned-subunits"]], "Circular dependencies": [[3, "circular-dependencies"]], "Dates": [[3, "dates"], [8, "dates"], [48, "dates"]], "Invalid dates": [[3, "invalid-dates"]], "Invalid link dates": [[3, "invalid-link-dates"]], "Invalid involvement dates": [[3, "invalid-involvement-dates"]], "Invalid preceding dates": [[3, "invalid-preceding-dates"]], "Invalid sub dates": [[3, "invalid-sub-dates"]], "Check links": [[3, "check-links"]], "Check link duplicates": [[3, "check-link-duplicates"]], "Check similar names": [[3, "check-similar-names"]], "Execute SQL": [[4, "execute-sql"]], "Preparation": [[4, "preparation"], [8, "preparation"]], "Keep in mind": [[4, "keep-in-mind"]], "Result": [[4, "result"]], "Export": [[5, "export"]], "Export SQL": [[5, "export-sql"], [5, "id1"]], "Export database dump": [[5, "export-database-dump"]], "Export CSV": [[5, "export-csv"]], "Export JSON": [[5, "export-json"]], "Export XML": [[5, "export-xml"]], "General": [[6, "general"], [60, "general"], [32, "general"]], "Authentication": [[6, "authentication"]], "IIIF": [[7, "iiif"]], "Admin": [[9, "admin"]], "Mail": [[10, "mail"]], "Map": [[11, "map"], [57, "map"]], "Modules": [[12, "modules"], [60, "modules"]], "Presentation site": [[13, "presentation-site"]], "User": [[14, "user"]], "Form fields": [[14, "form-fields"], [16, "form-fields"], [17, "form-fields"], [19, "form-fields"], [21, "form-fields"], [24, "form-fields"], [25, "form-fields"], [27, "form-fields"], [28, "form-fields"], [18, "form-fields"], [20, "form-fields"], [29, "form-fields"]], "Groups": [[14, "groups"]], "Import": [[15, "import"], [8, "import"]], "Vocabs": [[15, "vocabs"]], "Edit": [[15, "edit"]], "Show vocabularies": [[15, "show-vocabularies"]], "Actor": [[16, "actor"]], "Can be linked via tabs to": [[16, "can-be-linked-via-tabs-to"], [17, "can-be-linked-via-tabs-to"], [19, "can-be-linked-via-tabs-to"], [21, "can-be-linked-via-tabs-to"], [24, "can-be-linked-via-tabs-to"], [25, "can-be-linked-via-tabs-to"], [27, "can-be-linked-via-tabs-to"], [28, "can-be-linked-via-tabs-to"], [18, "can-be-linked-via-tabs-to"], [20, "can-be-linked-via-tabs-to"], [29, "can-be-linked-via-tabs-to"]], "Artifact": [[17, "artifact"]], "Feature": [[19, "feature"]], "Super and subunits": [[19, "super-and-subunits"], [21, "super-and-subunits"], [28, "super-and-subunits"]], "Human remains": [[21, "human-remains"]], "Place": [[24, "place"]], "Administrative Unit": [[24, "administrative-unit"]], "Historical Place": [[24, "historical-place"]], "Places and their subunits": [[24, "places-and-their-subunits"]], "Adding multiple places": [[24, "adding-multiple-places"]], "Reference": [[25, "reference"]], "Citation example": [[25, "citation-example"]], "Included by default": [[26, "included-by-default"]], "Wikidata": [[26, "wikidata"]], "GeoNames": [[26, "geonames"], [57, "id1"]], "GND": [[26, "gnd"]], "Usage": [[26, "usage"], [55, "usage"]], "ID": [[26, "id"]], "Precision": [[26, "precision"]], "Configuration": [[26, "configuration"], [73, "configuration"]], "Source": [[27, "source"]], "Stratigraphic unit": [[28, "stratigraphic-unit"]], "Anthropological analyses": [[28, "anthropological-analyses"]], "How to make files available for the public": [[41, "how-to-make-files-available-for-the-public"], [20, "how-to-make-files-available-for-the-public"]], "Criteria checked by the software": [[41, "criteria-checked-by-the-software"], [20, "criteria-checked-by-the-software"]], "FAQ": [[41, "faq"]], "How to manage multiple projects or case studies": [[41, "how-to-manage-multiple-projects-or-case-studies"]], "Multiple instances": [[41, "multiple-instances"]], "Shared instance": [[41, "shared-instance"]], "How does data access work": [[41, "how-does-data-access-work"]], "How to enter professions": [[41, "how-to-enter-professions"]], "Criteria checked by users": [[41, "criteria-checked-by-users"]], "Why can\u2019t a free text field be added via custom types": [[41, "why-can-t-a-free-text-field-be-added-via-custom-types"]], "Why can\u2019t longer texts be formatted": [[41, "why-can-t-longer-texts-be-formatted"]], "Features": [[42, "features"]], "Model": [[42, "model"], [45, "model"]], "User Interface": [[42, "user-interface"]], "IIIF Integration": [[42, "iiif-integration"]], "Image Annotation": [[42, "image-annotation"]], "Data Exchange": [[42, "data-exchange"]], "User Management": [[42, "user-management"]], "Anthropological Analyses": [[42, "anthropological-analyses"], [54, "anthropological-analyses"]], "Radiocarbon Dating": [[42, "radiocarbon-dating"], [61, "radiocarbon-dating"]], "OpenAtlas manual": [[43, "openatlas-manual"]], "User interface": [[43, null]], "Documentation": [[43, null]], "Help": [[43, null]], "Introduction": [[51, "introduction"]], "Quick Start Guide": [[51, "quick-start-guide"]], "1. UI access": [[51, "ui-access"]], "2. URL / GET access": [[51, "url-get-access"]], "Versioning": [[51, "versioning"]], "Endpoints": [[51, "endpoints"]], "Parameters": [[51, "parameters"]], "Error handling": [[51, "error-handling"]], "Proxy": [[51, "proxy"]], "Authentication guide": [[51, "authentication-guide"]], "Application Structure": [[52, "application-structure"]], "Database Structure": [[53, "database-structure"]], "Sex Estimation": [[54, "sex-estimation"]], "Image annotation": [[55, "image-annotation"]], "Tools": [[56, "tools"]], "Navigation": [[57, "navigation"], [58, "navigation"]], "Search": [[57, "search"], [62, "search"]], "WKT import": [[57, "wkt-import"]], "Adding new geometries": [[57, "adding-new-geometries"]], "Map Overlay": [[57, "map-overlay"]], "Network visualization": [[58, "network-visualization"]], "2D": [[58, "d"]], "3D": [[58, "id1"]], "Options": [[58, "options"]], "In case of performance issues": [[58, "in-case-of-performance-issues"]], "Download": [[58, "download"]], "Notes": [[59, "notes"]], "Profile": [[60, "profile"]], "Change password": [[60, "change-password"]], "Display": [[60, "display"]], "Display Errors": [[63, "display-errors"]], "Browser Version": [[63, "browser-version"]], "Refresh your Browser": [[63, "refresh-your-browser"]], "JavaScript": [[63, "javascript"]], "If the problem persists": [[63, "if-the-problem-persists"]], "Error Codes": [[64, "error-codes"]], "403 - Forbidden": [[64, "forbidden"]], "404 - File not found": [[64, "file-not-found"]], "418 - I\u2019m a teapot": [[64, "im-a-teapot"]], "Troubleshooting": [[65, "troubleshooting"]], "Login": [[66, "login"]], "Wrong Password": [[66, "wrong-password"]], "No user with this name found.": [[66, "no-user-with-this-name-found"]], "This user is not activated.": [[66, "this-user-is-not-activated"]], "Too many login attempts.": [[66, "too-many-login-attempts"]], "Alias": [[67, "alias"], [8, "alias"]], "Date": [[68, "date"]], "Description": [[69, "description"]], "Form": [[70, "form"]], "Menu": [[71, "menu"]], "Name": [[72, "name"]], "Table": [[73, "table"]], "Project": [[8, "project"]], "Import class": [[8, "import-class"]], "Possible import fields": [[8, "possible-import-fields"]], "Types": [[8, "types"], [40, "types"]], "Value types": [[8, "value-types"], [29, "value-types"]], "References": [[8, "references"], [49, "references"], [49, "id1"]], "Origin references": [[8, "origin-references"]], "WKT coordinates": [[8, "wkt-coordinates"]], "External reference systems": [[8, "external-reference-systems"]], "Place hierarchy": [[8, "place-hierarchy"]], "Import options": [[8, "import-options"]], "After the import": [[8, "after-the-import"]], "Event": [[18, "event"]], "Acquisition": [[18, "acquisition"]], "Creation": [[18, "creation"]], "Modification": [[18, "modification"]], "Move": [[18, "move"]], "Production": [[18, "production"]], "File": [[20, "file"]], "Form fields important for public sharing": [[20, "form-fields-important-for-public-sharing"]], "Settings": [[20, "settings"]], "Logo": [[20, "logo"]], "Image preview": [[20, "image-preview"]], "Criteria checked by managers and users": [[20, "criteria-checked-by-managers-and-users"]], "Standard types": [[29, "standard-types"]], "Custom types": [[29, "custom-types"]], "Making types required": [[29, "making-types-required"]], "Archaeological data": [[30, "archaeological-data"]], "Adding a new place": [[30, "adding-a-new-place"]], "Adding a feature to the site": [[30, "adding-a-feature-to-the-site"]], "Adding a stratigraphic unit to the feature": [[30, "adding-a-stratigraphic-unit-to-the-feature"]], "Adding an artifact to the stratigraphic unit": [[30, "adding-an-artifact-to-the-stratigraphic-unit"]], "Adding human remains to the stratigraphic unit": [[30, "adding-human-remains-to-the-stratigraphic-unit"]], "Artifacts": [[31, "artifacts"]], "Add a new artifact": [[31, "add-a-new-artifact"]], "Add a reference to the artifact": [[31, "add-a-reference-to-the-artifact"]], "Add a file to the artifact": [[31, "add-a-file-to-the-artifact"]], "Link a creation event": [[31, "link-a-creation-event"]], "Add a creator to the creation event": [[31, "add-a-creator-to-the-creation-event"]], "Add multiple locations to an artifact": [[31, "add-multiple-locations-to-an-artifact"]], "Examples": [[32, "examples"]], "Archaeological": [[32, "archaeological"]], "Historical": [[32, "historical"]], "Journey": [[33, "journey"]], "Adding actors": [[33, "adding-actors"]], "Adding locations": [[33, "adding-locations"]], "Creating the move event": [[33, "creating-the-move-event"]], "Link actors to the journey": [[33, "link-actors-to-the-journey"]], "Letters": [[34, "letters"]], "Adding an artifact": [[34, "adding-an-artifact"]], "Adding a source": [[34, "adding-a-source"]], "Adding the move event": [[34, "adding-the-move-event"]], "Adding sender and recipient": [[34, "adding-sender-and-recipient"]], "Move events": [[35, "move-events"]], "Create a new move event - general instruction": [[35, "create-a-new-move-event-general-instruction"]], "Places": [[36, "places"]], "Create a new place": [[36, "create-a-new-place"]], "How to use the map": [[36, "how-to-use-the-map"]], "Reference Systems - GeoNames": [[36, "reference-systems-geonames"]], "Profession": [[37, "profession"]], "References Systems": [[38, "references-systems"]], "Create a new reference system": [[38, "create-a-new-reference-system"]], "Time Spans": [[39, "time-spans"]], "Where to find the input fields": [[39, "where-to-find-the-input-fields"]], "How to enter dates and time spans": [[39, "how-to-enter-dates-and-time-spans"]], "Precise dates": [[39, "precise-dates"]], "Time spans": [[39, "id1"]], "Activate hours, minutes, and seconds": [[39, "activate-hours-minutes-and-seconds"]], "Create a new type tree": [[40, "create-a-new-type-tree"]], "Add a type to an existing type tree": [[40, "add-a-type-to-an-existing-type-tree"]], "Link checker": [[46, "link-checker"]], "OpenAtlas shortcuts": [[48, "openatlas-shortcuts"]], "OA7 - has relationship to": [[48, "oa7-has-relationship-to"]], "OA8 - appears for the first time in": [[48, "oa8-appears-for-the-first-time-in"]], "OA9 - appears for the last time in": [[48, "oa9-appears-for-the-last-time-in"]], "E77 - Persistent Item": [[48, "e77-persistent-item"]], "E21 Person": [[48, "e21-person"]], "E2 Temporal Entity": [[48, "e2-temporal-entity"]], "Radiocarbon dating type": [[48, "radiocarbon-dating-type"]], "Reference Systems": [[49, "reference-systems"]], "References and Files": [[49, "references-and-files"]], "CIDOC CRM": [[44, "cidoc-crm"]], "CIDOC classes": [[44, "cidoc-classes"]], "CIDOC Properties": [[44, "cidoc-properties"]], "OpenAtlas classes": [[47, "openatlas-classes"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["admin/api", "admin/arche", "admin/content", "admin/data_integrity_checks", "admin/execute_sql", "admin/export", "admin/general", "admin/iiif", "admin/import", "admin/index", "admin/mail", "admin/map", "admin/modules", "admin/presentation_site", "admin/user", "admin/vocabs", "entity/actor", "entity/artifact", "entity/event", "entity/feature", "entity/file", "entity/human_remains", "entity/index", "entity/navigation", "entity/place", "entity/reference", "entity/reference_system", "entity/source", "entity/stratigraphic_unit", "entity/type", "examples/archaeological_data", "examples/artifacts", "examples/index", "examples/journey", "examples/letters", "examples/move_event", "examples/places", "examples/profession", "examples/reference_systems", "examples/time_spans", "examples/types", "faq", "features", "index", "model/cidoc_crm", "model/index", "model/link_checker", "model/openatlas_classes", "model/openatlas_shortcuts", "model/references", "overview", "technical/api", "technical/application_structure", "technical/database_structure", "tools/anthropological_analyses", "tools/image_annotation", "tools/index", "tools/map", "tools/network", "tools/notes", "tools/profile", "tools/radiocarbon_dating", "tools/search", "troubleshooting/display", "troubleshooting/error_codes", "troubleshooting/index", "troubleshooting/login", "ui/alias", "ui/date", "ui/description", "ui/form", "ui/menu", "ui/name", "ui/table"], "filenames": ["admin/api.rst", "admin/arche.rst", "admin/content.rst", "admin/data_integrity_checks.rst", "admin/execute_sql.rst", "admin/export.rst", "admin/general.rst", "admin/iiif.rst", "admin/import.rst", "admin/index.rst", "admin/mail.rst", "admin/map.rst", "admin/modules.rst", "admin/presentation_site.rst", "admin/user.rst", "admin/vocabs.rst", "entity/actor.rst", "entity/artifact.rst", "entity/event.rst", "entity/feature.rst", "entity/file.rst", "entity/human_remains.rst", "entity/index.rst", "entity/navigation.rst", "entity/place.rst", "entity/reference.rst", "entity/reference_system.rst", "entity/source.rst", "entity/stratigraphic_unit.rst", "entity/type.rst", "examples/archaeological_data.rst", "examples/artifacts.rst", "examples/index.rst", "examples/journey.rst", "examples/letters.rst", "examples/move_event.rst", "examples/places.rst", "examples/profession.rst", "examples/reference_systems.rst", "examples/time_spans.rst", "examples/types.rst", "faq.rst", "features.rst", "index.rst", "model/cidoc_crm.rst", "model/index.rst", "model/link_checker.rst", "model/openatlas_classes.rst", "model/openatlas_shortcuts.rst", "model/references.rst", "overview.rst", "technical/api.rst", "technical/application_structure.rst", "technical/database_structure.rst", "tools/anthropological_analyses.rst", "tools/image_annotation.rst", "tools/index.rst", "tools/map.rst", "tools/network.rst", "tools/notes.rst", "tools/profile.rst", "tools/radiocarbon_dating.rst", "tools/search.rst", "troubleshooting/display.rst", "troubleshooting/error_codes.rst", "troubleshooting/index.rst", "troubleshooting/login.rst", "ui/alias.rst", "ui/date.rst", "ui/description.rst", "ui/form.rst", "ui/menu.rst", "ui/name.rst", "ui/table.rst"], "titles": ["API", "ARCHE", "Content", "Data integrity checks", "Execute SQL", "Export", "General", "IIIF", "Import", "Admin", "Mail", "Map", "Modules", "Presentation site", "User", "Vocabs", "Actor", "Artifact", "Event", "Feature", "File", "Human remains", "Entity", "<no title>", "Place", "Reference", "Reference System", "Source", "Stratigraphic unit", "Type", "Archaeological data", "Artifacts", "Examples", "Journey", "Letters", "Move events", "Places", "Profession", "References Systems", "Time Spans", "Types", "FAQ", "Features", "OpenAtlas manual", "CIDOC CRM", "Model", "Link checker", "OpenAtlas classes", "OpenAtlas shortcuts", "References", "Overview", "API", "Application Structure", "Database Structure", "Anthropological Analyses", "Image annotation", "Tools", "Map", "Network visualization", "Notes", "Profile", "Radiocarbon Dating", "Search", "Display Errors", "Error Codes", "Troubleshooting", "Login", "Alias", "Date", "Description", "Form", "Menu", "Name", "Table"], "terms": {"descript": [0, 1, 8, 12, 16, 17, 18, 19, 20, 21, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 41, 44, 48, 49, 51, 55, 57, 62, 70, 73], "public": [0, 7, 26, 43, 49, 51, 53, 59], "default": [0, 3, 6, 7, 8, 11, 12, 14, 15, 20, 29, 38, 39, 52, 57, 58, 59, 60], "off": [0, 73], "If": [0, 1, 3, 4, 8, 13, 15, 17, 20, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 49, 51, 57, 58, 62, 66, 68], "turn": [0, 39, 66, 68], "file": [0, 1, 5, 7, 8, 9, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 35, 42, 43, 47, 52, 55, 57, 60], "licens": [0, 1, 20, 26, 41], "can": [0, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 22, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 71, 73], "still": [0, 18, 41, 51, 60], "access": [0, 4, 7, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 40, 42, 43, 46, 54, 60, 61, 64], "A": [0, 1, 3, 4, 5, 13, 15, 16, 17, 19, 20, 21, 24, 26, 28, 29, 30, 31, 35, 36, 40, 41, 44, 49, 50, 51, 52, 63, 69], "browser": [0, 6, 20, 51, 52, 58], "us": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 62, 63, 64, 67, 68, 69, 70, 72, 73], "b": 0, "log": [0, 2, 6, 14, 50, 60, 63], "user": [0, 1, 3, 5, 6, 8, 9, 10, 12, 15, 26, 29, 30, 33, 34, 35, 36, 38, 40, 44, 45, 47, 49, 51, 52, 53, 59, 60, 64, 71], "ip": 0, "request": [0, 6, 51, 64, 66], "comput": [0, 20], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 68, 72], "whitelist": 0, "link": [0, 1, 2, 5, 8, 9, 13, 15, 22, 26, 30, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 48, 49, 50, 51, 53, 55, 57, 58, 60, 63, 64, 66, 71], "without": [0, 7, 8, 9, 10, 18, 36, 41, 44, 45, 51, 58, 62], "being": [0, 26, 41], "thi": [0, 3, 4, 5, 7, 8, 13, 14, 16, 17, 18, 20, 22, 24, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51, 52, 54, 55, 57, 58, 61, 62, 63, 64, 65, 68], "might": [0, 3, 4, 16, 29, 35, 39, 41], "you": [0, 3, 4, 7, 8, 11, 12, 14, 15, 20, 22, 24, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 52, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 71, 73], "want": [0, 3, 8, 29, 30, 31, 39, 40, 41, 58], "allow": [0, 3, 6, 15, 18, 20, 39, 41, 42, 51, 55, 62, 72], "other": [0, 3, 8, 14, 16, 18, 20, 24, 26, 30, 31, 33, 35, 36, 38, 41, 42, 51, 52, 58, 59, 60], "system": [0, 5, 9, 14, 16, 17, 18, 21, 22, 24, 29, 32, 41, 42, 43, 44, 45, 53, 68, 69], "your": [0, 1, 3, 4, 8, 20, 32, 35, 36, 38, 39, 41, 44, 50, 51, 57, 58, 59, 60, 64, 66, 73], "data": [0, 4, 5, 8, 9, 14, 19, 21, 22, 24, 26, 28, 29, 32, 33, 34, 35, 36, 38, 39, 40, 43, 44, 45, 51, 53, 57, 58, 59, 61, 62, 69, 70], "restrict": [0, 39, 41, 64], "resourc": [1, 38, 49], "centr": 1, "human": [1, 8, 16, 17, 18, 22, 24, 28, 31, 42, 43, 44, 47, 51, 54], "servic": [1, 15, 26, 42], "aim": 1, "offer": [1, 8, 42, 55], "stabl": [1, 47, 51], "persist": [1, 47], "host": [1, 10, 26], "well": [1, 21, 24, 30, 36, 39, 40, 41, 42, 44, 45, 47, 48, 71], "dissemin": 1, "digit": [1, 7, 22, 39, 42, 44, 49], "research": [1, 29, 42, 61], "In": [1, 3, 5, 7, 14, 19, 20, 21, 24, 25, 28, 30, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 49, 51, 54, 55, 56, 61, 63, 65], "order": [1, 15, 30, 33, 35, 42, 48, 49], "import": [1, 3, 9, 14, 34, 36, 41, 42, 43, 44, 45, 52, 53, 56, 60, 72], "openatla": [1, 3, 5, 7, 8, 13, 15, 18, 19, 20, 21, 24, 26, 28, 29, 30, 35, 37, 38, 41, 42, 44, 45, 46, 49, 51, 52, 53, 63, 68], "chang": [1, 6, 10, 18, 20, 26, 29, 30, 31, 33, 36, 40, 41, 51, 56, 57, 58], "instanc": [1, 7, 8, 10, 15, 20, 29, 38, 42, 44, 46, 48, 51, 52, 53], "product": [1, 10, 15, 17, 20, 21, 31, 51, 54], "py": [1, 10, 15, 20, 51, 52], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, 64, 66, 68, 69, 70, 72, 73], "need": [1, 15, 29, 31, 41, 45, 47, 49, 51, 52, 57], "ask": [1, 22, 41], "administr": [1, 8, 36], "further": [1, 8, 30, 31, 34, 36, 38, 40, 47, 51, 57], "detail": [1, 3, 6, 8, 13, 14, 16, 17, 18, 20, 22, 23, 24, 25, 26, 27, 29, 40, 41, 42, 44, 45, 51, 52, 55, 58, 68], "id": [1, 8, 13, 36, 38, 49, 51, 57, 61, 64], "0": [1, 39, 41, 51, 54, 68], "top": [1, 2, 15, 41, 44, 49, 57, 58, 60, 63, 71, 73], "collect": [1, 15, 39], "project": [1, 3, 9, 13, 20, 26, 32, 39, 40, 42, 43, 53, 60, 66], "acdh": [1, 15], "topcollect": 1, "url": [1, 7, 11, 13, 15, 20, 25, 26, 38, 41, 44, 49, 52], "http": [1, 7, 13, 15, 26, 38, 51], "curat": 1, "dev": 1, "oeaw": 1, "ac": 1, "base": [1, 15, 21, 26, 36, 38, 42, 45, 48, 51, 53, 57, 68], "get": [1, 7, 8, 33, 36, 37, 38, 59, 66], "The": [1, 3, 5, 7, 8, 10, 16, 18, 20, 22, 24, 26, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 64, 71, 72], "button": [1, 3, 5, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 51, 54, 55, 57, 58, 60, 61, 66, 71, 73], "displai": [1, 2, 3, 4, 6, 8, 10, 13, 14, 15, 20, 25, 26, 29, 36, 38, 40, 43, 44, 45, 47, 50, 51, 52, 56, 59, 61, 65, 73], "admin": [1, 4, 5, 8, 13, 14, 15, 20, 26, 38, 43, 51, 57, 59, 60], "menu": [1, 7, 20, 22, 27, 29, 30, 31, 33, 34, 35, 36, 40], "onli": [1, 3, 4, 6, 7, 8, 14, 15, 16, 19, 20, 26, 29, 38, 39, 40, 41, 45, 48, 51, 55, 57, 58, 59, 61, 62, 64, 68], "mention": [1, 16, 17, 20, 21, 30], "abov": [1, 3, 31, 35, 42, 60, 63], "made": [1, 10, 17, 31, 33, 36, 40, 41, 47, 52], "click": [1, 3, 4, 5, 14, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 46, 50, 54, 55, 57, 60, 66, 68, 73], "section": [1, 39, 51], "provid": [1, 7, 8, 15, 20, 25, 26, 39, 41, 45, 51, 54, 60, 61, 62, 63, 64], "part": [1, 3, 17, 18, 19, 21, 27, 28, 33, 39, 41, 49, 55, 59], "manag": [1, 5, 8, 14, 15, 26, 29, 38, 43, 52, 59, 60, 66, 68], "group": [1, 8, 9, 15, 16, 17, 18, 21, 26, 29, 31, 33, 35, 36, 37, 38, 40, 41, 42, 53, 55, 64], "list": [1, 3, 5, 8, 16, 17, 18, 20, 23, 24, 25, 26, 27, 30, 31, 33, 34, 35, 36, 38, 41, 42, 49, 50, 51, 55], "tabl": [1, 6, 8, 14, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 42, 48, 49, 50, 60, 72], "artifact": [1, 3, 8, 15, 16, 18, 21, 22, 24, 27, 28, 29, 32, 33, 35, 39, 40, 43, 55, 71], "wa": [1, 8, 16, 17, 18, 22, 29, 31, 35, 36, 39, 48, 51, 52, 55, 60, 66, 68], "shown": [1, 3, 4, 5, 8, 13, 20, 25, 26, 29, 36, 38, 41, 58, 60, 68], "all": [1, 5, 8, 10, 11, 14, 15, 20, 29, 30, 31, 33, 34, 36, 38, 39, 40, 41, 44, 45, 47, 48, 49, 51, 52, 60, 63, 69], "metadata": 1, "gather": 1, "exif": 1, "endpoint": [1, 15, 43], "first": [1, 3, 4, 8, 10, 20, 21, 22, 30, 31, 36, 39, 42, 68], "imag": [1, 6, 7, 18, 30, 31, 41, 43, 49, 52, 53, 56, 57, 58, 60], "2_jpg": 1, "addition": [1, 35, 62], "correspond": [1, 3, 7, 8, 26, 29, 36, 38, 39, 47, 60], "png": [1, 7, 20, 58], "4_orthophoto": 1, "taken": [1, 48], "necessari": [1, 20, 29, 30, 38, 40, 41, 49, 61], "new": [1, 8, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 29, 33, 34, 37, 41, 55, 56, 60, 66], "person": [1, 3, 4, 8, 16, 17, 18, 21, 22, 26, 31, 33, 34, 35, 37, 41, 42, 49, 55, 59, 60, 62], "etc": [1, 3, 6, 19, 21, 24, 28, 30, 37, 49, 51, 52, 71], "ad": [1, 14, 15, 18, 21, 26, 29, 31, 35, 38, 39, 40, 43, 51, 55, 56, 59, 61, 62], "dure": [1, 3, 18, 25, 31, 45], "process": [1, 5, 6, 8, 20, 41, 52], "custom": [1, 5, 8, 14, 15, 20, 30, 40, 43], "hierarchi": [1, 5, 9, 15, 18, 24], "relev": [1, 30], "actor": [1, 17, 18, 20, 21, 22, 24, 25, 27, 29, 31, 34, 35, 37, 39, 43, 44, 48, 60, 67, 68], "e21": [1, 16, 49], "involv": [1, 9, 18, 30, 31, 33, 34], "e65": [1, 18], "creation": [1, 6, 30, 34, 38, 40], "p": [1, 44], "cidoc_ent": 1, "e12": [1, 18, 48], "event": [1, 3, 16, 17, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 32, 39, 43, 48], "addit": [1, 14, 30, 33, 36, 38, 39, 41, 42, 45, 51, 54, 59, 68, 69], "copyright": [1, 49], "name": [1, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 44, 47, 48, 49, 60, 62, 70, 73], "e22": [1, 17, 48], "object": [1, 7, 17, 21, 27, 31, 34, 36, 42, 45, 47, 49, 57], "graffito": 1, "iptc": 1, "objectnam": 1, "xmp": 1, "p67": [1, 49], "e32": [1, 26, 49], "e53": [1, 24, 48], "place": [1, 3, 9, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31, 32, 33, 34, 35, 39, 40, 41, 42, 43, 44, 47, 48, 49, 51, 57, 60, 62, 63, 67, 71], "locat": [1, 16, 18, 19, 24, 34, 35, 36, 42, 44, 51, 52, 57, 66], "p53": 1, "gpslatitud": 1, "gpslongitud": 1, "date": [1, 5, 9, 14, 16, 17, 18, 19, 21, 24, 28, 29, 30, 31, 33, 34, 35, 36, 37, 40, 43, 56, 60, 62, 63, 70], "created": 1, "p11": [1, 44, 48], "p108": 1, "p14": 1, "p92": [1, 48], "e31": [1, 20, 25, 47, 49], "document": [1, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33, 47, 48, 49, 51, 67, 69], "p2": [1, 44, 48], "artist": 1, "cutomis": 2, "text": [2, 5, 8, 14, 25, 27, 29, 31, 33, 34, 35, 36, 38, 39, 40, 43, 55, 57, 62, 68], "avail": [2, 4, 5, 7, 8, 12, 15, 16, 26, 30, 34, 35, 36, 37, 38, 40, 42, 43, 44, 45, 47, 49, 51, 57, 58, 62, 73], "languag": [2, 6, 15, 36, 60, 71], "intro": 2, "start": [2, 3, 5, 8, 18, 26, 33, 34, 35, 36, 38, 39, 43, 45, 63, 71], "page": [2, 4, 8, 12, 13, 16, 17, 18, 20, 23, 24, 25, 26, 27, 31, 35, 38, 39, 40, 45, 46, 49, 50, 51, 54, 58, 60, 63, 64, 71, 73], "befor": [2, 3, 8, 29, 30, 34, 39, 51, 58, 68], "contact": [2, 10, 66], "site": [2, 6, 9, 19, 20, 31, 41, 43, 51, 55, 59, 60, 63, 64], "e": [2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 49, 51, 52, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "g": [2, 3, 4, 5, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 51, 52, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "inform": [2, 3, 6, 8, 14, 17, 18, 20, 21, 22, 24, 26, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 54, 57, 60, 61, 68, 69], "websit": [2, 13, 25, 26, 38, 43, 52, 53], "maintain": [2, 42, 45], "legal": 2, "notic": [2, 6, 45, 51], "about": [2, 4, 8, 14, 26, 35, 36, 41, 43, 68], "institut": [2, 16, 37], "citat": [2, 16, 17, 18, 19, 30], "exampl": [2, 3, 5, 8, 10, 13, 16, 18, 21, 22, 24, 26, 27, 28, 29, 31, 34, 35, 36, 38, 39, 42, 43, 47, 48, 49, 51, 52, 57, 68], "underneath": 2, "form": [2, 9, 10, 26, 33, 35, 36, 37, 38, 39, 40, 41, 45, 47, 51, 52, 55, 60, 61, 68], "field": [2, 9, 26, 31, 36, 37, 38, 40, 42, 43, 48, 55, 57, 60, 61, 68, 70, 71, 72, 73], "an": [2, 3, 4, 5, 6, 7, 8, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 35, 36, 37, 38, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 55, 57, 58, 59, 60, 61, 64, 68, 70, 72], "insert": [2, 4, 14, 25, 30, 31, 33, 34, 35, 36, 38, 40, 57, 60], "updat": [2, 3, 4, 8, 14, 25, 26, 29, 57, 60], "edit": [2, 9, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 36, 37, 38, 39, 40, 42, 45, 47, 55, 60, 61, 62, 64], "bibliographi": [2, 25, 31, 47, 49], "entri": [2, 3, 8, 14, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 50, 58, 60, 70, 72, 73], "cogwheel": 2, "icon": [2, 20, 26, 29, 57, 60], "right": [2, 8, 29, 49, 57, 58, 60, 71, 72, 73], "corner": [2, 57, 71], "thei": [2, 3, 8, 18, 20, 21, 26, 28, 29, 33, 34, 40, 41, 44, 47, 49, 51, 54, 57, 59, 62, 63, 72], "contain": [2, 5, 8, 26, 28, 49, 52, 62, 71, 73], "put": [3, 33, 38, 39, 41, 45], "great": 3, "emphasi": [3, 42, 45], "qualiti": [3, 7, 29, 42], "even": [3, 8, 60, 62], "respons": [3, 20, 41, 51], "enter": [3, 6, 8, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 42, 43, 50, 51, 55, 57, 60, 66, 68], "ultim": 3, "li": [3, 39], "individu": [3, 21, 30, 54], "avoid": [3, 41, 47], "inconsist": 3, "technic": [3, 41, 44], "level": [3, 6, 11, 14, 30, 42, 49, 58, 60, 61], "develop": [3, 20, 41, 42, 43, 44, 45, 51], "applic": [3, 4, 26, 31, 38, 40, 42, 43, 45, 47, 51, 57], "It": [3, 8, 18, 20, 24, 26, 28, 29, 31, 33, 34, 35, 39, 41, 44, 45, 62, 63, 71, 72], "therefor": [3, 18, 20, 26, 29, 31, 41, 45, 47, 54], "possibl": [3, 9, 18, 20, 24, 28, 29, 31, 33, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 49, 51, 54, 57, 61, 71], "after": [3, 4, 6, 9, 10, 20, 31, 34, 35, 36, 40, 51, 57, 61, 63, 66], "end": [3, 8, 13, 16, 33, 34, 35, 36, 39, 44, 48, 51, 62, 68], "same": [3, 8, 19, 21, 28, 32, 33, 34, 37, 41, 47, 48], "nevertheless": [3, 44], "mistak": [3, 66], "happen": [3, 18, 33, 45, 68], "also": [3, 8, 10, 20, 26, 30, 31, 33, 36, 38, 39, 40, 41, 42, 44, 46, 48, 55, 58, 62, 66, 71], "when": [3, 5, 8, 14, 20, 26, 29, 31, 34, 36, 38, 40, 41, 50, 51, 57, 58, 59, 60, 62, 66, 68], "from": [3, 8, 9, 10, 15, 18, 20, 22, 26, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 49, 51, 52, 54, 57, 60, 62, 68], "delet": [3, 4, 5, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 36, 55, 59], "outsid": 3, "function": [3, 4, 8, 10, 11, 26, 36, 37, 42, 49, 52, 53], "were": [3, 6, 18, 20, 29, 33, 47, 54, 60], "implement": [3, 41, 42, 49], "describ": [3, 30, 31, 33, 34, 36, 37, 51], "below": [3, 4, 14, 24, 30, 31, 37, 42, 52, 55, 66, 73], "here": [3, 8, 12, 18, 26, 29, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 52, 55, 60, 63, 64, 65, 68], "unlink": 3, "These": [3, 7, 29, 33, 42, 44, 47, 48, 54], "so": [3, 4, 8, 20, 22, 30, 31, 36, 39, 41, 44, 47, 51, 52, 58, 68], "call": [3, 19, 41, 47, 51, 52, 54], "could": [3, 38, 41, 68, 72], "result": [3, 5, 9, 13, 37, 41, 42, 51, 54, 57, 58, 61, 62, 68], "bug": [3, 63, 64], "seem": 3, "appear": [3, 5, 29, 38, 54], "regularli": 3, "known": [3, 8, 31, 36, 39, 42, 57], "pleas": [3, 8, 15, 18, 20, 21, 24, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 51, 57, 63, 64, 65, 66], "report": [3, 63, 65], "issu": [3, 51, 56, 65], "team": [3, 20, 32, 41, 44], "via": [3, 8, 12, 30, 33, 35, 36, 37, 39, 42, 43, 45, 48, 49, 51, 53, 54, 55], "redmin": [3, 43], "have": [3, 6, 7, 8, 13, 18, 20, 24, 26, 29, 30, 31, 33, 34, 38, 39, 40, 41, 44, 49, 57, 60, 62, 63, 64], "relat": [3, 16, 18, 20, 33, 36, 42, 44, 52, 53, 66], "Of": [3, 41], "cours": [3, 22, 41, 57], "normal": [3, 44], "set": [3, 6, 7, 8, 10, 12, 14, 26, 29, 32, 36, 38, 41, 42, 51, 53, 57, 58, 59, 62, 66, 71], "should": [3, 7, 8, 20, 29, 34, 38, 39, 51, 58, 63], "correct": [3, 8, 20, 36, 41, 51], "accid": 3, "creat": [3, 4, 5, 7, 8, 9, 13, 14, 17, 18, 22, 24, 26, 28, 29, 30, 31, 34, 37, 41, 47, 49, 51, 57, 60, 62, 68], "associ": [3, 8, 14, 24], "been": [3, 7, 36, 44], "pre": [3, 26, 29], "instal": [3, 7, 26, 29, 41, 52], "never": 3, "most": [3, 18, 22, 41, 49, 51, 52, 66, 68], "like": [3, 8, 13, 22, 24, 29, 40, 41, 49, 54, 63, 69], "caus": [3, 8], "dataset": [3, 26, 49], "themselv": [3, 19, 28, 44], "There": [3, 8, 40, 41, 44, 60, 63, 69], "three": 3, "option": [3, 7, 9, 14, 20, 26, 29, 31, 36, 41, 56, 57, 60, 62, 69], "proce": [3, 8, 66], "relink": 3, "add": [3, 7, 8, 14, 16, 17, 18, 19, 25, 26, 27, 29, 30, 33, 34, 35, 36, 37, 38, 39, 41, 51, 59, 60, 61, 69], "between": [3, 18, 31, 33, 39, 40, 45, 47, 48, 49, 54, 58], "remov": [3, 26], "whole": [3, 8, 27, 49], "featur": [3, 4, 8, 11, 17, 21, 22, 24, 26, 28, 29, 31, 39, 43, 47, 54, 55, 60, 63], "connect": [3, 24, 28, 30, 31, 37, 39, 41, 44, 46, 48, 49, 51, 57, 58], "itself": [3, 21, 28, 30, 39, 41, 49], "ha": [3, 4, 6, 7, 8, 15, 20, 24, 26, 30, 31, 36, 41, 44, 51, 58], "marri": [3, 16], "themself": 3, "super": [3, 8, 17, 29, 40, 44], "shouldn": [3, 64], "t": [3, 4, 5, 8, 14, 18, 20, 43, 44, 49, 55, 59, 63, 64, 65, 66, 68, 72], "within": [3, 8, 15, 17, 26, 32, 37, 39, 42, 44, 45, 47, 57], "": [3, 4, 5, 13, 18, 24, 28, 29, 30, 31, 33, 38, 40, 41, 42, 47, 48, 52, 53, 54, 72], "databas": [3, 4, 8, 9, 19, 21, 26, 28, 30, 31, 33, 35, 38, 41, 42, 43, 44, 45, 49, 52, 68], "through": [3, 8, 18, 20, 26, 44, 51], "find": [3, 8, 21, 26, 32, 35, 36, 40, 41, 42, 43, 45, 52, 62, 65, 68, 71, 72], "previou": [3, 51], "view": [3, 6, 8, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 34, 36, 37, 45, 51, 52, 55, 57, 58, 59, 60], "variou": [3, 24, 26, 30, 35, 36, 42, 49], "tab": [3, 6, 7, 26, 30, 31, 33, 34, 35, 37, 51, 55, 57, 59], "combin": [3, 8, 26, 38, 42, 44, 48, 49, 57], "begin": [3, 4, 5, 8, 16, 31, 34, 39, 48, 62, 68], "That": 3, "later": [3, 8, 30, 31, 41], "than": [3, 8, 24, 31, 41, 58], "fix": [3, 4, 8, 51, 63], "otherwis": 3, "interfac": [3, 29, 30, 45, 47, 51, 60, 64, 71], "won": [3, 8, 20, 41, 59], "soon": 3, "incompat": 3, "particip": [3, 16, 18, 22, 31, 33, 44, 48], "longer": [3, 43], "last": [3, 4, 14, 36, 62], "chain": 3, "succeed": 3, "show": [3, 8, 9, 20, 26, 36, 39, 41, 45, 51, 58, 59, 60, 62, 63, 66, 68, 73], "hierarch": [3, 29, 40], "began": 3, "everi": [3, 4, 7, 29, 30, 41], "its": [3, 17, 24, 29, 30, 34, 39, 40, 44, 45, 51, 57, 58], "cidoc": [3, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 33, 42, 43, 45, 46, 47, 48, 52, 53, 60, 67, 68, 69], "valid": [3, 6, 8, 15, 26, 42, 45, 46, 48, 51, 57, 68], "amount": [3, 60, 61, 73], "take": [3, 4, 5, 8, 18, 44, 54], "some": [3, 4, 5, 26, 29, 32, 38, 39, 41, 44, 45, 52, 57, 58, 63, 64], "time": [3, 4, 5, 8, 20, 31, 32, 33, 34, 41, 44, 51, 60, 62, 68, 73], "while": [3, 25, 42, 45, 47, 49, 51, 54], "alwai": [3, 8], "conform": [3, 45], "found": [3, 8, 24, 29, 31, 35, 36, 38, 39, 40, 44, 45, 47, 51, 62, 71], "problem": [3, 8, 24, 41, 65, 66], "resolv": [3, 13, 26, 38, 48, 49, 52], "origin": [3, 9, 49, 60], "sourc": [3, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 35, 39, 43, 45, 47, 49, 51, 52, 71], "two": [3, 8, 39, 41, 48, 51], "test": [3, 4, 7, 10, 51, 52], "ident": 3, "afterward": [3, 29, 30, 33], "case": [3, 4, 7, 8, 18, 20, 25, 29, 30, 31, 33, 36, 39, 43, 49, 51, 52, 56, 59, 60, 62, 63, 65, 66], "singl": [3, 15, 16, 29, 40, 51], "multipl": [3, 4, 7, 8, 15, 20, 29, 30, 33, 36, 40, 42, 43, 49, 73], "castl": 3, "citi": [3, 24, 26], "one": [3, 4, 8, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 41, 48, 51, 58, 60, 62, 68, 72], "would": [3, 8, 13, 19, 24, 26, 30, 31, 34, 41, 63], "automat": [3, 4, 6, 8, 9, 20, 26, 41, 44, 45, 66, 68], "anyon": [3, 45], "given": [3, 8, 15, 18, 39, 42, 51, 54, 61], "look": [3, 8, 13, 18, 24, 26, 33, 35, 41], "wrong": 3, "ones": [3, 33, 36, 37, 60], "next": [3, 22, 30, 40], "column": [3, 8, 57], "By": [3, 26, 30, 31, 35, 36, 39, 40, 51, 57], "due": [3, 39, 42, 44], "reoccur": 3, "search": [3, 6, 8, 26, 36, 42, 43, 51, 56, 69, 71, 72, 73], "select": [3, 4, 7, 8, 15, 18, 20, 26, 29, 30, 31, 34, 35, 36, 38, 39, 44, 51, 55, 58, 60, 62], "volum": 3, "follow": [3, 5, 7, 8, 13, 18, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 44, 49, 50, 51, 52, 53, 54, 57, 61], "class": [3, 5, 9, 15, 26, 29, 38, 40, 41, 43, 45, 46, 48, 49, 52, 53, 58, 60, 62], "ratio": [3, 54], "how": [3, 6, 11, 26, 29, 30, 31, 33, 34, 35, 37, 43, 44, 47, 52, 60], "100": [3, 36, 39], "mean": [3, 34, 41, 57], "fuzzywuzzi": 3, "packag": 3, "which": [3, 7, 8, 11, 15, 16, 17, 18, 21, 24, 25, 28, 29, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 49, 51, 52, 55, 57, 58, 62, 63, 66, 68, 71, 72], "levenshtein": 3, "distanc": [3, 58], "direct": [4, 42, 44, 58], "warn": [4, 5, 8, 51, 63], "manipul": [4, 51, 57], "loss": [4, 7], "unus": 4, "backup": [4, 5, 8], "export": [4, 9, 14, 42, 43, 51, 52], "download": [4, 5, 49, 51, 56], "lose": 4, "crash": 4, "local": [4, 51], "version": [4, 7, 13, 33, 43, 44, 47], "note": [4, 7, 21, 30, 31, 33, 35, 36, 38, 39, 40, 42, 43, 44, 48, 50, 51, 53, 56], "recent": 4, "max": [4, 11, 20, 60], "dai": [4, 8, 39, 68], "old": [4, 36], "either": [4, 15, 20, 34, 39, 41, 51, 57, 66], "simpl": 4, "power": 4, "unlik": [4, 33], "rest": [4, 15, 51], "safeguard": 4, "prevent": 4, "total": [4, 20], "make": [4, 8, 13, 14, 18, 36, 42, 43, 51, 60, 63, 66], "lost": [4, 8], "server": [4, 7, 41, 42, 51, 55], "depend": [4, 9, 33, 35, 36, 40, 41, 48, 54, 66], "situat": [4, 29, 41], "effort": [4, 42], "transact": [4, 8], "commit": 4, "build": [4, 19, 30, 36, 45], "around": [4, 58], "statement": 4, "don": [4, 20, 41, 44, 49, 64, 72], "refresh": [4, 39], "press": [4, 30, 31, 34, 36, 37, 40, 45, 61], "f5": [4, 63], "again": [4, 31, 66], "termin": 4, "queri": [4, 51], "row": [4, 6, 8, 39, 60, 68], "count": [4, 6, 41, 44], "veri": [4, 24, 32, 41, 63], "readabl": [4, 51, 58], "affect": 4, "error": [4, 6, 8, 43, 61, 65, 66], "noth": [4, 8, 63], "worri": [4, 41], "becaus": [4, 41, 62, 63], "Be": [5, 7, 41, 51, 55, 58], "awar": [5, 7, 20, 41, 51, 55, 58], "especi": [5, 8, 41], "share": 5, "email": [5, 6, 10, 14, 53, 60, 66], "address": [5, 10, 13, 60], "includ": [5, 11, 18, 20, 35, 38, 41, 42, 44, 49, 51, 60, 62], "save": [5, 14, 30, 31, 33, 34, 35, 36, 38, 61], "folder": [5, 7], "directori": [5, 7], "isn": [5, 66], "writabl": 5, "2018": 5, "08": [5, 48], "23_1533_export": 5, "exist": [5, 8, 13, 16, 19, 20, 24, 28, 29, 31, 37, 41, 44, 48, 51, 64, 66], "pg_dump": 5, "plain": 5, "format": [5, 7, 8, 26, 42, 43, 51, 69], "fill": [5, 8, 20, 24, 33, 38, 39, 40, 62, 68], "empti": [5, 10, 20], "psql": 5, "archiv": [5, 20, 26, 41, 59], "fc": 5, "pg_restor": 5, "restor": 5, "regardless": 5, "oper": [5, 8], "line": [5, 36, 39, 51, 57, 69], "break": [5, 51, 69], "d": [5, 31, 38, 54], "1": [5, 8, 30, 39, 44, 47, 54, 68], "zip": 5, "sever": [5, 20, 31, 36, 41, 48, 51], "entiti": [5, 8, 9, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 38, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 55, 58, 59, 60, 62, 64, 67], "divid": [5, 24, 42, 54], "properti": [5, 18, 45, 46, 47, 48, 53], "geometri": [5, 8, 36, 56], "current": [5, 7, 8, 26, 33, 42, 44, 45, 48, 51, 57, 60, 63], "2022": [5, 51], "10": [5, 39, 48, 57], "04_1610": 5, "kei": [5, 44, 63], "tag": [5, 41, 51], "prefer": [6, 15, 42, 53, 60], "profil": [6, 8, 12, 14, 20, 39, 42, 43, 45, 51, 56, 57, 68, 73], "valu": [6, 9, 12, 13, 39, 40, 41, 49, 51, 54, 61, 62, 68], "choos": [6, 8, 15, 17, 20, 29, 30, 31, 34, 35, 36, 37, 38, 40, 45, 58], "much": [6, 7, 31], "At": [6, 16, 17, 18, 20, 23, 24, 25, 27, 33, 41, 48, 55], "moment": [6, 39, 48, 58], "info": [6, 14, 20, 25], "minimum": 6, "jstree": 6, "charact": [6, 8, 69], "filter": [6, 41, 42, 51, 52, 62, 73], "tree": [6, 31, 41], "type": [6, 9, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 49, 54, 58, 72, 73], "random": 6, "password": [6, 10, 14, 15, 42, 56], "length": 6, "reset": [6, 10, 14, 42, 60], "upon": 6, "requir": [6, 8, 14, 20, 26, 33, 35, 36, 38, 41, 42, 51, 63, 70, 72], "confirm": [6, 42], "hour": [6, 60, 68], "long": [6, 20, 41, 73], "code": [6, 43, 44, 45, 51, 52, 65], "fail": [6, 66], "login": [6, 7, 10, 14, 43, 65], "often": [6, 22, 52], "attempt": 6, "specif": [6, 8, 20, 26, 29, 32, 37, 40, 41, 42, 43, 44, 47, 48, 51, 53, 57, 66], "usernam": [6, 10, 11, 14, 15, 66], "forget": [6, 41], "minut": [6, 60, 66, 68], "mani": [6, 13, 20, 24, 26, 41, 44, 63], "wait": [6, 66], "chosen": [6, 8, 36, 38, 40, 41], "number": [6, 8, 26, 48, 49, 51, 66], "exceed": 6, "activ": [6, 14, 18, 20, 31, 42, 44, 57, 60, 62, 63, 68], "preview": [6, 8], "open": [7, 26, 34, 35, 38, 41, 42, 43, 51, 55, 57], "standard": [7, 37, 40, 42, 44, 72], "deliv": [7, 42], "high": [7, 26, 38, 42, 57], "attribut": [7, 26, 41, 42], "onlin": [7, 38, 42], "scale": [7, 20, 42], "onc": [7, 55], "see": [7, 8, 14, 21, 22, 24, 28, 31, 33, 34, 35, 36, 37, 38, 40, 42, 45, 47, 49, 51, 52, 55, 58, 60, 63, 64, 66], "configur": [7, 13, 20, 52, 53, 55], "item": [7, 20, 27, 29, 40, 47], "enabl": [7, 8, 20, 26, 42, 45, 55, 57, 58], "expos": 7, "checkbox": [7, 26, 29, 57, 66], "complet": 7, "api": [7, 9, 15, 20, 26, 41, 42, 43, 49, 52, 60], "yourserv": 7, "eu": [7, 13, 51], "manifest": [7, 42], "2": [7, 30, 39, 44, 47, 54], "path": [7, 51], "absolut": 7, "drop": [7, 20, 38, 58], "zone": 7, "var": 7, "www": [7, 15, 26, 38], "iipsrv": 7, "write": 7, "execut": [7, 9, 43, 52], "webserv": 7, "convers": 7, "control": [7, 15, 38, 51], "convert": [7, 55, 68], "pyramid": 7, "tiff": 7, "none": [7, 36, 41, 51, 63], "deflat": 7, "lossless": 7, "size": [7, 20, 53], "mai": [7, 24, 39, 41, 44, 51, 52, 58, 63, 64], "larg": [7, 20, 36, 39, 58], "jpeg": [7, 20], "smaller": [7, 52], "transpar": 7, "run": [7, 8, 13, 41, 52], "sub": [7, 8, 9, 17, 18, 29, 33, 35, 44], "accordingli": 7, "successfulli": 7, "bmp": [7, 20], "gif": [7, 20], "ico": [7, 20], "jpg": [7, 20], "svg": [7, 20], "tif": 7, "directli": [8, 30, 38, 41, 45, 47, 54], "csv": [8, 9, 42], "gi": 8, "unit": [8, 17, 19, 21, 22, 29, 36, 39, 43, 47, 48, 54, 61], "histor": [8, 22, 26, 36, 38, 39, 43], "regard": [8, 31, 38, 40, 53], "integr": [8, 9, 26, 43, 58], "caution": 8, "consum": 8, "we": [8, 41, 44, 63], "strongli": 8, "advis": 8, "sql": [8, 9, 43, 52], "ani": [8, 30, 31, 41, 49, 51], "older": [8, 63], "enforc": 8, "check": [8, 9, 10, 14, 26, 29, 35, 39, 42, 43, 46, 58, 60, 62], "alright": 8, "encapsul": 8, "script": [8, 44], "example_place_hierarchi": 8, "sure": [8, 36, 51, 63, 66, 68], "extens": [8, 20, 45, 51], "spell": [8, 39, 67], "correctli": [8, 39], "lower": [8, 24], "my_data": 8, "header": [8, 73], "each": [8, 15, 20, 21, 24, 39, 40, 42, 44, 45, 46, 49, 51, 54], "separ": [8, 41], "comma": 8, "enclos": 8, "doubl": [8, 36], "quot": 8, "To": [8, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 45, 47, 48, 51, 52, 57, 62, 67, 68, 73], "said": [8, 34], "titl": [8, 18, 51, 57], "messag": [8, 51, 63, 64, 66], "uniqu": [8, 26, 49], "per": [8, 73], "prefix": 8, "them": [8, 18, 22, 29, 32, 33, 36, 41, 55, 60, 63], "person_1": 8, "place_1": 8, "underscor": 8, "_": 8, "hyphen": 8, "miss": [8, 9, 41, 44, 63, 68], "begin_from": [8, 48], "begin_to": [8, 48], "end_from": [8, 48], "end_to": [8, 48], "type_id": 8, "value_typ": 8, "reference_id": 8, "alreadi": [8, 13, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35, 38, 40, 41, 50, 55, 60, 68], "origin_reference_id": 8, "reference_system_": 8, "administrative_unit_id": 8, "historical_place_id": 8, "parent_id": 8, "openatlas_parent_id": 8, "openatlas_class": 8, "string": [8, 48, 69], "alias": [8, 60, 62, 67, 73], "semicolon": 8, "surround": 8, "yyyi": [8, 39, 62], "mm": [8, 39], "dd": [8, 39], "out": [8, 18, 29, 33, 36, 40, 41, 48, 57, 62, 63, 68], "timefram": 8, "For": [8, 15, 18, 19, 21, 22, 24, 26, 28, 30, 33, 34, 35, 41, 45, 47, 49, 51, 54, 66, 68], "timespan": [8, 68], "more": [8, 18, 19, 20, 21, 24, 26, 28, 29, 30, 31, 33, 35, 36, 38, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 62], "keep": [8, 9, 14, 29, 31, 32, 35, 36, 37, 38, 41, 45, 69], "mind": [8, 9, 29, 31, 32, 35, 36, 37, 38, 41], "incorrect": 8, "red": 8, "advanc": [8, 14, 62, 63, 69], "studi": [8, 29, 43], "space": [8, 20, 24, 30], "1234": [8, 13], "13": [8, 51], "65": 8, "pair": 8, "56": 8, "78": 8, "wrap": 8, "cell": 8, "quotat": 8, "mark": [8, 20, 29, 36, 41, 55, 70, 72], "iv": 8, "542": 8, "34": 8, "23": [8, 39, 48, 68], "66": 8, "just": [8, 20, 68], "5678": 8, "literature_1": 8, "book_2": 8, "multi": 8, "point": [8, 18, 33, 34, 35, 36, 57], "polygon": [8, 36, 57], "linestr": [8, 36, 57], "geometriccollect": 8, "wgs84": [8, 57], "geodet": 8, "epsg": [8, 57], "4326": [8, 57], "sinc": [8, 44, 72], "tall": 8, "12": [8, 39, 48, 62, 68], "458533781141528": 8, "41": 8, "922205268362234": 8, "53062334955289": 8, "917606998887024": 8, "52169797441624": 8, "888476931243254": 8, "coulmn": 8, "append": 8, "reference_system_wikidata": 8, "occur": [8, 35, 51], "substitut": 8, "reference_system_getty_aat": 8, "consist": [8, 19, 21, 26, 28, 30, 39, 41, 42, 44], "identifi": [8, 14, 22, 26, 36, 60], "q54123": 8, "second": [8, 60, 68, 73], "match": [8, 26, 36, 38, 44, 57], "close_match": 8, "exact_match": 8, "gener": [8, 9, 18, 33, 43, 51, 52, 53, 56, 63, 68], "togeth": [8, 20, 41, 44], "stratigraph": [8, 17, 19, 21, 22, 24, 43, 47, 48, 54, 61], "remain": [8, 16, 17, 22, 24, 28, 43, 54], "declar": 8, "insensit": 8, "question": [8, 22, 41], "structur": [8, 19, 22, 28, 41, 42, 43, 51], "archaeolog": [8, 19, 21, 22, 24, 28, 31, 42, 43], "model": [8, 41, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55, 59], "ll": [8, 43, 66], "duplic": [8, 9, 41, 72], "sensit": [8, 62], "king": [8, 31, 38, 39], "arthur": 8, "print": [8, 49], "doesn": [8, 18, 64, 65, 66], "stop": 8, "went": [8, 33], "summari": [8, 27], "brows": [8, 14, 44, 45], "layout": [8, 20, 52], "did": 8, "good": [8, 20, 24, 30], "idea": 8, "doc": [8, 48], "data_integrity_check": 8, "authent": [9, 10, 15, 43], "mail": [9, 14, 43], "modul": [9, 39, 43, 56, 57, 68], "map": [9, 17, 18, 19, 21, 22, 24, 26, 28, 30, 31, 35, 42, 43, 44, 45, 47, 48, 49, 56, 60], "iiif": [9, 41, 43, 55], "content": [9, 25, 27, 34, 43, 49, 57, 63], "present": [9, 20, 34, 41, 42, 43, 51, 57, 59], "orphan": [9, 58], "annot": [9, 43, 53, 56], "subunit": [9, 22, 27, 30], "circular": 9, "invalid": [9, 51], "preced": [9, 18, 33, 35, 39, 44, 48], "similar": [9, 26, 38, 41, 57, 68], "prepar": 9, "alia": [9, 16, 24, 30, 36, 70], "refer": [9, 14, 16, 17, 18, 19, 20, 21, 22, 24, 27, 28, 29, 30, 32, 34, 35, 39, 40, 41, 42, 43, 44, 45, 47, 53, 57], "wkt": [9, 56], "coordin": [9, 26, 36, 57], "extern": [9, 20, 25, 26, 31, 35, 38, 40, 41, 47, 51, 53], "dump": 9, "json": [9, 51], "xml": 9, "arch": [9, 20, 41, 43], "overview": [9, 13, 14, 20, 29, 35, 40, 43, 44, 45, 46, 47, 51, 52, 58, 59, 61], "fetch": 9, "reference_system": 9, "index": [9, 16, 17, 18, 20, 23, 24, 25, 27], "vocab": [9, 43], "vocabulari": [9, 38, 49], "ensur": [10, 20, 41], "disabl": [10, 11, 26], "leav": 10, "send": [10, 14, 35], "mail_password": 10, "smtp": 10, "net": [10, 13], "port": 10, "587": 10, "recipi": [10, 18], "feedback": [10, 63], "receiv": [10, 35, 60, 66], "zoom": [11, 36, 57, 58, 60], "defin": [11, 14, 20, 25, 33, 44, 48, 49, 52, 58, 60], "lowest": [11, 60], "adjust": [11, 12, 60], "far": [11, 60], "disableclusteringatzoom": 11, "cluster": [11, 36], "maxclusterradiu": 11, "maxim": 11, "rang": [11, 44, 48, 51, 61], "geonam": [11, 30, 38, 49, 56], "own": [12, 14, 16, 17, 21, 31, 36, 38, 41, 42, 45, 51], "wider": 13, "audienc": 13, "area": [13, 36, 54, 55, 57], "backend": [13, 53], "frontend": 13, "demo": [13, 44, 47, 51], "specifi": [13, 16, 20, 25, 29, 38, 39, 41, 42, 51], "newslett": [14, 42, 60], "subscript": 14, "registr": 14, "account": [14, 61], "sent": [14, 35], "cannot": [14, 26, 29, 35, 39, 64], "anymor": [14, 29, 64, 66], "inact": [14, 59], "modifi": [14, 18, 60], "full": [14, 36, 57, 60, 62], "easier": [14, 42, 60], "free": [14, 31, 33, 35, 36, 38, 39, 43, 49], "guest": 14, "who": [14, 16, 17, 21, 22, 33], "aren": [14, 20, 41, 68], "editor": [14, 20, 29, 40, 57, 60], "contributor": 14, "readonli": 14, "ye": 14, "skosmo": 15, "As": [15, 18, 31, 33, 35, 36, 38, 39, 45, 61], "ch": 15, "trail": 15, "slash": 15, "vocabs_pw": 15, "differ": [15, 18, 20, 30, 32, 33, 35, 36, 38, 40, 41, 42, 45, 47, 51, 58, 67, 69, 72], "confer": 15, "w3": 15, "org": [15, 26, 38, 51], "tr": 15, "sko": [15, 26, 38, 57], "primer": 15, "concept": [15, 26, 57], "child": 15, "conceptu": [15, 44, 45], "decid": [15, 40], "choic": [15, 29, 40], "what": [15, 58], "choosen": 15, "e74": 16, "albert": [16, 48], "einstein": [16, 48], "queen": 16, "victoria": 16, "peopl": [16, 18, 41], "famili": 16, "tribe": 16, "greenpeac": 16, "nation": 16, "museum": [16, 17, 21, 26, 31, 38, 44], "denmark": 16, "resid": 16, "main": [16, 41, 53, 71], "born": [16, 48], "where": [16, 18, 22, 29, 31, 33, 35, 36, 38, 41, 44, 57, 58, 62, 68], "came": 16, "di": [16, 48], "mother": 16, "member": [16, 37], "kept": 16, "pictur": [16, 17, 19, 31, 55], "coin": [17, 30, 31], "potteri": [17, 30], "collector": 17, "carrier": 17, "carri": [17, 18, 30], "e7": [18, 48], "e8": 18, "e5": [18, 48], "e11": 18, "e9": 18, "common": [18, 26, 51, 65], "battl": [18, 35, 39], "meet": [18, 62], "wed": 18, "owner": [18, 31], "anoth": [18, 20, 24, 29, 31, 33, 34, 41, 44, 49, 51, 60], "natur": [18, 38, 47], "disast": 18, "track": [18, 31, 39, 42, 48, 53, 61], "conserv": 18, "treatment": 18, "movement": [18, 34], "crm": [18, 24, 33, 42, 43, 45, 46, 47, 48, 52], "war": [18, 35, 39, 48], "up": [18, 20, 36, 41, 62, 63, 66, 68], "journei": [18, 32, 35], "wai": [18, 19, 24, 26, 28, 31, 32, 34, 40, 44, 48, 49, 51], "donor": 18, "step": [18, 22, 24, 26, 30, 31, 32, 33, 34, 37, 41, 42, 52], "instruct": [18, 24, 26, 31], "our": [18, 24, 26, 41, 43], "ownership": 18, "acquir": [18, 31, 41], "surrend": 18, "creator": [18, 20, 41], "destin": 18, "unfortun": [18, 33], "background": [18, 42, 45, 47, 58, 68], "tutori": [18, 31, 33, 35, 36, 41], "produc": 18, "e18": [19, 24, 28, 47, 48], "physic": [19, 24, 28, 30, 31, 34, 36, 47, 48, 57], "thing": [19, 24, 28, 30, 36, 47, 48, 57], "record": [19, 21, 24, 28, 31, 34, 49, 54], "grave": [19, 21, 24, 28, 30, 36], "consid": [19, 24, 47, 49], "referenc": [19, 25, 28], "skeleton": [19, 21], "pit": [19, 30], "ditch": 19, "rampart": 19, "label": [19, 29, 44, 58, 68], "disk": 20, "display": 20, "upload": [20, 31, 42, 52, 53], "exce": 20, "limit": [20, 53, 68], "both": [20, 68], "go": [20, 24, 29, 30, 31, 39, 40, 45, 57], "drag": [20, 57, 58], "left": [20, 38, 50, 55, 57, 58], "furthermor": [20, 24, 26, 39, 40, 45], "practic": [20, 41], "licenc": 20, "besid": [20, 68], "plan": [20, 41], "indic": [20, 39, 41, 44, 48, 51], "design": [20, 36, 41, 42, 54], "holder": [20, 49], "Not": [20, 62], "maximum": 20, "mb": 20, "width": [20, 58], "pixel": [20, 58], "pdf": 20, "display_file_ext": 20, "chose": [20, 68], "do": [20, 29, 30, 31, 36, 39, 63], "height": [20, 29, 58], "120": 20, "px": 20, "larger": 20, "try": [20, 51, 58, 63, 64, 66, 68], "small": [20, 60], "impact": 20, "perform": [20, 31, 45, 56], "suppos": 20, "met": [20, 41], "must": [20, 39, 41, 44, 51], "those": [20, 24, 30, 39, 47, 51], "numer": [20, 44, 61], "flag": [20, 41], "viewer": [20, 41, 42, 55], "e20": 21, "biolog": [21, 30], "anthropolog": [21, 24, 30, 43, 56, 61], "bone": [21, 30, 54], "sex": [21, 29, 30, 42, 56], "gender": [21, 30], "ag": [21, 30, 42], "mask": [21, 30], "workflow": [21, 22, 24, 28, 30, 32, 42, 59], "acquisit": [21, 42], "modif": [21, 38, 40], "move": [21, 24, 31, 32, 58], "femur": [21, 30, 54], "humeru": [21, 54], "molar": 21, "historian": 22, "work": [22, 39, 42, 43, 63], "come": [22, 29, 41, 68], "usual": [22, 41], "facilit": [22, 26], "bit": 22, "hi": [22, 31, 39], "life": [22, 48], "archaeologist": 22, "reflect": [22, 34, 51], "contin": 24, "graveyard": [24, 30], "under": [24, 25, 26, 36, 38, 51, 66], "austria": 24, "itali": 24, "respect": [24, 26, 33, 34, 35, 36, 38, 41, 49, 57], "styria": 24, "duchi": 24, "bavaria": 24, "lombard": [24, 38], "kingdom": 24, "newli": [24, 28, 30, 31], "though": [24, 28], "e18phys": 24, "certain": [24, 29, 30, 36, 44, 48, 49, 57], "posit": [24, 30, 36, 49, 57], "extend": [24, 30, 33, 34, 57], "tempor": [24, 30, 35, 42], "spatial": [24, 30, 42, 57], "superior": 24, "cemeteri": 24, "compos": 24, "burial": [24, 28, 30, 36], "primari": 24, "secondari": [24, 27], "back": [24, 30, 31], "solv": [24, 63, 65], "book": [25, 30, 49], "inbook": 25, "articl": [25, 30, 51], "charter": [25, 27, 49], "chronicl": 25, "doi": [25, 49], "instead": [25, 34, 45, 51], "author": [26, 33, 49], "advantag": [26, 31], "abl": [26, 31, 41], "futhermor": 26, "merg": 26, "lod": [26, 38, 42], "analogu": 26, "librari": 26, "catalogu": 26, "inventori": [26, 38, 49], "collabor": 26, "multilingu": 26, "knowledg": [26, 45], "graph": [26, 58], "wikimedia": 26, "foundat": 26, "wikipedia": 26, "everyon": [26, 45], "cc0": 26, "domain": [26, 44, 48, 51], "usabl": [26, 51, 69], "geograph": [26, 49], "web": [26, 49, 52, 53], "creativ": 26, "over": [26, 29, 31, 36, 40, 41, 49, 61, 73], "25": [26, 48], "000": 26, "11": [26, 48, 51], "800": [26, 38, 68], "gemeinsam": 26, "normdatei": 26, "translat": [26, 27, 45, 47, 52, 53], "intern": [26, 42, 44, 45, 47], "organis": 26, "subject": 26, "head": 26, "corpor": 26, "bodi": 26, "mainli": 26, "increasingli": 26, "definit": [26, 38, 44, 45, 51], "confid": [26, 38, 57], "degre": [26, 38, 54, 57], "close": [26, 36, 38, 57], "suffici": [26, 38, 57], "interchang": [26, 38, 57], "retriev": [26, 38, 51, 57], "exact": [26, 36, 38, 39, 57, 68], "vienna": [26, 38, 61], "suitabl": [26, 33, 38, 52], "deal": [26, 41, 45, 47, 58], "primarili": [26, 28, 54], "wiki": [26, 38, 43], "q123": 26, "septemb": 26, "desir": [26, 30, 37, 38], "short": [26, 31, 35, 44], "mous": [26, 29, 40, 57, 58, 73], "yet": [26, 35], "attach": [26, 41, 51], "e33": [27, 45, 47, 49], "linguist": [27, 47, 49], "written": [27, 30, 34, 52], "mediev": [27, 49], "letter": [27, 31, 32, 33, 35, 44], "literatur": [27, 54], "comment": [27, 39, 62, 68], "tool": [28, 31, 42, 43, 51, 54, 57, 59, 61, 73], "lead": [28, 29, 41, 51], "backfil": [28, 30], "e55": [29, 48], "With": [29, 31, 34, 42, 46, 57, 58, 66], "adapt": [29, 42, 60], "interest": [29, 45], "dynam": [29, 40], "statu": [29, 51], "higher": 29, "basic": [29, 40, 45], "root": [29, 52], "untyp": 29, "switch": [29, 57, 58, 71], "except": [29, 51, 60, 69], "unselect": 29, "categori": [29, 54], "permiss": [29, 38, 40, 42, 64], "renam": 29, "subtyp": 29, "grei": 29, "least": [29, 40, 41, 62], "decim": [29, 57], "dimens": [29, 30, 48], "weight": [29, 54], "centimetr": 29, "gram": 29, "percentag": 29, "unabl": 29, "fit": [29, 31, 35, 36], "reduc": 29, "typ": 29, "element": [30, 31, 33, 34, 60, 63], "procedur": [30, 33, 34], "3": [30, 48, 51, 54], "knife": 30, "4": [30, 41, 51, 62, 68], "teeth": 30, "classif": [30, 33, 34], "bout": 30, "concern": [30, 33, 34, 52], "store": [30, 31, 42, 48, 49, 51], "state": [30, 36, 38, 51, 61], "appropri": [30, 31, 34], "settlement": 30, "magnifi": [30, 36, 57], "evid": 30, "plot": [30, 36], "photo": 30, "now": [30, 31, 34], "layer": [30, 36, 57], "finger": 30, "ring": [30, 48], "patholog": 30, "measur": [30, 61], "discolor": 30, "canin": 30, "represent": [31, 45], "repres": [31, 35, 36, 39, 47], "span": [31, 32, 48, 62, 68], "cover": [31, 36], "Then": [31, 36], "learn": 31, "On": [31, 33, 35], "land": [31, 35, 54], "kind": [31, 36, 40], "occurr": 31, "excav": [31, 55], "transfer": 31, "sold": 31, "leonardo": 31, "paint": 31, "mona": 31, "lisa": 31, "workshop": 31, "florenc": 31, "franci": 31, "franc": 31, "exhibit": 31, "ch\u00e2teau": 31, "ambois": 31, "fountainebleau": 31, "louvr": 31, "pari": 31, "typic": 32, "scenario": 32, "suggest": [32, 63, 65], "discuss": 32, "best": 32, "profess": [32, 43], "special": [33, 41, 42, 44, 47, 69], "trip": 33, "chronolog": 33, "captur": 33, "continu": [33, 35, 36, 48], "altern": [33, 41, 51], "role": [33, 38, 41], "determin": [33, 42, 44, 49, 54], "exchang": [34, 43], "materi": 34, "copi": [34, 36], "preset": 34, "subgroup": 35, "bring": [35, 38, 44], "simultan": 35, "music": 35, "festiv": 35, "parallel": 35, "concert": 35, "overlap": 35, "sequenc": [35, 44, 51], "introduct": [35, 43], "think": [35, 38, 39, 44, 64, 66], "screen": [36, 57], "glass": [36, 57], "pop": 36, "marker": [36, 57], "visual": [36, 42, 43, 50, 56], "hover": 36, "landscap": 36, "street": 36, "satellit": 36, "whether": [36, 73], "four": [36, 39], "mode": [36, 57, 58], "centerpoint": 36, "drawn": [36, 57], "border": 36, "river": 36, "bed": 36, "draw": [36, 55, 57], "shape": [36, 38, 54, 57], "rectangl": [36, 55, 57], "ground": 36, "hole": 36, "whose": 36, "unknown": [36, 39], "enough": [36, 39, 68], "window": 36, "dedic": 36, "countri": [37, 49], "gazett": [38, 49], "particularli": [38, 42], "But": [38, 41], "analog": 38, "card": [38, 49], "catalog": [38, 49], "wikidata": [38, 49], "manual": [38, 40, 41, 42, 50, 51, 52, 57], "q3044": 38, "charlemagn": 38, "input": [38, 51, 68], "2761369": 38, "AT": 38, "precis": [38, 57], "down": 38, "blank": 38, "belt": 38, "buckl": 38, "q3180027": 38, "todai": 38, "frank": 38, "becam": 38, "holi": [38, 48], "roman": 38, "emperor": 38, "venu": 38, "willendorf": 38, "histori": 38, "q131397": 38, "focus": 39, "statigraph": 39, "bottom": [39, 40, 57], "initi": [39, 68], "hidden": [39, 68], "year": [39, 48, 61, 62, 68], "4713": [39, 68], "9999": [39, 51, 68], "month": [39, 62, 68], "31": [39, 48, 54, 62, 68], "hh": 39, "59": [39, 51, 68], "ss": 39, "minu": 39, "bc": [39, 68], "softwar": [39, 42, 47, 52], "postgresql": [39, 44, 53, 68], "prolept": [39, 68], "gregorian": [39, 68], "calendar": [39, 68], "hast": 39, "fought": 39, "william": 39, "duke": 39, "normandi": 39, "norman": 39, "french": [39, 42], "troop": 39, "harold": 39, "godwinson": 39, "english": [39, 42], "armi": 39, "14th": 39, "octob": 39, "1066": 39, "14": 39, "alik": [39, 45, 51], "Or": 39, "peac": 39, "westphalia": 39, "treati": 39, "sign": [39, 51], "1648": [39, 48], "osnabr\u00fcck": 39, "15th": 39, "m\u00fcnster": 39, "24th": 39, "thirti": [39, 48], "eighti": 39, "05": [39, 48], "15": 39, "24": [39, 48], "uncertain": 39, "third": 39, "fourth": 39, "actual": 39, "frame": 39, "certainti": 39, "death": [39, 48], "stephen": 39, "hungari": 39, "august": 39, "1038": 39, "birth": [39, 44, 48, 68], "01": [39, 62, 68], "975": 39, "earliest": 39, "latest": [39, 50], "howev": 39, "gear": [39, 45], "organ": 40, "distinct": [40, 49], "push": 40, "blue": 40, "light": 40, "answer": 41, "frequent": 41, "approach": 41, "probabl": [41, 49, 63], "analys": [41, 43, 56, 61], "decis": 41, "regist": [41, 66], "hide": [41, 60], "reason": [41, 44, 51, 63, 66], "conflict": 41, "core": 41, "strict": 41, "better": 41, "lot": 41, "sai": 41, "alex": 41, "him": 41, "pick": 41, "he": 41, "although": 41, "filenam": 41, "cc": 41, "BY": 41, "unstructur": 41, "nor": [41, 44], "searchabl": [41, 60], "solut": [41, 63], "happi": 41, "help": [41, 45, 63, 65], "tailor": 41, "hesit": 41, "reach": [41, 50], "u": [41, 64], "topic": [41, 42, 63], "linebreak": 41, "html": [41, 52], "markdown": 41, "bold": 41, "font": 41, "underlin": 41, "necessarili": 41, "handl": [41, 43], "interoper": 41, "easi": [42, 45, 51], "conveni": [42, 44, 47], "contribut": 42, "significantli": 42, "ontologi": [42, 44, 45], "easili": 42, "fair": 42, "principl": 42, "wide": [42, 44, 68], "uncertainti": [42, 68], "checker": [42, 43, 45], "quick": [42, 43, 62], "accord": [42, 47, 48, 66], "flexibli": 42, "thu": 42, "interact": [42, 57], "navig": [42, 56, 62, 73], "network": [42, 43, 50, 56], "bookmark": [42, 50, 53, 64], "context": 42, "internation": 42, "gettext": 42, "catalan": 42, "german": 42, "spanish": 42, "mirador": 42, "grant": 42, "autom": 42, "unsubscrib": [42, 60], "interdisciplinari": [42, 44], "method": [42, 54], "futur": 42, "ferembach": [42, 54], "et": [42, 54], "al": [42, 54, 71], "estim": [42, 56], "1979": [42, 54], "ment": [42, 61], "archeolog": 43, "geospati": 43, "radiocarbon": [43, 56], "shortcut": [43, 45, 68], "guid": 43, "paramet": [43, 58], "proxi": 43, "troubleshoot": 43, "faq": 43, "doe": [43, 44, 51], "why": 43, "iso": 44, "formal": 44, "council": 44, "icom": 44, "basi": [], "underli": 44, "v7": 44, "publish": [44, 54], "2021": 44, "pars": 44, "github": 44, "e39": [44, 48], "e67": [44, 48], "characteris": 44, "had": [44, 48, 68], "invers": 44, "anywai": 44, "ignor": 44, "foreign": 44, "sub_properties_of": 44, "suffix": 44, "counterpart": 44, "p3": [44, 48], "parser": 44, "com": [], "craw": [], "blob": [], "cidoc_rtfs_pars": [], "troubl": [], "prior": [45, 51], "verifi": 45, "fact": [], "gain": [], "insight": [], "graphic": 45, "symbol": [45, 51, 69], "introduc": 45, "increas": 45, "finer": [45, 47], "grain": [45, 47], "contextu": [45, 47], "lingust": [45, 47], "refin": [47, 62], "7": [47, 54], "compris": 47, "rel": 47, "differenti": 47, "confus": 47, "true": [47, 51], "simplifi": 48, "oa": 48, "p11i": 48, "stefan": 48, "joachim": 48, "son": 48, "father": 48, "usag": [45, 48, 56], "birthplac": 48, "p92i": 48, "brought": 48, "e63": 48, "p7": 48, "took": 48, "e521": 48, "e567": 48, "ulm": 48, "p93i": 48, "e64": 48, "e69": 48, "princeton": 48, "begin_com": 48, "end_com": 48, "timestamp": [48, 51], "e61": 48, "primit": 48, "p4": 48, "e52": 48, "p81": 48, "ongo": 48, "throughout": 48, "lanc": 48, "forg": 48, "durat": 48, "0770": 48, "destroi": [48, 68], "p13": 48, "destruct": 48, "e6": 48, "throw": 48, "lava": 48, "3019": 48, "03": 48, "p98i": 48, "1981": 48, "p100i": 48, "ladi": 48, "diana": 48, "1997": 48, "1618": 48, "purpos": 48, "e62": [48, 69], "p43": 48, "e54": 48, "bibliograph": 49, "delimit": 49, "along": 49, "chapter": 49, "figur": 49, "folio": 49, "7v": 49, "kell": 49, "saint": 49, "mari": 49, "21": 49, "less": 49, "eleven": 49, "million": 49, "charg": [49, 58], "distinguish": 49, "non": [49, 53], "encyclopedia": 49, "domain_id": 49, "property_cod": 49, "range_id": 49, "alphanumer": [49, 61], "alon": [], "p67i": 49, "p71": 49, "terri": 49, "prattchet": 49, "q46248": 49, "p71i": 49, "e1": 49, "depict": 49, "scan": [], "extract": [], "mostli": 49, "logo": [50, 71], "upper": [50, 57], "program": [], "analyt": 51, "mashin": [], "tri": 64, "constraint": 51, "hand": [], "swagger": 51, "visit": 51, "rdf": 51, "visibl": [51, 57, 59], "commun": 51, "schema": [51, 53], "5117": 51, "machin": 51, "deprec": 51, "unstabl": 51, "unavail": 51, "notion": 51, "signific": 51, "major": [51, 54, 63], "minor": 51, "post": 51, "roadmap": 51, "releas": 51, "discontinu": 51, "openapi": 51, "lpf": 51, "geojson": 51, "deriv": 51, "sort": [51, 73], "consult": 51, "convent": 51, "success": 51, "failur": 51, "2xx": 51, "4xx": 51, "signal": 51, "5xx": 51, "tue": 51, "19": 51, "jul": 51, "gmt": 51, "404": 51, "kf": 51, "desc": 51, "flask": [51, 52], "catch": 51, "handler": 51, "behind": 51, "someurl": 51, "8080": 51, "No": 51, "python": 52, "framework": 52, "config": 52, "upgrad": 52, "live": [52, 62], "util": 52, "static": 52, "css": 52, "javascript": 52, "templat": 52, "compil": 52, "rout": 52, "redirect": 52, "sphinx": 52, "retrac": 52, "15883": 52, "init": 52, "before_request": 52, "get_by_id": 52, "some_data": 52, "some_filt": 52, "postgi": [53, 57], "assess": 54, "schwidetzki": 54, "m": 54, "stloukal": 54, "empfehlungen": 54, "f\u00fcr": 54, "die": 54, "alter": 54, "und": 54, "geschlechtsdiagnos": 54, "am": 54, "skelett": 54, "homo": 54, "30": [54, 57, 61], "32": 54, "skull": 54, "pelvi": 54, "examin": 54, "propos": 54, "margo": 54, "supramastoideu": 54, "o": 54, "sacrum": 54, "robust": 54, "supplement": 54, "glabella": 54, "w": 54, "arcu": 54, "superciliari": 54, "tuber": 54, "frontali": 54, "parietali": 54, "inclinatio": 54, "processu": 54, "mastoideu": 54, "relief": 54, "planum": 54, "nuchal": 54, "protuberantia": 54, "occipitali": 54, "externa": 54, "zygomaticu": 54, "zygomaticum": 54, "crista": 54, "supramastoideum": 54, "supraorbitali": 54, "orbita": 54, "mandibl": 54, "overal": 54, "mentum": 54, "angulu": 54, "inferior": 54, "m2": 54, "angl": 54, "sulcu": 54, "praeauriculari": 54, "incisura": 54, "ischiadica": 54, "pubi": 54, "arc": 54, "compos\u00e9": 54, "coxa": 54, "foramen": 54, "obturatum": 54, "corpu": 54, "ossi": 54, "ischii": 54, "iliaca": 54, "fossa": 54, "auricular": 54, "acetabuli": 54, "express": 54, "assign": 54, "femal": 54, "indiffer": 54, "male": 54, "preserv": 54, "sum": 54, "69": 54, "70": 54, "prerequisit": 55, "wasn": 55, "side": [55, 63], "guarante": 55, "overlai": [56, 60], "leaflet": 57, "mousewheel": 57, "hold": 57, "basemap": 57, "popup": 57, "40": 57, "20": 57, "characterist": 57, "road": 57, "toggl": 57, "east": 57, "north": 57, "d3": 58, "j": 58, "egocentr": 58, "classic": 58, "wheel": 58, "node": 58, "rotat": 58, "pan": 58, "color": 58, "depth": 58, "too": [58, 62], "hardwar": 58, "acceler": [58, 61], "faster": 58, "exactli": 58, "remind": 59, "privat": 59, "seen": 59, "everybodi": 59, "anybodi": 59, "els": 59, "got": 59, "twice": 60, "uncheck": 60, "deactiv": [60, 66], "disappear": 60, "whom": 60, "laboratori": 61, "abbrevi": 61, "lab": 61, "conduct": 61, "vera": 61, "environment": 61, "specimen": 61, "sampl": 61, "analysi": 61, "1015": 61, "big": 62, "global": [62, 72], "term": [62, 73], "ada": 62, "lovelac": 62, "da": 62, "love": 62, "unacc": 62, "lov\u0113": 62, "vice": 62, "versa": 62, "placehold": 62, "l": 62, "ce": 62, "me": 62, "dateless": 62, "criteria": 62, "1540": 62, "1560": 62, "1550": 62, "intend": 63, "support": [63, 69], "sometim": 63, "cach": 63, "rememb": 63, "firefox": 63, "haven": 63, "screenshot": 63, "explan": 64, "encount": 64, "let": 64, "know": 64, "read": [64, 73], "mayb": 64, "obsolet": 64, "keyboard": 66, "capslock": 66, "forgot": 66, "misspel": 66, "secur": 66, "attack": 66, "lock": 66, "few": [66, 72], "until": 66, "e41": 67, "appel": 67, "oa8": 68, "oa9": 68, "knew": 68, "1356": 68, "unsur": 68, "church": 68, "fist": 68, "decad": 68, "1800": 68, "1809": 68, "autocomplet": 68, "5": 68, "zero": 68, "leap": 68, "almost": 69, "cyril": 69, "mathemat": 69, "asterisk": [70, 72], "serv": 71, "quit": 72, "difficult": 72, "glanc": 73, "quickli": 73, "invert": 73, "cut": 73, "familiaris": 44, "wherev": 45, "cidoc_crm": 48, "done": 51}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"api": [0, 51], "arch": 1, "overview": [1, 50], "fetch": 1, "data": [1, 3, 30, 41, 42], "from": 1, "automat": 1, "creat": [1, 33, 35, 36, 38, 40], "entiti": [1, 3, 22, 48], "type": [1, 3, 8, 29, 40, 41, 48], "refer": [1, 8, 25, 26, 31, 36, 38, 49], "system": [1, 8, 26, 36, 38, 49], "content": 2, "integr": [3, 42], "check": [3, 20, 41], "orphan": 3, "without": 3, "link": [3, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 31, 33, 46], "miss": 3, "file": [3, 20, 31, 41, 49, 64], "iiif": [3, 7, 42], "annot": [3, 42, 55], "subunit": [3, 19, 21, 24, 28], "circular": 3, "depend": 3, "date": [3, 8, 39, 42, 48, 61, 68], "invalid": 3, "involv": 3, "preced": 3, "sub": 3, "duplic": 3, "similar": 3, "name": [3, 66, 72], "execut": 4, "sql": [4, 5], "prepar": [4, 8], "keep": 4, "mind": 4, "result": 4, "export": 5, "databas": [5, 53], "dump": 5, "csv": 5, "json": 5, "xml": 5, "gener": [6, 32, 35, 60], "authent": [6, 51], "import": [8, 15, 20, 57], "project": [8, 41], "class": [8, 44, 47], "possibl": 8, "field": [8, 14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 39, 41], "alia": [8, 67], "valu": [8, 29], "origin": 8, "wkt": [8, 57], "coordin": 8, "extern": 8, "place": [8, 24, 30, 36], "hierarchi": 8, "option": [8, 58], "after": 8, "admin": 9, "mail": 10, "map": [11, 36, 57], "modul": [12, 60], "present": 13, "site": [13, 30], "user": [14, 20, 41, 42, 43, 66], "form": [14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 70], "group": 14, "vocab": 15, "edit": 15, "show": 15, "vocabulari": 15, "actor": [16, 33], "can": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "via": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "tab": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29], "artifact": [17, 30, 31, 34], "event": [18, 31, 33, 34, 35], "acquisit": 18, "creation": [18, 31], "modif": 18, "move": [18, 33, 34, 35], "product": 18, "featur": [19, 30, 42], "super": [19, 21, 28], "public": [20, 41], "share": [20, 41], "set": 20, "logo": 20, "imag": [20, 42, 55], "preview": 20, "how": [20, 36, 39, 41], "make": [20, 29, 41], "avail": [20, 41], "criteria": [20, 41], "softwar": [20, 41], "manag": [20, 41, 42], "human": [21, 30], "remain": [21, 30], "administr": 24, "unit": [24, 28, 30], "histor": [24, 32], "ad": [24, 30, 33, 34, 41, 57], "multipl": [24, 31, 41], "citat": 25, "exampl": [25, 32], "includ": 26, "default": 26, "wikidata": 26, "geonam": [26, 36, 57], "gnd": 26, "usag": [26, 55], "id": 26, "precis": [26, 39], "configur": [26, 73], "sourc": [27, 34], "stratigraph": [28, 30], "anthropolog": [28, 42, 54], "analys": [28, 42, 54], "standard": 29, "custom": [29, 41], "requir": 29, "archaeolog": [30, 32], "new": [30, 31, 35, 36, 38, 40, 57], "an": [30, 31, 34, 40], "add": [31, 40], "creator": 31, "locat": [31, 33], "journei": 33, "letter": 34, "sender": 34, "recipi": 34, "instruct": 35, "us": 36, "profess": [37, 41], "time": [39, 48], "span": 39, "where": 39, "find": 39, "input": 39, "enter": [39, 41], "activ": [39, 66], "hour": 39, "minut": 39, "second": 39, "tree": 40, "exist": 40, "faq": 41, "case": [41, 58], "studi": 41, "instanc": 41, "doe": 41, "access": [41, 51], "work": 41, "why": 41, "t": 41, "free": 41, "text": 41, "longer": 41, "format": 41, "model": [42, 45], "interfac": [42, 43], "exchang": 42, "radiocarbon": [42, 48, 61], "openatla": [43, 47, 48], "manual": 43, "document": 43, "help": 43, "cidoc": 44, "crm": 44, "properti": 44, "checker": 46, "shortcut": 48, "oa7": 48, "ha": 48, "relationship": 48, "oa8": 48, "appear": 48, "first": 48, "oa9": 48, "last": 48, "e77": 48, "persist": [48, 63], "item": 48, "e21": 48, "person": 48, "e2": 48, "tempor": 48, "introduct": 51, "quick": 51, "start": 51, "guid": 51, "1": 51, "ui": 51, "2": 51, "url": 51, "get": 51, "version": [51, 63], "endpoint": 51, "paramet": 51, "error": [51, 63, 64], "handl": 51, "proxi": 51, "applic": 52, "structur": [52, 53], "sex": 54, "estim": 54, "tool": 56, "navig": [57, 58], "search": [57, 62], "geometri": 57, "overlai": 57, "network": 58, "visual": 58, "2d": 58, "3d": 58, "In": 58, "perform": 58, "issu": 58, "download": 58, "note": 59, "profil": 60, "chang": 60, "password": [60, 66], "displai": [60, 63], "browser": 63, "refresh": 63, "your": 63, "javascript": 63, "If": 63, "problem": 63, "code": 64, "403": 64, "forbidden": 64, "404": 64, "found": [64, 66], "418": 64, "i": [64, 66], "m": 64, "teapot": 64, "troubleshoot": 65, "login": 66, "wrong": 66, "No": 66, "thi": 66, "too": 66, "mani": 66, "attempt": 66, "descript": 69, "menu": 71, "tabl": 73}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"API": [[0, "api"], [51, "api"]], "ARCHE": [[1, "arche"]], "Overview": [[1, "overview"], [50, "overview"]], "Fetch": [[1, "fetch"]], "Data from ARCHE": [[1, "data-from-arche"]], "Automatically created entities": [[1, "automatically-created-entities"]], "Type": [[1, "entity-type"], [3, "type"], [29, "type"]], "Reference System": [[1, "entity-reference-system"], [26, "reference-system"]], "Entity": [[1, "entity-index"], [22, "entity"]], "Content": [[2, "content"]], "Data integrity checks": [[3, "data-integrity-checks"]], "Orphans": [[3, "orphans"], [3, "id1"]], "Entities without links": [[3, "entities-without-links"]], "Missing files": [[3, "missing-files"]], "Orphaned files": [[3, "orphaned-files"]], "Orphaned IIIF files": [[3, "orphaned-iiif-files"]], "Orphaned annotations": [[3, "orphaned-annotations"]], "Orphaned subunits": [[3, "orphaned-subunits"]], "Circular dependencies": [[3, "circular-dependencies"]], "Dates": [[3, "dates"], [8, "dates"], [48, "dates"]], "Invalid dates": [[3, "invalid-dates"]], "Invalid link dates": [[3, "invalid-link-dates"]], "Invalid involvement dates": [[3, "invalid-involvement-dates"]], "Invalid preceding dates": [[3, "invalid-preceding-dates"]], "Invalid sub dates": [[3, "invalid-sub-dates"]], "Check links": [[3, "check-links"]], "Check link duplicates": [[3, "check-link-duplicates"]], "Check similar names": [[3, "check-similar-names"]], "Execute SQL": [[4, "execute-sql"]], "Preparation": [[4, "preparation"], [8, "preparation"]], "Keep in mind": [[4, "keep-in-mind"]], "Result": [[4, "result"]], "Export": [[5, "export"]], "Export SQL": [[5, "export-sql"], [5, "id1"]], "Export database dump": [[5, "export-database-dump"]], "Export CSV": [[5, "export-csv"]], "Export JSON": [[5, "export-json"]], "Export XML": [[5, "export-xml"]], "General": [[6, "general"], [60, "general"], [32, "general"]], "Authentication": [[6, "authentication"]], "IIIF": [[7, "iiif"]], "Admin": [[9, "admin"]], "Mail": [[10, "mail"]], "Map": [[11, "map"], [57, "map"]], "Modules": [[12, "modules"], [60, "modules"]], "Presentation site": [[13, "presentation-site"]], "User": [[14, "user"]], "Form fields": [[14, "form-fields"], [16, "form-fields"], [17, "form-fields"], [19, "form-fields"], [21, "form-fields"], [24, "form-fields"], [25, "form-fields"], [27, "form-fields"], [28, "form-fields"], [18, "form-fields"], [20, "form-fields"], [29, "form-fields"]], "Groups": [[14, "groups"]], "Import": [[15, "import"], [8, "import"]], "Vocabs": [[15, "vocabs"]], "Edit": [[15, "edit"]], "Show vocabularies": [[15, "show-vocabularies"]], "Actor": [[16, "actor"]], "Can be linked via tabs to": [[16, "can-be-linked-via-tabs-to"], [17, "can-be-linked-via-tabs-to"], [19, "can-be-linked-via-tabs-to"], [21, "can-be-linked-via-tabs-to"], [24, "can-be-linked-via-tabs-to"], [25, "can-be-linked-via-tabs-to"], [27, "can-be-linked-via-tabs-to"], [28, "can-be-linked-via-tabs-to"], [18, "can-be-linked-via-tabs-to"], [20, "can-be-linked-via-tabs-to"], [29, "can-be-linked-via-tabs-to"]], "Artifact": [[17, "artifact"]], "Feature": [[19, "feature"]], "Super and subunits": [[19, "super-and-subunits"], [21, "super-and-subunits"], [28, "super-and-subunits"]], "Human remains": [[21, "human-remains"]], "Place": [[24, "place"]], "Administrative Unit": [[24, "administrative-unit"]], "Historical Place": [[24, "historical-place"]], "Places and their subunits": [[24, "places-and-their-subunits"]], "Adding multiple places": [[24, "adding-multiple-places"]], "Reference": [[25, "reference"]], "Citation example": [[25, "citation-example"]], "Included by default": [[26, "included-by-default"]], "Wikidata": [[26, "wikidata"]], "GeoNames": [[26, "geonames"], [57, "id1"]], "GND": [[26, "gnd"]], "Usage": [[26, "usage"], [55, "usage"]], "ID": [[26, "id"]], "Precision": [[26, "precision"]], "Configuration": [[26, "configuration"], [73, "configuration"]], "Source": [[27, "source"]], "Stratigraphic unit": [[28, "stratigraphic-unit"]], "Anthropological analyses": [[28, "anthropological-analyses"]], "How to make files available for the public": [[41, "how-to-make-files-available-for-the-public"], [20, "how-to-make-files-available-for-the-public"]], "Criteria checked by the software": [[41, "criteria-checked-by-the-software"], [20, "criteria-checked-by-the-software"]], "FAQ": [[41, "faq"]], "How to manage multiple projects or case studies": [[41, "how-to-manage-multiple-projects-or-case-studies"]], "Multiple instances": [[41, "multiple-instances"]], "Shared instance": [[41, "shared-instance"]], "How does data access work": [[41, "how-does-data-access-work"]], "How to enter professions": [[41, "how-to-enter-professions"]], "Criteria checked by users": [[41, "criteria-checked-by-users"]], "Why can\u2019t a free text field be added via custom types": [[41, "why-can-t-a-free-text-field-be-added-via-custom-types"]], "Why can\u2019t longer texts be formatted": [[41, "why-can-t-longer-texts-be-formatted"]], "Features": [[42, "features"]], "Model": [[42, "model"], [45, "model"]], "User Interface": [[42, "user-interface"]], "IIIF Integration": [[42, "iiif-integration"]], "Image Annotation": [[42, "image-annotation"]], "Data Exchange": [[42, "data-exchange"]], "User Management": [[42, "user-management"]], "Anthropological Analyses": [[42, "anthropological-analyses"], [54, "anthropological-analyses"]], "Radiocarbon Dating": [[42, "radiocarbon-dating"], [61, "radiocarbon-dating"]], "OpenAtlas manual": [[43, "openatlas-manual"]], "User interface": [[43, null]], "Documentation": [[43, null]], "Help": [[43, null]], "Sex Estimation": [[54, "sex-estimation"]], "Image annotation": [[55, "image-annotation"]], "Tools": [[56, "tools"]], "Navigation": [[57, "navigation"], [58, "navigation"]], "Search": [[57, "search"], [62, "search"]], "WKT import": [[57, "wkt-import"]], "Adding new geometries": [[57, "adding-new-geometries"]], "Map Overlay": [[57, "map-overlay"]], "Network visualization": [[58, "network-visualization"]], "2D": [[58, "d"]], "3D": [[58, "id1"]], "Options": [[58, "options"]], "In case of performance issues": [[58, "in-case-of-performance-issues"]], "Download": [[58, "download"]], "Notes": [[59, "notes"]], "Profile": [[60, "profile"]], "Change password": [[60, "change-password"]], "Display": [[60, "display"]], "Display Errors": [[63, "display-errors"]], "Browser Version": [[63, "browser-version"]], "Refresh your Browser": [[63, "refresh-your-browser"]], "JavaScript": [[63, "javascript"]], "If the problem persists": [[63, "if-the-problem-persists"]], "Error Codes": [[64, "error-codes"]], "403 - Forbidden": [[64, "forbidden"]], "404 - File not found": [[64, "file-not-found"]], "418 - I\u2019m a teapot": [[64, "im-a-teapot"]], "Troubleshooting": [[65, "troubleshooting"]], "Login": [[66, "login"]], "Wrong Password": [[66, "wrong-password"]], "No user with this name found.": [[66, "no-user-with-this-name-found"]], "This user is not activated.": [[66, "this-user-is-not-activated"]], "Too many login attempts.": [[66, "too-many-login-attempts"]], "Alias": [[67, "alias"], [8, "alias"]], "Date": [[68, "date"]], "Description": [[69, "description"]], "Form": [[70, "form"]], "Menu": [[71, "menu"]], "Name": [[72, "name"]], "Table": [[73, "table"]], "Project": [[8, "project"]], "Import class": [[8, "import-class"]], "Possible import fields": [[8, "possible-import-fields"]], "Types": [[8, "types"], [40, "types"]], "Value types": [[8, "value-types"], [29, "value-types"]], "References": [[8, "references"], [49, "references"], [49, "id1"]], "Origin references": [[8, "origin-references"]], "WKT coordinates": [[8, "wkt-coordinates"]], "External reference systems": [[8, "external-reference-systems"]], "Place hierarchy": [[8, "place-hierarchy"]], "Import options": [[8, "import-options"]], "After the import": [[8, "after-the-import"]], "Event": [[18, "event"]], "Acquisition": [[18, "acquisition"]], "Creation": [[18, "creation"]], "Modification": [[18, "modification"]], "Move": [[18, "move"]], "Production": [[18, "production"]], "File": [[20, "file"]], "Form fields important for public sharing": [[20, "form-fields-important-for-public-sharing"]], "Settings": [[20, "settings"]], "Logo": [[20, "logo"]], "Image preview": [[20, "image-preview"]], "Criteria checked by managers and users": [[20, "criteria-checked-by-managers-and-users"]], "Standard types": [[29, "standard-types"]], "Custom types": [[29, "custom-types"]], "Making types required": [[29, "making-types-required"]], "Archaeological data": [[30, "archaeological-data"]], "Adding a new place": [[30, "adding-a-new-place"]], "Adding a feature to the site": [[30, "adding-a-feature-to-the-site"]], "Adding a stratigraphic unit to the feature": [[30, "adding-a-stratigraphic-unit-to-the-feature"]], "Adding an artifact to the stratigraphic unit": [[30, "adding-an-artifact-to-the-stratigraphic-unit"]], "Adding human remains to the stratigraphic unit": [[30, "adding-human-remains-to-the-stratigraphic-unit"]], "Artifacts": [[31, "artifacts"]], "Add a new artifact": [[31, "add-a-new-artifact"]], "Add a reference to the artifact": [[31, "add-a-reference-to-the-artifact"]], "Add a file to the artifact": [[31, "add-a-file-to-the-artifact"]], "Link a creation event": [[31, "link-a-creation-event"]], "Add a creator to the creation event": [[31, "add-a-creator-to-the-creation-event"]], "Add multiple locations to an artifact": [[31, "add-multiple-locations-to-an-artifact"]], "Examples": [[32, "examples"]], "Archaeological": [[32, "archaeological"]], "Historical": [[32, "historical"]], "Journey": [[33, "journey"]], "Adding actors": [[33, "adding-actors"]], "Adding locations": [[33, "adding-locations"]], "Creating the move event": [[33, "creating-the-move-event"]], "Link actors to the journey": [[33, "link-actors-to-the-journey"]], "Letters": [[34, "letters"]], "Adding an artifact": [[34, "adding-an-artifact"]], "Adding a source": [[34, "adding-a-source"]], "Adding the move event": [[34, "adding-the-move-event"]], "Adding sender and recipient": [[34, "adding-sender-and-recipient"]], "Move events": [[35, "move-events"]], "Create a new move event - general instruction": [[35, "create-a-new-move-event-general-instruction"]], "Places": [[36, "places"]], "Create a new place": [[36, "create-a-new-place"]], "How to use the map": [[36, "how-to-use-the-map"]], "Reference Systems - GeoNames": [[36, "reference-systems-geonames"]], "Profession": [[37, "profession"]], "References Systems": [[38, "references-systems"]], "Create a new reference system": [[38, "create-a-new-reference-system"]], "Time Spans": [[39, "time-spans"]], "Where to find the input fields": [[39, "where-to-find-the-input-fields"]], "How to enter dates and time spans": [[39, "how-to-enter-dates-and-time-spans"]], "Precise dates": [[39, "precise-dates"]], "Time spans": [[39, "id1"]], "Activate hours, minutes, and seconds": [[39, "activate-hours-minutes-and-seconds"]], "Create a new type tree": [[40, "create-a-new-type-tree"]], "Add a type to an existing type tree": [[40, "add-a-type-to-an-existing-type-tree"]], "CIDOC CRM": [[44, "cidoc-crm"]], "CIDOC classes": [[44, "cidoc-classes"]], "CIDOC Properties": [[44, "cidoc-properties"]], "Link checker": [[46, "link-checker"]], "OpenAtlas classes": [[47, "openatlas-classes"]], "OpenAtlas shortcuts": [[48, "openatlas-shortcuts"]], "OA7 - has relationship to": [[48, "oa7-has-relationship-to"]], "OA8 - appears for the first time in": [[48, "oa8-appears-for-the-first-time-in"]], "OA9 - appears for the last time in": [[48, "oa9-appears-for-the-last-time-in"]], "E77 - Persistent Item": [[48, "e77-persistent-item"]], "E21 Person": [[48, "e21-person"]], "E2 Temporal Entity": [[48, "e2-temporal-entity"]], "Radiocarbon dating type": [[48, "radiocarbon-dating-type"]], "Reference Systems": [[49, "reference-systems"]], "References and Files": [[49, "references-and-files"]], "Introduction": [[51, "introduction"]], "Quick Start Guide": [[51, "quick-start-guide"]], "1. UI access": [[51, "ui-access"]], "2. URL / GET access": [[51, "url-get-access"]], "Versioning": [[51, "versioning"]], "Endpoints": [[51, "endpoints"]], "Parameters": [[51, "parameters"]], "Error handling": [[51, "error-handling"]], "Proxy": [[51, "proxy"]], "Authentication guide": [[51, "authentication-guide"]], "Application Structure": [[52, "application-structure"]], "Database Structure": [[53, "database-structure"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/openatlas/static/manual/technical/api.html b/openatlas/static/manual/technical/api.html index df2222b52..c3bf99a99 100644 --- a/openatlas/static/manual/technical/api.html +++ b/openatlas/static/manual/technical/api.html @@ -106,28 +106,29 @@

API

Introduction

-

This page provides an overview of the OpenAtlas Application Programming -Interface (API). An API allows easy -and controlled access from external sources (e.g. presentation sites or -analytical tools) to your data. It is human and mashine readable and -provides different approaches to query your data.

-

The OpenAtlas API tries to follow the +

This page provides an overview of the OpenAtlas API. An (API) allows easy and controlled access to the data +stored in an OpenAtlas instance from external sources, such as presentation +sites or analytical tools. The information provided is readable for human and +machines alike. By using the API data can be queried in several different ways.

+

The development of the OpenAtlas API follows the RESTful constraints.

-

To try out the API first hand at our demo site: https://demo.openatlas.eu/swagger. -If you have your own OpenAtlas instance just visit <your-domain.eu>/swagger. Be aware -that the API has to be set to public at the admin section.

+

Testing the API is possible via: https://demo.openatlas.eu/swagger. +Using it with the data from a specific OpenAtlas instance is possible by +visiting <your-domain.eu>/swagger. Be aware +that the API has to be set to public in the admin setting +section of the instance.

Quick Start Guide

-

The API can be accessed via the OpenAtlas user interface or through URL GET +

The API can be accessed via the OpenAtlas user interface or through an URL GET requests.

1. UI access

-

Each detail view of an entity provide two buttons (JSON and RDF) where the -formats, in which the entity should be exported, can be selected. If the -buttons are not visible, please change the Show API links -at the Display tab in your Profile.

-

Through the UI, only a single entity can be accessed.

+

Each detail view of an entity provides two buttons (JSON and RDF). Via those +buttons the format, in which the entity will be exported, can be selected. +If the buttons are not visible, please change the Show API links +in the Display tab of your Profile in the settings.

+

By using the UI in this way, only a single entity can be accessed.

../_images/api_ui_json.jpg
@@ -144,8 +145,8 @@

1. UI access

2. URL / GET access

The most common way to communicate with the OpenAtlas API is through GET -request, either manually from the local browser or with other applications -following a specific URL schema:

+request. This can be done either manually from the local browser or with other +applications following a specific URL schema:

{domain}/api/{api version}/{endpoint}?{parameter}&{parameter}
 
@@ -153,29 +154,29 @@

2. URL / GET accesshttps://demo.openatlas.eu/api/0.3/entity/5117

Domain

Location of the OpenAtlas instance from which information should be -retrieved; e.g. https://demo-openatlas.eu/ for the demo version.

+retrieved, e.g. https://demo-openatlas.eu/ for the demo version

-
API Version

Input without version number leads to the current stable version +

API Version

Input without a version number leads to the current stable version (https://demo.openatlas.eu/api/entity/5117). If another version of the API is to be used, the version number can be -specified (demo.openatlas.eu/api/0.4/entity/5117). A version overview -can be found under point Versioning.

+specified (e.g. demo.openatlas.eu/api/0.4/entity/5117). A version +overview can be found under Versioning.

Endpoints

Specific data can be queried by attaching an endpoint -(demo.openatlas.eu/api/0.4/entity/5117). The information is provided -in a human - and machine-readable form. Further information under -Endpoints.

+(e.g. demo.openatlas.eu/api/0.4/entity/5117). The information is +provided in a human - and machine-readable form. For further information +see Endpoints.

Required path values

Must be included to create a valid URL. Different endpoints require -different values (demo.openatlas.eu/api/0.4/entity/5117. 5117 is -an ID as required by the entity endpoint) - all required values are state -in { } at the Endpoints definition.

+different values (e.g. demo.openatlas.eu/api/0.4/entity/5117. +5117 is an ID as required by the entity endpoint) - all required +values are state in { } at the Endpoints definition.

Parameters

Used to structure additional information for a given URL. They are added to the end of an URL after the “?” symbol -(demo.openatlas.eu/api/0.4/entity/5117**?**download=true). All available -Parameters can be found under Parameters. For more general information -see this +(e.g. demo.openatlas.eu/api/0.4/entity/5117**?**download=true). All +available Parameters can be found under Parameters. For more general +information see this article.

@@ -215,37 +216,43 @@

Versioningroadmap and release notes before -these versions will be discontinued. Unstable versions are currently -developed, so breaking changes may occur at any time without prior notice.

+a versions is discontinued. Unstable versions are currently +still under development, so breaking changes may occur at any time without +prior notice.

Endpoints

Through different endpoints, data can be retrieved from OpenAtlas. Each version -has an own set of endpoints, be sure to use the right one.

+has an own set of endpoints, make sure to use the correct one.

The current version 0.4 endpoint descriptions are available at:

-

The requested information is provided in Linked Places format -Linked Places format (LPF). Alternatively, +

The requested information is provided in the +Linked Places format (LPF). +Alternatively, GeoJSON, Linked Open Usable Data -or RDFs, derived from the Linked Open Usable Data data, can be accessed.

+or RDFs, derived from Linked Open Usable Data +data, can be accessed.

Parameters

-

With parameters the result of the requested endpoint can be manipulated -(filtered, searched, sorted, etc.). Each endpoint provide another set of -parameters which can be used. So please consult the Endpoints listing for -more details.

+

By using parameters the result of the requested endpoint can be manipulated +(filtered, searched, sorted, etc.). Each endpoint provides another set of +parameters which can be used. Consult the Endpoints list for more details.

Parameters are added to the end of an URL after the “?” symbol (e.g. demo.openatlas.eu/api/0.4/entity/5117**?download=true**) and are connected with the “&” sign. -For more general information on this topic see this +For more general information on this, see this article.

@@ -268,14 +275,15 @@

Error handlingFlask-RESTful extension. -An error message is provided by its own error handler +Flask-RESTful extension +and displays an error message provided by its own error handler

Proxy

-

If the server is behind a proxy, there are some issues with the RDF export of entities. -To provide the OpenAtlas API with a proxy server, add following line to instance/production.py

+

If the server is behind a proxy, issues with the RDF export of entities can +occur. To provide the OpenAtlas API with a proxy server, add the following +line to instance/production.py

PROXIES = {
     'http': 'http://someurl.org:8080',
     'https': 'http://someurl.org:8080'}
diff --git a/openatlas/static/manual/technical/application_structure.html b/openatlas/static/manual/technical/application_structure.html
index 04f0b6d59..dbf2c0a69 100644
--- a/openatlas/static/manual/technical/application_structure.html
+++ b/openatlas/static/manual/technical/application_structure.html
@@ -98,7 +98,7 @@ 

Application Structure

The website’s software is written in Python and uses the Flask framework. -Below you find an overview of the file structure:

+Below you can find an overview of the file structure:

-

To retrace for example a call that was made from a web browser such as -/entity/15883

+

To retrace a call that was made from a web browser (for example +/entity/15883) the following steps will be executed:

diff --git a/openatlas/static/manual/technical/database_structure.html b/openatlas/static/manual/technical/database_structure.html index 07278bd04..e25231c80 100644 --- a/openatlas/static/manual/technical/database_structure.html +++ b/openatlas/static/manual/technical/database_structure.html @@ -109,12 +109,12 @@

Database Structure
  • website settings (upload size limit, email configuration, …)

  • -
  • groups, users and their preferences, notes, bookmarks, …

  • +
  • groups, users, user’s preferences, notes, bookmarks, …

  • image annotations

  • external reference system specifications

  • From c930592a3c85479a360716c13f781abca3d83da9 Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Wed, 27 Nov 2024 14:45:37 +0100 Subject: [PATCH 31/42] Update manual --- .../manual/.doctrees/environment.pickle | Bin 178954 -> 179335 bytes .../examples/archaeological_data.doctree | Bin 32914 -> 44610 bytes .../.doctrees/examples/artifacts.doctree | Bin 32610 -> 32471 bytes .../manual/.doctrees/examples/index.doctree | Bin 4700 -> 4788 bytes .../manual/.doctrees/examples/journey.doctree | Bin 19353 -> 19562 bytes .../manual/.doctrees/examples/letters.doctree | Bin 21792 -> 22074 bytes .../.doctrees/examples/move_event.doctree | Bin 18998 -> 19042 bytes .../manual/.doctrees/examples/places.doctree | Bin 25707 -> 25959 bytes .../.doctrees/examples/profession.doctree | Bin 7647 -> 7881 bytes .../examples/reference_systems.doctree | Bin 20747 -> 20675 bytes .../.doctrees/examples/time_spans.doctree | Bin 23641 -> 24057 bytes .../manual/.doctrees/examples/types.doctree | Bin 14289 -> 16634 bytes .../manual/examples/archaeological_data.html | 181 ++++++++++++------ .../static/manual/examples/artifacts.html | 65 ++++--- openatlas/static/manual/examples/index.html | 9 +- openatlas/static/manual/examples/journey.html | 53 ++--- openatlas/static/manual/examples/letters.html | 45 ++--- .../static/manual/examples/move_event.html | 23 ++- openatlas/static/manual/examples/places.html | 44 +++-- .../static/manual/examples/profession.html | 18 +- .../manual/examples/reference_systems.html | 28 +-- .../static/manual/examples/time_spans.html | 36 ++-- openatlas/static/manual/examples/types.html | 46 +++-- openatlas/static/manual/searchindex.js | 2 +- sphinx/source/examples/artifacts.rst | 2 +- sphinx/source/examples/journey.rst | 2 +- 26 files changed, 322 insertions(+), 232 deletions(-) diff --git a/openatlas/static/manual/.doctrees/environment.pickle b/openatlas/static/manual/.doctrees/environment.pickle index 5aa87fc67040472f95a74d43b6561b8e20f1512b..b97a95654e06a9334d4683907c0b63af3bcda6a3 100644 GIT binary patch literal 179335 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

    it4`? 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 literal 178954 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 X_B$}UN^xhlNx@dcC7J{DS8D$QO5Iw0 diff --git a/openatlas/static/manual/.doctrees/examples/artifacts.doctree b/openatlas/static/manual/.doctrees/examples/artifacts.doctree index b7c43a2314e83746b59fd2eca23e555b4364b072..3ff650d58ee670ae9e4bb2a6124407eac216c882 100644 GIT binary patch delta 4545 zcmd^C3v5(b8Qyc-xt$rX4+?!h&h$B*&h!DaW!pkq+HPOVvt0_5(%#P8>76p2JKTGx zrR&lb4FYD|t^BAV#+A*+#6_|~#?{1CLe$i(t0-|3qCpW@c8RWuvL!q&`Cw5K~>jf_6J|IwMOLSuG_Ou(nJ zwmlLqDFasKOw+*@kB53gnxV)V^##1DHZB=Hyj>5u6)NeFlItQmyp=;guIQ%ROiCYz zO7a}=V(y2j1x#bNqN=(~)gZfAkDSf(3S<&eY<^;eX`5}vP<%RdO946}(~vHEsG(9# zcB`6aIb*A#NCrj8fND^;Iw5N)IWk32Gddw@J~gCMV=5@?6|_f|gLssV`vM*(Liz%u z(JiYY=~VJeNC86{m37KcC>$&(*iG&2dQf)zB)@-(qLmn|HK@tDjH29Ns+S@~Ni%$2 z$!$>y@1I zreO-_N{Y}RS4v!j!o3n3{%1N-E-=~ghQc#(4I50P?4o5kKq)Pf&i8YbA%6>v>;7(PWX%# zh{rptKb!d}w$kqLvEXtzc$_F{VGHiwtUhh3LCgIfW-D6BC^W3=E~4#+3|R|E{v}0` z&Pd2G)POa5xEH>^wr|Zt1tX`|9U`O-R@JoCX7GC-f)=B&8fiVS4HGq8(3h49*J^6T zIwZF#9*$JhL9n|D4K`bQggAiM^MKZUKB?h8AI(AKhBY;IR!0LC+wXH9;L0)MZ`V{$w5TjN(BXjmrdL+1p@uY4K|3*y;a6MJ z;PsYd$g56trT>dVF^8othlG~q?EmoR67GZ`C&(3SFLY>HL2%}Af zLX!wb($`^HJ->B#Y(0Kkp|B&iKDccQTi@Qe-n0|1FM-?JS_L1wVZGST7DNa;i{SY7 zKJpy=Zu?WhG=isQ!loU?@yGCX_-#Ud+}H^Qm%~kdROBWHk(+!@$$+MvtIT^4YMP0Y z6?Tz*JS#Fk3X>uPbF$!#oxLOixxMYeYccpFxNKP?j9rA6dkck2OZY#C;{R+3f4Xm# zc`rh~7Q<&B7w*G1Kl4N3y{J+HxOr!BQ|fLqF*+rY@m*#jhzZ$191331qOD#`8H{c_RC1BZl(Xx1O!5@ZdL{^gJ}TYX-7AfQeLoY=T{@M-c$h8*iqs2i)@!@3hG;HhLaGI~PR-I|Yg zU$Nr8_~vbS4E)R|!;ck_$H9JVR9L@1nS7bM#Dlguxo8^}4$Mg<@ZSFS$$2JW^78Mj z;iF^+Pr-}BL*xzIaq$eCXRcq$z_G}Xw3Y~0(NR1}lHm1`G~q@9TpleDZZY3Pv*daL z&yqhUEM$oz{{UWd6~VAHr-kF$E558jS-|_dyOfw9-&0Hy;IE_YLY$eSq?kEMb5at# z@5vRTNRTGaF&-?l*~&cJkc&~J1aDW0)5@CBg=UfZ3?1$%{mDFnml~Hxh{E`2K3NY} z#va23fW_{C@;Y38&VqqMrCwB{5?qKX98n-`P=xZzz5*OZKh@{kZ%^3{m!NR^rA zip$J$g}e)M{xy&?mNr9OJXT{0Oe!+=&`WK!6w$r@- zqT@IggvQw{5f#I>d-2g@O*cweC4By-WUW-E3XTGD1#QJ=5<2{iU_X#7gx~oeqSPjY zum1Pw+?+kV%tp}ecdc9&zd?+ZM)E8S>lB|67P^O`G4i=+j8LQ0tf9k$7$f|NU?2WP z?_*kKv3Q6j+w%5h_g^CC)U(8fE!m{1VF#nKfR2q&R=?_w`rQT6!PGd690(oUMqWh{ zxiDu>f-~7>ayIheK|3L5Im;h$mOtSvFGX2iUSw&SL>gz|X(Mkz`W-HPhfBX5mA<LfD(#wu2ImIPFu zz-iM-aV(T@k>pC4mM9lOMS+S&GIh8(s8q;Z*#$ZP-{+X62hPS0d#PH_1X iT=qmrv9aB5xO})Mi-YBwVqmQC;$UO*k(JZC$UgzroZP?w delta 4665 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 diff --git a/openatlas/static/manual/.doctrees/examples/index.doctree b/openatlas/static/manual/.doctrees/examples/index.doctree index 3f32a64546a8e5e955c178d43b11cf2977378a5d..eac53bf37a4135d51e3026bbc0a48b976b2a7057 100644 GIT binary patch delta 328 zcmcbkvPG4pfpzN2jVwzU8IvZzVes#GW_%Fjwo zF3~M6NKMX6%S_f$$OkGYDptryEK5~LR7fhyPfSTIQYcQ&FG$r>2*^oIEKcQ`oXsrD zmzYzYSXr!4oC-83F=ui+b1oy-@399mN>4W6=mzoy*ySeQ;z(gs0?O=V RRGIvjvzbw8b0gPnb^u>DZ{Yv{ delta 296 zcmdm@dPjw&fpu!&MwX?FjAoNpG5Y%`6zAurD&(grlw_plDkK)Aa+RePRVow|1mvV97N;s?r=}JtWacU4X6B{n05v6+fOHn6g0xO9WXfe!n0%i} zRfMZDzqCl9BsDQtZ%PJx?34_#2wK|5$Thi`!Z?W|Pg)-Q?7$qi8 z=X9QI#u3OUHMxVM8_3UKmz!+FnZl?Dl-bLwoFScYVsa0M`s4<#2u8)tH@R-J0|4;8 BV;=wj diff --git a/openatlas/static/manual/.doctrees/examples/journey.doctree b/openatlas/static/manual/.doctrees/examples/journey.doctree index d89001d13fcdfbe535c0c1f39bbd223e888777a7..93169b804d2297d3b7a5a400e9624f2cacb9f7d0 100644 GIT binary patch delta 4101 zcmc&%eQaCR704fHo+h)%Z9;fKW#(O`3$J0m>gBZIc)p+WN3Q1XO66(8fL_wDym&oqM03 zW4ECi{bQ4?C;8rUf9IUvIrp4%pLvRW@-#8uZ+`Ol;g`&Rr0d7ZNlwlLi^P+On6kzK za*Qo1OiRdtQ%aD9W9-O^5}VMXvdZ|6sY)WOs4Tw3mgA=trkqw{8sD-86*Z6uFY1T1 zkiwSY(P(@%96QNWO<7U9*jM5SJd{unbt#@$mbGv^29qW`vBK9(kFNjV|7Qh@#~2(i z*@$&(Hh0)Wo`=8C0r**7Em7eQd37dq2d?K0lY^;sJ0$bF8cQUJb70jukfhB}-ZwWx zmFEjHR^j#haWV(*<#|#dyJ5ayloSCJOjb_~1>=FC6F#IctgZRvfEG`j7-DzBUkj=% z93<%5vRL;JTWQE0dOx{{*t@c~Ay|0C%y)kem%I#~vw7C%vO$G$926rWNz(`_Nj!Qo ziz=F?Bp3!|MM$_P&Rjh2juQ3jFdXvJRo|$-^54cUYISahnA8`5`eLi z2CC?`%fj|J+J3049Q7<1b~mRW;Z;^a7YJNx=rwbJZy1JD&1V~;t*t0%$2`oIRo6zt zs>Yqh&9m2YWEET{yn;4O1j-F@fB*UCo8v+#0RJ-wiN@r>}|N9aX2JZyKBIndB2 z4NoRgM(w`6QHyIViG@Smd~j3GAr2wj=4g+n+^&R$^4$eIn~Opui48N|Z zp`Yq*eInetj&6Bjthog4EiQo0Lc7h08m<}csUSO4@KqHG1Q-0u(@aX?Q;&<&ZBhR0MKceqggc6Wzo=$H2CwG98D;4a1G8lTyW9RTEsMYk=Jy* z)K-{qpUhA_MFSKbsBl89B_C`xtz;PnYU*fQ_w$tQ=i0WPoG+WlZewU=08J4WlJn)c zMXfVaZAJ>D6mn7@7o>u&>``6Wg>7X>szp}>a&;5lvUt4<%IjL_mcfa`nl@rbQt`~i zhCVX~nF9wqPU=K@J;CF{|EIwV$}s54Nb&u?09Y%ROPY7q^8AV8GPK}CR*AM`!mi!tu+~H z550?j|3Tq}ao3io(M)KsNknP1X@HDDvZ;-XBlZ*>F^NR{2*4QexE8Z|MiEvH`uiRV>W2iLM3BN3o zC=V9wG49Apin3BpxTOPEqB|Jtq{phCXno2)uk!AuCKpo!i6lX^!w;Xe4wBpNcfyP` zMb4$;bJk!CdkY86pzW+l+~t2s1LT4sPtL;0_PsQ<^~?57@`ABtO+)#hv!lIiXEc7~ z7q=eqqxth3mfuJo>$gR$-$ltOdR340N9kDCbRs=zb+j!r*k?tsxxjaK;Lo*np-Un( zFITvB&DTUra*Z;@SBJZO#^!_FcTsQF=JoCad=qPxWf$U`a(OZpZ6|F`4$PLfxFc_3 zIgPxD;Ue*SGcWp8bR_=(fteZFI?y zcaR16dG8s%ht|0I5!*PNRTd}VTwk(R%vnqfU3`>19hOBdOHwVqiM;LETKfjaQ@}|b!Gdz-Re;v&ygV!6?oIznETE>VHtir>@CLEhRy^wB^lly zu6OaNCe@-CA1XR(&6}Yti$mEQHSFrO~lVJr?>X`?;-yI6<993 delta 3700 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 CJQwf) delta 3030 zcmb_eX>3$g6z+MQHU|sc&AX zxCGJgqX|avR7DN3{E#065PkkIYK)o~m&B+s5flaM5|@}5m{JIff#NQT9gOib6J3RBZ# z%t$jOWhgp}u%u$}ANY1|?+W#*trP0Pz5i4H3oy*1w)?>~PxY$9qfugN=wJp0?Qxig zhwL|lfqi*yJmqnj)mQnzCTVXwn znuCQKp~$6r6Hh=+j-XuD!8o89e=b@nbIGH)Kfe`+iy z?{VPj&Q2Cd#hIZhj=5;ZBSwV9(y5rDr!ri|($RzxGnmq}y-EC!D%-UbBb35OOP1BZihvu~;Oysb8^#_ zcM=mN-B4^EE72t=HCbsV&^B0BKpT#@Ps(meK?0{rE0Ov0@JY81!nn`Vj%VAQ=1GqR zE)N0rNYmN#;(P60O!~UOgU5ZVcdh7($Jx-RPO;UQmKsXy6e=Fj2z3GljivSJjy#9T!pI zdGKK6LW;)omD`~Rr@AYUsvauMXV`B53=da-U}vP}%*DZQ4VKiXxM6|QEU9@8pvHW& zwv;wJTX#~fBhXU_{#E9m^@jlJak60x)SKrTUIKX$$$sK8JYTNkP@oVCm%H$xidv|{ zsUYxD+27)u5d1{1lij7ary`VQf!K$U9BCB49lDzf}HDWk$Wa)a` zx}?`egW-wGLT-X}2+PayQ-1?&54Xg{-5xroWXRVM$uFry z(NPU9Z0;<_k%f!Efss(Qw?=V-f?WYdI!Qy&8l|=pMIM)3kOp#(^HE+Q)v(XVP*mXe*_T!mV z72XIlv|)u$hM9(A$`0Og(Vh6}suIU+v;8Z0ep6O%e&pA;cMCtLqwWF;Pls;>8xE`$ z%_fIQl!JHl)Jx}NUh?>S&th=n=RGx&*N(6HeOTRl4OA1p#pAV4mw=5Kk!Y3`FCJRk zD)$goX%tVnxvMxor;DD+1xbKUSCVS$^edeeH|?gQr>d4qFkrdrcMe@d!1CXCmae{5>w#uf&G6b+C== zOGL;ANm#_Qm*TlHE1qV>x;Vgnv#DD{@_Vx65BDvzJxUH>u+bwOuw3JB)>DF-4yb_P zfS_JSsuNt*c8iSLM+UykZF--06YugRFP9dXFKH_M zM3OJ3i6n7~FK=<>XF)l4FZ3W-_vQ#atDH-gsQ!>PQ z*t8WkU*UMgC8Us`IGJcy}YPFJ4XS1C3L`KGglQ-CuFzQT} pv-X`_XzRdeJ~`e>bn|grVD;P(99o~P&Sd34~|0cl>|)DEQ&35xJjI%j9H zOZ4Tcs@9d7F;&&Eat0lXq-BlWx}QB>&uG$~Obt&D*`ui>oia^|8mRye_L2ZTl;z^O z=H5{J{IEk5pm<8cT)&WFcHkR_|Hau0SrL4{n{5keK?y3cd>kk#WLHHZ{PhUM0VNF{ zmQfNS1hFsBF9$7UEQ5wWCdAv>TObU0Q%@n4vk0~OH`Z) zauvr3jxjb?m6T+a<9-(X)t54a@ToQqA*M%MB1Etw+U<&PN2iEEZ>x|FV@(6W*Jv?% z8;+=#rbei3nKZ#?r{;{Aw4G&V!I^WuOIAfZH0oUSTrOqf%xYu+QS>)0!aMFZ?O~7J k#kQI|050&Z#pbvMjqG0U6hLQ{Z6<(@Yet+y#+Y?~0Yh}6p#T5? diff --git a/openatlas/static/manual/.doctrees/examples/places.doctree b/openatlas/static/manual/.doctrees/examples/places.doctree index 4cb35c70398ec94aa870078a082a23e9eb81da3d..80cef49928c42ddf0f09c293914ace73778ab7e9 100644 GIT binary patch delta 2323 zcmd^B-)~b@9N%fzuAIr%GMOyf+<~pjXu7hNm2M+$T_?=_3S+}#J@j6;U zD}5l;2SpPjOTIJl0TX?Im_4X?eIOE&JsN%SF93!nh7f%)z7dS)RG4M#VF*4LA8zjb zo^!sR@8|pDesb=9i+=tNd5WG7Pp~VVA6-?$DW>ZAF#O^gDf>=2XWcJvLqEZ%HLn7$ z$+`)}5NHg-%69zNYMXPhChMy55^9QL=lo4@t_g#`vCEMHZ`Pq%_#zmDdu_46vRw80 zvOK-_t>v@J9kS>B^&RI@uoIzHz`<7MkM^}~$OpH&-arv}C)Toanp#X%6^rd5iwev0 zAO^#5Ef%jMX{wP0MzU05VZtJr2!>>Lm;cc)b58~4D}mL|J^z5wSNl75U0kPhyZG_e zNL{T|ycHGDa!>_1{z-M1P-0pJV^$dY2fAx9Avs;qEMn<|X%dVbXr3e;21{F1%h)P4 zh*`)k=<41+a$L7ddD|u#Zfuwh1(`s;e z%Lo()cEX+h>L+n{4}ApR$KzW;KcDE?|;9oh`^CUOLg(S%~~6Q*ADsNX1EN<9ykp#a&I5t|gmYoaLEZ^&w+TD!SjVoQ z+DUui?+e9T6uM`|-BglbbykDlW{T(=NX(3g6=!w!GlY&h%JF6wzmlAvFQ7>WojB$D E6B#BPz5oCK delta 1962 zcmdT_T}%^M6y}!Jr9;Y}f*_)YD2>#Lf+DrJl&+;(YN%`_puy;+y>>>2naRvxX^c^_ z$;O9uH*&g9#;C6*YBuxeiL|alnjFW+oBM0{8KjvkXT=|mWyN^oSoU0Yi|F_*pDmitTGtx35waB@ zxHr8!d+wfc62O_}|gqplY)0x2((+~igx^`{?P0Sclg33HEDJhV60!}MxT7kS;Tw;8{k*nsOpE*lTW4y?l$zG|Ed3wW!|RoiFeC@|iEoJny2 z-b0cZ30)du_^2&iK1}t~ESVFBf=u-k!-;4ej`)lPl*&CGbj8-=F=tUVC&`6S=Mc4R zBbqnQ7rSF_0S=3jk?#aYV?ig^%G5JWoYTG7Ud!jNu#+no?TF+QE%{JUoa%s;l9hNX zV3JE%7HD7U?VFvyhkHpufyWciN$&A{@^El_S4;g8vspZu`DraX8JyZzH9r_`kQb4f zIYo={zn@CKE52$-`O(Go{RU-y8m`6IK|hX$+Xb&b?>ufNeD15^4!GFZpWligU+&ye ztmK94eq%{580ZO=;iS*`{`9^IuFAg??jGD=u1xgr?k5{B`ytL`{@=+Pagl|siD)5N zEJr1}qhPh}BlB6{H&%YMr!`%%sgs$V{|d zh!qtP3sz2CD0NZj#s`HGq`1(Hh=>S65kbT!A}$0U3vs3APN{iRaOY;2ne(6j|L&PH zue%>b_$mJKz2-&!J4b%OPcGPC$P!JZwV0&qil$O6Mn#&E(z>QXpS8PB3dh6vCZ5(Z zDJNF~jp`2>zRT~YTL<5^Ls&WiViZKZ@W!><~YWvTbcS%27 z;%i`p_cn)U3=yRXG0FJ-gW?1o%;<)cPKv7P&mHH_kS>SplaraKTs!SAmcN^tEpB)> zbuD`~dn$V(8(=*!=h(`#ZUx?yQ8?lfVA$p$Juqeqw1udi8Ijqj{JRz1(9(*i>i(>3 zJDin=Hm`W_@-3LR1;_#%_0+)&-Uq*IcCrMHa!T$1u{Xd=Pa7xSM*BvXDX%B@VY{~- zo>us_RAKCb3EhxSLg0K>G3(ID&|5SjiAg!J*2A-cr<$3_XBT zYWiDC8aK%_Dj3iw$W;!KZ+MWP?+Ye>GI`6WAx4W-bB<0<{!oYo5ADHi09r1@yGp&5tM`&oXmRckVr#v0XNV-3 z7iC^dVA7V;m?Djj7Qn{L02hj)r2+AESI9;5=&W#K`9i+Di#TB3HB9XA*}Wc`+!46y zc5yhPad(*H{+!?@JaM;}qE;pVDr_Pi=odtMcU|xi3J-+SHFiyvbgHPd0O~Ou_Vkcv zFzfM?=jhjj>l!FqULjx$TgN5dLc}}JQHx}cS5L>&V~SYhgO!rcxa932KNw;M8%#l~ zsE+=lb*QF?tK{H-BgB?2-%G+p==kwTZO&Dza%5lbWc_>V#!Z~Xl4!+?K3%DbNy(T@ WNjm=P3063-%Ny{vHFvJ@Ao&euQpQgJ delta 1054 zcmcJOOGp%P7{K?Nb#xu~Iqq!fy6b3!v&*(>vKMtFBnT`;C?q5w>pC^N zu8d;7I?UD(deK6g(tQ)nNQ2nV)hDTO(NJVDl{U28--*`D#F7$N;0ALvOUtovz3``w zpt6pOTt9rF-1T_d?UgO{|@wdk0Ik4gASZ;0aoFrX~$`| zgY}Ybj&une_H|HO?X?0HeSIL}hHr>3mg9%`IBxM?+!VrAi$#3QH(Ks>_>JeFXr=<5 zK&gm82G>rf_BErR5jpCYEI8 z=S?nQzQkT!nw+7KSUlN_<({pLf`*U3i>5+mi9%+vLP36Uab{9ZszOP=0v=No$}>xV zCMZm1WS89B#=4Y=asK2x%vmslH_zgD#KTxUxmI-cWJ3uR*~loY5`PELM#W?ni_HQe7;Q!?0Nr)Xq|^=MCS z5Y?V+DL#ww*yR19k;FNWk!$ioN$JUT=G?4eV5i>am0}hGI{BeQSVDqAQfWy^ejX?Q zY2o(G3nWWe8AT`CD0DFDPM#w_ABjC>bGTwZBeSrA?&jx82ice&vus|icbjo?tF{~q zFkp%%Z_t+ERVd3(PE0DzNi3@5QkZOS=CoN_XD%aic}D)`-MV|(7$YXXGnIua=RsD! z*}+VlktZWqvvEo-F!)#_@T=X-$m7Duz@U(s28tH2?Wo2XSVS{{E$*{g1$M#YKC5e! zgUn?%>)M(i1gz|TGL}z1=pZtAzhjC3DC!VS=z&X2wsS1v%&}4kPR#)(_s#npnOG+a X3W{vL;wHfeVobi`Cb?PC;}Zt}HSHR5 delta 926 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 diff --git a/openatlas/static/manual/.doctrees/examples/types.doctree b/openatlas/static/manual/.doctrees/examples/types.doctree index c4fd8f98fb04a354f6862cfc234641df60a62ecf..1dad46a282c46813d4ab81e3bcdc3cdc8b666dcd 100644 GIT binary patch delta 4188 zcmd5D>wwS^;0*SB)g zu1N5G7SB1NgqSuRSEwm&&F~pp;HbFE<+Hf02>wLaJZm{ldfE`h*}&6Go|-1#zLM_# zzw!+pl|Lw4*ypNdO0`p^xJLPY4I}5OjWKEEXj5q?Yp8i7NOkzy{mAKBqE4tujT4y( z1y|+0MMx21A=O!tOwZ(f8)P!=<`abNTRCa-upzip5Qa#)NV$RIW{M|OQ!y=Ol$=i5 zLPbr+xkzDmz~7Qy$M3+tNwtSQ$wRJA{ITl*wWF)OI86Jh(*~1+Tg) zm0G!tO!yTtBW6ocBvJMC5+`$Umzv2M!l{#c0rh@0DJUQZSBru!jJ$AFvoF*FCi%O~ z{>cTu&qcK7v>pvEH;>6}SP{=uDq{CR)yS25du_)rH*YnS;$|)*>~vB!>LlurW>rVY z2-V5iB7>dXQR?)Da-00m_yvo9vkiRwuK$MnbzwWojxSW1dKo@%9+x|jrr(!nYKK5H z49{KD9iny;L?#2d>FOCW#o^s+{uID^g^P{b;iHwWv-9wRGQs`|my|W^Z-^I$!Nx)M z5$tW;$o>xRhDM>-817w-Xy*~BYkn%h_ZY~d;CSRwBUZ6LczC-I>$>0;)&x$lS88E! zHrj(=1CrhdzYJZ=y5a562H4Tmy}F9V5;ftRf4E^hL~~d8J^wKLuIa`W+=o+tr%akT z4o%HF*-|rGgB70iP2|f)7KOf+CxhqoTk&G!UBUoCg@hoGzNMk%4d<6~BEXgOwTsmXOP)~QHOdp^rUxc8Hb_x?FN+cnPO@JZ*UZ4>1i6`xHThTqbs zg+iB7?q#Toph-Nci&t5^W(GKd8XK__c zm)u%>YV8Kb-XzlGZ8Q&UqaDS*z5`79K!T(3>w@JKB^smfUVk!Dq4LW`RGyU}$iv{S zKf?ayf!^YQh6i>_tpPYPkdWE~)X*Dt;dpbPEZczI7=TZ^!^O~GmPtdt$t0TeUuhx_ z>yot1H`#+G->)~h+%w#Q{H*h#jv`2N`K z68m*=%lL)B9VY_Img&doaR#H+e@l;h=rxaz-26%^Q15n6AA34kpY|+Idse4&S}%6f(4!WJU1 zp)To&=Is(AiOz)>V-|Jk4>OI4{PBlBi2j%wgsI6Ew?(oTf0!(6^PGG8MMsQ(ZgSp_ z=Y5~|ea^Y}=g|)lc8Kq2E!!p!EGj$t|(nWO!7J~iqmkd?8Z=~H|`7jebatE zJ`)vUDZJ<96!x~xr)E=j%;I;Xvo={AwwRJ5Oc>y8rvtusmm>~7R1Q9=8cxLGkJhtA)XL2$&I$ zSXvl-3sz0_@T*nF;J;zD=4o>k0o){D+T@s<9}Nn=n81f4aY6z6;_#b#2&QT|2~Gz~ zwKf|^N@d2xd3^p*AnZxRgy~eSb#X6zrZWqdAOtZqf;pZ!h|g6a&e6V1;tc#_Xeyndvm>Kn zt;CcdBdYFpJh*f87C&%j!m z(K_i<7VwXffN#58Ft-%9}zBHHFZf!!_FmAP>hq=uAQf4`m$+Yt(iS1+zQ@1H@%}(88uZNwekB}j7(hI{*Wlm9dZh7SjhobyHJx1>e9+j> zbTja|-kFn@8`L&)F@l8;`$7UA2=gZ*)1g?w8XRjY-nkeNoX-Q}qJ z1#gi1h2P3tB&t*|g8uF#bClLSz_w5eyxDYI$xj9YlT+kcDPgPW?9Sr>__SHcU@1l2 zDuKvki28=$Ve?$~^JI9lDZC+`B@M}Unpg@V)9GtSBsfk8nvA{%7$OuL& zo3(j!UVe*G2W1|a#(ZxreC2o%nZT*Dz<%d3=6&jSY3LKOoEx|Fgmk9Yob8CYBD3zI z0qMTB0AjwBEVaD_DU=kI)x6dStY^}g<95A>+cGS8-e7)`n;MW1;I4ij;C6@VF0D`h zh}xt9stk2%y21i&{|S#=ea!9r#%?h%XEdgt+8;$o0arV^%7zHyqsIc=ogzah(}05{ zK&Qy - + @@ -100,94 +100,163 @@

    Archaeological data

    -

    The steps mentioned below describe how to enter archaeological data into OpenAtlas. -The following elements are involved in the procedure:

    +

    The following steps describe how to enter archaeological data into OpenAtlas. +These elements are involved in the procedure:

      -
    • Place: the archaeological site itself (Level 1)

    • -
    • Feature: a subunit of the place, e.g. graves, buildings, and pits. A place can consist of multiple subunits (Level 2)

    • -
    • Stratigraphic unit: a subunit of the feature, e.g. burial. A feature can consist of multiple subunits (Level 3)

    • -
    • Artifact: an archaeological artifact, e.g. coin or knife (Level 4)

    • -
    • Human remains: subunits of a burial, e.g. bones and teeth that carry anthropological information (Level 4)

    • -
    • Type: used for classification, can be extended by users

    • -
    • Reference: citation, e.g. book or article written a bout the site or any of the subunits

    • -
    • File: an image or other file concerning the site or any of its subunits

    • +
    • Place: The archaeological site itself (Level 1)

    • +
    • Feature: A subunit of the place, e.g. one or more graves, +buildings, or pits. Each place can consist of multiple subunits (Level 2)

    • +
    • Stratigraphic unit: A subunit of a feature such as a burial +or the backfilling of a grave. A feature can consist of multiple subunits +(Level 3)

    • +
    • Artifact: An archaeological artifact, e.g. a coin or knife +(Level 4)

    • +
    • Human remains: Bones and teeth that carry anthropological +information (Level 4)

    • +
    • Type: Used for classification, can be extended by most +users (depending on status)

    • +
    • Reference: Citation the information is coming from, such as +books, articles or online sources concerning the site or any of its subunits

    • +
    • File: One or more images or other file concerning the site or +any of its subunits

    ../_images/sub_unit.jpg

    Adding a new place

    -

    In order to store new archaeological information in the database, the first necessary step is to create a new -Place. In the OpenAtlas database a place is a physical thing that has a certain position and or extend in -space that can be connected to various other information (temporal, spatial, events, sources etc.).

    +

    In order to store new archaeological information in the database, the first +necessary step is to create a new Place. A place is a +physical thing with a certain position and/or extend in +space that can be connected to various other information (temporal, spatial, +events, sources etc.). +To create a new place

      -
    • Click on Place in the Menu and create a new entry by using the + Place button

    • +
    • Click on Place in the Menu and create a new +entry by using the + Place button

    • State the site’s name

    • -
    • Select an appropriate Type from the list, e.g. Burial Site or Settlement

    • -
    • Use the magnifier button on the map to add the site to the map as well as a GeoNames reference if desired

    • -
    • Add further information, e.g. evidence, an alias, a date or a description if available

    • -
    • Press Insert to save the entry

    • -
    • To add a citation click the Reference tab

    • -
    • If you want to add an image e.g. a plot or photo of the site use the File tab

    • +
    • Select an appropriate Type from the list, e.g. burial site +or settlement

    • +
    • Use the magnifier button on the map to add the site to the map as well as +a GeoNames reference if desired

    • +
    • Add further information, e.g. evidence, an alias, a date or a description; +keep in mind that some additional form fields might be required to save +information

    • +
    • Press Insert to save the entry. Press Insert and continue to save and +add another place. A new place form will open. Press +Insert and add feature to save and immediately add a feature to the +place. A feature form will open

    • +
    • To add a citation click the Reference tab after saving the entry

    • +
    • If you want to add an image e.g. a plot or photo of the site use the +File tab after saving the entry

    Adding a feature to the site

    -

    Next, a Feature connected to the Place will be created. -This feature can be a grave of a graveyard, a building of a settlement, etc.

    +

    In a next step you can add a Feature to the +Place. A feature can be a grave of a graveyard, a building +of a settlement, etc. To add a feature to a place

      -
    • Click on the Feature Tab and create a new entry by using the + Feature button

    • +
    • Click on the Feature Tab and create a new entry by using the ++ Feature button or click Insert and add feature when saving a +place’s information

    • Choose a descriptive name

    • Select an appropriate Type from the list

    • -
    • Add further information, e.g. dimensions or a description

    • -
    • Press Insert and add stratigraphic unit to save the entry and go on with the workflow

    • +
    • Add further information, e.g. dimensions or a description; keep in mind +that some additional form fields might be required to save information

    • +
    • Press Insert to save the entry. Press Insert and continue to save and +add another feature to the same place. A new feature form will open. Press +Insert and add stratigraphic unit to save and immediately add a +stratigraphic unit to the feature. A stratigraphic unit form will open

    -

    If you want to link the created feature to a different citation or add an image you can use Insert and add those -information or go back later and do it then. In this case you would have to click the Stratigraphic unit Tab and the -+ Stratigraphic unit button to go on with the workflow.

    +

    After saving the information on the feature a different citation, an image, +etc. can be added in the same way as for place. Keep in mind, you can also +always come back to an entry later to add or change information.

    Adding a stratigraphic unit to the feature

    -

    Every Feature can consist of one or more Stratigraphic unit. -For a grave this would be the burial or a burial and the backfilling.

    +

    Every Feature can consist of one or more +Stratigraphic unit. +For a grave this would be one or more burials and/or the backfilling.

      -
    • By clicking Insert and add stratigraphic unit in the before mentioned step, you can directly enter a stratigraphic unit connected to the created feature

    • +
    • Click on the Stratigraphic unit Tab and create a new entry by using the ++ Stratigraphic unit button or click +Insert and add stratigraphic unit when saving information on a feature +to open the stratigraphic unit form

    • Choose a descriptive name

    • -
    • Select an appropriate Type from the list, e.g. burial or interface

    • -
    • Add additional information on the stratigraphic unit if available

    • -
    • Press Insert and add artifact or Insert an add human remains to go on with the workflow

    • +
    • Select an appropriate Type from the list, e.g. burial or +interface

    • +
    • Add additional information on the stratigraphic unit; keep in mind that +some additional form fields might be required to save information

    • +
    • Press Insert to save the entry. Press Insert and continue to save and +add another stratigraphic unit to the same feature. A new feature form +will open. Press Insert and add artifact to save and +immediately add an artifact to the stratigraphic unit. An artifact +form will open. Click Insert an add human remains to save and +immediately add anthropological information on bones to the stratigraphic +unit. A human remains form will open

    +

    After saving the information on the stratigraphic unit a different citation, +an image, etc. can be added in the same way as for place. Keep in mind, you +can also always come back to an entry later to add or change information.

    Adding an artifact to the stratigraphic unit

    -

    The following steps add a Artifact to the before created Stratigraphic unit. You can now add grave goods to a burial or -artifacts to a certain layer of the feature.

    +

    The following steps add an Artifact to a +Stratigraphic unit.

      -
    • By clicking Insert and add artifact in the before mentioned step, you can directly connect an artifact to the newly created stratigraphic unit

    • +
    • Add an artifact to a stratigraphic unit by clicking the Artifact tab +and create a new entry by using the + Artifact button or click +Insert and add artifact when saving information on a stratigraphic unit +to open the artifact unit form

    • Choose a descriptive name

    • -
    • Select an appropriate Type from the list, e.g. pottery or a finger ring

    • -
    • Add additional information if available

    • -
    • Press Insert to save the entry

    • -
    • Add a file if desired by using the File tab

    • +
    • Select an appropriate Type from the list such as pottery or +finger ring

    • +
    • Add additional information; keep in mind that some additional form fields +might be required to save information

    • +
    • Press Insert to save the entry or Insert and continue to add +another artifact to the same super immediately

    • +
    • Add a file or citation if desired by using the File tab

    -

    You can also enter an artifact by going to the stratigraphic unit you want to link the artifact to. Click the Artifact tab and -+ Artifact afterwards.

    +

    Artifacts can also be added directly to a place or feature, e.g. to add +stray finds to a place. To do so, go to the place or feature you want to add +an artifact to. Click the Artifact tab and then the + Artifact button. +The “super” of an artifact (a place, feature, or stratigraphic unit) can be +changed in the artifact’s form after pressing the Edit button. +You can also create an artifact by clicking the artifact tab in the menu and +the + Artifact button afterwards. The artifact can then be linked to an +existing super in the form.

    Adding human remains to the stratigraphic unit

    -

    Anthropological data can be entered into OpenAtlas by adding Human remains. You can do so by connecting a -certain bone to a Stratigraphic unit and add all the relevant information, e.g. pathological changes, -measurements, discoloration, or additional information. Please note that additional information can -be entered via custom types in the stratigraphic unit entry mask, e.g. biological sex, gender, +

    Anthropological data can be entered by adding Human remains. +You can do so by connecting a certain bone to a +Stratigraphic unit and add all the relevant information, e.g. +pathological changes, measurements, discoloration, or additional information. +Please note that additional information can be entered via custom types in +the stratigraphic unit entry mask, e.g. biological sex, gender, and age of an individual.

      -
    • By clicking Insert and add human remains in the before mentioned creation of a stratigraphic unit, you can directly connect human remains to it

    • +
    • Add human remains to a stratigraphic unit by clicking the +Human remains tab and create a new entry by using the ++ Human remains button or click Insert and add human remains when +saving information on a stratigraphic unit to open the human remains form

    • Choose a descriptive name

    • -
    • Select an appropriate Type from the list, e.g. femur or canine

    • -
    • Add additional information if available

    • -
    • Press Insert to save the entry

    • -
    • Add a file if desired by using the File tab

    • +
    • Select an appropriate Type from the list such as humerus or +skull

    • +
    • Add additional information; keep in mind that some additional form fields +might be required to save information

    • +
    • Press Insert to save the entry or Insert and continue to add +another bone or tooth to the same super immediately

    • +
    • Add a file or citation if desired by using the File tab

    -

    You can also enter Human remains by going to the stratigraphic unit you want to link the information to. Click the -Human remains tab and + Human remains button afterwards.

    +

    Human remains can also be added directly to a place or feature, e.g. to add +stray finds to a place. To do so, go to the place or feature you want to add +the remains to. Click the Artifact tab and then the + Human remains +button. +The “super” of a human remains entry (a place, feature, or stratigraphic unit) +can be changed in the form after pressing the Edit button. +You can also create human remain entries by clicking the artifact tab in the +menu and the + Human remains button afterwards. The remains can then be +linked to an existing super in the form.

    @@ -196,7 +265,7 @@

    Adding human remains to the stratigraphic unit - +
    diff --git a/openatlas/static/manual/examples/artifacts.html b/openatlas/static/manual/examples/artifacts.html index 9b42ee298..ef015b552 100644 --- a/openatlas/static/manual/examples/artifacts.html +++ b/openatlas/static/manual/examples/artifacts.html @@ -104,7 +104,7 @@

    Artifacts
  • Artifact: A physical object, made by humans – e.g. a coin, -a letter or a tool

  • +a letter, or a tool

  • Actor: As creator and/or owner of the artifact

  • Event: Creation of the artifact

  • File: You can upload an image file connected to the artifact

  • @@ -119,56 +119,54 @@

    Add a new artifactType from the list

  • Owned by: If applicable, choose an owner of the artifact, e.g. a museum -it is stored at

  • -
  • Add further information e.g. date or description or choose option +it is stored at or a person who possesses the artifact

  • +
  • Add further information such as date or description or choose options from type trees

  • Press Insert to save the entry

  • Regarding date: the begin date represents the creation of the artifact and can -be entered as a time span. Regarding the description field: this can be used -to record information that is not covered by the several types you can choose -from above. Keep in mind, it has several advantages to cover as much information -as possible by using types over free text in the description field. If there is -no fitting type, please follow this instructions -to add new types to the list. Please note, that “owned by” is not used to link -a creator of an artifact. You can link a creator by adding a creation event -(see below).

    +be entered as a time span. +Regarding the description field: this can be used to record information +that is not covered by the various types. Keep in mind, using types +has advantages over free text in the description field (Especially for the +presentation of an artifact on the presentation site). +If there is no fitting type, please follow this +instruction to add new types to the list. Please +note, that “owned by” is not used to link a creator of an artifact. You can +link a creator by adding a creation event (see below).

    Add a reference to the artifact

    -

    To link a reference to the newly created artifact, choose +

    To link a reference to a newly created artifact, choose Reference from the tabs

    ../_images/reference_tab.png

    Then choose from the following options:

    • Link the artifact to an already existing reference by using the Link button

    • -
    • Create a new Reference by using the +Bibliography or -+Edition button

    • +
    • Create a new Reference by using the + Bibliography or ++ Edition button

    • Create a new external reference by using the -+External reference button

    • ++ External reference button

    Add a file to the artifact

    -

    To add an image file to the artifact, choose File from the tabs. Then choose -from the following options:

    +

    To add an image file (or any other sort of file, really) to the artifact, +choose File from the tabs. Then choose from the following options:

    • Link the artifact to an already uploaded file

    • -
    • Upload a new file by using the +File button, you can add information and +

    • Upload a new file by using the + File button, you can add information and choose a file here

    diff --git a/openatlas/static/manual/examples/index.html b/openatlas/static/manual/examples/index.html index 6ac4074c0..fafaef162 100644 --- a/openatlas/static/manual/examples/index.html +++ b/openatlas/static/manual/examples/index.html @@ -97,10 +97,11 @@

    Examples

    -

    Here, you can find step by step - examples for typical data entry scenarios, some of them are -very project-specific. Please keep in mind, that there are different ways to enter the same -set of data. The following examples are suggestions, but please discuss the best workflow for your project within -your team.

    +

    Here, you can find step by step - examples for typical data entry scenarios, +some of them are very project-specific, others have a broader scope. Please +keep in mind, that there are always several different ways to enter the same +set of data. The following examples are suggestions, but please discuss the +best workflow for your project within your team.

    General

    diff --git a/openatlas/static/manual/examples/journey.html b/openatlas/static/manual/examples/journey.html index 32b4c7601..3ec5c840d 100644 --- a/openatlas/static/manual/examples/journey.html +++ b/openatlas/static/manual/examples/journey.html @@ -100,32 +100,35 @@

    Journey

    -

    The following steps describe how to enter a journey as move event. For more -information on move events in general see this tutorial. +

    A journey can be tracked in OpenAtlas as a series of move events as +described in the following steps. For more information on move events in +general see this tutorial. On move events concerning artifacts, have a look at the letter tutorial.

    -

    These steps describe how to enter a journey as special case of a move -event. To create a new move event following elements are involved in the +

    The following steps describe how to enter a journey as special case of a move +events. To create a new move event the following elements are involved in the procedure:

      -
    • Actor: the person/persons that went on a journey

    • -
    • Event: the Move of the letter from one place to another

    • -
    • Place: start or end point of the journey

    • -
    • Type: used for classification, can be extended by users

    • +
    • Actor: The person/persons that moved/went on a journey

    • +
    • Event: The Move of a letter or person from one place to +another

    • +
    • Place: Start or end point of the move event

    • +
    • Type: Used for classification, list of types can be extended +by users

    Adding actors

    If not all actors involved in the journey were entered into the database already, add them via a click on the respective tab in the menu. Here, click the + Person button to get to -the form. As for all other forms, a name is required to save the data.

    +the form. As for all other forms, at least a name is required to save the data.

    Adding locations

    -

    If not all locations involved in the journey were -entered into the database already, add them via a click on the respective -tab in the menu. Here, click the + Place button to get to -the form. As for all other forms, a name is required to save the data.

    +

    If not all locations involved in the journey were already +entered into the database, add them via a click on the respective tab in the +menu. Here, click the + Place button to get to +the form. As for all other forms, at least a name is required to save the data.

    Creating the move event

    @@ -134,10 +137,10 @@

    Creating the move event

    Click on the Event tab in the menu then use the + Move button

  • Fill out the form, for more information see the move event tutorial.

  • -
  • Link persons in this form who made the journey

  • +
  • Link one or more persons that went on the trip

  • Please also note: Use preceding event to document multiple parts of a trip. Unlike sub events, these can be put in chronological -order. Sub events are there to capture events that happen at the same time +order. Use sub events to capture events that happen at the same time (for more information see move event tutorial).

  • Click the Insert button to save the data or Insert and continue button to save and start to enter another move event

  • @@ -149,18 +152,18 @@

    Link actors to the journey -
  • At type you can define the role of the actor in the journey; if -there is no suitable entry in the list, a new type can be created -depending on the user’s authorization, see the types -tutorial.

  • +
  • Via type you can define the role of an actor in a journey; if +there is no suitable type in the list, a new one can be created +depending on the user’s OpenAtlas status. For more see the +types tutorial.

  • The actor can be changed afterwards via the Change button

  • -
  • The form of participation can be determined

  • -
  • In addition, dates for the participation (in case they differ from the -event) and a free text description are possible

  • +
  • In addition, dates for a participation (in case they differ from the +event) and a free text description can be added

  • diff --git a/openatlas/static/manual/examples/letters.html b/openatlas/static/manual/examples/letters.html index f89c23939..4c770d254 100644 --- a/openatlas/static/manual/examples/letters.html +++ b/openatlas/static/manual/examples/letters.html @@ -19,7 +19,7 @@ - + @@ -100,28 +100,27 @@

    Letters

    -

    The following steps describe how to enter a letter exchange event. +

    The following step by step instruction describes how to enter a letter +exchange event. The following elements are involved in the procedure:

      -
    • Artifact: the physical presentation of the letter

    • -
    • Source: the content of the letter

    • -
    • Event: the Move of the letter from one place to another

    • +
    • Artifact: The physical presentation of the letter

    • +
    • Source: The content of the letter

    • +
    • Event: The Move of the letter from one place to another

    • Place: Start or end point of the letter exchange

    • Actor: Sender/recipient of the letter

    • -
    • Type: used for classification, can be extended by users

    • +
    • Type: Used for classification, can be extended by users

    Adding an artifact

    -

    The created artifact is the physical presentation of the letter and the -following data concerns the object e.g. the begin date would be the creation of -the letter, the description can be used to record e.g. the material of -the object.

    +

    The created artifact is the physical presentation of the letter. So the +begin of the date field would be the creation of the letter, etc.

    • Click on Artifact in the Menu and create a new entry by using the + Artifact button

    • Choose a descriptive name

    • -
    • Select an appropriate Type from the list, e.g. letter

    • -
    • Add further information as date or description if available

    • +
    • Select an appropriate Type from the list, such as letter

    • +
    • Add further information e.g. a date or description

    • Press Insert to save the entry

    @@ -136,38 +135,40 @@

    Adding a sourceType from the list

  • Click on Artifact and choose the before created letter from the list

  • +
  • Add more information as desired

  • Press Insert to save the entry

  • -

    It is important to link the artifact to the source in this way to reflect that -it is the source written on the letter. +

    Please note: It is important to link the artifact to the source in this way +to reflect that it is the source written on the letter. If you would link it using the tab Artifact it means the source refers to the artifact instead.

    Adding the move event

    -

    This creates an entry concerning the movement of the letter.

    +

    Now you can create a move event to track the sending of the letter from +one location to the other:

    • After saving the source, you can see the linked artifact with its name in the -source view and click on it

    • +source view. Click on it

    • In the artifact view click on the Event tab in the menu and create a new move with the + Move button

    • Choose a descriptive name

    • Select an appropriate Type from the list, e.g. letter exchange

    • -
    • With from and to you can choose the starting and ending location of the +

    • With from and to you can choose the start and end location of the move

    • -
    • The respective artifact should already be preset

    • +
    • The respective artifact should already be selected

    • If available, enter the dates for the letter exchange

    • Press Insert to save the entry

    Adding sender and recipient

    -

    Now you can link one actor at a time to the move event by the following steps.

    +

    Now you can link one actor at by using the following steps:

    • Open the created event by clicking on it in the event tab of the move

    • Click on the Actor tab

    • -
    • Either link an already entered person with Link or create a new one with -+ Person button

    • +
    • Either link an already exiting person from the list with Link or +create a new one by using the + Person button

    • When entering the involvement information, choose the actor and add the respective type (sender/recipient)

    • Press Insert to save the entry

    • @@ -179,7 +180,7 @@

      Adding sender and recipient - + diff --git a/openatlas/static/manual/examples/move_event.html b/openatlas/static/manual/examples/move_event.html index f32950166..7cee7ff12 100644 --- a/openatlas/static/manual/examples/move_event.html +++ b/openatlas/static/manual/examples/move_event.html @@ -106,7 +106,7 @@

      Move events

      As move events are a subgroup of events, click Event in the menu to create a new entry. This will bring you to the -event overview page where you can find the +Move button. +event overview page where you can find the + Move button. By clicking it a form will open in which you can add the following information:

        @@ -120,18 +120,17 @@

        Create a new move event - general instructionJourney tutorial). You can -select the event from a list of already entered events. If the event you are -looking for cannot be found in this list, please add it via Event in the -menu and then link it

        +temporal sequence, use preceding event (for a short introduction see +the Adding actors tutorial). You can select the event from a list of +already entered events. If the event you are looking for cannot be found +in this list, please add it via Event in the menu and then link it

      • You can add a preceding event, for more information see -above or the Journey tutorial

      • +above or the Adding actors tutorial

      • Via from you can add a location from where the move event started, think of the starting point of a journey or the place a letter was sent from. You can choose a location from a list of already added locations. If the place you are looking for is not in this list yet, please add it via -Place menu and then link it

      • +Place in the menu and then link it

      • Via to, you can add the end location of the move event. For more information check from (above in this tutorial)

      • If an artifact was moved by the event, e.g. a letter that was sent, you @@ -142,19 +141,19 @@

        Create a new move event - general instructionJourney tutorial.

      • +Adding actors tutorial.

      • It is possible to link the move event by using external references (find more information here)

      • -
      • Enter a start and end date of the move event

      • +
      • Enter a start and end date of the move event if known

      • Additionally you can enter a description of the event as free text

      By clicking the Insert or Insert and continue button you can save the entered data. After saving the information, you can link sources, actors, -references, files and notes via the respective buttons on the landing page of +references, files, and notes via the respective buttons on the landing page of your new entry.

      For more information on move events including an artifact, please see the example on Letters. On how to enter a journey, please refer -to the Journey tutorial.

      +to the Adding actors tutorial.

    diff --git a/openatlas/static/manual/examples/places.html b/openatlas/static/manual/examples/places.html index a2af618d0..2fd2edda9 100644 --- a/openatlas/static/manual/examples/places.html +++ b/openatlas/static/manual/examples/places.html @@ -100,7 +100,7 @@

    Places

    -

    Here you can find out how to enter new places and how to use the map.

    +

    Below, you can find out how to enter new places and how to use the map.

    Create a new place

    To start entering a new Place click the Place @@ -111,7 +111,7 @@

    Create a new placeAlias. Please keep in mind: Place names in other -languages can be covered by using Geonames as +languages can be covered by using Geonames as a Reference System

  • Select a fitting Type from the list. If none can be found, you can add new types (depending on your user group). You can find more @@ -126,7 +126,7 @@

    How to use the mapMap has multiple functionalities:

    • You can zoom in and out by using the + and - button or make the -map full screen as well

    • +map full screen

    • Use the magnifying glass to search for places. Type a place name in the search field, press enter and choose the correct place from the list. The map will zoom to the chosen location and a pop-up will be shown. @@ -139,31 +139,33 @@

      How to use the map

      Reference Systems - GeoNames

      You can also link your data to GeoNames without using the map. To do so, -type the respective GeoNames identifier in the dedicated field and choose if +add the respective GeoNames identifier in the dedicated field and choose if it is an exact match or close match. Please note: As for all references systems, information can not be saved without stating which kind of match it is.

      diff --git a/openatlas/static/manual/examples/profession.html b/openatlas/static/manual/examples/profession.html index a1a41ce9e..2de0ec834 100644 --- a/openatlas/static/manual/examples/profession.html +++ b/openatlas/static/manual/examples/profession.html @@ -100,21 +100,23 @@

      Profession

      -

      The following steps describe how to enter a profession connected to a person. -In OpenAtlas a profession exists in connection to a group (e.g. an institute, country, etc.). +

      The following steps describe how to enter the profession of a person +In OpenAtlas a profession exists in connection to a group e.g. a group of +people working as bakers or professors at a university. To add a profession to a person, follow the steps below:

        -
      • Create a person, see Actor

      • -
      • Create a group, see Actor

      • -
      • Press the Member of tab in the actor

      • +
      • Create a person, see Actor, for example “Max Mustermann”

      • +
      • Create a group, see Actor, such as “Historians”

      • +
      • In the actor form, press the Member of tab

      • Click the Link button

      • In the form use Type to choose the function of the person within the group

      • Choose the specific group or groups in the Actor field

      • Add date and/or description if desired

      -

      You can get the same result by using the Member tab in the group view and link a person there.

      -

      Keep in mind that it is possible to edit the available functions or add new ones in Type -via Standard types and Actor function.

      +

      You can get the same result by using the Member tab in the group view +and link a person there.

      +

      Keep in mind that it is possible to edit the available functions or add new +ones in Type via Standard types and Actor function.

  • diff --git a/openatlas/static/manual/examples/reference_systems.html b/openatlas/static/manual/examples/reference_systems.html index bd348c2ca..820d00be2 100644 --- a/openatlas/static/manual/examples/reference_systems.html +++ b/openatlas/static/manual/examples/reference_systems.html @@ -100,11 +100,11 @@

    References Systems

    -

    To create Linked Open Data (LOD) it is possible to link data entered -into the database with a Reference System. Online available +

    To create Linked Open Data (LOD) it is possible to connect entered +information with a Reference System. Online available controlled vocabularies and gazetteers are particularly suitable for this. But it is also possible to link your own data with analog resources, -e.g. card catalogs or inventory data from museums.

    +such as card catalogs or inventory data from museums.

    Wikidata and GeoNames are available in OpenAtlas by default but other applications can be added by the users. To see which reference systems are already available on your OpenAtlas instance, click the Reference system button on the start @@ -118,17 +118,17 @@

    References Systems

    To create a new reference system click the Reference System button on the starting page of your OpenAtlas instance. You will then see a list with -all already added external references. -If permissions to create additional external references are available, a -+Reference system button can also be found here. Click it to get into -the form. Here you can fill in the following fields:

    +already added external references. +If you user group has permission to create additional external references a ++ Reference system button is displayed. Click it to get into the form. +Here you can add the following information:

    • Name: Choose a descriptive name; as for other forms, a name is required to save data.

    • Website URL: State the vocabulary’s/gazetteer’s URL, e.g. https://www.wikidata.org for Wikidata

    • Resolver URL: Put in an URL that brings you to the respective entry -when combined with an ID e.g. https://www.wikidata.org/wiki/ see for +when combined with an ID e.g. https://www.wikidata.org/wiki/ - see for example https://www.wikidata.org/wiki/Q3044 where Q3044 is an ID (the link will bring you directly to Charlemagne’s entry in Wikidata)

    • Example ID: An example ID can be specified, which is then used as an @@ -143,27 +143,27 @@

      Create a new reference systemSKOS based definitions of confidence

        -
      • choose Close match if the data base entry and the entity in the -vocabulary are sufficiently similar and can be used interchangeably in some +

      • choose Close match if your entry and the entity in the vocabulary +are sufficiently similar and can be used interchangeably in some information retrieval application (think a D-shaped belt buckle is a close match to a belt buckle (Wikidata ID Q3180027) or the historic Vienna is a close match to today’s Vienna as it is included in Geonames)

      • choose Exact match if there is a high degree of confidence that the entered data and the vocabulary’s entity are interchangeable (think -Charlemagne - the King of Franks, King of Lombards and became Holy Roman +Charlemagne - the King of Franks, King of Lombards who became Holy Roman Emperor in 800 AD is an exact match to Q3044 in Wikidata or the Venus of Willendorf in the Natural History Museum Vienna is an exact match to the entity Q131397 (Venus of Willendorf) in Wikidata)

    • -
    • Classes: Select here in which forms the new external reference should +

    • Classes: Select in which forms the new external reference should be displayed. This can appear in one or more forms

    • Description: you can add a description as free text if desired

    Save the information to the database by clicking the Insert button.

    Please keep in mind: When information is entered into a reference system -field in a form, the data in this form can only be saved if an -external reference match is also specified.

    +field in a form, the data in this form can only be saved if an external +reference match is also specified.

    diff --git a/openatlas/static/manual/examples/time_spans.html b/openatlas/static/manual/examples/time_spans.html index ff97e173e..e6cd24edc 100644 --- a/openatlas/static/manual/examples/time_spans.html +++ b/openatlas/static/manual/examples/time_spans.html @@ -101,17 +101,17 @@

    Time Spans

    This section is focused on how the Date input fields work -and how to put in time spans correctly.

    +and how to enter time spans correctly.

    Where to find the input fields

    -

    Date input fields can be found on the following:

    +

    Date input fields can be found on the following forms:

    It is not provided for the input of:

    @@ -133,12 +133,12 @@

    How to enter dates and time spans

    If dating is uncertain, time spans for the beginning, end or beginning and end of the time span can be given. -This is possible via the four input fields of the date field - 2 for begin -and to for end:

    +This is possible via the four input fields of the date field - two for begin +and two for end:

    • The first line represents the beginning of the begin

    • The second line represents the end of the begin

    • @@ -177,26 +177,28 @@

      Time spans

    Activate hours, minutes, and seconds

    By default, years, months and days can be entered into the date input field. -However, some projects might want to also track hours, minutes, and seconds. +However, some projects might need to also track hours, minutes, and seconds. Those additional input fields can be activated in your profile. To do so click the gear and go to Profile. Here click Modules. Click on the Edit button and check -“Time” to turn it on. You might have to refresh your page for it to show in -the form.

    +Time to turn it on. You might have to refresh your form page afterwards +(keyboard buttons ctrl + F5).

    ../_images/date_hours.png
    diff --git a/openatlas/static/manual/examples/types.html b/openatlas/static/manual/examples/types.html index 9146a8c26..25dc7234c 100644 --- a/openatlas/static/manual/examples/types.html +++ b/openatlas/static/manual/examples/types.html @@ -102,39 +102,51 @@

    Types

    Types are used to add information to all entities. They are organized hierarchically into trees and specific for each project. +Furthermore, types help to show information in an organized way on a +presentation site. So use types instead of free text wherever possible. There are different kind of types: A distinction is made between different groups of types:

      -
    • Standard types

    • -
    • Custom types

    • -
    • Value types

    • +
    • Standard types - These are the types displayed as “Type” in each form. +They are used to specify each entity. They are single select only and can +not be renamed or deleted (the subtypes can); some standard types are +pre-installed

    • +
    • Custom types - These types help to customize each instance of OpenAtlas; +they can be created, edited, renamed, and deleted by each project to cover +as much information on their data as possible; only few types come +pre-installed as examples

    • +
    • Value types - These are used to add numerical information such as +measurements

    Different user groups have different permissions regarding the creation and modification of types. Further information can be found in the manual entry -regarding Type. Please note that possibility to add and edit +regarding Type. Please note that the possibility to add and edit types depends on the user group, see User.

    -

    An overview of the types already created can be accessed by clicking Types menu -item. Furthermore, new types can be created here if necessary.

    +

    An overview of the types already created can be accessed by clicking the Types +menu item. Furthermore, new types can be created here if necessary.

    ../_images/type_1.png

    Create a new type tree

    -

    To create a new custom type or value type tree press the +Type button on the -bottom of the page. Please fill out the form:

    +

    To create a new custom type or value type tree press the +Type button. +Please fill out the form:

    • Choose a descriptive name for the new type

    • -
    • Decide if the type is single or multiple choice (only available for custom +

    • Decide if the type is single or multiple select (only available for custom types)

    • -
    • Choose to which classes the new type will be added to e.g. -Artifact or Place.

    • -
    • You can also enter text into the description field which will be displayed -when you mouse-over the information button next to the type’s name in forms.

    • +
    • Choose to which classes the new type will be added, e.g. +Artifact or Place; the typ will only be +shown in the related form

    • +
    • You can also enter text into the description field which will be +displayed when you mouse-over the information button next to the type’s +name in forms.

    -

    By pressing insert you can create a new type tree.

    -

    To edit an already existing type tree, go to the type you want to edit, click on -its name and push the edit button next to the name.

    +

    By pressing insert you can create a new type tree.

    +

    To edit an already existing type tree, go to the type you want to edit, +click on its name and push the edit button next to the name.

    ../_images/type_2.png

    You can edit the type’s name, chosen classes and description. Please note that -changing multiple to single choice is not possible.

    +changing multiple to single choice is not always possible. For more +information see Type.

    Add a type to an existing type tree

    diff --git a/openatlas/static/manual/searchindex.js b/openatlas/static/manual/searchindex.js index a992f994f..9d01c46fb 100644 --- a/openatlas/static/manual/searchindex.js +++ b/openatlas/static/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["admin/api", "admin/arche", "admin/content", "admin/data_integrity_checks", "admin/execute_sql", "admin/export", "admin/general", "admin/iiif", "admin/import", "admin/index", "admin/mail", "admin/map", "admin/modules", "admin/presentation_site", "admin/user", "admin/vocabs", "entity/actor", "entity/artifact", "entity/event", "entity/feature", "entity/file", "entity/human_remains", "entity/index", "entity/navigation", "entity/place", "entity/reference", "entity/reference_system", "entity/source", "entity/stratigraphic_unit", "entity/type", "examples/archaeological_data", "examples/artifacts", "examples/index", "examples/journey", "examples/letters", "examples/move_event", "examples/places", "examples/profession", "examples/reference_systems", "examples/time_spans", "examples/types", "faq", "features", "index", "model/cidoc_crm", "model/index", "model/link_checker", "model/openatlas_classes", "model/openatlas_shortcuts", "model/references", "overview", "technical/api", "technical/application_structure", "technical/database_structure", "tools/anthropological_analyses", "tools/image_annotation", "tools/index", "tools/map", "tools/network", "tools/notes", "tools/profile", "tools/radiocarbon_dating", "tools/search", "troubleshooting/display", "troubleshooting/error_codes", "troubleshooting/index", "troubleshooting/login", "ui/alias", "ui/date", "ui/description", "ui/form", "ui/menu", "ui/name", "ui/table"], "filenames": ["admin/api.rst", "admin/arche.rst", "admin/content.rst", "admin/data_integrity_checks.rst", "admin/execute_sql.rst", "admin/export.rst", "admin/general.rst", "admin/iiif.rst", "admin/import.rst", "admin/index.rst", "admin/mail.rst", "admin/map.rst", "admin/modules.rst", "admin/presentation_site.rst", "admin/user.rst", "admin/vocabs.rst", "entity/actor.rst", "entity/artifact.rst", "entity/event.rst", "entity/feature.rst", "entity/file.rst", "entity/human_remains.rst", "entity/index.rst", "entity/navigation.rst", "entity/place.rst", "entity/reference.rst", "entity/reference_system.rst", "entity/source.rst", "entity/stratigraphic_unit.rst", "entity/type.rst", "examples/archaeological_data.rst", "examples/artifacts.rst", "examples/index.rst", "examples/journey.rst", "examples/letters.rst", "examples/move_event.rst", "examples/places.rst", "examples/profession.rst", "examples/reference_systems.rst", "examples/time_spans.rst", "examples/types.rst", "faq.rst", "features.rst", "index.rst", "model/cidoc_crm.rst", "model/index.rst", "model/link_checker.rst", "model/openatlas_classes.rst", "model/openatlas_shortcuts.rst", "model/references.rst", "overview.rst", "technical/api.rst", "technical/application_structure.rst", "technical/database_structure.rst", "tools/anthropological_analyses.rst", "tools/image_annotation.rst", "tools/index.rst", "tools/map.rst", "tools/network.rst", "tools/notes.rst", "tools/profile.rst", "tools/radiocarbon_dating.rst", "tools/search.rst", "troubleshooting/display.rst", "troubleshooting/error_codes.rst", "troubleshooting/index.rst", "troubleshooting/login.rst", "ui/alias.rst", "ui/date.rst", "ui/description.rst", "ui/form.rst", "ui/menu.rst", "ui/name.rst", "ui/table.rst"], "titles": ["API", "ARCHE", "Content", "Data integrity checks", "Execute SQL", "Export", "General", "IIIF", "Import", "Admin", "Mail", "Map", "Modules", "Presentation site", "User", "Vocabs", "Actor", "Artifact", "Event", "Feature", "File", "Human remains", "Entity", "<no title>", "Place", "Reference", "Reference System", "Source", "Stratigraphic unit", "Type", "Archaeological data", "Artifacts", "Examples", "Journey", "Letters", "Move events", "Places", "Profession", "References Systems", "Time Spans", "Types", "FAQ", "Features", "OpenAtlas manual", "CIDOC CRM", "Model", "Link checker", "OpenAtlas classes", "OpenAtlas shortcuts", "References", "Overview", "API", "Application Structure", "Database Structure", "Anthropological Analyses", "Image annotation", "Tools", "Map", "Network visualization", "Notes", "Profile", "Radiocarbon Dating", "Search", "Display Errors", "Error Codes", "Troubleshooting", "Login", "Alias", "Date", "Description", "Form", "Menu", "Name", "Table"], "terms": {"descript": [0, 1, 8, 12, 16, 17, 18, 19, 20, 21, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 41, 44, 48, 49, 51, 55, 57, 62, 70, 73], "public": [0, 7, 26, 43, 49, 51, 53, 59], "default": [0, 3, 6, 7, 8, 11, 12, 14, 15, 20, 29, 38, 39, 52, 57, 58, 59, 60], "off": [0, 73], "If": [0, 1, 3, 4, 8, 13, 15, 17, 20, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 49, 51, 57, 58, 62, 66, 68], "turn": [0, 39, 66, 68], "file": [0, 1, 5, 7, 8, 9, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 35, 42, 43, 47, 52, 55, 57, 60], "licens": [0, 1, 20, 26, 41], "can": [0, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 22, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 71, 73], "still": [0, 18, 41, 51, 60], "access": [0, 4, 7, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 40, 42, 43, 46, 54, 60, 61, 64], "A": [0, 1, 3, 4, 5, 13, 15, 16, 17, 19, 20, 21, 24, 26, 28, 29, 30, 31, 35, 36, 40, 41, 44, 49, 50, 51, 52, 63, 69], "browser": [0, 6, 20, 51, 52, 58], "us": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 62, 63, 64, 67, 68, 69, 70, 72, 73], "b": 0, "log": [0, 2, 6, 14, 50, 60, 63], "user": [0, 1, 3, 5, 6, 8, 9, 10, 12, 15, 26, 29, 30, 33, 34, 35, 36, 38, 40, 44, 45, 47, 49, 51, 52, 53, 59, 60, 64, 71], "ip": 0, "request": [0, 6, 51, 64, 66], "comput": [0, 20], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 68, 72], "whitelist": 0, "link": [0, 1, 2, 5, 8, 9, 13, 15, 22, 26, 30, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 48, 49, 50, 51, 53, 55, 57, 58, 60, 63, 64, 66, 71], "without": [0, 7, 8, 9, 10, 18, 36, 41, 44, 45, 51, 58, 62], "being": [0, 26, 41], "thi": [0, 3, 4, 5, 7, 8, 13, 14, 16, 17, 18, 20, 22, 24, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51, 52, 54, 55, 57, 58, 61, 62, 63, 64, 65, 68], "might": [0, 3, 4, 16, 29, 35, 39, 41], "you": [0, 3, 4, 7, 8, 11, 12, 14, 15, 20, 22, 24, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 52, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 71, 73], "want": [0, 3, 8, 29, 30, 31, 39, 40, 41, 58], "allow": [0, 3, 6, 15, 18, 20, 39, 41, 42, 51, 55, 62, 72], "other": [0, 3, 8, 14, 16, 18, 20, 24, 26, 30, 31, 33, 35, 36, 38, 41, 42, 51, 52, 58, 59, 60], "system": [0, 5, 9, 14, 16, 17, 18, 21, 22, 24, 29, 32, 41, 42, 43, 44, 45, 53, 68, 69], "your": [0, 1, 3, 4, 8, 20, 32, 35, 36, 38, 39, 41, 44, 50, 51, 57, 58, 59, 60, 64, 66, 73], "data": [0, 4, 5, 8, 9, 14, 19, 21, 22, 24, 26, 28, 29, 32, 33, 34, 35, 36, 38, 39, 40, 43, 44, 45, 51, 53, 57, 58, 59, 61, 62, 69, 70], "restrict": [0, 39, 41, 64], "resourc": [1, 38, 49], "centr": 1, "human": [1, 8, 16, 17, 18, 22, 24, 28, 31, 42, 43, 44, 47, 51, 54], "servic": [1, 15, 26, 42], "aim": 1, "offer": [1, 8, 42, 55], "stabl": [1, 47, 51], "persist": [1, 47], "host": [1, 10, 26], "well": [1, 21, 24, 30, 36, 39, 40, 41, 42, 44, 45, 47, 48, 71], "dissemin": 1, "digit": [1, 7, 22, 39, 42, 44, 49], "research": [1, 29, 42, 61], "In": [1, 3, 5, 7, 14, 19, 20, 21, 24, 25, 28, 30, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 49, 51, 54, 55, 56, 61, 63, 65], "order": [1, 15, 30, 33, 35, 42, 48, 49], "import": [1, 3, 9, 14, 34, 36, 41, 42, 43, 44, 45, 52, 53, 56, 60, 72], "openatla": [1, 3, 5, 7, 8, 13, 15, 18, 19, 20, 21, 24, 26, 28, 29, 30, 35, 37, 38, 41, 42, 44, 45, 46, 49, 51, 52, 53, 63, 68], "chang": [1, 6, 10, 18, 20, 26, 29, 30, 31, 33, 36, 40, 41, 51, 56, 57, 58], "instanc": [1, 7, 8, 10, 15, 20, 29, 38, 42, 44, 46, 48, 51, 52, 53], "product": [1, 10, 15, 17, 20, 21, 31, 51, 54], "py": [1, 10, 15, 20, 51, 52], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, 64, 66, 68, 69, 70, 72, 73], "need": [1, 15, 29, 31, 41, 45, 47, 49, 51, 52, 57], "ask": [1, 22, 41], "administr": [1, 8, 36], "further": [1, 8, 30, 31, 34, 36, 38, 40, 47, 51, 57], "detail": [1, 3, 6, 8, 13, 14, 16, 17, 18, 20, 22, 23, 24, 25, 26, 27, 29, 40, 41, 42, 44, 45, 51, 52, 55, 58, 68], "id": [1, 8, 13, 36, 38, 49, 51, 57, 61, 64], "0": [1, 39, 41, 51, 54, 68], "top": [1, 2, 15, 41, 44, 49, 57, 58, 60, 63, 71, 73], "collect": [1, 15, 39], "project": [1, 3, 9, 13, 20, 26, 32, 39, 40, 42, 43, 53, 60, 66], "acdh": [1, 15], "topcollect": 1, "url": [1, 7, 11, 13, 15, 20, 25, 26, 38, 41, 44, 49, 52], "http": [1, 7, 13, 15, 26, 38, 51], "curat": 1, "dev": 1, "oeaw": 1, "ac": 1, "base": [1, 15, 21, 26, 36, 38, 42, 45, 48, 51, 53, 57, 68], "get": [1, 7, 8, 33, 36, 37, 38, 59, 66], "The": [1, 3, 5, 7, 8, 10, 16, 18, 20, 22, 24, 26, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 64, 71, 72], "button": [1, 3, 5, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 51, 54, 55, 57, 58, 60, 61, 66, 71, 73], "displai": [1, 2, 3, 4, 6, 8, 10, 13, 14, 15, 20, 25, 26, 29, 36, 38, 40, 43, 44, 45, 47, 50, 51, 52, 56, 59, 61, 65, 73], "admin": [1, 4, 5, 8, 13, 14, 15, 20, 26, 38, 43, 51, 57, 59, 60], "menu": [1, 7, 20, 22, 27, 29, 30, 31, 33, 34, 35, 36, 40], "onli": [1, 3, 4, 6, 7, 8, 14, 15, 16, 19, 20, 26, 29, 38, 39, 40, 41, 45, 48, 51, 55, 57, 58, 59, 61, 62, 64, 68], "mention": [1, 16, 17, 20, 21, 30], "abov": [1, 3, 31, 35, 42, 60, 63], "made": [1, 10, 17, 31, 33, 36, 40, 41, 47, 52], "click": [1, 3, 4, 5, 14, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 46, 50, 54, 55, 57, 60, 66, 68, 73], "section": [1, 39, 51], "provid": [1, 7, 8, 15, 20, 25, 26, 39, 41, 45, 51, 54, 60, 61, 62, 63, 64], "part": [1, 3, 17, 18, 19, 21, 27, 28, 33, 39, 41, 49, 55, 59], "manag": [1, 5, 8, 14, 15, 26, 29, 38, 43, 52, 59, 60, 66, 68], "group": [1, 8, 9, 15, 16, 17, 18, 21, 26, 29, 31, 33, 35, 36, 37, 38, 40, 41, 42, 53, 55, 64], "list": [1, 3, 5, 8, 16, 17, 18, 20, 23, 24, 25, 26, 27, 30, 31, 33, 34, 35, 36, 38, 41, 42, 49, 50, 51, 55], "tabl": [1, 6, 8, 14, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 42, 48, 49, 50, 60, 72], "artifact": [1, 3, 8, 15, 16, 18, 21, 22, 24, 27, 28, 29, 32, 33, 35, 39, 40, 43, 55, 71], "wa": [1, 8, 16, 17, 18, 22, 29, 31, 35, 36, 39, 48, 51, 52, 55, 60, 66, 68], "shown": [1, 3, 4, 5, 8, 13, 20, 25, 26, 29, 36, 38, 41, 58, 60, 68], "all": [1, 5, 8, 10, 11, 14, 15, 20, 29, 30, 31, 33, 34, 36, 38, 39, 40, 41, 44, 45, 47, 48, 49, 51, 52, 60, 63, 69], "metadata": 1, "gather": 1, "exif": 1, "endpoint": [1, 15, 43], "first": [1, 3, 4, 8, 10, 20, 21, 22, 30, 31, 36, 39, 42, 68], "imag": [1, 6, 7, 18, 30, 31, 41, 43, 49, 52, 53, 56, 57, 58, 60], "2_jpg": 1, "addition": [1, 35, 62], "correspond": [1, 3, 7, 8, 26, 29, 36, 38, 39, 47, 60], "png": [1, 7, 20, 58], "4_orthophoto": 1, "taken": [1, 48], "necessari": [1, 20, 29, 30, 38, 40, 41, 49, 61], "new": [1, 8, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 29, 33, 34, 37, 41, 55, 56, 60, 66], "person": [1, 3, 4, 8, 16, 17, 18, 21, 22, 26, 31, 33, 34, 35, 37, 41, 42, 49, 55, 59, 60, 62], "etc": [1, 3, 6, 19, 21, 24, 28, 30, 37, 49, 51, 52, 71], "ad": [1, 14, 15, 18, 21, 26, 29, 31, 35, 38, 39, 40, 43, 51, 55, 56, 59, 61, 62], "dure": [1, 3, 18, 25, 31, 45], "process": [1, 5, 6, 8, 20, 41, 52], "custom": [1, 5, 8, 14, 15, 20, 30, 40, 43], "hierarchi": [1, 5, 9, 15, 18, 24], "relev": [1, 30], "actor": [1, 17, 18, 20, 21, 22, 24, 25, 27, 29, 31, 34, 35, 37, 39, 43, 44, 48, 60, 67, 68], "e21": [1, 16, 49], "involv": [1, 9, 18, 30, 31, 33, 34], "e65": [1, 18], "creation": [1, 6, 30, 34, 38, 40], "p": [1, 44], "cidoc_ent": 1, "e12": [1, 18, 48], "event": [1, 3, 16, 17, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 32, 39, 43, 48], "addit": [1, 14, 30, 33, 36, 38, 39, 41, 42, 45, 51, 54, 59, 68, 69], "copyright": [1, 49], "name": [1, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 44, 47, 48, 49, 60, 62, 70, 73], "e22": [1, 17, 48], "object": [1, 7, 17, 21, 27, 31, 34, 36, 42, 45, 47, 49, 57], "graffito": 1, "iptc": 1, "objectnam": 1, "xmp": 1, "p67": [1, 49], "e32": [1, 26, 49], "e53": [1, 24, 48], "place": [1, 3, 9, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31, 32, 33, 34, 35, 39, 40, 41, 42, 43, 44, 47, 48, 49, 51, 57, 60, 62, 63, 67, 71], "locat": [1, 16, 18, 19, 24, 34, 35, 36, 42, 44, 51, 52, 57, 66], "p53": 1, "gpslatitud": 1, "gpslongitud": 1, "date": [1, 5, 9, 14, 16, 17, 18, 19, 21, 24, 28, 29, 30, 31, 33, 34, 35, 36, 37, 40, 43, 56, 60, 62, 63, 70], "created": 1, "p11": [1, 44, 48], "p108": 1, "p14": 1, "p92": [1, 48], "e31": [1, 20, 25, 47, 49], "document": [1, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33, 47, 48, 49, 51, 67, 69], "p2": [1, 44, 48], "artist": 1, "cutomis": 2, "text": [2, 5, 8, 14, 25, 27, 29, 31, 33, 34, 35, 36, 38, 39, 40, 43, 55, 57, 62, 68], "avail": [2, 4, 5, 7, 8, 12, 15, 16, 26, 30, 34, 35, 36, 37, 38, 40, 42, 43, 44, 45, 47, 49, 51, 57, 58, 62, 73], "languag": [2, 6, 15, 36, 60, 71], "intro": 2, "start": [2, 3, 5, 8, 18, 26, 33, 34, 35, 36, 38, 39, 43, 45, 63, 71], "page": [2, 4, 8, 12, 13, 16, 17, 18, 20, 23, 24, 25, 26, 27, 31, 35, 38, 39, 40, 45, 46, 49, 50, 51, 54, 58, 60, 63, 64, 71, 73], "befor": [2, 3, 8, 29, 30, 34, 39, 51, 58, 68], "contact": [2, 10, 66], "site": [2, 6, 9, 19, 20, 31, 41, 43, 51, 55, 59, 60, 63, 64], "e": [2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 49, 51, 52, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "g": [2, 3, 4, 5, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 51, 52, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "inform": [2, 3, 6, 8, 14, 17, 18, 20, 21, 22, 24, 26, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 54, 57, 60, 61, 68, 69], "websit": [2, 13, 25, 26, 38, 43, 52, 53], "maintain": [2, 42, 45], "legal": 2, "notic": [2, 6, 45, 51], "about": [2, 4, 8, 14, 26, 35, 36, 41, 43, 68], "institut": [2, 16, 37], "citat": [2, 16, 17, 18, 19, 30], "exampl": [2, 3, 5, 8, 10, 13, 16, 18, 21, 22, 24, 26, 27, 28, 29, 31, 34, 35, 36, 38, 39, 42, 43, 47, 48, 49, 51, 52, 57, 68], "underneath": 2, "form": [2, 9, 10, 26, 33, 35, 36, 37, 38, 39, 40, 41, 45, 47, 51, 52, 55, 60, 61, 68], "field": [2, 9, 26, 31, 36, 37, 38, 40, 42, 43, 48, 55, 57, 60, 61, 68, 70, 71, 72, 73], "an": [2, 3, 4, 5, 6, 7, 8, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 35, 36, 37, 38, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 55, 57, 58, 59, 60, 61, 64, 68, 70, 72], "insert": [2, 4, 14, 25, 30, 31, 33, 34, 35, 36, 38, 40, 57, 60], "updat": [2, 3, 4, 8, 14, 25, 26, 29, 57, 60], "edit": [2, 9, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 36, 37, 38, 39, 40, 42, 45, 47, 55, 60, 61, 62, 64], "bibliographi": [2, 25, 31, 47, 49], "entri": [2, 3, 8, 14, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 50, 58, 60, 70, 72, 73], "cogwheel": 2, "icon": [2, 20, 26, 29, 57, 60], "right": [2, 8, 29, 49, 57, 58, 60, 71, 72, 73], "corner": [2, 57, 71], "thei": [2, 3, 8, 18, 20, 21, 26, 28, 29, 33, 34, 40, 41, 44, 47, 49, 51, 54, 57, 59, 62, 63, 72], "contain": [2, 5, 8, 26, 28, 49, 52, 62, 71, 73], "put": [3, 33, 38, 39, 41, 45], "great": 3, "emphasi": [3, 42, 45], "qualiti": [3, 7, 29, 42], "even": [3, 8, 60, 62], "respons": [3, 20, 41, 51], "enter": [3, 6, 8, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 42, 43, 50, 51, 55, 57, 60, 66, 68], "ultim": 3, "li": [3, 39], "individu": [3, 21, 30, 54], "avoid": [3, 41, 47], "inconsist": 3, "technic": [3, 41, 44], "level": [3, 6, 11, 14, 30, 42, 49, 58, 60, 61], "develop": [3, 20, 41, 42, 43, 44, 45, 51], "applic": [3, 4, 26, 31, 38, 40, 42, 43, 45, 47, 51, 57], "It": [3, 8, 18, 20, 24, 26, 28, 29, 31, 33, 34, 35, 39, 41, 44, 45, 62, 63, 71, 72], "therefor": [3, 18, 20, 26, 29, 31, 41, 45, 47, 54], "possibl": [3, 9, 18, 20, 24, 28, 29, 31, 33, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 49, 51, 54, 57, 61, 71], "after": [3, 4, 6, 9, 10, 20, 31, 34, 35, 36, 40, 51, 57, 61, 63, 66], "end": [3, 8, 13, 16, 33, 34, 35, 36, 39, 44, 48, 51, 62, 68], "same": [3, 8, 19, 21, 28, 32, 33, 34, 37, 41, 47, 48], "nevertheless": [3, 44], "mistak": [3, 66], "happen": [3, 18, 33, 45, 68], "also": [3, 8, 10, 20, 26, 30, 31, 33, 36, 38, 39, 40, 41, 42, 44, 46, 48, 55, 58, 62, 66, 71], "when": [3, 5, 8, 14, 20, 26, 29, 31, 34, 36, 38, 40, 41, 50, 51, 57, 58, 59, 60, 62, 66, 68], "from": [3, 8, 9, 10, 15, 18, 20, 22, 26, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 49, 51, 52, 54, 57, 60, 62, 68], "delet": [3, 4, 5, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 36, 55, 59], "outsid": 3, "function": [3, 4, 8, 10, 11, 26, 36, 37, 42, 49, 52, 53], "were": [3, 6, 18, 20, 29, 33, 47, 54, 60], "implement": [3, 41, 42, 49], "describ": [3, 30, 31, 33, 34, 36, 37, 51], "below": [3, 4, 14, 24, 30, 31, 37, 42, 52, 55, 66, 73], "here": [3, 8, 12, 18, 26, 29, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 52, 55, 60, 63, 64, 65, 68], "unlink": 3, "These": [3, 7, 29, 33, 42, 44, 47, 48, 54], "so": [3, 4, 8, 20, 22, 30, 31, 36, 39, 41, 44, 47, 51, 52, 58, 68], "call": [3, 19, 41, 47, 51, 52, 54], "could": [3, 38, 41, 68, 72], "result": [3, 5, 9, 13, 37, 41, 42, 51, 54, 57, 58, 61, 62, 68], "bug": [3, 63, 64], "seem": 3, "appear": [3, 5, 29, 38, 54], "regularli": 3, "known": [3, 8, 31, 36, 39, 42, 57], "pleas": [3, 8, 15, 18, 20, 21, 24, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 51, 57, 63, 64, 65, 66], "report": [3, 63, 65], "issu": [3, 51, 56, 65], "team": [3, 20, 32, 41, 44], "via": [3, 8, 12, 30, 33, 35, 36, 37, 39, 42, 43, 45, 48, 49, 51, 53, 54, 55], "redmin": [3, 43], "have": [3, 6, 7, 8, 13, 18, 20, 24, 26, 29, 30, 31, 33, 34, 38, 39, 40, 41, 44, 49, 57, 60, 62, 63, 64], "relat": [3, 16, 18, 20, 33, 36, 42, 44, 52, 53, 66], "Of": [3, 41], "cours": [3, 22, 41, 57], "normal": [3, 44], "set": [3, 6, 7, 8, 10, 12, 14, 26, 29, 32, 36, 38, 41, 42, 51, 53, 57, 58, 59, 62, 66, 71], "should": [3, 7, 8, 20, 29, 34, 38, 39, 51, 58, 63], "correct": [3, 8, 20, 36, 41, 51], "accid": 3, "creat": [3, 4, 5, 7, 8, 9, 13, 14, 17, 18, 22, 24, 26, 28, 29, 30, 31, 34, 37, 41, 47, 49, 51, 57, 60, 62, 68], "associ": [3, 8, 14, 24], "been": [3, 7, 36, 44], "pre": [3, 26, 29], "instal": [3, 7, 26, 29, 41, 52], "never": 3, "most": [3, 18, 22, 41, 49, 51, 52, 66, 68], "like": [3, 8, 13, 22, 24, 29, 40, 41, 49, 54, 63, 69], "caus": [3, 8], "dataset": [3, 26, 49], "themselv": [3, 19, 28, 44], "There": [3, 8, 40, 41, 44, 60, 63, 69], "three": 3, "option": [3, 7, 9, 14, 20, 26, 29, 31, 36, 41, 56, 57, 60, 62, 69], "proce": [3, 8, 66], "relink": 3, "add": [3, 7, 8, 14, 16, 17, 18, 19, 25, 26, 27, 29, 30, 33, 34, 35, 36, 37, 38, 39, 41, 51, 59, 60, 61, 69], "between": [3, 18, 31, 33, 39, 40, 45, 47, 48, 49, 54, 58], "remov": [3, 26], "whole": [3, 8, 27, 49], "featur": [3, 4, 8, 11, 17, 21, 22, 24, 26, 28, 29, 31, 39, 43, 47, 54, 55, 60, 63], "connect": [3, 24, 28, 30, 31, 37, 39, 41, 44, 46, 48, 49, 51, 57, 58], "itself": [3, 21, 28, 30, 39, 41, 49], "ha": [3, 4, 6, 7, 8, 15, 20, 24, 26, 30, 31, 36, 41, 44, 51, 58], "marri": [3, 16], "themself": 3, "super": [3, 8, 17, 29, 40, 44], "shouldn": [3, 64], "t": [3, 4, 5, 8, 14, 18, 20, 43, 44, 49, 55, 59, 63, 64, 65, 66, 68, 72], "within": [3, 8, 15, 17, 26, 32, 37, 39, 42, 44, 45, 47, 57], "": [3, 4, 5, 13, 18, 24, 28, 29, 30, 31, 33, 38, 40, 41, 42, 47, 48, 52, 53, 54, 72], "databas": [3, 4, 8, 9, 19, 21, 26, 28, 30, 31, 33, 35, 38, 41, 42, 43, 44, 45, 49, 52, 68], "through": [3, 8, 18, 20, 26, 44, 51], "find": [3, 8, 21, 26, 32, 35, 36, 40, 41, 42, 43, 45, 52, 62, 65, 68, 71, 72], "previou": [3, 51], "view": [3, 6, 8, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 34, 36, 37, 45, 51, 52, 55, 57, 58, 59, 60], "variou": [3, 24, 26, 30, 35, 36, 42, 49], "tab": [3, 6, 7, 26, 30, 31, 33, 34, 35, 37, 51, 55, 57, 59], "combin": [3, 8, 26, 38, 42, 44, 48, 49, 57], "begin": [3, 4, 5, 8, 16, 31, 34, 39, 48, 62, 68], "That": 3, "later": [3, 8, 30, 31, 41], "than": [3, 8, 24, 31, 41, 58], "fix": [3, 4, 8, 51, 63], "otherwis": 3, "interfac": [3, 29, 30, 45, 47, 51, 60, 64, 71], "won": [3, 8, 20, 41, 59], "soon": 3, "incompat": 3, "particip": [3, 16, 18, 22, 31, 33, 44, 48], "longer": [3, 43], "last": [3, 4, 14, 36, 62], "chain": 3, "succeed": 3, "show": [3, 8, 9, 20, 26, 36, 39, 41, 45, 51, 58, 59, 60, 62, 63, 66, 68, 73], "hierarch": [3, 29, 40], "began": 3, "everi": [3, 4, 7, 29, 30, 41], "its": [3, 17, 24, 29, 30, 34, 39, 40, 44, 45, 51, 57, 58], "cidoc": [3, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 33, 42, 43, 45, 46, 47, 48, 52, 53, 60, 67, 68, 69], "valid": [3, 6, 8, 15, 26, 42, 45, 46, 48, 51, 57, 68], "amount": [3, 60, 61, 73], "take": [3, 4, 5, 8, 18, 44, 54], "some": [3, 4, 5, 26, 29, 32, 38, 39, 41, 44, 45, 52, 57, 58, 63, 64], "time": [3, 4, 5, 8, 20, 31, 32, 33, 34, 41, 44, 51, 60, 62, 68, 73], "while": [3, 25, 42, 45, 47, 49, 51, 54], "alwai": [3, 8], "conform": [3, 45], "found": [3, 8, 24, 29, 31, 35, 36, 38, 39, 40, 44, 45, 47, 51, 62, 71], "problem": [3, 8, 24, 41, 65, 66], "resolv": [3, 13, 26, 38, 48, 49, 52], "origin": [3, 9, 49, 60], "sourc": [3, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 35, 39, 43, 45, 47, 49, 51, 52, 71], "two": [3, 8, 39, 41, 48, 51], "test": [3, 4, 7, 10, 51, 52], "ident": 3, "afterward": [3, 29, 30, 33], "case": [3, 4, 7, 8, 18, 20, 25, 29, 30, 31, 33, 36, 39, 43, 49, 51, 52, 56, 59, 60, 62, 63, 65, 66], "singl": [3, 15, 16, 29, 40, 51], "multipl": [3, 4, 7, 8, 15, 20, 29, 30, 33, 36, 40, 42, 43, 49, 73], "castl": 3, "citi": [3, 24, 26], "one": [3, 4, 8, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 41, 48, 51, 58, 60, 62, 68, 72], "would": [3, 8, 13, 19, 24, 26, 30, 31, 34, 41, 63], "automat": [3, 4, 6, 8, 9, 20, 26, 41, 44, 45, 66, 68], "anyon": [3, 45], "given": [3, 8, 15, 18, 39, 42, 51, 54, 61], "look": [3, 8, 13, 18, 24, 26, 33, 35, 41], "wrong": 3, "ones": [3, 33, 36, 37, 60], "next": [3, 22, 30, 40], "column": [3, 8, 57], "By": [3, 26, 30, 31, 35, 36, 39, 40, 51, 57], "due": [3, 39, 42, 44], "reoccur": 3, "search": [3, 6, 8, 26, 36, 42, 43, 51, 56, 69, 71, 72, 73], "select": [3, 4, 7, 8, 15, 18, 20, 26, 29, 30, 31, 34, 35, 36, 38, 39, 44, 51, 55, 58, 60, 62], "volum": 3, "follow": [3, 5, 7, 8, 13, 18, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 44, 49, 50, 51, 52, 53, 54, 57, 61], "class": [3, 5, 9, 15, 26, 29, 38, 40, 41, 43, 45, 46, 48, 49, 52, 53, 58, 60, 62], "ratio": [3, 54], "how": [3, 6, 11, 26, 29, 30, 31, 33, 34, 35, 37, 43, 44, 47, 52, 60], "100": [3, 36, 39], "mean": [3, 34, 41, 57], "fuzzywuzzi": 3, "packag": 3, "which": [3, 7, 8, 11, 15, 16, 17, 18, 21, 24, 25, 28, 29, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 49, 51, 52, 55, 57, 58, 62, 63, 66, 68, 71, 72], "levenshtein": 3, "distanc": [3, 58], "direct": [4, 42, 44, 58], "warn": [4, 5, 8, 51, 63], "manipul": [4, 51, 57], "loss": [4, 7], "unus": 4, "backup": [4, 5, 8], "export": [4, 9, 14, 42, 43, 51, 52], "download": [4, 5, 49, 51, 56], "lose": 4, "crash": 4, "local": [4, 51], "version": [4, 7, 13, 33, 43, 44, 47], "note": [4, 7, 21, 30, 31, 33, 35, 36, 38, 39, 40, 42, 43, 44, 48, 50, 51, 53, 56], "recent": 4, "max": [4, 11, 20, 60], "dai": [4, 8, 39, 68], "old": [4, 36], "either": [4, 15, 20, 34, 39, 41, 51, 57, 66], "simpl": 4, "power": 4, "unlik": [4, 33], "rest": [4, 15, 51], "safeguard": 4, "prevent": 4, "total": [4, 20], "make": [4, 8, 13, 14, 18, 36, 42, 43, 51, 60, 63, 66], "lost": [4, 8], "server": [4, 7, 41, 42, 51, 55], "depend": [4, 9, 33, 35, 36, 40, 41, 48, 54, 66], "situat": [4, 29, 41], "effort": [4, 42], "transact": [4, 8], "commit": 4, "build": [4, 19, 30, 36, 45], "around": [4, 58], "statement": 4, "don": [4, 20, 41, 44, 49, 64, 72], "refresh": [4, 39], "press": [4, 30, 31, 34, 36, 37, 40, 45, 61], "f5": [4, 63], "again": [4, 31, 66], "termin": 4, "queri": [4, 51], "row": [4, 6, 8, 39, 60, 68], "count": [4, 6, 41, 44], "veri": [4, 24, 32, 41, 63], "readabl": [4, 51, 58], "affect": 4, "error": [4, 6, 8, 43, 61, 65, 66], "noth": [4, 8, 63], "worri": [4, 41], "becaus": [4, 41, 62, 63], "Be": [5, 7, 41, 51, 55, 58], "awar": [5, 7, 20, 41, 51, 55, 58], "especi": [5, 8, 41], "share": 5, "email": [5, 6, 10, 14, 53, 60, 66], "address": [5, 10, 13, 60], "includ": [5, 11, 18, 20, 35, 38, 41, 42, 44, 49, 51, 60, 62], "save": [5, 14, 30, 31, 33, 34, 35, 36, 38, 61], "folder": [5, 7], "directori": [5, 7], "isn": [5, 66], "writabl": 5, "2018": 5, "08": [5, 48], "23_1533_export": 5, "exist": [5, 8, 13, 16, 19, 20, 24, 28, 29, 31, 37, 41, 44, 48, 51, 64, 66], "pg_dump": 5, "plain": 5, "format": [5, 7, 8, 26, 42, 43, 51, 69], "fill": [5, 8, 20, 24, 33, 38, 39, 40, 62, 68], "empti": [5, 10, 20], "psql": 5, "archiv": [5, 20, 26, 41, 59], "fc": 5, "pg_restor": 5, "restor": 5, "regardless": 5, "oper": [5, 8], "line": [5, 36, 39, 51, 57, 69], "break": [5, 51, 69], "d": [5, 31, 38, 54], "1": [5, 8, 30, 39, 44, 47, 54, 68], "zip": 5, "sever": [5, 20, 31, 36, 41, 48, 51], "entiti": [5, 8, 9, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 38, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 55, 58, 59, 60, 62, 64, 67], "divid": [5, 24, 42, 54], "properti": [5, 18, 45, 46, 47, 48, 53], "geometri": [5, 8, 36, 56], "current": [5, 7, 8, 26, 33, 42, 44, 45, 48, 51, 57, 60, 63], "2022": [5, 51], "10": [5, 39, 48, 57], "04_1610": 5, "kei": [5, 44, 63], "tag": [5, 41, 51], "prefer": [6, 15, 42, 53, 60], "profil": [6, 8, 12, 14, 20, 39, 42, 43, 45, 51, 56, 57, 68, 73], "valu": [6, 9, 12, 13, 39, 40, 41, 49, 51, 54, 61, 62, 68], "choos": [6, 8, 15, 17, 20, 29, 30, 31, 34, 35, 36, 37, 38, 40, 45, 58], "much": [6, 7, 31], "At": [6, 16, 17, 18, 20, 23, 24, 25, 27, 33, 41, 48, 55], "moment": [6, 39, 48, 58], "info": [6, 14, 20, 25], "minimum": 6, "jstree": 6, "charact": [6, 8, 69], "filter": [6, 41, 42, 51, 52, 62, 73], "tree": [6, 31, 41], "type": [6, 9, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 49, 54, 58, 72, 73], "random": 6, "password": [6, 10, 14, 15, 42, 56], "length": 6, "reset": [6, 10, 14, 42, 60], "upon": 6, "requir": [6, 8, 14, 20, 26, 33, 35, 36, 38, 41, 42, 51, 63, 70, 72], "confirm": [6, 42], "hour": [6, 60, 68], "long": [6, 20, 41, 73], "code": [6, 43, 44, 45, 51, 52, 65], "fail": [6, 66], "login": [6, 7, 10, 14, 43, 65], "often": [6, 22, 52], "attempt": 6, "specif": [6, 8, 20, 26, 29, 32, 37, 40, 41, 42, 43, 44, 47, 48, 51, 53, 57, 66], "usernam": [6, 10, 11, 14, 15, 66], "forget": [6, 41], "minut": [6, 60, 66, 68], "mani": [6, 13, 20, 24, 26, 41, 44, 63], "wait": [6, 66], "chosen": [6, 8, 36, 38, 40, 41], "number": [6, 8, 26, 48, 49, 51, 66], "exceed": 6, "activ": [6, 14, 18, 20, 31, 42, 44, 57, 60, 62, 63, 68], "preview": [6, 8], "open": [7, 26, 34, 35, 38, 41, 42, 43, 51, 55, 57], "standard": [7, 37, 40, 42, 44, 72], "deliv": [7, 42], "high": [7, 26, 38, 42, 57], "attribut": [7, 26, 41, 42], "onlin": [7, 38, 42], "scale": [7, 20, 42], "onc": [7, 55], "see": [7, 8, 14, 21, 22, 24, 28, 31, 33, 34, 35, 36, 37, 38, 40, 42, 45, 47, 49, 51, 52, 55, 58, 60, 63, 64, 66], "configur": [7, 13, 20, 52, 53, 55], "item": [7, 20, 27, 29, 40, 47], "enabl": [7, 8, 20, 26, 42, 45, 55, 57, 58], "expos": 7, "checkbox": [7, 26, 29, 57, 66], "complet": 7, "api": [7, 9, 15, 20, 26, 41, 42, 43, 49, 52, 60], "yourserv": 7, "eu": [7, 13, 51], "manifest": [7, 42], "2": [7, 30, 39, 44, 47, 54], "path": [7, 51], "absolut": 7, "drop": [7, 20, 38, 58], "zone": 7, "var": 7, "www": [7, 15, 26, 38], "iipsrv": 7, "write": 7, "execut": [7, 9, 43, 52], "webserv": 7, "convers": 7, "control": [7, 15, 38, 51], "convert": [7, 55, 68], "pyramid": 7, "tiff": 7, "none": [7, 36, 41, 51, 63], "deflat": 7, "lossless": 7, "size": [7, 20, 53], "mai": [7, 24, 39, 41, 44, 51, 52, 58, 63, 64], "larg": [7, 20, 36, 39, 58], "jpeg": [7, 20], "smaller": [7, 52], "transpar": 7, "run": [7, 8, 13, 41, 52], "sub": [7, 8, 9, 17, 18, 29, 33, 35, 44], "accordingli": 7, "successfulli": 7, "bmp": [7, 20], "gif": [7, 20], "ico": [7, 20], "jpg": [7, 20], "svg": [7, 20], "tif": 7, "directli": [8, 30, 38, 41, 45, 47, 54], "csv": [8, 9, 42], "gi": 8, "unit": [8, 17, 19, 21, 22, 29, 36, 39, 43, 47, 48, 54, 61], "histor": [8, 22, 26, 36, 38, 39, 43], "regard": [8, 31, 38, 40, 53], "integr": [8, 9, 26, 43, 58], "caution": 8, "consum": 8, "we": [8, 41, 44, 63], "strongli": 8, "advis": 8, "sql": [8, 9, 43, 52], "ani": [8, 30, 31, 41, 49, 51], "older": [8, 63], "enforc": 8, "check": [8, 9, 10, 14, 26, 29, 35, 39, 42, 43, 46, 58, 60, 62], "alright": 8, "encapsul": 8, "script": [8, 44], "example_place_hierarchi": 8, "sure": [8, 36, 51, 63, 66, 68], "extens": [8, 20, 45, 51], "spell": [8, 39, 67], "correctli": [8, 39], "lower": [8, 24], "my_data": 8, "header": [8, 73], "each": [8, 15, 20, 21, 24, 39, 40, 42, 44, 45, 46, 49, 51, 54], "separ": [8, 41], "comma": 8, "enclos": 8, "doubl": [8, 36], "quot": 8, "To": [8, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 45, 47, 48, 51, 52, 57, 62, 67, 68, 73], "said": [8, 34], "titl": [8, 18, 51, 57], "messag": [8, 51, 63, 64, 66], "uniqu": [8, 26, 49], "per": [8, 73], "prefix": 8, "them": [8, 18, 22, 29, 32, 33, 36, 41, 55, 60, 63], "person_1": 8, "place_1": 8, "underscor": 8, "_": 8, "hyphen": 8, "miss": [8, 9, 41, 44, 63, 68], "begin_from": [8, 48], "begin_to": [8, 48], "end_from": [8, 48], "end_to": [8, 48], "type_id": 8, "value_typ": 8, "reference_id": 8, "alreadi": [8, 13, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35, 38, 40, 41, 50, 55, 60, 68], "origin_reference_id": 8, "reference_system_": 8, "administrative_unit_id": 8, "historical_place_id": 8, "parent_id": 8, "openatlas_parent_id": 8, "openatlas_class": 8, "string": [8, 48, 69], "alias": [8, 60, 62, 67, 73], "semicolon": 8, "surround": 8, "yyyi": [8, 39, 62], "mm": [8, 39], "dd": [8, 39], "out": [8, 18, 29, 33, 36, 40, 41, 48, 57, 62, 63, 68], "timefram": 8, "For": [8, 15, 18, 19, 21, 22, 24, 26, 28, 30, 33, 34, 35, 41, 45, 47, 49, 51, 54, 66, 68], "timespan": [8, 68], "more": [8, 18, 19, 20, 21, 24, 26, 28, 29, 30, 31, 33, 35, 36, 38, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 62], "keep": [8, 9, 14, 29, 31, 32, 35, 36, 37, 38, 41, 45, 69], "mind": [8, 9, 29, 31, 32, 35, 36, 37, 38, 41], "incorrect": 8, "red": 8, "advanc": [8, 14, 62, 63, 69], "studi": [8, 29, 43], "space": [8, 20, 24, 30], "1234": [8, 13], "13": [8, 51], "65": 8, "pair": 8, "56": 8, "78": 8, "wrap": 8, "cell": 8, "quotat": 8, "mark": [8, 20, 29, 36, 41, 55, 70, 72], "iv": 8, "542": 8, "34": 8, "23": [8, 39, 48, 68], "66": 8, "just": [8, 20, 68], "5678": 8, "literature_1": 8, "book_2": 8, "multi": 8, "point": [8, 18, 33, 34, 35, 36, 57], "polygon": [8, 36, 57], "linestr": [8, 36, 57], "geometriccollect": 8, "wgs84": [8, 57], "geodet": 8, "epsg": [8, 57], "4326": [8, 57], "sinc": [8, 44, 72], "tall": 8, "12": [8, 39, 48, 62, 68], "458533781141528": 8, "41": 8, "922205268362234": 8, "53062334955289": 8, "917606998887024": 8, "52169797441624": 8, "888476931243254": 8, "coulmn": 8, "append": 8, "reference_system_wikidata": 8, "occur": [8, 35, 51], "substitut": 8, "reference_system_getty_aat": 8, "consist": [8, 19, 21, 26, 28, 30, 39, 41, 42, 44], "identifi": [8, 14, 22, 26, 36, 60], "q54123": 8, "second": [8, 60, 68, 73], "match": [8, 26, 36, 38, 44, 57], "close_match": 8, "exact_match": 8, "gener": [8, 9, 18, 33, 43, 51, 52, 53, 56, 63, 68], "togeth": [8, 20, 41, 44], "stratigraph": [8, 17, 19, 21, 22, 24, 43, 47, 48, 54, 61], "remain": [8, 16, 17, 22, 24, 28, 43, 54], "declar": 8, "insensit": 8, "question": [8, 22, 41], "structur": [8, 19, 22, 28, 41, 42, 43, 51], "archaeolog": [8, 19, 21, 22, 24, 28, 31, 42, 43], "model": [8, 41, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55, 59], "ll": [8, 43, 66], "duplic": [8, 9, 41, 72], "sensit": [8, 62], "king": [8, 31, 38, 39], "arthur": 8, "print": [8, 49], "doesn": [8, 18, 64, 65, 66], "stop": 8, "went": [8, 33], "summari": [8, 27], "brows": [8, 14, 44, 45], "layout": [8, 20, 52], "did": 8, "good": [8, 20, 24, 30], "idea": 8, "doc": [8, 48], "data_integrity_check": 8, "authent": [9, 10, 15, 43], "mail": [9, 14, 43], "modul": [9, 39, 43, 56, 57, 68], "map": [9, 17, 18, 19, 21, 22, 24, 26, 28, 30, 31, 35, 42, 43, 44, 45, 47, 48, 49, 56, 60], "iiif": [9, 41, 43, 55], "content": [9, 25, 27, 34, 43, 49, 57, 63], "present": [9, 20, 34, 41, 42, 43, 51, 57, 59], "orphan": [9, 58], "annot": [9, 43, 53, 56], "subunit": [9, 22, 27, 30], "circular": 9, "invalid": [9, 51], "preced": [9, 18, 33, 35, 39, 44, 48], "similar": [9, 26, 38, 41, 57, 68], "prepar": 9, "alia": [9, 16, 24, 30, 36, 70], "refer": [9, 14, 16, 17, 18, 19, 20, 21, 22, 24, 27, 28, 29, 30, 32, 34, 35, 39, 40, 41, 42, 43, 44, 45, 47, 53, 57], "wkt": [9, 56], "coordin": [9, 26, 36, 57], "extern": [9, 20, 25, 26, 31, 35, 38, 40, 41, 47, 51, 53], "dump": 9, "json": [9, 51], "xml": 9, "arch": [9, 20, 41, 43], "overview": [9, 13, 14, 20, 29, 35, 40, 43, 44, 45, 46, 47, 51, 52, 58, 59, 61], "fetch": 9, "reference_system": 9, "index": [9, 16, 17, 18, 20, 23, 24, 25, 27], "vocab": [9, 43], "vocabulari": [9, 38, 49], "ensur": [10, 20, 41], "disabl": [10, 11, 26], "leav": 10, "send": [10, 14, 35], "mail_password": 10, "smtp": 10, "net": [10, 13], "port": 10, "587": 10, "recipi": [10, 18], "feedback": [10, 63], "receiv": [10, 35, 60, 66], "zoom": [11, 36, 57, 58, 60], "defin": [11, 14, 20, 25, 33, 44, 48, 49, 52, 58, 60], "lowest": [11, 60], "adjust": [11, 12, 60], "far": [11, 60], "disableclusteringatzoom": 11, "cluster": [11, 36], "maxclusterradiu": 11, "maxim": 11, "rang": [11, 44, 48, 51, 61], "geonam": [11, 30, 38, 49, 56], "own": [12, 14, 16, 17, 21, 31, 36, 38, 41, 42, 45, 51], "wider": 13, "audienc": 13, "area": [13, 36, 54, 55, 57], "backend": [13, 53], "frontend": 13, "demo": [13, 44, 47, 51], "specifi": [13, 16, 20, 25, 29, 38, 39, 41, 42, 51], "newslett": [14, 42, 60], "subscript": 14, "registr": 14, "account": [14, 61], "sent": [14, 35], "cannot": [14, 26, 29, 35, 39, 64], "anymor": [14, 29, 64, 66], "inact": [14, 59], "modifi": [14, 18, 60], "full": [14, 36, 57, 60, 62], "easier": [14, 42, 60], "free": [14, 31, 33, 35, 36, 38, 39, 43, 49], "guest": 14, "who": [14, 16, 17, 21, 22, 33], "aren": [14, 20, 41, 68], "editor": [14, 20, 29, 40, 57, 60], "contributor": 14, "readonli": 14, "ye": 14, "skosmo": 15, "As": [15, 18, 31, 33, 35, 36, 38, 39, 45, 61], "ch": 15, "trail": 15, "slash": 15, "vocabs_pw": 15, "differ": [15, 18, 20, 30, 32, 33, 35, 36, 38, 40, 41, 42, 45, 47, 51, 58, 67, 69, 72], "confer": 15, "w3": 15, "org": [15, 26, 38, 51], "tr": 15, "sko": [15, 26, 38, 57], "primer": 15, "concept": [15, 26, 57], "child": 15, "conceptu": [15, 44, 45], "decid": [15, 40], "choic": [15, 29, 40], "what": [15, 58], "choosen": 15, "e74": 16, "albert": [16, 48], "einstein": [16, 48], "queen": 16, "victoria": 16, "peopl": [16, 18, 41], "famili": 16, "tribe": 16, "greenpeac": 16, "nation": 16, "museum": [16, 17, 21, 26, 31, 38, 44], "denmark": 16, "resid": 16, "main": [16, 41, 53, 71], "born": [16, 48], "where": [16, 18, 22, 29, 31, 33, 35, 36, 38, 41, 44, 57, 58, 62, 68], "came": 16, "di": [16, 48], "mother": 16, "member": [16, 37], "kept": 16, "pictur": [16, 17, 19, 31, 55], "coin": [17, 30, 31], "potteri": [17, 30], "collector": 17, "carrier": 17, "carri": [17, 18, 30], "e7": [18, 48], "e8": 18, "e5": [18, 48], "e11": 18, "e9": 18, "common": [18, 26, 51, 65], "battl": [18, 35, 39], "meet": [18, 62], "wed": 18, "owner": [18, 31], "anoth": [18, 20, 24, 29, 31, 33, 34, 41, 44, 49, 51, 60], "natur": [18, 38, 47], "disast": 18, "track": [18, 31, 39, 42, 48, 53, 61], "conserv": 18, "treatment": 18, "movement": [18, 34], "crm": [18, 24, 33, 42, 43, 45, 46, 47, 48, 52], "war": [18, 35, 39, 48], "up": [18, 20, 36, 41, 62, 63, 66, 68], "journei": [18, 32, 35], "wai": [18, 19, 24, 26, 28, 31, 32, 34, 40, 44, 48, 49, 51], "donor": 18, "step": [18, 22, 24, 26, 30, 31, 32, 33, 34, 37, 41, 42, 52], "instruct": [18, 24, 26, 31], "our": [18, 24, 26, 41, 43], "ownership": 18, "acquir": [18, 31, 41], "surrend": 18, "creator": [18, 20, 41], "destin": 18, "unfortun": [18, 33], "background": [18, 42, 45, 47, 58, 68], "tutori": [18, 31, 33, 35, 36, 41], "produc": 18, "e18": [19, 24, 28, 47, 48], "physic": [19, 24, 28, 30, 31, 34, 36, 47, 48, 57], "thing": [19, 24, 28, 30, 36, 47, 48, 57], "record": [19, 21, 24, 28, 31, 34, 49, 54], "grave": [19, 21, 24, 28, 30, 36], "consid": [19, 24, 47, 49], "referenc": [19, 25, 28], "skeleton": [19, 21], "pit": [19, 30], "ditch": 19, "rampart": 19, "label": [19, 29, 44, 58, 68], "disk": 20, "display": 20, "upload": [20, 31, 42, 52, 53], "exce": 20, "limit": [20, 53, 68], "both": [20, 68], "go": [20, 24, 29, 30, 31, 39, 40, 45, 57], "drag": [20, 57, 58], "left": [20, 38, 50, 55, 57, 58], "furthermor": [20, 24, 26, 39, 40, 45], "practic": [20, 41], "licenc": 20, "besid": [20, 68], "plan": [20, 41], "indic": [20, 39, 41, 44, 48, 51], "design": [20, 36, 41, 42, 54], "holder": [20, 49], "Not": [20, 62], "maximum": 20, "mb": 20, "width": [20, 58], "pixel": [20, 58], "pdf": 20, "display_file_ext": 20, "chose": [20, 68], "do": [20, 29, 30, 31, 36, 39, 63], "height": [20, 29, 58], "120": 20, "px": 20, "larger": 20, "try": [20, 51, 58, 63, 64, 66, 68], "small": [20, 60], "impact": 20, "perform": [20, 31, 45, 56], "suppos": 20, "met": [20, 41], "must": [20, 39, 41, 44, 51], "those": [20, 24, 30, 39, 47, 51], "numer": [20, 44, 61], "flag": [20, 41], "viewer": [20, 41, 42, 55], "e20": 21, "biolog": [21, 30], "anthropolog": [21, 24, 30, 43, 56, 61], "bone": [21, 30, 54], "sex": [21, 29, 30, 42, 56], "gender": [21, 30], "ag": [21, 30, 42], "mask": [21, 30], "workflow": [21, 22, 24, 28, 30, 32, 42, 59], "acquisit": [21, 42], "modif": [21, 38, 40], "move": [21, 24, 31, 32, 58], "femur": [21, 30, 54], "humeru": [21, 54], "molar": 21, "historian": 22, "work": [22, 39, 42, 43, 63], "come": [22, 29, 41, 68], "usual": [22, 41], "facilit": [22, 26], "bit": 22, "hi": [22, 31, 39], "life": [22, 48], "archaeologist": 22, "reflect": [22, 34, 51], "contin": 24, "graveyard": [24, 30], "under": [24, 25, 26, 36, 38, 51, 66], "austria": 24, "itali": 24, "respect": [24, 26, 33, 34, 35, 36, 38, 41, 49, 57], "styria": 24, "duchi": 24, "bavaria": 24, "lombard": [24, 38], "kingdom": 24, "newli": [24, 28, 30, 31], "though": [24, 28], "e18phys": 24, "certain": [24, 29, 30, 36, 44, 48, 49, 57], "posit": [24, 30, 36, 49, 57], "extend": [24, 30, 33, 34, 57], "tempor": [24, 30, 35, 42], "spatial": [24, 30, 42, 57], "superior": 24, "cemeteri": 24, "compos": 24, "burial": [24, 28, 30, 36], "primari": 24, "secondari": [24, 27], "back": [24, 30, 31], "solv": [24, 63, 65], "book": [25, 30, 49], "inbook": 25, "articl": [25, 30, 51], "charter": [25, 27, 49], "chronicl": 25, "doi": [25, 49], "instead": [25, 34, 45, 51], "author": [26, 33, 49], "advantag": [26, 31], "abl": [26, 31, 41], "futhermor": 26, "merg": 26, "lod": [26, 38, 42], "analogu": 26, "librari": 26, "catalogu": 26, "inventori": [26, 38, 49], "collabor": 26, "multilingu": 26, "knowledg": [26, 45], "graph": [26, 58], "wikimedia": 26, "foundat": 26, "wikipedia": 26, "everyon": [26, 45], "cc0": 26, "domain": [26, 44, 48, 51], "usabl": [26, 51, 69], "geograph": [26, 49], "web": [26, 49, 52, 53], "creativ": 26, "over": [26, 29, 31, 36, 40, 41, 49, 61, 73], "25": [26, 48], "000": 26, "11": [26, 48, 51], "800": [26, 38, 68], "gemeinsam": 26, "normdatei": 26, "translat": [26, 27, 45, 47, 52, 53], "intern": [26, 42, 44, 45, 47], "organis": 26, "subject": 26, "head": 26, "corpor": 26, "bodi": 26, "mainli": 26, "increasingli": 26, "definit": [26, 38, 44, 45, 51], "confid": [26, 38, 57], "degre": [26, 38, 54, 57], "close": [26, 36, 38, 57], "suffici": [26, 38, 57], "interchang": [26, 38, 57], "retriev": [26, 38, 51, 57], "exact": [26, 36, 38, 39, 57, 68], "vienna": [26, 38, 61], "suitabl": [26, 33, 38, 52], "deal": [26, 41, 45, 47, 58], "primarili": [26, 28, 54], "wiki": [26, 38, 43], "q123": 26, "septemb": 26, "desir": [26, 30, 37, 38], "short": [26, 31, 35, 44], "mous": [26, 29, 40, 57, 58, 73], "yet": [26, 35], "attach": [26, 41, 51], "e33": [27, 45, 47, 49], "linguist": [27, 47, 49], "written": [27, 30, 34, 52], "mediev": [27, 49], "letter": [27, 31, 32, 33, 35, 44], "literatur": [27, 54], "comment": [27, 39, 62, 68], "tool": [28, 31, 42, 43, 51, 54, 57, 59, 61, 73], "lead": [28, 29, 41, 51], "backfil": [28, 30], "e55": [29, 48], "With": [29, 31, 34, 42, 46, 57, 58, 66], "adapt": [29, 42, 60], "interest": [29, 45], "dynam": [29, 40], "statu": [29, 51], "higher": 29, "basic": [29, 40, 45], "root": [29, 52], "untyp": 29, "switch": [29, 57, 58, 71], "except": [29, 51, 60, 69], "unselect": 29, "categori": [29, 54], "permiss": [29, 38, 40, 42, 64], "renam": 29, "subtyp": 29, "grei": 29, "least": [29, 40, 41, 62], "decim": [29, 57], "dimens": [29, 30, 48], "weight": [29, 54], "centimetr": 29, "gram": 29, "percentag": 29, "unabl": 29, "fit": [29, 31, 35, 36], "reduc": 29, "typ": 29, "element": [30, 31, 33, 34, 60, 63], "procedur": [30, 33, 34], "3": [30, 48, 51, 54], "knife": 30, "4": [30, 41, 51, 62, 68], "teeth": 30, "classif": [30, 33, 34], "bout": 30, "concern": [30, 33, 34, 52], "store": [30, 31, 42, 48, 49, 51], "state": [30, 36, 38, 51, 61], "appropri": [30, 31, 34], "settlement": 30, "magnifi": [30, 36, 57], "evid": 30, "plot": [30, 36], "photo": 30, "now": [30, 31, 34], "layer": [30, 36, 57], "finger": 30, "ring": [30, 48], "patholog": 30, "measur": [30, 61], "discolor": 30, "canin": 30, "represent": [31, 45], "repres": [31, 35, 36, 39, 47], "span": [31, 32, 48, 62, 68], "cover": [31, 36], "Then": [31, 36], "learn": 31, "On": [31, 33, 35], "land": [31, 35, 54], "kind": [31, 36, 40], "occurr": 31, "excav": [31, 55], "transfer": 31, "sold": 31, "leonardo": 31, "paint": 31, "mona": 31, "lisa": 31, "workshop": 31, "florenc": 31, "franci": 31, "franc": 31, "exhibit": 31, "ch\u00e2teau": 31, "ambois": 31, "fountainebleau": 31, "louvr": 31, "pari": 31, "typic": 32, "scenario": 32, "suggest": [32, 63, 65], "discuss": 32, "best": 32, "profess": [32, 43], "special": [33, 41, 42, 44, 47, 69], "trip": 33, "chronolog": 33, "captur": 33, "continu": [33, 35, 36, 48], "altern": [33, 41, 51], "role": [33, 38, 41], "determin": [33, 42, 44, 49, 54], "exchang": [34, 43], "materi": 34, "copi": [34, 36], "preset": 34, "subgroup": 35, "bring": [35, 38, 44], "simultan": 35, "music": 35, "festiv": 35, "parallel": 35, "concert": 35, "overlap": 35, "sequenc": [35, 44, 51], "introduct": [35, 43], "think": [35, 38, 39, 44, 64, 66], "screen": [36, 57], "glass": [36, 57], "pop": 36, "marker": [36, 57], "visual": [36, 42, 43, 50, 56], "hover": 36, "landscap": 36, "street": 36, "satellit": 36, "whether": [36, 73], "four": [36, 39], "mode": [36, 57, 58], "centerpoint": 36, "drawn": [36, 57], "border": 36, "river": 36, "bed": 36, "draw": [36, 55, 57], "shape": [36, 38, 54, 57], "rectangl": [36, 55, 57], "ground": 36, "hole": 36, "whose": 36, "unknown": [36, 39], "enough": [36, 39, 68], "window": 36, "dedic": 36, "countri": [37, 49], "gazett": [38, 49], "particularli": [38, 42], "But": [38, 41], "analog": 38, "card": [38, 49], "catalog": [38, 49], "wikidata": [38, 49], "manual": [38, 40, 41, 42, 50, 51, 52, 57], "q3044": 38, "charlemagn": 38, "input": [38, 51, 68], "2761369": 38, "AT": 38, "precis": [38, 57], "down": 38, "blank": 38, "belt": 38, "buckl": 38, "q3180027": 38, "todai": 38, "frank": 38, "becam": 38, "holi": [38, 48], "roman": 38, "emperor": 38, "venu": 38, "willendorf": 38, "histori": 38, "q131397": 38, "focus": 39, "statigraph": 39, "bottom": [39, 40, 57], "initi": [39, 68], "hidden": [39, 68], "year": [39, 48, 61, 62, 68], "4713": [39, 68], "9999": [39, 51, 68], "month": [39, 62, 68], "31": [39, 48, 54, 62, 68], "hh": 39, "59": [39, 51, 68], "ss": 39, "minu": 39, "bc": [39, 68], "softwar": [39, 42, 47, 52], "postgresql": [39, 44, 53, 68], "prolept": [39, 68], "gregorian": [39, 68], "calendar": [39, 68], "hast": 39, "fought": 39, "william": 39, "duke": 39, "normandi": 39, "norman": 39, "french": [39, 42], "troop": 39, "harold": 39, "godwinson": 39, "english": [39, 42], "armi": 39, "14th": 39, "octob": 39, "1066": 39, "14": 39, "alik": [39, 45, 51], "Or": 39, "peac": 39, "westphalia": 39, "treati": 39, "sign": [39, 51], "1648": [39, 48], "osnabr\u00fcck": 39, "15th": 39, "m\u00fcnster": 39, "24th": 39, "thirti": [39, 48], "eighti": 39, "05": [39, 48], "15": 39, "24": [39, 48], "uncertain": 39, "third": 39, "fourth": 39, "actual": 39, "frame": 39, "certainti": 39, "death": [39, 48], "stephen": 39, "hungari": 39, "august": 39, "1038": 39, "birth": [39, 44, 48, 68], "01": [39, 62, 68], "975": 39, "earliest": 39, "latest": [39, 50], "howev": 39, "gear": [39, 45], "organ": 40, "distinct": [40, 49], "push": 40, "blue": 40, "light": 40, "answer": 41, "frequent": 41, "approach": 41, "probabl": [41, 49, 63], "analys": [41, 43, 56, 61], "decis": 41, "regist": [41, 66], "hide": [41, 60], "reason": [41, 44, 51, 63, 66], "conflict": 41, "core": 41, "strict": 41, "better": 41, "lot": 41, "sai": 41, "alex": 41, "him": 41, "pick": 41, "he": 41, "although": 41, "filenam": 41, "cc": 41, "BY": 41, "unstructur": 41, "nor": [41, 44], "searchabl": [41, 60], "solut": [41, 63], "happi": 41, "help": [41, 45, 63, 65], "tailor": 41, "hesit": 41, "reach": [41, 50], "u": [41, 64], "topic": [41, 42, 63], "linebreak": 41, "html": [41, 52], "markdown": 41, "bold": 41, "font": 41, "underlin": 41, "necessarili": 41, "handl": [41, 43], "interoper": 41, "easi": [42, 45, 51], "conveni": [42, 44, 47], "contribut": 42, "significantli": 42, "ontologi": [42, 44, 45], "easili": 42, "fair": 42, "principl": 42, "wide": [42, 44, 68], "uncertainti": [42, 68], "checker": [42, 43, 45], "quick": [42, 43, 62], "accord": [42, 47, 48, 66], "flexibli": 42, "thu": 42, "interact": [42, 57], "navig": [42, 56, 62, 73], "network": [42, 43, 50, 56], "bookmark": [42, 50, 53, 64], "context": 42, "internation": 42, "gettext": 42, "catalan": 42, "german": 42, "spanish": 42, "mirador": 42, "grant": 42, "autom": 42, "unsubscrib": [42, 60], "interdisciplinari": [42, 44], "method": [42, 54], "futur": 42, "ferembach": [42, 54], "et": [42, 54], "al": [42, 54, 71], "estim": [42, 56], "1979": [42, 54], "ment": [42, 61], "archeolog": 43, "geospati": 43, "radiocarbon": [43, 56], "shortcut": [43, 45, 68], "guid": 43, "paramet": [43, 58], "proxi": 43, "troubleshoot": 43, "faq": 43, "doe": [43, 44, 51], "why": 43, "iso": 44, "formal": 44, "council": 44, "icom": 44, "basi": [], "underli": 44, "v7": 44, "publish": [44, 54], "2021": 44, "pars": 44, "github": 44, "e39": [44, 48], "e67": [44, 48], "characteris": 44, "had": [44, 48, 68], "invers": 44, "anywai": 44, "ignor": 44, "foreign": 44, "sub_properties_of": 44, "suffix": 44, "counterpart": 44, "p3": [44, 48], "parser": 44, "com": [], "craw": [], "blob": [], "cidoc_rtfs_pars": [], "troubl": [], "prior": [45, 51], "verifi": 45, "fact": [], "gain": [], "insight": [], "graphic": 45, "symbol": [45, 51, 69], "introduc": 45, "increas": 45, "finer": [45, 47], "grain": [45, 47], "contextu": [45, 47], "lingust": [45, 47], "refin": [47, 62], "7": [47, 54], "compris": 47, "rel": 47, "differenti": 47, "confus": 47, "true": [47, 51], "simplifi": 48, "oa": 48, "p11i": 48, "stefan": 48, "joachim": 48, "son": 48, "father": 48, "usag": [45, 48, 56], "birthplac": 48, "p92i": 48, "brought": 48, "e63": 48, "p7": 48, "took": 48, "e521": 48, "e567": 48, "ulm": 48, "p93i": 48, "e64": 48, "e69": 48, "princeton": 48, "begin_com": 48, "end_com": 48, "timestamp": [48, 51], "e61": 48, "primit": 48, "p4": 48, "e52": 48, "p81": 48, "ongo": 48, "throughout": 48, "lanc": 48, "forg": 48, "durat": 48, "0770": 48, "destroi": [48, 68], "p13": 48, "destruct": 48, "e6": 48, "throw": 48, "lava": 48, "3019": 48, "03": 48, "p98i": 48, "1981": 48, "p100i": 48, "ladi": 48, "diana": 48, "1997": 48, "1618": 48, "purpos": 48, "e62": [48, 69], "p43": 48, "e54": 48, "bibliograph": 49, "delimit": 49, "along": 49, "chapter": 49, "figur": 49, "folio": 49, "7v": 49, "kell": 49, "saint": 49, "mari": 49, "21": 49, "less": 49, "eleven": 49, "million": 49, "charg": [49, 58], "distinguish": 49, "non": [49, 53], "encyclopedia": 49, "domain_id": 49, "property_cod": 49, "range_id": 49, "alphanumer": [49, 61], "alon": [], "p67i": 49, "p71": 49, "terri": 49, "prattchet": 49, "q46248": 49, "p71i": 49, "e1": 49, "depict": 49, "scan": [], "extract": [], "mostli": 49, "logo": [50, 71], "upper": [50, 57], "program": [], "analyt": 51, "mashin": [], "tri": 64, "constraint": 51, "hand": [], "swagger": 51, "visit": 51, "rdf": 51, "visibl": [51, 57, 59], "commun": 51, "schema": [51, 53], "5117": 51, "machin": 51, "deprec": 51, "unstabl": 51, "unavail": 51, "notion": 51, "signific": 51, "major": [51, 54, 63], "minor": 51, "post": 51, "roadmap": 51, "releas": 51, "discontinu": 51, "openapi": 51, "lpf": 51, "geojson": 51, "deriv": 51, "sort": [51, 73], "consult": 51, "convent": 51, "success": 51, "failur": 51, "2xx": 51, "4xx": 51, "signal": 51, "5xx": 51, "tue": 51, "19": 51, "jul": 51, "gmt": 51, "404": 51, "kf": 51, "desc": 51, "flask": [51, 52], "catch": 51, "handler": 51, "behind": 51, "someurl": 51, "8080": 51, "No": 51, "python": 52, "framework": 52, "config": 52, "upgrad": 52, "live": [52, 62], "util": 52, "static": 52, "css": 52, "javascript": 52, "templat": 52, "compil": 52, "rout": 52, "redirect": 52, "sphinx": 52, "retrac": 52, "15883": 52, "init": 52, "before_request": 52, "get_by_id": 52, "some_data": 52, "some_filt": 52, "postgi": [53, 57], "assess": 54, "schwidetzki": 54, "m": 54, "stloukal": 54, "empfehlungen": 54, "f\u00fcr": 54, "die": 54, "alter": 54, "und": 54, "geschlechtsdiagnos": 54, "am": 54, "skelett": 54, "homo": 54, "30": [54, 57, 61], "32": 54, "skull": 54, "pelvi": 54, "examin": 54, "propos": 54, "margo": 54, "supramastoideu": 54, "o": 54, "sacrum": 54, "robust": 54, "supplement": 54, "glabella": 54, "w": 54, "arcu": 54, "superciliari": 54, "tuber": 54, "frontali": 54, "parietali": 54, "inclinatio": 54, "processu": 54, "mastoideu": 54, "relief": 54, "planum": 54, "nuchal": 54, "protuberantia": 54, "occipitali": 54, "externa": 54, "zygomaticu": 54, "zygomaticum": 54, "crista": 54, "supramastoideum": 54, "supraorbitali": 54, "orbita": 54, "mandibl": 54, "overal": 54, "mentum": 54, "angulu": 54, "inferior": 54, "m2": 54, "angl": 54, "sulcu": 54, "praeauriculari": 54, "incisura": 54, "ischiadica": 54, "pubi": 54, "arc": 54, "compos\u00e9": 54, "coxa": 54, "foramen": 54, "obturatum": 54, "corpu": 54, "ossi": 54, "ischii": 54, "iliaca": 54, "fossa": 54, "auricular": 54, "acetabuli": 54, "express": 54, "assign": 54, "femal": 54, "indiffer": 54, "male": 54, "preserv": 54, "sum": 54, "69": 54, "70": 54, "prerequisit": 55, "wasn": 55, "side": [55, 63], "guarante": 55, "overlai": [56, 60], "leaflet": 57, "mousewheel": 57, "hold": 57, "basemap": 57, "popup": 57, "40": 57, "20": 57, "characterist": 57, "road": 57, "toggl": 57, "east": 57, "north": 57, "d3": 58, "j": 58, "egocentr": 58, "classic": 58, "wheel": 58, "node": 58, "rotat": 58, "pan": 58, "color": 58, "depth": 58, "too": [58, 62], "hardwar": 58, "acceler": [58, 61], "faster": 58, "exactli": 58, "remind": 59, "privat": 59, "seen": 59, "everybodi": 59, "anybodi": 59, "els": 59, "got": 59, "twice": 60, "uncheck": 60, "deactiv": [60, 66], "disappear": 60, "whom": 60, "laboratori": 61, "abbrevi": 61, "lab": 61, "conduct": 61, "vera": 61, "environment": 61, "specimen": 61, "sampl": 61, "analysi": 61, "1015": 61, "big": 62, "global": [62, 72], "term": [62, 73], "ada": 62, "lovelac": 62, "da": 62, "love": 62, "unacc": 62, "lov\u0113": 62, "vice": 62, "versa": 62, "placehold": 62, "l": 62, "ce": 62, "me": 62, "dateless": 62, "criteria": 62, "1540": 62, "1560": 62, "1550": 62, "intend": 63, "support": [63, 69], "sometim": 63, "cach": 63, "rememb": 63, "firefox": 63, "haven": 63, "screenshot": 63, "explan": 64, "encount": 64, "let": 64, "know": 64, "read": [64, 73], "mayb": 64, "obsolet": 64, "keyboard": 66, "capslock": 66, "forgot": 66, "misspel": 66, "secur": 66, "attack": 66, "lock": 66, "few": [66, 72], "until": 66, "e41": 67, "appel": 67, "oa8": 68, "oa9": 68, "knew": 68, "1356": 68, "unsur": 68, "church": 68, "fist": 68, "decad": 68, "1800": 68, "1809": 68, "autocomplet": 68, "5": 68, "zero": 68, "leap": 68, "almost": 69, "cyril": 69, "mathemat": 69, "asterisk": [70, 72], "serv": 71, "quit": 72, "difficult": 72, "glanc": 73, "quickli": 73, "invert": 73, "cut": 73, "familiaris": 44, "wherev": 45, "cidoc_crm": 48, "done": 51}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"api": [0, 51], "arch": 1, "overview": [1, 50], "fetch": 1, "data": [1, 3, 30, 41, 42], "from": 1, "automat": 1, "creat": [1, 33, 35, 36, 38, 40], "entiti": [1, 3, 22, 48], "type": [1, 3, 8, 29, 40, 41, 48], "refer": [1, 8, 25, 26, 31, 36, 38, 49], "system": [1, 8, 26, 36, 38, 49], "content": 2, "integr": [3, 42], "check": [3, 20, 41], "orphan": 3, "without": 3, "link": [3, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 31, 33, 46], "miss": 3, "file": [3, 20, 31, 41, 49, 64], "iiif": [3, 7, 42], "annot": [3, 42, 55], "subunit": [3, 19, 21, 24, 28], "circular": 3, "depend": 3, "date": [3, 8, 39, 42, 48, 61, 68], "invalid": 3, "involv": 3, "preced": 3, "sub": 3, "duplic": 3, "similar": 3, "name": [3, 66, 72], "execut": 4, "sql": [4, 5], "prepar": [4, 8], "keep": 4, "mind": 4, "result": 4, "export": 5, "databas": [5, 53], "dump": 5, "csv": 5, "json": 5, "xml": 5, "gener": [6, 32, 35, 60], "authent": [6, 51], "import": [8, 15, 20, 57], "project": [8, 41], "class": [8, 44, 47], "possibl": 8, "field": [8, 14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 39, 41], "alia": [8, 67], "valu": [8, 29], "origin": 8, "wkt": [8, 57], "coordin": 8, "extern": 8, "place": [8, 24, 30, 36], "hierarchi": 8, "option": [8, 58], "after": 8, "admin": 9, "mail": 10, "map": [11, 36, 57], "modul": [12, 60], "present": 13, "site": [13, 30], "user": [14, 20, 41, 42, 43, 66], "form": [14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 70], "group": 14, "vocab": 15, "edit": 15, "show": 15, "vocabulari": 15, "actor": [16, 33], "can": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "via": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "tab": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29], "artifact": [17, 30, 31, 34], "event": [18, 31, 33, 34, 35], "acquisit": 18, "creation": [18, 31], "modif": 18, "move": [18, 33, 34, 35], "product": 18, "featur": [19, 30, 42], "super": [19, 21, 28], "public": [20, 41], "share": [20, 41], "set": 20, "logo": 20, "imag": [20, 42, 55], "preview": 20, "how": [20, 36, 39, 41], "make": [20, 29, 41], "avail": [20, 41], "criteria": [20, 41], "softwar": [20, 41], "manag": [20, 41, 42], "human": [21, 30], "remain": [21, 30], "administr": 24, "unit": [24, 28, 30], "histor": [24, 32], "ad": [24, 30, 33, 34, 41, 57], "multipl": [24, 31, 41], "citat": 25, "exampl": [25, 32], "includ": 26, "default": 26, "wikidata": 26, "geonam": [26, 36, 57], "gnd": 26, "usag": [26, 55], "id": 26, "precis": [26, 39], "configur": [26, 73], "sourc": [27, 34], "stratigraph": [28, 30], "anthropolog": [28, 42, 54], "analys": [28, 42, 54], "standard": 29, "custom": [29, 41], "requir": 29, "archaeolog": [30, 32], "new": [30, 31, 35, 36, 38, 40, 57], "an": [30, 31, 34, 40], "add": [31, 40], "creator": 31, "locat": [31, 33], "journei": 33, "letter": 34, "sender": 34, "recipi": 34, "instruct": 35, "us": 36, "profess": [37, 41], "time": [39, 48], "span": 39, "where": 39, "find": 39, "input": 39, "enter": [39, 41], "activ": [39, 66], "hour": 39, "minut": 39, "second": 39, "tree": 40, "exist": 40, "faq": 41, "case": [41, 58], "studi": 41, "instanc": 41, "doe": 41, "access": [41, 51], "work": 41, "why": 41, "t": 41, "free": 41, "text": 41, "longer": 41, "format": 41, "model": [42, 45], "interfac": [42, 43], "exchang": 42, "radiocarbon": [42, 48, 61], "openatla": [43, 47, 48], "manual": 43, "document": 43, "help": 43, "cidoc": 44, "crm": 44, "properti": 44, "checker": 46, "shortcut": 48, "oa7": 48, "ha": 48, "relationship": 48, "oa8": 48, "appear": 48, "first": 48, "oa9": 48, "last": 48, "e77": 48, "persist": [48, 63], "item": 48, "e21": 48, "person": 48, "e2": 48, "tempor": 48, "introduct": 51, "quick": 51, "start": 51, "guid": 51, "1": 51, "ui": 51, "2": 51, "url": 51, "get": 51, "version": [51, 63], "endpoint": 51, "paramet": 51, "error": [51, 63, 64], "handl": 51, "proxi": 51, "applic": 52, "structur": [52, 53], "sex": 54, "estim": 54, "tool": 56, "navig": [57, 58], "search": [57, 62], "geometri": 57, "overlai": 57, "network": 58, "visual": 58, "2d": 58, "3d": 58, "In": 58, "perform": 58, "issu": 58, "download": 58, "note": 59, "profil": 60, "chang": 60, "password": [60, 66], "displai": [60, 63], "browser": 63, "refresh": 63, "your": 63, "javascript": 63, "If": 63, "problem": 63, "code": 64, "403": 64, "forbidden": 64, "404": 64, "found": [64, 66], "418": 64, "i": [64, 66], "m": 64, "teapot": 64, "troubleshoot": 65, "login": 66, "wrong": 66, "No": 66, "thi": 66, "too": 66, "mani": 66, "attempt": 66, "descript": 69, "menu": 71, "tabl": 73}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"API": [[0, "api"], [51, "api"]], "ARCHE": [[1, "arche"]], "Overview": [[1, "overview"], [50, "overview"]], "Fetch": [[1, "fetch"]], "Data from ARCHE": [[1, "data-from-arche"]], "Automatically created entities": [[1, "automatically-created-entities"]], "Type": [[1, "entity-type"], [3, "type"], [29, "type"]], "Reference System": [[1, "entity-reference-system"], [26, "reference-system"]], "Entity": [[1, "entity-index"], [22, "entity"]], "Content": [[2, "content"]], "Data integrity checks": [[3, "data-integrity-checks"]], "Orphans": [[3, "orphans"], [3, "id1"]], "Entities without links": [[3, "entities-without-links"]], "Missing files": [[3, "missing-files"]], "Orphaned files": [[3, "orphaned-files"]], "Orphaned IIIF files": [[3, "orphaned-iiif-files"]], "Orphaned annotations": [[3, "orphaned-annotations"]], "Orphaned subunits": [[3, "orphaned-subunits"]], "Circular dependencies": [[3, "circular-dependencies"]], "Dates": [[3, "dates"], [8, "dates"], [48, "dates"]], "Invalid dates": [[3, "invalid-dates"]], "Invalid link dates": [[3, "invalid-link-dates"]], "Invalid involvement dates": [[3, "invalid-involvement-dates"]], "Invalid preceding dates": [[3, "invalid-preceding-dates"]], "Invalid sub dates": [[3, "invalid-sub-dates"]], "Check links": [[3, "check-links"]], "Check link duplicates": [[3, "check-link-duplicates"]], "Check similar names": [[3, "check-similar-names"]], "Execute SQL": [[4, "execute-sql"]], "Preparation": [[4, "preparation"], [8, "preparation"]], "Keep in mind": [[4, "keep-in-mind"]], "Result": [[4, "result"]], "Export": [[5, "export"]], "Export SQL": [[5, "export-sql"], [5, "id1"]], "Export database dump": [[5, "export-database-dump"]], "Export CSV": [[5, "export-csv"]], "Export JSON": [[5, "export-json"]], "Export XML": [[5, "export-xml"]], "General": [[6, "general"], [60, "general"], [32, "general"]], "Authentication": [[6, "authentication"]], "IIIF": [[7, "iiif"]], "Admin": [[9, "admin"]], "Mail": [[10, "mail"]], "Map": [[11, "map"], [57, "map"]], "Modules": [[12, "modules"], [60, "modules"]], "Presentation site": [[13, "presentation-site"]], "User": [[14, "user"]], "Form fields": [[14, "form-fields"], [16, "form-fields"], [17, "form-fields"], [19, "form-fields"], [21, "form-fields"], [24, "form-fields"], [25, "form-fields"], [27, "form-fields"], [28, "form-fields"], [18, "form-fields"], [20, "form-fields"], [29, "form-fields"]], "Groups": [[14, "groups"]], "Import": [[15, "import"], [8, "import"]], "Vocabs": [[15, "vocabs"]], "Edit": [[15, "edit"]], "Show vocabularies": [[15, "show-vocabularies"]], "Actor": [[16, "actor"]], "Can be linked via tabs to": [[16, "can-be-linked-via-tabs-to"], [17, "can-be-linked-via-tabs-to"], [19, "can-be-linked-via-tabs-to"], [21, "can-be-linked-via-tabs-to"], [24, "can-be-linked-via-tabs-to"], [25, "can-be-linked-via-tabs-to"], [27, "can-be-linked-via-tabs-to"], [28, "can-be-linked-via-tabs-to"], [18, "can-be-linked-via-tabs-to"], [20, "can-be-linked-via-tabs-to"], [29, "can-be-linked-via-tabs-to"]], "Artifact": [[17, "artifact"]], "Feature": [[19, "feature"]], "Super and subunits": [[19, "super-and-subunits"], [21, "super-and-subunits"], [28, "super-and-subunits"]], "Human remains": [[21, "human-remains"]], "Place": [[24, "place"]], "Administrative Unit": [[24, "administrative-unit"]], "Historical Place": [[24, "historical-place"]], "Places and their subunits": [[24, "places-and-their-subunits"]], "Adding multiple places": [[24, "adding-multiple-places"]], "Reference": [[25, "reference"]], "Citation example": [[25, "citation-example"]], "Included by default": [[26, "included-by-default"]], "Wikidata": [[26, "wikidata"]], "GeoNames": [[26, "geonames"], [57, "id1"]], "GND": [[26, "gnd"]], "Usage": [[26, "usage"], [55, "usage"]], "ID": [[26, "id"]], "Precision": [[26, "precision"]], "Configuration": [[26, "configuration"], [73, "configuration"]], "Source": [[27, "source"]], "Stratigraphic unit": [[28, "stratigraphic-unit"]], "Anthropological analyses": [[28, "anthropological-analyses"]], "How to make files available for the public": [[41, "how-to-make-files-available-for-the-public"], [20, "how-to-make-files-available-for-the-public"]], "Criteria checked by the software": [[41, "criteria-checked-by-the-software"], [20, "criteria-checked-by-the-software"]], "FAQ": [[41, "faq"]], "How to manage multiple projects or case studies": [[41, "how-to-manage-multiple-projects-or-case-studies"]], "Multiple instances": [[41, "multiple-instances"]], "Shared instance": [[41, "shared-instance"]], "How does data access work": [[41, "how-does-data-access-work"]], "How to enter professions": [[41, "how-to-enter-professions"]], "Criteria checked by users": [[41, "criteria-checked-by-users"]], "Why can\u2019t a free text field be added via custom types": [[41, "why-can-t-a-free-text-field-be-added-via-custom-types"]], "Why can\u2019t longer texts be formatted": [[41, "why-can-t-longer-texts-be-formatted"]], "Features": [[42, "features"]], "Model": [[42, "model"], [45, "model"]], "User Interface": [[42, "user-interface"]], "IIIF Integration": [[42, "iiif-integration"]], "Image Annotation": [[42, "image-annotation"]], "Data Exchange": [[42, "data-exchange"]], "User Management": [[42, "user-management"]], "Anthropological Analyses": [[42, "anthropological-analyses"], [54, "anthropological-analyses"]], "Radiocarbon Dating": [[42, "radiocarbon-dating"], [61, "radiocarbon-dating"]], "OpenAtlas manual": [[43, "openatlas-manual"]], "User interface": [[43, null]], "Documentation": [[43, null]], "Help": [[43, null]], "Sex Estimation": [[54, "sex-estimation"]], "Image annotation": [[55, "image-annotation"]], "Tools": [[56, "tools"]], "Navigation": [[57, "navigation"], [58, "navigation"]], "Search": [[57, "search"], [62, "search"]], "WKT import": [[57, "wkt-import"]], "Adding new geometries": [[57, "adding-new-geometries"]], "Map Overlay": [[57, "map-overlay"]], "Network visualization": [[58, "network-visualization"]], "2D": [[58, "d"]], "3D": [[58, "id1"]], "Options": [[58, "options"]], "In case of performance issues": [[58, "in-case-of-performance-issues"]], "Download": [[58, "download"]], "Notes": [[59, "notes"]], "Profile": [[60, "profile"]], "Change password": [[60, "change-password"]], "Display": [[60, "display"]], "Display Errors": [[63, "display-errors"]], "Browser Version": [[63, "browser-version"]], "Refresh your Browser": [[63, "refresh-your-browser"]], "JavaScript": [[63, "javascript"]], "If the problem persists": [[63, "if-the-problem-persists"]], "Error Codes": [[64, "error-codes"]], "403 - Forbidden": [[64, "forbidden"]], "404 - File not found": [[64, "file-not-found"]], "418 - I\u2019m a teapot": [[64, "im-a-teapot"]], "Troubleshooting": [[65, "troubleshooting"]], "Login": [[66, "login"]], "Wrong Password": [[66, "wrong-password"]], "No user with this name found.": [[66, "no-user-with-this-name-found"]], "This user is not activated.": [[66, "this-user-is-not-activated"]], "Too many login attempts.": [[66, "too-many-login-attempts"]], "Alias": [[67, "alias"], [8, "alias"]], "Date": [[68, "date"]], "Description": [[69, "description"]], "Form": [[70, "form"]], "Menu": [[71, "menu"]], "Name": [[72, "name"]], "Table": [[73, "table"]], "Project": [[8, "project"]], "Import class": [[8, "import-class"]], "Possible import fields": [[8, "possible-import-fields"]], "Types": [[8, "types"], [40, "types"]], "Value types": [[8, "value-types"], [29, "value-types"]], "References": [[8, "references"], [49, "references"], [49, "id1"]], "Origin references": [[8, "origin-references"]], "WKT coordinates": [[8, "wkt-coordinates"]], "External reference systems": [[8, "external-reference-systems"]], "Place hierarchy": [[8, "place-hierarchy"]], "Import options": [[8, "import-options"]], "After the import": [[8, "after-the-import"]], "Event": [[18, "event"]], "Acquisition": [[18, "acquisition"]], "Creation": [[18, "creation"]], "Modification": [[18, "modification"]], "Move": [[18, "move"]], "Production": [[18, "production"]], "File": [[20, "file"]], "Form fields important for public sharing": [[20, "form-fields-important-for-public-sharing"]], "Settings": [[20, "settings"]], "Logo": [[20, "logo"]], "Image preview": [[20, "image-preview"]], "Criteria checked by managers and users": [[20, "criteria-checked-by-managers-and-users"]], "Standard types": [[29, "standard-types"]], "Custom types": [[29, "custom-types"]], "Making types required": [[29, "making-types-required"]], "Archaeological data": [[30, "archaeological-data"]], "Adding a new place": [[30, "adding-a-new-place"]], "Adding a feature to the site": [[30, "adding-a-feature-to-the-site"]], "Adding a stratigraphic unit to the feature": [[30, "adding-a-stratigraphic-unit-to-the-feature"]], "Adding an artifact to the stratigraphic unit": [[30, "adding-an-artifact-to-the-stratigraphic-unit"]], "Adding human remains to the stratigraphic unit": [[30, "adding-human-remains-to-the-stratigraphic-unit"]], "Artifacts": [[31, "artifacts"]], "Add a new artifact": [[31, "add-a-new-artifact"]], "Add a reference to the artifact": [[31, "add-a-reference-to-the-artifact"]], "Add a file to the artifact": [[31, "add-a-file-to-the-artifact"]], "Link a creation event": [[31, "link-a-creation-event"]], "Add a creator to the creation event": [[31, "add-a-creator-to-the-creation-event"]], "Add multiple locations to an artifact": [[31, "add-multiple-locations-to-an-artifact"]], "Examples": [[32, "examples"]], "Archaeological": [[32, "archaeological"]], "Historical": [[32, "historical"]], "Journey": [[33, "journey"]], "Adding actors": [[33, "adding-actors"]], "Adding locations": [[33, "adding-locations"]], "Creating the move event": [[33, "creating-the-move-event"]], "Link actors to the journey": [[33, "link-actors-to-the-journey"]], "Letters": [[34, "letters"]], "Adding an artifact": [[34, "adding-an-artifact"]], "Adding a source": [[34, "adding-a-source"]], "Adding the move event": [[34, "adding-the-move-event"]], "Adding sender and recipient": [[34, "adding-sender-and-recipient"]], "Move events": [[35, "move-events"]], "Create a new move event - general instruction": [[35, "create-a-new-move-event-general-instruction"]], "Places": [[36, "places"]], "Create a new place": [[36, "create-a-new-place"]], "How to use the map": [[36, "how-to-use-the-map"]], "Reference Systems - GeoNames": [[36, "reference-systems-geonames"]], "Profession": [[37, "profession"]], "References Systems": [[38, "references-systems"]], "Create a new reference system": [[38, "create-a-new-reference-system"]], "Time Spans": [[39, "time-spans"]], "Where to find the input fields": [[39, "where-to-find-the-input-fields"]], "How to enter dates and time spans": [[39, "how-to-enter-dates-and-time-spans"]], "Precise dates": [[39, "precise-dates"]], "Time spans": [[39, "id1"]], "Activate hours, minutes, and seconds": [[39, "activate-hours-minutes-and-seconds"]], "Create a new type tree": [[40, "create-a-new-type-tree"]], "Add a type to an existing type tree": [[40, "add-a-type-to-an-existing-type-tree"]], "CIDOC CRM": [[44, "cidoc-crm"]], "CIDOC classes": [[44, "cidoc-classes"]], "CIDOC Properties": [[44, "cidoc-properties"]], "Link checker": [[46, "link-checker"]], "OpenAtlas classes": [[47, "openatlas-classes"]], "OpenAtlas shortcuts": [[48, "openatlas-shortcuts"]], "OA7 - has relationship to": [[48, "oa7-has-relationship-to"]], "OA8 - appears for the first time in": [[48, "oa8-appears-for-the-first-time-in"]], "OA9 - appears for the last time in": [[48, "oa9-appears-for-the-last-time-in"]], "E77 - Persistent Item": [[48, "e77-persistent-item"]], "E21 Person": [[48, "e21-person"]], "E2 Temporal Entity": [[48, "e2-temporal-entity"]], "Radiocarbon dating type": [[48, "radiocarbon-dating-type"]], "Reference Systems": [[49, "reference-systems"]], "References and Files": [[49, "references-and-files"]], "Introduction": [[51, "introduction"]], "Quick Start Guide": [[51, "quick-start-guide"]], "1. UI access": [[51, "ui-access"]], "2. URL / GET access": [[51, "url-get-access"]], "Versioning": [[51, "versioning"]], "Endpoints": [[51, "endpoints"]], "Parameters": [[51, "parameters"]], "Error handling": [[51, "error-handling"]], "Proxy": [[51, "proxy"]], "Authentication guide": [[51, "authentication-guide"]], "Application Structure": [[52, "application-structure"]], "Database Structure": [[53, "database-structure"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["admin/api", "admin/arche", "admin/content", "admin/data_integrity_checks", "admin/execute_sql", "admin/export", "admin/general", "admin/iiif", "admin/import", "admin/index", "admin/mail", "admin/map", "admin/modules", "admin/presentation_site", "admin/user", "admin/vocabs", "entity/actor", "entity/artifact", "entity/event", "entity/feature", "entity/file", "entity/human_remains", "entity/index", "entity/navigation", "entity/place", "entity/reference", "entity/reference_system", "entity/source", "entity/stratigraphic_unit", "entity/type", "examples/archaeological_data", "examples/artifacts", "examples/index", "examples/journey", "examples/letters", "examples/move_event", "examples/places", "examples/profession", "examples/reference_systems", "examples/time_spans", "examples/types", "faq", "features", "index", "model/cidoc_crm", "model/index", "model/link_checker", "model/openatlas_classes", "model/openatlas_shortcuts", "model/references", "overview", "technical/api", "technical/application_structure", "technical/database_structure", "tools/anthropological_analyses", "tools/image_annotation", "tools/index", "tools/map", "tools/network", "tools/notes", "tools/profile", "tools/radiocarbon_dating", "tools/search", "troubleshooting/display", "troubleshooting/error_codes", "troubleshooting/index", "troubleshooting/login", "ui/alias", "ui/date", "ui/description", "ui/form", "ui/menu", "ui/name", "ui/table"], "filenames": ["admin/api.rst", "admin/arche.rst", "admin/content.rst", "admin/data_integrity_checks.rst", "admin/execute_sql.rst", "admin/export.rst", "admin/general.rst", "admin/iiif.rst", "admin/import.rst", "admin/index.rst", "admin/mail.rst", "admin/map.rst", "admin/modules.rst", "admin/presentation_site.rst", "admin/user.rst", "admin/vocabs.rst", "entity/actor.rst", "entity/artifact.rst", "entity/event.rst", "entity/feature.rst", "entity/file.rst", "entity/human_remains.rst", "entity/index.rst", "entity/navigation.rst", "entity/place.rst", "entity/reference.rst", "entity/reference_system.rst", "entity/source.rst", "entity/stratigraphic_unit.rst", "entity/type.rst", "examples/archaeological_data.rst", "examples/artifacts.rst", "examples/index.rst", "examples/journey.rst", "examples/letters.rst", "examples/move_event.rst", "examples/places.rst", "examples/profession.rst", "examples/reference_systems.rst", "examples/time_spans.rst", "examples/types.rst", "faq.rst", "features.rst", "index.rst", "model/cidoc_crm.rst", "model/index.rst", "model/link_checker.rst", "model/openatlas_classes.rst", "model/openatlas_shortcuts.rst", "model/references.rst", "overview.rst", "technical/api.rst", "technical/application_structure.rst", "technical/database_structure.rst", "tools/anthropological_analyses.rst", "tools/image_annotation.rst", "tools/index.rst", "tools/map.rst", "tools/network.rst", "tools/notes.rst", "tools/profile.rst", "tools/radiocarbon_dating.rst", "tools/search.rst", "troubleshooting/display.rst", "troubleshooting/error_codes.rst", "troubleshooting/index.rst", "troubleshooting/login.rst", "ui/alias.rst", "ui/date.rst", "ui/description.rst", "ui/form.rst", "ui/menu.rst", "ui/name.rst", "ui/table.rst"], "titles": ["API", "ARCHE", "Content", "Data integrity checks", "Execute SQL", "Export", "General", "IIIF", "Import", "Admin", "Mail", "Map", "Modules", "Presentation site", "User", "Vocabs", "Actor", "Artifact", "Event", "Feature", "File", "Human remains", "Entity", "<no title>", "Place", "Reference", "Reference System", "Source", "Stratigraphic unit", "Type", "Archaeological data", "Artifacts", "Examples", "Journey", "Letters", "Move events", "Places", "Profession", "References Systems", "Time Spans", "Types", "FAQ", "Features", "OpenAtlas manual", "CIDOC CRM", "Model", "Link checker", "OpenAtlas classes", "OpenAtlas shortcuts", "References", "Overview", "API", "Application Structure", "Database Structure", "Anthropological Analyses", "Image annotation", "Tools", "Map", "Network visualization", "Notes", "Profile", "Radiocarbon Dating", "Search", "Display Errors", "Error Codes", "Troubleshooting", "Login", "Alias", "Date", "Description", "Form", "Menu", "Name", "Table"], "terms": {"descript": [0, 1, 8, 12, 16, 17, 18, 19, 20, 21, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 41, 44, 48, 49, 51, 55, 57, 62, 70, 73], "public": [0, 7, 26, 43, 49, 51, 53, 59], "default": [0, 3, 6, 7, 8, 11, 12, 14, 15, 20, 29, 38, 39, 52, 57, 58, 59, 60], "off": [0, 73], "If": [0, 1, 3, 4, 8, 13, 15, 17, 20, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 49, 51, 57, 58, 62, 66, 68], "turn": [0, 39, 66, 68], "file": [0, 1, 5, 7, 8, 9, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 35, 42, 43, 47, 52, 55, 57, 60], "licens": [0, 1, 20, 26, 41], "can": [0, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 22, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 71, 73], "still": [0, 18, 41, 51, 60], "access": [0, 4, 7, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 40, 42, 43, 46, 54, 60, 61, 64], "A": [0, 1, 3, 4, 5, 13, 15, 16, 17, 19, 20, 21, 24, 26, 28, 29, 30, 31, 33, 35, 36, 40, 41, 44, 49, 50, 51, 52, 63, 69], "browser": [0, 6, 20, 51, 52, 58], "us": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 62, 63, 64, 67, 68, 69, 70, 72, 73], "b": 0, "log": [0, 2, 6, 14, 50, 60, 63], "user": [0, 1, 3, 5, 6, 8, 9, 10, 12, 15, 26, 29, 30, 33, 34, 35, 36, 38, 40, 44, 45, 47, 49, 51, 52, 53, 59, 60, 64, 71], "ip": 0, "request": [0, 6, 51, 64, 66], "comput": [0, 20], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 68, 72], "whitelist": 0, "link": [0, 1, 2, 5, 8, 9, 13, 15, 22, 26, 30, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 48, 49, 50, 51, 53, 55, 57, 58, 60, 63, 64, 66, 71], "without": [0, 7, 8, 9, 10, 18, 36, 41, 44, 45, 51, 58, 62], "being": [0, 26, 41], "thi": [0, 3, 4, 5, 7, 8, 13, 14, 16, 17, 18, 20, 22, 24, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51, 52, 54, 55, 57, 58, 61, 62, 63, 64, 65, 68], "might": [0, 3, 4, 16, 29, 30, 35, 39, 41], "you": [0, 3, 4, 7, 8, 11, 12, 14, 15, 20, 22, 24, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 52, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 71, 73], "want": [0, 3, 8, 29, 30, 31, 40, 41, 58], "allow": [0, 3, 6, 15, 18, 20, 39, 41, 42, 51, 55, 62, 72], "other": [0, 3, 8, 14, 16, 18, 20, 24, 26, 30, 31, 32, 33, 34, 35, 36, 38, 41, 42, 51, 52, 58, 59, 60], "system": [0, 5, 9, 14, 16, 17, 18, 21, 22, 24, 29, 32, 41, 42, 43, 44, 45, 53, 68, 69], "your": [0, 1, 3, 4, 8, 20, 32, 35, 36, 38, 39, 41, 44, 50, 51, 57, 58, 59, 60, 64, 66, 73], "data": [0, 4, 5, 8, 9, 14, 19, 21, 22, 24, 26, 28, 29, 32, 33, 35, 36, 38, 39, 40, 43, 44, 45, 51, 53, 57, 58, 59, 61, 62, 69, 70], "restrict": [0, 39, 41, 64], "resourc": [1, 38, 49], "centr": 1, "human": [1, 8, 16, 17, 18, 22, 24, 28, 31, 42, 43, 44, 47, 51, 54], "servic": [1, 15, 26, 42], "aim": 1, "offer": [1, 8, 42, 55], "stabl": [1, 47, 51], "persist": [1, 47], "host": [1, 10, 26], "well": [1, 21, 24, 30, 39, 40, 41, 42, 44, 45, 47, 48, 71], "dissemin": 1, "digit": [1, 7, 22, 39, 42, 44, 49], "research": [1, 29, 42, 61], "In": [1, 3, 5, 7, 14, 19, 20, 21, 24, 25, 28, 30, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 49, 51, 54, 55, 56, 61, 63, 65], "order": [1, 15, 30, 33, 35, 42, 48, 49], "import": [1, 3, 9, 14, 34, 36, 41, 42, 43, 44, 45, 52, 53, 56, 60, 72], "openatla": [1, 3, 5, 7, 8, 13, 15, 18, 19, 20, 21, 24, 26, 28, 29, 30, 33, 35, 37, 38, 40, 41, 42, 44, 45, 46, 49, 51, 52, 53, 63, 68], "chang": [1, 6, 10, 18, 20, 26, 29, 30, 31, 33, 36, 40, 41, 51, 56, 57, 58], "instanc": [1, 7, 8, 10, 15, 20, 29, 38, 40, 42, 44, 46, 48, 51, 52, 53], "product": [1, 10, 15, 17, 20, 21, 31, 51, 54], "py": [1, 10, 15, 20, 51, 52], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, 64, 66, 68, 69, 70, 72, 73], "need": [1, 15, 29, 31, 39, 41, 45, 47, 49, 51, 52, 57], "ask": [1, 22, 41], "administr": [1, 8, 36], "further": [1, 8, 30, 31, 34, 36, 38, 40, 47, 51, 57], "detail": [1, 3, 6, 8, 13, 14, 16, 17, 18, 20, 22, 23, 24, 25, 26, 27, 29, 40, 41, 42, 44, 45, 51, 52, 55, 58, 68], "id": [1, 8, 13, 36, 38, 49, 51, 57, 61, 64], "0": [1, 39, 41, 51, 54, 68], "top": [1, 2, 15, 41, 44, 49, 57, 58, 60, 63, 71, 73], "collect": [1, 15, 39], "project": [1, 3, 9, 13, 20, 26, 32, 39, 40, 42, 43, 53, 60, 66], "acdh": [1, 15], "topcollect": 1, "url": [1, 7, 11, 13, 15, 20, 25, 26, 38, 41, 44, 49, 52], "http": [1, 7, 13, 15, 26, 38, 51], "curat": 1, "dev": 1, "oeaw": 1, "ac": 1, "base": [1, 15, 21, 26, 36, 38, 42, 45, 48, 51, 53, 57, 68], "get": [1, 7, 8, 33, 36, 37, 38, 59, 66], "The": [1, 3, 5, 7, 8, 10, 16, 18, 20, 22, 24, 26, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 54, 55, 57, 64, 71, 72], "button": [1, 3, 5, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 51, 54, 55, 57, 58, 60, 61, 66, 71, 73], "displai": [1, 2, 3, 4, 6, 8, 10, 13, 14, 15, 20, 25, 26, 29, 36, 38, 40, 43, 44, 45, 47, 50, 51, 52, 56, 59, 61, 65, 73], "admin": [1, 4, 5, 8, 13, 14, 15, 20, 26, 38, 43, 51, 57, 59, 60], "menu": [1, 7, 20, 22, 27, 29, 30, 31, 33, 34, 35, 36, 40], "onli": [1, 3, 4, 6, 7, 8, 14, 15, 16, 19, 20, 26, 29, 38, 39, 40, 41, 45, 48, 51, 55, 57, 58, 59, 61, 62, 64, 68], "mention": [1, 16, 17, 20, 21], "abov": [1, 3, 31, 35, 42, 60, 63], "made": [1, 10, 17, 31, 36, 40, 41, 47, 52], "click": [1, 3, 4, 5, 14, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 46, 50, 54, 55, 57, 60, 66, 68, 73], "section": [1, 39, 51], "provid": [1, 7, 8, 15, 20, 25, 26, 39, 41, 45, 51, 54, 60, 61, 62, 63, 64], "part": [1, 3, 17, 18, 19, 21, 27, 28, 33, 39, 41, 49, 55, 59], "manag": [1, 5, 8, 14, 15, 26, 29, 38, 43, 52, 59, 60, 66, 68], "group": [1, 8, 9, 15, 16, 17, 18, 21, 26, 29, 31, 33, 35, 36, 37, 38, 40, 41, 42, 53, 55, 64], "list": [1, 3, 5, 8, 16, 17, 18, 20, 23, 24, 25, 26, 27, 30, 31, 33, 34, 35, 36, 38, 41, 42, 49, 50, 51, 55], "tabl": [1, 6, 8, 14, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 42, 48, 49, 50, 60, 72], "artifact": [1, 3, 8, 15, 16, 18, 21, 22, 24, 27, 28, 29, 32, 33, 35, 39, 40, 43, 55, 71], "wa": [1, 8, 16, 17, 18, 22, 29, 31, 35, 36, 39, 48, 51, 52, 55, 60, 66, 68], "shown": [1, 3, 4, 5, 8, 13, 20, 25, 26, 29, 36, 38, 40, 41, 58, 60, 68], "all": [1, 5, 8, 10, 11, 14, 15, 20, 29, 30, 31, 33, 34, 36, 39, 40, 41, 44, 45, 47, 48, 49, 51, 52, 60, 63, 69], "metadata": 1, "gather": 1, "exif": 1, "endpoint": [1, 15, 43], "first": [1, 3, 4, 8, 10, 20, 21, 22, 30, 31, 36, 39, 42, 68], "imag": [1, 6, 7, 18, 30, 31, 41, 43, 49, 52, 53, 56, 57, 58, 60], "2_jpg": 1, "addition": [1, 35, 62], "correspond": [1, 3, 7, 8, 26, 29, 36, 38, 39, 47, 60], "png": [1, 7, 20, 58], "4_orthophoto": 1, "taken": [1, 48], "necessari": [1, 20, 29, 30, 38, 40, 41, 49, 61], "new": [1, 8, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 29, 33, 34, 37, 41, 55, 56, 60, 66], "person": [1, 3, 4, 8, 16, 17, 18, 21, 22, 26, 31, 33, 34, 35, 37, 41, 42, 49, 55, 59, 60, 62], "etc": [1, 3, 6, 19, 21, 24, 28, 30, 34, 49, 51, 52, 71], "ad": [1, 14, 15, 18, 21, 26, 29, 31, 35, 38, 39, 40, 43, 51, 55, 56, 59, 61, 62], "dure": [1, 3, 18, 25, 31, 45], "process": [1, 5, 6, 8, 20, 41, 52], "custom": [1, 5, 8, 14, 15, 20, 30, 40, 43], "hierarchi": [1, 5, 9, 15, 18, 24], "relev": [1, 30], "actor": [1, 17, 18, 20, 21, 22, 24, 25, 27, 29, 31, 34, 35, 37, 39, 43, 44, 48, 60, 67, 68], "e21": [1, 16, 49], "involv": [1, 9, 18, 30, 31, 33, 34], "e65": [1, 18], "creation": [1, 6, 34, 38, 40], "p": [1, 44], "cidoc_ent": 1, "e12": [1, 18, 48], "event": [1, 3, 16, 17, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 32, 39, 43, 48], "addit": [1, 14, 30, 33, 36, 38, 39, 41, 42, 45, 51, 54, 59, 68, 69], "copyright": [1, 49], "name": [1, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 44, 47, 48, 49, 60, 62, 70, 73], "e22": [1, 17, 48], "object": [1, 7, 17, 21, 27, 31, 36, 42, 45, 47, 49, 57], "graffito": 1, "iptc": 1, "objectnam": 1, "xmp": 1, "p67": [1, 49], "e32": [1, 26, 49], "e53": [1, 24, 48], "place": [1, 3, 9, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31, 32, 33, 34, 35, 39, 40, 41, 42, 43, 44, 47, 48, 49, 51, 57, 60, 62, 63, 67, 71], "locat": [1, 16, 18, 19, 24, 34, 35, 36, 42, 44, 51, 52, 57, 66], "p53": 1, "gpslatitud": 1, "gpslongitud": 1, "date": [1, 5, 9, 14, 16, 17, 18, 19, 21, 24, 28, 29, 30, 31, 33, 34, 35, 36, 37, 40, 43, 56, 60, 62, 63, 70], "created": 1, "p11": [1, 44, 48], "p108": 1, "p14": 1, "p92": [1, 48], "e31": [1, 20, 25, 47, 49], "document": [1, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33, 47, 48, 49, 51, 67, 69], "p2": [1, 44, 48], "artist": 1, "cutomis": 2, "text": [2, 5, 8, 14, 25, 27, 29, 31, 33, 34, 35, 36, 38, 39, 40, 43, 55, 57, 62, 68], "avail": [2, 4, 5, 7, 8, 12, 15, 16, 26, 34, 35, 36, 37, 38, 40, 42, 43, 44, 45, 47, 49, 51, 57, 58, 62, 73], "languag": [2, 6, 15, 36, 60, 71], "intro": 2, "start": [2, 3, 5, 8, 18, 26, 33, 34, 35, 36, 38, 39, 43, 45, 63, 71], "page": [2, 4, 8, 12, 13, 16, 17, 18, 20, 23, 24, 25, 26, 27, 31, 35, 38, 39, 45, 46, 49, 50, 51, 54, 58, 60, 63, 64, 71, 73], "befor": [2, 3, 8, 29, 34, 39, 51, 58, 68], "contact": [2, 10, 66], "site": [2, 6, 9, 19, 20, 31, 40, 41, 43, 51, 55, 59, 60, 63, 64], "e": [2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 49, 51, 52, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "g": [2, 3, 4, 5, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 44, 48, 51, 52, 55, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72], "inform": [2, 3, 6, 8, 14, 17, 18, 20, 21, 22, 24, 26, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 54, 57, 60, 61, 68, 69], "websit": [2, 13, 25, 26, 38, 43, 52, 53], "maintain": [2, 42, 45], "legal": 2, "notic": [2, 6, 45, 51], "about": [2, 4, 8, 14, 26, 35, 36, 41, 43, 68], "institut": [2, 16], "citat": [2, 16, 17, 18, 19, 30], "exampl": [2, 3, 5, 8, 10, 13, 16, 18, 21, 22, 24, 26, 27, 28, 29, 31, 34, 35, 37, 38, 39, 40, 42, 43, 47, 48, 49, 51, 52, 57, 68], "underneath": 2, "form": [2, 9, 10, 26, 30, 33, 35, 36, 37, 38, 39, 40, 41, 45, 47, 51, 52, 55, 60, 61, 68], "field": [2, 9, 26, 30, 31, 34, 36, 37, 38, 40, 42, 43, 48, 55, 57, 60, 61, 68, 70, 71, 72, 73], "an": [2, 3, 4, 5, 6, 7, 8, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 33, 35, 36, 38, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 55, 57, 58, 59, 60, 61, 64, 68, 70, 72], "insert": [2, 4, 14, 25, 30, 31, 33, 34, 35, 36, 38, 40, 57, 60], "updat": [2, 3, 4, 8, 14, 25, 26, 29, 57, 60], "edit": [2, 9, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 30, 31, 36, 37, 38, 39, 40, 42, 45, 47, 55, 60, 61, 62, 64], "bibliographi": [2, 25, 31, 47, 49], "entri": [2, 3, 8, 14, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 38, 39, 40, 41, 42, 50, 58, 60, 70, 72, 73], "cogwheel": 2, "icon": [2, 20, 26, 29, 57, 60], "right": [2, 8, 29, 49, 57, 58, 60, 71, 72, 73], "corner": [2, 57, 71], "thei": [2, 3, 8, 18, 20, 21, 26, 28, 29, 33, 34, 40, 41, 44, 47, 49, 51, 54, 57, 59, 62, 63, 72], "contain": [2, 5, 8, 26, 28, 49, 52, 62, 71, 73], "put": [3, 33, 38, 39, 41, 45], "great": 3, "emphasi": [3, 42, 45], "qualiti": [3, 7, 29, 42], "even": [3, 8, 60, 62], "respons": [3, 20, 41, 51], "enter": [3, 6, 8, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 42, 43, 50, 51, 55, 57, 60, 66, 68], "ultim": 3, "li": [3, 39], "individu": [3, 21, 30, 54], "avoid": [3, 41, 47], "inconsist": 3, "technic": [3, 41, 44], "level": [3, 6, 11, 14, 30, 42, 49, 58, 60, 61], "develop": [3, 20, 41, 42, 43, 44, 45, 51], "applic": [3, 4, 26, 31, 38, 40, 42, 43, 45, 47, 51, 57], "It": [3, 8, 18, 20, 24, 26, 28, 29, 31, 33, 34, 35, 39, 41, 44, 45, 62, 63, 71, 72], "therefor": [3, 18, 20, 26, 29, 31, 41, 45, 47, 54], "possibl": [3, 9, 18, 20, 24, 28, 29, 31, 33, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 49, 51, 54, 57, 61, 71], "after": [3, 4, 6, 9, 10, 20, 30, 31, 34, 35, 36, 40, 51, 57, 61, 63, 66], "end": [3, 8, 13, 16, 33, 34, 35, 36, 39, 44, 48, 51, 62, 68], "same": [3, 8, 19, 21, 28, 30, 32, 33, 34, 37, 41, 47, 48], "nevertheless": [3, 44], "mistak": [3, 66], "happen": [3, 18, 33, 45, 68], "also": [3, 8, 10, 20, 26, 30, 31, 33, 36, 38, 39, 40, 41, 42, 44, 46, 48, 55, 58, 62, 66, 71], "when": [3, 5, 8, 14, 20, 26, 29, 30, 31, 34, 36, 38, 40, 41, 50, 51, 57, 58, 59, 60, 62, 66, 68], "from": [3, 8, 9, 10, 15, 18, 20, 22, 26, 30, 31, 33, 34, 35, 36, 38, 39, 41, 42, 49, 51, 52, 54, 57, 60, 62, 68], "delet": [3, 4, 5, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 36, 40, 55, 59], "outsid": 3, "function": [3, 4, 8, 10, 11, 26, 36, 37, 42, 49, 52, 53], "were": [3, 6, 18, 20, 29, 33, 47, 54, 60], "implement": [3, 41, 42, 49], "describ": [3, 30, 31, 33, 34, 37, 51], "below": [3, 4, 14, 24, 31, 36, 37, 42, 52, 55, 66, 73], "here": [3, 8, 12, 18, 26, 29, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 52, 55, 60, 63, 64, 65, 68], "unlink": 3, "These": [3, 7, 29, 30, 40, 42, 44, 47, 48, 54], "so": [3, 4, 8, 20, 22, 30, 31, 34, 36, 39, 40, 41, 44, 47, 51, 52, 58, 68], "call": [3, 19, 41, 47, 51, 52, 54], "could": [3, 38, 41, 68, 72], "result": [3, 5, 9, 13, 37, 41, 42, 51, 54, 57, 58, 61, 62, 68], "bug": [3, 63, 64], "seem": 3, "appear": [3, 5, 29, 38, 54], "regularli": 3, "known": [3, 8, 31, 35, 36, 39, 42, 57], "pleas": [3, 8, 15, 18, 20, 21, 24, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 51, 57, 63, 64, 65, 66], "report": [3, 63, 65], "issu": [3, 51, 56, 65], "team": [3, 20, 32, 41, 44], "via": [3, 8, 12, 30, 33, 35, 37, 39, 42, 43, 45, 48, 49, 51, 53, 54, 55], "redmin": [3, 43], "have": [3, 6, 7, 8, 13, 18, 20, 24, 26, 29, 31, 32, 33, 34, 38, 39, 40, 41, 44, 49, 57, 60, 62, 63, 64], "relat": [3, 16, 18, 20, 33, 36, 40, 42, 44, 52, 53, 66], "Of": [3, 41], "cours": [3, 22, 41, 57], "normal": [3, 44], "set": [3, 6, 7, 8, 10, 12, 14, 26, 29, 32, 36, 38, 41, 42, 51, 53, 57, 58, 59, 62, 66, 71], "should": [3, 7, 8, 20, 29, 34, 38, 39, 51, 58, 63], "correct": [3, 8, 20, 36, 41, 51], "accid": 3, "creat": [3, 4, 5, 7, 8, 9, 13, 14, 17, 18, 22, 24, 26, 28, 29, 30, 31, 34, 37, 41, 47, 49, 51, 57, 60, 62, 68], "associ": [3, 8, 14, 24], "been": [3, 7, 36, 44], "pre": [3, 26, 29, 40], "instal": [3, 7, 26, 29, 40, 41, 52], "never": 3, "most": [3, 18, 22, 30, 41, 49, 51, 52, 66, 68], "like": [3, 8, 13, 22, 24, 29, 40, 41, 49, 54, 63, 69], "caus": [3, 8], "dataset": [3, 26, 49], "themselv": [3, 19, 28, 44], "There": [3, 8, 40, 41, 44, 60, 63, 69], "three": 3, "option": [3, 7, 9, 14, 20, 26, 29, 31, 36, 41, 56, 57, 60, 62, 69], "proce": [3, 8, 66], "relink": 3, "add": [3, 7, 8, 14, 16, 17, 18, 19, 25, 26, 27, 29, 30, 33, 34, 35, 36, 37, 38, 39, 41, 51, 59, 60, 61, 69], "between": [3, 18, 33, 39, 40, 45, 47, 48, 49, 54, 58], "remov": [3, 26], "whole": [3, 8, 27, 49], "featur": [3, 4, 8, 11, 17, 21, 22, 24, 26, 28, 29, 31, 39, 43, 47, 54, 55, 60, 63], "connect": [3, 24, 28, 30, 31, 37, 38, 39, 41, 44, 46, 48, 49, 51, 57, 58], "itself": [3, 21, 28, 30, 39, 41, 49], "ha": [3, 4, 6, 7, 8, 15, 20, 24, 26, 31, 36, 38, 41, 44, 51, 58], "marri": [3, 16], "themself": 3, "super": [3, 8, 17, 29, 30, 40, 44], "shouldn": [3, 64], "t": [3, 4, 5, 8, 14, 18, 20, 43, 44, 49, 55, 59, 63, 64, 65, 66, 68, 72], "within": [3, 8, 15, 17, 26, 32, 37, 39, 42, 44, 45, 47, 57], "": [3, 4, 5, 13, 18, 24, 28, 29, 30, 31, 33, 38, 40, 41, 42, 47, 48, 52, 53, 54, 72], "databas": [3, 4, 8, 9, 19, 21, 26, 28, 30, 31, 33, 35, 38, 41, 42, 43, 44, 45, 49, 52, 68], "through": [3, 8, 18, 20, 26, 44, 51], "find": [3, 8, 21, 26, 30, 32, 35, 36, 40, 41, 42, 43, 45, 52, 62, 65, 68, 71, 72], "previou": [3, 51], "view": [3, 6, 8, 11, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 31, 34, 36, 37, 45, 51, 52, 55, 57, 58, 59, 60], "variou": [3, 24, 26, 30, 31, 35, 36, 42, 49], "tab": [3, 6, 7, 26, 30, 31, 33, 34, 35, 37, 51, 55, 57, 59], "combin": [3, 8, 26, 38, 42, 44, 48, 49, 57], "begin": [3, 4, 5, 8, 16, 31, 34, 39, 48, 62, 68], "That": 3, "later": [3, 8, 30, 41], "than": [3, 8, 24, 31, 41, 58], "fix": [3, 4, 8, 51, 63], "otherwis": 3, "interfac": [3, 29, 30, 45, 47, 51, 60, 64, 71], "won": [3, 8, 20, 41, 59], "soon": 3, "incompat": 3, "particip": [3, 16, 18, 22, 31, 33, 44, 48], "longer": [3, 43], "last": [3, 4, 14, 36, 62], "chain": 3, "succeed": 3, "show": [3, 8, 9, 20, 26, 36, 39, 40, 41, 45, 51, 58, 59, 60, 62, 63, 66, 68, 73], "hierarch": [3, 29, 40], "began": 3, "everi": [3, 4, 7, 29, 30, 41], "its": [3, 17, 24, 29, 30, 31, 34, 39, 40, 44, 45, 51, 57, 58], "cidoc": [3, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 33, 42, 43, 45, 46, 47, 48, 52, 53, 60, 67, 68, 69], "valid": [3, 6, 8, 15, 26, 42, 45, 46, 48, 51, 57, 68], "amount": [3, 60, 61, 73], "take": [3, 4, 5, 8, 18, 44, 54], "some": [3, 4, 5, 26, 29, 30, 32, 38, 39, 40, 41, 44, 45, 52, 57, 58, 63, 64], "time": [3, 4, 5, 8, 20, 31, 32, 33, 41, 44, 51, 60, 62, 68, 73], "while": [3, 25, 42, 45, 47, 49, 51, 54], "alwai": [3, 8, 30, 32, 40], "conform": [3, 45], "found": [3, 8, 24, 29, 31, 35, 36, 38, 39, 40, 44, 45, 47, 51, 62, 71], "problem": [3, 8, 24, 41, 65, 66], "resolv": [3, 13, 26, 38, 48, 49, 52], "origin": [3, 9, 49, 60], "sourc": [3, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 35, 39, 43, 45, 47, 49, 51, 52, 71], "two": [3, 8, 39, 41, 48, 51], "test": [3, 4, 7, 10, 51, 52], "ident": 3, "afterward": [3, 29, 30, 33, 39], "case": [3, 4, 7, 8, 18, 20, 25, 29, 31, 33, 36, 39, 43, 49, 51, 52, 56, 59, 60, 62, 63, 65, 66], "singl": [3, 15, 16, 29, 40, 51], "multipl": [3, 4, 7, 8, 15, 20, 29, 30, 33, 36, 40, 42, 43, 49, 73], "castl": 3, "citi": [3, 24, 26], "one": [3, 4, 8, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 41, 48, 51, 58, 60, 62, 68, 72], "would": [3, 8, 13, 19, 24, 26, 30, 31, 34, 41, 63], "automat": [3, 4, 6, 8, 9, 20, 26, 39, 41, 44, 45, 66, 68], "anyon": [3, 45], "given": [3, 8, 15, 18, 39, 42, 51, 54, 61], "look": [3, 8, 13, 18, 24, 26, 33, 35, 41], "wrong": 3, "ones": [3, 36, 37, 60], "next": [3, 22, 30, 40], "column": [3, 8, 57], "By": [3, 26, 31, 35, 36, 39, 40, 51, 57], "due": [3, 39, 42, 44], "reoccur": 3, "search": [3, 6, 8, 26, 36, 42, 43, 51, 56, 69, 71, 72, 73], "select": [3, 4, 7, 8, 15, 18, 20, 26, 29, 30, 31, 34, 35, 36, 38, 39, 40, 44, 51, 55, 58, 60, 62], "volum": 3, "follow": [3, 5, 7, 8, 13, 18, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 44, 49, 50, 51, 52, 53, 54, 57, 61], "class": [3, 5, 9, 15, 26, 29, 38, 40, 41, 43, 45, 46, 48, 49, 52, 53, 58, 60, 62], "ratio": [3, 54], "how": [3, 6, 11, 26, 29, 30, 31, 33, 34, 35, 37, 43, 44, 47, 52, 60], "100": [3, 36, 39], "mean": [3, 34, 41, 57], "fuzzywuzzi": 3, "packag": 3, "which": [3, 7, 8, 11, 15, 16, 17, 18, 21, 24, 25, 28, 29, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 49, 51, 52, 55, 57, 58, 62, 63, 66, 68, 71, 72], "levenshtein": 3, "distanc": [3, 58], "direct": [4, 42, 44, 58], "warn": [4, 5, 8, 51, 63], "manipul": [4, 51, 57], "loss": [4, 7], "unus": 4, "backup": [4, 5, 8], "export": [4, 9, 14, 42, 43, 51, 52], "download": [4, 5, 49, 51, 56], "lose": 4, "crash": 4, "local": [4, 51], "version": [4, 7, 13, 33, 43, 44, 47], "note": [4, 7, 21, 30, 31, 33, 34, 35, 36, 38, 39, 40, 42, 43, 44, 48, 50, 51, 53, 56], "recent": 4, "max": [4, 11, 20, 37, 60], "dai": [4, 8, 39, 68], "old": [4, 36], "either": [4, 15, 20, 34, 39, 41, 51, 57, 66], "simpl": 4, "power": 4, "unlik": [4, 33], "rest": [4, 15, 51], "safeguard": 4, "prevent": 4, "total": [4, 20], "make": [4, 8, 13, 14, 18, 36, 42, 43, 51, 60, 63, 66], "lost": [4, 8], "server": [4, 7, 41, 42, 51, 55], "depend": [4, 9, 30, 33, 35, 36, 40, 41, 48, 54, 66], "situat": [4, 29, 41], "effort": [4, 42], "transact": [4, 8], "commit": 4, "build": [4, 19, 30, 36, 45], "around": [4, 58], "statement": 4, "don": [4, 20, 41, 44, 49, 64, 72], "refresh": [4, 39], "press": [4, 30, 31, 34, 36, 37, 40, 45, 61], "f5": [4, 39, 63], "again": [4, 31, 66], "termin": 4, "queri": [4, 51], "row": [4, 6, 8, 39, 60, 68], "count": [4, 6, 41, 44], "veri": [4, 24, 32, 41, 63], "readabl": [4, 51, 58], "affect": 4, "error": [4, 6, 8, 43, 61, 65, 66], "noth": [4, 8, 63], "worri": [4, 41], "becaus": [4, 41, 62, 63], "Be": [5, 7, 41, 51, 55, 58], "awar": [5, 7, 20, 41, 51, 55, 58], "especi": [5, 8, 31, 41], "share": 5, "email": [5, 6, 10, 14, 53, 60, 66], "address": [5, 10, 13, 60], "includ": [5, 11, 18, 20, 35, 38, 41, 42, 44, 49, 51, 60, 62], "save": [5, 14, 30, 31, 33, 34, 35, 36, 38, 61], "folder": [5, 7], "directori": [5, 7], "isn": [5, 66], "writabl": 5, "2018": 5, "08": [5, 48], "23_1533_export": 5, "exist": [5, 8, 13, 16, 19, 20, 24, 28, 29, 30, 31, 37, 41, 44, 48, 51, 64, 66], "pg_dump": 5, "plain": 5, "format": [5, 7, 8, 26, 42, 43, 51, 69], "fill": [5, 8, 20, 24, 33, 39, 40, 62, 68], "empti": [5, 10, 20], "psql": 5, "archiv": [5, 20, 26, 41, 59], "fc": 5, "pg_restor": 5, "restor": 5, "regardless": 5, "oper": [5, 8], "line": [5, 36, 39, 51, 57, 69], "break": [5, 51, 69], "d": [5, 31, 38, 54], "1": [5, 8, 30, 44, 47, 54, 68], "zip": 5, "sever": [5, 20, 32, 36, 41, 48, 51], "entiti": [5, 8, 9, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27, 29, 33, 38, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 55, 58, 59, 60, 62, 64, 67], "divid": [5, 24, 42, 54], "properti": [5, 18, 45, 46, 47, 48, 53], "geometri": [5, 8, 36, 56], "current": [5, 7, 8, 26, 33, 42, 44, 45, 48, 51, 57, 60, 63], "2022": [5, 51], "10": [5, 39, 48, 57], "04_1610": 5, "kei": [5, 44, 63], "tag": [5, 41, 51], "prefer": [6, 15, 42, 53, 60], "profil": [6, 8, 12, 14, 20, 39, 42, 43, 45, 51, 56, 57, 68, 73], "valu": [6, 9, 12, 13, 39, 40, 41, 49, 51, 54, 61, 62, 68], "choos": [6, 8, 15, 17, 20, 29, 30, 31, 34, 35, 36, 37, 38, 40, 45, 58], "much": [6, 7, 40], "At": [6, 16, 17, 18, 20, 23, 24, 25, 27, 41, 48, 55], "moment": [6, 39, 48, 58], "info": [6, 14, 20, 25], "minimum": 6, "jstree": 6, "charact": [6, 8, 69], "filter": [6, 41, 42, 51, 52, 62, 73], "tree": [6, 31, 41], "type": [6, 9, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 49, 54, 58, 72, 73], "random": 6, "password": [6, 10, 14, 15, 42, 56], "length": 6, "reset": [6, 10, 14, 42, 60], "upon": 6, "requir": [6, 8, 14, 20, 26, 30, 33, 35, 36, 38, 41, 42, 51, 63, 70, 72], "confirm": [6, 42], "hour": [6, 60, 68], "long": [6, 20, 41, 73], "code": [6, 43, 44, 45, 51, 52, 65], "fail": [6, 66], "login": [6, 7, 10, 14, 43, 65], "often": [6, 22, 52], "attempt": 6, "specif": [6, 8, 20, 26, 29, 32, 37, 40, 41, 42, 43, 44, 47, 48, 51, 53, 57, 66], "usernam": [6, 10, 11, 14, 15, 66], "forget": [6, 41], "minut": [6, 60, 66, 68], "mani": [6, 13, 20, 24, 26, 41, 44, 63], "wait": [6, 66], "chosen": [6, 8, 36, 38, 40, 41], "number": [6, 8, 26, 48, 49, 51, 66], "exceed": 6, "activ": [6, 14, 18, 20, 31, 42, 44, 57, 60, 62, 63, 68], "preview": [6, 8], "open": [7, 26, 30, 34, 35, 38, 41, 42, 43, 51, 55, 57], "standard": [7, 37, 40, 42, 44, 72], "deliv": [7, 42], "high": [7, 26, 38, 42, 57], "attribut": [7, 26, 41, 42], "onlin": [7, 30, 38, 42], "scale": [7, 20, 42], "onc": [7, 55], "see": [7, 8, 14, 21, 22, 24, 28, 31, 33, 34, 35, 36, 37, 38, 40, 42, 45, 47, 49, 51, 52, 55, 58, 60, 63, 64, 66], "configur": [7, 13, 20, 52, 53, 55], "item": [7, 20, 27, 29, 40, 47], "enabl": [7, 8, 20, 26, 42, 45, 55, 57, 58], "expos": 7, "checkbox": [7, 26, 29, 57, 66], "complet": 7, "api": [7, 9, 15, 20, 26, 41, 42, 43, 49, 52, 60], "yourserv": 7, "eu": [7, 13, 51], "manifest": [7, 42], "2": [7, 30, 44, 47, 54], "path": [7, 51], "absolut": 7, "drop": [7, 20, 38, 58], "zone": 7, "var": 7, "www": [7, 15, 26, 38], "iipsrv": 7, "write": 7, "execut": [7, 9, 43, 52], "webserv": 7, "convers": 7, "control": [7, 15, 38, 51], "convert": [7, 55, 68], "pyramid": 7, "tiff": 7, "none": [7, 36, 41, 51, 63], "deflat": 7, "lossless": 7, "size": [7, 20, 53], "mai": [7, 24, 39, 41, 44, 51, 52, 58, 63, 64], "larg": [7, 20, 58], "jpeg": [7, 20], "smaller": [7, 52], "transpar": 7, "run": [7, 8, 13, 41, 52], "sub": [7, 8, 9, 17, 18, 29, 33, 35, 44], "accordingli": 7, "successfulli": 7, "bmp": [7, 20], "gif": [7, 20], "ico": [7, 20], "jpg": [7, 20], "svg": [7, 20], "tif": 7, "directli": [8, 30, 38, 41, 45, 47, 54], "csv": [8, 9, 42], "gi": 8, "unit": [8, 17, 19, 21, 22, 29, 36, 39, 43, 47, 48, 54, 61], "histor": [8, 22, 26, 36, 38, 39, 43], "regard": [8, 31, 38, 40, 53], "integr": [8, 9, 26, 43, 58], "caution": 8, "consum": 8, "we": [8, 41, 44, 63], "strongli": 8, "advis": 8, "sql": [8, 9, 43, 52], "ani": [8, 30, 31, 36, 41, 49, 51], "older": [8, 63], "enforc": 8, "check": [8, 9, 10, 14, 26, 29, 35, 39, 42, 43, 46, 58, 60, 62], "alright": 8, "encapsul": 8, "script": [8, 44], "example_place_hierarchi": 8, "sure": [8, 36, 39, 51, 63, 66, 68], "extens": [8, 20, 45, 51], "spell": [8, 39, 67], "correctli": [8, 39], "lower": [8, 24], "my_data": 8, "header": [8, 73], "each": [8, 15, 20, 21, 24, 30, 39, 40, 42, 44, 45, 46, 49, 51, 54], "separ": [8, 41], "comma": 8, "enclos": 8, "doubl": [8, 36], "quot": 8, "To": [8, 15, 16, 17, 18, 20, 23, 24, 25, 27, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 45, 47, 48, 51, 52, 57, 62, 67, 68, 73], "said": [8, 34], "titl": [8, 18, 51, 57], "messag": [8, 51, 63, 64, 66], "uniqu": [8, 26, 49], "per": [8, 73], "prefix": 8, "them": [8, 18, 22, 29, 32, 33, 36, 41, 55, 60, 63], "person_1": 8, "place_1": 8, "underscor": 8, "_": 8, "hyphen": 8, "miss": [8, 9, 41, 44, 63, 68], "begin_from": [8, 48], "begin_to": [8, 48], "end_from": [8, 48], "end_to": [8, 48], "type_id": 8, "value_typ": 8, "reference_id": 8, "alreadi": [8, 13, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35, 38, 40, 41, 50, 55, 60, 68], "origin_reference_id": 8, "reference_system_": 8, "administrative_unit_id": 8, "historical_place_id": 8, "parent_id": 8, "openatlas_parent_id": 8, "openatlas_class": 8, "string": [8, 48, 69], "alias": [8, 60, 62, 67, 73], "semicolon": 8, "surround": 8, "yyyi": [8, 39, 62], "mm": [8, 39], "dd": [8, 39], "out": [8, 18, 29, 33, 36, 40, 41, 48, 57, 62, 63, 68], "timefram": 8, "For": [8, 15, 18, 19, 21, 22, 24, 26, 28, 30, 33, 34, 35, 40, 41, 45, 47, 49, 51, 54, 66, 68], "timespan": [8, 68], "more": [8, 18, 19, 20, 21, 24, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 47, 49, 51, 52, 62], "keep": [8, 9, 14, 29, 30, 31, 32, 35, 36, 37, 38, 41, 45, 69], "mind": [8, 9, 29, 30, 31, 32, 35, 36, 37, 38, 41], "incorrect": 8, "red": 8, "advanc": [8, 14, 62, 63, 69], "studi": [8, 29, 43], "space": [8, 20, 24, 30], "1234": [8, 13], "13": [8, 51], "65": 8, "pair": 8, "56": 8, "78": 8, "wrap": 8, "cell": 8, "quotat": 8, "mark": [8, 20, 29, 36, 41, 55, 70, 72], "iv": 8, "542": 8, "34": 8, "23": [8, 39, 48, 68], "66": 8, "just": [8, 20, 68], "5678": 8, "literature_1": 8, "book_2": 8, "multi": 8, "point": [8, 18, 33, 34, 35, 36, 57], "polygon": [8, 36, 57], "linestr": [8, 36, 57], "geometriccollect": 8, "wgs84": [8, 57], "geodet": 8, "epsg": [8, 57], "4326": [8, 57], "sinc": [8, 44, 72], "tall": 8, "12": [8, 39, 48, 62, 68], "458533781141528": 8, "41": 8, "922205268362234": 8, "53062334955289": 8, "917606998887024": 8, "52169797441624": 8, "888476931243254": 8, "coulmn": 8, "append": 8, "reference_system_wikidata": 8, "occur": [8, 35, 51], "substitut": 8, "reference_system_getty_aat": 8, "consist": [8, 19, 21, 26, 28, 30, 39, 41, 42, 44], "identifi": [8, 14, 22, 26, 36, 60], "q54123": 8, "second": [8, 60, 68, 73], "match": [8, 26, 36, 38, 44, 57], "close_match": 8, "exact_match": 8, "gener": [8, 9, 18, 33, 43, 51, 52, 53, 56, 63, 68], "togeth": [8, 20, 41, 44], "stratigraph": [8, 17, 19, 21, 22, 24, 39, 43, 47, 48, 54, 61], "remain": [8, 16, 17, 22, 24, 28, 43, 54], "declar": 8, "insensit": 8, "question": [8, 22, 41], "structur": [8, 19, 22, 28, 41, 42, 43, 51], "archaeolog": [8, 19, 21, 22, 24, 28, 31, 42, 43], "model": [8, 41, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55, 59], "ll": [8, 43, 66], "duplic": [8, 9, 41, 72], "sensit": [8, 62], "king": [8, 31, 38, 39], "arthur": 8, "print": [8, 49], "doesn": [8, 18, 64, 65, 66], "stop": 8, "went": [8, 33], "summari": [8, 27], "brows": [8, 14, 44, 45], "layout": [8, 20, 52], "did": 8, "good": [8, 20, 24], "idea": 8, "doc": [8, 48], "data_integrity_check": 8, "authent": [9, 10, 15, 43], "mail": [9, 14, 43], "modul": [9, 39, 43, 56, 57, 68], "map": [9, 17, 18, 19, 21, 22, 24, 26, 28, 30, 31, 35, 42, 43, 44, 45, 47, 48, 49, 56, 60], "iiif": [9, 41, 43, 55], "content": [9, 25, 27, 34, 43, 49, 57, 63], "present": [9, 20, 31, 34, 40, 41, 42, 43, 51, 57, 59], "orphan": [9, 58], "annot": [9, 43, 53, 56], "subunit": [9, 22, 27, 30], "circular": 9, "invalid": [9, 51], "preced": [9, 18, 33, 35, 39, 44, 48], "similar": [9, 26, 38, 41, 57, 68], "prepar": 9, "alia": [9, 16, 24, 30, 36, 70], "refer": [9, 14, 16, 17, 18, 19, 20, 21, 22, 24, 27, 28, 29, 30, 32, 34, 35, 39, 40, 41, 42, 43, 44, 45, 47, 53, 57], "wkt": [9, 56], "coordin": [9, 26, 36, 57], "extern": [9, 20, 25, 26, 31, 35, 38, 40, 41, 47, 51, 53], "dump": 9, "json": [9, 51], "xml": 9, "arch": [9, 20, 41, 43], "overview": [9, 13, 14, 20, 29, 35, 40, 43, 44, 45, 46, 47, 51, 52, 58, 59, 61], "fetch": 9, "reference_system": 9, "index": [9, 16, 17, 18, 20, 23, 24, 25, 27], "vocab": [9, 43], "vocabulari": [9, 38, 49], "ensur": [10, 20, 41], "disabl": [10, 11, 26], "leav": 10, "send": [10, 14, 34, 35], "mail_password": 10, "smtp": 10, "net": [10, 13], "port": 10, "587": 10, "recipi": [10, 18], "feedback": [10, 63], "receiv": [10, 35, 60, 66], "zoom": [11, 36, 57, 58, 60], "defin": [11, 14, 20, 25, 33, 44, 48, 49, 52, 58, 60], "lowest": [11, 60], "adjust": [11, 12, 60], "far": [11, 60], "disableclusteringatzoom": 11, "cluster": [11, 36], "maxclusterradiu": 11, "maxim": 11, "rang": [11, 44, 48, 51, 61], "geonam": [11, 30, 38, 49, 56], "own": [12, 14, 16, 17, 21, 31, 36, 38, 41, 42, 45, 51], "wider": 13, "audienc": 13, "area": [13, 36, 54, 55, 57], "backend": [13, 53], "frontend": 13, "demo": [13, 44, 47, 51], "specifi": [13, 16, 20, 25, 29, 38, 39, 40, 41, 42, 51], "newslett": [14, 42, 60], "subscript": 14, "registr": 14, "account": [14, 61], "sent": [14, 35], "cannot": [14, 26, 29, 35, 39, 64], "anymor": [14, 29, 64, 66], "inact": [14, 59], "modifi": [14, 18, 60], "full": [14, 36, 57, 60, 62], "easier": [14, 42, 60], "free": [14, 31, 33, 35, 36, 38, 39, 40, 43, 49], "guest": 14, "who": [14, 16, 17, 21, 22, 31, 38], "aren": [14, 20, 41, 68], "editor": [14, 20, 29, 40, 57, 60], "contributor": 14, "readonli": 14, "ye": 14, "skosmo": 15, "As": [15, 18, 31, 33, 35, 36, 38, 39, 45, 61], "ch": 15, "trail": 15, "slash": 15, "vocabs_pw": 15, "differ": [15, 18, 20, 30, 32, 33, 35, 36, 38, 40, 41, 42, 45, 47, 51, 58, 67, 69, 72], "confer": 15, "w3": 15, "org": [15, 26, 38, 51], "tr": 15, "sko": [15, 26, 38, 57], "primer": 15, "concept": [15, 26, 57], "child": 15, "conceptu": [15, 44, 45], "decid": [15, 40], "choic": [15, 29, 40], "what": [15, 58], "choosen": 15, "e74": 16, "albert": [16, 48], "einstein": [16, 48], "queen": 16, "victoria": 16, "peopl": [16, 18, 37, 41], "famili": 16, "tribe": 16, "greenpeac": 16, "nation": 16, "museum": [16, 17, 21, 26, 31, 38, 44], "denmark": 16, "resid": 16, "main": [16, 41, 53, 71], "born": [16, 48], "where": [16, 18, 22, 29, 33, 35, 36, 38, 41, 44, 57, 58, 62, 68], "came": 16, "di": [16, 48], "mother": 16, "member": [16, 37], "kept": 16, "pictur": [16, 17, 19, 55], "coin": [17, 30, 31], "potteri": [17, 30], "collector": 17, "carrier": 17, "carri": [17, 18, 30], "e7": [18, 48], "e8": 18, "e5": [18, 48], "e11": 18, "e9": 18, "common": [18, 26, 51, 65], "battl": [18, 35, 39], "meet": [18, 62], "wed": 18, "owner": [18, 31], "anoth": [18, 20, 24, 29, 30, 31, 33, 34, 41, 44, 49, 51, 60], "natur": [18, 38, 47], "disast": 18, "track": [18, 31, 33, 34, 39, 42, 48, 53, 61], "conserv": 18, "treatment": 18, "movement": 18, "crm": [18, 24, 33, 42, 43, 45, 46, 47, 48, 52], "war": [18, 35, 39, 48], "up": [18, 20, 36, 41, 62, 63, 66, 68], "journei": [18, 32, 35], "wai": [18, 19, 24, 26, 28, 30, 31, 32, 34, 40, 44, 48, 49, 51], "donor": 18, "step": [18, 22, 24, 26, 30, 31, 32, 33, 34, 37, 41, 42, 52], "instruct": [18, 24, 26, 31, 34], "our": [18, 24, 26, 41, 43], "ownership": 18, "acquir": [18, 31, 41], "surrend": 18, "creator": [18, 20, 41], "destin": 18, "unfortun": [18, 33], "background": [18, 42, 45, 47, 58, 68], "tutori": [18, 31, 33, 35, 36, 41], "produc": 18, "e18": [19, 24, 28, 47, 48], "physic": [19, 24, 28, 30, 31, 34, 36, 47, 48, 57], "thing": [19, 24, 28, 30, 36, 47, 48, 57], "record": [19, 21, 24, 28, 31, 34, 49, 54], "grave": [19, 21, 24, 28, 30, 36], "consid": [19, 24, 47, 49], "referenc": [19, 25, 28], "skeleton": [19, 21], "pit": [19, 30], "ditch": 19, "rampart": 19, "label": [19, 29, 44, 58, 68], "disk": 20, "display": 20, "upload": [20, 31, 42, 52, 53], "exce": 20, "limit": [20, 53, 68], "both": [20, 68], "go": [20, 24, 29, 30, 31, 39, 40, 45, 57], "drag": [20, 57, 58], "left": [20, 38, 50, 55, 57, 58], "furthermor": [20, 24, 26, 39, 40, 45], "practic": [20, 41], "licenc": 20, "besid": [20, 68], "plan": [20, 41], "indic": [20, 39, 41, 44, 48, 51], "design": [20, 36, 41, 42, 54], "holder": [20, 49], "Not": [20, 62], "maximum": 20, "mb": 20, "width": [20, 58], "pixel": [20, 58], "pdf": 20, "display_file_ext": 20, "chose": [20, 68], "do": [20, 29, 30, 31, 36, 39, 63], "height": [20, 29, 58], "120": 20, "px": 20, "larger": 20, "try": [20, 51, 58, 63, 64, 66, 68], "small": [20, 60], "impact": 20, "perform": [20, 31, 45, 56], "suppos": 20, "met": [20, 41], "must": [20, 39, 41, 44, 51], "those": [20, 24, 39, 47, 51], "numer": [20, 40, 44, 61], "flag": [20, 41], "viewer": [20, 41, 42, 55], "e20": 21, "biolog": [21, 30], "anthropolog": [21, 24, 30, 43, 56, 61], "bone": [21, 30, 54], "sex": [21, 29, 30, 42, 56], "gender": [21, 30], "ag": [21, 30, 42], "mask": [21, 30], "workflow": [21, 22, 24, 28, 32, 42, 59], "acquisit": [21, 42], "modif": [21, 38, 40], "move": [21, 24, 31, 32, 58], "femur": [21, 54], "humeru": [21, 30, 54], "molar": 21, "historian": [22, 37], "work": [22, 37, 39, 42, 43, 63], "come": [22, 29, 30, 40, 41, 68], "usual": [22, 41], "facilit": [22, 26], "bit": 22, "hi": [22, 31, 39], "life": [22, 48], "archaeologist": 22, "reflect": [22, 34, 51], "contin": 24, "graveyard": [24, 30], "under": [24, 25, 26, 36, 38, 51, 66], "austria": 24, "itali": 24, "respect": [24, 26, 33, 34, 35, 36, 38, 41, 49, 57], "styria": 24, "duchi": 24, "bavaria": 24, "lombard": [24, 38], "kingdom": 24, "newli": [24, 28, 31], "though": [24, 28], "e18phys": 24, "certain": [24, 29, 30, 36, 44, 48, 49, 57], "posit": [24, 30, 36, 49, 57], "extend": [24, 30, 33, 34, 57], "tempor": [24, 30, 35, 42], "spatial": [24, 30, 42, 57], "superior": 24, "cemeteri": 24, "compos": 24, "burial": [24, 28, 30, 36], "primari": 24, "secondari": [24, 27], "back": [24, 30, 31], "solv": [24, 63, 65], "book": [25, 30, 49], "inbook": 25, "articl": [25, 30, 51], "charter": [25, 27, 49], "chronicl": 25, "doi": [25, 49], "instead": [25, 34, 40, 45, 51], "author": [26, 49], "advantag": [26, 31], "abl": [26, 31, 41], "futhermor": 26, "merg": 26, "lod": [26, 38, 42], "analogu": 26, "librari": 26, "catalogu": 26, "inventori": [26, 38, 49], "collabor": 26, "multilingu": 26, "knowledg": [26, 45], "graph": [26, 58], "wikimedia": 26, "foundat": 26, "wikipedia": 26, "everyon": [26, 45], "cc0": 26, "domain": [26, 44, 48, 51], "usabl": [26, 51, 69], "geograph": [26, 49], "web": [26, 49, 52, 53], "creativ": 26, "over": [26, 29, 31, 36, 40, 41, 49, 61, 73], "25": [26, 48], "000": 26, "11": [26, 48, 51], "800": [26, 38, 68], "gemeinsam": 26, "normdatei": 26, "translat": [26, 27, 45, 47, 52, 53], "intern": [26, 42, 44, 45, 47], "organis": 26, "subject": 26, "head": 26, "corpor": 26, "bodi": 26, "mainli": 26, "increasingli": 26, "definit": [26, 38, 44, 45, 51], "confid": [26, 38, 57], "degre": [26, 38, 54, 57], "close": [26, 36, 38, 57], "suffici": [26, 38, 57], "interchang": [26, 38, 57], "retriev": [26, 38, 51, 57], "exact": [26, 36, 38, 39, 57, 68], "vienna": [26, 38, 61], "suitabl": [26, 33, 38, 52], "deal": [26, 41, 45, 47, 58], "primarili": [26, 28, 54], "wiki": [26, 38, 43], "q123": 26, "septemb": 26, "desir": [26, 30, 34, 37, 38], "short": [26, 31, 35, 44], "mous": [26, 29, 40, 57, 58, 73], "yet": [26, 35], "attach": [26, 41, 51], "e33": [27, 45, 47, 49], "linguist": [27, 47, 49], "written": [27, 34, 52], "mediev": [27, 49], "letter": [27, 31, 32, 33, 35, 44], "literatur": [27, 54], "comment": [27, 39, 62, 68], "tool": [28, 31, 42, 43, 51, 54, 57, 59, 61, 73], "lead": [28, 29, 41, 51], "backfil": [28, 30], "e55": [29, 48], "With": [29, 31, 34, 42, 46, 57, 58, 66], "adapt": [29, 42, 60], "interest": [29, 45], "dynam": [29, 40], "statu": [29, 30, 33, 51], "higher": 29, "basic": [29, 40, 45], "root": [29, 52], "untyp": 29, "switch": [29, 57, 58, 71], "except": [29, 51, 60, 69], "unselect": 29, "categori": [29, 54], "permiss": [29, 38, 40, 42, 64], "renam": [29, 40], "subtyp": [29, 40], "grei": 29, "least": [29, 33, 40, 41, 62], "decim": [29, 57], "dimens": [29, 30, 48], "weight": [29, 54], "centimetr": 29, "gram": 29, "percentag": 29, "unabl": 29, "fit": [29, 31, 35, 36], "reduc": 29, "typ": [29, 40], "element": [30, 31, 33, 34, 60, 63], "procedur": [30, 33, 34], "3": [30, 48, 51, 54], "knife": 30, "4": [30, 41, 51, 62, 68], "teeth": 30, "classif": [30, 33, 34], "bout": [], "concern": [30, 33, 52], "store": [30, 31, 42, 48, 49, 51], "state": [30, 36, 38, 39, 51, 61], "appropri": [30, 31, 34], "settlement": 30, "magnifi": [30, 36, 57], "evid": 30, "plot": [30, 36], "photo": 30, "now": [31, 34], "layer": [36, 57], "finger": 30, "ring": [30, 48], "patholog": 30, "measur": [30, 40, 61], "discolor": 30, "canin": [], "represent": [31, 45], "repres": [31, 35, 36, 39, 47], "span": [31, 32, 48, 62, 68], "cover": [31, 36, 40], "Then": [31, 36], "learn": 31, "On": [31, 33, 35], "land": [31, 35, 54], "kind": [31, 36, 40], "occurr": 31, "excav": [31, 55], "transfer": 31, "sold": [], "leonardo": 31, "paint": 31, "mona": 31, "lisa": 31, "workshop": 31, "florenc": 31, "franci": 31, "franc": 31, "exhibit": 31, "ch\u00e2teau": 31, "ambois": 31, "fountainebleau": 31, "louvr": 31, "pari": 31, "typic": 32, "scenario": 32, "suggest": [32, 63, 65], "discuss": 32, "best": 32, "profess": [32, 43], "special": [33, 41, 42, 44, 47, 69], "trip": 33, "chronolog": 33, "captur": 33, "continu": [30, 33, 35, 36, 48], "altern": [33, 41, 51], "role": [33, 38, 41], "determin": [42, 44, 49, 54], "exchang": [34, 43], "materi": [], "copi": [34, 36], "preset": [], "subgroup": 35, "bring": [35, 38, 44], "simultan": 35, "music": 35, "festiv": 35, "parallel": 35, "concert": 35, "overlap": 35, "sequenc": [35, 44, 51], "introduct": [35, 43], "think": [35, 38, 39, 44, 64, 66], "screen": [36, 57], "glass": [36, 57], "pop": 36, "marker": [36, 57], "visual": [36, 42, 43, 50, 56], "hover": 36, "landscap": 36, "street": 36, "satellit": 36, "whether": [36, 73], "four": [36, 39], "mode": [36, 57, 58], "centerpoint": 36, "drawn": [36, 57], "border": 36, "river": 36, "bed": 36, "draw": [36, 55, 57], "shape": [36, 38, 54, 57], "rectangl": [55, 57], "ground": 36, "hole": 36, "whose": 36, "unknown": [36, 39], "enough": [36, 39, 68], "window": 36, "dedic": 36, "countri": 49, "gazett": [38, 49], "particularli": [38, 42], "But": [38, 41], "analog": 38, "card": [38, 49], "catalog": [38, 49], "wikidata": [38, 49], "manual": [38, 40, 41, 42, 50, 51, 52, 57], "q3044": 38, "charlemagn": 38, "input": [38, 51, 68], "2761369": 38, "AT": 38, "precis": [38, 57], "down": 38, "blank": 38, "belt": 38, "buckl": 38, "q3180027": 38, "todai": 38, "frank": 38, "becam": 38, "holi": [38, 48], "roman": 38, "emperor": 38, "venu": 38, "willendorf": 38, "histori": 38, "q131397": 38, "focus": 39, "statigraph": [], "bottom": [39, 57], "initi": [39, 68], "hidden": [39, 68], "year": [39, 48, 61, 62, 68], "4713": [39, 68], "9999": [39, 51, 68], "month": [39, 62, 68], "31": [39, 48, 54, 62, 68], "hh": 39, "59": [39, 51, 68], "ss": 39, "minu": 39, "bc": [39, 68], "softwar": [39, 42, 47, 52], "postgresql": [39, 44, 53, 68], "prolept": [39, 68], "gregorian": [39, 68], "calendar": [39, 68], "hast": 39, "fought": 39, "william": 39, "duke": 39, "normandi": 39, "norman": 39, "french": [39, 42], "troop": 39, "harold": 39, "godwinson": 39, "english": [39, 42], "armi": 39, "14th": 39, "octob": 39, "1066": 39, "14": 39, "alik": [39, 45, 51], "Or": 39, "peac": 39, "westphalia": 39, "treati": 39, "sign": [39, 51], "1648": [39, 48], "osnabr\u00fcck": 39, "15th": 39, "m\u00fcnster": 39, "24th": 39, "thirti": [39, 48], "eighti": 39, "05": [39, 48], "15": 39, "24": [39, 48], "uncertain": 39, "third": 39, "fourth": 39, "actual": 39, "frame": 39, "certainti": 39, "death": [39, 48], "stephen": 39, "hungari": 39, "august": 39, "1038": 39, "birth": [39, 44, 48, 68], "01": [39, 62, 68], "975": 39, "earliest": 39, "latest": [39, 50], "howev": 39, "gear": [39, 45], "organ": 40, "distinct": [40, 49], "push": 40, "blue": 40, "light": 40, "answer": 41, "frequent": 41, "approach": 41, "probabl": [41, 49, 63], "analys": [41, 43, 56, 61], "decis": 41, "regist": [41, 66], "hide": [41, 60], "reason": [41, 44, 51, 63, 66], "conflict": 41, "core": 41, "strict": 41, "better": 41, "lot": 41, "sai": 41, "alex": 41, "him": 41, "pick": 41, "he": 41, "although": 41, "filenam": 41, "cc": 41, "BY": 41, "unstructur": 41, "nor": [41, 44], "searchabl": [41, 60], "solut": [41, 63], "happi": 41, "help": [40, 41, 45, 63, 65], "tailor": 41, "hesit": 41, "reach": [41, 50], "u": [41, 64], "topic": [41, 42, 63], "linebreak": 41, "html": [41, 52], "markdown": 41, "bold": 41, "font": 41, "underlin": 41, "necessarili": 41, "handl": [41, 43], "interoper": 41, "easi": [42, 45, 51], "conveni": [42, 44, 47], "contribut": 42, "significantli": 42, "ontologi": [42, 44, 45], "easili": 42, "fair": 42, "principl": 42, "wide": [42, 44, 68], "uncertainti": [42, 68], "checker": [42, 43, 45], "quick": [42, 43, 62], "accord": [42, 47, 48, 66], "flexibli": 42, "thu": 42, "interact": [42, 57], "navig": [42, 56, 62, 73], "network": [42, 43, 50, 56], "bookmark": [42, 50, 53, 64], "context": 42, "internation": 42, "gettext": 42, "catalan": 42, "german": 42, "spanish": 42, "mirador": 42, "grant": 42, "autom": 42, "unsubscrib": [42, 60], "interdisciplinari": [42, 44], "method": [42, 54], "futur": 42, "ferembach": [42, 54], "et": [42, 54], "al": [42, 54, 71], "estim": [42, 56], "1979": [42, 54], "ment": [42, 61], "archeolog": 43, "geospati": 43, "radiocarbon": [43, 56], "shortcut": [43, 45, 68], "guid": 43, "paramet": [43, 58], "proxi": 43, "troubleshoot": 43, "faq": 43, "doe": [43, 44, 51], "why": 43, "iso": 44, "formal": 44, "council": 44, "icom": 44, "basi": [], "underli": 44, "v7": 44, "publish": [44, 54], "2021": 44, "pars": 44, "github": 44, "e39": [44, 48], "e67": [44, 48], "characteris": 44, "had": [44, 48, 68], "invers": 44, "anywai": 44, "ignor": 44, "foreign": 44, "sub_properties_of": 44, "suffix": 44, "counterpart": 44, "p3": [44, 48], "parser": 44, "com": [], "craw": [], "blob": [], "cidoc_rtfs_pars": [], "troubl": [], "prior": [45, 51], "verifi": 45, "fact": [], "gain": [], "insight": [], "graphic": 45, "symbol": [36, 45, 51, 69], "introduc": 45, "increas": 45, "finer": [45, 47], "grain": [45, 47], "contextu": [45, 47], "lingust": [45, 47], "refin": [47, 62], "7": [47, 54], "compris": 47, "rel": 47, "differenti": 47, "confus": 47, "true": [47, 51], "simplifi": 48, "oa": 48, "p11i": 48, "stefan": 48, "joachim": 48, "son": 48, "father": 48, "usag": [45, 48, 56], "birthplac": 48, "p92i": 48, "brought": 48, "e63": 48, "p7": 48, "took": 48, "e521": 48, "e567": 48, "ulm": 48, "p93i": 48, "e64": 48, "e69": 48, "princeton": 48, "begin_com": 48, "end_com": 48, "timestamp": [48, 51], "e61": 48, "primit": 48, "p4": 48, "e52": 48, "p81": 48, "ongo": 48, "throughout": 48, "lanc": 48, "forg": 48, "durat": 48, "0770": 48, "destroi": [48, 68], "p13": 48, "destruct": 48, "e6": 48, "throw": 48, "lava": 48, "3019": 48, "03": 48, "p98i": 48, "1981": 48, "p100i": 48, "ladi": 48, "diana": 48, "1997": 48, "1618": 48, "purpos": 48, "e62": [48, 69], "p43": 48, "e54": 48, "bibliograph": 49, "delimit": 49, "along": 49, "chapter": 49, "figur": 49, "folio": 49, "7v": 49, "kell": 49, "saint": 49, "mari": 49, "21": 49, "less": 49, "eleven": 49, "million": 49, "charg": [49, 58], "distinguish": 49, "non": [49, 53], "encyclopedia": 49, "domain_id": 49, "property_cod": 49, "range_id": 49, "alphanumer": [49, 61], "alon": [], "p67i": 49, "p71": 49, "terri": 49, "prattchet": 49, "q46248": 49, "p71i": 49, "e1": 49, "depict": 49, "scan": [], "extract": [], "mostli": 49, "logo": [50, 71], "upper": [50, 57], "program": [], "analyt": 51, "mashin": [], "tri": 64, "constraint": 51, "hand": [], "swagger": 51, "visit": 51, "rdf": 51, "visibl": [51, 57, 59], "commun": 51, "schema": [51, 53], "5117": 51, "machin": 51, "deprec": 51, "unstabl": 51, "unavail": 51, "notion": 51, "signific": 51, "major": [51, 54, 63], "minor": 51, "post": 51, "roadmap": 51, "releas": 51, "discontinu": 51, "openapi": 51, "lpf": 51, "geojson": 51, "deriv": 51, "sort": [31, 51, 73], "consult": 51, "convent": 51, "success": 51, "failur": 51, "2xx": 51, "4xx": 51, "signal": 51, "5xx": 51, "tue": 51, "19": 51, "jul": 51, "gmt": 51, "404": 51, "kf": 51, "desc": 51, "flask": [51, 52], "catch": 51, "handler": 51, "behind": 51, "someurl": 51, "8080": 51, "No": 51, "python": 52, "framework": 52, "config": 52, "upgrad": 52, "live": [52, 62], "util": 52, "static": 52, "css": 52, "javascript": 52, "templat": 52, "compil": 52, "rout": 52, "redirect": 52, "sphinx": 52, "retrac": 52, "15883": 52, "init": 52, "before_request": 52, "get_by_id": 52, "some_data": 52, "some_filt": 52, "postgi": [53, 57], "assess": 54, "schwidetzki": 54, "m": 54, "stloukal": 54, "empfehlungen": 54, "f\u00fcr": 54, "die": 54, "alter": 54, "und": 54, "geschlechtsdiagnos": 54, "am": 54, "skelett": 54, "homo": 54, "30": [54, 57, 61], "32": 54, "skull": [30, 54], "pelvi": 54, "examin": 54, "propos": 54, "margo": 54, "supramastoideu": 54, "o": 54, "sacrum": 54, "robust": 54, "supplement": 54, "glabella": 54, "w": 54, "arcu": 54, "superciliari": 54, "tuber": 54, "frontali": 54, "parietali": 54, "inclinatio": 54, "processu": 54, "mastoideu": 54, "relief": 54, "planum": 54, "nuchal": 54, "protuberantia": 54, "occipitali": 54, "externa": 54, "zygomaticu": 54, "zygomaticum": 54, "crista": 54, "supramastoideum": 54, "supraorbitali": 54, "orbita": 54, "mandibl": 54, "overal": 54, "mentum": 54, "angulu": 54, "inferior": 54, "m2": 54, "angl": 54, "sulcu": 54, "praeauriculari": 54, "incisura": 54, "ischiadica": 54, "pubi": 54, "arc": 54, "compos\u00e9": 54, "coxa": 54, "foramen": 54, "obturatum": 54, "corpu": 54, "ossi": 54, "ischii": 54, "iliaca": 54, "fossa": 54, "auricular": 54, "acetabuli": 54, "express": 54, "assign": 54, "femal": 54, "indiffer": 54, "male": 54, "preserv": 54, "sum": 54, "69": 54, "70": 54, "prerequisit": 55, "wasn": 55, "side": [55, 63], "guarante": 55, "overlai": [56, 60], "leaflet": 57, "mousewheel": 57, "hold": 57, "basemap": 57, "popup": 57, "40": 57, "20": 57, "characterist": 57, "road": 57, "toggl": 57, "east": 57, "north": 57, "d3": 58, "j": 58, "egocentr": 58, "classic": 58, "wheel": 58, "node": 58, "rotat": 58, "pan": 58, "color": 58, "depth": 58, "too": [58, 62], "hardwar": 58, "acceler": [58, 61], "faster": 58, "exactli": 58, "remind": 59, "privat": 59, "seen": 59, "everybodi": 59, "anybodi": 59, "els": 59, "got": 59, "twice": 60, "uncheck": 60, "deactiv": [60, 66], "disappear": 60, "whom": 60, "laboratori": 61, "abbrevi": 61, "lab": 61, "conduct": 61, "vera": 61, "environment": 61, "specimen": 61, "sampl": 61, "analysi": 61, "1015": 61, "big": [36, 39, 62], "global": [62, 72], "term": [62, 73], "ada": 62, "lovelac": 62, "da": 62, "love": 62, "unacc": 62, "lov\u0113": 62, "vice": 62, "versa": 62, "placehold": 62, "l": 62, "ce": 62, "me": 62, "dateless": 62, "criteria": 62, "1540": 62, "1560": 62, "1550": 62, "intend": 63, "support": [63, 69], "sometim": 63, "cach": 63, "rememb": 63, "firefox": 63, "haven": 63, "screenshot": 63, "explan": 64, "encount": 64, "let": 64, "know": 64, "read": [64, 73], "mayb": 64, "obsolet": 64, "keyboard": [39, 66], "capslock": 66, "forgot": 66, "misspel": 66, "secur": 66, "attack": 66, "lock": 66, "few": [40, 66, 72], "until": 66, "e41": 67, "appel": 67, "oa8": 68, "oa9": 68, "knew": 68, "1356": 68, "unsur": 68, "church": 68, "fist": 68, "decad": 68, "1800": 68, "1809": 68, "autocomplet": 68, "5": 68, "zero": 68, "leap": 68, "almost": 69, "cyril": 69, "mathemat": 69, "asterisk": [70, 72], "serv": 71, "quit": 72, "difficult": 72, "glanc": 73, "quickli": 73, "invert": 73, "cut": 73, "familiaris": 44, "wherev": [40, 45], "cidoc_crm": 48, "done": 51, "One": 30, "immedi": 30, "strai": 30, "tooth": 30, "possess": 31, "realli": 31, "buyer": 31, "hous": 31, "artwork": 31, "broader": 32, "scope": 32, "seri": 33, "exit": 34, "rectangular": 36, "outlin": 36, "georeferenc": 36, "doughnut": 36, "baker": 37, "professor": 37, "univers": 37, "mustermann": 37, "00": 39, "ctrl": 39}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"api": [0, 51], "arch": 1, "overview": [1, 50], "fetch": 1, "data": [1, 3, 30, 41, 42], "from": 1, "automat": 1, "creat": [1, 33, 35, 36, 38, 40], "entiti": [1, 3, 22, 48], "type": [1, 3, 8, 29, 40, 41, 48], "refer": [1, 8, 25, 26, 31, 36, 38, 49], "system": [1, 8, 26, 36, 38, 49], "content": 2, "integr": [3, 42], "check": [3, 20, 41], "orphan": 3, "without": 3, "link": [3, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 31, 33, 46], "miss": 3, "file": [3, 20, 31, 41, 49, 64], "iiif": [3, 7, 42], "annot": [3, 42, 55], "subunit": [3, 19, 21, 24, 28], "circular": 3, "depend": 3, "date": [3, 8, 39, 42, 48, 61, 68], "invalid": 3, "involv": 3, "preced": 3, "sub": 3, "duplic": 3, "similar": 3, "name": [3, 66, 72], "execut": 4, "sql": [4, 5], "prepar": [4, 8], "keep": 4, "mind": 4, "result": 4, "export": 5, "databas": [5, 53], "dump": 5, "csv": 5, "json": 5, "xml": 5, "gener": [6, 32, 35, 60], "authent": [6, 51], "import": [8, 15, 20, 57], "project": [8, 41], "class": [8, 44, 47], "possibl": 8, "field": [8, 14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 39, 41], "alia": [8, 67], "valu": [8, 29], "origin": 8, "wkt": [8, 57], "coordin": 8, "extern": 8, "place": [8, 24, 30, 36], "hierarchi": 8, "option": [8, 58], "after": 8, "admin": 9, "mail": 10, "map": [11, 36, 57], "modul": [12, 60], "present": 13, "site": [13, 30], "user": [14, 20, 41, 42, 43, 66], "form": [14, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 70], "group": 14, "vocab": 15, "edit": 15, "show": 15, "vocabulari": 15, "actor": [16, 33], "can": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "via": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 41], "tab": [16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29], "artifact": [17, 30, 31, 34], "event": [18, 31, 33, 34, 35], "acquisit": 18, "creation": [18, 31], "modif": 18, "move": [18, 33, 34, 35], "product": 18, "featur": [19, 30, 42], "super": [19, 21, 28], "public": [20, 41], "share": [20, 41], "set": 20, "logo": 20, "imag": [20, 42, 55], "preview": 20, "how": [20, 36, 39, 41], "make": [20, 29, 41], "avail": [20, 41], "criteria": [20, 41], "softwar": [20, 41], "manag": [20, 41, 42], "human": [21, 30], "remain": [21, 30], "administr": 24, "unit": [24, 28, 30], "histor": [24, 32], "ad": [24, 30, 33, 34, 41, 57], "multipl": [24, 31, 41], "citat": 25, "exampl": [25, 32], "includ": 26, "default": 26, "wikidata": 26, "geonam": [26, 36, 57], "gnd": 26, "usag": [26, 55], "id": 26, "precis": [26, 39], "configur": [26, 73], "sourc": [27, 34], "stratigraph": [28, 30], "anthropolog": [28, 42, 54], "analys": [28, 42, 54], "standard": 29, "custom": [29, 41], "requir": 29, "archaeolog": [30, 32], "new": [30, 31, 35, 36, 38, 40, 57], "an": [30, 31, 34, 40], "add": [31, 40], "creator": 31, "locat": [31, 33], "journei": 33, "letter": 34, "sender": 34, "recipi": 34, "instruct": 35, "us": 36, "profess": [37, 41], "time": [39, 48], "span": 39, "where": 39, "find": 39, "input": 39, "enter": [39, 41], "activ": [39, 66], "hour": 39, "minut": 39, "second": 39, "tree": 40, "exist": 40, "faq": 41, "case": [41, 58], "studi": 41, "instanc": 41, "doe": 41, "access": [41, 51], "work": 41, "why": 41, "t": 41, "free": 41, "text": 41, "longer": 41, "format": 41, "model": [42, 45], "interfac": [42, 43], "exchang": 42, "radiocarbon": [42, 48, 61], "openatla": [43, 47, 48], "manual": 43, "document": 43, "help": 43, "cidoc": 44, "crm": 44, "properti": 44, "checker": 46, "shortcut": 48, "oa7": 48, "ha": 48, "relationship": 48, "oa8": 48, "appear": 48, "first": 48, "oa9": 48, "last": 48, "e77": 48, "persist": [48, 63], "item": 48, "e21": 48, "person": 48, "e2": 48, "tempor": 48, "introduct": 51, "quick": 51, "start": 51, "guid": 51, "1": 51, "ui": 51, "2": 51, "url": 51, "get": 51, "version": [51, 63], "endpoint": 51, "paramet": 51, "error": [51, 63, 64], "handl": 51, "proxi": 51, "applic": 52, "structur": [52, 53], "sex": 54, "estim": 54, "tool": 56, "navig": [57, 58], "search": [57, 62], "geometri": 57, "overlai": 57, "network": 58, "visual": 58, "2d": 58, "3d": 58, "In": 58, "perform": 58, "issu": 58, "download": 58, "note": 59, "profil": 60, "chang": 60, "password": [60, 66], "displai": [60, 63], "browser": 63, "refresh": 63, "your": 63, "javascript": 63, "If": 63, "problem": 63, "code": 64, "403": 64, "forbidden": 64, "404": 64, "found": [64, 66], "418": 64, "i": [64, 66], "m": 64, "teapot": 64, "troubleshoot": 65, "login": 66, "wrong": 66, "No": 66, "thi": 66, "too": 66, "mani": 66, "attempt": 66, "descript": 69, "menu": 71, "tabl": 73}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"API": [[0, "api"], [51, "api"]], "ARCHE": [[1, "arche"]], "Overview": [[1, "overview"], [50, "overview"]], "Fetch": [[1, "fetch"]], "Data from ARCHE": [[1, "data-from-arche"]], "Automatically created entities": [[1, "automatically-created-entities"]], "Type": [[1, "entity-type"], [3, "type"], [29, "type"]], "Reference System": [[1, "entity-reference-system"], [26, "reference-system"]], "Entity": [[1, "entity-index"], [22, "entity"]], "Content": [[2, "content"]], "Data integrity checks": [[3, "data-integrity-checks"]], "Orphans": [[3, "orphans"], [3, "id1"]], "Entities without links": [[3, "entities-without-links"]], "Missing files": [[3, "missing-files"]], "Orphaned files": [[3, "orphaned-files"]], "Orphaned IIIF files": [[3, "orphaned-iiif-files"]], "Orphaned annotations": [[3, "orphaned-annotations"]], "Orphaned subunits": [[3, "orphaned-subunits"]], "Circular dependencies": [[3, "circular-dependencies"]], "Dates": [[3, "dates"], [8, "dates"], [48, "dates"]], "Invalid dates": [[3, "invalid-dates"]], "Invalid link dates": [[3, "invalid-link-dates"]], "Invalid involvement dates": [[3, "invalid-involvement-dates"]], "Invalid preceding dates": [[3, "invalid-preceding-dates"]], "Invalid sub dates": [[3, "invalid-sub-dates"]], "Check links": [[3, "check-links"]], "Check link duplicates": [[3, "check-link-duplicates"]], "Check similar names": [[3, "check-similar-names"]], "Execute SQL": [[4, "execute-sql"]], "Preparation": [[4, "preparation"], [8, "preparation"]], "Keep in mind": [[4, "keep-in-mind"]], "Result": [[4, "result"]], "Export": [[5, "export"]], "Export SQL": [[5, "export-sql"], [5, "id1"]], "Export database dump": [[5, "export-database-dump"]], "Export CSV": [[5, "export-csv"]], "Export JSON": [[5, "export-json"]], "Export XML": [[5, "export-xml"]], "General": [[6, "general"], [60, "general"], [32, "general"]], "Authentication": [[6, "authentication"]], "IIIF": [[7, "iiif"]], "Admin": [[9, "admin"]], "Mail": [[10, "mail"]], "Map": [[11, "map"], [57, "map"]], "Modules": [[12, "modules"], [60, "modules"]], "Presentation site": [[13, "presentation-site"]], "User": [[14, "user"]], "Form fields": [[14, "form-fields"], [16, "form-fields"], [17, "form-fields"], [19, "form-fields"], [21, "form-fields"], [24, "form-fields"], [25, "form-fields"], [27, "form-fields"], [28, "form-fields"], [18, "form-fields"], [20, "form-fields"], [29, "form-fields"]], "Groups": [[14, "groups"]], "Import": [[15, "import"], [8, "import"]], "Vocabs": [[15, "vocabs"]], "Edit": [[15, "edit"]], "Show vocabularies": [[15, "show-vocabularies"]], "Actor": [[16, "actor"]], "Can be linked via tabs to": [[16, "can-be-linked-via-tabs-to"], [17, "can-be-linked-via-tabs-to"], [19, "can-be-linked-via-tabs-to"], [21, "can-be-linked-via-tabs-to"], [24, "can-be-linked-via-tabs-to"], [25, "can-be-linked-via-tabs-to"], [27, "can-be-linked-via-tabs-to"], [28, "can-be-linked-via-tabs-to"], [18, "can-be-linked-via-tabs-to"], [20, "can-be-linked-via-tabs-to"], [29, "can-be-linked-via-tabs-to"]], "Artifact": [[17, "artifact"]], "Feature": [[19, "feature"]], "Super and subunits": [[19, "super-and-subunits"], [21, "super-and-subunits"], [28, "super-and-subunits"]], "Human remains": [[21, "human-remains"]], "Place": [[24, "place"]], "Administrative Unit": [[24, "administrative-unit"]], "Historical Place": [[24, "historical-place"]], "Places and their subunits": [[24, "places-and-their-subunits"]], "Adding multiple places": [[24, "adding-multiple-places"]], "Reference": [[25, "reference"]], "Citation example": [[25, "citation-example"]], "Included by default": [[26, "included-by-default"]], "Wikidata": [[26, "wikidata"]], "GeoNames": [[26, "geonames"], [57, "id1"]], "GND": [[26, "gnd"]], "Usage": [[26, "usage"], [55, "usage"]], "ID": [[26, "id"]], "Precision": [[26, "precision"]], "Configuration": [[26, "configuration"], [73, "configuration"]], "Source": [[27, "source"]], "Stratigraphic unit": [[28, "stratigraphic-unit"]], "Anthropological analyses": [[28, "anthropological-analyses"]], "How to make files available for the public": [[41, "how-to-make-files-available-for-the-public"], [20, "how-to-make-files-available-for-the-public"]], "Criteria checked by the software": [[41, "criteria-checked-by-the-software"], [20, "criteria-checked-by-the-software"]], "FAQ": [[41, "faq"]], "How to manage multiple projects or case studies": [[41, "how-to-manage-multiple-projects-or-case-studies"]], "Multiple instances": [[41, "multiple-instances"]], "Shared instance": [[41, "shared-instance"]], "How does data access work": [[41, "how-does-data-access-work"]], "How to enter professions": [[41, "how-to-enter-professions"]], "Criteria checked by users": [[41, "criteria-checked-by-users"]], "Why can\u2019t a free text field be added via custom types": [[41, "why-can-t-a-free-text-field-be-added-via-custom-types"]], "Why can\u2019t longer texts be formatted": [[41, "why-can-t-longer-texts-be-formatted"]], "Features": [[42, "features"]], "Model": [[42, "model"], [45, "model"]], "User Interface": [[42, "user-interface"]], "IIIF Integration": [[42, "iiif-integration"]], "Image Annotation": [[42, "image-annotation"]], "Data Exchange": [[42, "data-exchange"]], "User Management": [[42, "user-management"]], "Anthropological Analyses": [[42, "anthropological-analyses"], [54, "anthropological-analyses"]], "Radiocarbon Dating": [[42, "radiocarbon-dating"], [61, "radiocarbon-dating"]], "OpenAtlas manual": [[43, "openatlas-manual"]], "User interface": [[43, null]], "Documentation": [[43, null]], "Help": [[43, null]], "Sex Estimation": [[54, "sex-estimation"]], "Image annotation": [[55, "image-annotation"]], "Tools": [[56, "tools"]], "Navigation": [[57, "navigation"], [58, "navigation"]], "Search": [[57, "search"], [62, "search"]], "WKT import": [[57, "wkt-import"]], "Adding new geometries": [[57, "adding-new-geometries"]], "Map Overlay": [[57, "map-overlay"]], "Network visualization": [[58, "network-visualization"]], "2D": [[58, "d"]], "3D": [[58, "id1"]], "Options": [[58, "options"]], "In case of performance issues": [[58, "in-case-of-performance-issues"]], "Download": [[58, "download"]], "Notes": [[59, "notes"]], "Profile": [[60, "profile"]], "Change password": [[60, "change-password"]], "Display": [[60, "display"]], "Display Errors": [[63, "display-errors"]], "Browser Version": [[63, "browser-version"]], "Refresh your Browser": [[63, "refresh-your-browser"]], "JavaScript": [[63, "javascript"]], "If the problem persists": [[63, "if-the-problem-persists"]], "Error Codes": [[64, "error-codes"]], "403 - Forbidden": [[64, "forbidden"]], "404 - File not found": [[64, "file-not-found"]], "418 - I\u2019m a teapot": [[64, "im-a-teapot"]], "Troubleshooting": [[65, "troubleshooting"]], "Login": [[66, "login"]], "Wrong Password": [[66, "wrong-password"]], "No user with this name found.": [[66, "no-user-with-this-name-found"]], "This user is not activated.": [[66, "this-user-is-not-activated"]], "Too many login attempts.": [[66, "too-many-login-attempts"]], "Alias": [[67, "alias"], [8, "alias"]], "Date": [[68, "date"]], "Description": [[69, "description"]], "Form": [[70, "form"]], "Menu": [[71, "menu"]], "Name": [[72, "name"]], "Table": [[73, "table"]], "Project": [[8, "project"]], "Import class": [[8, "import-class"]], "Possible import fields": [[8, "possible-import-fields"]], "Types": [[8, "types"], [40, "types"]], "Value types": [[8, "value-types"], [29, "value-types"]], "References": [[8, "references"], [49, "references"], [49, "id1"]], "Origin references": [[8, "origin-references"]], "WKT coordinates": [[8, "wkt-coordinates"]], "External reference systems": [[8, "external-reference-systems"]], "Place hierarchy": [[8, "place-hierarchy"]], "Import options": [[8, "import-options"]], "After the import": [[8, "after-the-import"]], "Event": [[18, "event"]], "Acquisition": [[18, "acquisition"]], "Creation": [[18, "creation"]], "Modification": [[18, "modification"]], "Move": [[18, "move"]], "Production": [[18, "production"]], "File": [[20, "file"]], "Form fields important for public sharing": [[20, "form-fields-important-for-public-sharing"]], "Settings": [[20, "settings"]], "Logo": [[20, "logo"]], "Image preview": [[20, "image-preview"]], "Criteria checked by managers and users": [[20, "criteria-checked-by-managers-and-users"]], "Standard types": [[29, "standard-types"]], "Custom types": [[29, "custom-types"]], "Making types required": [[29, "making-types-required"]], "Archaeological data": [[30, "archaeological-data"]], "Adding a new place": [[30, "adding-a-new-place"]], "Adding a feature to the site": [[30, "adding-a-feature-to-the-site"]], "Adding a stratigraphic unit to the feature": [[30, "adding-a-stratigraphic-unit-to-the-feature"]], "Adding an artifact to the stratigraphic unit": [[30, "adding-an-artifact-to-the-stratigraphic-unit"]], "Adding human remains to the stratigraphic unit": [[30, "adding-human-remains-to-the-stratigraphic-unit"]], "Examples": [[32, "examples"]], "Archaeological": [[32, "archaeological"]], "Historical": [[32, "historical"]], "Letters": [[34, "letters"]], "Adding an artifact": [[34, "adding-an-artifact"]], "Adding a source": [[34, "adding-a-source"]], "Adding the move event": [[34, "adding-the-move-event"]], "Adding sender and recipient": [[34, "adding-sender-and-recipient"]], "Move events": [[35, "move-events"]], "Create a new move event - general instruction": [[35, "create-a-new-move-event-general-instruction"]], "Places": [[36, "places"]], "Create a new place": [[36, "create-a-new-place"]], "How to use the map": [[36, "how-to-use-the-map"]], "Reference Systems - GeoNames": [[36, "reference-systems-geonames"]], "Profession": [[37, "profession"]], "References Systems": [[38, "references-systems"]], "Create a new reference system": [[38, "create-a-new-reference-system"]], "Time Spans": [[39, "time-spans"]], "Where to find the input fields": [[39, "where-to-find-the-input-fields"]], "How to enter dates and time spans": [[39, "how-to-enter-dates-and-time-spans"]], "Precise dates": [[39, "precise-dates"]], "Time spans": [[39, "id1"]], "Activate hours, minutes, and seconds": [[39, "activate-hours-minutes-and-seconds"]], "Create a new type tree": [[40, "create-a-new-type-tree"]], "Add a type to an existing type tree": [[40, "add-a-type-to-an-existing-type-tree"]], "CIDOC CRM": [[44, "cidoc-crm"]], "CIDOC classes": [[44, "cidoc-classes"]], "CIDOC Properties": [[44, "cidoc-properties"]], "Link checker": [[46, "link-checker"]], "OpenAtlas classes": [[47, "openatlas-classes"]], "OpenAtlas shortcuts": [[48, "openatlas-shortcuts"]], "OA7 - has relationship to": [[48, "oa7-has-relationship-to"]], "OA8 - appears for the first time in": [[48, "oa8-appears-for-the-first-time-in"]], "OA9 - appears for the last time in": [[48, "oa9-appears-for-the-last-time-in"]], "E77 - Persistent Item": [[48, "e77-persistent-item"]], "E21 Person": [[48, "e21-person"]], "E2 Temporal Entity": [[48, "e2-temporal-entity"]], "Radiocarbon dating type": [[48, "radiocarbon-dating-type"]], "Reference Systems": [[49, "reference-systems"]], "References and Files": [[49, "references-and-files"]], "Introduction": [[51, "introduction"]], "Quick Start Guide": [[51, "quick-start-guide"]], "1. UI access": [[51, "ui-access"]], "2. URL / GET access": [[51, "url-get-access"]], "Versioning": [[51, "versioning"]], "Endpoints": [[51, "endpoints"]], "Parameters": [[51, "parameters"]], "Error handling": [[51, "error-handling"]], "Proxy": [[51, "proxy"]], "Authentication guide": [[51, "authentication-guide"]], "Application Structure": [[52, "application-structure"]], "Database Structure": [[53, "database-structure"]], "Artifacts": [[31, "artifacts"]], "Add a new artifact": [[31, "add-a-new-artifact"]], "Add a reference to the artifact": [[31, "add-a-reference-to-the-artifact"]], "Add a file to the artifact": [[31, "add-a-file-to-the-artifact"]], "Link a creation event": [[31, "link-a-creation-event"]], "Add a creator to the creation event": [[31, "add-a-creator-to-the-creation-event"]], "Add multiple locations to an artifact": [[31, "add-multiple-locations-to-an-artifact"]], "Journey": [[33, "journey"]], "Adding actors": [[33, "adding-actors"]], "Adding locations": [[33, "adding-locations"]], "Creating the move event": [[33, "creating-the-move-event"]], "Link actors to the journey": [[33, "link-actors-to-the-journey"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/sphinx/source/examples/artifacts.rst b/sphinx/source/examples/artifacts.rst index 961775c5a..8a251bae9 100644 --- a/sphinx/source/examples/artifacts.rst +++ b/sphinx/source/examples/artifacts.rst @@ -109,7 +109,7 @@ First of all, adding an artifact to more than one :doc:`/entity/place` or locations, it is possible to keep track of that in the following way: * Choose the :doc:`/entity/place` the artifact has it's first occurrence at, -for example its production site or a place an artifact was found at during + for example its production site or a place an artifact was found at during archaeological excavation. * link any other place by adding a move event - for example when an artifact is moved from an excavation site to a museum or from a production site to diff --git a/sphinx/source/examples/journey.rst b/sphinx/source/examples/journey.rst index cf75487ce..bd149b20a 100644 --- a/sphinx/source/examples/journey.rst +++ b/sphinx/source/examples/journey.rst @@ -1,4 +1,4 @@ - Journey +Journey ======= .. toctree:: From 10555cb4993b8812e49b0ffc9e0f7f22a9c27d4e Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Wed, 27 Nov 2024 15:58:37 +0100 Subject: [PATCH 32/42] Refactor: removed unneeded rv ANY annotations --- tests/test_actor.py | 4 +--- tests/test_artifact.py | 5 +---- tests/test_event.py | 4 +--- tests/test_export_import.py | 3 +-- tests/test_hierarchy.py | 4 +--- tests/test_mail.py | 4 +--- tests/test_place.py | 2 +- tests/test_reference.py | 4 +--- tests/test_source.py | 4 +--- tests/test_type.py | 4 +--- tests/test_user.py | 4 +--- 11 files changed, 11 insertions(+), 31 deletions(-) diff --git a/tests/test_actor.py b/tests/test_actor.py index d5972247b..3756e4ecb 100644 --- a/tests/test_actor.py +++ b/tests/test_actor.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import url_for from openatlas import app @@ -16,7 +14,7 @@ def test_actor(self) -> None: event = insert('acquisition', 'Event Horizon') group = insert('group', 'LV-426 colony') - rv: Any = c.get(url_for('insert', class_='person', origin_id=place.id)) + rv = c.get(url_for('insert', class_='person', origin_id=place.id)) assert b'Vienna' in rv.data sex = get_hierarchy('Sex') diff --git a/tests/test_artifact.py b/tests/test_artifact.py index c0806769e..02e9d3dcb 100644 --- a/tests/test_artifact.py +++ b/tests/test_artifact.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import url_for from openatlas import app @@ -17,8 +15,7 @@ def test_artifact(self) -> None: place = insert('place', 'Home') sub_artifact = insert('artifact', 'Sub artifact') - rv: Any = c.get( - url_for('insert', class_='artifact', origin_id=place.id)) + rv = c.get(url_for('insert', class_='artifact', origin_id=place.id)) assert b'+ Artifact' in rv.data rv = c.post( diff --git a/tests/test_event.py b/tests/test_event.py index 503ee2f77..86213839b 100644 --- a/tests/test_event.py +++ b/tests/test_event.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import g, url_for from openatlas import app @@ -19,7 +17,7 @@ def test_event(self) -> None: reference = insert('external_reference', 'https://d-nb.info') data = {'name': 'Event Horizon', 'location': residence.id} - rv: Any = c.post(url_for('insert', class_='activity'), data=data) + rv = c.post(url_for('insert', class_='activity'), data=data) activity_id = rv.location.split('/')[-1] rv = c.post( diff --git a/tests/test_export_import.py b/tests/test_export_import.py index 45b96ab39..2626f73a6 100644 --- a/tests/test_export_import.py +++ b/tests/test_export_import.py @@ -1,5 +1,4 @@ import os -from typing import Any import pandas as pd from flask import url_for @@ -17,7 +16,7 @@ def test_export(self) -> None: assert b'Export SQL' in c.get(url_for('export_sql')).data date_ = current_date_for_filename() - rv: Any = c.get( + rv = c.get( url_for('export_execute', format_='sql'), follow_redirects=True) assert b'Data was exported' in rv.data diff --git a/tests/test_hierarchy.py b/tests/test_hierarchy.py index f8e9ca568..4a9fd99ab 100644 --- a/tests/test_hierarchy.py +++ b/tests/test_hierarchy.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import g, url_for from tests.base import TestBaseCase, get_hierarchy @@ -14,7 +12,7 @@ def test_hierarchy(self) -> None: 'classes': ['file', 'group', 'move', 'person', 'place', 'source'], 'multiple': True, 'description': 'Very important!'} - rv: Any = c.post( + rv = c.post( url_for('hierarchy_insert', category='custom'), data=data, follow_redirects=True) diff --git a/tests/test_mail.py b/tests/test_mail.py index 3a4e71ad1..729171899 100644 --- a/tests/test_mail.py +++ b/tests/test_mail.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import url_for from tests.base import TestBaseCase @@ -9,7 +7,7 @@ class MailTests(TestBaseCase): def test_mail(self) -> None: c = self.client - rv: Any = c.post( + rv = c.post( url_for('newsletter'), data={'subject': 'test', 'body': 'test', 'recipient': []}, follow_redirects=True) diff --git a/tests/test_place.py b/tests/test_place.py index d9789b390..0406ea9ab 100644 --- a/tests/test_place.py +++ b/tests/test_place.py @@ -25,7 +25,7 @@ def test_place(self) -> None: unit_type.id: str([unit_type.subs[0], unit_type.subs[1]]), f'reference_system_id_{g.geonames.id}': ['123456', self.precision_type.subs[0]]} - rv: Any = c.post( + rv = c.post( url_for('insert', class_='place', origin_id=reference.id), data=data, follow_redirects=True) diff --git a/tests/test_reference.py b/tests/test_reference.py index 27381c2ea..8dd78ed60 100644 --- a/tests/test_reference.py +++ b/tests/test_reference.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import url_for from openatlas import app @@ -14,7 +12,7 @@ def test_reference(self) -> None: app.preprocess_request() batman = insert('person', 'Batman') - rv: Any = c.post( + rv = c.post( url_for('insert', class_='external_reference'), data={'name': 'https://openatlas.eu', 'description': 'No'}) reference_id = rv.location.split('/')[-1] diff --git a/tests/test_source.py b/tests/test_source.py index 4a4523088..63d8c5d9e 100644 --- a/tests/test_source.py +++ b/tests/test_source.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import url_for from openatlas import app @@ -16,7 +14,7 @@ def test_source(self) -> None: artifact = insert('artifact', 'Artifact with inscription') reference = insert('external_reference', 'https://d-nb.info') - rv: Any = c.post( + rv = c.post( url_for('insert', class_='source'), data={'name': 'Necronomicon'}) source_id = rv.location.split('/')[-1] diff --git a/tests/test_type.py b/tests/test_type.py index 1201a16c1..ae3c71949 100644 --- a/tests/test_type.py +++ b/tests/test_type.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import g, url_for from openatlas import app @@ -20,7 +18,7 @@ def test_type(self) -> None: location = place.get_linked_entity_safe('P53') location.link('P89', g.types[historical_type.subs[0]]) - rv: Any = c.get(url_for('view', id_=historical_type.subs[0])) + rv = c.get(url_for('view', id_=historical_type.subs[0])) assert b'Historical place' in rv.data rv = c.get(url_for('insert', class_='type', origin_id=actor_type.id)) diff --git a/tests/test_user.py b/tests/test_user.py index 96f481b65..903e81b76 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,5 +1,3 @@ -from typing import Any - from flask import g, url_for from flask_login import current_user @@ -21,7 +19,7 @@ def test_user(self) -> None: 'name': 'Ripley Weaver', 'real_name': '', 'description': ''} - rv: Any = c.post(url_for('user_insert'), data=data) + rv = c.post(url_for('user_insert'), data=data) user_id = rv.location.split('/')[-1] data['password'] = 'too short' From 44bbcf300043edcebcf38314f992d96f58404889 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 27 Nov 2024 22:17:47 +0100 Subject: [PATCH 33/42] refactor test --- openatlas/api/endpoints/parser.py | 2 +- tests/test_api.py | 1587 ++++++++++++++--------------- 2 files changed, 774 insertions(+), 815 deletions(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index efe3aff6d..8d55d1b9c 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -131,7 +131,7 @@ def search_filter(self, entity: Entity) -> bool: return found def get_properties_for_links(self) -> list[str]: - codes = [] + codes: list[str] = [] if self.relation_type: codes = self.relation_type if 'geometry' in self.show: diff --git a/tests/test_api.py b/tests/test_api.py index 12e9f161a..c6a27ad7b 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -12,871 +12,830 @@ class Api(ApiTestCase): def test_api(self) -> None: - with app.app_context(): - logo = Path(app.root_path) \ - / 'static' / 'images' / 'layout' / 'logo.png' - - with open(logo, 'rb') as img: - self.app.post( - url_for('insert', class_='file'), - data={ - 'name': 'OpenAtlas logo', - 'file': img, - 'creator': 'Max', - 'license_holder': 'Moritz', - 'public': True}, - follow_redirects=True) - - with app.test_request_context(): - app.preprocess_request() - for entity in ApiEntity.get_by_cidoc_classes(['all']): - match entity.name: - case 'Location of Shire': - location = entity - case 'Shire': - place = entity - case 'Boundary Mark': - boundary_mark = entity - case 'Travel to Mordor': - event = entity - case 'Economical': - relation_sub = entity - case 'Austria': - unit_node = entity - case 'Frodo': - actor = entity - case 'Sam': - actor2 = entity - case 'Home of Baggins': - feature = entity - case 'Location of Home of Baggins': - feature_location = entity - case 'Sûza': - alias = entity - case 'Height': - height = entity - case 'Weight': - weight_ = entity - case 'Change of Property': - change_of_property = entity - case 'File not public': - file_not_public = entity - case 'File without license': - file_without_licences = entity - case 'File without file': - file_without_file = entity - case 'OpenAtlas logo': - file = entity - case 'Public domain': - open_license = entity - - # Test Swagger UI - if app.config['OPENAPI_INSTANCE_FILE'].exists(): - app.config['OPENAPI_INSTANCE_FILE'].unlink() - rv: Any = self.app.get(url_for('flasgger.apidocs')) - assert b'Flasgger' in rv.data - with app.config['OPENAPI_INSTANCE_FILE'].open(mode='r+') as f: - data = json.load(f) - data['servers'][0]['description'] = 'Wrong description' - f.seek(0) - json.dump(data, f) - f.truncate() - rv = self.app.get(url_for('flasgger.apidocs')) - assert b'Flasgger' in rv.data - with app.config['OPENAPI_INSTANCE_FILE'].open(mode='r+') as f: - data = json.load(f) - data['info']['version'] = '9.9.9' - f.seek(0) - json.dump(data, f) - f.truncate() - rv = self.app.get(url_for('flasgger.apidocs')) - assert b'Flasgger' in rv.data - - # ---Content Endpoints--- - rv = self.app.get(url_for('api_04.classes')).get_json() - assert self.get_classes(rv) - rv = self.app.get( - url_for('api_04.class_mapping', locale='de')).get_json() - assert self.get_class_mapping(rv, 'de') - rv = self.app.get( - url_for('api_04.class_mapping', locale='ca', download=True)) - assert self.get_class_mapping(rv.get_json(), 'ca') - - rv = self.app.get( - url_for('api_04.properties', locale='de')).get_json() - assert rv['P2']['nameInverse'] == 'ist Typus von' - assert bool(rv['P2']['name']) - assert bool(rv['P2']['nameInverse']) - assert bool(rv['P2']['i18n']) - assert bool(rv['P2']['i18nInverse']) - assert bool(rv['P2']['code']) - - rv = self.app.get( - url_for('api_04.properties', locale='fr', download=True)) - assert rv.get_json()['P2']['name'] == 'est de type' - rv = self.app.get(url_for('api_04.backend_details')).get_json() - assert bool(rv['version'] == app.config['VERSION']) - rv = self.app.get( - url_for('api_04.backend_details', download=True)).get_json() - assert bool(rv['version'] == app.config['VERSION']) - rv = self.app.get(url_for('api_04.system_class_count')).get_json() - assert bool(rv['person']) - rv = self.app.get( - url_for('api_04.system_class_count', type_id=boundary_mark.id)) - assert bool(rv.get_json()['place']) - - with app.test_request_context(): - app.preprocess_request() - file.link('P2', open_license) - rv = self.app.get( - url_for('api.licensed_file_overview', file_id=file.id)) - assert self.get_bool( - rv.get_json()[str(file.id)], - 'license', - 'Public domain') - - rv = self.app.get(url_for('api.licensed_file_overview')) - assert bool(len(rv.get_json().keys()) == 5) - - rv = self.app.get(url_for( - 'api_04.network_visualisation', - exclude_system_classes='type')) - rv = rv.get_json() - assert bool(len(rv['results']) == 65) - rv = self.app.get( - url_for( + c = self.client + logo_path = Path(app.root_path) / 'static' / 'images' / 'layout' + + with open(logo_path / 'logo.png', 'rb') as img: + c.post( + url_for('insert', class_='file'), + data={ + 'name': 'OpenAtlas logo', + 'file': img, + 'creator': 'Max', + 'license_holder': 'Moritz', + 'public': True}, + follow_redirects=True) + + with app.test_request_context(): + app.preprocess_request() + for entity in ApiEntity.get_by_cidoc_classes(['all']): + match entity.name: + case 'Location of Shire': + location = entity + case 'Shire': + place = entity + case 'Boundary Mark': + boundary_mark = entity + case 'Travel to Mordor': + event = entity + case 'Economical': + relation_sub = entity + case 'Austria': + unit_node = entity + case 'Frodo': + actor = entity + case 'Sam': + actor2 = entity + case 'Home of Baggins': + feature = entity + case 'Location of Home of Baggins': + feature_location = entity + case 'Sûza': + alias = entity + case 'Height': + height = entity + case 'Weight': + weight_ = entity + case 'Change of Property': + change_of_property = entity + case 'File not public': + file_not_public = entity + case 'File without license': + file_without_licences = entity + case 'File without file': + file_without_file = entity + case 'OpenAtlas logo': + file = entity + case 'Public domain': + open_license = entity + + file.link('P2', open_license) + + # Test Swagger UI + if app.config['OPENAPI_INSTANCE_FILE'].exists(): + app.config['OPENAPI_INSTANCE_FILE'].unlink() + rv: Any = c.get(url_for('flasgger.apidocs')) + assert b'Flasgger' in rv.data + with app.config['OPENAPI_INSTANCE_FILE'].open(mode='r+') as f: + data = json.load(f) + data['servers'][0]['description'] = 'Wrong description' + f.seek(0) + json.dump(data, f) + f.truncate() + rv = c.get(url_for('flasgger.apidocs')) + assert b'Flasgger' in rv.data + with app.config['OPENAPI_INSTANCE_FILE'].open(mode='r+') as f: + data = json.load(f) + data['info']['version'] = '9.9.9' + f.seek(0) + json.dump(data, f) + f.truncate() + rv = c.get(url_for('flasgger.apidocs')) + assert b'Flasgger' in rv.data + + # ---Content Endpoints--- + rv = c.get(url_for('api_04.classes')).get_json() + assert self.get_classes(rv) + rv = c.get(url_for('api_04.class_mapping', locale='de')).get_json() + assert self.get_class_mapping(rv, 'de') + rv = c.get(url_for('api_04.class_mapping', locale='ca', download=True)) + assert self.get_class_mapping(rv.get_json(), 'ca') + + rv = c.get(url_for('api_04.properties', locale='de')).get_json() + assert rv['P2']['nameInverse'] == 'ist Typus von' + assert bool(rv['P2']['name']) + assert bool(rv['P2']['nameInverse']) + assert bool(rv['P2']['i18n']) + assert bool(rv['P2']['i18nInverse']) + assert bool(rv['P2']['code']) + + rv = c.get(url_for('api_04.properties', locale='fr', download=True)) + assert rv.get_json()['P2']['name'] == 'est de type' + rv = c.get(url_for('api_04.backend_details')).get_json() + assert bool(rv['version'] == app.config['VERSION']) + rv = c.get(url_for('api_04.backend_details', download=True)).get_json() + assert bool(rv['version'] == app.config['VERSION']) + rv = c.get(url_for('api_04.system_class_count')).get_json() + assert bool(rv['person']) + rv = c.get( + url_for('api_04.system_class_count', type_id=boundary_mark.id)) + assert bool(rv.get_json()['place']) + + rv = c.get(url_for('api.licensed_file_overview', file_id=file.id)) + assert self.get_bool( + rv.get_json()[str(file.id)], + 'license', + 'Public domain') + + rv = c.get(url_for('api.licensed_file_overview')) + assert bool(len(rv.get_json().keys()) == 5) + + rv = c.get(url_for( + 'api_04.network_visualisation', + exclude_system_classes='type')) + rv = rv.get_json() + assert bool(len(rv['results']) == 65) + rv = c.get( + url_for( 'api_04.network_visualisation', linked_to_ids=boundary_mark.id)) + rv = rv.get_json() + assert bool(len(rv['results']) == 3) + rv = c.get(url_for('api_04.network_visualisation', download=True)) + rv = rv.get_json() + assert bool(len(rv['results']) == 154) + + for rv in [ + c.get(url_for('api_04.geometric_entities')), + c.get(url_for('api_04.geometric_entities', download=True))]: rv = rv.get_json() - assert bool(len(rv['results']) == 3) - rv = self.app.get( - url_for('api_04.network_visualisation', download=True)) - rv = rv.get_json() - assert bool(len(rv['results']) == 154) - - for rv in [ - self.app.get(url_for('api_04.geometric_entities')), - self.app.get( - url_for('api_04.geometric_entities', download=True))]: - rv = rv.get_json() - assert bool(rv['features'][0]['geometry']['coordinates']) - assert self.get_geom_properties(rv, 'id') - assert self.get_geom_properties(rv, 'objectDescription') - assert self.get_geom_properties(rv, 'objectId') - assert self.get_geom_properties(rv, 'objectName') - assert self.get_geom_properties(rv, 'shapeType') - - rv = self.app.get( - url_for('api_04.export_database', format_='xml')) - assert b'Shire' in rv.data - assert 'application/xml' in rv.headers.get('Content-Type') - rv = self.app.get( - url_for('api_04.export_database', format_='json')) - assert b'Shire' in rv.data - assert 'application/json' in rv.headers.get('Content-Type') - rv = self.app.get(url_for('api_04.export_database', format_='csv')) - assert b'Shire' in rv.data - assert 'application/zip' in rv.headers.get('Content-Type') - - # ---Entity Endpoints--- - # Test Entity - rv = self.app.get( - url_for('api_04.entity', id_=place.id, download=True)) - assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json()['features'][0] - assert self.get_bool(rv, '@id') - assert self.get_bool(rv, 'type', 'Feature') - assert self.get_bool(rv, 'crmClass', 'crm:E18 Physical Thing') - assert self.get_bool(rv, 'systemClass', 'place') - assert self.get_bool(rv['properties'], 'title') - desc = rv['descriptions'][0] - assert self.get_bool( - desc, 'value', 'The Shire was the homeland of the hobbits.') - timespan = rv['when']['timespans'][0] - assert self.get_bool( - timespan['start'], 'earliest', '2018-01-31T00:00:00') - assert self.get_bool( - timespan['start'], 'latest', '2018-03-01T00:00:00') - assert self.get_bool( - timespan['end'], 'earliest', '2019-01-31T00:00:00') - assert self.get_bool( - timespan['end'], 'latest', '2019-03-01T00:00:00') - assert self.get_bool(rv['types'][0], 'identifier') - assert self.get_bool(rv['types'][0], 'label', 'Boundary Mark') - rel = rv['relations'] - assert self.get_bool(rel[1], 'label', 'Height') - assert self.get_bool(rel[1], 'relationDescription', '23.0') - assert self.get_bool(rel[0], 'relationTo') - assert self.get_bool(rel[0], 'relationType', 'crm:P2 has type') - assert self.get_bool(rel[0], 'relationSystemClass', 'type') - assert self.get_bool(rv['names'][0], 'alias', 'Sûza') - links = rv['links'][0] - assert self.get_bool(links, 'type', 'closeMatch') - assert self.get_bool( - links, - 'identifier', - 'https://www.geonames.org/2761369') - assert self.get_bool(links, 'referenceSystem', 'GeoNames') - assert self.get_bool(rv['geometry'], 'type', 'GeometryCollection') - assert self.get_bool( - rv['geometry']['geometries'][1], - 'coordinates', - [16.37069611, 48.208571233]) - assert self.get_bool(rv['depictions'][0], '@id') - assert self.get_bool( - rv['depictions'][0], 'title', 'Picture with a License') - assert self.get_bool( - rv['depictions'][0], 'license', 'Public domain') - assert self.get_bool(rv['depictions'][0], 'url') - - rv = self.app.get( - url_for( + assert bool(rv['features'][0]['geometry']['coordinates']) + assert self.get_geom_properties(rv, 'id') + assert self.get_geom_properties(rv, 'objectDescription') + assert self.get_geom_properties(rv, 'objectId') + assert self.get_geom_properties(rv, 'objectName') + assert self.get_geom_properties(rv, 'shapeType') + + rv = c.get(url_for('api_04.export_database', format_='xml')) + assert b'Shire' in rv.data + assert 'application/xml' in rv.headers.get('Content-Type') + rv = c.get(url_for('api_04.export_database', format_='json')) + assert b'Shire' in rv.data + assert 'application/json' in rv.headers.get('Content-Type') + rv = c.get(url_for('api_04.export_database', format_='csv')) + assert b'Shire' in rv.data + assert 'application/zip' in rv.headers.get('Content-Type') + + # ---Entity Endpoints--- + # Test Entity + rv = c.get(url_for('api_04.entity', id_=place.id, download=True)) + assert 'application/json' in rv.headers.get('Content-Type') + rv = rv.get_json()['features'][0] + assert self.get_bool(rv, '@id') + assert self.get_bool(rv, 'type', 'Feature') + assert self.get_bool(rv, 'crmClass', 'crm:E18 Physical Thing') + assert self.get_bool(rv, 'systemClass', 'place') + assert self.get_bool(rv['properties'], 'title') + desc = rv['descriptions'][0] + assert self.get_bool( + desc, 'value', 'The Shire was the homeland of the hobbits.') + timespan = rv['when']['timespans'][0] + assert self.get_bool( + timespan['start'], 'earliest', '2018-01-31T00:00:00') + assert self.get_bool( + timespan['start'], 'latest', '2018-03-01T00:00:00') + assert self.get_bool( + timespan['end'], 'earliest', '2019-01-31T00:00:00') + assert self.get_bool( + timespan['end'], 'latest', '2019-03-01T00:00:00') + assert self.get_bool(rv['types'][0], 'identifier') + assert self.get_bool(rv['types'][0], 'label', 'Boundary Mark') + rel = rv['relations'] + assert self.get_bool(rel[1], 'label', 'Height') + assert self.get_bool(rel[1], 'relationDescription', '23.0') + assert self.get_bool(rel[0], 'relationTo') + assert self.get_bool(rel[0], 'relationType', 'crm:P2 has type') + assert self.get_bool(rel[0], 'relationSystemClass', 'type') + assert self.get_bool(rv['names'][0], 'alias', 'Sûza') + links = rv['links'][0] + assert self.get_bool(links, 'type', 'closeMatch') + assert self.get_bool( + links, + 'identifier', + 'https://www.geonames.org/2761369') + assert self.get_bool(links, 'referenceSystem', 'GeoNames') + assert self.get_bool(rv['geometry'], 'type', 'GeometryCollection') + assert self.get_bool( + rv['geometry']['geometries'][1], + 'coordinates', + [16.37069611, 48.208571233]) + assert self.get_bool(rv['depictions'][0], '@id') + assert self.get_bool( + rv['depictions'][0], 'title', 'Picture with a License') + assert self.get_bool(rv['depictions'][0], 'license', 'Public domain') + assert self.get_bool(rv['depictions'][0], 'url') + + rv = c.get( + url_for( 'api_04.entity', - id_=place.id, - format='lpx', - locale='de')) - assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json()['features'][0] - rel = rv['relations'] - assert self.get_bool(rel[1], 'label', 'Height') - assert self.get_bool(rel[1], 'relationDescription', '23.0') - assert self.get_bool(rel[0], 'relationTo') - assert self.get_bool(rel[0], 'relationType', 'crm:P2_has_type') - assert self.get_bool(rel[0], 'relationTypeLabel', 'hat den Typus') - - geojson_checklist = [ - '@id', 'systemClass', 'name', 'description', 'begin_earliest', - 'begin_latest', 'begin_comment', 'end_earliest', 'end_latest', - 'end_comment', 'types'] - # Test entity in GeoJSON format - rv = self.app.get( - url_for('api_04.entity', id_=place.id, format='geojson')) - assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json()['features'][0] - assert self.get_bool(rv['geometry'], 'type') - assert self.get_bool(rv['geometry'], 'coordinates') - for key in geojson_checklist: - assert self.get_bool(rv['properties'], key) - rv = self.app.get(url_for( - 'api_04.entity', id_=place.id, format='geojson-v2')) - assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json()['features'][0] - assert self.get_bool(rv['geometry'], 'type') - assert self.get_bool( - rv['geometry']['geometries'][0], 'coordinates') - for key in geojson_checklist: - assert self.get_bool(rv['properties'], key) - - # Test entity in Linked Open Usable Data - rv = self.app.get( - url_for('api_04.entity', id_=place.id, format='loud')) - assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json() - assert bool(rv['type'] == 'PhysicalThing') - assert bool(rv['_label'] == 'Shire') - assert bool(rv['content'] - == 'The Shire was the homeland of the hobbits.') - assert bool(rv['timespan']['begin_of_the_begin'] - == '2018-01-31T00:00:00') - assert bool(rv['identified_by'][0]['_label'] == 'Sûza') - assert bool(rv['classified_as'][0]['_label'] == 'Boundary Mark') - assert bool(rv['former_or_current_location'][0]['_label'] - == 'Location of Shire') - assert bool(rv['former_or_current_location'][0]['defined_by'] - == 'POLYGON((28.9389559878606 41.0290525580955,' - '28.9409293485759 41.0273124142771,28.941969652866 ' - '41.0284940983463,28.9399641177912 41.0297647897435' - ',28.9389559878606 41.0290525580955))') - - # Test Entity export and RDFS - for rv in [ - self.app.get( - url_for('api_04.entity', id_=place.id, export='csv')), - self.app.get( - url_for( + id_=place.id, + format='lpx', + locale='de')) + assert 'application/json' in rv.headers.get('Content-Type') + rv = rv.get_json()['features'][0] + rel = rv['relations'] + assert self.get_bool(rel[1], 'label', 'Height') + assert self.get_bool(rel[1], 'relationDescription', '23.0') + assert self.get_bool(rel[0], 'relationTo') + assert self.get_bool(rel[0], 'relationType', 'crm:P2_has_type') + assert self.get_bool(rel[0], 'relationTypeLabel', 'hat den Typus') + + geojson_checklist = [ + '@id', 'systemClass', 'name', 'description', 'begin_earliest', + 'begin_latest', 'begin_comment', 'end_earliest', 'end_latest', + 'end_comment', 'types'] + # Test entity in GeoJSON format + rv = c.get(url_for('api_04.entity', id_=place.id, format='geojson')) + assert 'application/json' in rv.headers.get('Content-Type') + rv = rv.get_json()['features'][0] + assert self.get_bool(rv['geometry'], 'type') + assert self.get_bool(rv['geometry'], 'coordinates') + for key in geojson_checklist: + assert self.get_bool(rv['properties'], key) + rv = c.get(url_for('api_04.entity', id_=place.id, format='geojson-v2')) + assert 'application/json' in rv.headers.get('Content-Type') + rv = rv.get_json()['features'][0] + assert self.get_bool(rv['geometry'], 'type') + assert self.get_bool(rv['geometry']['geometries'][0], 'coordinates') + for key in geojson_checklist: + assert self.get_bool(rv['properties'], key) + + # Test entity in Linked Open Usable Data + rv = c.get(url_for('api_04.entity', id_=place.id, format='loud')) + assert 'application/json' in rv.headers.get('Content-Type') + rv = rv.get_json() + assert bool(rv['type'] == 'PhysicalThing') + assert bool(rv['_label'] == 'Shire') + assert bool(rv['content'] + == 'The Shire was the homeland of the hobbits.') + assert bool(rv['timespan']['begin_of_the_begin'] + == '2018-01-31T00:00:00') + assert bool(rv['identified_by'][0]['_label'] == 'Sûza') + assert bool(rv['classified_as'][0]['_label'] == 'Boundary Mark') + assert bool(rv['former_or_current_location'][0]['_label'] + == 'Location of Shire') + assert bool(rv['former_or_current_location'][0]['defined_by'] + == 'POLYGON((28.9389559878606 41.0290525580955,' + '28.9409293485759 41.0273124142771,28.941969652866 ' + '41.0284940983463,28.9399641177912 41.0297647897435' + ',28.9389559878606 41.0290525580955))') + + # Test Entity export and RDFS + for rv in [ + c.get(url_for('api_04.entity', id_=place.id, export='csv')), + c.get( + url_for( 'api_04.query', entities=location.id, cidoc_classes='E18', view_classes='artifact', system_classes='person', export='csv'))]: - assert b'Shire' in rv.data - assert 'text/csv' in rv.headers.get('Content-Type') + assert b'Shire' in rv.data + assert 'text/csv' in rv.headers.get('Content-Type') - for rv in [ - self.app.get( - url_for( - 'api_04.entity', id_=place.id, export='csvNetwork')), - self.app.get( - url_for( + for rv in [ + c.get( + url_for('api_04.entity', id_=place.id, export='csvNetwork')), + c.get( + url_for( 'api_04.query', entities=location.id, cidoc_classes='E18', view_classes='artifact', system_classes='person', export='csvNetwork'))]: - assert b'Shire' in rv.data - assert 'application/zip' in rv.headers.get('Content-Type') - rv = self.app.get( - url_for( + assert b'Shire' in rv.data + assert 'application/zip' in rv.headers.get('Content-Type') + rv = c.get( + url_for( 'api_04.linked_entities_by_properties_recursive', id_=place.id, properties='P46')) - rv = rv.get_json() - names = [place.name, feature.name, 'Bar'] - for item in rv['results']: - assert item['features'][0]['properties']['title'] in names - - # Test Entities endpoints - for rv in [ - self.app.get(url_for('api_04.cidoc_class', class_='E21')), - self.app.get( - url_for( - 'api_04.view_class', - class_='place', - sort='desc', - column='id', - relation_type='P2', - type_id=boundary_mark.id)), - self.app.get( - url_for( - 'api_04.view_class', - class_='place', - sort='desc', - column='begin_from', - relation_type='P2', - type_id=boundary_mark.id)), - self.app.get(url_for('api_04.latest', limit=2)), - self.app.get( - url_for('api_04.system_class', class_='artifact')), - self.app.get( - url_for('api_04.entities_linked_to_entity', id_=event.id)), - self.app.get( - url_for('api_04.type_entities', id_=boundary_mark.id)), - self.app.get( - url_for('api_04.type_entities', id_=relation_sub.id)), - self.app.get( - url_for('api_04.type_entities_all', id_=unit_node.id)), - self.app.get( - url_for('api_04.type_entities_all', id_=relation_sub.id)), - self.app.get( - url_for( - 'api_04.query', - entities=location.id, - classes='E18', - codes='artifact', - sort='desc', - column='cidoc_class', - system_classes='person', - download=True, - last=actor.id)), - self.app.get( - url_for( - 'api_04.query', - entities=location.id, - classes='E18', - codes='artifact', - system_classes='person', - linked_entities=place.id, - sort='desc', - column='system_class', - download=True, - actor=place.id))]: - assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json() - rv_results = rv['results'][0]['features'][0] - rv_page = rv['pagination'] - assert self.get_bool(rv_results, '@id') - assert self.get_bool(rv_page, 'entities') - assert self.get_bool(rv_page, 'entitiesPerPage') - assert self.get_bool(rv_page, 'index') - assert self.get_bool(rv_page, 'totalPages') - - # Test Entities with show=none - rv = self.app.get( + rv = rv.get_json() + names = [place.name, feature.name, 'Bar'] + for item in rv['results']: + assert item['features'][0]['properties']['title'] in names + + # Test Entities endpoints + for rv in [ + c.get(url_for('api_04.cidoc_class', class_='E21')), + c.get( url_for( - 'api_04.cidoc_class', class_='E21', show='none')) - rv = rv.get_json()['results'][0]['features'][0] - assert self.get_bool_inverse(rv, 'geometry') - assert self.get_no_key(rv, 'depictions') - assert self.get_no_key(rv, 'links') - assert self.get_no_key(rv, 'types') - - # Test if Query returns enough entities - rv = self.app.get( + 'api_04.view_class', + class_='place', + sort='desc', + column='id', + relation_type='P2', + type_id=boundary_mark.id)), + c.get( + url_for( + 'api_04.view_class', + class_='place', + sort='desc', + column='begin_from', + relation_type='P2', + type_id=boundary_mark.id)), + c.get(url_for('api_04.latest', limit=2)), + c.get(url_for('api_04.system_class', class_='artifact')), + c.get(url_for('api_04.entities_linked_to_entity', id_=event.id)), + c.get(url_for('api_04.type_entities', id_=boundary_mark.id)), + c.get(url_for('api_04.type_entities', id_=relation_sub.id)), + c.get(url_for('api_04.type_entities_all', id_=unit_node.id)), + c.get(url_for('api_04.type_entities_all', id_=relation_sub.id)), + c.get( url_for( 'api_04.query', entities=location.id, - cidoc_classes='E18', - view_classes='artifact', + classes='E18', + codes='artifact', + sort='desc', + column='cidoc_class', system_classes='person', - limit=0, - first=actor2.id)).get_json() - assert bool(rv['pagination']['entities'] == 8) - - # Test page parameter - rv = self.app.get( + download=True, + last=actor.id)), + c.get( + url_for( + 'api_04.query', + entities=location.id, + classes='E18', + codes='artifact', + system_classes='person', + linked_entities=place.id, + sort='desc', + column='system_class', + download=True, + actor=place.id))]: + assert 'application/json' in rv.headers.get('Content-Type') + rv = rv.get_json() + rv_results = rv['results'][0]['features'][0] + rv_page = rv['pagination'] + assert self.get_bool(rv_results, '@id') + assert self.get_bool(rv_page, 'entities') + assert self.get_bool(rv_page, 'entitiesPerPage') + assert self.get_bool(rv_page, 'index') + assert self.get_bool(rv_page, 'totalPages') + + # Test Entities with show=none + rv = c.get(url_for('api_04.cidoc_class', class_='E21', show='none')) + rv = rv.get_json()['results'][0]['features'][0] + assert self.get_bool_inverse(rv, 'geometry') + assert self.get_no_key(rv, 'depictions') + assert self.get_no_key(rv, 'links') + assert self.get_no_key(rv, 'types') + + # Test if Query returns enough entities + rv = c.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + limit=0, + first=actor2.id)).get_json() + assert bool(rv['pagination']['entities'] == 8) + + # Test page parameter + rv = c.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + limit=1, + page=7)).get_json() + properties = rv['results'][0]['features'][0]['properties'] + assert bool(properties['title'] == place.name) + assert bool(len(rv['results']) == 1) + + # Test Entities count + rv = c.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + count=True)) + assert bool(rv.get_json() == 8) + + rv = c.get(url_for('api_04.geometric_entities', count=True)) + assert bool(rv.get_json() == 6) + + # Test entities with GeoJSON Format + for rv in [ + c.get( url_for( 'api_04.query', entities=location.id, cidoc_classes='E18', view_classes='artifact', system_classes='person', - limit=1, - page=7)).get_json() - properties = rv['results'][0]['features'][0]['properties'] - assert bool(properties['title'] == place.name) - assert bool(len(rv['results']) == 1) - - # Test Entities count - rv = self.app.get( + format='geojson')), + c.get( url_for( 'api_04.query', entities=location.id, cidoc_classes='E18', view_classes='artifact', system_classes='person', - count=True)) - assert bool(rv.get_json() == 8) + format='geojson-v2'))]: + rv = rv.get_json()['results'][0]['features'][0] + assert self.get_bool(rv['properties'], '@id') + assert self.get_bool(rv['properties'], 'systemClass') + + # Test entities with Linked Open Usable Data Format + rv = c.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes=['E18', 'E53'], + view_classes='artifact', + system_classes=['person', 'type'], + format='loud', + limit=0)) + rv = rv.get_json()['results'][0] + assert bool(rv['type'] == 'Type') + assert bool(rv['_label'] == 'Abbot') + + # ---Type Endpoints--- + for rv in [ + c.get(url_for('api_04.type_overview')), + c.get(url_for('api_04.type_overview', download=True))]: + found = False + for item in rv.get_json()['place']: + if found: + break + if item['name'] == 'Administrative unit': + for children in item['children']: + if children['label'] == 'Austria': + found = True + break + assert found + + for rv in [ + c.get(url_for('api_04.type_by_view_class')), + c.get(url_for('api_04.type_by_view_class', download=True))]: + found = False + for item in rv.get_json()['place']: + if item['name'] == 'Place': + for children in item['children']: + if children['label'] == 'Boundary Mark': + found = True + break + assert found + rv = c.get(url_for('api_04.type_tree')) + assert bool(rv.get_json()['typeTree']) + rv = c.get(url_for('api_04.type_tree', download=True)) + assert bool(rv.get_json()['typeTree']) + rv = c.get(url_for('api_04.type_tree', count=True)) + assert rv.get_json() > 0 + + # ---Test search--- + search_string_constructor = { + 0: [{ + "entityAliases": [{ + "operator": "equal", + "values": ["Sûza"], + "logicalOperator": "and"}], + "typeID": [{ + "operator": "equal", "values": [1121212], + "logicalOperator": "and"}]}, { + "valueTypeID": [{ + "operator": "lesserThanEqual", + "values": [(height.id, 1.0), (weight_.id, 1.0)], + "logicalOperator": "and"}]}, { + "entityAliases": [{ + "operator": "greaterThan", "values": ["Sûza"]}], + "typeID": [{"operator": "equal", "values": [1121212]}]}], + 1: [{ + "valueTypeID": [{ + "operator": "equal", + "values": [(height.id, 23.0)]}]}, { + "valueTypeID": [{ + "operator": "greaterThanEqual", + "values": [(height.id, 23.0)]}]}, { + "typeName": [{ + "operator": "equal", + "values": ["Boundary Mark", "Height"], + "logicalOperator": "and"}]}, { + "beginFrom": [{ + "operator": "lesserThan", + "values": ["2020-01-01"], + "logicalOperator": "and"}]}, { + "beginFrom": [{ + "operator": "lesserThan", + "values": ["2020-01-01"]}]}, { + "beginTo": [{ + "operator": "lesserThanEqual", + "values": ["2018-03-01"], + "logicalOperator": "and"}]}, { + "beginTo": [{ + "operator": "lesserThanEqual", + "values": ["2018-03-01"]}]}, { + "endFrom": [{ + "operator": "greaterThan", + "values": ["2013-02-01"], + "logicalOperator": "and"}]}, { + "endFrom": [{ + "operator": "greaterThan", + "values": ["2013-02-01"]}]}, { + "endTo": [{ + "operator": "greaterThanEqual", + "values": ["2019-03-01"], + "logicalOperator": "and"}]}, { + "endTo": [{ + "operator": "greaterThanEqual", + "values": ["2019-03-01"]}]}, { + "entityAliases": [ + {"operator": "like", "values": ["S"]}]}, { + "typeName": [{ + "operator": "like", + "values": ["Oun", "mark"], + "logicalOperator": "and"}]}, { + "entityDescription": [{ + "operator": "equal", + "values": [ + "the shirE Was the Homeland of the hobbits.", + "homeland"]}]}, { + "valueTypeID": [{ + "operator": "greaterThanEqual", + "values": [(height.id, 23.0), (weight_.id, 999.0)], + "logicalOperator": "and"}]}], + 2: [{ + "entityCidocClass": [{ + "operator": "equal", + "values": ["E21"], + "logicalOperator": "and"}]}, { + "entitySystemClass": [{ + "operator": "equal", + "values": ["person"], + "logicalOperator": "and"}]}, { + "typeIDWithSubs": [{ + "operator": "equal", + "values": [boundary_mark.id, height.id]}]}, { + "typeIDWithSubs": [{ + "operator": "equal", + "values": [boundary_mark.id], + "logicalOperator": "and"}]}, { + "typeID": [{ + "operator": "equal", + "values": [boundary_mark.id, height.id]}]}], + 3: [{ + "typeIDWithSubs": [{ + "operator": "equal", + "values": [ + boundary_mark.id, height.id, + change_of_property.id]}]}, { + "entityDescription": [{ + "operator": "like", + "values": ["FrOdO", "sam"]}]}], + 5: [{"entityName": [{"operator": "like", "values": ["Fr"]}]}], + 9: [{ + "relationToID": [{ + "operator": "equal", "values": [place.id]}]}], + 161: [{ + "typeIDWithSubs": [{ + "operator": "notEqual", + "values": [boundary_mark.id], + "logicalOperator": "and"}]}], + 162: [{ + "typeName": [{ + "operator": "notEqual", + "values": ["Boundary Mark", "Height"], + "logicalOperator": "and"}]}, { + "entityID": [{ + "operator": "notEqual", + "values": [place.id], + "logicalOperator": "and"}]}, { + "entityAliases": [{ + "operator": "notEqual", + "values": ["Sûza"], + "logicalOperator": "and"}]}, { + "entityName": [ + {"operator": "notEqual", "values": ["Mordor"]}]}]} + + for count, search_string in search_string_constructor.items(): + rv = c.get( + url_for( + 'api_04.query', + system_classes='all', + search=search_string)) + assert bool(rv.get_json()['pagination']['entities'] == count) - rv = self.app.get(url_for('api_04.geometric_entities', count=True)) - assert bool(rv.get_json() == 6) + for rv in [ + c.get(url_for('api_04.subunits', id_=place.id)), + c.get(url_for('api_04.subunits', id_=place.id, download=True))]: + assert 'application/json' in rv.headers.get('Content-Type') + rv = rv.get_json()[str(place.id)] + for item in rv: + if item['id'] == place.id: + assert bool(item['id'] == place.id) + assert bool(item['openatlasClassName'] == "place") + assert bool(item['children'] == [feature.id]) + item = item['properties'] + assert bool(item['name'] == place.name) + assert bool(item['description'] == place.description) + assert bool(item['aliases'] == [alias.name]) + assert bool(item['externalReferences']) + assert bool(item['timespan']) + assert bool(item['standardType']) + assert bool(item['files']) + assert bool(item['types']) + + rv = c.get(url_for('api_04.subunits', id_=place.id, count=True)) + assert b'3' in rv.data + for rv in [ + c.get(url_for('api_04.subunits', id_=place.id, format='xml')), + c.get( + url_for( + 'api_04.subunits', + id_=place.id, + format='xml', + download=True))]: + assert b'Shire' in rv.data - # Test entities with GeoJSON Format - for rv in [ - self.app.get( + # Test centroid + for id_ in [feature.id, feature_location.id]: + for format_ in ['lp', 'geojson', 'geojson-v2']: + rv = c.get( url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='geojson')), - self.app.get( + 'api_04.entity', + id_=id_, + format=format_, + centroid=True)) + assert b'(autogenerated)' in rv.data + assert 'application/json' in rv.headers.get('Content-Type') + rv = c.get( url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - format='geojson-v2'))]: - rv = rv.get_json()['results'][0]['features'][0] - assert self.get_bool(rv['properties'], '@id') - assert self.get_bool(rv['properties'], 'systemClass') - - # Test entities with Linked Open Usable Data Format - rv = self.app.get( - url_for( - 'api_04.query', - entities=location.id, - cidoc_classes=['E18', 'E53'], - view_classes='artifact', - system_classes=['person', 'type'], - format='loud', - limit=0)) - rv = rv.get_json()['results'][0] - assert bool(rv['type'] == 'Type') - assert bool(rv['_label'] == 'Abbot') - - # ---Type Endpoints--- - for rv in [ - self.app.get(url_for('api_04.type_overview')), - self.app.get(url_for('api_04.type_overview', download=True))]: - found = False - for item in rv.get_json()['place']: - if found: - break - if item['name'] == 'Administrative unit': - for children in item['children']: - if children['label'] == 'Austria': - found = True - break - assert found - - for rv in [ - self.app.get(url_for('api_04.type_by_view_class')), - self.app.get( - url_for('api_04.type_by_view_class', download=True))]: - found = False - for item in rv.get_json()['place']: - if item['name'] == 'Place': - for children in item['children']: - if children['label'] == 'Boundary Mark': - found = True - break - assert found - rv = self.app.get(url_for('api_04.type_tree')) - assert bool(rv.get_json()['typeTree']) - rv = self.app.get(url_for('api_04.type_tree', download=True)) - assert bool(rv.get_json()['typeTree']) - rv = self.app.get(url_for('api_04.type_tree', count=True)) - assert rv.get_json() > 0 - - # ---Test search--- - search_string_constructor = { - 0: [{ - "entityAliases": [{ - "operator": "equal", - "values": ["Sûza"], - "logicalOperator": "and"}], - "typeID": [{ - "operator": "equal", "values": [1121212], - "logicalOperator": "and"}]}, { - "valueTypeID": [{ - "operator": "lesserThanEqual", - "values": [(height.id, 1.0), (weight_.id, 1.0)], - "logicalOperator": "and"}]}, { - "entityAliases": [{ - "operator": "greaterThan", "values": ["Sûza"]}], - "typeID": [{"operator": "equal", "values": [1121212]}]}], - 1: [{ - "valueTypeID": [{ - "operator": "equal", - "values": [(height.id, 23.0)]}]}, { - "valueTypeID": [{ - "operator": "greaterThanEqual", - "values": [(height.id, 23.0)]}]}, { - "typeName": [{ - "operator": "equal", - "values": ["Boundary Mark", "Height"], - "logicalOperator": "and"}]}, { + 'api_04.subunits', + id_=place.id, + centroid=True)) + assert b'(autogenerated)' in rv.data + assert 'application/json' in rv.headers.get('Content-Type') + rv = c.get( + url_for( + 'api_04.view_class', + class_='all', + centroid=True, + limit=0)) + assert b'(autogenerated)' in rv.data + assert 'application/json' in rv.headers.get('Content-Type') + + rv = c.get( + url_for( + 'api_04.display', + filename=f'{file.id}', + image_size='table')) + self.assertTrue(rv.headers['Content-Type'].startswith('image')) + + # Test Error Handling + for rv in [ + c.get(url_for('api_04.entity', id_=233423424)), + c.get(url_for('api_04.cidoc_class', class_='E18', last=1231))]: + rv = rv.get_json() + assert 'Entity does not exist' in rv['title'] + + rv = c.get(url_for('api_04.subunits', id_=actor.id)) + assert 'ID is not a valid place' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.query', + entities=location.id, + cidoc_classes='E18', + view_classes='artifact', + system_classes='person', + sort='desc', + column='id', + download=True, + last=place.id)) + assert 'ID is last entity' in rv.get_json()['title'] + + rv = c.get(url_for('api_04.system_class', class_='Wrong')) + assert 'Invalid system_classes value' in rv.get_json()['title'] + + rv = c.get(url_for('api_04.query')) + assert 'No query parameters given' in rv.get_json()['title'] + + rv = c.get(url_for('api_04.cidoc_class', class_='e99999999')) + assert 'Invalid cidoc_classes value' in rv.get_json()['title'] + + rv = c.get(url_for('api_04.view_class', class_='Invalid')) + assert 'Invalid view_classes value' in rv.get_json()['title'] + + rv = c.get(url_for('api_04.latest', limit='99999999')) + assert 'Invalid limit value' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"typeID":[{"operator":"equal",' + '"values":["Boundary Mark", "Height", "Dimension"],' + '"logicalOperator":"and"}]}')) + assert 'Invalid search value' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search='{"typeID":[{"operator":"like",' + '"values":["Boundary Mark", "Height", "Dimension"],' + '"logicalOperator":"and"}]}')) + assert 'Operator not supported' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search={ + "All": [{ + "operator": "notEqual", + "values": ["Boundary Mark", "Height"]}]})) + assert 'Invalid search category' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search={ + "typeName": [{"operator": "notEqual", "values": []}]})) + assert 'No search value' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search={ "beginFrom": [{ - "operator": "lesserThan", - "values": ["2020-01-01"], - "logicalOperator": "and"}]}, { + "operator": "notEqual", + "values": ["Help"]}]})) + assert 'Invalid search values' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search={ "beginFrom": [{ - "operator": "lesserThan", - "values": ["2020-01-01"]}]}, { - "beginTo": [{ - "operator": "lesserThanEqual", - "values": ["2018-03-01"], - "logicalOperator": "and"}]}, { - "beginTo": [{ - "operator": "lesserThanEqual", - "values": ["2018-03-01"]}]}, { - "endFrom": [{ - "operator": "greaterThan", - "values": ["2013-02-01"], - "logicalOperator": "and"}]}, { - "endFrom": [{ - "operator": "greaterThan", - "values": ["2013-02-01"]}]}, { - "endTo": [{ - "operator": "greaterThanEqual", - "values": ["2019-03-01"], - "logicalOperator": "and"}]}, { - "endTo": [{ - "operator": "greaterThanEqual", - "values": ["2019-03-01"]}]}, { - "entityAliases": [ - {"operator": "like", "values": ["S"]}]}, { - "typeName": [{ - "operator": "like", - "values": ["Oun", "mark"], - "logicalOperator": "and"}]}, { - "entityDescription": [{ - "operator": "equal", - "values": [ - "the shirE Was the Homeland of the hobbits.", - "homeland"]}]}, { - "valueTypeID": [{ - "operator": "greaterThanEqual", - "values": [(height.id, 23.0), (weight_.id, 999.0)], - "logicalOperator": "and"}]}], - 2: [{ - "entityCidocClass": [{ - "operator": "equal", - "values": ["E21"], - "logicalOperator": "and"}]}, { - "entitySystemClass": [{ - "operator": "equal", - "values": ["person"], - "logicalOperator": "and"}]}, { - "typeIDWithSubs": [{ - "operator": "equal", - "values": [boundary_mark.id, height.id]}]}, { - "typeIDWithSubs": [{ - "operator": "equal", - "values": [boundary_mark.id], - "logicalOperator": "and"}]}, { - "typeID": [{ - "operator": "equal", - "values": [boundary_mark.id, height.id]}]}], - 3: [{ - "typeIDWithSubs": [{ - "operator": "equal", - "values": [ - boundary_mark.id, height.id, - change_of_property.id]}]}, { - "entityDescription": [{ - "operator": "like", - "values": ["FrOdO", "sam"]}]}], - 5: [{"entityName": [{"operator": "like", "values": ["Fr"]}]}], - 9: [{ - "relationToID": [{ - "operator": "equal", "values": [place.id]}]}], - 161: [{ - "typeIDWithSubs": [{ "operator": "notEqual", - "values": [boundary_mark.id], - "logicalOperator": "and"}]}], - 162: [{ + "values": ["800-1-1", "Help"]}]})) + assert 'Invalid search values' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search='"beginFrom":[{"operator":"lesserThan",' + '"values":["2000-01-01"],' + '"logicalOperator":"or"}]}')) + assert 'Invalid search syntax' in rv.get_json()['title'] + + rv = c.get(url_for('api_04.type_entities', id_=1234)) + assert 'Entity is not a type' in rv.get_json()['title'] + + rv = c.get(url_for('api_04.type_entities_all', id_=1234)) + assert 'Entity is not a type' in rv.get_json()['title'] + + rv = c.get( + url_for('api_04.system_class_count', type_id=999)) + assert 'Entity is not a type' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search={ "typeName": [{ - "operator": "notEqual", + "operator": "notEqualT", "values": ["Boundary Mark", "Height"], - "logicalOperator": "and"}]}, { - "entityID": [{ - "operator": "notEqual", - "values": [place.id], - "logicalOperator": "and"}]}, { - "entityAliases": [{ + "logicalOperator": "and"}]})) + assert 'Invalid compare operator' in rv.get_json()['title'] + + rv = c.get( + url_for( + 'api_04.view_class', + class_='place', + search={ + "typeName": [{ "operator": "notEqual", - "values": ["Sûza"], - "logicalOperator": "and"}]}, { - "entityName": [ - {"operator": "notEqual", "values": ["Mordor"]}]}]} - - for count, search_string in search_string_constructor.items(): - rv = self.app.get( - url_for( - 'api_04.query', - system_classes='all', - search=search_string)) - assert bool(rv.get_json()['pagination']['entities'] == count) - - for rv in [ - self.app.get(url_for('api_04.subunits', id_=place.id)), - self.app.get( - url_for('api_04.subunits', id_=place.id, download=True))]: - assert 'application/json' in rv.headers.get('Content-Type') - rv = rv.get_json()[str(place.id)] - for item in rv: - if item['id'] == place.id: - assert bool(item['id'] == place.id) - assert bool(item['openatlasClassName'] == "place") - assert bool(item['children'] == [feature.id]) - item = item['properties'] - assert bool(item['name'] == place.name) - assert bool(item['description'] == place.description) - assert bool(item['aliases'] == [alias.name]) - assert bool(item['externalReferences']) - assert bool(item['timespan']) - assert bool(item['standardType']) - assert bool(item['files']) - assert bool(item['types']) - - rv = self.app.get( - url_for('api_04.subunits', id_=place.id, count=True)) - assert b'3' in rv.data - for rv in [ - self.app.get( - url_for('api_04.subunits', id_=place.id, format='xml')), - self.app.get( - url_for( - 'api_04.subunits', - id_=place.id, - format='xml', - download=True))]: - assert b'Shire' in rv.data - - # Test centroid - for id_ in [feature.id, feature_location.id]: - for format_ in ['lp', 'geojson', 'geojson-v2']: - rv = self.app.get( - url_for( - 'api_04.entity', - id_=id_, - format=format_, - centroid=True)) - assert b'(autogenerated)' in rv.data - assert 'application/json' in rv.headers.get('Content-Type') - rv = self.app.get( - url_for('api_04.subunits', id_=place.id, - centroid=True)) - assert b'(autogenerated)' in rv.data - assert 'application/json' in rv.headers.get('Content-Type') - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='all', - centroid=True, - limit=0)) - assert b'(autogenerated)' in rv.data - assert 'application/json' in rv.headers.get('Content-Type') - - rv = self.app.get( - url_for( - 'api_04.display', - filename=f'{file.id}', - image_size='table')) - self.assertTrue(rv.headers['Content-Type'].startswith('image')) - - # Test Error Handling - for rv in [ - self.app.get(url_for('api_04.entity', id_=233423424)), - self.app.get( - url_for('api_04.cidoc_class', class_='E18', last=1231))]: - rv = rv.get_json() - assert 'Entity does not exist' in rv['title'] - - rv = self.app.get(url_for('api_04.subunits', id_=actor.id)) - assert 'ID is not a valid place' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.query', - entities=location.id, - cidoc_classes='E18', - view_classes='artifact', - system_classes='person', - sort='desc', - column='id', - download=True, - last=place.id)) - assert 'ID is last entity' in rv.get_json()['title'] - - rv = self.app.get( - url_for('api_04.system_class', class_='Wrong')) - assert 'Invalid system_classes value' in rv.get_json()['title'] - - rv = self.app.get(url_for('api_04.query')) - assert 'No query parameters given' in rv.get_json()['title'] - - rv = self.app.get( - url_for('api_04.cidoc_class', class_='e99999999')) - assert 'Invalid cidoc_classes value' in rv.get_json()['title'] - - rv = self.app.get( - url_for('api_04.view_class', class_='Invalid')) - assert 'Invalid view_classes value' in rv.get_json()['title'] - - rv = self.app.get(url_for('api_04.latest', limit='99999999')) - assert 'Invalid limit value' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search='{"typeID":[{"operator":"equal",' - '"values":["Boundary Mark", "Height", "Dimension"],' - '"logicalOperator":"and"}]}')) - assert 'Invalid search value' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search='{"typeID":[{"operator":"like",' - '"values":["Boundary Mark", "Height", "Dimension"],' - '"logicalOperator":"and"}]}')) - assert 'Operator not supported' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search={ - "All":[{ - "operator":"notEqual", - "values":["Boundary Mark", "Height"]}]})) - assert 'Invalid search category' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search={ - "typeName":[{"operator":"notEqual","values":[]}]})) - assert 'No search value' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search={ - "beginFrom":[{ - "operator":"notEqual", - "values":["Help"]}]})) - assert 'Invalid search values' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search={ - "beginFrom":[{ - "operator":"notEqual", - "values":["800-1-1", "Help"]}]})) - assert 'Invalid search values' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search='"beginFrom":[{"operator":"lesserThan",' - '"values":["2000-01-01"],' - '"logicalOperator":"or"}]}')) - assert 'Invalid search syntax' in rv.get_json()['title'] - - rv = self.app.get(url_for('api_04.type_entities', id_=1234)) - assert 'Entity is not a type' in rv.get_json()['title'] - - rv = self.app.get(url_for('api_04.type_entities_all', id_=1234)) - assert 'Entity is not a type' in rv.get_json()['title'] - - rv = self.app.get( - url_for('api_04.system_class_count', type_id=999)) - assert 'Entity is not a type' in rv.get_json()['title'] + "values": ["Boundary Mark", "Height"], + "logicalOperator": "xor"}]})) + assert 'Invalid logical operator' in rv.get_json()['title'] - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search={ - "typeName":[{ - "operator":"notEqualT", - "values":["Boundary Mark", "Height"], - "logicalOperator":"and"}]})) - assert 'Invalid compare operator' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.view_class', - class_='place', - search={ - "typeName":[{ - "operator":"notEqual", - "values":["Boundary Mark", "Height"], - "logicalOperator":"xor"}]})) - assert 'Invalid logical operator' in rv.get_json()['title'] - - rv = self.app.get( - url_for( - 'api_04.display', - filename=f'{file_without_licences.id}')) - assert 'No license' in rv.get_json()['title'] + rv = c.get( + url_for('api_04.display', filename=f'{file_without_licences.id}')) + assert 'No license' in rv.get_json()['title'] - rv = self.app.get( - url_for('api_04.display', filename=f'{file_without_file.id}')) - assert 'File not found' in rv.get_json()['title'] + rv = c.get( + url_for('api_04.display', filename=f'{file_without_file.id}')) + assert 'File not found' in rv.get_json()['title'] - rv = self.app.get( - url_for('api_04.iiif_manifest', version=2, id_=place.id)) - assert 'File not found' in rv.get_json()['title'] + rv = c.get(url_for('api_04.iiif_manifest', version=2, id_=place.id)) + assert 'File not found' in rv.get_json()['title'] - rv = self.app.get( - url_for('api_04.iiif_sequence', version=2, id_=place.id)) - assert 'File not found' in rv.get_json()['title'] + rv = c.get(url_for('api_04.iiif_sequence', version=2, id_=place.id)) + assert 'File not found' in rv.get_json()['title'] - rv = self.app.get( - url_for( - 'api_04.display', - filename=f'{file_not_public.id}')) - assert 'Not public' in rv.get_json()['title'] - assert b'Endpoint not found' in self.app.get('/api/entity2').data + rv = c.get(url_for('api_04.display', filename=f'{file_not_public.id}')) + assert 'Not public' in rv.get_json()['title'] + assert b'Endpoint not found' in c.get('/api/entity2').data - self.app.get(url_for('logout')) - app.config['ALLOWED_IPS'] = [] + c.get(url_for('logout')) + app.config['ALLOWED_IPS'] = [] - rv = self.app.get(url_for('api_04.view_class', class_='place')) - assert 'Access denied' in rv.get_json()['title'] + rv = c.get(url_for('api_04.view_class', class_='place')) + assert 'Access denied' in rv.get_json()['title'] From 54dfe98aff92d8f2fc607e21ca7386a739970dd5 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Wed, 27 Nov 2024 23:41:07 +0100 Subject: [PATCH 34/42] further refactor test --- tests/base.py | 55 ++++------ tests/test_api.py | 249 ++++++++++++++++++++-------------------------- 2 files changed, 124 insertions(+), 180 deletions(-) diff --git a/tests/base.py b/tests/base.py index 9ce8e35bc..f080bd15c 100644 --- a/tests/base.py +++ b/tests/base.py @@ -42,12 +42,12 @@ def setup_database(self) -> None: connection.autocommit = True self.cursor = connection.cursor() for file_name in [ - '0_extensions', - '1_structure', - '2_data_model', - '3_data_web', - '4_data_type', - 'data_test']: + '0_extensions', + '1_structure', + '2_data_model', + '3_data_web', + '4_data_type', + 'data_test']: with open( Path(app.root_path).parent / 'install' / f'{file_name}.sql', encoding='utf8') as sql_file: @@ -68,43 +68,22 @@ def setUp(self) -> None: encoding='utf8') as sql_file: self.cursor.execute(sql_file.read()) - @staticmethod - def get_bool( - data: dict[str, Any], - key: str, - value: Optional[str | list[Any]] = None) -> bool: - return bool(data[key] == value) if value else bool(data[key]) - - @staticmethod - def get_bool_inverse(data: dict[str, Any], key: str) -> bool: - return bool(not data[key]) - - @staticmethod - def get_no_key(data: dict[str, Any], key: str) -> bool: - return bool(key not in data.keys()) - - @staticmethod - def get_geom_properties(geom: dict[str, Any], key: str) -> bool: - return bool(geom['features'][0]['properties'][key]) - @staticmethod def get_classes(data: list[dict[str, Any]]) -> bool: - return bool( - data[0]['systemClass'] - and data[0]['crmClass'] - and data[0]['view'] - and data[0]['icon'] - and data[0]['en']) + return (data[0]['systemClass'] + and data[0]['crmClass'] + and data[0]['view'] + and data[0]['icon'] + and data[0]['en']) @staticmethod def get_class_mapping(data: dict[str, Any], locale: str) -> bool: - return bool( - data['locale'] == locale - and data['results'][0]['systemClass'] - and data['results'][0]['crmClass'] - and data['results'][0]['view'] - and data['results'][0]['icon'] - and data['results'][0]['label']) + return (data['locale'] == locale + and data['results'][0]['systemClass'] + and data['results'][0]['crmClass'] + and data['results'][0]['view'] + and data['results'][0]['icon'] + and data['results'][0]['label']) class ExportImportTestCase(TestBaseCase): diff --git a/tests/test_api.py b/tests/test_api.py index c6a27ad7b..35922f0e3 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -103,58 +103,55 @@ def test_api(self) -> None: rv = c.get(url_for('api_04.properties', locale='de')).get_json() assert rv['P2']['nameInverse'] == 'ist Typus von' - assert bool(rv['P2']['name']) - assert bool(rv['P2']['nameInverse']) - assert bool(rv['P2']['i18n']) - assert bool(rv['P2']['i18nInverse']) - assert bool(rv['P2']['code']) + assert rv['P2']['name'] + assert rv['P2']['nameInverse'] + assert rv['P2']['i18n'] + assert rv['P2']['i18nInverse'] + assert rv['P2']['code'] rv = c.get(url_for('api_04.properties', locale='fr', download=True)) assert rv.get_json()['P2']['name'] == 'est de type' rv = c.get(url_for('api_04.backend_details')).get_json() - assert bool(rv['version'] == app.config['VERSION']) + assert rv['version'] == app.config['VERSION'] rv = c.get(url_for('api_04.backend_details', download=True)).get_json() - assert bool(rv['version'] == app.config['VERSION']) + assert rv['version'] == app.config['VERSION'] rv = c.get(url_for('api_04.system_class_count')).get_json() - assert bool(rv['person']) + assert rv['person'] rv = c.get( url_for('api_04.system_class_count', type_id=boundary_mark.id)) - assert bool(rv.get_json()['place']) + assert rv.get_json()['place'] rv = c.get(url_for('api.licensed_file_overview', file_id=file.id)) - assert self.get_bool( - rv.get_json()[str(file.id)], - 'license', - 'Public domain') + assert rv.get_json()[str(file.id)]['license'] == 'Public domain' rv = c.get(url_for('api.licensed_file_overview')) - assert bool(len(rv.get_json().keys()) == 5) + assert len(rv.get_json().keys()) == 5 rv = c.get(url_for( 'api_04.network_visualisation', exclude_system_classes='type')) rv = rv.get_json() - assert bool(len(rv['results']) == 65) + assert len(rv['results']) == 65 rv = c.get( url_for( 'api_04.network_visualisation', linked_to_ids=boundary_mark.id)) rv = rv.get_json() - assert bool(len(rv['results']) == 3) + assert len(rv['results']) == 3 rv = c.get(url_for('api_04.network_visualisation', download=True)) rv = rv.get_json() - assert bool(len(rv['results']) == 154) + assert len(rv['results']) == 154 for rv in [ c.get(url_for('api_04.geometric_entities')), c.get(url_for('api_04.geometric_entities', download=True))]: rv = rv.get_json() - assert bool(rv['features'][0]['geometry']['coordinates']) - assert self.get_geom_properties(rv, 'id') - assert self.get_geom_properties(rv, 'objectDescription') - assert self.get_geom_properties(rv, 'objectId') - assert self.get_geom_properties(rv, 'objectName') - assert self.get_geom_properties(rv, 'shapeType') + assert rv['features'][0]['geometry']['coordinates'] + assert rv['features'][0]['properties']['id'] + assert rv['features'][0]['properties']['objectDescription'] + assert rv['features'][0]['properties']['objectId'] + assert rv['features'][0]['properties']['objectName'] + assert rv['features'][0]['properties']['shapeType'] rv = c.get(url_for('api_04.export_database', format_='xml')) assert b'Shire' in rv.data @@ -171,49 +168,37 @@ def test_api(self) -> None: rv = c.get(url_for('api_04.entity', id_=place.id, download=True)) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()['features'][0] - assert self.get_bool(rv, '@id') - assert self.get_bool(rv, 'type', 'Feature') - assert self.get_bool(rv, 'crmClass', 'crm:E18 Physical Thing') - assert self.get_bool(rv, 'systemClass', 'place') - assert self.get_bool(rv['properties'], 'title') + assert rv['@id'] + assert rv['type'] == 'Feature' + assert rv['crmClass'] == 'crm:E18 Physical Thing' + assert rv['systemClass'] == 'place' + assert rv['properties']['title'] == 'Shire' desc = rv['descriptions'][0] - assert self.get_bool( - desc, 'value', 'The Shire was the homeland of the hobbits.') + assert desc['value'] == 'The Shire was the homeland of the hobbits.' timespan = rv['when']['timespans'][0] - assert self.get_bool( - timespan['start'], 'earliest', '2018-01-31T00:00:00') - assert self.get_bool( - timespan['start'], 'latest', '2018-03-01T00:00:00') - assert self.get_bool( - timespan['end'], 'earliest', '2019-01-31T00:00:00') - assert self.get_bool( - timespan['end'], 'latest', '2019-03-01T00:00:00') - assert self.get_bool(rv['types'][0], 'identifier') - assert self.get_bool(rv['types'][0], 'label', 'Boundary Mark') - rel = rv['relations'] - assert self.get_bool(rel[1], 'label', 'Height') - assert self.get_bool(rel[1], 'relationDescription', '23.0') - assert self.get_bool(rel[0], 'relationTo') - assert self.get_bool(rel[0], 'relationType', 'crm:P2 has type') - assert self.get_bool(rel[0], 'relationSystemClass', 'type') - assert self.get_bool(rv['names'][0], 'alias', 'Sûza') + assert timespan['start']['earliest'] == '2018-01-31T00:00:00' + assert timespan['start']['latest'] == '2018-03-01T00:00:00' + assert timespan['end']['earliest'] == '2019-01-31T00:00:00' + assert timespan['end']['latest'] == '2019-03-01T00:00:00' + assert rv['types'][0]['identifier'] + assert rv['types'][0]['label'] == 'Boundary Mark' + assert rv['relations'][1]['label'] == 'Height' + assert rv['relations'][1]['relationDescription'] == '23.0' + assert rv['relations'][0]['relationTo'] + assert rv['relations'][0]['relationType'] == 'crm:P2 has type' + assert rv['relations'][0]['relationSystemClass'] == 'type' + assert rv['names'][0]['alias'] == 'Sûza' links = rv['links'][0] - assert self.get_bool(links, 'type', 'closeMatch') - assert self.get_bool( - links, - 'identifier', - 'https://www.geonames.org/2761369') - assert self.get_bool(links, 'referenceSystem', 'GeoNames') - assert self.get_bool(rv['geometry'], 'type', 'GeometryCollection') - assert self.get_bool( - rv['geometry']['geometries'][1], - 'coordinates', - [16.37069611, 48.208571233]) - assert self.get_bool(rv['depictions'][0], '@id') - assert self.get_bool( - rv['depictions'][0], 'title', 'Picture with a License') - assert self.get_bool(rv['depictions'][0], 'license', 'Public domain') - assert self.get_bool(rv['depictions'][0], 'url') + assert links['type'] == 'closeMatch' + assert links['identifier'] == 'https://www.geonames.org/2761369' + assert links['referenceSystem'] == 'GeoNames' + assert rv['geometry']['type'] == 'GeometryCollection' + assert (rv['geometry']['geometries'][1]['coordinates'] + == [16.37069611, 48.208571233]) + assert rv['depictions'][0]['@id'] + assert rv['depictions'][0]['title'] == 'Picture with a License' + assert rv['depictions'][0]['license'] == 'Public domain' + assert rv['depictions'][0]['url'] rv = c.get( url_for( @@ -223,12 +208,12 @@ def test_api(self) -> None: locale='de')) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()['features'][0] - rel = rv['relations'] - assert self.get_bool(rel[1], 'label', 'Height') - assert self.get_bool(rel[1], 'relationDescription', '23.0') - assert self.get_bool(rel[0], 'relationTo') - assert self.get_bool(rel[0], 'relationType', 'crm:P2_has_type') - assert self.get_bool(rel[0], 'relationTypeLabel', 'hat den Typus') + + assert rv['relations'][1]['label'] == 'Height' + assert rv['relations'][1]['relationDescription'] == '23.0' + assert rv['relations'][0]['relationTo'] + assert rv['relations'][0]['relationType'] == 'crm:P2_has_type' + assert rv['relations'][0]['relationTypeLabel'] == 'hat den Typus' geojson_checklist = [ '@id', 'systemClass', 'name', 'description', 'begin_earliest', @@ -238,37 +223,35 @@ def test_api(self) -> None: rv = c.get(url_for('api_04.entity', id_=place.id, format='geojson')) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()['features'][0] - assert self.get_bool(rv['geometry'], 'type') - assert self.get_bool(rv['geometry'], 'coordinates') + assert rv['geometry']['type'] + assert rv['geometry']['coordinates'] for key in geojson_checklist: - assert self.get_bool(rv['properties'], key) + assert rv['properties'][key] rv = c.get(url_for('api_04.entity', id_=place.id, format='geojson-v2')) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()['features'][0] - assert self.get_bool(rv['geometry'], 'type') - assert self.get_bool(rv['geometry']['geometries'][0], 'coordinates') + assert rv['geometry']['type'] + assert rv['geometry']['geometries'][0]['coordinates'] for key in geojson_checklist: - assert self.get_bool(rv['properties'], key) + assert rv['properties'][key] # Test entity in Linked Open Usable Data rv = c.get(url_for('api_04.entity', id_=place.id, format='loud')) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json() - assert bool(rv['type'] == 'PhysicalThing') - assert bool(rv['_label'] == 'Shire') - assert bool(rv['content'] - == 'The Shire was the homeland of the hobbits.') - assert bool(rv['timespan']['begin_of_the_begin'] - == '2018-01-31T00:00:00') - assert bool(rv['identified_by'][0]['_label'] == 'Sûza') - assert bool(rv['classified_as'][0]['_label'] == 'Boundary Mark') - assert bool(rv['former_or_current_location'][0]['_label'] - == 'Location of Shire') - assert bool(rv['former_or_current_location'][0]['defined_by'] - == 'POLYGON((28.9389559878606 41.0290525580955,' - '28.9409293485759 41.0273124142771,28.941969652866 ' - '41.0284940983463,28.9399641177912 41.0297647897435' - ',28.9389559878606 41.0290525580955))') + assert rv['type'] == 'PhysicalThing' + assert rv['_label'] == 'Shire' + assert rv['content'] == 'The Shire was the homeland of the hobbits.' + assert rv['timespan']['begin_of_the_begin'] == '2018-01-31T00:00:00' + assert rv['identified_by'][0]['_label'] == 'Sûza' + assert rv['classified_as'][0]['_label'] == 'Boundary Mark' + assert (rv['former_or_current_location'][0]['_label'] + == 'Location of Shire') + assert (rv['former_or_current_location'][0]['defined_by'] + == 'POLYGON((28.9389559878606 41.0290525580955,' + '28.9409293485759 41.0273124142771,28.941969652866 ' + '41.0284940983463,28.9399641177912 41.0297647897435' + ',28.9389559878606 41.0290525580955))') # Test Entity export and RDFS for rv in [ @@ -358,21 +341,19 @@ def test_api(self) -> None: actor=place.id))]: assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json() - rv_results = rv['results'][0]['features'][0] - rv_page = rv['pagination'] - assert self.get_bool(rv_results, '@id') - assert self.get_bool(rv_page, 'entities') - assert self.get_bool(rv_page, 'entitiesPerPage') - assert self.get_bool(rv_page, 'index') - assert self.get_bool(rv_page, 'totalPages') + assert rv['results'][0]['features'][0]['@id'] + assert rv['pagination']['entities'] + assert rv['pagination']['entitiesPerPage'] + assert rv['pagination']['index'] + assert rv['pagination']['totalPages'] # Test Entities with show=none rv = c.get(url_for('api_04.cidoc_class', class_='E21', show='none')) rv = rv.get_json()['results'][0]['features'][0] - assert self.get_bool_inverse(rv, 'geometry') - assert self.get_no_key(rv, 'depictions') - assert self.get_no_key(rv, 'links') - assert self.get_no_key(rv, 'types') + assert not rv['geometry'] + assert not rv.get('depictions') + assert not rv.get('links') + assert not rv.get('types') # Test if Query returns enough entities rv = c.get( @@ -384,7 +365,7 @@ def test_api(self) -> None: system_classes='person', limit=0, first=actor2.id)).get_json() - assert bool(rv['pagination']['entities'] == 8) + assert rv['pagination']['entities'] == 8 # Test page parameter rv = c.get( @@ -397,8 +378,8 @@ def test_api(self) -> None: limit=1, page=7)).get_json() properties = rv['results'][0]['features'][0]['properties'] - assert bool(properties['title'] == place.name) - assert bool(len(rv['results']) == 1) + assert properties['title'] == place.name + assert len(rv['results']) == 1 # Test Entities count rv = c.get( @@ -409,10 +390,10 @@ def test_api(self) -> None: view_classes='artifact', system_classes='person', count=True)) - assert bool(rv.get_json() == 8) + assert rv.get_json() == 8 rv = c.get(url_for('api_04.geometric_entities', count=True)) - assert bool(rv.get_json() == 6) + assert rv.get_json() == 6 # Test entities with GeoJSON Format for rv in [ @@ -433,8 +414,8 @@ def test_api(self) -> None: system_classes='person', format='geojson-v2'))]: rv = rv.get_json()['results'][0]['features'][0] - assert self.get_bool(rv['properties'], '@id') - assert self.get_bool(rv['properties'], 'systemClass') + assert rv['properties']['@id'] + assert rv['properties']['systemClass'] # Test entities with Linked Open Usable Data Format rv = c.get( @@ -447,39 +428,23 @@ def test_api(self) -> None: format='loud', limit=0)) rv = rv.get_json()['results'][0] - assert bool(rv['type'] == 'Type') - assert bool(rv['_label'] == 'Abbot') + assert rv['type'] == 'Type' + assert rv['_label'] == 'Abbot' # ---Type Endpoints--- for rv in [ c.get(url_for('api_04.type_overview')), c.get(url_for('api_04.type_overview', download=True))]: - found = False - for item in rv.get_json()['place']: - if found: - break - if item['name'] == 'Administrative unit': - for children in item['children']: - if children['label'] == 'Austria': - found = True - break - assert found + assert 'Austria' in str(rv.get_json()) for rv in [ c.get(url_for('api_04.type_by_view_class')), c.get(url_for('api_04.type_by_view_class', download=True))]: - found = False - for item in rv.get_json()['place']: - if item['name'] == 'Place': - for children in item['children']: - if children['label'] == 'Boundary Mark': - found = True - break - assert found + assert 'Boundary Mark' in str(rv.get_json()) rv = c.get(url_for('api_04.type_tree')) - assert bool(rv.get_json()['typeTree']) + assert rv.get_json()['typeTree'] rv = c.get(url_for('api_04.type_tree', download=True)) - assert bool(rv.get_json()['typeTree']) + assert rv.get_json()['typeTree'] rv = c.get(url_for('api_04.type_tree', count=True)) assert rv.get_json() > 0 @@ -613,7 +578,7 @@ def test_api(self) -> None: 'api_04.query', system_classes='all', search=search_string)) - assert bool(rv.get_json()['pagination']['entities'] == count) + assert rv.get_json()['pagination']['entities'] == count for rv in [ c.get(url_for('api_04.subunits', id_=place.id)), @@ -622,18 +587,18 @@ def test_api(self) -> None: rv = rv.get_json()[str(place.id)] for item in rv: if item['id'] == place.id: - assert bool(item['id'] == place.id) - assert bool(item['openatlasClassName'] == "place") - assert bool(item['children'] == [feature.id]) + assert item['id'] == place.id + assert item['openatlasClassName'] == "place" + assert item['children'] == [feature.id] item = item['properties'] - assert bool(item['name'] == place.name) - assert bool(item['description'] == place.description) - assert bool(item['aliases'] == [alias.name]) - assert bool(item['externalReferences']) - assert bool(item['timespan']) - assert bool(item['standardType']) - assert bool(item['files']) - assert bool(item['types']) + assert item['name'] == place.name + assert item['description'] == place.description + assert item['aliases'] == [alias.name] + assert item['externalReferences'] + assert item['timespan'] + assert item['standardType'] + assert item['files'] + assert item['types'] rv = c.get(url_for('api_04.subunits', id_=place.id, count=True)) assert b'3' in rv.data From fec2a263a4581bfa1ca5b3956d1f4d495ca9dbf3 Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Thu, 28 Nov 2024 18:10:35 +0100 Subject: [PATCH 35/42] Refactored app_context in test base --- files/export/.gitignore | 0 files/processed_images/resized/.gitignore | 0 files/uploads/.gitignore | 0 tests/base.py | 25 +++++++++++------------ 4 files changed, 12 insertions(+), 13 deletions(-) mode change 100644 => 100755 files/export/.gitignore mode change 100644 => 100755 files/processed_images/resized/.gitignore mode change 100644 => 100755 files/uploads/.gitignore diff --git a/files/export/.gitignore b/files/export/.gitignore old mode 100644 new mode 100755 diff --git a/files/processed_images/resized/.gitignore b/files/processed_images/resized/.gitignore old mode 100644 new mode 100755 diff --git a/files/uploads/.gitignore b/files/uploads/.gitignore old mode 100644 new mode 100755 diff --git a/tests/base.py b/tests/base.py index 9ce8e35bc..d62eac7f9 100644 --- a/tests/base.py +++ b/tests/base.py @@ -15,22 +15,21 @@ class TestBaseCase(unittest.TestCase): def setUp(self) -> None: app.testing = True app.config.from_pyfile('testing.py') - self.setup_database() self.client = app.test_client() self.app = self.client # Remove after updated API tests - app.app_context().push() # Always provide app.app_context - self.client.post( - url_for('login'), - data={'username': 'Alice', 'password': 'test'}) - with app.test_request_context(): - app.preprocess_request() - self.alice_id = 2 - self.precision_type = \ - Type.get_hierarchy('External reference match') - self.test_path = Path(app.root_path).parent / 'tests' - self.static_path = Path(app.root_path) / 'static' - app.app_context().push() # Push again for e.g. logged-in user + with app.app_context(): + self.client.post( + url_for('login'), + data={'username': 'Alice', 'password': 'test'}) + with app.test_request_context(): + app.preprocess_request() + self.alice_id = 2 + self.precision_type = \ + Type.get_hierarchy('External reference match') + self.test_path = Path(app.root_path).parent / 'tests' + self.static_path = Path(app.root_path) / 'static' + app.app_context().push() def setup_database(self) -> None: connection = psycopg2.connect( From 61e5fe05fe80173a5ea3f35b9cffdd5430bcc61d Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Fri, 29 Nov 2024 13:37:37 +0100 Subject: [PATCH 36/42] Refactor database functions --- openatlas/database/annotation.py | 12 ++++++------ openatlas/database/entity.py | 16 ++++++++-------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/openatlas/database/annotation.py b/openatlas/database/annotation.py index cc796b89f..dd71bb201 100644 --- a/openatlas/database/annotation.py +++ b/openatlas/database/annotation.py @@ -2,7 +2,7 @@ from flask import g -SELECT = """ +SQL = """ SELECT id, image_id, @@ -16,15 +16,15 @@ def get_by_id(id_: int) -> dict[str, Any]: - g.cursor.execute(SELECT + ' WHERE id = %(id)s;', {'id': id_}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else {} + g.cursor.execute(SQL + ' WHERE id = %(id)s;', {'id': id_}) + return g.cursor.fetchone() def get_by_file(image_id: int) -> list[dict[str, Any]]: g.cursor.execute( - SELECT + ' WHERE image_id = %(image_id)s;', + SQL + ' WHERE image_id = %(image_id)s;', {'image_id': image_id}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_orphaned_annotations() -> list[dict[str, Any]]: @@ -44,7 +44,7 @@ def get_orphaned_annotations() -> list[dict[str, Any]]: AND l.property_code = 'P67' WHERE l.id IS NULL AND a.entity_id IS NOT NULL """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def insert(data: dict[str, Any]) -> None: diff --git a/openatlas/database/entity.py b/openatlas/database/entity.py index 794df59d4..163a3ce92 100644 --- a/openatlas/database/entity.py +++ b/openatlas/database/entity.py @@ -22,7 +22,7 @@ def get_by_ids( g.cursor.execute( select_sql(types, aliases) + ' WHERE e.id IN %(ids)s GROUP BY e.id ', {'ids': tuple(ids)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_by_project_id(project_id: int) -> list[dict[str, Any]]: @@ -49,7 +49,7 @@ def get_by_project_id(project_id: int) -> list[dict[str, Any]]: GROUP BY e.id, ie.origin_id; """, {'id': project_id}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_by_class( @@ -60,7 +60,7 @@ def get_by_class( select_sql(types, aliases) + ' WHERE e.openatlas_class_name IN %(class)s GROUP BY e.id;', {'class': tuple(classes if isinstance(classes, list) else [classes])}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_by_cidoc_class( @@ -71,7 +71,7 @@ def get_by_cidoc_class( select_sql(types, aliases) + 'WHERE e.cidoc_class_code IN %(codes)s GROUP BY e.id;', {'codes': tuple(code if isinstance(code, list) else [code])}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_overview_counts(classes: list[str]) -> dict[str, int]: @@ -111,7 +111,7 @@ def get_latest(classes: list[str], limit: int) -> list[dict[str, Any]]: DESC LIMIT %(limit)s; """, {'codes': tuple(classes), 'limit': limit}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_all_entities() -> list[dict[str, Any]]: @@ -139,7 +139,7 @@ def get_all_entities() -> list[dict[str, Any]]: AS end_to FROM model.entity e; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def insert(data: dict[str, Any]) -> int: @@ -269,7 +269,7 @@ def search( ORDER BY e.name; """, {'term': f'%{term}%', 'user_id': user_id, 'classes': tuple(classes)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def link(data: dict[str, Any]) -> int: @@ -444,7 +444,7 @@ def get_links_of_entities( 'entities': tuple( entities if isinstance(entities, list) else [entities]), 'codes': tuple(codes) if codes else ''}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def delete_reference_system_links(entity_id: int) -> None: From 1ad18397321174e6619db27c766943b638742499 Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Fri, 29 Nov 2024 14:35:16 +0100 Subject: [PATCH 37/42] Refactor db cursor.fetchall --- openatlas/database/checks.py | 10 +++++----- openatlas/database/cidoc_class.py | 6 +++--- openatlas/database/cidoc_property.py | 6 +++--- openatlas/database/content.py | 2 +- openatlas/database/date.py | 10 +++++----- openatlas/database/entity.py | 9 ++++----- openatlas/database/gis.py | 24 ++++++++++-------------- openatlas/database/imports.py | 6 +++--- openatlas/database/link.py | 10 ++++++---- openatlas/database/logger.py | 6 +++--- openatlas/database/network.py | 6 +++--- openatlas/database/openatlas_class.py | 2 +- openatlas/database/overlay.py | 2 +- openatlas/database/reference_system.py | 2 +- openatlas/database/tools.py | 2 +- 15 files changed, 50 insertions(+), 53 deletions(-) diff --git a/openatlas/database/checks.py b/openatlas/database/checks.py index 703a19f10..7fabb9b33 100644 --- a/openatlas/database/checks.py +++ b/openatlas/database/checks.py @@ -25,7 +25,7 @@ def get_orphaned_subunits() -> list[dict[str, Any]]: WHERE l.domain_id IS NULL AND e.openatlas_class_name IN ('feature', 'stratigraphic_unit') """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_orphans() -> list[dict[str, Any]]: @@ -42,13 +42,13 @@ def get_orphans() -> list[dict[str, Any]]: AND e.cidoc_class_code != 'E55' AND e.openatlas_class_name != 'reference_system'; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_circular() -> list[dict[str, Any]]: g.cursor.execute( 'SELECT domain_id FROM model.link WHERE domain_id = range_id;') - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_cidoc_links() -> list[dict[str, Any]]: @@ -62,7 +62,7 @@ def get_cidoc_links() -> list[dict[str, Any]]: JOIN model.entity d ON l.domain_id = d.id JOIN model.entity r ON l.range_id = r.id; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_invalid_links(data: dict[str, Any]) -> list[dict[str, int]]: @@ -84,4 +84,4 @@ def get_invalid_links(data: dict[str, Any]) -> list[dict[str, int]]: AND r.cidoc_class_code = %(range_code)s; """, data) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) diff --git a/openatlas/database/cidoc_class.py b/openatlas/database/cidoc_class.py index 36303da0a..3f04856ac 100644 --- a/openatlas/database/cidoc_class.py +++ b/openatlas/database/cidoc_class.py @@ -11,13 +11,13 @@ def get_classes() -> list[dict[str, Any]]: LEFT JOIN model.entity e ON c.code = e.cidoc_class_code GROUP BY (c.code, c.name, c.comment); """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_hierarchy() -> list[dict[str, Any]]: g.cursor.execute( 'SELECT super_code, sub_code FROM model.cidoc_class_inheritance;') - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_translations(language_codes: list[str]) -> list[dict[str, Any]]: @@ -28,4 +28,4 @@ def get_translations(language_codes: list[str]) -> list[dict[str, Any]]: WHERE language_code IN %(language_codes)s; """, {'language_codes': tuple(language_codes)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) diff --git a/openatlas/database/cidoc_property.py b/openatlas/database/cidoc_property.py index 53ec92a40..35f334e75 100644 --- a/openatlas/database/cidoc_property.py +++ b/openatlas/database/cidoc_property.py @@ -24,13 +24,13 @@ def get_properties() -> list[dict[str, Any]]: p.name, p.name_inverse); """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_hierarchy() -> list[dict[str, Any]]: g.cursor.execute( 'SELECT super_code, sub_code FROM model.property_inheritance;') - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_translations(language_codes: list[str]) -> list[dict[str, Any]]: @@ -41,4 +41,4 @@ def get_translations(language_codes: list[str]) -> list[dict[str, Any]]: WHERE language_code IN %(language_codes)s; """, {'language_codes': tuple(language_codes)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) diff --git a/openatlas/database/content.py b/openatlas/database/content.py index 3c67b3ede..8f1e11cc0 100644 --- a/openatlas/database/content.py +++ b/openatlas/database/content.py @@ -3,7 +3,7 @@ def get_content() -> list[dict[str, str]]: g.cursor.execute('SELECT name, language, text FROM web.i18n;') - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def update(name: str, language: str, text: str) -> None: diff --git a/openatlas/database/date.py b/openatlas/database/date.py index 64d92671a..261cb3c55 100644 --- a/openatlas/database/date.py +++ b/openatlas/database/date.py @@ -19,7 +19,7 @@ def invalid_dates() -> list[dict[str, Any]]: AND end_to IS NOT NULL AND begin_to > end_to); """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def invalid_link_dates() -> list[dict[str, Any]]: @@ -38,7 +38,7 @@ def invalid_link_dates() -> list[dict[str, Any]]: AND end_to IS NOT NULL AND begin_to > end_to); """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def invalid_involvement_dates() -> list[dict[str, Any]]: @@ -81,7 +81,7 @@ def invalid_involvement_dates() -> list[dict[str, Any]]: AND event.begin_from IS NOT NULL AND involvement.begin_from < event.begin_from); """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def invalid_preceding_dates() -> list[dict[str, Any]]: @@ -97,7 +97,7 @@ def invalid_preceding_dates() -> list[dict[str, Any]]: AND succeeding.begin_from IS NOT NULL AND succeeding.begin_from < preceding.begin_from; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def invalid_sub_dates() -> list[dict[str, Any]]: @@ -122,4 +122,4 @@ def invalid_sub_dates() -> list[dict[str, Any]]: OR (super.end_to IS NOT NULL AND sub.end_to IS NOT NULL AND sub.end_to > super.end_to)); """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) diff --git a/openatlas/database/entity.py b/openatlas/database/entity.py index 163a3ce92..a5cd09b2b 100644 --- a/openatlas/database/entity.py +++ b/openatlas/database/entity.py @@ -6,11 +6,11 @@ def get_by_id( id_: int, types: bool = False, - aliases: bool = False) -> Optional[dict[str, Any]]: + aliases: bool = False) -> dict[str, Any]: g.cursor.execute( select_sql(types, aliases) + ' WHERE e.id = %(id)s GROUP BY e.id;', {'id': id_}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else None + return g.cursor.fetchone() def get_by_ids( @@ -408,7 +408,7 @@ def get_linked_entities_recursive( def get_links_of_entities( - entities: int | list[int], + ids: int | list[int], codes: str | list[str] | None, inverse: bool = False) -> list[dict[str, Any]]: sql = f""" @@ -441,8 +441,7 @@ def get_links_of_entities( ORDER BY e.name;""" g.cursor.execute( sql, { - 'entities': tuple( - entities if isinstance(entities, list) else [entities]), + 'entities': tuple(ids if isinstance(ids, list) else [ids]), 'codes': tuple(codes) if codes else ''}) return list(g.cursor) diff --git a/openatlas/database/gis.py b/openatlas/database/gis.py index 4e392ea32..39812aa58 100644 --- a/openatlas/database/gis.py +++ b/openatlas/database/gis.py @@ -6,7 +6,6 @@ def get_by_id(id_: int) -> list[dict[str, Any]]: - geometries = [] g.cursor.execute( """ SELECT @@ -22,13 +21,10 @@ def get_by_id(id_: int) -> list[dict[str, Any]]: WHERE place.id = %(id_)s; """, {'id_': id_}) - for row in g.cursor.fetchall(): - geometries.append(get_geometry_dict(row)) - return geometries + return [get_geometry_dict(row) for row in list(g.cursor)] def get_by_ids(ids: list[int]) -> defaultdict[int, list[dict[str, Any]]]: - locations = defaultdict(list) g.cursor.execute( """ SELECT @@ -45,7 +41,8 @@ def get_by_ids(ids: list[int]) -> defaultdict[int, list[dict[str, Any]]]: WHERE place.id IN %(ids)s; """, {'ids': tuple(ids)}) - for row in g.cursor.fetchall(): + locations = defaultdict(list) + for row in list(g.cursor): locations[row['entity_id']].append(get_geometry_dict(row)) return locations @@ -67,7 +64,6 @@ def get_geometry_dict(row: dict[str, Any]) -> dict[str, Any]: def get_centroids_by_id(id_: int) -> Optional[list[dict[str, Any]]]: - geometries = [] g.cursor.execute( """ SELECT @@ -86,14 +82,14 @@ def get_centroids_by_id(id_: int) -> Optional[list[dict[str, Any]]]: WHERE place.id = %(id_)s; """, {'id_': id_}) - for row in g.cursor.fetchall(): + geometries = [] + for row in list(g.cursor): if data := get_centroid_dict(row): geometries.append(data) return geometries or None def get_centroids_by_ids(ids: list[int]) -> defaultdict[int, list[Any]]: - locations = defaultdict(list) g.cursor.execute( """ SELECT @@ -113,7 +109,8 @@ def get_centroids_by_ids(ids: list[int]) -> defaultdict[int, list[Any]]: WHERE place.id IN %(ids)s; """, {'ids': tuple(ids)}) - for row in g.cursor.fetchall(): + locations = defaultdict(list) + for row in list(g.cursor): locations[row['entity_id']].append(get_centroid_dict(row)) return locations @@ -151,7 +148,7 @@ def get_wkt_by_id(id_: int) -> list[dict[str, Any]]: """, {'id_': id_}) geometries = [] - for row in g.cursor.fetchall(): + for row in list(g.cursor): geometry = {} if row['point']: geometry['defined_by'] = row['point'] @@ -199,7 +196,7 @@ def get_all(extra_ids: list[int]) -> list[dict[str, Any]]: GROUP BY object.id, g.id; """, {'extra_ids': tuple(extra_ids)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def test_geom(geometry: str) -> bool: @@ -232,8 +229,7 @@ def insert_wkt(data: dict[str, Any], shape: str) -> None: entity_id, name, description, type, geom_{shape} ) VALUES ( %(entity_id)s, '', %(description)s, %(type)s, - public.ST_SetSRID(public.ST_GeomFromText(%(wkt)s),4326) - ); + public.ST_SetSRID(public.ST_GeomFromText(%(wkt)s),4326)); """, data) diff --git a/openatlas/database/imports.py b/openatlas/database/imports.py index 6c066a07a..e0369366c 100644 --- a/openatlas/database/imports.py +++ b/openatlas/database/imports.py @@ -27,19 +27,19 @@ def insert_project(name: str, description: Optional[str]) -> int: def get_all_projects() -> list[dict[str, Any]]: g.cursor.execute(f'{SQL} GROUP BY p.id ORDER BY name;') - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_project_by_id(id_: int) -> dict[str, Any]: g.cursor.execute(f'{SQL} WHERE p.id = %(id)s GROUP BY p.id;', {'id': id_}) - return dict(g.cursor.fetchone()) + return g.cursor.fetchone() def get_project_by_name(name: str) -> Optional[dict[str, Any]]: g.cursor.execute( f'{SQL} WHERE p.name = %(name)s GROUP BY p.id;', {'name': name}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else None + return g.cursor.fetchone() def delete_project(id_: int) -> None: diff --git a/openatlas/database/link.py b/openatlas/database/link.py index 69f614717..091b61206 100644 --- a/openatlas/database/link.py +++ b/openatlas/database/link.py @@ -51,7 +51,7 @@ def get_by_id(id_: int) -> dict[str, Any]: WHERE l.id = %(id)s; """, {'id': id_}) - return dict(g.cursor.fetchone()) + return g.cursor.fetchone() def get_links_by_type(type_id: int) -> list[dict[str, Any]]: @@ -62,7 +62,7 @@ def get_links_by_type(type_id: int) -> list[dict[str, Any]]: WHERE type_id = %(type_id)s; """, {'type_id': type_id}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_entity_ids_by_type_ids(type_ids: list[int]) -> list[int]: @@ -108,7 +108,7 @@ def get_all_links() -> list[dict[str, Any]]: AS end_to FROM model.link l; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def check_link_duplicates() -> list[dict[str, int]]: @@ -134,7 +134,7 @@ def check_link_duplicates() -> list[dict[str, int]]: end_from, end_to, end_comment HAVING COUNT(*) > 1; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def delete_link_duplicates() -> int: @@ -178,6 +178,7 @@ def get_all_links_for_network( AND re.openatlas_class_name IN %(system_classes)s; """, {'system_classes': tuple(system_classes)}) + # Todo: return list(g.cursor) would be better but triggers an API error return [dict(row) for row in g.cursor.fetchall()] @@ -201,4 +202,5 @@ def get_links_by_id_network(ids: list[int]) -> list[dict[str, Any]]: WHERE l.range_id IN %(ids)s OR l.domain_id IN %(ids)s; """, {'ids': tuple(ids)}) + # Todo: return list(g.cursor) would be better but triggers an API error return [dict(row) for row in g.cursor.fetchall()] diff --git a/openatlas/database/logger.py b/openatlas/database/logger.py index 596e1d3a4..847e9db6b 100644 --- a/openatlas/database/logger.py +++ b/openatlas/database/logger.py @@ -14,8 +14,8 @@ def log(data: dict[str, Any]) -> None: def get_system_logs( limit: str, - priority: - str, user_id: str) -> list[dict[str, Any]]: + priority: str, + user_id: str) -> list[dict[str, Any]]: g.cursor.execute( f""" SELECT id, priority, type, message, user_id, info, created @@ -26,7 +26,7 @@ def get_system_logs( {' LIMIT %(limit)s' if int(limit) > 0 else ''}; """, {'limit': limit, 'priority': priority, 'user_id': user_id}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def delete_all_system_logs() -> None: diff --git a/openatlas/database/network.py b/openatlas/database/network.py index c825121c1..eec4c1157 100644 --- a/openatlas/database/network.py +++ b/openatlas/database/network.py @@ -11,7 +11,7 @@ def get_ego_network(ids: set[int]) -> list[dict[str, Any]]: WHERE domain_id IN %(ids)s or range_id IN %(ids)s; """, {'ids': tuple(ids)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_edges( @@ -28,7 +28,7 @@ def get_edges( WHERE property_code IN %(properties)s; """, {'classes': tuple(classes), 'properties': tuple(properties)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_entities(classes: list[str]) -> list[dict[str, Any]]: @@ -39,7 +39,7 @@ def get_entities(classes: list[str]) -> list[dict[str, Any]]: WHERE openatlas_class_name IN %(classes)s; """, {'classes': tuple(classes)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_object_mapping() -> dict[int, int]: diff --git a/openatlas/database/openatlas_class.py b/openatlas/database/openatlas_class.py index 17c4e98de..cbcf0dd92 100644 --- a/openatlas/database/openatlas_class.py +++ b/openatlas/database/openatlas_class.py @@ -45,4 +45,4 @@ def get_classes() -> list[dict[str, Any]]: WHERE c.name = ro.openatlas_class_name) y) y ORDER BY c.name; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) diff --git a/openatlas/database/overlay.py b/openatlas/database/overlay.py index 0ea708c2a..406166a35 100644 --- a/openatlas/database/overlay.py +++ b/openatlas/database/overlay.py @@ -31,7 +31,7 @@ def get_by_object(ids: list[int]) -> list[dict[str, Any]]: WHERE o.image_id IN %(image_ids)s; """, {'image_ids': tuple(ids)}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_by_id(id_: int) -> dict[str, Any]: diff --git a/openatlas/database/reference_system.py b/openatlas/database/reference_system.py index efe76c46a..3a9e9dce8 100644 --- a/openatlas/database/reference_system.py +++ b/openatlas/database/reference_system.py @@ -42,7 +42,7 @@ def get_all() -> list[dict[str, Any]]: rs.system, rs.entity_id; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def add_classes(entity_id: int, class_names: list[str]) -> None: diff --git a/openatlas/database/tools.py b/openatlas/database/tools.py index 3c095737c..ad7af02c5 100644 --- a/openatlas/database/tools.py +++ b/openatlas/database/tools.py @@ -15,4 +15,4 @@ def get_sex_types(id_: int) -> list[dict[str, Any]]: AND e.name != 'Radiocarbon'; """, {'id': id_}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) From 3e998b29e6f7ab5edde0c63fc009c7fc68df12a5 Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Fri, 29 Nov 2024 15:53:00 +0100 Subject: [PATCH 38/42] Refactor db results --- openatlas/database/checks.py | 2 +- openatlas/database/entity.py | 20 +++++++------- openatlas/database/gis.py | 6 ++-- openatlas/database/imports.py | 9 +++--- openatlas/database/link.py | 2 +- openatlas/database/network.py | 2 +- openatlas/database/openatlas_class.py | 2 +- openatlas/database/overlay.py | 2 +- openatlas/database/settings.py | 2 +- openatlas/database/type.py | 4 +-- openatlas/database/user.py | 40 +++++++++++++-------------- 11 files changed, 46 insertions(+), 45 deletions(-) diff --git a/openatlas/database/checks.py b/openatlas/database/checks.py index 7fabb9b33..f7799e2ce 100644 --- a/openatlas/database/checks.py +++ b/openatlas/database/checks.py @@ -13,7 +13,7 @@ def check_single_type_duplicates(ids: list[int]) -> list[int]: HAVING COUNT(*) > 1; """, {'ids': tuple(ids)}) - return [row['domain_id'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def get_orphaned_subunits() -> list[dict[str, Any]]: diff --git a/openatlas/database/entity.py b/openatlas/database/entity.py index a5cd09b2b..c8cfcc4fa 100644 --- a/openatlas/database/entity.py +++ b/openatlas/database/entity.py @@ -83,7 +83,7 @@ def get_overview_counts(classes: list[str]) -> dict[str, int]: GROUP BY openatlas_class_name; """, {'classes': tuple(classes)}) - return {row['name']: row['count'] for row in g.cursor.fetchall()} + return {row['name']: row['count'] for row in list(g.cursor)} def get_overview_counts_by_type( @@ -98,7 +98,7 @@ def get_overview_counts_by_type( GROUP BY openatlas_class_name; """, {'ids': tuple(ids), 'classes': tuple(classes)}) - return {row['name']: row['count'] for row in g.cursor.fetchall()} + return {row['name']: row['count'] for row in list(g.cursor)} def get_latest(classes: list[str], limit: int) -> list[dict[str, Any]]: @@ -317,7 +317,7 @@ def get_file_info() -> dict[int, dict[str, Any]]: row['entity_id']: { 'public': row['public'], 'license_holder': row['license_holder'], - 'creator': row['creator']} for row in g.cursor.fetchall()} + 'creator': row['creator']} for row in list(g.cursor)} def get_subunits_without_super(classes: list[str]) -> list[int]: @@ -329,7 +329,7 @@ def get_subunits_without_super(classes: list[str]) -> list[int]: WHERE e.openatlas_class_name IN %(classes)s; """, {'classes': tuple(classes)}) - return [row['id'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def get_roots( @@ -380,7 +380,7 @@ def get_roots( return { row['start_node']: { 'id': row['top_level'], - 'name': row['name']} for row in g.cursor.fetchall()} + 'name': row['name']} for row in list(g.cursor)} def get_linked_entities_recursive( @@ -404,7 +404,7 @@ def get_linked_entities_recursive( ) SELECT {first} FROM items; """, {'id_': id_, 'code': tuple(codes) if codes else ''}) - return [row[first] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def get_links_of_entities( @@ -461,23 +461,23 @@ def delete_reference_system_links(entity_id: int) -> None: def get_linked_entities(id_: int, codes: list[str]) -> list[int]: g.cursor.execute( """ - SELECT range_id AS result_id + SELECT range_id FROM model.link WHERE domain_id = %(id_)s AND property_code IN %(codes)s; """, {'id_': id_, 'codes': tuple(codes)}) - return [row['result_id'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def get_linked_entities_inverse(id_: int, codes: list[str]) -> list[int]: g.cursor.execute( """ - SELECT domain_id AS result_id + SELECT domain_id FROM model.link WHERE range_id = %(id_)s AND property_code IN %(codes)s; """, {'id_': id_, 'codes': tuple(codes)}) - return [row['result_id'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def delete_links_by_codes( diff --git a/openatlas/database/gis.py b/openatlas/database/gis.py index 39812aa58..55391aa14 100644 --- a/openatlas/database/gis.py +++ b/openatlas/database/gis.py @@ -1,6 +1,6 @@ import ast from collections import defaultdict -from typing import Any, Optional +from typing import Any from flask import g @@ -63,7 +63,7 @@ def get_geometry_dict(row: dict[str, Any]) -> dict[str, Any]: return geometry -def get_centroids_by_id(id_: int) -> Optional[list[dict[str, Any]]]: +def get_centroids_by_id(id_: int) -> list[dict[str, Any]]: g.cursor.execute( """ SELECT @@ -86,7 +86,7 @@ def get_centroids_by_id(id_: int) -> Optional[list[dict[str, Any]]]: for row in list(g.cursor): if data := get_centroid_dict(row): geometries.append(data) - return geometries or None + return geometries def get_centroids_by_ids(ids: list[int]) -> defaultdict[int, list[Any]]: diff --git a/openatlas/database/imports.py b/openatlas/database/imports.py index e0369366c..128cb07f5 100644 --- a/openatlas/database/imports.py +++ b/openatlas/database/imports.py @@ -35,7 +35,7 @@ def get_project_by_id(id_: int) -> dict[str, Any]: return g.cursor.fetchone() -def get_project_by_name(name: str) -> Optional[dict[str, Any]]: +def get_project_by_name(name: str) -> dict[str, Any]: g.cursor.execute( f'{SQL} WHERE p.name = %(name)s GROUP BY p.id;', {'name': name}) @@ -51,11 +51,12 @@ def delete_project(id_: int) -> None: def check_origin_ids(project_id: int, origin_ids: list[str]) -> list[str]: g.cursor.execute( """ - SELECT origin_id FROM import.entity + SELECT origin_id + FROM import.entity WHERE project_id = %(project_id)s AND origin_id IN %(ids)s; """, {'project_id': project_id, 'ids': tuple(set(origin_ids))}) - return [row['origin_id'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def get_id_from_origin_id(project_id: int, origin_id: str) -> list[str]: @@ -75,7 +76,7 @@ def check_duplicates(class_: str, names: list[str]) -> list[str]: WHERE openatlas_class_name = %(class_)s AND LOWER(name) IN %(names)s; """, {'class_': class_, 'names': tuple(names)}) - return [row['name'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def update_project(id_: int, name: str, description: Optional[str]) -> None: diff --git a/openatlas/database/link.py b/openatlas/database/link.py index 091b61206..fad43fd51 100644 --- a/openatlas/database/link.py +++ b/openatlas/database/link.py @@ -75,7 +75,7 @@ def get_entity_ids_by_type_ids(type_ids: list[int]) -> list[int]: ORDER BY id; """, {'type_ids': tuple(type_ids)}) - return [row[0] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] def delete_(id_: int) -> None: diff --git a/openatlas/database/network.py b/openatlas/database/network.py index eec4c1157..d98e2ddf5 100644 --- a/openatlas/database/network.py +++ b/openatlas/database/network.py @@ -51,4 +51,4 @@ def get_object_mapping() -> dict[int, int]: JOIN model.entity e2 ON l.range_id = e2.id AND e.openatlas_class_name = 'place'; """) - return {row['range_id']: row['id'] for row in g.cursor.fetchall()} + return {row['range_id']: row['id'] for row in list(g.cursor)} diff --git a/openatlas/database/openatlas_class.py b/openatlas/database/openatlas_class.py index cbcf0dd92..0e3ceabd8 100644 --- a/openatlas/database/openatlas_class.py +++ b/openatlas/database/openatlas_class.py @@ -11,7 +11,7 @@ def get_class_count() -> dict[str, int]: LEFT JOIN model.entity e ON oc.name = e.openatlas_class_name GROUP BY oc.name; """) - return {row['name']: row['count'] for row in g.cursor.fetchall()} + return {row['name']: row['count'] for row in list(g.cursor)} def get_classes() -> list[dict[str, Any]]: diff --git a/openatlas/database/overlay.py b/openatlas/database/overlay.py index 406166a35..d099e84b3 100644 --- a/openatlas/database/overlay.py +++ b/openatlas/database/overlay.py @@ -42,7 +42,7 @@ def get_by_id(id_: int) -> dict[str, Any]: WHERE id = %(id)s; """, {'id': id_}) - return dict(g.cursor.fetchone()) + return g.cursor.fetchone() def remove(id_: int) -> None: diff --git a/openatlas/database/settings.py b/openatlas/database/settings.py index 7b9220e94..06383e57e 100644 --- a/openatlas/database/settings.py +++ b/openatlas/database/settings.py @@ -7,7 +7,7 @@ def get_settings(cursor: Optional[DictCursor] = None) -> dict[str, str]: cursor = cursor or g.cursor cursor.execute('SELECT name, value FROM web.settings;') - return {row['name']: row['value'] for row in cursor.fetchall()} + return {row['name']: row['value'] for row in list(cursor)} def update(field_name: str, value: Any) -> None: diff --git a/openatlas/database/type.py b/openatlas/database/type.py index bec6c3c40..835dd32ea 100644 --- a/openatlas/database/type.py +++ b/openatlas/database/type.py @@ -52,7 +52,7 @@ def get_types(with_count: bool) -> list[dict[str, Any]]: ORDER BY e.name; """ g.cursor.execute(sql) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_hierarchies() -> list[dict[str, Any]]: @@ -61,7 +61,7 @@ def get_hierarchies() -> list[dict[str, Any]]: SELECT id, name, category, multiple, directional, required FROM web.hierarchy; """) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def set_required(id_: int) -> None: diff --git a/openatlas/database/user.py b/openatlas/database/user.py index c873880ac..3e109455f 100644 --- a/openatlas/database/user.py +++ b/openatlas/database/user.py @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Any from flask import g @@ -71,7 +71,7 @@ def update_language(user_id: int, value: str) -> None: def get_all() -> list[dict[str, Any]]: g.cursor.execute(f'{SQL} ORDER BY username;') - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_bookmarks(user_id: int) -> list[int]: @@ -82,40 +82,40 @@ def get_bookmarks(user_id: int) -> list[int]: WHERE user_id = %(user_id)s; """, {'user_id': user_id}) - return [row['entity_id'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] -def get_by_id(user_id: int) -> Optional[dict[str, Any]]: +def get_by_id(user_id: int) -> dict[str, Any]: g.cursor.execute(f'{SQL} WHERE u.id = %(id)s;', {'id': user_id}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else None + return g.cursor.fetchone() -def get_by_reset_code(code: str) -> Optional[dict[str, Any]]: +def get_by_reset_code(code: str) -> dict[str, Any]: g.cursor.execute( f'{SQL} WHERE u.password_reset_code = %(code)s;', {'code': code}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else None + return g.cursor.fetchone() -def get_by_email(email: str) -> Optional[dict[str, Any]]: +def get_by_email(email: str) -> dict[str, Any]: g.cursor.execute( f'{SQL} WHERE LOWER(u.email) = LOWER(%(email)s);', {'email': email}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else None + return g.cursor.fetchone() -def get_by_username(username: str) -> Optional[dict[str, Any]]: +def get_by_username(username: str) -> dict[str, Any]: g.cursor.execute( f'{SQL} WHERE LOWER(u.username) = LOWER(%(username)s);', {'username': username}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else None + return g.cursor.fetchone() -def get_by_unsubscribe_code(code: str) -> Optional[dict[str, Any]]: +def get_by_unsubscribe_code(code: str) -> dict[str, Any]: g.cursor.execute( f'{SQL} WHERE u.unsubscribe_code = %(code)s;', {'code': code}) - return dict(g.cursor.fetchone()) if g.cursor.rowcount else None + return g.cursor.fetchone() def get_activities( @@ -143,7 +143,7 @@ def get_activities( 'id': user_id, 'action': action, 'entity_id': entity_id}) - return g.cursor.fetchall() + return list(g.cursor) def get_created_entities_count(user_id: int) -> int: @@ -192,7 +192,7 @@ def delete(id_: int) -> None: def get_users_for_form() -> list[tuple[int, str]]: g.cursor.execute('SELECT id, username FROM web.user ORDER BY username;') - return [(row['id'], row['username']) for row in g.cursor.fetchall()] + return [(row['id'], row['username']) for row in list(g.cursor)] def insert_bookmark(user_id: int, entity_id: int) -> None: @@ -221,7 +221,7 @@ def get_settings(user_id: int) -> list[dict[str, Any]]: WHERE user_id = %(user_id)s; """, {'user_id': user_id}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_notes_by_entity_id( @@ -235,7 +235,7 @@ def get_notes_by_entity_id( AND (public IS TRUE or user_id = %(user_id)s); """, {'entity_id': entity_id, 'user_id': user_id}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_notes_by_user_id(user_id: int) -> list[dict[str, Any]]: @@ -246,7 +246,7 @@ def get_notes_by_user_id(user_id: int) -> list[dict[str, Any]]: WHERE user_id = %(user_id)s; """, {'user_id': user_id}) - return [dict(row) for row in g.cursor.fetchall()] + return list(g.cursor) def get_note_by_id(id_: int) -> dict[str, Any]: @@ -257,7 +257,7 @@ def get_note_by_id(id_: int) -> dict[str, Any]: WHERE id = %(id)s; """, {'id': id_}) - return dict(g.cursor.fetchone()) + return g.cursor.fetchone() def insert_note( @@ -302,4 +302,4 @@ def get_user_entities(id_: int) -> list[int]: AND l.action = 'insert'; """, {'user_id': id_}) - return [row['id'] for row in g.cursor.fetchall()] + return [row[0] for row in list(g.cursor)] From c910ad51e38f4c6126677763d06840e433575e1f Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Fri, 29 Nov 2024 16:41:36 +0100 Subject: [PATCH 39/42] Minor formatting adaptions --- openatlas/forms/form.py | 2 +- openatlas/views/entity_index.py | 6 ++---- openatlas/views/imports.py | 10 ++++------ 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/openatlas/forms/form.py b/openatlas/forms/form.py index 1dc3ad627..f23742888 100644 --- a/openatlas/forms/form.py +++ b/openatlas/forms/form.py @@ -64,7 +64,7 @@ class Form(FlaskForm): def get_annotation_form( image_id: int, entity: Optional[Entity] = None, - insert: Optional[bool] = True) -> FlaskForm: + insert: Optional[bool] = True) -> Any: class Form(FlaskForm): text = TextAreaField(_('annotation')) if insert: diff --git a/openatlas/views/entity_index.py b/openatlas/views/entity_index.py index b7f0a76e7..f732a3537 100644 --- a/openatlas/views/entity_index.py +++ b/openatlas/views/entity_index.py @@ -105,10 +105,8 @@ def file_preview(entity_id: int) -> str: f"{g.settings['iiif_url']}{entity_id}{ext}" \ f"/full/!100,100/0/default.jpg" return f"" - if icon_path := get_file_path( - entity_id, - app.config['IMAGE_SIZE']['table']): - url = url_for('display_file', filename=icon_path.name, size=size) + if icon := get_file_path(entity_id, app.config['IMAGE_SIZE']['table']): + url = url_for('display_file', filename=icon.name, size=size) return f"" if g.settings['image_processing']: path = get_file_path(entity_id) diff --git a/openatlas/views/imports.py b/openatlas/views/imports.py index d26f4a14d..58f6420d7 100644 --- a/openatlas/views/imports.py +++ b/openatlas/views/imports.py @@ -359,14 +359,12 @@ def check_data_for_table_representation( origin_ids.append(str(row['id'])) table_data.append(table_row) checked_data.append(checked_row) - if form.duplicate.data: - if duplicates := check_duplicates(class_, names): - checks.set_warning('possible_duplicates', ', '.join(duplicates)) + if form.duplicate.data and (duplicates := check_duplicates(class_, names)): + checks.set_warning('possible_duplicates', ', '.join(duplicates)) if doubles := [i for i, count in Counter(origin_ids).items() if count > 1]: checks.set_error('double_ids_in_import', ', '.join(doubles)) - if origin_ids: - if existing := get_origin_ids(project, origin_ids): - checks.set_error('ids_already_in_database', ', '.join(existing)) + if origin_ids and (existing := get_origin_ids(project, origin_ids)): + checks.set_error('ids_already_in_database', ', '.join(existing)) if 'openatlas_class' in headers: entity_dict: dict[str, Any] = { row.get('id'): row['openatlas_class'].replace(' ', '_') From d8de9fd302e64851348ecd974d26b8ebbfbb3c4a Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Sat, 30 Nov 2024 14:29:31 +0100 Subject: [PATCH 40/42] coverage --- tests/test_api.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index 35922f0e3..66f85bb0d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -289,6 +289,13 @@ def test_api(self) -> None: names = [place.name, feature.name, 'Bar'] for item in rv['results']: assert item['features'][0]['properties']['title'] in names + rv = c.get( + url_for( + 'api_04.linked_entities_by_properties_recursive', + id_=place.id, + properties='all')) + rv = rv.get_json() + assert rv['results'][0]['features'][0]['properties'] # Test Entities endpoints for rv in [ From c2f15a758fff3b3bdd2a6c9071203e8f4b278113 Mon Sep 17 00:00:00 2001 From: Bernhard Koschicek-Krombholz Date: Sat, 30 Nov 2024 14:47:22 +0100 Subject: [PATCH 41/42] removed refactor todo --- openatlas/api/endpoints/parser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openatlas/api/endpoints/parser.py b/openatlas/api/endpoints/parser.py index 8d55d1b9c..dc425b7aa 100644 --- a/openatlas/api/endpoints/parser.py +++ b/openatlas/api/endpoints/parser.py @@ -32,7 +32,6 @@ class Parser: - # Todo: Group attributes to reduce the long list download = None count = None locale = None From ebe5a1620a60b9e686a9e6929803fcd0f2673daa Mon Sep 17 00:00:00 2001 From: Alexander Watzinger Date: Sat, 30 Nov 2024 16:17:00 +0100 Subject: [PATCH 42/42] API tests: removed workaround and formatting --- tests/base.py | 1 - tests/test_api.py | 55 +++++++++++++++++++---------------------------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/tests/base.py b/tests/base.py index a2726d7e6..d4beb539f 100644 --- a/tests/base.py +++ b/tests/base.py @@ -17,7 +17,6 @@ def setUp(self) -> None: app.config.from_pyfile('testing.py') self.setup_database() self.client = app.test_client() - self.app = self.client # Remove after updated API tests with app.app_context(): self.client.post( url_for('login'), diff --git a/tests/test_api.py b/tests/test_api.py index 66f85bb0d..6b657f154 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -127,9 +127,10 @@ def test_api(self) -> None: rv = c.get(url_for('api.licensed_file_overview')) assert len(rv.get_json().keys()) == 5 - rv = c.get(url_for( - 'api_04.network_visualisation', - exclude_system_classes='type')) + rv = c.get( + url_for( + 'api_04.network_visualisation', + exclude_system_classes='type')) rv = rv.get_json() assert len(rv['results']) == 65 rv = c.get( @@ -143,8 +144,8 @@ def test_api(self) -> None: assert len(rv['results']) == 154 for rv in [ - c.get(url_for('api_04.geometric_entities')), - c.get(url_for('api_04.geometric_entities', download=True))]: + c.get(url_for('api_04.geometric_entities')), + c.get(url_for('api_04.geometric_entities', download=True))]: rv = rv.get_json() assert rv['features'][0]['geometry']['coordinates'] assert rv['features'][0]['properties']['id'] @@ -193,19 +194,15 @@ def test_api(self) -> None: assert links['identifier'] == 'https://www.geonames.org/2761369' assert links['referenceSystem'] == 'GeoNames' assert rv['geometry']['type'] == 'GeometryCollection' - assert (rv['geometry']['geometries'][1]['coordinates'] - == [16.37069611, 48.208571233]) + assert rv['geometry']['geometries'][1]['coordinates'] \ + == [16.37069611, 48.208571233] assert rv['depictions'][0]['@id'] assert rv['depictions'][0]['title'] == 'Picture with a License' assert rv['depictions'][0]['license'] == 'Public domain' assert rv['depictions'][0]['url'] rv = c.get( - url_for( - 'api_04.entity', - id_=place.id, - format='lpx', - locale='de')) + url_for('api_04.entity', id_=place.id, format='lpx', locale='de')) assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()['features'][0] @@ -440,13 +437,13 @@ def test_api(self) -> None: # ---Type Endpoints--- for rv in [ - c.get(url_for('api_04.type_overview')), - c.get(url_for('api_04.type_overview', download=True))]: + c.get(url_for('api_04.type_overview')), + c.get(url_for('api_04.type_overview', download=True))]: assert 'Austria' in str(rv.get_json()) for rv in [ - c.get(url_for('api_04.type_by_view_class')), - c.get(url_for('api_04.type_by_view_class', download=True))]: + c.get(url_for('api_04.type_by_view_class')), + c.get(url_for('api_04.type_by_view_class', download=True))]: assert 'Boundary Mark' in str(rv.get_json()) rv = c.get(url_for('api_04.type_tree')) assert rv.get_json()['typeTree'] @@ -588,8 +585,9 @@ def test_api(self) -> None: assert rv.get_json()['pagination']['entities'] == count for rv in [ - c.get(url_for('api_04.subunits', id_=place.id)), - c.get(url_for('api_04.subunits', id_=place.id, download=True))]: + c.get(url_for('api_04.subunits', id_=place.id)), + c.get( + url_for('api_04.subunits', id_=place.id, download=True))]: assert 'application/json' in rv.headers.get('Content-Type') rv = rv.get_json()[str(place.id)] for item in rv: @@ -631,18 +629,11 @@ def test_api(self) -> None: assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') rv = c.get( - url_for( - 'api_04.subunits', - id_=place.id, - centroid=True)) + url_for('api_04.subunits', id_=place.id, centroid=True)) assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') rv = c.get( - url_for( - 'api_04.view_class', - class_='all', - centroid=True, - limit=0)) + url_for('api_04.view_class', class_='all', centroid=True, limit=0)) assert b'(autogenerated)' in rv.data assert 'application/json' in rv.headers.get('Content-Type') @@ -655,8 +646,8 @@ def test_api(self) -> None: # Test Error Handling for rv in [ - c.get(url_for('api_04.entity', id_=233423424)), - c.get(url_for('api_04.cidoc_class', class_='E18', last=1231))]: + c.get(url_for('api_04.entity', id_=233423424)), + c.get(url_for('api_04.cidoc_class', class_='E18', last=1231))]: rv = rv.get_json() assert 'Entity does not exist' in rv['title'] @@ -723,8 +714,7 @@ def test_api(self) -> None: url_for( 'api_04.view_class', class_='place', - search={ - "typeName": [{"operator": "notEqual", "values": []}]})) + search={"typeName": [{"operator": "notEqual", "values": []}]})) assert 'No search value' in rv.get_json()['title'] rv = c.get( @@ -762,8 +752,7 @@ def test_api(self) -> None: rv = c.get(url_for('api_04.type_entities_all', id_=1234)) assert 'Entity is not a type' in rv.get_json()['title'] - rv = c.get( - url_for('api_04.system_class_count', type_id=999)) + rv = c.get(url_for('api_04.system_class_count', type_id=999)) assert 'Entity is not a type' in rv.get_json()['title'] rv = c.get(