]> wagnertech.de Git - mfinanz.git/blob - SL/File/Object.pm
Merge branch 'master' of http://wagnertech.de/git/mfinanz
[mfinanz.git] / SL / File / Object.pm
1 package SL::File::Object;
2
3 use strict;
4 use parent qw(Rose::Object);
5 use DateTime;
6
7 use Rose::Object::MakeMethods::Generic (
8   scalar => [ qw() ],
9   'scalar --get_set_init' => [ qw(db_file loaded id file_version version newest) ],
10 );
11
12 #use SL::DB::Helper::Attr;
13 #__PACKAGE__->_as_timestamp('mtime');
14 # wie wird das mit dem Attr Helper gemacht damit er bei nicht DB Objekten auch geht?
15
16 sub mtime_as_timestamp_s {
17   $::locale->format_date_object($_[0]->mtime, precision => 'second');
18 }
19
20 # wrapper methods
21
22 sub itime {
23   $_[0]->loaded_db_file->itime;
24 }
25
26 sub file_name {
27   $_[0]->loaded_db_file->file_name;
28 }
29
30 sub file_type {
31   $_[0]->loaded_db_file->file_type;
32 }
33
34 sub object_type {
35   $_[0]->loaded_db_file->object_type;
36 }
37
38 sub object_id {
39   $_[0]->loaded_db_file->object_id;
40 }
41
42 sub mime_type {
43   $_[0]->loaded_db_file->mime_type;
44 }
45
46 sub file_title {
47   $_[0]->loaded_db_file->title;
48 }
49
50 sub file_description {
51   $_[0]->loaded_db_file->description;
52 }
53
54 sub backend {
55   $_[0]->loaded_db_file->backend;
56 }
57
58 sub source {
59   $_[0]->loaded_db_file->source;
60 }
61
62 # methods to go directly into the backends
63
64 sub get_file {
65   $_[0]->backend_class->get_filepath(dbfile => $_[0]->loaded_db_file, version => $_[0]->version)
66 }
67
68 sub get_content {
69   $_[0]->backend_class->get_content(dbfile => $_[0]->loaded_db_file,  version => $_[0]->version)
70 }
71
72 sub mtime {
73   $_[0]->backend_class->get_mtime(dbfile => $_[0]->loaded_db_file, version => $_[0]->version)
74 }
75
76 sub version_count {
77   $_[0]->backend_class->get_version_count(dbfile => $_[0]->loaded_db_file)
78 }
79
80 sub versions {
81   SL::File->get_all_versions(dbfile => $_[0]->loaded_db_file)
82 }
83
84 sub save_contents {
85   SL::File->save(dbfile => $_[0]->loaded_db_file, file_contents => $_[1] )
86 }
87
88 sub save_file {
89   SL::File->save(dbfile => $_[0]->loaded_db_file, file_path => $_[1] )
90 }
91
92 sub delete {
93   SL::File->delete(dbfile => $_[0]->loaded_db_file)
94 }
95
96 sub delete_last_version {
97   SL::File->delete(dbfile => $_[0]->loaded_db_file, last => 1 )
98 }
99
100 sub delete_file_version {
101   SL::File->delete(dbfile => $_[0]->loaded_db_file, file_version => $_[0]->file_version )
102 }
103
104 sub purge {
105   SL::File->delete(dbfile => $_[0]->loaded_db_file, all_but_notlast => 1 )
106 }
107
108 sub rename {
109   SL::File->rename(dbfile => $_[0]->loaded_db_file, to => $_[1])
110 }
111
112 # internals
113
114 sub backend_class {
115   SL::File->get_backend_class($_[0]->backend)
116 }
117
118
119 sub loaded_db_file {  # so, dass wir die nur einmal laden.
120   if (!$_[0]->loaded) {
121     $_[0]->db_file->load;
122     $_[0]->loaded(1);
123   }
124   $_[0]->db_file;
125 }
126
127 sub clone {
128   bless +{ %{ $_[0] } }, __PACKAGE__;
129 }
130
131
132 sub init_db_file      { die 'must always have a db file'; }
133 sub init_loaded       { 0 }
134 sub init_id           { 0 }
135 sub init_version      { 0 }
136 sub init_file_version { undef }
137 sub init_newest       { 1 }
138
139 1;
140
141 __END__
142
143 =encoding utf-8
144
145 =head1 NAME
146
147 SL::File::Object - a filemangement object wrapper
148
149 =head1 SYNOPSIS
150
151   use SL::File;
152
153   my ($object) = SL::File->get_all(object_id   => $object_id,
154                                    object_type => $object_type,
155                                    file_type   => 'image',   # may be optional
156                                    source      => 'uploaded' # may be optional
157                                   );
158 # read attributes
159
160   my $object_id   = $object->object_id,
161   my $object_type = $object->object_type,
162   my $file_type   = $object->file_type;
163   my $file_name   = $object->file_name;
164   my $mime_type   = $object->mime_type;
165
166   my $mtime       = $object->mtime;
167   my $itime       = $object->itime;
168   my $id          = $object->id;
169   my $newest      = $object->newest;
170
171   my $versions    = $object->version_count;
172
173   my @versionobjs = $object->versions;
174   foreach ( @versionobjs ) {
175     my $mtime    = $_->mtime;
176     my $contents = $_->get_content;
177   }
178
179 # update
180
181   $object->rename("image1.png");
182   $object->save_contents("new text");
183   $object->save_file("/tmp/empty.png");
184   $object->purge;
185   $object->delete_last_version;
186   $object->delete;
187
188 =head1 DESCRIPTION
189
190 This is a wrapper around a single object in the filemangement.
191
192 =head1 METHODS
193
194 Following methods are wrapper to read the attributes of L<SL::DB::File> :
195
196 =over 4
197
198 =item C<object_id>
199
200 =item C<object_type>
201
202 =item C<file_type>
203
204 =item C<file_name>
205
206 =item C<mime_name>
207
208 =item C<file_title>
209
210 =item C<file_description>
211
212 =item C<backend>
213
214 =item C<source>
215
216 =item C<itime>
217
218 =item C<id>
219
220 =back
221
222 Additional are there special methods. If the Object is created by
223 C<SL::File::get_all_versions()> or by C<$object->versions>. It has a version
224 number in C<version> and a version object in C<file_version> of type
225 C<SL::DB::FileVersion>. So the different mtime, filepath or content can be
226 retrieved:
227
228 =over 4
229
230 =item C<mtime>
231
232 get the modification time of a (versioned) object
233
234 =item C<get_file>
235
236 get the full qualified file path of the (versioned) object
237
238 =item C<get_content>
239
240 get the content of the (versioned) object
241
242 =item C<version_count>
243
244 Get the available versions of the file
245
246 =item C<versions>
247
248 Returns an array of SL::File::Object objects with the available versions of the file, starting with the newest version.
249
250 =item C<newest>
251
252 If set this is the newest version of the file.
253
254 =item C<save_contents $contents>
255
256 Store a new contents to the file (as a new version).
257
258 =item C<save_file $filepath>
259
260 Store the content of an (absolute)file path to the file
261
262 =item C<delete>
263
264 Delete the file with all of his versions
265
266 =item C<delete_last_version>
267
268 Delete only the last version of the file with implicit decrement of the version_count.
269
270 =item C<purge>
271
272 Delete all old versions of the file. Only one version exist after purge. The version count is reset to 1.
273
274 =item C<rename $newfilename>
275
276 Renames the filename
277
278 =back
279
280 =head1 SEE ALSO
281
282 L<SL::File>
283
284 =head1 AUTHOR
285
286 Martin Helmling E<lt>martin.helmling@opendynamic.deE<gt>
287
288 =cut