Source code for registration.compat

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
"""
Compatibility module
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
import django
from django.conf import settings

try:
    # django 1.4, timezone
    from django.utils.timezone import now as datetime_now
except ImportError:
    import datetime
    datetime_now = datetime.datetime.now

if django.VERSION >= (1, 9):
    patterns = lambda x, *args: args
    from django.conf.urls import url
    from django.conf.urls import include
else:
    try:
        # django 1.4
        from django.conf.urls import url
        from django.conf.urls import patterns
        from django.conf.urls import include
    except ImportError:
        from django.conf.urls.defaults import url
        from django.conf.urls.defaults import patterns
        from django.conf.urls.defaults import include

try:
    from django.contrib.admin.utils import unquote
except ImportError:
    from django.contrib.admin.util import unquote

# Python 2.7 has an importlib with import_module; for older Pythons,
# Django's bundled copy provides it.
try:
    from importlib import import_module
except ImportError:
    from django.utils.importlib import import_module

try:
    from hashlib import sha1
except ImportError:
    from django.utils.hashcompat import sha_constructor as sha1

#
# Django change the transaction strategy from Django 1.6
# https://docs.djangoproject.com/en/1.6/topics/db/transactions/
#
# This change cause issue #15 thus the compatibility importing is required
#
# `change_view` in Django 1.6 use transaction.atomic
# https://github.com/django/django/blob/1.6/django/contrib/admin/options.py#L1186
# `change_view` in Django 1.5 use commit_on_success
# https://github.com/django/django/blob/1.5/django/contrib/admin/options.py#L1063
#
try:
    from django.db.transaction import atomic as transaction_atomic
except ImportError:
    from django.db.transaction import commit_on_success as transaction_atomic


# Custom User support section ==============================================={{{
#
# The following code (from === to ===) was copied from django-userena at
# 2014/05/24 to solve issue #18.
# The code is protected with BSD License.
#
# Ref: https://github.com/bread-and-pepper/django-userena/blob/master/userena/utils.py#L165-L176
#
# ---------------------------------------------------------------------------{{{
# Copyright (c) 2010, Petar Radosevic
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of the author nor the names of other
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# ---------------------------------------------------------------------------}}}
#
# Django 1.5 compatibility utilities, providing support for custom User models.
# Since get_user_model() causes a circular import if called when app models are
# being loaded, the user_model_label should be used when possible, with calls
# to get_user_model deferred to execution time

user_model_label = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')

try:
    from django.contrib.auth import get_user_model
except ImportError:
    from django.contrib.auth.models import User
    get_user_model = lambda: User
# ===========================================================================}}}