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