This repository has been archived on 2026-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
RepApp/repapp/email_interface/views.py

161 lines
4.4 KiB
Python
Raw Permalink Normal View History

2023-08-30 19:19:36 +00:00
import os
import logging
from pathlib import Path
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views import generic
from django.contrib import messages
from django.shortcuts import get_object_or_404, render
from django.utils.translation import gettext_lazy as _
from .forms import MessageForm
from .utils import create_message, send_message, process_mails
from .models import Message, Attachment
logger = logging.getLogger(__name__)
2023-09-02 15:09:21 +00:00
def process(request): # pragma: no cover
# no logic contained, no test needed
2023-08-30 19:19:36 +00:00
count = process_mails()
return HttpResponse(f'{count} new messages were processed.')
@login_required
def mail_thread(request, id):
message = get_object_or_404(Message, pk=id)
form = MessageForm()
form['receiver'].field.widget.attrs['disabled'] = 'disabled'
form.initial['receiver'] = message.sender
form['summary'].field.widget.attrs['disabled'] = 'disabled'
summary = f'Re: {message.summary}'
form.initial['summary'] = summary
if request.method == 'POST':
# Form was submitted
form = MessageForm(request.POST.copy())
form.data['receiver'] = message.sender.pk
form.data['summary'] = summary
2023-09-02 15:09:21 +00:00
logger.debug('mail_thread: sending mail %r', form)
2023-08-30 19:19:36 +00:00
if form.is_valid():
2023-09-02 15:09:21 +00:00
logger.debug('mail_thread: mail is valid. %r', form)
2023-08-30 19:19:36 +00:00
m = form.save(commit=False)
m.sender = request.user
m.reply_to = message
m.save()
message.answered = True
message.save()
success = send_message(m, request)
if success:
messages.info(request, _('Mail was sent.'))
return HttpResponseRedirect(reverse_lazy('email_interface:mail_thread', kwargs={'id': m.pk}))
2023-09-02 15:09:21 +00:00
else: # pragma: no cover
# should never happen
2023-08-30 19:19:36 +00:00
messages.error(request, _('Sending of mail failed!'))
2023-09-02 15:09:21 +00:00
else: # pragma: no cover
# only debug log
logger.debug('mail_thread: mail is not valid! %r', form.errors)
2023-08-30 19:19:36 +00:00
return render(
request,
"email_interface/testing/mail_thread.html",
{
'form': form,
'mails': message.thread(),
'mail': message,
'answers': message.answers(),
'siblings': message.siblings(),
}
)
@login_required
2023-09-02 15:09:21 +00:00
def send_test_mail(request): # pragma: no cover
2023-08-30 19:19:36 +00:00
"""
Debug view to send a test mail.
"""
2023-09-02 15:09:21 +00:00
# debug view
2023-08-30 19:19:36 +00:00
# get first user
user = get_user_model().objects.get(pk=1)
current_folder = Path(__file__).resolve().parent
file = os.path.join(current_folder, 'test_data', 'Nut.jpg')
res = create_message(
request,
request.user,
user,
'A test mail',
'<html><body><h1>Test!</h1></body></html>',
'Test!',
attachments=[file]
)
if res:
return HttpResponse('Mail was sent successful!')
else:
return HttpResponse('Sending of mail failed!')
2023-09-02 15:09:21 +00:00
class SendMailView(LoginRequiredMixin, generic.FormView): # pragma: no cover
# debug view
2023-08-30 19:19:36 +00:00
form_class = MessageForm
template_name = "email_interface/testing/write_mail.html"
success_url = reverse_lazy("email_interface:send_mail")
def form_valid(self, form):
message = form.save(commit=False)
message.sender = self.request.user
message.save()
success = send_message(message, self.request)
if success:
messages.info(self.request, _('Mail was sent.'))
else:
messages.error(self.request, _('Sending of mail failed!'))
return super().form_valid(form)
@login_required
def my_sent_mails(request):
return render(
request,
"email_interface/testing/my_mails.html",
{
'mails': Message.from_user(request.user),
}
)
@login_required
def my_received_mails(request):
return render(
request,
"email_interface/testing/my_mails.html",
{
'mails': Message.to_user(request.user),
}
)
@login_required
def my_attachments(request):
return render(
request,
"email_interface/testing/my_attachments.html",
{
'attachments': Attachment.of_user(request.user),
}
)