Revision 235 (by ahitrov, 2012/08/29 15:03:50) aliases
package blogs::Blog;

use base "Contenido::Document";
use Contenido::Globals;

sub extra_properties
{
	return (
		{ 'attr' => 'status',	'type' => 'status',	'rusname' => 'Статус чтения/комментирования',
			'cases' => [
					[0, 'Заблокирован'],
					[1, 'Открыт для комментирования всеми'],
					[2, 'Открыт для комментирования членами сообщества'],
					[3, 'Открыт только для чтения'],
				],
		},
		{ 'attr' => 'type',	'type' => 'status',	'rusname' => 'Статус записи',
			'cases' => [
					[0, 'Личный блог'],
					[1, 'Блог сообщества'],
					[2, 'Публичный блог'],
					[3, 'Системный блог (contenido)'],
				],
		},
		{ 'attr' => 'header',	'type' => 'string',	'rusname' => 'HTML-заголовок' },
		{ 'attr' => 'abstr',	'type' => 'wysiwyg',	'rusname' => 'Краткое описание', 'rows' => 10 },
		{ 'attr' => 'icon', 	'type' => 'image',	'rusname' => 'Аватар', preview => ['300x300','250x250','200x200','150x150','120x120','100x100','32x32'] },
	)
}

sub class_name
{
	return 'Блог';
}

sub class_description
{
	return 'Профиль блога';
}

sub class_table
{
	return 'blogs::SQL::BlogsTable';
}

sub can_read {
   my $self = shift;
   my $uid = shift;
   return undef         unless $uid;

   if ( $uid == $self->uid || $self->status == 1 || ($self->status == 2 && $self->is_member($uid)) ) {
	return 1;
   } else {
	return 0;
   }
}

sub why_cant_i_read {
   my $self = shift;
   my $uid = shift;
   return 'не указан пользователь'         unless $uid;

   if ( $self->status == 0 ) {
	return 'блог заблокирован';
   } elsif ( $self->status == 2 && !$self->is_member($uid) ) {
	return 'блог открыт только для участников сообщества';
   } else {
	return 'окстись, ты можешь прекрасно все читать...';
   }
}

sub can_write {
   my $self = shift;
   my $uid = shift;
   return undef         unless $uid;

   return 1	if $uid == $self->uid;
   return 0	unless $self->status;
   if ( $self->type == 2 || ($self->type == 1 && $self->is_member($uid)) || ($self->type == 3 && ref $user) ) {
	return 1;
   } else {
	return 0;
   }
}

sub why_cant_i_write {
   my $self = shift;
   my $uid = shift;
   return 'не указан пользователь'         unless $uid;

   if ( $self->status == 0 ) {
	return 'блог заблокирован';
   } elsif ( $self->type == 0 && $self->uid != $uid ) {
	return 'это чужой личный блог';
   } elsif ( $self->type == 1 && !$self->is_member($uid) ) {
	return 'вы не являетесь участником данного сообщества';
   } else {
	return 'окстись, ты можешь прекрасно все читать...';
   }
}

sub is_member {
   my $self = shift;
   my $uid = shift;
   return undef         unless $uid;

   return (($uid == $self->uid) || (grep { $_ == $uid } $self->members)) ? 1 : 0;
}

sub is_moderator {
   my $self = shift;
   my $uid = shift;
   return undef         unless $uid;

   return $uid == $self->uid || grep { $_ == $uid } $self->moderators ? 1 : 0;
}

sub is_subscriber {
   my $self = shift;
   my $uid = shift;
   return undef         unless $uid;

   return (($uid == $self->uid) || (grep { $_ == $uid } $self->members, $self->readers)) ? 1 : 0;
}

sub subscribe {
   my $self = shift;
   my $uid = shift;
   return undef         unless $uid;
   return undef		unless $self->id;
   return undef		if $self->is_subscriber($uid);

   my $link = blogs::SubscriberLink->new ( $keeper );
   $link->status( 1 );
   $link->source_id( $uid );
   $link->dest_id( $self->id );
   $link->dest_class( $self->class );
   $link->store;
   return undef		unless $link->id;

   push @{ $self->{readers} }, $uid;
   $self->store;
   return 1;
}

sub unsubscribe {
   my $self = shift;
   my $uid = shift;
   return undef         unless $uid;
   return undef		unless $self->id;

   warn "DELETE FROM ".blogs::SubscriberLink->class_table->db_table." WHERE source_id = ? AND dest_id = ? AND dest_class = ?\n"					if $DEBUG;
   my $res = $keeper->SQL->prepare('DELETE FROM '.blogs::SubscriberLink->class_table->db_table.' WHERE source_id = ? AND dest_id = ? AND dest_class = ?');
   $res->execute( $uid, $self->id, $self->class );
   $res->finish;

   @{ $self->{readers} } = grep { $_ != $uid } @{ $self->{readers} };
   $self->store;
   return 1;
}

sub contenido_status_style
{
	my $self = shift;
	if ( $self->status == 2 ) {
		return 'color:green;';
	} elsif ( $self->status == 3 ) {
		return 'color:olive;';
	} elsif ( $self->status == 4 ) {
		return 'color:green;';
	} elsif ( $self->status == 5 ) {
		return 'color:red;';
	}
}

sub search_fields
{
	return ('name');
}

sub table_links
{
	return [
		{ name => 'Записи', class => 'blogs::Record', filter => 'blog_id', field => 'blog_id' },
	];
}

sub pre_store
{
	my $self = shift;

	unless ( $self->id ) {
		if ( $self->status == 3 && ref $user ) {
			$self->uid( $user->id );
		}
	}

	my $default_section = $project->s_alias->{blogs}	if ref $project->s_alias eq 'HASH' && exists $project->s_alias->{blogs};
	if ( $default_section ) {
		my $sections = $self->{sections};
		if ( ref $sections eq 'ARRAY' && scalar @$sections ) {
			my @new_sects = grep { $_ != $default_section } @$sections;
			push @new_sects, $default_section;
			$self->sections(@new_sects);
		} elsif ( $sections && !ref $sections && $sections != $default_section ) {
			my @new_sects = ($default_section, $sections);
			$self->sections(@new_sects);
		} else {
			$self->sections($default_section);
		}
	}

	return 1;
}

1;