mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-08-14 04:40:36 +03:00
80 lines
2.9 KiB
Python
80 lines
2.9 KiB
Python
''' Utils for OSS models. '''
|
|
|
|
from typing import Optional
|
|
|
|
from cctext import extract_entities
|
|
|
|
from apps.rsform.models import (
|
|
DELETED_ALIAS,
|
|
Constituenta,
|
|
RSFormCached,
|
|
extract_globals,
|
|
replace_entities,
|
|
replace_globals
|
|
)
|
|
|
|
CstMapping = dict[str, Optional[Constituenta]]
|
|
CstSubstitution = list[tuple[Constituenta, Constituenta]]
|
|
|
|
|
|
def cst_mapping_to_alias(mapping: CstMapping) -> dict[str, str]:
|
|
''' Convert constituenta mapping to alias mapping. '''
|
|
result: dict[str, str] = {}
|
|
for alias, cst in mapping.items():
|
|
if cst is None:
|
|
result[alias] = DELETED_ALIAS
|
|
else:
|
|
result[alias] = cst.alias
|
|
return result
|
|
|
|
|
|
def map_cst_update_data(cst: Constituenta, data: dict, old_data: dict, mapping: dict[str, str]) -> dict:
|
|
''' Map data for constituenta update. '''
|
|
new_data = {}
|
|
if 'term_forms' in data:
|
|
if old_data['term_forms'] == cst.term_forms:
|
|
new_data['term_forms'] = data['term_forms']
|
|
if 'convention' in data:
|
|
new_data['convention'] = data['convention']
|
|
if 'definition_formal' in data:
|
|
new_data['definition_formal'] = replace_globals(data['definition_formal'], mapping)
|
|
if 'term_raw' in data:
|
|
if replace_entities(old_data['term_raw'], mapping) == cst.term_raw:
|
|
new_data['term_raw'] = replace_entities(data['term_raw'], mapping)
|
|
if 'definition_raw' in data:
|
|
if replace_entities(old_data['definition_raw'], mapping) == cst.definition_raw:
|
|
new_data['definition_raw'] = replace_entities(data['definition_raw'], mapping)
|
|
return new_data
|
|
|
|
|
|
def extract_data_references(data: dict, old_data: dict) -> set[str]:
|
|
''' Extract references from data. '''
|
|
result: set[str] = set()
|
|
if 'definition_formal' in data:
|
|
result.update(extract_globals(data['definition_formal']))
|
|
result.update(extract_globals(old_data['definition_formal']))
|
|
if 'term_raw' in data:
|
|
result.update(extract_entities(data['term_raw']))
|
|
result.update(extract_entities(old_data['term_raw']))
|
|
if 'definition_raw' in data:
|
|
result.update(extract_entities(data['definition_raw']))
|
|
result.update(extract_entities(old_data['definition_raw']))
|
|
return result
|
|
|
|
|
|
def create_dependant_mapping(source: RSFormCached, cst_list: list[Constituenta]) -> CstMapping:
|
|
''' Create mapping for dependant Constituents. '''
|
|
if len(cst_list) == len(source.cache.constituents):
|
|
return {c.alias: c for c in source.cache.constituents}
|
|
inserted_aliases = [cst.alias for cst in cst_list]
|
|
depend_aliases: set[str] = set()
|
|
for item in cst_list:
|
|
depend_aliases.update(item.extract_references())
|
|
depend_aliases.difference_update(inserted_aliases)
|
|
alias_mapping: CstMapping = {}
|
|
for alias in depend_aliases:
|
|
cst = source.cache.by_alias.get(alias)
|
|
if cst is not None:
|
|
alias_mapping[alias] = cst
|
|
return alias_mapping
|