so apparent memory leak seems to be just connection.queries debugging of django.
[wolnelektury.git] / apps / catalogue / utils.py
index 29f40d1..1060670 100644 (file)
@@ -44,6 +44,25 @@ def split_tags(tags):
     return result
 
 
     return result
 
 
+def get_dynamic_path(media, filename, ext=None, maxlen=100):
+    from slughifi import slughifi
+
+    # how to put related book's slug here?
+    if not ext:
+        # BookMedia case
+        ext = media.formats[media.type].ext
+    if media is None or not media.name:
+        name = slughifi(filename.split(".")[0])
+    else:
+        name = slughifi(media.name)
+    return 'book/%s/%s.%s' % (ext, name[:maxlen-len('book/%s/.%s' % (ext, ext))-4], ext)
+
+
+# TODO: why is this hard-coded ?
+def book_upload_path(ext=None, maxlen=100):
+    return lambda *args: get_dynamic_path(*args, ext=ext, maxlen=maxlen)
+
+
 class ExistingFile(UploadedFile):
 
     def __init__(self, path, *args, **kwargs):
 class ExistingFile(UploadedFile):
 
     def __init__(self, path, *args, **kwargs):
@@ -257,3 +276,40 @@ def clear_custom_pdf(book):
     """
     from waiter.utils import clear_cache
     clear_cache('book/%s' % book.slug)
     """
     from waiter.utils import clear_cache
     clear_cache('book/%s' % book.slug)
+
+
+class AppSettings(object):
+    """Allows specyfying custom settings for an app, with default values.
+
+    Just subclass, set some properties and instantiate with a prefix.
+    Getting a SETTING from an instance will check for prefix_SETTING
+    in project settings if set, else take the default. The value will be
+    then filtered through _more_SETTING method, if there is one.
+
+    """
+    def __init__(self, prefix):
+        self._prefix = prefix
+
+    def __getattribute__(self, name):
+        if name.startswith('_'):
+            return object.__getattribute__(self, name)
+        value = getattr(settings,
+                         "%s_%s" % (self._prefix, name),
+                         object.__getattribute__(self, name))
+        more = "_more_%s" % name
+        if hasattr(self, more):
+            value = getattr(self, more)(value)
+        return value
+
+
+def trim_query_log(trim_to=25):
+    """
+connection.queries includes all SQL statements -- INSERTs, UPDATES, SELECTs, etc. Each time your app hits the database, the query will be recorded.
+This can sometimes occupy lots of memory, so trim it here a bit.
+    """
+    if settings.DEBUG:
+        from django.db import connection
+        connection.queries = trim_to > 0 \
+            and connection.queries[-trim_to:] \
+            or []
+