You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

190 lines
8.7 KiB

# coding=utf-8
from __future__ import unicode_literals
import datetime
import smtplib
from django.db import models
from django.core.mail import EmailMessage, send_mail
from lms.settings import DEFAULT_FROM_EMAIL, TESTING, TEST_EMAIL, NAME, DOMAIN, SUPPORT, SUPPORT_PHONE
from redactor.fields import RedactorField
from lms.tools import random_string, str_shielding
def mail_access_token():
pass
class MailTemplate(models.Model):
key = models.CharField(verbose_name=u'Ключ шаблона', max_length=255, editable=False, blank=True)
title = models.CharField(verbose_name=u'Название шаблона', max_length=255)
text = models.TextField(verbose_name=u'Шаблон', default='', help_text='{TEXT} - Текст самого письма '
'{DOMAIN} - Домен отправителя'
'{NAME} - Название компании,'
'{SUPPORT} - Почта поддержки,'
'{SUPPORT_PHONE} - Телефон поддержки')
def __unicode__(self):
return u'%s' % self.title
def __str__(self):
return '%s' % self.title
def save(self, *args, **kwargs):
if not self.key:
self.key = random_string()
super(MailTemplate, self).save(*args, **kwargs)
class Meta:
verbose_name = u'Шаблон письма'
verbose_name_plural = u'Шаблоны писем'
class MailBox(models.Model):
MAIL_STATUS = (
('Q', 'На очереди'),
('W', 'Ожидает даты доставки'),
('S', 'Отправлен'),
('E', 'Ошибка отправки'),
('D', 'Доставлен'),
('F', 'Адресат не найден')
)
#token = models.CharField(verbose_name=u'Токен', max_length=255, default=mail_access_token, unique=True)
status = models.CharField(verbose_name=u'Статус письма', choices=MAIL_STATUS, default='Q', max_length=1)
custom = models.BooleanField(verbose_name=u'Кастомная обложка', default=False)
_to = models.EmailField(verbose_name=u'Почта')
queue_date = models.DateTimeField(verbose_name=u'Дата постановки задачи', default=datetime.datetime.now,
help_text=u'Если указать дату доставки, письмо будет ожидать времени своего '
u'отправления')
error = models.CharField(verbose_name=u'Ошибка отправки', blank=True, default='', max_length=255)
sent_date = models.DateTimeField(verbose_name=u'Время отправки', blank=True, null=True, editable=False)
title = models.CharField(verbose_name=u'Заголовок письма', max_length=255)
text = models.TextField(verbose_name=u'Текст отправки', editable=False)
result = RedactorField(verbose_name=u'Вид письма', blank=True, default='')
_type = models.CharField(verbose_name=u'Тип письма', max_length=255, blank=True, default='')
template = models.CharField(verbose_name=u'Ключ шаблона письма', max_length=100, blank=True, default='')
def __unicode__(self):
return u'%s %s' % (self._to, self.get_status_display())
def __str__(self):
return '%s %s' % (self._to, self.get_status_display())
def send_letter(self):
if not self.custom:
msg = EmailMessage(self.title, self.result, u'{1} <{0}>'.format(DEFAULT_FROM_EMAIL, NAME),
[self._to if not TESTING else TEST_EMAIL])
msg.content_subtype = "html"
try:
msg.send()
except smtplib.SMTPDataError as e:
self.status = 'E'
self.error = e
else:
self.sent_date = datetime.datetime.now()
self.status = 'S'
else:
try:
send_mail(
self.title,
'',
u'{1} <{0}>'.format(DEFAULT_FROM_EMAIL, NAME),
[self._to],
fail_silently=True,
html_message=self.result
)
except smtplib.SMTPDataError as e:
self.status = 'E'
self.error = e
else:
self.sent_date = datetime.datetime.now()
self.status = 'S'
self.save()
def save(self, *args, **kwargs):
if not self.result:
template = u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' \
u'<html>' \
u'<head>' \
u'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' \
u'<title></title>' \
u'</head>' \
u'<body>' \
u'<table width=100%>{TEXT}' \
u'<tr><td style="padding-bottom: 20px;">С уважением,<Br>{NAME}</td></tr>' \
u'<tr><td style="padding-bottom: 20px;"><img src="{DOMAIN}/static/img/logo.png"></td></tr>' \
u'<tr><td>Пожалуйста, по любым вопросам смело пишите на {SUPPORT}</td></tr>' \
u'</table>' \
u'</body>' \
u'</html>'
if self.template:
try:
_tmp = MailTemplate.objects.get(key=self.template)
except MailTemplate.DoesNotExists:
pass
else:
template = str_shielding(_tmp.text, ['{TEXT}', '{DOMAIN}', '{NAME}', '{SUPPORT}', '{SUPPORT_PHONE}'])
self.result = template.format(**{'TEXT': self.text, 'DOMAIN': DOMAIN, 'NAME': NAME, 'SUPPORT': SUPPORT, 'SUPPORT_PHONE': SUPPORT_PHONE})
else:
self.custom = True
super(MailBox, self).save(*args, **kwargs)
class Meta:
verbose_name = u'Письмо'
verbose_name_plural = u'Письма'
class Sms(models.Model):
STAT = (
('S', 'Отправляется'),
('F', 'Отправлен'),
('E', 'Ошибка отправления')
)
FROM = (
('T', 'Tocka Koda'),
('C', 'CODEMY.RU')
)
sent = models.BooleanField(verbose_name=u'Отправить', default=False, editable=False)
_to = models.CharField(verbose_name=u'Получатель', max_length=255, help_text='+79660497379')
_status = models.CharField(verbose_name=u'Статус сообщения', max_length=1, default='S', choices=STAT,
editable=False)
date = models.DateTimeField(verbose_name=u'Дата отправки', default=datetime.datetime.now,
help_text='Не дальше 7ми дней')
text = models.TextField(verbose_name=u'Текст')
_from = models.CharField(verbose_name=u'Отправитель', max_length=1, default='C', choices=FROM)
error = models.TextField(verbose_name=u'Описание отправки', blank=True, null=True, editable=False)
debug = models.CharField(verbose_name=u'Строка запроса', max_length=255, blank=True)
def __unicode__(self):
return u'%s %s %s' % (self._to, self._status, self.text)
def save(self, *args, **kwargs):
#if not self.sent:
# try:
# url = "http://sms.ru/sms/send"
# values = {'api_id': SMS, 'to': self._to, 'text': self.text.encode('utf-8'),
# 'from': self.get__from_display(), 'time': str(time.mktime(self.date.timetuple()))[:10]}
# data = urllib.urlencode(values)
# self.debug = url
# req = urllib2.Request(url, data)
# res = urllib2.urlopen(req)
# except urllib2.URLError as errstr:
# self.error = errstr
# self._status = 'E'
# else:
# sr = res.read().splitlines()
# if sr is not None and int(sr[0]) == 100:
# self._status = 'F'
# if sr is not None and int(sr[0]) != 100:
# self._status = 'E'
# self.error = servicecodes[int(sr[0])]
# self.sent = True
super(Sms, self).save(*args, **kwargs)
class Meta:
verbose_name = u'СМС'
verbose_name_plural = u'СМС'