extra senders: limit number by file type (#51403)

This commit is contained in:
Emmanuel Cazenave 2021-02-24 14:18:27 +01:00
parent dc5509e16e
commit 3fb2971f1e
5 changed files with 100 additions and 2 deletions

View File

@ -229,6 +229,9 @@ class FileTypeAttachedFileKindAdmin(admin.TabularInline):
class FileTypeAdmin(admin.ModelAdmin):
list_display = ['name', 'is_active']
if settings.EXTRA_SENDERS:
list_display.append('extra_senders')
fields = list_display
actions = [actions.export_as_csv]
inlines = [FileTypeAttachedFileKindAdmin]

View File

@ -191,7 +191,7 @@ class FileForm(RecipientForm, ModelForm):
if not app_settings.PRIVATE_DOCUMENTS:
del self.fields['private']
if self.reply_to or not settings.EXTRA_SENDERS:
if self.reply_to or not settings.EXTRA_SENDERS or not self.file_type.extra_senders:
del self.fields['extra_senders']
else:
self.fields['extra_senders'].required = False
@ -235,6 +235,13 @@ class FileForm(RecipientForm, ModelForm):
errors.append(msg)
if errors:
self._errors[field] = self.error_class(errors)
if 'extra_senders' in cleaned_data:
if len(cleaned_data['extra_senders']) > self.file_type.extra_senders:
self._errors['extra_senders'] = self.error_class(
[_('No more than %s additional senders allowed') % self.file_type.extra_senders]
)
return cleaned_data
def save(self, commit=False):

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2021-02-24 12:49
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('docbow', '0006_extra_senders'),
]
operations = [
migrations.AddField(
model_name='filetype',
name='extra_senders',
field=models.PositiveIntegerField(default=0, verbose_name='Extra senders'),
),
]

View File

@ -23,6 +23,7 @@ from django.db.models import (
EmailField,
PositiveSmallIntegerField,
CASCADE,
PositiveIntegerField,
)
from django.contrib.auth.models import User, Group
from django.conf import settings
@ -91,6 +92,7 @@ class FileType(NameNaturalKey, Model):
name = CharField(max_length=128, unique=True)
is_active = BooleanField(verbose_name=_('is active'), default=True, blank=True)
extra_senders = PositiveIntegerField(verbose_name=_('Extra senders'), default=0)
class Meta:
ordering = ['name']

View File

@ -136,6 +136,8 @@ def test_sendfile_extra_senders(app, filetypes, users, settings):
extra_sender1, extra_sender2 = User.objects.get(username='user-4'), User.objects.get(username='user-5')
app.login()
ft = FileType.objects.first()
ft.extra_senders = 4
ft.save()
resp = app.get('/send_file/%s/' % ft.pk)
form = resp.form
form['content_1'] = Upload('readme.rst', b'data')
@ -210,7 +212,7 @@ def test_sendfile_extra_senders(app, filetypes, users, settings):
assert extra_sender2.username in resp.text
def test_extra_senders_disabled_by_default(app, filetypes, users, settings):
def test_extra_senders_disabled(app, filetypes, users, settings):
settings.MEDIA_ROOT = MEDIA_ROOT
recipient = User.objects.get(username='user-2')
app.login()
@ -233,6 +235,19 @@ def test_extra_senders_disabled_by_default(app, filetypes, users, settings):
resp = app.get('/inbox/trash/')
assert 'Additional senders' not in resp.text
# even if global option enabled, can be disabled by file type
settings.EXTRA_SENDERS = True
assert ft.extra_senders == 0
resp = app.get('/send_file/%s/' % ft.pk)
form = resp.form
assert 'extra_senders' not in form.fields
form['content_1'] = Upload('readme.rst', b'data')
form['recipients'] = ['user-%s' % recipient.pk]
resp = form.submit('send')
assert resp.status_code == 302
assert resp.location.endswith('/outbox/')
def test_sendfile_reply_to(app, filetypes, users, settings):
settings.MEDIA_ROOT = MEDIA_ROOT
@ -286,6 +301,8 @@ def test_sendfile_reply_to_extra_senders(app, filetypes, users, settings):
extra_sender1, extra_sender2 = User.objects.get(username='user-4'), User.objects.get(username='user-5')
app.login()
ft = FileType.objects.first()
ft.extra_senders = 4
ft.save()
resp = app.get('/send_file/%s/' % ft.pk)
form = resp.form
form['content_1'] = Upload('readme.rst', b'data')
@ -330,6 +347,55 @@ def test_sendfile_reply_to_extra_senders(app, filetypes, users, settings):
assert_can_see_doc(app, doc, extra_sender2, inbox=True)
def test_sendfile_extra_senders_limit(app, filetypes, users, settings):
settings.MEDIA_ROOT = MEDIA_ROOT
settings.EXTRA_SENDERS = True
sender = User.objects.get(username='user-1')
recipient1, recipient2 = User.objects.get(username='user-2'), User.objects.get(username='user-3')
extra_sender1, extra_sender2, extra_sender3 = (
User.objects.get(username='user-4'),
User.objects.get(username='user-5'),
User.objects.get(username='user-6'),
)
app.login()
ft = FileType.objects.first()
ft.extra_senders = 3
ft.save()
resp = app.get('/send_file/%s/' % ft.pk)
form = resp.form
form['content_1'] = Upload('readme.rst', b'data')
form['recipients'] = ['user-%s' % recipient1.pk, 'user-%s' % recipient2.pk]
form['extra_senders'] = ['%s' % extra_sender1.pk, '%s' % extra_sender2.pk, '%s' % extra_sender3.pk]
resp = form.submit('send')
assert resp.status_code == 302
assert resp.location.endswith('/outbox/')
doc = Document.objects.first()
assert len(doc.delivered_to()) == 2
assert recipient1 in doc.delivered_to()
assert recipient2 in doc.delivered_to()
assert doc.filenames() == 'readme.rst'
assert doc.sender == sender
assert doc.extra_senders.count() == 3
assert doc.extra_senders.filter(pk=extra_sender1.pk).exists()
assert doc.extra_senders.filter(pk=extra_sender2.pk).exists()
assert doc.extra_senders.filter(pk=extra_sender3.pk).exists()
# limit extra senders
ft.extra_senders = 2
ft.save()
resp = app.get('/send_file/%s/' % ft.pk)
form = resp.form
form['content_1'] = Upload('readme.rst', b'data')
form['recipients'] = ['user-%s' % recipient1.pk, 'user-%s' % recipient2.pk]
form['extra_senders'] = ['%s' % extra_sender1.pk, '%s' % extra_sender2.pk, '%s' % extra_sender3.pk]
resp = form.submit('send')
assert resp.status_code == 200
assert 'No more than 2 additional senders allowed' in resp.text
def test_sendfile_mailing_list(app, filetypes, users, settings):
settings.MEDIA_ROOT = MEDIA_ROOT
sender = User.objects.get(username='user-1')