100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
from collections import defaultdict
|
|
|
|
from django.db.models import Count
|
|
|
|
from apps.authentication.models import Organization
|
|
from apps.authentication.services.service import get_all_org_child
|
|
from apps.herd.models import RancherOrganizationLink, Herd
|
|
from apps.livestock.models import LiveStock
|
|
|
|
|
|
class RancherOrganizationService:
|
|
|
|
def orgs_linked_rancher(self, org: Organization, org_type_key: str):
|
|
|
|
if org.type.key != 'ADM':
|
|
org_ids = list(
|
|
o.id for o in get_all_org_child(org)
|
|
)
|
|
else:
|
|
org_ids = list(
|
|
Organization.objects.filter(
|
|
type__key=org_type_key
|
|
).values_list('id', flat=True)
|
|
)
|
|
|
|
organizations = (
|
|
Organization.objects
|
|
.filter(id__in=org_ids, type__key=org_type_key)
|
|
.select_related('province', 'city')
|
|
.prefetch_related('service_area')
|
|
)
|
|
|
|
rancher_counts = {
|
|
r['organization_id']: r['cnt']
|
|
for r in (
|
|
RancherOrganizationLink.objects
|
|
.filter(organization_id__in=org_ids)
|
|
.values('organization_id')
|
|
.annotate(cnt=Count('rancher_id'))
|
|
)
|
|
}
|
|
|
|
herd_counts = {
|
|
r['organization_id']: r['cnt']
|
|
for r in (
|
|
RancherOrganizationLink.objects
|
|
.filter(organization_id__in=org_ids)
|
|
.values('organization_id')
|
|
.annotate(cnt=Count('rancher__herd'))
|
|
)
|
|
}
|
|
|
|
livestock_per_herd = {
|
|
row['herd_id']: row['cnt']
|
|
for row in (
|
|
LiveStock.objects
|
|
.values('herd_id')
|
|
.annotate(cnt=Count('id'))
|
|
)
|
|
}
|
|
|
|
livestock_counts = defaultdict(int)
|
|
|
|
herd_org_map = (
|
|
Herd.objects
|
|
.filter(
|
|
rancher__organization_links__organization_id__in=org_ids
|
|
)
|
|
.values(
|
|
'id',
|
|
'rancher__organization_links__organization_id'
|
|
)
|
|
)
|
|
|
|
for row in herd_org_map:
|
|
livestock_counts[
|
|
row['rancher__organization_links__organization_id']
|
|
] += livestock_per_herd.get(row['id'], 0)
|
|
|
|
return [
|
|
{
|
|
"id": org.id,
|
|
"name": org.name,
|
|
"org_service_area": [
|
|
{"id": city.id, "name": city.name}
|
|
for city in org.service_area.all()
|
|
],
|
|
"org_purchase_policy": org.purchase_policy,
|
|
"province": org.province.name,
|
|
"province_id": org.province.id,
|
|
"city": org.city.name,
|
|
"city_id": org.city.id,
|
|
|
|
"rancher_count": rancher_counts.get(org.id, 0),
|
|
"herd_count": herd_counts.get(org.id, 0),
|
|
"livestock_count": livestock_counts.get(org.id, 0),
|
|
}
|
|
for org in organizations
|
|
]
|