50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import uuid
|
|
|
|
import django.db
|
|
from django.db import models
|
|
|
|
from hotpocket_backend.apps.saves.models import Save
|
|
from hotpocket_common.db import postgres # noqa: F401
|
|
from hotpocket_soa.dto.associations import AssociationsQuery
|
|
|
|
from .base import AssociationAdapter, SaveAdapter
|
|
|
|
LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
class PostgresSaveAdapter(SaveAdapter):
|
|
ROW_LOCKED_MESSAGE = 'could not obtain lock on row in relation "saves_save"'
|
|
|
|
def get_for_processing(self, *, pk: uuid.UUID) -> Save | None:
|
|
try:
|
|
return Save.active_objects.select_for_update(nowait=True).get(pk=pk)
|
|
except django.db.utils.OperationalError as exception:
|
|
if exception.args[0].startswith(self.ROW_LOCKED_MESSAGE) is True:
|
|
LOGGER.info('Trying to process a locked save: pk=`%s`', pk)
|
|
return None
|
|
|
|
raise exception
|
|
|
|
|
|
class PostgresAssociationAdapter(AssociationAdapter):
|
|
def get_search_term_filters(self, *, query: AssociationsQuery) -> list[models.Q]:
|
|
result = [
|
|
(
|
|
models.Q(target__url__ilike=query.search)
|
|
|
|
|
models.Q(target_title__ilike=query.search)
|
|
|
|
|
models.Q(target__title__ilike=query.search)
|
|
|
|
|
models.Q(target_description__ilike=query.search)
|
|
|
|
|
models.Q(target__description__ilike=query.search)
|
|
),
|
|
]
|
|
|
|
return result
|