]>
Commit | Line | Data |
---|---|---|
efcc5a30 TC |
1 | package BSE::TB::SiteUserGroups; |
2 | use strict; | |
3 | use base 'Squirrel::Table'; | |
4 | use BSE::TB::SiteUserGroup; | |
5 | ||
b7cadc84 | 6 | our $VERSION = "1.002"; |
cb7fd78d | 7 | |
c2096d67 TC |
8 | use constant SECT_QUERY_GROUPS => "Query Groups"; |
9 | use constant SECT_QUERY_GROUP_PREFIX => 'Query group '; | |
10 | ||
efcc5a30 TC |
11 | sub rowClass { 'BSE::TB::SiteUserGroup' } |
12 | ||
32696f84 | 13 | sub query_groups { |
c2096d67 TC |
14 | my ($class, $cfg) = @_; |
15 | ||
32696f84 | 16 | my @groups; |
c2096d67 TC |
17 | my $id = 1; |
18 | my $name; | |
19 | while ($name = $cfg->entry(SECT_QUERY_GROUPS, $id)) { | |
20 | my $group = $class->getQueryGroup($cfg, -$id); | |
21 | $group and push @groups, $group; | |
3f187817 | 22 | |
c2096d67 TC |
23 | ++$id; |
24 | } | |
25 | ||
32696f84 TC |
26 | return @groups; |
27 | } | |
28 | ||
29 | sub admin_and_query_groups { | |
30 | my ($class, $cfg) = @_; | |
31 | ||
32 | return | |
33 | ( | |
34 | $class->all, | |
35 | $class->query_groups($cfg), | |
36 | ); | |
c2096d67 TC |
37 | } |
38 | ||
39 | sub getQueryGroup { | |
40 | my ($class, $cfg, $id) = @_; | |
41 | ||
42 | my $name = $cfg->entry(SECT_QUERY_GROUPS, -$id) | |
43 | or return; | |
3f187817 TC |
44 | my $section = SECT_QUERY_GROUP_PREFIX . $name; |
45 | my $sql = $cfg->entry($section, 'sql') | |
c2096d67 | 46 | or return; |
3f187817 TC |
47 | my $sql_all = $cfg->entry($section, 'sql_all'); |
48 | ||
49 | return bless | |
50 | { | |
51 | id => $id, | |
52 | name => "*$name", | |
53 | sql=>$sql, | |
54 | sql_all => $sql_all, | |
55 | }, "BSE::TB::SiteUserQueryGroup"; | |
c5286ebe TC |
56 | } |
57 | ||
58 | sub getByName { | |
59 | my ($class, $cfg, $name) = @_; | |
60 | ||
61 | if ($name =~ /^\*/) { | |
62 | $name = substr($name, 1); | |
63 | ||
64 | my %q_groups = map lc, reverse $cfg->entries(SECT_QUERY_GROUPS); | |
65 | if ($q_groups{lc $name}) { | |
66 | return $class->getQueryGroup($cfg, -$q_groups{lc $name}) | |
67 | or return; | |
68 | } | |
69 | else { | |
70 | return; | |
71 | } | |
72 | } | |
73 | else { | |
74 | return $class->getBy(name => $name); | |
75 | } | |
76 | } | |
77 | ||
dfd483db TC |
78 | sub getById { |
79 | my ($self, $id) = @_; | |
80 | ||
81 | return $id > 0 ? $self->getByPkey($id) : $self->getQueryGroup(BSE::Cfg->single, $id); | |
82 | } | |
83 | ||
c5286ebe | 84 | package BSE::TB::SiteUserQueryGroup; |
32696f84 | 85 | use constant OWNER_TYPE => "G"; |
3f187817 | 86 | use Carp qw(confess); |
32696f84 TC |
87 | |
88 | sub id { $_[0]{id} } | |
89 | ||
90 | sub name { $_[0]{name} } | |
c5286ebe TC |
91 | |
92 | sub contains_user { | |
93 | my ($self, $user) = @_; | |
94 | ||
95 | my $id = ref $user ? $user->{id} : $user; | |
96 | ||
97 | my $rows = BSE::DB->single->dbh->selectall_arrayref($self->{sql}, { MaxRows=>1 }, $id); | |
98 | $rows && @$rows | |
99 | and return 1; | |
100 | ||
101 | return 0; | |
c2096d67 TC |
102 | } |
103 | ||
3f187817 TC |
104 | sub member_ids { |
105 | my ($self) = @_; | |
106 | ||
107 | if ($self->{sql_all}) { | |
108 | my $dbh = BSE::DB->single->dbh; | |
109 | my $values = $dbh->selectcol_arrayref($self->{sql_all}); | |
110 | $values | |
111 | or confess "Cannot execute $self->{sql_all}: ", $dbh->errstr, "\n"; | |
112 | ||
113 | return @$values; | |
114 | } | |
115 | else { | |
b7cadc84 | 116 | return grep $self->contains_user($_), BSE::TB::SiteUsers->all_ids; |
3f187817 TC |
117 | } |
118 | } | |
119 | ||
32696f84 TC |
120 | sub file_owner_type { |
121 | return OWNER_TYPE; | |
122 | } | |
123 | ||
124 | sub files { | |
125 | my ($self) = @_; | |
126 | ||
127 | require BSE::TB::OwnedFiles; | |
128 | return BSE::TB::OwnedFiles->getBy(owner_type => OWNER_TYPE, | |
129 | owner_id => $self->id); | |
130 | } | |
131 | ||
132 | sub data_only { | |
133 | return +{ %{$_[0]} }; | |
134 | } | |
135 | ||
efcc5a30 | 136 | 1; |