Line # Revision Author
1 196 ahitrov package users::SQL::UserProfile;
2
3 use base 'SQL::DocumentTable';
4 305 ahitrov use Contenido::Globals;
5 196 ahitrov
6 sub db_table
7 {
8 return 'profiles';
9 }
10
11 my $available_filters = [qw(
12
13 _class_filter
14 _status_filter
15 _in_id_filter
16 _id_filter
17 _name_filter
18 _class_excludes_filter
19 _sfilter_filter
20 _excludes_filter
21 _datetime_filter
22 _date_equal_filter
23 _date_filter
24 _previous_days_filter
25 _s_filter
26
27 _login_filter
28 _email_filter
29 _nickname_filter
30 )];
31
32 sub available_filters {
33 return $available_filters;
34 }
35
36 my @required_properties = (
37 { # Идентификатор документа, сквозной по всем типам...
38 'attr' => 'id',
39 'type' => 'integer',
40 'rusname' => 'Идентификатор документа',
41 'hidden' => 1,
42 'readonly' => 1,
43 'auto' => 1,
44 'db_field' => 'id',
45 'db_type' => 'integer',
46 'db_opts' => "not null default nextval('public.documents_id_seq'::text)",
47 },
48 { # Класс документа...
49 'attr' => 'class',
50 'type' => 'string',
51 'rusname' => 'Класс документа',
52 'hidden' => 1,
53 'readonly' => 1,
54 'db_field' => 'class',
55 'db_type' => 'varchar(48)',
56 'db_opts' => 'not null',
57 },
58 { # Ф.И.О....
59 'attr' => 'name',
60 'type' => 'string',
61 'rusname' => 'Ф.И.О.',
62 'column' => 2,
63 'db_field' => 'name',
64 'db_type' => 'varchar(255)',
65 },
66 { # Время создания документа, служебное поле...
67 'attr' => 'ctime',
68 'type' => 'datetime',
69 'rusname' => 'Время создания',
70 'readonly' => 1,
71 'auto' => 1,
72 'hidden' => 1,
73 'db_field' => 'ctime',
74 'db_type' => 'timestamp',
75 'db_opts' => 'not null default now()',
76 'default' => 'CURRENT_TIMESTAMP',
77 },
78 { # Время модификации документа, служебное поле...
79 'attr' => 'mtime',
80 'type' => 'datetime',
81 'rusname' => 'Время модификации',
82 'hidden' => 1,
83 'auto' => 1,
84 'db_field' => 'mtime',
85 'db_type' => 'timestamp',
86 'db_opts' => 'not null default now()',
87 'default' => 'CURRENT_TIMESTAMP',
88 },
89 { # Дата рождения
90 'attr' => 'dtime',
91 'type' => 'date',
92 'rusname' => 'Дата рождения',
93 'db_field' => 'dtime',
94 'db_type' => 'timestamp',
95 'default' => 'CURRENT_TIMESTAMP',
96 },
97 { # Дата и время логина...
98 'attr' => 'lastlogin',
99 'type' => 'datetime',
100 'rusname' => 'Дата и время последнего логина<sup style="color:#888;">&nbsp;1)</sup>',
101 'column' => 1,
102 'db_field' => 'lastlogin',
103 'db_type' => 'timestamp',
104 'db_opts' => 'not null default now()',
105 'default' => 'CURRENT_TIMESTAMP',
106 },
107 { # Массив секций, обрабатывается специальным образом...
108 'attr' => 'sections',
109 'type' => 'sections_list',
110 'rusname' => 'Секции',
111 'hidden' => 1,
112 'db_field' => 'sections',
113 'db_type' => 'integer[]',
114 },
115 { # Одно поле статуса является встроенным...
116 'attr' => 'status',
117 'type' => 'status',
118 'rusname' => 'Статус',
119 'db_field' => 'status',
120 'db_type' => 'integer',
121 },
122 { # Дополнительное поле статуса
123 'attr' => 'type',
124 'type' => 'integer',
125 'rusname' => 'Тип пользователя (project-oriented)',
126 'db_field' => 'type',
127 'db_type' => 'integer',
128 },
129 { # Никнейм...
130 'attr' => 'nickname',
131 'type' => 'string',
132 'rusname' => 'Ник',
133 'column' => 3,
134 'db_field' => 'nickname',
135 'db_type' => 'text',
136 },
137 { # Login...
138 'attr' => 'login',
139 'type' => 'string',
140 'rusname' => 'Логин',
141 'column' => 4,
142 'db_field' => 'login',
143 'db_type' => 'text',
144 },
145 { # Login method...
146 'attr' => 'login_method',
147 'type' => 'string',
148 'rusname' => 'Метод входа',
149 'db_field' => 'login_method',
150 'db_type' => 'text',
151 },
152 { # E-mail...
153 'attr' => 'email',
154 'type' => 'string',
155 'rusname' => 'E-mail (primary)',
156 305 ahitrov 'hidden' => $state->{users}->use_credentials ? 1 : undef,
157 'readonly' => $state->{users}->use_credentials ? 1 : undef,
158 196 ahitrov 'db_field' => 'email',
159 'db_type' => 'text',
160 },
161
162 );
163
164 # ----------------------------------------------------------------------------
165 # Свойства храним в массивах, потому что порядок важен!
166 # Это общие свойства - одинаковые для всех документов.
167 #
168 # attr - обязательный параметр, название атрибута;
169 # type - тип аттрибута, требуется для отображдения;
170 # rusname - русское название, опять же требуется для отображения;
171 # hidden - равен 1, когда
172 # readonly - инициализации при записи только без изменения в дальнейшем
173 # db_field - поле в таблице
174 # default - значение по умолчанию (поле всегда имеет это значение)
175 # ----------------------------------------------------------------------------
176 sub required_properties
177 {
178 return @required_properties;
179 }
180
181 ########### FILTERS DESCRIPTION ####################################################################################
182 sub _login_filter {
183 my ($self,%opts)=@_;
184 return undef unless ( exists($opts{login}) );
185 if (exists $opts{ilike} && $opts{ilike} == 1) {
186 return &SQL::Common::_generic_name_filter('d.login', $opts{login}, 0, \%opts);
187 }else{
188 return &SQL::Common::_generic_text_filter('d.login', $opts{login});
189 }
190 }
191
192 sub _email_filter {
193 my ($self,%opts)=@_;
194 343 ahitrov return undef unless ( exists $opts{email} );
195 if ( $state->{users}->use_credentials ) {
196 my ($wheres, $values);
197 my $op = exists $opts{like} ? 'like' : exists $opts{ilike} ? 'ilike' : '=';
198 $wheres = "d.id IN (SELECT uid FROM profile_credentials WHERE class = 'users::Email' AND name $op ?)";
199 $values = [$opts{email}];
200 return $wheres, $values;
201 } else {
202 if (exists $opts{ilike} && $opts{ilike} == 1) {
203 return &SQL::Common::_generic_name_filter('d.email', $opts{email}, 0, \%opts);
204 } else {
205 return &SQL::Common::_generic_text_filter('d.email', $opts{email});
206 }
207 196 ahitrov }
208 }
209
210 sub _nickname_filter {
211 my ($self,%opts)=@_;
212 return undef unless ( exists($opts{nickname}) );
213 if (exists $opts{ilike} && $opts{ilike} == 1) {
214 return &SQL::Common::_generic_name_filter('d.nickname', $opts{nickname}, 0, \%opts);
215 }else{
216 return &SQL::Common::_generic_text_filter('d.nickname', $opts{nickname});
217 }
218 }
219
220 1;