diff options
Diffstat (limited to 'lib/python2.7/site-packages/south/utils')
-rw-r--r-- | lib/python2.7/site-packages/south/utils/__init__.py | 73 | ||||
-rw-r--r-- | lib/python2.7/site-packages/south/utils/datetime_utils.py | 28 | ||||
-rw-r--r-- | lib/python2.7/site-packages/south/utils/py3.py | 28 |
3 files changed, 129 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/south/utils/__init__.py b/lib/python2.7/site-packages/south/utils/__init__.py new file mode 100644 index 0000000..8d7297e --- /dev/null +++ b/lib/python2.7/site-packages/south/utils/__init__.py @@ -0,0 +1,73 @@ +""" +Generally helpful utility functions. +""" + + +def _ask_for_it_by_name(name): + "Returns an object referenced by absolute path." + bits = str(name).split(".") + + ## what if there is no absolute reference? + if len(bits) > 1: + modulename = ".".join(bits[:-1]) + else: + modulename = bits[0] + + module = __import__(modulename, {}, {}, bits[-1]) + + if len(bits) == 1: + return module + else: + return getattr(module, bits[-1]) + + +def ask_for_it_by_name(name): + "Returns an object referenced by absolute path. (Memoised outer wrapper)" + if name not in ask_for_it_by_name.cache: + ask_for_it_by_name.cache[name] = _ask_for_it_by_name(name) + return ask_for_it_by_name.cache[name] +ask_for_it_by_name.cache = {} + + +def get_attribute(item, attribute): + """ + Like getattr, but recursive (i.e. you can ask for 'foo.bar.yay'.) + """ + value = item + for part in attribute.split("."): + value = getattr(value, part) + return value + +def auto_through(field): + "Returns if the M2M class passed in has an autogenerated through table or not." + return ( + # Django 1.0/1.1 + (not field.rel.through) + or + # Django 1.2+ + getattr(getattr(field.rel.through, "_meta", None), "auto_created", False) + ) + +def auto_model(model): + "Returns if the given model was automatically generated." + return getattr(model._meta, "auto_created", False) + +def memoize(function): + "Standard memoization decorator." + name = function.__name__ + _name = '_' + name + + def method(self): + if not hasattr(self, _name): + value = function(self) + setattr(self, _name, value) + return getattr(self, _name) + + def invalidate(): + if hasattr(method, _name): + delattr(method, _name) + + method.__name__ = function.__name__ + method.__doc__ = function.__doc__ + method._invalidate = invalidate + return method diff --git a/lib/python2.7/site-packages/south/utils/datetime_utils.py b/lib/python2.7/site-packages/south/utils/datetime_utils.py new file mode 100644 index 0000000..a416935 --- /dev/null +++ b/lib/python2.7/site-packages/south/utils/datetime_utils.py @@ -0,0 +1,28 @@ +from datetime import * + +import django +from django.conf import settings + +if django.VERSION[:2] >= (1, 4) and getattr(settings, 'USE_TZ', False): + from django.utils import timezone + from datetime import datetime as _datetime + + class datetime(_datetime): + """ + A custom datetime.datetime class which acts as a compatibility + layer between South and Django 1.4's timezone aware datetime + instances. + + It basically adds the default timezone (as configured in Django's + settings) automatically if no tzinfo is given. + """ + def __new__(cls, year, month, day, + hour=0, minute=0, second=0, microsecond=0, tzinfo=None): + + dt = _datetime(year, month, day, + hour, minute, second, microsecond, + tzinfo=tzinfo) + if tzinfo is None: + default_timezone = timezone.get_default_timezone() + dt = timezone.make_aware(dt, default_timezone) + return dt diff --git a/lib/python2.7/site-packages/south/utils/py3.py b/lib/python2.7/site-packages/south/utils/py3.py new file mode 100644 index 0000000..732e904 --- /dev/null +++ b/lib/python2.7/site-packages/south/utils/py3.py @@ -0,0 +1,28 @@ +""" +Python 2 + 3 compatibility functions. This is a very small subset of six. +""" + +import sys + +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + text_type = str + raw_input = input + + import io + StringIO = io.StringIO + +else: + string_types = basestring, + text_type = unicode + raw_input = raw_input + + import cStringIO + StringIO = cStringIO.StringIO + + +def with_metaclass(meta, base=object): + """Create a base class with a metaclass.""" + return meta("NewBase", (base,), {}) |