Revision 3 (by ahitrov@rambler.ru, 2010/03/24 15:19:32) The CORE
package @NAME@::SQL::SampleTable;

use base 'SQL::ProtoTable';

sub db_table
{
	return 'sample';
}

sub available_filters {
	my @available_filters = qw(	
					_class_filter
					_status_filter
					_in_id_filter
					_id_filter
					_class_excludes_filter

					_excludes_filter
				);
	return \@available_filters; 
}

# ----------------------------------------------------------------------------
# �������� ������ � ��������, ������ ��� ������� �����!
# ��� ����� �������� - ���������� ��� ���� ����������.
#
#   attr - ������������ ��������, �������� ��������;
#   type - ��� ���������, ��������� ��� ������������;
#   rusname - ������� ��������, ����� �� ��������� ��� �����������;
#   hidden - ����� 1, ����� 
#   readonly - ������������� ��� ������ ������ ��� ��������� � ����������
#   db_field - ���� � �������
#   default  - �������� �� ��������� (���� ������ ����� ��� ��������)
# ----------------------------------------------------------------------------
sub required_properties
{
	return (
		{							# ������������� ���������, �������� �� ���� �����...
			'attr'		=> 'id',
			'type'		=> 'integer',
			'rusname'	=> '������������� ���������',
			'hidden'	=> 1,
			'auto'		=> 1,
			'readonly'	=> 1,
			'db_field'	=> 'id',
			'db_type'	=> 'integer',
			'db_opts'	=> "not null default nextval('public.documents_id_seq'::text)", 
		},
		{							# ����� ���������...
			'attr'		=> 'class',
			'type'		=> 'string',
			'rusname'	=> '����� ���������',
			'hidden'	=> 1,
			'readonly'	=> 1,
			'db_field'	=> 'class',
			'db_type'	=> 'varchar(48)',
			'db_opts'	=> 'not null',
		},
		{							# ����� �������� ���������, ��������� ����...
			'attr'		=> 'start',
			'type'		=> 'datetime',
			'rusname'	=> '����/����� ������',
			'db_field'	=> 'start',
			'db_type'	=> 'timestamp',
			'db_opts'	=> 'not null',
		},
		{							# ����� ����������� ���������, ��������� ����...
			'attr'		=> 'finish',
			'type'		=> 'datetime',
			'rusname'	=> '����/����� ���������',
			'db_field'	=> 'finish',
			'db_type'	=> 'timestamp',
			'db_opts'	=> 'not null',
		},
		{							# ���� ���� ������� �������� ����������...
			'attr'		=> 'external_id',
			'type'		=> 'integer',
			'rusname'	=> '������� id',
			'db_field'	=> 'external_id',
			'db_type'       => 'integer',
		},
		{						       # ���� ���� ������� �������� ����������...
			'attr'	  => 'event_id',
			'type'	  => 'integer',
			'rusname'       => '�������',
			'db_field'      => 'event_id',
			'db_type'       => 'integer',
		},
		{						       # ���� ���� ������� �������� ����������...
			'attr'	  => 'place_id',
			'type'	  => 'integer',
			'rusname'       => '����� ����������',
			'db_field'      => 'place_id',
			'db_type'       => 'integer',
		},
	);
}


########### FILTERS DESCRIPTION ####################################################################################
sub _excludes_filter {
	my ($self,%opts)=@_;
	if (exists $opts{excludes}) {
		# - ���������� �� ������
		my @eids = ();
		if (ref($opts{excludes}) eq 'ARRAY') {
			@eids = @{ $opts{excludes} };
		} elsif ($opts{excludes} =~ /[^\d\,]/) {
			warn "Contenido Warning: � ������ ��������������� ��� ���������� ����������� ���������� ��������. �������� excludes ������������ (".$opts{excludes}.").\n";
		} else {
			@eids = split(',', $opts{excludes});
		}

		my $excludes = join(',', @eids);

		# �������� ������ �������, ���� ��� join-������.
		# ������ ��� � ���� ������ ������� ����� ���������� ������� �� ������� links,
		#  ��� ����������� ������ ������� ������.
		if (@eids) {
			if (exists($opts{ldest}) || exists($opts{lsource})) {
				if (exists($opts{ldest})) {
					return " (l.source_id not in ($excludes)) ";
				} elsif (exists($opts{lsource})) {
					return " (l.dest_id   not in ($excludes)) ";
				}
			} else {
				return  " (d.id not in ($excludes)) ";
			}
		}
	}
	return undef;
}


sub _get_orders {
	my ($self, %opts) = @_;

	if ($opts{order_by}) {
		return ' order by '.$opts{order_by};
	} else {
		return ' order by start desc,finish desc';
	}
	return undef;
}

1;