887fd9ea03834ac3ee2214eb8f69e176e1a8fe84
[redakcja.git] / apps / filebrowser / templatetags / .svn / text-base / fb_versions.py.svn-base
1 # coding: utf-8
2
3 import os, re
4 from time import gmtime
5 from django.template import Library, Node, Variable, VariableDoesNotExist, TemplateSyntaxError
6 from django.conf import settings
7 from django.utils.encoding import force_unicode
8
9 # filebrowser imports
10 from filebrowser.fb_settings import MEDIA_ROOT, MEDIA_URL, VERSIONS
11 from filebrowser.functions import _url_to_path, _path_to_url, _get_version_path, _version_generator
12 from filebrowser.base import FileObject
13
14 register = Library()
15
16 class VersionNode(Node):
17     def __init__(self, src, version_prefix):
18         self.src = Variable(src)
19         if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")):
20             self.version_prefix = version_prefix[1:-1]
21         else:
22             self.version_prefix = None
23             self.version_prefix_var = Variable(version_prefix)
24         
25     def render(self, context):
26         try:
27             source = self.src.resolve(context)
28         except VariableDoesNotExist:
29             return None
30         if self.version_prefix:
31             version_prefix = self.version_prefix
32         else:
33             try:
34                 version_prefix = self.version_prefix_var.resolve(context)
35             except VariableDoesNotExist:
36                 return None
37         try:
38             version_path = _get_version_path(_url_to_path(str(source)), version_prefix)
39             if not os.path.isfile(os.path.join(MEDIA_ROOT, version_path)):
40                 # create version
41                 version_path = _version_generator(_url_to_path(str(source)), version_prefix)
42             elif os.path.getmtime(os.path.join(MEDIA_ROOT, _url_to_path(str(source)))) > os.path.getmtime(os.path.join(MEDIA_ROOT, version_path)):
43                 # recreate version if original image was updated
44                 version_path = _version_generator(_url_to_path(str(source)), version_prefix, force=True)
45             return _path_to_url(version_path)
46         except:
47             return ""
48     
49
50 def version(parser, token):
51     """
52     Displaying a version of an existing Image according to the predefined VERSIONS settings (see fb_settings).
53     {% version field_name version_prefix %}
54     
55     Use {% version my_image 'medium' %} in order to display the medium-size
56     version of an Image stored in a field name my_image.
57     
58     version_prefix can be a string or a variable. if version_prefix is a string, use quotes.
59     """
60     
61     try:
62         tag, src, version_prefix = token.split_contents()
63     except:
64         raise TemplateSyntaxError, "%s tag requires 2 arguments" % token.contents.split()[0]
65     if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")) and version_prefix.lower()[1:-1] not in VERSIONS:
66         raise TemplateSyntaxError, "%s tag received bad version_prefix %s" % (tag, version_prefix)
67     return VersionNode(src, version_prefix)
68     
69
70 class VersionObjectNode(Node):
71     def __init__(self, src, version_prefix, var_name):
72         self.var_name = var_name
73         self.src = Variable(src)
74         if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")):
75             self.version_prefix = version_prefix[1:-1]
76         else:
77             self.version_prefix = None
78             self.version_prefix_var = Variable(version_prefix)
79     
80     def render(self, context):
81         try:
82             source = self.src.resolve(context)
83         except VariableDoesNotExist:
84             return None
85         if self.version_prefix:
86             version_prefix = self.version_prefix
87         else:
88             try:
89                 version_prefix = self.version_prefix_var.resolve(context)
90             except VariableDoesNotExist:
91                 return None
92         try:
93             version_path = _get_version_path(_url_to_path(str(source)), version_prefix)
94             if not os.path.isfile(os.path.join(MEDIA_ROOT, version_path)):
95                 # create version
96                 version_path = _version_generator(_url_to_path(str(source)), version_prefix)
97             elif os.path.getmtime(os.path.join(MEDIA_ROOT, _url_to_path(str(source)))) > os.path.getmtime(os.path.join(MEDIA_ROOT, version_path)):
98                 # recreate version if original image was updated
99                 version_path = _version_generator(_url_to_path(str(source)), version_prefix, force=True)
100             context[self.var_name] = FileObject(version_path)
101         except:
102             context[self.var_name] = ""
103         return ''
104         
105
106 def version_object(parser, token):
107     """
108     Returns a context variable 'version_object'.
109     {% version_object field_name version_prefix %}
110     
111     Use {% version_object my_image 'medium' %} in order to retrieve the medium
112     version of an Image stored in a field name my_image.
113     Use {% version_object my_image 'medium' as var %} in order to use 'var' as
114     your context variable.
115     
116     version_prefix can be a string or a variable. if version_prefix is a string, use quotes.
117     """
118     
119     try:
120         #tag, src, version_prefix = token.split_contents()
121         tag, arg = token.contents.split(None, 1)
122     except:
123         raise TemplateSyntaxError, "%s tag requires arguments" % token.contents.split()[0]
124     m = re.search(r'(.*?) (.*?) as (\w+)', arg)
125     if not m:
126         raise TemplateSyntaxError, "%r tag had invalid arguments" % tag
127     src, version_prefix, var_name = m.groups()
128     if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")) and version_prefix.lower()[1:-1] not in VERSIONS:
129         raise TemplateSyntaxError, "%s tag received bad version_prefix %s" % (tag, version_prefix)
130     return VersionObjectNode(src, version_prefix, var_name)
131     
132
133 class VersionSettingNode(Node):
134     def __init__(self, version_prefix):
135         if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")):
136             self.version_prefix = version_prefix[1:-1]
137         else:
138             self.version_prefix = None
139             self.version_prefix_var = Variable(version_prefix)
140     
141     def render(self, context):
142         if self.version_prefix:
143             version_prefix = self.version_prefix
144         else:
145             try:
146                 version_prefix = self.version_prefix_var.resolve(context)
147             except VariableDoesNotExist:
148                 return None
149         context['version_setting'] = VERSIONS[version_prefix]
150         return ''
151         
152
153 def version_setting(parser, token):
154     """
155     Get Information about a version setting.
156     """
157     
158     try:
159         tag, version_prefix = token.split_contents()
160     except:
161         raise TemplateSyntaxError, "%s tag requires 1 argument" % token.contents.split()[0]
162     if (version_prefix[0] == version_prefix[-1] and version_prefix[0] in ('"', "'")) and version_prefix.lower()[1:-1] not in VERSIONS:
163         raise TemplateSyntaxError, "%s tag received bad version_prefix %s" % (tag, version_prefix)
164     return VersionSettingNode(version_prefix)
165     
166
167 register.tag(version)
168 register.tag(version_object)
169 register.tag(version_setting)
170
171