use documents instead of mailboxes in views

This commit is contained in:
Benjamin Dauvergne 2013-11-26 10:35:52 +01:00
parent af28eb63f3
commit 75ea414334
7 changed files with 91 additions and 135 deletions

View File

@ -139,8 +139,8 @@ class FileForm(RecipientForm, ModelForm):
self.delegations = kwargs.pop('delegations', [])
initial = kwargs.setdefault('initial', {})
if self.reply_to:
doc = self.reply_to.document
initial['sender'] = self.reply_to.owner
doc = self.reply_to
initial['sender'] = kwargs.get('user', None)
initial['recipients'] = [ 'user-%s' % doc.sender.id ]
initial['comment'] = u'Re: ' + doc.comment
@ -231,7 +231,7 @@ class FileForm(RecipientForm, ModelForm):
assert self.default_sender
self.instance.sender = self.default_sender
if self.reply_to:
self.instance.reply_to = self.reply_to.document
self.instance.reply_to = self.reply_to
if self.user != self.instance.sender:
self.instance.real_sender = username(self.user)
return super(FileForm, self).save(commit=commit)

View File

@ -391,8 +391,7 @@ class Document(Model):
def url(self):
return urlparse.urljoin(app_settings.BASE_URL,
reverse('inbox-by-document-message',
kwargs=dict(document_id=self.id)))
reverse('inbox', kwargs=dict(mailbox_id=self.id)))
class DeletedMailbox(Model):

View File

@ -17,18 +17,18 @@ class MailboxTable(tables.Table):
_('self')
class OutboxCsvTable(tables.Table):
official_sender = tables.Column(accessor='document.sender.get_full_name',
official_sender = tables.Column(accessor='sender.get_full_name',
verbose_name=_('official_sender_header'))
recipients = tables.Column(accessor='document.recipients',
recipients = tables.Column(accessor='recipients',
verbose_name=_('recipients_header'), orderable=False)
real_sender = tables.TemplateColumn(
'{% load i18n %}{% if record.document.real_sender %}{{ record.document.real_sender }}{% else %}{% trans "self" %}{% endif %}',
'{% load i18n %}{% if record.real_sender %}{{ record.real_sender }}{% else %}{% trans "self" %}{% endif %}',
verbose_name=_('real_sender_header'))
filetype = tables.Column(accessor='document.filetype',
filetype = tables.Column(accessor='filetype',
verbose_name=_('type_header'))
filenames = tables.Column(accessor='document.filenames',
filenames = tables.Column(accessor='filenames',
verbose_name=_('filename_header'), orderable=False)
date = tables.Column(accessor='document.date',
date = tables.Column(accessor='date',
verbose_name=_('date_header'))
@ -40,22 +40,22 @@ class OutboxCsvTable(tables.Table):
empty_text = _('No message')
class OutboxTable(tables.Table):
official_sender = tables.Column(accessor='document.sender.get_full_name',
official_sender = tables.Column(accessor='sender.get_full_name',
order_by=('document__sender__last_name',
'document__sender__first_name',
'document__sender__username'),
verbose_name=_('official_sender_header'))
recipients = tables.Column(accessor='document.recipients',
recipients = tables.Column(accessor='recipients',
verbose_name=_('recipients_header'), orderable=False)
real_sender = tables.TemplateColumn(
'{% load i18n %}{% if record.document.real_sender %}{{ record.document.real_sender }}{% else %}{% trans "self" %}{% endif %}',
'{% load i18n %}{% if record.real_sender %}{{ record.real_sender }}{% else %}{% trans "self" %}{% endif %}',
order_by=('document__real_sender',),
verbose_name=_('real_sender_header'))
filetype = tables.Column(accessor='document.filetype',
filetype = tables.Column(accessor='filetype',
verbose_name=_('type_header'))
filenames = tables.Column(accessor='document.filenames',
filenames = tables.Column(accessor='filenames',
verbose_name=_('filename_header'), orderable=False)
date = tables.Column(accessor='document.date',
date = tables.TemplateColumn('{% load humantime %}{{ record.date|humantime }}',
verbose_name=_('date_header'))
delete = tables.TemplateColumn(template_name='docbow/outbox_delete_column.html',
orderable=False,
@ -72,15 +72,15 @@ class OutboxTable(tables.Table):
class InboxCsvTable(tables.Table):
filetype = tables.Column(
accessor='document.filetype',
accessor='filetype',
verbose_name=_('type_header'))
filenames = tables.Column(
accessor='document.filenames', verbose_name=_('filename_header'),
accessor='filenames', verbose_name=_('filename_header'),
orderable=False)
sender = tables.Column(
accessor='document.sender', verbose_name=_('sender_header'))
accessor='sender', verbose_name=_('sender_header'))
date = tables.Column(
accessor='document.date', verbose_name=_('date_header'))
accessor='date', verbose_name=_('date_header'))
class Meta:
@ -90,23 +90,24 @@ class InboxCsvTable(tables.Table):
class InboxTable(tables.Table):
seen = tables.BooleanColumn(accessor='seen', yesno=u' ,✔', verbose_name=' ')
filetype = tables.Column(
accessor='document.filetype',
accessor='filetype',
verbose_name=_('type_header'))
filenames = tables.Column(
accessor='document.filenames', verbose_name=_('filename_header'),
accessor='filenames', verbose_name=_('filename_header'),
orderable=False)
sender = tables.Column(
accessor='document.sender', verbose_name=_('sender_header'))
date = tables.Column(
accessor='document.date', verbose_name=_('date_header'))
accessor='sender', verbose_name=_('sender_header'))
#date = tables.Column(
# accessor='date', verbose_name=_('date_header'))
date = tables.TemplateColumn('{% load humantime %}{{ record.date|humantime }}',
verbose_name=_('date_header'))
delete = tables.TemplateColumn(template_name='docbow/inbox_delete_column.html',
orderable=False, verbose_name=' ')
class Meta:
model = models.Mailbox
fields = ('seen',)
fields = ('filetype',)
attrs = {"class": "paleblue mailbox-table refresh", "id": "outbox-table"}
empty_text = _('No message')

View File

@ -42,7 +42,7 @@
{% if view_name == 'inbox' %}
<div class="form">
<form action="{% url 'send-file-selector' %}" class="uniForm">
<input type="hidden" name="reply_to" value="{{ mailbox.pk }}"/>
<input type="hidden" name="reply_to" value="{{ document.pk }}"/>
<div class="buttonHolder">
<input type="submit" class="submit submitButton" value="{% trans "Reply" %}"/>
</div>

View File

@ -10,7 +10,7 @@ urlpatterns = patterns('docbow_project.docbow.views',
url(r'^inbox_by_document/(?P<document_id>\d+)/$', 'inbox_by_document',
name='inbox-by-document-message'),
url(r'^inbox/(?P<mailbox_id>\d+)/$', 'message', name='inbox-message',
kwargs={'back': 'inbox'}),
kwargs={'outbox': False}),
url(r'^inbox/(?P<mailbox_id>\d+)/delete/$', 'delete',
name='inbox-message-delete'),
url(r'^inbox/(?P<mailbox_id>\d+)/(?P<attached_file>\d+)/.*$',
@ -22,13 +22,11 @@ urlpatterns = patterns('docbow_project.docbow.views',
url(r'^outbox/$', 'outbox_view', name='outbox'),
url(r'^outbox/(?P<mailbox_id>\d+)/$', 'message', name='outbox-message',
kwargs={'back': 'outbox'}),
kwargs={'outbox': True}),
url(r'^outbox/(?P<mailbox_id>\d+)/delete/$', 'delete',
name='outbox-message-delete', kwargs={'back': 'outbox'}),
name='outbox-message-delete', kwargs={'outbox': True}),
url(r'^outbox/(?P<mailbox_id>\d+)/(?P<attached_file>\d+)/.*$',
'message_attached_file', name='outbox-message-attached-file', kwargs={'back': 'outbox'}),
url(r'^outbox_by_document/(?P<document_id>\d+)/$', 'outbox_by_document',
name='outbox-by-document-message'),
'message_attached_file', name='outbox-message-attached-file', kwargs={'outbox': True}),
url(r'^outbox/csv$', 'outbox_csv', name='outbox-csv'),
url(r'^outbox/ods$', 'outbox_ods', name='outbox-ods'),

View File

@ -34,7 +34,7 @@ import django_tables2.views as tables_views
from .forms import (FileForm, AnonymousContactForm, ContactForm,
ForwardingForm, FilterForm)
from .models import (Mailbox, username, AttachedFile, SendingLimitation,
MailingList, DeletedMailbox, is_guest, Document, FileType)
MailingList, is_guest, Document, FileType, DeletedDocument)
from .decorators import no_delegate, never_cache, as_delegate
from .logger_adapter import get_logger
from . import tables
@ -50,26 +50,20 @@ gettext_noop = lambda x: x
def homepage(request):
return redirect('inbox')
def get_document(request, mailbox_id, outbox):
related_users = get_related_users(request)
mailboxes = Mailbox.objects.filter(owner__in=related_users, outbox=outbox)
return Document.objects \
.exclude(deleteddocument__user=request.user) \
.get(id=mailbox_id, mailboxes__in=mailboxes)
class Row(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def mailboxes(request):
return Mailbox.objects.filter(Q(owner=request.user)
|Q(owner__delegations_to__to=request.user)).distinct()
def get_mailbox(request, mailbox_id, back='inbox'):
owners = list(request.user.delegations_by \
.values_list('by__id', flat=True))
owners.append(request.user.id)
try:
return Mailbox.objects.get(pk=mailbox_id,
owner__in=owners, outbox=back!='inbox')
except Mailbox.DoesNotExist:
return None
def user_mailing_list_names(user):
return user.mailing_lists.values_list('name', flat=True)
@ -146,9 +140,12 @@ def get_filetype_limitation(user):
@never_cache
def send_file(request, file_type_id):
file_type = get_object_or_404(FileType, id=file_type_id)
reply_to = None
if 'reply_to' in request.GET:
reply_to = get_mailbox(request, request.GET['reply_to'])
try:
reply_to = get_document(request, request.GET['reply_to'], False)
except Document.DoesNotExist:
raise Http404
except KeyError:
reply_to = None
if hasattr(request.user, 'delegate'):
delegators = []
else:
@ -215,22 +212,19 @@ def upload(request, attached_file):
@login_required
@never_cache
def message_attached_file(request, mailbox_id, attached_file, back='inbox'):
def message_attached_file(request, mailbox_id, attached_file, outbox=False):
'''
Download attached files, verify that the user has access to the document
before, otherwise return 404.
'''
mailbox = get_mailbox(request, mailbox_id, back=back)
if not mailbox:
try:
document = get_document(request, mailbox_id, outbox)
except Document.DoesNotExist:
raise Http404
attached_file = get_object_or_404(AttachedFile,
document__mailboxes__id=mailbox_id, pk=attached_file)
Mailbox.objects.filter(pk=mailbox_id).update(seen=True)
delegate = mailbox.owner if mailbox.owner != request.user else None
attached_file = get_object_or_404(AttachedFile, document=document,
pk=attached_file)
request.record('download', 'download attached file {attached_file} of document {document}',
attached_file=attached_file, document=attached_file.document,
user=mailbox.owner,
delegate=delegate)
attached_file=attached_file, document=document)
return upload(request, attached_file)
def form_to_user_and_list(form):
@ -248,20 +242,21 @@ def form_to_user_and_list(form):
@login_required
@never_cache
def message(request, mailbox_id, back='inbox'):
mailbox = get_mailbox(request, mailbox_id, back)
if not mailbox:
def message(request, mailbox_id, outbox=False):
try:
document = get_document(request, mailbox_id, outbox)
except Document.DoesNotExist:
raise Http404
document = mailbox.document
if back == 'inbox':
back_pair = (reverse('inbox'), gettext_noop('back to inbox'))
else:
if outbox:
back_pair = (reverse('outbox'), gettext_noop('back to outbox'))
else:
back_pair = (reverse('inbox'), gettext_noop('back to inbox'))
back = 'outbox' if outbox else 'inbox'
ctx = { 'document': document,
'view_name': back, 'back': back_pair, 'mailbox': mailbox }
if back == 'inbox':
'view_name': back, 'back': back_pair }
if not outbox:
limitations = get_filetype_limitation(request.user)
if not limitations or limitations.filter(id=mailbox.document.filetype.id).exists():
if not limitations or limitations.filter(id=document.filetype.id).exists():
if request.method == 'POST':
form = ForwardingForm(request.POST, user=request.user,
**get_file_form_kwargs(request))
@ -283,8 +278,6 @@ def message(request, mailbox_id, back='inbox'):
form = ForwardingForm(user=request.user,
**get_file_form_kwargs(request))
ctx['form'] = form
ctx['delegated'] = mailbox.owner != request.user
delegate = mailbox.owner if ctx['delegated'] else None
ctx['attached_files'] = attached_files = []
for attached_file in document.attached_files.order_by('kind__position', 'kind__name', 'id'):
if attached_files and attached_files[-1][0] == attached_file.kind:
@ -292,7 +285,7 @@ def message(request, mailbox_id, back='inbox'):
else:
attached_files.append((attached_file.kind, [attached_file]))
request.record('message-view', 'looked at document {document}',
document=document, user=mailbox.owner, delegate=delegate)
document=document)
return render(request, 'docbow/message.html', ctx)
def get_help_content(pagename):
@ -383,31 +376,25 @@ def logout(request):
@login_required
@never_cache
def delete(request, mailbox_id, back='inbox'):
def delete(request, mailbox_id, outbox=False):
'''Remove a document from the inbox'''
if is_guest(request.user):
try:
document = get_document(request, mailbox_id, outbox)
except Document.ObjectDoesNotExist:
raise Http404
page = request.GET.get('page', 1)
back = 'outbox' if outbox else 'inbox'
viewname = back + '-message-delete'
back_pair = ('%s?page=%s' % (reverse(back), page),
gettext_noop('back to %s' % back))
owners = list(request.user.delegations_by \
.values_list('by__id', flat=True))
owners.append(request.user.id)
m = get_object_or_404(Mailbox, owner__id__in=owners, pk=mailbox_id)
if request.method == 'GET':
return render(request, 'docbow/delete.html', { 'document': m.document, 'back': back_pair, 'view_name': viewname })
return render(request, 'docbow/delete.html', { 'document': document, 'back': back_pair, 'view_name': viewname })
else:
if m.owner == request.user:
m.deleted = True
m.save()
DeletedMailbox.objects.filter(mailbox=m).delete()
request.record('delete-document', 'marked mailbox entry {mailbox} / document {document} as deleted',
mailbox=m, document=m.document)
else:
DeletedMailbox.objects.create(mailbox=m, delegate=request.user)
request.record('delete-document', 'marked mailbox entry {mailbox} / document {document} as deleted',
mailbox=m, user=m.owner, delegate=request.user, document=m.document)
DeletedDocument.objects.get_or_create(user=request.user,
document=document)
request.record('delete-document', 'marked document {document} as deleted', document=document)
return redirect(back_pair[0])
@ -421,31 +408,8 @@ def get_free_delegation_number(user):
return delegate_username
@login_required
@never_cache
def inbox_by_document(request, document_id):
return box_by_document(request, document_id, outbox=False,
redirect_to='inbox-message')
@login_required
@never_cache
def outbox_by_document(request, document_id):
return box_by_document(request, document_id, outbox=True,
redirect_to='outbox-message')
def box_by_document(request, document_id, outbox, redirect_to):
mboxes = mailboxes(request).filter(document=document_id, outbox=outbox)
if not mboxes:
raise Http404('No document found')
for mbox in mboxes:
if mbox.owner == request.user:
break
else:
mbox = mboxes[0]
return redirect(redirect_to, mbox.id)
return redirect('inbox', mailbox_id=document_id)
from django.contrib.auth import SESSION_KEY, BACKEND_SESSION_KEY
from django import http
@ -517,11 +481,11 @@ class DateFilterMixinView(object):
not_after = filter_form.cleaned_data.get('not_after')
if not_before is not None:
not_before = date_to_aware_datetime(not_before)
qs = qs.filter(document__date__gte=not_before)
qs = qs.filter(date__gte=not_before)
if not_after is not None:
not_after += datetime.timedelta(days=1)
not_after = date_to_aware_datetime(not_after)
qs = qs.filter(document__date__lt=not_after)
qs = qs.filter(date__lt=not_after)
return qs
@ -540,32 +504,25 @@ def get_related_users(request):
'''
if 'related_users' not in request.session:
users = [request.user]
delegations = user.delegations_by.select_related('by')
delegations = request.user.delegations_by.select_related('by')
if delegations:
users.extend(delegation.by for delegation in delegations)
request.session['related_users'] = users
return request.session['realted_users']
return request.session['related_users']
class MailboxQuerysetMixin(object):
def get_queryset(self):
qs = super(MailboxQuerysetMixin, self).get_queryset()
user = self.request.user
delegations = user.delegations_by.select_related('by')
if delegations:
delegators = [delegation.by for delegation in delegations]
delegators.append(user)
deleted_ids = DeletedMailbox.objects.all()
deleted_ids = deleted_ids.filter(delegate=user)
deleted_ids = deleted_ids.values_list('mailbox_id', flat=True)
qs = qs.filter(deleted=False, owner__in=delegators, outbox=self.outbox) \
.exclude(id__in=deleted_ids)
else:
qs = qs.filter(deleted=False, owner=user, outbox=self.outbox)
related_users = get_related_users(self.request)
mailboxes = Mailbox.objects.filter(owner__in=related_users,
outbox=self.outbox)
qs = qs.filter(mailboxes__in=mailboxes) \
.exclude(deleteddocument__user=self.request.user)
return qs
class MailboxView(ExtraContextMixin, MailboxQuerysetMixin, tables_views.SingleTableView):
model = Mailbox
model = Document
table_class = tables.MailboxTable
table_pagination = {
'per_page': app_settings.DOCBOW_MAILBOX_PER_PAGE,

View File

@ -143,6 +143,7 @@ INSTALLED_APPS = (
'crispy_forms',
'tinymce',
'south',
'entrouvert.djommon.humantime',
'django.contrib.admin',
'django.contrib.contenttypes',
'django.contrib.auth',