summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/south/utils
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/south/utils')
-rw-r--r--lib/python2.7/site-packages/south/utils/__init__.py73
-rw-r--r--lib/python2.7/site-packages/south/utils/datetime_utils.py28
-rw-r--r--lib/python2.7/site-packages/south/utils/py3.py28
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,), {})