4 use parent qw(Rose::Object);
10 use SL::Webdav::Object;
11 use SL::Webdav::VersionScheme::Serial;
12 use SL::Webdav::VersionScheme::Timestamp;
14 use Rose::Object::MakeMethods::Generic (
15 scalar => [ qw(type number) ],
16 'scalar --get_set_init' => [ qw(version_scheme) ],
20 sales_quotation => 'angebote',
21 sales_order => 'bestellungen',
22 request_quotation => 'anfragen',
23 purchase_order => 'lieferantenbestellungen',
24 sales_delivery_order => 'verkaufslieferscheine',
25 purchase_delivery_order => 'einkaufslieferscheine',
26 credit_note => 'gutschriften',
27 invoice => 'rechnungen',
28 purchase_invoice => 'einkaufsrechnungen',
30 service => 'dienstleistungen',
31 assembly => 'erzeugnisse',
33 general_ledger => 'dialogbuchungen',
34 accounts_payable => 'kreditorenbuchungen',
40 my @objects = $self->get_all_objects;
43 for my $obj (@objects) {
44 my $filename = join '.', grep $_, $obj->basename, $obj->extension;
46 my $file = $files_by_name{$filename} ||= SL::Webdav::File->new(filename => $filename, webdav => $self, loaded => 1);
47 $file->add_objects($obj);
50 return values %files_by_name;
56 my $path = $self->webdav_path;
59 my $base_path = $ENV{'SCRIPT_NAME'};
60 $base_path =~ s|[^/]+$||;
61 if (opendir my $dir, $path) {
62 foreach my $file (sort { lc $a cmp lc $b } map { decode("UTF-8", $_) } readdir $dir) {
63 next if (($file eq '.') || ($file eq '..'));
68 push @objects, SL::Webdav::Object->new(filename => $fname, webdav => $self);
80 my @files = $self->get_all_files;
81 map { ($_->versions)[-1] } @files;
84 sub _sanitized_number {
85 my $number = $_[0]->number;
86 $number =~ s|[/\\]|_|g;
93 die "No client set in \$::auth" unless $::auth->client;
94 die "Need number" unless $self->number;
96 my $type = $type_to_path{$self->type};
98 die "Unknown type" unless $type;
100 my $path = File::Spec->catdir("webdav", $::auth->client->{id}, $type, $self->_sanitized_number);
103 Common::mkdir_with_parents($path);
109 sub init_version_scheme {
110 SL::Webdav::VersionScheme::Timestamp->new;
121 SL::Webdav - Webdav manipulation
125 # get list of all documents for this record
128 my $webdav = SL::Webdav->new(
133 # gives you SL::Webdav::File instances
134 my $webdav_files = $webdav->get_all_files;
136 # gives you the objects instead
137 my $webdav_objects = $webdav->get_all_objects;
139 # gives you only the latest objects
140 my $webdav_objects = $webdav->get_all_latest;
142 # physical path to this dir
143 my $path = $webdav->webdav_path;
147 This module is a wrapper around the webdav storage mechanism with some simple
148 document management functionality.
150 This is not a replacement for real document management, mostly because the
151 underlying webdav storage is not fully under our control. It's common practice
152 to allow people direct samba access to the webdav, so all versioning
153 information needs to be encoded into the filename of a file, and nonsensical
154 filenames must not break assumptions.
156 This module is intended to be used if you need to scan the folder for
157 previously saved files and need to build a list in order to display it.
159 If you need to manipulate the versions of a file, see L<SL::Webdav::File>
161 If you need to access a file directly for download or metadata, see L<SL::Webdav::Object>
167 =item C<get_all_objects>
169 Returns all L<SL::Webdav::Objects> found.
171 =item C<get_all_files>
173 Returns all objects sorted into L<SL::Webdav::File>s.
175 =item C<get_all_latest>
177 Returns only the latest object of each L<SL::Webdav::File> found.
181 Returns the physical path to this webdav object.
185 =head1 VERSIONING SCHEME
187 You may register a versioning scheme object to handle versioning. It is
188 expected to implement the following methods:
194 Must return a string that will be used to separate the basename and version part of
195 filenames when generating and parsing.
197 =item C<extract_regexp>
199 Must return a regexp that will match a versioning string at the end of a
200 filename after the extension has been stripped off. It will be surrounded by
205 Must return a comparison function that will be invoked with two
206 L<SL::Webdav::Object> instances.
208 =item C<first_version>
210 Must return a string representing the version of the first of a series of objects.
214 =item C<next_version>
216 Will be called with the latest L<SL::Webdav::Object> and must return a new version string.
218 =item C<keep_last_version>
220 Will be called with the latest L<SL::Webdav::Object>. Truish return value will
221 cause the latest object to be overwritten instead of creating a new version.
225 =head1 BUGS AND CAVEATS
231 File operations are inconsistently L<File::Spec>ed.
237 L<SL::Webdav::File>, L<SL::Webdav::Object>
241 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>