Revision 741
Date:
2018/11/13 07:59:33
Author:
ahitrov
Revision Log:
In-core e-mail system
Files:
Legend:
Added
Removed
Modified
utf8/core/lib/Contenido/Email.pm
1
package Contenido::Email;
2
3
use strict;
4
use base 'Contenido::Document';
5
use Contenido::Globals;
6
7
sub extra_properties
8
{
9
10
return (
11
{ 'attr' => 'status',
12
'cases' => [
13
[0, 'Ожидает доставки'],
14
[1, 'Доставлен'],
15
[2, 'Обработка'],
16
[3, 'Ошибка'],
17
[-1, 'Удален'],
18
],
19
},
20
{ 'attr' => 'cc', 'type' => 'text', 'rusname' => 'Дополнительные получатели (по одному на строку)', rows => 10 },
21
{ 'attr' => 'body_text', 'type' => 'text', 'rusname' => 'Текст письма (txt)', 'rows' => 40 },
22
{ 'attr' => 'body_html', 'type' => 'wysiwyg', 'rusname' => 'Текст письма (html)', 'rows' => 40 },
23
{ 'attr' => 'pictures', 'type' => 'images', 'rusname' => 'Список иллюстраций', preview => ['400x400'], crop => ['870x450','85x85'] },
24
)
25
}
26
27
28
sub class_name
29
{
30
return 'E-mail';
31
}
32
33
sub class_description
34
{
35
return 'E-mail сообщение';
36
}
37
38
sub contenido_status_style
39
{
40
my $self = shift;
41
if ( $self->status == 2 ) {
42
return 'color:green;';
43
} elsif ( $self->status == 3 ) {
44
return 'color:green;';
45
} elsif ( $self->status < 0 ) {
46
return 'text-decoration:line-through;';
47
}
48
}
49
50
sub class_table
51
{
52
return 'SQL::MailQueueTable';
53
}
54
55
sub search_fields {
56
return ('name');
57
}
58
59
sub pre_store
60
{
61
my $self = shift;
62
my $default_section = $project->s_alias->{spam} if ref $project->s_alias && exists $project->s_alias->{spam};
63
if ( $default_section ) {
64
$self->sections($default_section);
65
}
66
67
return 1;
68
}
69
70
1;
utf8/core/lib/SQL/MailQueueTable.pm
1
package SQL::MailQueueTable;
2
3
use strict;
4
use base 'SQL::ProtoTable';
5
6
sub db_table
7
{
8
return 'mailqueue';
9
}
10
11
sub db_id_sequence {
12
return 'mailqueue_id_seq';
13
}
14
15
sub available_filters {
16
my @available_filters = qw(
17
_class_filter
18
_status_filter
19
_in_id_filter
20
_id_filter
21
_name_filter
22
_class_excludes_filter
23
_sfilter_filter
24
_datetime_filter
25
_date_equal_filter
26
_date_filter
27
_previous_days_filter
28
_prev_to_filter
29
_next_to_filter
30
_s_filter
31
32
_excludes_filter
33
_link_filter
34
);
35
return \@available_filters;
36
}
37
38
# ----------------------------------------------------------------------------
39
# Свойства храним в массивах, потому что порядок важен!
40
# Это общие свойства - одинаковые для всех документов.
41
#
42
# attr - обязательный параметр, название атрибута;
43
# type - тип аттрибута, требуется для отображдения;
44
# rusname - русское название, опять же требуется для отображения;
45
# hidden - равен 1, когда
46
# readonly - инициализации при записи только без изменения в дальнейшем
47
# db_field - поле в таблице
48
# default - значение по умолчанию (поле всегда имеет это значение)
49
# ----------------------------------------------------------------------------
50
sub required_properties
51
{
52
my $self = shift;
53
my $id_sequence = $self->db_id_sequence();
54
return (
55
{ # Идентификатор документа, сквозной по всем типам...
56
'attr' => 'id',
57
'type' => 'integer',
58
'rusname' => 'Идентификатор документа',
59
'hidden' => 1,
60
'readonly' => 1,
61
'auto' => 1,
62
'db_field' => 'id',
63
'db_type' => 'integer',
64
'db_opts' => "not null default nextval('public.$id_sequence'::text)",
65
},
66
{ # Класс документа...
67
'attr' => 'class',
68
'type' => 'string',
69
'rusname' => 'Класс документа',
70
'column' => 3,
71
'hidden' => 1,
72
'readonly' => 1,
73
'db_field' => 'class',
74
'db_type' => 'varchar(48)',
75
'db_opts' => 'not null',
76
},
77
{
78
'attr' => 'name',
79
'type' => 'string',
80
'rusname' => 'Получатель',
81
'column' => 3,
82
'db_field' => 'name',
83
'db_type' => 'varchar(255)',
84
},
85
{
86
'attr' => 'subject',
87
'type' => 'string',
88
'rusname' => 'Тема',
89
'column' => 4,
90
'db_field' => 'subject',
91
'db_type' => 'varchar(255)',
92
},
93
{ # Время создания документа, служебное поле...
94
'attr' => 'ctime',
95
'type' => 'datetime',
96
'rusname' => 'Время создания',
97
'readonly' => 1,
98
'auto' => 1,
99
'hidden' => 1,
100
'db_field' => 'ctime',
101
'db_type' => 'timestamp',
102
'db_opts' => 'not null default now()',
103
'default' => 'CURRENT_TIMESTAMP',
104
},
105
{ # Время модификации документа, служебное поле...
106
'attr' => 'mtime',
107
'type' => 'datetime',
108
'rusname' => 'Время модификации',
109
'hidden' => 1,
110
'auto' => 1,
111
'db_field' => 'mtime',
112
'db_type' => 'timestamp',
113
'db_opts' => 'not null default now()',
114
'default' => 'CURRENT_TIMESTAMP',
115
},
116
{ # Дата и время отправки...
117
'attr' => 'dtime',
118
'type' => 'datetime',
119
'rusname' => 'Отправить',
120
'column' => 1,
121
'db_field' => 'dtime',
122
'db_type' => 'timestamp',
123
'db_opts' => 'not null default now()',
124
'default' => 'CURRENT_TIMESTAMP',
125
},
126
{
127
'attr' => 'etime',
128
'type' => 'datetime',
129
'rusname' => 'Отправлено',
130
'column' => 2,
131
'allow_null' => 1,
132
'db_field' => 'etime',
133
'db_type' => 'timestamp',
134
},
135
{ # Массив секций, обрабатывается специальным образом...
136
'attr' => 'sections',
137
'type' => 'sections_list',
138
'rusname' => 'Секции',
139
'hidden' => 1,
140
'db_field' => 'sections',
141
'db_type' => 'integer',
142
},
143
{
144
'attr' => 'status',
145
'type' => 'status',
146
'rusname' => 'Статус',
147
'db_field' => 'status',
148
'db_type' => 'integer',
149
},
150
);
151
}
152
153
1;
154
utf8/core/sql/TOAST/mailqueue.sql
1
create sequence mailqueue_id_seq;
2
select setval('mailqueue_id_seq', 1, true);
3
4
create table mailqueue
5
(
6
id integer not null primary key default nextval('public.mailqueue_id_seq'::text),
7
class text not null,
8
ctime timestamp not null default now(),
9
mtime timestamp not null default now(),
10
dtime timestamp not null default now(),
11
etime timestamp,
12
status smallint not null default 0,
13
sections integer,
14
name text,
15
subject text,
16
data text
17
);
18
create index mailqueue_sections on mailqueue (sections);
19
create index mailqueue_dtime on mailqueue (dtime);
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.