Dec 30, 2011

Extending the Django User model with inheritance

from django.contrib.auth.models import User, UserManager

class CustomUser(User):
    """User with app settings."""
    timezone = models.CharField(max_length=50, default='Europe/London')

    # Use UserManager to get the create_user method, etc.
    objects = UserManager()

...

user = CustomUser.objects.create(...)

# auth_backends.py
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model

class CustomUserModelBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = self.user_class.objects.get(username=username)
            if user.check_password(password):
                return user
        except self.user_class.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return self.user_class.objects.get(pk=user_id)
        except self.user_class.DoesNotExist:
            return None

    @property
    def user_class(self):
        if not hasattr(self, '_user_class'):
            self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.', 2))
            if not self._user_class:
                raise ImproperlyConfigured('Could not get custom user model')
        return self._user_class


# settings.py
AUTHENTICATION_BACKENDS = (
    'myproject.auth_backends.CustomUserModelBackend',
)
...

CUSTOM_USER_MODEL = 'accounts.CustomUser'

http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

Dec 29, 2011

Monkey patch удаляющий "view on site" кнопку

from django.contrib.auth.models import User
del User.get_absolute_url

Dec 23, 2011

Requests: HTTP for Humans

Очень юзабельное приложение http://docs.python-requests.org/en/latest/index.html

И не менее красивый код https://github.com/kennethreitz/requests/blob/develop/requests/ Есть чему поучиться

Dec 18, 2011

Negative round

>>> str(round(1234.5678, -2))
'1200.0'

Operator overloading for the set builtin

>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> a | b # Union
{1, 2, 3, 4, 5, 6}
>>> a & b # Intersection
{3, 4}
>>> a < b # Subset
False
>>> a - b # Difference
{1, 2}
>>> a ^ b # Symmetric Difference
{1, 2, 5, 6}

The Computer Language speed comparison

http://benchmarksgame.alioth.debian.org/


See also: Popularity of Programming Languages

Avoid hardcoding urls

from django.conf import settings

urlpatterns=('',
    ...
    url('^%s$' %settings.LOGIN_URL[1:], 'django.contrib.auth.views.login', 
        name="login")
    ...
)

Django model to dict

from django.forms.models import model_to_dict
model_to_dict(intance, fields=[], exclude=[])