Revision 741
- Date:
- 2018/11/13 07:59:33
- 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);