]> git.decadent.org.uk Git - memories.git/blob - Memories/Tag.pm
Update to policy version 3.8.0
[memories.git] / Memories / Tag.pm
1 package Memories::Tag;
2 use strict;
3 use base qw(Memories::DBI Maypole::Model::CDBI::Plain);
4 __PACKAGE__->columns(Essential => qw/id name/);
5
6 Memories::Photo->set_sql(sorted_by_tag => q/
7 SELECT photo.id as id, title, uploader, uploaded, x, y
8 FROM photo, tagging
9 WHERE tagging.photo = photo.id
10     AND tagging.tag = ?
11 ORDER BY photo.uploaded DESC
12 /
13 );
14
15 sub view :Exported {
16     my ($self, $r) = @_;
17     my $tag;
18     my $page = $r->params->{page} || 1;
19     my $pager = Class::DBI::Pager::_pager("Memories::Photo",
20         Memories->config->{photos_per_page}, $page);
21     $r->{template_args}{pager} = $pager;
22     my @tags = map { $self->search(name => $_)->first } @{$r->args};
23
24     if (@{$r->args} > 1) { # This is actually an n-level search
25         my $sth = $self->multi_search(@tags);
26         $r->{template_args}{photos} = [ $r->{template_args}{pager}->sth_to_objects($sth) ];
27         $sth->finish;
28         $r->{template_args}{tags} = \@tags;
29     } else {
30         if (!@{$r->objects||[]}) {
31             $tag = $tags[0];
32         } else {
33             $tag = $r->objects->[0];
34         }
35         $r->{template_args}{tag} = $tag;
36         $r->{template_args}{tags} = [$tag]; # For selector
37         $r->{template_args}{photos} =
38             [$pager->search_sorted_by_tag($tag->id)];
39     }
40     $r->last_search();
41 }
42
43 sub multi_search {
44     my ($self, @tags) = @_;
45     my $counter = "tagaaa";
46     my @stuff;
47     for my $tag (@tags) {
48         if (!$tag) { return }
49         push @stuff, { tag => $tag, id => $tag->id, counter => $counter++ };
50     }
51     my $sql = "select photo.id as id, photo.title as title, uploader, uploaded, x, y
52 from photo, ". (join ",", map{ "tagging ".$_->{counter} } @stuff).
53 " where ". (join " AND ", map { "$_->{counter}.tag=$_->{id} and photo.id
54 = $_->{counter}.photo" } @stuff);
55
56 $sql .= " order by photo.uploaded desc";
57     my $sth = $self->db_Main->prepare($sql);
58 }
59
60 sub list :Exported {
61     my ($self, $r) = @_;
62     my $page = $r->params->{page} || 1;
63     my $pager = Memories::Tagging->pager(
64         Memories->config->{photos_per_page}, $page
65     );
66     $r->{template_args}{pager} = $pager;
67     $r->objects([map {$_->tag} $pager->search_all]);
68 }
69
70 sub list_js :Exported {
71     my ($self, $r) = @_;
72     $r->objects([ $self->retrieve_all ]);
73 }
74
75 package Memories::Tagging;
76 use base qw(Memories::DBI);
77
78
79 __PACKAGE__->set_sql(user_summary => qq/
80 SELECT  tagging.id id, tag, count(*) AS count
81 FROM tagging, photo
82 WHERE tagging.photo = photo.id AND photo.uploader = ?
83 GROUP BY tag
84 ORDER BY count DESC
85 /);
86
87 1;