Skip to content

Instantly share code, notes, and snippets.

View surenkov's full-sized avatar
💨
I may be slow to respond.

Savva Surenkov surenkov

💨
I may be slow to respond.
View GitHub Profile
@surenkov
surenkov / memoized.py
Created October 7, 2019 16:23
Memoized Method descriptor
from functools import partial
class MemoizedMethod:
def __init__(self, func):
self.func = func
def __get__(self, obj, objtype=None):
if obj is None:
return self.func
@surenkov
surenkov / services.py
Last active October 7, 2019 17:07
Some minimal service abstraction
from abc import ABC, abstractmethod
from functools import reduce
from typing import Tuple, TypeVar, Union, Iterable, Mapping
TInstance = TypeVar("TInstance")
class AbstractFactory(Iterable[TInstance], ABC):
pass
@surenkov
surenkov / drf_ctx_default.py
Created October 7, 2019 17:18
Django REST Framework context default value
from operator import methodcaller
from django.utils.functional import cached_property
from typing import Union
class ContextDefaultValue:
""">>> field = serializers.HiddenField(
>>> default=ContextDefaultValue("some_context_attr")
>>> )"""
@surenkov
surenkov / drf_full_text_search_filter.py
Last active December 29, 2023 11:26
Django REST filter around `django.contrib.postgres.search` expressions
from typing import Union, Collection
from django.contrib.postgres.search import SearchVector, SearchQuery
from django.db.models.expressions import BaseExpression
from django_filters import rest_framework as filters
from django_filters.constants import EMPTY_VALUES
class FullTextSearchFilter(filters.CharFilter):
@surenkov
surenkov / django_choice_enum.py
Created October 21, 2019 14:43
ChoiceEnum backport (simplified) for Django < 3.0
from enum import EnumMeta, Enum
__all__ = ['ChoiceEnum']
class ChoiceEnumMeta(EnumMeta):
def __iter__(cls):
return ((tag.value, tag.name) for tag in super().__iter__())
@property
@surenkov
surenkov / cache_view.py
Last active May 2, 2023 12:43
Django class-based view caching mixing with granular cache-control
import functools
import typing as t
from datetime import timedelta
from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_cookie, vary_on_headers
from django.views.generic import View
__all__ = (
"CachedView",
from collections import deque
field = [...] # NxM matrix
not_visited = {(x, y) for x in range(N) for y in range(M)}
def test_acceptance(x, y):
return field[x][y] == 1 and (x, y) in not_visited
@surenkov
surenkov / django_pg_locks.py
Last active December 29, 2023 11:24
Postgres table / advisory lock context managers for Django python apps
import contextlib
import enum
import hashlib
import typing as t
from django.apps import apps
from django.db import models, transaction, connection, OperationalError, InternalError
from psycopg2 import sql
@surenkov
surenkov / debounced.py
Last active July 29, 2022 08:16
Celery tasks debouncing
import functools
import logging
import pickle
import typing as t
from contextlib import contextmanager
from random import random
from django.conf import settings
from celery import Task
vmType: "vz"
arch: "default"
images:
# Try to use release-yyyyMMdd image if available. Note that release-yyyyMMdd will be removed after several months.
- location: "https://cloud-images.ubuntu.com/releases/23.10/release-20231011/ubuntu-23.10-server-cloudimg-arm64.img"
arch: "aarch64"
digest: "sha256:78d35a2f551d281912ee7e5202660d94d713aa1b5de86a17e261328cc2f093d4"
- location: "https://cloud-images.ubuntu.com/releases/23.10/release-20231011/ubuntu-23.10-server-cloudimg-amd64.img"