class CompaniesHouseCompany(BaseESModel): """Elasticsearch representation of CompaniesHouseCompany model.""" id = Keyword() company_category = fields.NormalizedKeyword() company_number = fields.NormalizedKeyword() company_status = fields.NormalizedKeyword() incorporation_date = Date() name = Text(fields={ 'keyword': fields.NormalizedKeyword(), 'trigram': fields.TrigramText(), }, ) registered_address = fields.address_field(index_country=False) # TODO: delete once the migration to nested registered address is complete registered_address_1 = Text() registered_address_2 = Text() registered_address_town = fields.NormalizedKeyword() registered_address_county = Text() registered_address_postcode = Text( copy_to='registered_address_postcode_trigram') registered_address_postcode_trigram = fields.TrigramText() registered_address_country = fields.id_name_field() sic_code_1 = Text() sic_code_2 = Text() sic_code_3 = Text() sic_code_4 = Text() uri = Text() COMPUTED_MAPPINGS = { 'registered_address': partial(dict_utils.address_dict, prefix='registered_address'), } MAPPINGS = { 'id': str, # TODO: delete once the migration to nested registered address is complete 'registered_address_country': dict_utils.id_name_dict, } SEARCH_FIELDS = ( 'name', # to find 2-letter words 'name.trigram', 'company_number', 'registered_address.postcode.trigram', ) class Meta: """Default document meta data.""" doc_type = DOC_TYPE class Index: doc_type = DOC_TYPE
def test_address_field(index_country, expected_mapping): """Test for address_field.""" field_mapping = address_field(index_country=index_country) assert field_mapping.to_dict() == expected_mapping
class Company(BaseESModel): """Elasticsearch representation of Company model.""" id = Keyword() archived = Boolean() archived_by = fields.contact_or_adviser_field() archived_on = Date() archived_reason = Text() business_type = fields.id_name_field() companies_house_data = fields.ch_company_field() company_number = fields.NormalizedKeyword() created_on = Date() description = fields.EnglishText() employee_range = fields.id_name_field() export_experience_category = fields.id_name_field() export_to_countries = fields.id_name_field() future_interest_countries = fields.id_name_field() global_headquarters = fields.id_name_field() headquarter_type = fields.id_name_field() modified_on = Date() name = Text(fields={ 'keyword': fields.NormalizedKeyword(), 'trigram': fields.TrigramText(), }, ) reference_code = fields.NormalizedKeyword() sector = fields.sector_field() address = fields.address_field() registered_address = fields.address_field() # TODO: delete once the migration to address and registered address is complete registered_address_1 = Text() registered_address_2 = Text() registered_address_town = fields.NormalizedKeyword() registered_address_county = Text() registered_address_country = fields.id_name_partial_field() registered_address_postcode = Text(copy_to=[ 'registered_address_postcode_trigram', ], ) registered_address_postcode_trigram = fields.TrigramText() trading_address_1 = Text() trading_address_2 = Text() trading_address_town = fields.NormalizedKeyword() trading_address_county = Text() trading_address_postcode = Text( copy_to=['trading_address_postcode_trigram'], ) trading_address_postcode_trigram = fields.TrigramText() trading_address_country = fields.id_name_partial_field() trading_names = Text(copy_to=['trading_names_trigram'], ) trading_names_trigram = fields.TrigramText() turnover_range = fields.id_name_field() uk_region = fields.id_name_field() uk_based = Boolean() vat_number = Keyword(index=False) duns_number = Keyword() website = Text() suggest = Completion() COMPUTED_MAPPINGS = { 'suggest': get_suggestions, 'address': partial(dict_utils.address_dict, prefix='address'), 'registered_address': partial(dict_utils.address_dict, prefix='registered_address'), } MAPPINGS = { 'archived_by': dict_utils.contact_or_adviser_dict, 'business_type': dict_utils.id_name_dict, 'companies_house_data': dict_utils.ch_company_dict, 'employee_range': dict_utils.id_name_dict, 'export_experience_category': dict_utils.id_name_dict, 'export_to_countries': lambda col: [dict_utils.id_name_dict(c) for c in col.all()], 'future_interest_countries': lambda col: [dict_utils.id_name_dict(c) for c in col.all()], 'global_headquarters': dict_utils.id_name_dict, 'headquarter_type': dict_utils.id_name_dict, 'sector': dict_utils.sector_dict, # TODO: delete once the migration to address and registered address is complete 'registered_address_country': dict_utils.id_name_dict, 'trading_address_country': dict_utils.id_name_dict, 'turnover_range': dict_utils.id_name_dict, 'uk_based': bool, 'uk_region': dict_utils.id_name_dict, } SEARCH_FIELDS = ( 'id', 'name', # to find 2-letter words 'name.trigram', 'company_number', 'trading_names', # to find 2-letter words 'trading_names_trigram', 'reference_code', 'address.country.name.trigram', 'address.postcode.trigram', 'registered_address.country.name.trigram', 'registered_address.postcode.trigram', ) class Meta: """Default document meta data.""" doc_type = DOC_TYPE class Index: doc_type = DOC_TYPE
class Company(BaseESModel): """Elasticsearch representation of Company model.""" id = Keyword() archived = Boolean() archived_by = fields.contact_or_adviser_field() archived_on = Date() archived_reason = Text() business_type = fields.id_name_field() company_number = fields.NormalizedKeyword() created_on = Date() description = fields.EnglishText() employee_range = fields.id_name_field() export_experience_category = fields.id_name_field() export_to_countries = fields.id_name_field() future_interest_countries = fields.id_name_field() global_headquarters = fields.id_name_field() headquarter_type = fields.id_name_field() modified_on = Date() name = Text(fields={ 'keyword': fields.NormalizedKeyword(), 'trigram': fields.TrigramText(), }, ) reference_code = fields.NormalizedKeyword() sector = fields.sector_field() address = fields.address_field() registered_address = fields.address_field() one_list_group_global_account_manager = _adviser_field_with_indexed_id() trading_names = fields.TextWithTrigram() turnover_range = fields.id_name_field() uk_region = fields.id_name_field() uk_based = Boolean() uk_address_postcode = fields.PostcodeKeyword() uk_registered_address_postcode = fields.PostcodeKeyword() vat_number = Keyword(index=False) duns_number = Keyword() website = Text() suggest = Completion(contexts=[ { 'name': 'country', 'type': 'category', }, ], ) latest_interaction_date = Date() COMPUTED_MAPPINGS = { 'suggest': get_suggestions, 'address': partial(dict_utils.address_dict, prefix='address'), 'registered_address': partial(dict_utils.address_dict, prefix='registered_address'), 'one_list_group_global_account_manager': dict_utils.computed_field_function( 'get_one_list_group_global_account_manager', dict_utils.contact_or_adviser_dict, ), 'latest_interaction_date': lambda obj: obj.latest_interaction_date, 'uk_address_postcode': lambda obj: obj.address_postcode if obj.uk_based else '', 'uk_registered_address_postcode': lambda obj: obj.registered_address_postcode if obj.uk_based else '', } MAPPINGS = { 'archived_by': dict_utils.contact_or_adviser_dict, 'business_type': dict_utils.id_name_dict, 'employee_range': dict_utils.id_name_dict, 'export_experience_category': dict_utils.id_name_dict, 'export_to_countries': lambda col: [dict_utils.id_name_dict(c) for c in col.all()], 'future_interest_countries': lambda col: [dict_utils.id_name_dict(c) for c in col.all()], 'global_headquarters': dict_utils.id_name_dict, 'headquarter_type': dict_utils.id_name_dict, 'sector': dict_utils.sector_dict, 'turnover_range': dict_utils.id_name_dict, 'uk_based': bool, 'uk_region': dict_utils.id_name_dict, } SEARCH_FIELDS = ( 'id', 'name', # to find 2-letter words 'name.trigram', 'company_number', 'trading_names', # to find 2-letter words 'trading_names.trigram', 'reference_code', 'address.country.name.trigram', 'address.postcode.trigram', 'registered_address.country.name.trigram', 'registered_address.postcode.trigram', ) class Meta: """Default document meta data.""" doc_type = DOC_TYPE class Index: doc_type = DOC_TYPE
def test_address_field(): """Test for address_field.""" field_mapping = address_field() assert field_mapping.to_dict() == { 'type': 'object', 'properties': { 'line_1': { 'type': 'text', 'fields': { 'trigram': { 'type': 'text', 'analyzer': 'trigram_analyzer', }, }, }, 'line_2': { 'type': 'text', 'fields': { 'trigram': { 'type': 'text', 'analyzer': 'trigram_analyzer', }, }, }, 'town': { 'type': 'text', 'fields': { 'trigram': { 'type': 'text', 'analyzer': 'trigram_analyzer', }, }, }, 'county': { 'type': 'text', 'fields': { 'trigram': { 'type': 'text', 'analyzer': 'trigram_analyzer', }, }, }, 'area': { 'type': 'object', 'properties': { 'id': { 'type': 'keyword' }, 'name': { 'type': 'text', 'fields': { 'trigram': { 'type': 'text', 'analyzer': 'trigram_analyzer', }, }, }, }, }, 'postcode': { 'type': 'text', 'fields': { 'trigram': { 'type': 'text', 'analyzer': 'trigram_analyzer', }, }, }, 'country': { 'type': 'object', 'properties': { 'id': { 'type': 'keyword' }, 'name': { 'type': 'text', 'fields': { 'trigram': { 'type': 'text', 'analyzer': 'trigram_analyzer', }, }, }, }, }, }, }
class Company(BaseSearchModel): """ OpenSearch representation of Company model. """ id = Keyword() archived = Boolean() archived_by = fields.contact_or_adviser_field() archived_on = Date() archived_reason = Text() business_type = fields.id_name_field() company_number = fields.NormalizedKeyword() created_on = Date() description = fields.EnglishText() employee_range = fields.id_name_field() export_experience_category = fields.id_name_field() export_to_countries = fields.id_name_field() future_interest_countries = fields.id_name_field() global_headquarters = fields.id_name_field() headquarter_type = fields.id_name_field() modified_on = Date() name = Text( fields={ 'keyword': fields.NormalizedKeyword(), 'trigram': fields.TrigramText(), }, ) reference_code = fields.NormalizedKeyword() sector = fields.sector_field() address = fields.address_field() registered_address = fields.address_field() one_list_group_global_account_manager = _adviser_field_with_indexed_id() trading_names = fields.TextWithTrigram() turnover_range = fields.id_name_field() uk_region = fields.id_name_field() uk_based = Boolean() uk_address_postcode = fields.PostcodeKeyword() uk_registered_address_postcode = fields.PostcodeKeyword() vat_number = Keyword(index=False) duns_number = Keyword() website = Text() latest_interaction_date = Date() export_segment = Text() export_sub_segment = Text() COMPUTED_MAPPINGS = { 'address': partial(dict_utils.address_dict, prefix='address'), 'registered_address': partial(dict_utils.address_dict, prefix='registered_address'), 'one_list_group_global_account_manager': dict_utils.computed_field_function( 'get_one_list_group_global_account_manager', dict_utils.contact_or_adviser_dict, ), 'export_to_countries': lambda obj: [ dict_utils.id_name_dict(o.country) for o in obj.export_countries.all() if o.status == CompanyExportCountry.Status.CURRENTLY_EXPORTING ], 'future_interest_countries': lambda obj: [ dict_utils.id_name_dict(o.country) for o in obj.export_countries.all() if o.status == CompanyExportCountry.Status.FUTURE_INTEREST ], 'latest_interaction_date': lambda obj: obj.latest_interaction_date, 'uk_address_postcode': lambda obj: obj.address_postcode if obj.uk_based else '', 'uk_registered_address_postcode': lambda obj: obj.registered_address_postcode if obj.uk_based else '', } MAPPINGS = { 'archived_by': dict_utils.contact_or_adviser_dict, 'business_type': dict_utils.id_name_dict, 'employee_range': dict_utils.id_name_dict, 'export_experience_category': dict_utils.id_name_dict, 'global_headquarters': dict_utils.id_name_dict, 'headquarter_type': dict_utils.id_name_dict, 'sector': dict_utils.sector_dict, 'turnover_range': dict_utils.id_name_dict, 'uk_based': bool, 'uk_region': dict_utils.id_name_dict, } SEARCH_FIELDS = ( 'id', 'name', # to find 2-letter words 'name.trigram', 'company_number', 'trading_names', # to find 2-letter words 'trading_names.trigram', 'reference_code', 'sector.name', 'address.line_1.trigram', 'address.line_2.trigram', 'address.town.trigram', 'address.county.trigram', 'address.area.name.trigram', 'address.postcode', 'address.country.name.trigram', 'registered_address.line_1.trigram', 'registered_address.line_2.trigram', 'registered_address.town.trigram', 'registered_address.county.trigram', 'registered_address.area.name.trigram', 'registered_address.postcode', 'registered_address.country.name.trigram', )