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 – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.