Line #
Revision
Author
1
296
ahitrov
package promosuite::SQL::Enquesta;
2
3
use base 'SQL::ProtoTable';
4
5
sub db_table
6
{
7
return 'enquesta';
8
}
9
10
sub available_filters {
11
my @available_filters = qw(
12
_class_filter
13
_status_filter
14
_in_id_filter
15
_id_filter
16
_name_filter
17
_s_filter
18
_class_excludes_filter
19
20
_uid_filter
21
_session_filter
22
_object_id_filter
23
_object_class_filter
24
_excludes_filter
25
);
26
return \@available_filters;
27
}
28
29
# ----------------------------------------------------------------------------
30
# Свойства храним в массивах, потому что порядок важен!
31
# Это общие свойства - одинаковые для всех документов.
32
#
33
# attr - обязательный параметр, название атрибута;
34
# type - тип аттрибута, требуется для отображдения;
35
# rusname - русское название, опять же требуется для отображения;
36
# hidden - равен 1, когда
37
# readonly - инициализации при записи только без изменения в дальнейшем
38
# db_field - поле в таблице
39
# default - значение по умолчанию (поле всегда имеет это значение)
40
# ----------------------------------------------------------------------------
41
sub required_properties
42
{
43
return (
44
{ # Идентификатор документа, сквозной по всем типам...
45
'attr' => 'id',
46
'type' => 'integer',
47
'rusname' => 'Идентификатор документа',
48
'hidden' => 1,
49
'auto' => 1,
50
'readonly' => 1,
51
'db_field' => 'id',
52
'db_type' => 'integer',
53
'db_opts' => "not null default nextval('public.documents_id_seq'::text)",
54
},
55
{ # Класс документа...
56
'attr' => 'class',
57
'type' => 'string',
58
'rusname' => 'Класс документа',
59
'hidden' => 1,
60
'readonly' => 1,
61
'column' => 3,
62
'db_field' => 'class',
63
'db_type' => 'varchar(48)',
64
'db_opts' => 'not null',
65
},
66
{ # Имя
67
'attr' => 'name',
68
'type' => 'string',
69
'rusname' => 'Имя',
70
'column' => 2,
71
'db_field' => 'name',
72
'db_type' => 'text',
73
},
74
{ # Сессия голосовавшего
75
'attr' => 'session_id',
76
'type' => 'string',
77
'rusname' => 'Сессия голосовавшего',
78
'db_field' => 'session_id',
79
'db_type' => 'char(32)',
80
},
81
{ # ID голосовавшего
82
'attr' => 'uid',
83
'type' => 'string',
84
'rusname' => 'ID голосовавшего',
85
'db_field' => 'uid',
86
'db_type' => 'integer',
87
'default' => '0',
88
},
89
{ # Статус
90
'attr' => 'status',
91
'type' => 'status',
92
'rusname' => 'Статус',
93
'db_field' => 'status',
94
'db_type' => 'smallint',
95
},
96
{ # Время создания документа
97
'attr' => 'ctime',
98
'type' => 'datetime',
99
'rusname' => 'Дата/время создания',
100
'readonly' => 1,
101
'auto' => 1,
102
'hidden' => 1,
103
'db_field' => 'ctime',
104
'db_type' => 'timestamp',
105
'db_opts' => 'not null default now()',
106
'default' => 'CURRENT_TIMESTAMP',
107
},
108
{ # Время изменения документа
109
'attr' => 'mtime',
110
'type' => 'datetime',
111
'rusname' => 'Дата/время изменения',
112
'auto' => 1,
113
'hidden' => 1,
114
'db_field' => 'mtime',
115
'db_type' => 'timestamp',
116
'db_opts' => 'not null default now()',
117
'default' => 'CURRENT_TIMESTAMP',
118
},
119
{ # Время документа
120
'attr' => 'dtime',
121
'type' => 'datetime',
122
'rusname' => 'Дата/время',
123
'column' => 1,
124
'db_field' => 'dtime',
125
'db_type' => 'timestamp',
126
'db_opts' => 'not null default now()',
127
'default' => 'CURRENT_TIMESTAMP',
128
},
129
{ # Класс объекта
130
'attr' => 'object_class',
131
'type' => 'string',
132
'rusname' => 'Класс объекта',
133
'column' => 4,
134
'db_field' => 'object_class',
135
'db_type' => 'text',
136
'default' => "'promosuite::Voting'",
137
},
138
{ # ID объекта
139
'attr' => 'object_id',
140
'type' => 'string',
141
'rusname' => 'ID объекта',
142
'column' => 5,
143
'db_field' => 'object_id',
144
'db_type' => 'integer',
145
},
146
{ # Опрос
147
'attr' => 'voting',
148
'type' => 'text',
149
'rusname' => 'Оценка',
150
'db_field' => 'voting',
151
'db_type' => 'text',
152
},
153
{ # Массив секций
154
'attr' => 'sections',
155
'type' => 'sections_list',
156
'rusname' => 'Секции',
157
'hidden' => 1,
158
'db_field' => 'sections',
159
'db_type' => 'integer[]',
160
},
161
);
162
}
163
164
165
########### FILTERS DESCRIPTION ####################################################################################
166
sub _excludes_filter {
167
my ($self,%opts)=@_;
168
if (exists $opts{excludes}) {
169
# - исключение из отбора
170
my @eids = ();
171
if (ref($opts{excludes}) eq 'ARRAY') {
172
@eids = @{ $opts{excludes} };
173
} elsif ($opts{excludes} =~ /[^\d\,]/) {
174
warn "Contenido Warning: В списке идентификаторов для исключения встречаются нечисловые элементы. Параметр excludes игнорируется (".$opts{excludes}.").\n";
175
} else {
176
@eids = split(',', $opts{excludes});
177
}
178
179
my $excludes = join(',', @eids);
180
181
# Меняется логика запроса, если это join-запрос.
182
# Потому что в этом случае гораздо лучше ограничить выборку по таблице links,
183
# чем производить полную склейку таблиц.
184
if (@eids) {
185
if (exists($opts{ldest}) || exists($opts{lsource})) {
186
if (exists($opts{ldest})) {
187
return " (l.source_id not in ($excludes)) ";
188
} elsif (exists($opts{lsource})) {
189
return " (l.dest_id not in ($excludes)) ";
190
}
191
} else {
192
return " (d.id not in ($excludes)) ";
193
}
194
}
195
}
196
return undef;
197
}
198
199
200
sub _get_orders {
201
my ($self, %opts) = @_;
202
203
if ($opts{order_by}) {
204
return ' order by '.$opts{order_by};
205
} else {
206
return ' order by dtime desc';
207
}
208
return undef;
209
}
210
211
sub _uid_filter {
212
my ($self, %opts)=@_;
213
return undef unless ( exists $opts{uid} );
214
return &SQL::Common::_generic_int_filter('d.uid', $opts{uid});
215
}
216
217
sub _object_id_filter {
218
my ($self, %opts)=@_;
219
return undef unless ( exists $opts{object_id} );
220
return &SQL::Common::_generic_int_filter('d.object_id', $opts{object_id});
221
}
222
223
sub _session_filter {
224
my ($self, %opts)=@_;
225
return undef unless ( exists $opts{session_id} );
226
return &SQL::Common::_generic_text_filter('d.session_id', $opts{session_id});
227
}
228
229
sub _object_class_filter {
230
my ($self, %opts)=@_;
231
return undef unless ( exists $opts{object_class} );
232
return &SQL::Common::_generic_text_filter('d.object_class', $opts{object_class});
233
}
234
235
1;
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.