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