package users::SQL::UserProfile; use base 'SQL::DocumentTable'; use Contenido::Globals; sub db_table { return 'profiles'; } my $available_filters = [qw( _class_filter _status_filter _in_id_filter _id_filter _name_filter _class_excludes_filter _sfilter_filter _excludes_filter _datetime_filter _date_equal_filter _date_filter _previous_days_filter _s_filter _login_filter _email_filter _nickname_filter )]; sub available_filters { return $available_filters; } my @required_properties = ( { # Идентификатор документа, сквозной по всем типам... 'attr' => 'id', 'type' => 'integer', 'rusname' => 'Идентификатор документа', 'hidden' => 1, 'readonly' => 1, 'auto' => 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' => 'name', 'type' => 'string', 'rusname' => 'Ф.И.О.', 'column' => 2, 'db_field' => 'name', 'db_type' => 'varchar(255)', }, { # Время создания документа, служебное поле... 'attr' => 'ctime', 'type' => 'datetime', 'rusname' => 'Время создания', 'readonly' => 1, 'auto' => 1, 'hidden' => 1, 'db_field' => 'ctime', 'db_type' => 'timestamp', 'db_opts' => 'not null default now()', 'default' => 'CURRENT_TIMESTAMP', }, { # Время модификации документа, служебное поле... 'attr' => 'mtime', 'type' => 'datetime', 'rusname' => 'Время модификации', 'hidden' => 1, 'auto' => 1, 'db_field' => 'mtime', 'db_type' => 'timestamp', 'db_opts' => 'not null default now()', 'default' => 'CURRENT_TIMESTAMP', }, { # Дата рождения 'attr' => 'dtime', 'type' => 'date', 'rusname' => 'Дата рождения', 'db_field' => 'dtime', 'db_type' => 'timestamp', 'default' => 'CURRENT_TIMESTAMP', }, { # Дата и время логина... 'attr' => 'lastlogin', 'type' => 'datetime', 'rusname' => 'Дата и время последнего логина 1)', 'column' => 1, 'db_field' => 'lastlogin', 'db_type' => 'timestamp', 'db_opts' => 'not null default now()', 'default' => 'CURRENT_TIMESTAMP', }, { # Массив секций, обрабатывается специальным образом... 'attr' => 'sections', 'type' => 'sections_list', 'rusname' => 'Секции', 'hidden' => 1, 'db_field' => 'sections', 'db_type' => 'integer[]', }, { # Одно поле статуса является встроенным... 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус', 'db_field' => 'status', 'db_type' => 'integer', }, { # Дополнительное поле статуса 'attr' => 'type', 'type' => 'integer', 'rusname' => 'Тип пользователя (project-oriented)', 'db_field' => 'type', 'db_type' => 'integer', }, { # Никнейм... 'attr' => 'nickname', 'type' => 'string', 'rusname' => 'Ник', 'column' => 3, 'db_field' => 'nickname', 'db_type' => 'text', }, { # Login... 'attr' => 'login', 'type' => 'string', 'rusname' => 'Логин', 'column' => 4, 'db_field' => 'login', 'db_type' => 'text', }, { # Login method... 'attr' => 'login_method', 'type' => 'string', 'rusname' => 'Метод входа', 'db_field' => 'login_method', 'db_type' => 'text', }, { # E-mail... 'attr' => 'email', 'type' => 'string', 'rusname' => 'E-mail (primary)', 'hidden' => $state->{users}->use_credentials ? 1 : undef, 'readonly' => $state->{users}->use_credentials ? 1 : undef, 'db_field' => 'email', 'db_type' => 'text', }, ); # ---------------------------------------------------------------------------- # Свойства храним в массивах, потому что порядок важен! # Это общие свойства - одинаковые для всех документов. # # attr - обязательный параметр, название атрибута; # type - тип аттрибута, требуется для отображдения; # rusname - русское название, опять же требуется для отображения; # hidden - равен 1, когда # readonly - инициализации при записи только без изменения в дальнейшем # db_field - поле в таблице # default - значение по умолчанию (поле всегда имеет это значение) # ---------------------------------------------------------------------------- sub required_properties { return @required_properties; } ########### FILTERS DESCRIPTION #################################################################################### sub _login_filter { my ($self,%opts)=@_; return undef unless ( exists($opts{login}) ); if (exists $opts{ilike} && $opts{ilike} == 1) { return &SQL::Common::_generic_name_filter('d.login', $opts{login}, 0, \%opts); }else{ return &SQL::Common::_generic_text_filter('d.login', $opts{login}); } } sub _email_filter { my ($self,%opts)=@_; return undef unless ( exists $opts{email} ); if ( $state->{users}->use_credentials ) { my ($wheres, $values); my $op = exists $opts{like} ? 'like' : exists $opts{ilike} ? 'ilike' : '='; $wheres = "d.id IN (SELECT uid FROM profile_credentials WHERE class = 'users::Email' AND name $op ?)"; $values = [$opts{email}]; return $wheres, $values; } else { if (exists $opts{ilike} && $opts{ilike} == 1) { return &SQL::Common::_generic_name_filter('d.email', $opts{email}, 0, \%opts); } else { return &SQL::Common::_generic_text_filter('d.email', $opts{email}); } } } sub _nickname_filter { my ($self,%opts)=@_; return undef unless ( exists($opts{nickname}) ); if (exists $opts{ilike} && $opts{ilike} == 1) { return &SQL::Common::_generic_name_filter('d.nickname', $opts{nickname}, 0, \%opts); }else{ return &SQL::Common::_generic_text_filter('d.nickname', $opts{nickname}); } } 1;