Dodanie aplikacji sorl.thumbnail i filebrowser.
[redakcja.git] / apps / filebrowser / templatetags / .svn / text-base / fb_versions.py.svn-base
diff --git a/apps/filebrowser/templatetags/.svn/text-base/fb_versions.py.svn-base b/apps/filebrowser/templatetags/.svn/text-base/fb_versions.py.svn-base
new file mode 100644 (file)
index 0000000..887fd9e
--- /dev/null
@@ -0,0 +1,171 @@
+# coding: utf-8
+
+import os, re
+from time import gmtime
+from django.template import Library, Node, Variable, VariableDoesNotExist, TemplateSyntaxError
+from django.conf import settings
+from django.utils.encoding import force_unicode
+
+# filebrowser imports
+from filebrowser.fb_settings import MEDIA_ROOT, MEDIA_URL, VERSIONS
+from filebrowser.functions import _url_to_path, _path_to_url, _get_version_path, _version_generator
+from filebrowser.base import FileObject
+
+register = Library()
+
+class VersionNode(Node):
+    def __init__(self, src, version_prefix):
+        self.src = Variable(src)
+        if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")):
+            self.version_prefix = version_prefix[1:-1]
+        else:
+            self.version_prefix = None
+            self.version_prefix_var = Variable(version_prefix)
+        
+    def render(self, context):
+        try:
+            source = self.src.resolve(context)
+        except VariableDoesNotExist:
+            return None
+        if self.version_prefix:
+            version_prefix = self.version_prefix
+        else:
+            try:
+                version_prefix = self.version_prefix_var.resolve(context)
+            except VariableDoesNotExist:
+                return None
+        try:
+            version_path = _get_version_path(_url_to_path(str(source)), version_prefix)
+            if not os.path.isfile(os.path.join(MEDIA_ROOT, version_path)):
+                # create version
+                version_path = _version_generator(_url_to_path(str(source)), version_prefix)
+            elif os.path.getmtime(os.path.join(MEDIA_ROOT, _url_to_path(str(source)))) > os.path.getmtime(os.path.join(MEDIA_ROOT, version_path)):
+                # recreate version if original image was updated
+                version_path = _version_generator(_url_to_path(str(source)), version_prefix, force=True)
+            return _path_to_url(version_path)
+        except:
+            return ""
+    
+
+def version(parser, token):
+    """
+    Displaying a version of an existing Image according to the predefined VERSIONS settings (see fb_settings).
+    {% version field_name version_prefix %}
+    
+    Use {% version my_image 'medium' %} in order to display the medium-size
+    version of an Image stored in a field name my_image.
+    
+    version_prefix can be a string or a variable. if version_prefix is a string, use quotes.
+    """
+    
+    try:
+        tag, src, version_prefix = token.split_contents()
+    except:
+        raise TemplateSyntaxError, "%s tag requires 2 arguments" % token.contents.split()[0]
+    if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")) and version_prefix.lower()[1:-1] not in VERSIONS:
+        raise TemplateSyntaxError, "%s tag received bad version_prefix %s" % (tag, version_prefix)
+    return VersionNode(src, version_prefix)
+    
+
+class VersionObjectNode(Node):
+    def __init__(self, src, version_prefix, var_name):
+        self.var_name = var_name
+        self.src = Variable(src)
+        if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")):
+            self.version_prefix = version_prefix[1:-1]
+        else:
+            self.version_prefix = None
+            self.version_prefix_var = Variable(version_prefix)
+    
+    def render(self, context):
+        try:
+            source = self.src.resolve(context)
+        except VariableDoesNotExist:
+            return None
+        if self.version_prefix:
+            version_prefix = self.version_prefix
+        else:
+            try:
+                version_prefix = self.version_prefix_var.resolve(context)
+            except VariableDoesNotExist:
+                return None
+        try:
+            version_path = _get_version_path(_url_to_path(str(source)), version_prefix)
+            if not os.path.isfile(os.path.join(MEDIA_ROOT, version_path)):
+                # create version
+                version_path = _version_generator(_url_to_path(str(source)), version_prefix)
+            elif os.path.getmtime(os.path.join(MEDIA_ROOT, _url_to_path(str(source)))) > os.path.getmtime(os.path.join(MEDIA_ROOT, version_path)):
+                # recreate version if original image was updated
+                version_path = _version_generator(_url_to_path(str(source)), version_prefix, force=True)
+            context[self.var_name] = FileObject(version_path)
+        except:
+            context[self.var_name] = ""
+        return ''
+        
+
+def version_object(parser, token):
+    """
+    Returns a context variable 'version_object'.
+    {% version_object field_name version_prefix %}
+    
+    Use {% version_object my_image 'medium' %} in order to retrieve the medium
+    version of an Image stored in a field name my_image.
+    Use {% version_object my_image 'medium' as var %} in order to use 'var' as
+    your context variable.
+    
+    version_prefix can be a string or a variable. if version_prefix is a string, use quotes.
+    """
+    
+    try:
+        #tag, src, version_prefix = token.split_contents()
+        tag, arg = token.contents.split(None, 1)
+    except:
+        raise TemplateSyntaxError, "%s tag requires arguments" % token.contents.split()[0]
+    m = re.search(r'(.*?) (.*?) as (\w+)', arg)
+    if not m:
+        raise TemplateSyntaxError, "%r tag had invalid arguments" % tag
+    src, version_prefix, var_name = m.groups()
+    if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")) and version_prefix.lower()[1:-1] not in VERSIONS:
+        raise TemplateSyntaxError, "%s tag received bad version_prefix %s" % (tag, version_prefix)
+    return VersionObjectNode(src, version_prefix, var_name)
+    
+
+class VersionSettingNode(Node):
+    def __init__(self, version_prefix):
+        if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")):
+            self.version_prefix = version_prefix[1:-1]
+        else:
+            self.version_prefix = None
+            self.version_prefix_var = Variable(version_prefix)
+    
+    def render(self, context):
+        if self.version_prefix:
+            version_prefix = self.version_prefix
+        else:
+            try:
+                version_prefix = self.version_prefix_var.resolve(context)
+            except VariableDoesNotExist:
+                return None
+        context['version_setting'] = VERSIONS[version_prefix]
+        return ''
+        
+
+def version_setting(parser, token):
+    """
+    Get Information about a version setting.
+    """
+    
+    try:
+        tag, version_prefix = token.split_contents()
+    except:
+        raise TemplateSyntaxError, "%s tag requires 1 argument" % token.contents.split()[0]
+    if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")) and version_prefix.lower()[1:-1] not in VERSIONS:
+        raise TemplateSyntaxError, "%s tag received bad version_prefix %s" % (tag, version_prefix)
+    return VersionSettingNode(version_prefix)
+    
+
+register.tag(version)
+register.tag(version_object)
+register.tag(version_setting)
+
+