1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011 Free Software Foundation, Inc
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.
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.
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/>.
22 DEFAULT_WORKBENCH_DIR
= os
.path
.join(
23 tempfile
.gettempdir(), u
'mgoblin_workbench')
26 # Actual workbench stuff
27 # ----------------------
29 class Workbench(object):
31 Represent the directory for the workbench
33 WARNING: DO NOT create Workbench objects on your own,
34 let the WorkbenchManager do that for you!
36 def __init__(self
, dir):
38 WARNING: DO NOT create Workbench objects on your own,
39 let the WorkbenchManager do that for you!
43 def __unicode__(self
):
44 return unicode(self
.dir)
50 def joinpath(self
, *args
):
51 return os
.path
.join(self
.dir, *args
)
53 def localized_file(self
, storage
, filepath
,
54 filename_if_copying
=None,
55 keep_extension_if_copying
=True):
57 Possibly localize the file from this storage system (for read-only
58 purposes, modifications should be written to a new file.).
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.
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).
76 >>> wb_manager.localized_file(
77 ... '/our/workbench/subdir', local_storage,
78 ... ['path', 'to', 'foobar.jpg'])
79 u'/local/storage/path/to/foobar.jpg'
81 >>> wb_manager.localized_file(
82 ... '/our/workbench/subdir', remote_storage,
83 ... ['path', 'to', 'foobar.jpg'])
84 '/our/workbench/subdir/foobar.jpg'
86 >>> wb_manager.localized_file(
87 ... '/our/workbench/subdir', remote_storage,
88 ... ['path', 'to', 'foobar.jpg'], 'source.jpeg', False)
89 '/our/workbench/subdir/foobar.jpeg'
91 >>> wb_manager.localized_file(
92 ... '/our/workbench/subdir', remote_storage,
93 ... ['path', 'to', 'foobar.jpg'], 'source', True)
94 '/our/workbench/subdir/foobar.jpg'
96 if storage
.local_storage
:
97 return storage
.get_local_path(filepath
)
99 if filename_if_copying
is None:
100 dest_filename
= filepath
[-1]
102 orig_filename
, orig_ext
= os
.path
.splitext(filepath
[-1])
103 if keep_extension_if_copying
and orig_ext
:
104 dest_filename
= filename_if_copying
+ orig_ext
106 dest_filename
= filename_if_copying
108 full_dest_filename
= os
.path
.join(
109 self
.dir, dest_filename
)
112 storage
.copy_locally(
113 filepath
, full_dest_filename
)
115 return full_dest_filename
117 def destroy_self(self
):
119 Destroy this workbench! Deletes the directory and all its contents!
121 WARNING: Does no checks for a sane value in self.dir!
124 workbench
= os
.path
.abspath(self
.dir)
126 shutil
.rmtree(workbench
)
131 class WorkbenchManager(object):
133 A system for generating and destroying workbenches.
135 Workbenches are actually just subdirectories of a temporary storage space
136 for during the processing stage.
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
)
144 def create_workbench(self
):
146 Create and return the path to a new workbench (directory).
148 return Workbench(tempfile
.mkdtemp(dir=self
.base_workbench_dir
))