You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.9 KiB

import json
import redis
from django.contrib.gis.geos import Polygon
from django.db.models import QuerySet
from typing import Optional
from apps.parameters.models import WorldArea
from apps.utils import get_redis_client
from ..models import ServiceArea
def add_new_polygon_to_cache(service_area: ServiceArea, /, *, delete_polygon: Optional[Polygon] = None):
redis_instance = get_redis_client()
intersection_qs = WorldArea.objects.filter(square__intersects=service_area.polygon)
if intersection_qs.exists():
for area in intersection_qs:
area_code = area.code
value = redis_instance.get(area_code)
if not value:
value = list()
else:
value = json.loads(value)
value.append(service_area.id)
redis_instance.set(area.code, json.dumps(value))
if delete_polygon:
delete_polygon_from_cache(service_area, delete_polygon, redis_instance=redis_instance)
def delete_polygon_from_cache(
service_area: ServiceArea,
delete_polygon: Polygon,
/,
*,
redis_instance: redis.StrictRedis = None):
if not redis_instance:
redis_instance = get_redis_client()
intersection_qs = WorldArea.objects.filter(square__intersects=delete_polygon)
for area in intersection_qs:
area_code = area.code
value = redis_instance.get(area_code)
if not value:
continue
value = set(json.loads(value))
try:
value.remove(service_area.id)
except KeyError:
continue
value = list(value)
redis_instance.set(area.code, json.dumps(value))
def delete_polygon_batch_from_cache(service_areas: QuerySet):
redis_instance = get_redis_client()
for service_area in service_areas:
delete_polygon_from_cache(service_area, service_area.polygon, redis_instance=redis_instance)