extra senders: limit number by file type (#51403)
This commit is contained in:
parent
dc5509e16e
commit
3fb2971f1e
|
@ -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]
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -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']
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue