| 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; |