add a file_by_name method to the article and site objects
authorTony Cook <tony@develop-help.com>
Mon, 17 Jun 2013 01:43:07 +0000 (11:43 +1000)
committerTony Cook <tony@develop-help.com>
Mon, 17 Jun 2013 01:43:07 +0000 (11:43 +1000)
site/cgi-bin/modules/BSE/TB/SiteCommon.pm
t/050-local/010-api.t

index 61457d6..bcbb43c 100644 (file)
@@ -2,7 +2,7 @@ package BSE::TB::SiteCommon;
 use strict;
 use Carp qw(confess);
 
-our $VERSION = "1.012";
+our $VERSION = "1.013";
 
 =head1 NAME
 
@@ -227,13 +227,59 @@ sub children {
     Articles->children($self->{id});
 }
 
+=item files
+
+Return the files for the article.
+
+This caches the file list.
+
+=cut
+
 sub files {
   my ($self) = @_;
 
+  unless ($self->{_files}) {
+    $self->{_files} = [ $self->_files ];
+  }
+
+  return @{$self->{_files}};
+}
+
+sub _files {
+  my ($self) = @_;
+
   require BSE::TB::ArticleFiles;
   return BSE::TB::ArticleFiles->getBy(articleId=>$self->{id});
 }
 
+=item uncache_files
+
+Remove the cached file list.
+
+=cut
+
+sub uncache_files {
+  my ($self) = @_;
+
+  delete $self->{_files};
+}
+
+=item file_by_name
+
+Return the file with the given name, or nothing if there is no such
+file.
+
+=cut
+
+sub file_by_name {
+  my ($self, $name) = @_;
+
+  my ($file) = grep $_->name eq $name, $self->files
+    or return;
+
+  return $file;
+}
+
 sub remove_images {
   my ($self, $cfg) = @_;
 
@@ -275,6 +321,7 @@ sub remove_files {
 
     $file->remove($cfg);
   }
+  $self->uncache_files;
 }
 
 sub _copy_fh_to_fh {
index 57c62dd..ee7fad3 100644 (file)
@@ -1,7 +1,7 @@
 #!perl -w
 use strict;
 use BSE::Test qw(make_ua base_url);
-use Test::More tests => 62;
+use Test::More tests => 67;
 use File::Spec;
 use File::Slurp;
 use Carp qw(confess);
@@ -165,6 +165,24 @@ SKIP: {
   my $mine = read_file("t/t000load.t");
   my $stored = read_file($file->full_filename);
   is($stored, $mine, "check contents");
+
+  my @files = $art->files;
+  is (@files, 1, "should be one file");
+  is($files[0]->id, $file->id, "should be what we added");
+
+  my $file2 = $art->add_file
+    (
+     $cfg,
+     displayName => "test2.txt",
+     filename => "t/data/t101.jpg",
+     store => 0,
+     name => "test",
+    );
+  ok($file2, "add a second file (named)");
+  $art->uncache_files;
+  my $named = $art->file_by_name("test");
+  ok($named, "got the named file");
+  is($named->id, $file2->id, "and it's the file we added");
 }
 
 {