summaryrefslogtreecommitdiff
path: root/lib/filebrowser/base.py
blob: 1b60dce4b38c57188969c270c6a7a54d1cbfb3de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# coding: utf-8

# imports
import os, re, datetime
from time import gmtime, strftime

# django imports
from django.conf import settings

# filebrowser imports
from filebrowser.settings import *
from filebrowser.functions import get_file_type, url_join, is_selectable, get_version_path
from django.utils.encoding import force_unicode

# PIL import
if STRICT_PIL:
    from PIL import Image
else:
    try:
        from PIL import Image
    except ImportError:
        import Image


class FileObject(object):
    """
    The FileObject represents a File on the Server.
    
    PATH has to be relative to MEDIA_ROOT.
    """
    
    def __init__(self, path):
        path = force_unicode(path)
        self.path = path
        self.url_rel = path.replace("\\","/")
        self.head = os.path.split(path)[0]
        self.filename = os.path.split(path)[1]
        self.filename_lower = self.filename.lower() # important for sorting
        # ABP: fix for dotted folder names
        if os.path.isdir(self.path_full):
           self.filetype = 'Folder'
        else:
            self.filetype = get_file_type(self.filename)
    
    def _filesize(self):
        """
        Filesize.
        """
        path = self.path
        if os.path.isfile(os.path.join(MEDIA_ROOT, path)) or os.path.isdir(os.path.join(MEDIA_ROOT, path)):
            return os.path.getsize(os.path.join(MEDIA_ROOT, path))
        return ""
    filesize = property(_filesize)
    
    def _date(self):
        """
        Date.
        """
        if os.path.isfile(os.path.join(MEDIA_ROOT, self.path)) or os.path.isdir(os.path.join(MEDIA_ROOT, self.path)):
            return os.path.getmtime(os.path.join(MEDIA_ROOT, self.path))
        return ""
    date = property(_date)
    
    def _datetime(self):
        """
        Datetime Object.
        """
        return datetime.datetime.fromtimestamp(self.date)
    datetime = property(_datetime)
    
    def _extension(self):
        """
        Extension.
        """
        return u"%s" % os.path.splitext(self.filename)[1]
    extension = property(_extension)
    
    def _filetype_checked(self):
        if self.filetype == "Folder" and os.path.isdir(self.path_full):
            return self.filetype
        elif self.filetype != "Folder" and os.path.isfile(self.path_full):
            return self.filetype
        else:
            return ""
    filetype_checked = property(_filetype_checked)
    
    def _path_full(self):
        """
        Full server PATH including MEDIA_ROOT.
        """
        return os.path.join(MEDIA_ROOT, self.path)
    path_full = property(_path_full)
    
    def _path_relative(self):
        return self.path
    path_relative = property(_path_relative)
    
    def _path_relative_directory(self):
        """
        Path relative to initial directory.
        """
        directory_re = re.compile(r'^(%s)' % (DIRECTORY))
        value = directory_re.sub('', self.path)
        return u"%s" % value
    path_relative_directory = property(_path_relative_directory)
    
    def _url_relative(self):
        return self.url_rel
    url_relative = property(_url_relative)
    
    def _url_full(self):
        """
        Full URL including MEDIA_URL.
        """
        return force_unicode(url_join(MEDIA_URL, self.url_rel))
    url_full = property(_url_full)
    
    def _url_save(self):
        """
        URL used for the filebrowsefield.
        """
        if SAVE_FULL_URL:
            return self.url_full
        else:
            return self.url_rel
    url_save = property(_url_save)
    
    def _url_thumbnail(self):
        """
        Thumbnail URL.
        """
        if self.filetype == "Image":
            return u"%s" % url_join(MEDIA_URL, get_version_path(self.path, 'fb_thumb'))
        else:
            return ""
    url_thumbnail = property(_url_thumbnail)
    
    def url_admin(self):
        if self.filetype_checked == "Folder":
            directory_re = re.compile(r'^(%s)' % (DIRECTORY))
            value = directory_re.sub('', self.path)
            return u"%s" % value
        else:
            return u"%s" % url_join(MEDIA_URL, self.path)
    
    def _folder(self):
        directory_re = re.compile(r'^(%s)' % (DIRECTORY.rstrip('/')))
        return u"%s/" % directory_re.sub('', self.head)
    folder = property(_folder)
    
    def _folder_for_link(self):
        directory_re = re.compile(r'^(%s)' % (DIRECTORY.rstrip('/')))
        return u"%s" % directory_re.sub('', self.head)[1:]
    folder_for_link = property(_folder_for_link)
    
    def _dimensions(self):
        """
        Image Dimensions.
        """
        if self.filetype == 'Image':
            try:
                im = Image.open(os.path.join(MEDIA_ROOT, self.path))
                return im.size
            except:
                pass
        else:
            return False
    dimensions = property(_dimensions)
    
    def _width(self):
        """
        Image Width.
        """
        return self.dimensions[0]
    width = property(_width)
    
    def _height(self):
        """
        Image Height.
        """
        return self.dimensions[1]
    height = property(_height)
    
    def _orientation(self):
        """
        Image Orientation.
        """
        if self.dimensions:
            if self.dimensions[0] >= self.dimensions[1]:
                return "Landscape"
            else:
                return "Portrait"
        else:
            return None
    orientation = property(_orientation)
    
    def _is_empty(self):
        """
        True if Folder is empty, False if not.
        """
        if os.path.isdir(self.path_full):
            if not os.listdir(self.path_full):
                return True
            else:
                return False
        else:
            return None
    is_empty = property(_is_empty)
    
    def __repr__(self):
        return force_unicode(self.url_save)
    
    def __str__(self):
        return force_unicode(self.url_save)
    
    def __unicode__(self):
        return force_unicode(self.url_save)