Line # Revision Author
1 234 ahitrov package blogs::Blog;
2
3 use base "Contenido::Document";
4 use Contenido::Globals;
5
6 sub extra_properties
7 {
8 return (
9 { 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус чтения/комментирования',
10 'cases' => [
11 [0, 'Заблокирован'],
12 [1, 'Открыт для комментирования всеми'],
13 [2, 'Открыт для комментирования членами сообщества'],
14 [3, 'Открыт только для чтения'],
15 ],
16 },
17 { 'attr' => 'type', 'type' => 'status', 'rusname' => 'Статус записи',
18 'cases' => [
19 [0, 'Личный блог'],
20 [1, 'Блог сообщества'],
21 [2, 'Публичный блог'],
22 [3, 'Системный блог (contenido)'],
23 ],
24 },
25 { 'attr' => 'abstr', 'type' => 'wysiwyg', 'rusname' => 'Краткое описание', 'rows' => 10 },
26 { 'attr' => 'icon', 'type' => 'image', 'rusname' => 'Аватар', preview => ['300x300','250x250','200x200','150x150','120x120','100x100','32x32'] },
27 )
28 }
29
30 sub class_name
31 {
32 return 'Блог';
33 }
34
35 sub class_description
36 {
37 return 'Профиль блога';
38 }
39
40 sub class_table
41 {
42 return 'blogs::SQL::BlogsTable';
43 }
44
45 sub can_read {
46 my $self = shift;
47 my $uid = shift;
48 return undef unless $uid;
49
50 if ( $uid == $self->uid || $self->status == 1 || ($self->status == 2 && $self->is_member($uid)) ) {
51 return 1;
52 } else {
53 return 0;
54 }
55 }
56
57 sub why_cant_i_read {
58 my $self = shift;
59 my $uid = shift;
60 return 'не указан пользователь' unless $uid;
61
62 if ( $self->status == 0 ) {
63 return 'блог заблокирован';
64 } elsif ( $self->status == 2 && !$self->is_member($uid) ) {
65 return 'блог открыт только для участников сообщества';
66 } else {
67 return 'окстись, ты можешь прекрасно все читать...';
68 }
69 }
70
71 sub can_write {
72 my $self = shift;
73 my $uid = shift;
74 return undef unless $uid;
75
76 return 1 if $uid == $self->uid;
77 return 0 unless $self->status;
78 if ( $self->type == 2 || ($self->type == 1 && $self->is_member($uid)) || ($self->type == 3 && ref $user) ) {
79 return 1;
80 } else {
81 return 0;
82 }
83 }
84
85 sub why_cant_i_write {
86 my $self = shift;
87 my $uid = shift;
88 return 'не указан пользователь' unless $uid;
89
90 if ( $self->status == 0 ) {
91 return 'блог заблокирован';
92 } elsif ( $self->type == 0 && $self->uid != $uid ) {
93 return 'это чужой личный блог';
94 } elsif ( $self->type == 1 && !$self->is_member($uid) ) {
95 return 'вы не являетесь участником данного сообщества';
96 } else {
97 return 'окстись, ты можешь прекрасно все читать...';
98 }
99 }
100
101 sub is_member {
102 my $self = shift;
103 my $uid = shift;
104 return undef unless $uid;
105
106 return (($uid == $self->uid) || (grep { $_ == $uid } $self->members)) ? 1 : 0;
107 }
108
109 sub is_moderator {
110 my $self = shift;
111 my $uid = shift;
112 return undef unless $uid;
113
114 return $uid == $self->uid || grep { $_ == $uid } $self->moderators ? 1 : 0;
115 }
116
117 sub is_subscriber {
118 my $self = shift;
119 my $uid = shift;
120 return undef unless $uid;
121
122 return (($uid == $self->uid) || (grep { $_ == $uid } $self->members, $self->readers)) ? 1 : 0;
123 }
124
125 sub subscribe {
126 my $self = shift;
127 my $uid = shift;
128 return undef unless $uid;
129 return undef unless $self->id;
130 return undef if $self->is_subscriber($uid);
131
132 my $link = blogs::SubscriberLink->new ( $keeper );
133 $link->status( 1 );
134 $link->source_id( $uid );
135 $link->dest_id( $self->id );
136 $link->dest_class( $self->class );
137 $link->store;
138 return undef unless $link->id;
139
140 push @{ $self->{readers} }, $uid;
141 $self->store;
142 return 1;
143 }
144
145 sub unsubscribe {
146 my $self = shift;
147 my $uid = shift;
148 return undef unless $uid;
149 return undef unless $self->id;
150
151 warn "DELETE FROM ".blogs::SubscriberLink->class_table->db_table." WHERE source_id = ? AND dest_id = ? AND dest_class = ?\n" if $DEBUG;
152 my $res = $keeper->SQL->prepare('DELETE FROM '.blogs::SubscriberLink->class_table->db_table.' WHERE source_id = ? AND dest_id = ? AND dest_class = ?');
153 $res->execute( $uid, $self->id, $self->class );
154 $res->finish;
155
156 @{ $self->{readers} } = grep { $_ != $uid } @{ $self->{readers} };
157 $self->store;
158 return 1;
159 }
160
161 sub contenido_status_style
162 {
163 my $self = shift;
164 if ( $self->status == 2 ) {
165 return 'color:green;';
166 } elsif ( $self->status == 3 ) {
167 return 'color:olive;';
168 } elsif ( $self->status == 4 ) {
169 return 'color:green;';
170 } elsif ( $self->status == 5 ) {
171 return 'color:red;';
172 }
173 }
174
175 sub search_fields
176 {
177 return ('name');
178 }
179
180 sub table_links
181 {
182 return [
183 { name => 'Записи', class => 'blogs::Record', filter => 'blog_id', field => 'blog_id' },
184 ];
185 }
186
187 sub pre_store
188 {
189 my $self = shift;
190
191 unless ( $self->id ) {
192 if ( $self->status == 3 && ref $user ) {
193 $self->uid( $user->id );
194 }
195 }
196
197 my $default_section = $project->s_alias->{blogs} if ref $project->s_alias eq 'HASH' && exists $project->s_alias->{blogs};
198 if ( $default_section ) {
199 my $sections = $self->{sections};
200 if ( ref $sections eq 'ARRAY' && scalar @$sections ) {
201 my @new_sects = grep { $_ != $default_section } @$sections;
202 push @new_sects, $default_section;
203 $self->sections(@new_sects);
204 } elsif ( $sections && !ref $sections && $sections != $default_section ) {
205 my @new_sects = ($default_section, $sections);
206 $self->sections(@new_sects);
207 } else {
208 $self->sections($default_section);
209 }
210 }
211
212 return 1;
213 }
214
215 1;