Merge branch 'master' into rwd
[wolnelektury.git] / apps / catalogue / utils.py
index 29f40d1..5ae9db5 100644 (file)
@@ -4,6 +4,7 @@
 #
 from __future__ import with_statement
 
 #
 from __future__ import with_statement
 
+import hashlib
 import random
 import re
 import time
 import random
 import re
 import time
@@ -13,7 +14,6 @@ from django.http import HttpResponse
 from django.core.files.uploadedfile import UploadedFile
 from django.core.files.storage import DefaultStorage
 from django.utils.encoding import force_unicode
 from django.core.files.uploadedfile import UploadedFile
 from django.core.files.storage import DefaultStorage
 from django.utils.encoding import force_unicode
-from django.utils.hashcompat import sha_constructor
 from django.conf import settings
 from os import mkdir, path, unlink
 from errno import EEXIST, ENOENT
 from django.conf import settings
 from os import mkdir, path, unlink
 from errno import EEXIST, ENOENT
@@ -31,7 +31,7 @@ MAX_SESSION_KEY = 18446744073709551616L     # 2 << 63
 
 
 def get_random_hash(seed):
 
 
 def get_random_hash(seed):
-    sha_digest = sha_constructor('%s%s%s%s' %
+    sha_digest = hashlib.sha1('%s%s%s%s' %
         (randrange(0, MAX_SESSION_KEY), time.time(), unicode(seed).encode('utf-8', 'replace'),
         settings.SECRET_KEY)).digest()
     return urlsafe_b64encode(sha_digest).replace('=', '').replace('_', '-').lower()
         (randrange(0, MAX_SESSION_KEY), time.time(), unicode(seed).encode('utf-8', 'replace'),
         settings.SECRET_KEY)).digest()
     return urlsafe_b64encode(sha_digest).replace('=', '').replace('_', '-').lower()
@@ -44,6 +44,25 @@ def split_tags(tags):
     return result
 
 
     return result
 
 
+def get_dynamic_path(media, filename, ext=None, maxlen=100):
+    from fnpdjango.utils.text.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 []
+