fix(source-cards): scope counters to OPK organizations
This commit is contained in:
@@ -34,6 +34,7 @@ ACTIVE_JOB_STATUSES = [JobStatus.PENDING, JobStatus.STARTED, JobStatus.RETRY]
|
|||||||
STALE_ACTIVE_MAX_AGE_MINUTES = 4 * 60
|
STALE_ACTIVE_MAX_AGE_MINUTES = 4 * 60
|
||||||
STALE_PENDING_MAX_AGE_MINUTES = 24 * 60
|
STALE_PENDING_MAX_AGE_MINUTES = 24 * 60
|
||||||
SOURCE_CARD_STATS_CACHE_TIMEOUT_SECONDS = 7 * 24 * 60 * 60
|
SOURCE_CARD_STATS_CACHE_TIMEOUT_SECONDS = 7 * 24 * 60 * 60
|
||||||
|
SOURCE_CARD_STATS_CACHE_SCHEMA_VERSION = 2
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
@@ -665,7 +666,10 @@ class SourceCardService:
|
|||||||
version = get_source_data_cache_version()
|
version = get_source_data_cache_version()
|
||||||
slugs = ",".join(definition.slug for definition in definitions)
|
slugs = ",".join(definition.slug for definition in definitions)
|
||||||
slugs_digest = blake2s(slugs.encode(), digest_size=8).hexdigest()
|
slugs_digest = blake2s(slugs.encode(), digest_size=8).hexdigest()
|
||||||
return f"parsers:source_cards:aggregate_stats:{version}:{slugs_digest}"
|
return (
|
||||||
|
"parsers:source_cards:aggregate_stats:"
|
||||||
|
f"v{SOURCE_CARD_STATS_CACHE_SCHEMA_VERSION}:{version}:{slugs_digest}"
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _build_item_stats_by_code(
|
def _build_item_stats_by_code(
|
||||||
@@ -688,7 +692,10 @@ class SourceCardService:
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
rows = (
|
rows = (
|
||||||
OrganizationSourceRecord.objects.filter(source__in=unique_sources)
|
OrganizationSourceRecord.objects.filter(
|
||||||
|
source__in=unique_sources,
|
||||||
|
extension__organization__opk_registry_membership=True,
|
||||||
|
)
|
||||||
.order_by()
|
.order_by()
|
||||||
.values("source")
|
.values("source")
|
||||||
.annotate(
|
.annotate(
|
||||||
@@ -762,6 +769,7 @@ class SourceCardService:
|
|||||||
|
|
||||||
rows = (
|
rows = (
|
||||||
OrganizationSourceExtension.objects.filter(
|
OrganizationSourceExtension.objects.filter(
|
||||||
|
organization__opk_registry_membership=True,
|
||||||
source_group__in=source_groups,
|
source_group__in=source_groups,
|
||||||
records_count__gt=0,
|
records_count__gt=0,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ def _save_source_record(
|
|||||||
organization_name: str = "",
|
organization_name: str = "",
|
||||||
title: str = "",
|
title: str = "",
|
||||||
payload: dict | None = None,
|
payload: dict | None = None,
|
||||||
|
opk_registry_membership: bool = True,
|
||||||
) -> None:
|
) -> None:
|
||||||
payload = dict(payload or {})
|
payload = dict(payload or {})
|
||||||
if inn:
|
if inn:
|
||||||
@@ -46,6 +47,7 @@ def _save_source_record(
|
|||||||
create_directory_organization(
|
create_directory_organization(
|
||||||
name=organization_name or title or external_id,
|
name=organization_name or title or external_id,
|
||||||
inn=inn,
|
inn=inn,
|
||||||
|
opk_registry_membership=opk_registry_membership,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
rn_key = organization_name or title or external_id
|
rn_key = organization_name or title or external_id
|
||||||
@@ -53,7 +55,10 @@ def _save_source_record(
|
|||||||
payload.setdefault("rn", rn)
|
payload.setdefault("rn", rn)
|
||||||
get_or_create_directory_organization(
|
get_or_create_directory_organization(
|
||||||
rn=rn,
|
rn=rn,
|
||||||
defaults={"name": organization_name or title or external_id},
|
defaults={
|
||||||
|
"name": organization_name or title or external_id,
|
||||||
|
"opk_registry_membership": opk_registry_membership,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
OrganizationSourceIngestionService.save_records(
|
OrganizationSourceIngestionService.save_records(
|
||||||
source=source,
|
source=source,
|
||||||
@@ -441,6 +446,33 @@ class SourceCardServiceDatabaseTest(TestCase):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
SourceCardService.clear_cache()
|
SourceCardService.clear_cache()
|
||||||
|
|
||||||
|
def test_source_card_counters_include_only_opk_organizations(self):
|
||||||
|
_save_source_record(
|
||||||
|
source=ParserLoadLog.Source.PROCUREMENTS_44FZ,
|
||||||
|
external_id="opk-notice",
|
||||||
|
inn="7701234567",
|
||||||
|
organization_name="Организация ОПК",
|
||||||
|
title="Закупка организации ОПК",
|
||||||
|
)
|
||||||
|
_save_source_record(
|
||||||
|
source=ParserLoadLog.Source.PROCUREMENTS_44FZ,
|
||||||
|
external_id="non-opk-notice",
|
||||||
|
inn="7701234568",
|
||||||
|
organization_name="Организация вне ОПК",
|
||||||
|
title="Закупка организации вне ОПК",
|
||||||
|
opk_registry_membership=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
card = SourceCardService.get_card("public-procurements")
|
||||||
|
|
||||||
|
source_item = next(
|
||||||
|
item for item in card["source_items"] if item["code"] == "procurements_44fz"
|
||||||
|
)
|
||||||
|
self.assertEqual(source_item["records_count"], 1)
|
||||||
|
self.assertEqual(source_item["organizations_count"], 1)
|
||||||
|
self.assertEqual(card["records_count"], 1)
|
||||||
|
self.assertEqual(card["organizations_count"], 1)
|
||||||
|
|
||||||
def test_enqueue_vacancy_refresh_reuses_fresh_active_job(self):
|
def test_enqueue_vacancy_refresh_reuses_fresh_active_job(self):
|
||||||
existing = BackgroundJob.objects.create(
|
existing = BackgroundJob.objects.create(
|
||||||
task_id="active-vacancies",
|
task_id="active-vacancies",
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ def _save_source_record(
|
|||||||
name=organization_name or title or external_id,
|
name=organization_name or title or external_id,
|
||||||
inn=inn,
|
inn=inn,
|
||||||
ogrn=ogrn,
|
ogrn=ogrn,
|
||||||
|
opk_registry_membership=True,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
rn_key = organization_name or title or external_id
|
rn_key = organization_name or title or external_id
|
||||||
@@ -60,7 +61,10 @@ def _save_source_record(
|
|||||||
payload["rn"] = rn
|
payload["rn"] = rn
|
||||||
get_or_create_directory_organization(
|
get_or_create_directory_organization(
|
||||||
rn=rn,
|
rn=rn,
|
||||||
defaults={"name": organization_name or title or external_id},
|
defaults={
|
||||||
|
"name": organization_name or title or external_id,
|
||||||
|
"opk_registry_membership": True,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
OrganizationSourceIngestionService.save_records(
|
OrganizationSourceIngestionService.save_records(
|
||||||
source=source,
|
source=source,
|
||||||
|
|||||||
Reference in New Issue
Block a user