mirror of https://github.com/sgoudham/Enso-Bot.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.9 KiB
Python
74 lines
1.9 KiB
Python
"""
|
|
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
|