docbow/docbow_project/docbow/management/commands/sendfile.py

80 lines
3.1 KiB
Python

from __future__ import print_function
import locale
import os.path
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from django.core.files import File
from django.utils.encoding import force_text
from docbow_project.docbow.models import MailingList, FileType, Document, AttachedFile
def get_object(model, ref, name='name'):
'''Try to get a model by id or by name'''
if ref.isdigit():
return model.objects.get(id=int(ref))
else:
return model.objects.get(**{name: ref})
class Command(BaseCommand):
help = '''Send a document'''
def add_arguments(self, parser):
parser.add_argument('file_tosend', nargs='+', type=str, help='File to send')
parser.add_argument("--sender")
parser.add_argument("--to-list", action="append")
parser.add_argument("--to-user", action="append")
parser.add_argument("--filetype")
parser.add_argument("--description")
@transaction.atomic
def handle(self, **options):
locale.setlocale(locale.LC_ALL, '')
locale_encoding = locale.nl_langinfo(locale.CODESET)
if 'sender' not in options:
raise CommandError('missing --sender parameter')
try:
sender = get_object(User, force_text(options['sender'], locale_encoding), 'username')
except User.DoesNotExist:
raise CommandError('user %r does not exist' % options['sender'])
to_lists = []
try:
for l in options.get('to_list') or []:
l = get_object(MailingList, force_text(l, locale_encoding))
to_lists.append(l)
except MailingList.DoesNotExist:
raise CommandError('list %r does not exist' % l)
to_users = []
try:
for l in options.get('to_user') or []:
l = get_object(User, force_text(l, locale_encoding), 'username')
to_users.append(l)
except User.DoesNotExist:
raise CommandError('user %r does not exist' % l)
if 'filetype' not in options:
raise CommandError('missing --filetype parameter')
try:
filetype = get_object(FileType, force_text(options['filetype'], locale_encoding))
except FileType.DoesNotExist:
raise CommandError('filetype %r does not exist' % options['filetype'])
if not to_users and not to_lists:
print(to_users, to_lists, options)
raise CommandError(
'you must specify at least one list or user ' 'recipient using --to-list and --to-user.'
)
document = Document(sender=sender, filetype=filetype)
document.save()
document.to_user.set(to_users)
document.to_list.set(to_lists)
for arg in options['file_tosend']:
if not os.path.isfile(arg):
raise CommandError('file %r does not exist')
AttachedFile.objects.create(
name=force_text(arg, locale_encoding), content=File(open(arg)), document=document
)
document.post()