Commit | Line | Data |
---|---|---|
68784b9e CAW |
1 | # GNU MediaGoblin -- federated, autonomous media hosting |
2 | # Copyright (C) 2011 Free Software Foundation, Inc | |
3 | # | |
4 | # This program is free software: you can redistribute it and/or modify | |
5 | # it under the terms of the GNU Affero General Public License as published by | |
6 | # the Free Software Foundation, either version 3 of the License, or | |
7 | # (at your option) any later version. | |
8 | # | |
9 | # This program is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU Affero General Public License for more details. | |
13 | # | |
14 | # You should have received a copy of the GNU Affero General Public License | |
15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
16 | ||
678d1a20 CAW |
17 | import os |
18 | import shutil | |
68784b9e CAW |
19 | import tempfile |
20 | ||
21 | ||
678d1a20 CAW |
22 | DEFAULT_WORKBENCH_DIR = os.path.join( |
23 | tempfile.gettempdir(), u'mgoblin_workbench') | |
24 | ||
25 | ||
678d1a20 CAW |
26 | # Actual workbench stuff |
27 | # ---------------------- | |
68784b9e | 28 | |
52426ae0 | 29 | class Workbench(object): |
68784b9e | 30 | """ |
52426ae0 | 31 | Represent the directory for the workbench |
b67a983a E |
32 | |
33 | WARNING: DO NOT create Workbench objects on your own, | |
34 | let the WorkbenchManager do that for you! | |
68784b9e | 35 | """ |
52426ae0 | 36 | def __init__(self, dir): |
b67a983a E |
37 | """ |
38 | WARNING: DO NOT create Workbench objects on your own, | |
39 | let the WorkbenchManager do that for you! | |
40 | """ | |
52426ae0 | 41 | self.dir = dir |
68784b9e | 42 | |
52426ae0 E |
43 | def __unicode__(self): |
44 | return unicode(self.dir) | |
45 | def __str__(self): | |
46 | return str(self.dir) | |
47 | def __repr__(self): | |
48 | return repr(self.dir) | |
68784b9e | 49 | |
52426ae0 E |
50 | def joinpath(self, *args): |
51 | return os.path.join(self.dir, *args) | |
68784b9e | 52 | |
52426ae0 | 53 | def localized_file(self, storage, filepath, |
68ffb136 CAW |
54 | filename_if_copying=None, |
55 | keep_extension_if_copying=True): | |
68784b9e CAW |
56 | """ |
57 | Possibly localize the file from this storage system (for read-only | |
58 | purposes, modifications should be written to a new file.). | |
59 | ||
60 | If the file is already local, just return the absolute filename of that | |
61 | local file. Otherwise, copy the file locally to the workbench, and | |
62 | return the absolute path of the new file. | |
63 | ||
678d1a20 CAW |
64 | If it is copying locally, we might want to require a filename like |
65 | "source.jpg" to ensure that we won't conflict with other filenames in | |
66 | our workbench... if that's the case, make sure filename_if_copying is | |
67 | set to something like 'source.jpg'. Relatedly, if you set | |
68 | keep_extension_if_copying, you don't have to set an extension on | |
69 | filename_if_copying yourself, it'll be set for you (assuming such an | |
70 | extension can be extacted from the filename in the filepath). | |
71 | ||
68784b9e | 72 | Returns: |
fdc50039 | 73 | localized_filename |
678d1a20 CAW |
74 | |
75 | Examples: | |
68ffb136 | 76 | >>> wb_manager.localized_file( |
678d1a20 CAW |
77 | ... '/our/workbench/subdir', local_storage, |
78 | ... ['path', 'to', 'foobar.jpg']) | |
fdc50039 | 79 | u'/local/storage/path/to/foobar.jpg' |
678d1a20 | 80 | |
68ffb136 | 81 | >>> wb_manager.localized_file( |
678d1a20 CAW |
82 | ... '/our/workbench/subdir', remote_storage, |
83 | ... ['path', 'to', 'foobar.jpg']) | |
fdc50039 | 84 | '/our/workbench/subdir/foobar.jpg' |
678d1a20 | 85 | |
68ffb136 | 86 | >>> wb_manager.localized_file( |
678d1a20 CAW |
87 | ... '/our/workbench/subdir', remote_storage, |
88 | ... ['path', 'to', 'foobar.jpg'], 'source.jpeg', False) | |
fdc50039 | 89 | '/our/workbench/subdir/foobar.jpeg' |
678d1a20 | 90 | |
68ffb136 | 91 | >>> wb_manager.localized_file( |
678d1a20 CAW |
92 | ... '/our/workbench/subdir', remote_storage, |
93 | ... ['path', 'to', 'foobar.jpg'], 'source', True) | |
fdc50039 | 94 | '/our/workbench/subdir/foobar.jpg' |
68784b9e | 95 | """ |
678d1a20 | 96 | if storage.local_storage: |
fdc50039 | 97 | return storage.get_local_path(filepath) |
678d1a20 CAW |
98 | else: |
99 | if filename_if_copying is None: | |
100 | dest_filename = filepath[-1] | |
101 | else: | |
102 | orig_filename, orig_ext = os.path.splitext(filepath[-1]) | |
103 | if keep_extension_if_copying and orig_ext: | |
f2b96ff0 | 104 | dest_filename = filename_if_copying + orig_ext |
678d1a20 CAW |
105 | else: |
106 | dest_filename = filename_if_copying | |
107 | ||
108 | full_dest_filename = os.path.join( | |
52426ae0 | 109 | self.dir, dest_filename) |
678d1a20 CAW |
110 | |
111 | # copy it over | |
112 | storage.copy_locally( | |
113 | filepath, full_dest_filename) | |
114 | ||
fdc50039 | 115 | return full_dest_filename |
52426ae0 | 116 | |
b67a983a E |
117 | def destroy_self(self): |
118 | """ | |
119 | Destroy this workbench! Deletes the directory and all its contents! | |
120 | ||
121 | WARNING: Does no checks for a sane value in self.dir! | |
122 | """ | |
123 | # just in case | |
124 | workbench = os.path.abspath(self.dir) | |
125 | ||
126 | shutil.rmtree(workbench) | |
127 | ||
128 | del self.dir | |
129 | ||
52426ae0 E |
130 | |
131 | class WorkbenchManager(object): | |
132 | """ | |
133 | A system for generating and destroying workbenches. | |
134 | ||
135 | Workbenches are actually just subdirectories of a temporary storage space | |
136 | for during the processing stage. | |
137 | """ | |
138 | ||
139 | def __init__(self, base_workbench_dir): | |
140 | self.base_workbench_dir = os.path.abspath(base_workbench_dir) | |
141 | if not os.path.exists(self.base_workbench_dir): | |
142 | os.makedirs(self.base_workbench_dir) | |
143 | ||
144 | def create_workbench(self): | |
145 | """ | |
146 | Create and return the path to a new workbench (directory). | |
147 | """ | |
148 | return Workbench(tempfile.mkdtemp(dir=self.base_workbench_dir)) |