use documents instead of mailboxes in views
This commit is contained in:
parent
af28eb63f3
commit
75ea414334
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'),
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -143,6 +143,7 @@ INSTALLED_APPS = (
|
|||
'crispy_forms',
|
||||
'tinymce',
|
||||
'south',
|
||||
'entrouvert.djommon.humantime',
|
||||
'django.contrib.admin',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.auth',
|
||||
|
|
Loading…
Reference in New Issue