Add HTML emails; add emails timestamp to sent emails; hopefully fix duplicate emails not sending via PM-bridge

master
Tait Hoyem 4 years ago
parent 560d6dfa42
commit 4cfaa02df9

@ -0,0 +1,31 @@
# Generated by Django 3.1.2 on 2020-11-06 17:15
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('core', '0002_quoteuser'),
('download', '0007_pdf_upload_date'),
]
operations = [
migrations.AddField(
model_name='pdf',
name='valid',
field=models.BooleanField(default=1),
preserve_default=False,
),
migrations.CreateModel(
name='EmailSent',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('timestamp', models.DateTimeField(auto_now_add=True)),
('ref_code', models.CharField(max_length=8)),
('pdf', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='download.pdf')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.quoteuser')),
],
),
]

@ -0,0 +1,18 @@
# Generated by Django 3.1.2 on 2020-11-06 17:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('download', '0008_auto_20201106_1715'),
]
operations = [
migrations.AlterField(
model_name='emailsent',
name='ref_code',
field=models.CharField(max_length=256),
),
]

@ -1,5 +1,5 @@
from django.db import models
from core.models import CalgaryAddress
from core.models import CalgaryAddress, QuoteUser
from .validators import RestrictedFileField
# Create your models here.
@ -19,3 +19,10 @@ class PDF(models.Model):
upload_file = RestrictedFileField(max_upload_size=1024*1024*50, content_types=['pdf', 'application/pdf'], upload_to='uploads/%Y/%m/%d/')
address = models.ForeignKey(Address, on_delete=models.CASCADE, related_name='uploads')
upload_date = models.DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)
valid = models.BooleanField()
class EmailSent(models.Model):
timestamp = models.DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)
user = models.ForeignKey(QuoteUser, on_delete=models.CASCADE)
pdf = models.ForeignKey(PDF, on_delete=models.CASCADE)
ref_code = models.CharField(max_length=256)

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head></head>
<body>
<p>Here is your free quote for {{ address }}.</p>
<p>This quote is valid for 30 days.</p>
<div hidden>
{{ address }}-{{ datetime }}
</div>
</body>
</html>

@ -0,0 +1 @@
Here is your free quote for {{ address }}, which is valid for 30 days:

@ -1,10 +1,13 @@
from django.shortcuts import render, HttpResponse
from django.shortcuts import render, HttpResponse
from django.http import FileResponse
from django.core.mail import EmailMessage
from .models import Address, PDF
from django.core.mail import EmailMultiAlternatives
from .models import Address, PDF, EmailSent
from .forms import CodeForm
from core.models import QuoteUser
from django.template.loader import render_to_string
import json
import datetime
import hashlib
# Create your views here.
def starter(request):
@ -19,6 +22,35 @@ def search(request, addr):
[x.toDict() for x in Address.objects.filter(address__startswith=addr)]
))
def send_email(to, addr, pdf, dt_date):
# save email in user database; do nothing if exception
user, created = QuoteUser.objects.get_or_create(username=to, email=to)
# disallow login for new user
if created:
user.set_unusable_password()
user.save()
# send email
email = EmailMultiAlternatives()
email.subject = 'Your free quote!'
email.to = [to]
context = {
'address': addr.address,
'datetime': dt_date.strftime("%d/%m/%Y %H:%M:%S")
}
email.body = render_to_string('download/email/quote.txt', context)
email.attach_alternative(render_to_string('download/email/quote.html', context), 'text/html')
with open(str(pdf.upload_file), 'rb') as f:
content = f.read()
email.attach(str(pdf.upload_file), content, 'application/octate-stream')
email.send()
def save_email(to, addr, pdf, dt):
EmailSent.objects.create(
user=QuoteUser.objects.get(email=to),
pdf=pdf,
ref_code=hashlib.sha256(dt.strftime("%Y%m%d%H%M%S").encode()).hexdigest()
)
def download(request, pdfid):
if request.method == 'POST':
form = CodeForm(request.POST)
@ -32,27 +64,17 @@ def download(request, pdfid):
if len(pdf) == 0:
return render(request, 'common/password-incorrect.html')
pdf = pdf[0]
# save email in database; do nothing if exception
user, created = QuoteUser.objects.get_or_create(username=form.cleaned_data['email'], email=form.cleaned_data['email'])
# disallow login for new user
if created:
user.set_unusable_password()
user.save()
# send email
email = EmailMessage()
email.subject = 'Your Free Quote!'
email.to = [form.cleaned_data['email']]
email.body = 'Your free quote is attached to this email. This quote is valid for 30 days.'
# create timestamps
dt_date = datetime.datetime.now()
try:
f = open(str(pdf.upload_file), 'rb')
content = f.read()
email.attach(str(pdf.upload_file), content, 'application/octate-stream')
email.send()
send_email(form.cleaned_data['email'], addr, pdf, dt_date)
except:
return render(request, 'download/email-not-sent.html', {
'id': pdfid,
'code': form.cleaned_data['code']
})
# only saves email if it sent
save_email(form.cleaned_data['email'], addr, pdf, dt_date)
return render(request, 'download/email-confirm.html')
else:
form = CodeForm()

Loading…
Cancel
Save