--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-06-19 19:02
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('auth', '0008_alter_user_username_max_length'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('mailarchives', '0003_message_resend'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='LastResentMessage',
+ fields=[
+ ('sentto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
+ ('sentat', models.DateTimeField()),
+ ],
+ ),
+ migrations.AlterUniqueTogether(
+ name='resendmessage',
+ unique_together=set([('message', 'sendto')]),
+ ),
+ ]
sendto = models.ForeignKey(User, null=False, blank=False)
registeredat = models.DateTimeField(null=False, blank=False)
+ class Meta:
+ unique_together = (('message', 'sendto'), )
+
+
+class LastResentMessage(models.Model):
+ sentto = models.ForeignKey(User, null=False, blank=False, primary_key=True)
+ sentat = models.DateTimeField(null=False, blank=False)
+
class ApiClient(models.Model):
apikey = models.CharField(max_length=100, null=False, blank=False)
if request.method == 'POST':
if request.POST.get('resend', None) == '1':
# Figure out if this user has sent an email recently, and if so refuse it
- if ResendMessage.objects.filter(sendto=request.user, registeredat__gt=datetime.now()).exists():
+ if LastResentMessage.objects.filter(sentto=request.user, sentat__gt=datetime.now() - timedelta(seconds=settings.RESEND_RATE_LIMIT_SECONDS)).exists():
return HttpResponse("You have already requested an email to be sent in the past {0} seconds. Please try again later.".format(settings.RESEND_RATE_LIMIT_SECONDS))
- ResendMessage.objects.get_or_create(message=m, sendto=request.user, registeredat=datetime.now() + timedelta(seconds=settings.RESEND_RATE_LIMIT_SECONDS))
+ ResendMessage.objects.get_or_create(message=m, sendto=request.user, defaults={
+ 'registeredat': datetime.now(),
+ })
+ connection.cursor().execute("INSERT INTO mailarchives_lastresentmessage (sentto_id, sentat) VALUES (%(id)s, CURRENT_TIMESTAMP) ON CONFLICT (sentto_id) DO UPDATE SET sentat=EXCLUDED.sentat", {
+ 'id': request.user.id,
+ })
connection.cursor().execute("NOTIFY archives_resend")
return HttpResponseRedirect('/message-id/resend/{0}/complete'.format(m.messageid))
def process_queue(conn, sender, smtpserver, heloname):
with conn.cursor() as curs:
- curs.execute("SELECT r.id, u.email, m.rawtxt FROM mailarchives_resendmessage r INNER JOIN auth_user u ON u.id=r.sendto_id INNER JOIN messages m ON m.id=r.message_id WHERE registeredat < CURRENT_TIMESTAMP ORDER BY r.id FOR UPDATE OF r LIMIT 1")
+ curs.execute("SELECT r.id, u.email, m.rawtxt FROM mailarchives_resendmessage r INNER JOIN auth_user u ON u.id=r.sendto_id INNER JOIN messages m ON m.id=r.message_id ORDER BY r.id FOR UPDATE OF r LIMIT 1")
ll = curs.fetchall()
if len(ll) == 0:
conn.rollback()