SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit c4dce071 authored by Jean-Sébastien Caux's avatar Jean-Sébastien Caux
Browse files

Add class StoredMessageAttachment and related facilities

parent 45a3dd86
No related branches found
No related tags found
No related merge requests found
...@@ -336,6 +336,7 @@ EMAIL_SUBJECT_PREFIX = '[SciPost Server] ' ...@@ -336,6 +336,7 @@ EMAIL_SUBJECT_PREFIX = '[SciPost Server] '
MAILCHIMP_DATABASE_CODE = 'us6' MAILCHIMP_DATABASE_CODE = 'us6'
MAILCHIMP_API_USER = 'test_API-user' MAILCHIMP_API_USER = 'test_API-user'
MAILCHIMP_API_KEY = 'test_API-key' MAILCHIMP_API_KEY = 'test_API-key'
MAX_EMAIL_ATTACHMENT_FILE_SIZE = 20000000
# iThenticate # iThenticate
......
...@@ -4,10 +4,22 @@ __license__ = "AGPL v3" ...@@ -4,10 +4,22 @@ __license__ = "AGPL v3"
from django.contrib import admin from django.contrib import admin
from .models import Event from .models import Event, StoredMessage, StoredMessageAttachment
class EventAdmin(admin.ModelAdmin): class EventAdmin(admin.ModelAdmin):
pass pass
admin.site.register(Event, EventAdmin) admin.site.register(Event, EventAdmin)
class StoredMessageAttachmentInline(admin.StackedInline):
model = StoredMessageAttachment
extra = 0
min_num = 0
class StoredMessageAdmin(admin.ModelAdmin):
inlines = [StoredMessageAttachmentInline,]
admin.site.register(StoredMessage, StoredMessageAdmin)
...@@ -2,13 +2,16 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" ...@@ -2,13 +2,16 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3" __license__ = "AGPL v3"
from tempfile import TemporaryFile
import requests import requests
from django.conf import settings from django.conf import settings
from django.core.files import File
from django.core.management import BaseCommand from django.core.management import BaseCommand
from ...exceptions import APIMailError from ...exceptions import APIMailError
from ...models import Event, StoredMessage from ...models import Event, StoredMessage, StoredMessageAttachment
class Command(BaseCommand): class Command(BaseCommand):
...@@ -34,3 +37,13 @@ class Command(BaseCommand): ...@@ -34,3 +37,13 @@ class Command(BaseCommand):
sm = StoredMessage.objects.create(data=response) sm = StoredMessage.objects.create(data=response)
orphan.stored_message = sm orphan.stored_message = sm
orphan.save() orphan.save()
# Now deal with attachments
for att_item in response['attachments']:
with TemporaryFile() as tf:
r = requests.get(att_item['url'], stream=True)
for chunk in r.iter_content(chunk_size=8192):
tf.write(chunk)
tf.seek(0)
sma = StoredMessageAttachment.objects.create(
message=sm, data=att_item)
sma._file.save(att_item['name'], File(tf))
# Generated by Django 2.1.8 on 2019-11-13 21:26
import apimail.validators
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
import scipost.storage
class Migration(migrations.Migration):
dependencies = [
('apimail', '0002_auto_20191113_1547'),
]
operations = [
migrations.CreateModel(
name='StoredMessageAttachment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data', django.contrib.postgres.fields.jsonb.JSONField(default=dict)),
('_file', models.FileField(storage=scipost.storage.SecureFileStorage(), upload_to='uploads/mail/stored_messages/attachments/%Y/%m/%d/', validators=[apimail.validators.validate_max_email_attachment_file_size])),
],
),
migrations.AlterModelOptions(
name='storedmessage',
options={'ordering': ['-data__Date']},
),
migrations.AddField(
model_name='storedmessageattachment',
name='message',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='apimail.StoredMessage'),
),
]
...@@ -4,4 +4,4 @@ __license__ = "AGPL v3" ...@@ -4,4 +4,4 @@ __license__ = "AGPL v3"
from .event import Event from .event import Event
from .stored_message import StoredMessage from .stored_message import StoredMessage, StoredMessageAttachment
...@@ -8,6 +8,10 @@ from django.contrib.postgres.fields import JSONField ...@@ -8,6 +8,10 @@ from django.contrib.postgres.fields import JSONField
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from scipost.storage import SecureFileStorage
from ..validators import validate_max_email_attachment_file_size
class StoredMessage(models.Model): class StoredMessage(models.Model):
""" """
...@@ -19,5 +23,21 @@ class StoredMessage(models.Model): ...@@ -19,5 +23,21 @@ class StoredMessage(models.Model):
editable=False) editable=False)
data = JSONField(default=dict) data = JSONField(default=dict)
class Meta:
ordering = ['-data__Date',]
def get_absolute_url(self): def get_absolute_url(self):
return reverse('apimail:stored_message_detail', kwargs={'uuid': self.uuid}) return reverse('apimail:stored_message_detail', kwargs={'uuid': self.uuid})
class StoredMessageAttachment(models.Model):
message = models.ForeignKey(
'apimail.StoredMessage',
on_delete=models.CASCADE,
related_name='attachments' # doesn't collide with StoredMessage.data.attachments
)
data = JSONField(default=dict)
_file = models.FileField(
upload_to='uploads/mail/stored_messages/attachments/%Y/%m/%d/',
validators=[validate_max_email_attachment_file_size,],
storage=SecureFileStorage())
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.conf import settings
from django.core.exceptions import ValidationError
from django.template.defaultfilters import filesizeformat
def validate_max_email_attachment_file_size(value):
if value.size > int(settings.MAX_EMAIL_ATTACHMENT_FILE_SIZE):
raise ValidationError(
'Please keep filesize under %s. Current filesize: %s' % (
filesizeformat(settings.MAX_EMAIL_ATTACHMENT_FILE_SIZE),
filesizeformat(value.size))
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment