Skip to content

Instantly share code, notes, and snippets.

View headsrooms's full-sized avatar
🦊

Pablo Cabezas headsrooms

🦊
  • SNGULAR
  • Madrid
  • 12:21 (UTC +02:00)
View GitHub Profile
@headsrooms
headsrooms / example.py
Created July 24, 2017 18:23
Python logger as a context manager
import logging
from logger import log_level
def message(self, message):
with log_level(logging.INFO, __name__) as logger:
input_args = [EXECUTABLE_NAME, SEND_COMMAND]
try:
process = subprocess.Popen(input_args,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
@headsrooms
headsrooms / TupleEnum class
Created September 24, 2017 14:07
Useful to generate choices field (tuple of tuples) from Enum
from enum import Enum
class TupleEnum(Enum):
@classmethod
def tuple(cls):
return tuple(((elem.name, elem.value) for elem in cls))
@headsrooms
headsrooms / flatten_dict.py
Created October 17, 2017 08:41
Flatten nested dicts
def flatten_dict(d):
def expand(key, value):
if isinstance(value, dict):
return [(key + '.' + k, v) for k, v in flatten_dict(value).items()]
else:
return [(key, value)]
items = [item for k, v in d.items() for item in expand(k, v)]
return dict(items)
@headsrooms
headsrooms / string_utils.py
Last active November 11, 2017 16:38
Helper functions to convert between str and bytes extracted from "Effective Python" by Brett Slatkin. Added type hints and bytearray support.
def to_str(bytes_or_str: Union[str, bytes]) -> str:
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
elif isinstance(bytes_or_str, bytearray):
value = bytes(bytes_or_str).decode('utf-8')
else:
value = bytes_or_str
return value
@headsrooms
headsrooms / timeit.py
Created November 12, 2017 20:06
Timer decorator
from functools import wraps
from time import time
def timeit(f):
@wraps(f)
def wrapper(*args, **kwargs):
start = time()
result = f(*args, **kwargs)
end = time()
print('Elapsed time: {}'.format(end - start))
@headsrooms
headsrooms / RelatedFieldWidgetCanAdd.py
Last active September 22, 2019 10:54
ForeignKey in a Model form with "add new" button
class OrderNewForm(forms.ModelForm):
client = forms.ModelChoiceField(
required=False,
queryset=Client.objects.all(),
widget=RelatedFieldWidgetCanAdd(Client, related_url="so_client_add")
)
class Meta:
model = Order
fields = ('code', 'client')
@headsrooms
headsrooms / django_admin_keyword_search.py
Created November 29, 2017 09:20
Django admin keyword search
def search_view(request):
if request.GET.get('q', None):
django_admin_keyword_search(User, request.GET['q'], ['search_field_1', 'search_field_2'])
def django_admin_keyword_search(model, keywords, search_fields):
all_queries = None
for keyword in keywords.split(' '): # breaks query_string into 'Foo' and 'Bar'
keyword_query = None
class FunctionHolder(object):
def __init__(self, function):
self.func = function
self.called_count = 0
def __call__(self, *args, **kwargs):
try:
return self.func(*args, **kwargs)
finally:
self.called_count += 1
@headsrooms
headsrooms / makefile
Created August 9, 2018 08:20
Makefile to generate requirements.txt from poetry
requirements.txt: pyproject.lock
poetry run pip freeze > $@
@headsrooms
headsrooms / not_raises.py
Created August 14, 2018 09:59
Test util to check that some code not raises an exception
from contextlib import contextmanager
import pytest
@contextmanager
def not_raises(exception):
try:
yield
except exception as e: