add mesh communication from django form

This commit is contained in:
Laura Klünder 2023-10-04 15:42:03 +02:00
parent 2ff4a9a64a
commit 21b75bec86
10 changed files with 191 additions and 21 deletions

View file

@ -1,8 +1,14 @@
from django.contrib import messages
from django.db.models import Max
from django.views.generic import ListView, DetailView
from django.http import Http404
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic import ListView, DetailView, FormView
from c3nav.control.forms import MeshMessageFilerForm
from c3nav.control.forms import MeshMessageFilterForm
from c3nav.control.views.base import ControlPanelMixin
from c3nav.mesh.forms import MeshMessageForm
from c3nav.mesh.messages import MessageType
from c3nav.mesh.models import MeshNode, NodeMessage
@ -22,6 +28,9 @@ class MeshNodeDetailView(ControlPanelMixin, DetailView):
pk_url_kwargs = "address"
context_object_name = "node"
def get_queryset(self):
return super().get_queryset().annotate(last_msg=Max('received_messages__datetime')).prefetch_last_messages()
class MeshMessageListView(ControlPanelMixin, ListView):
model = NodeMessage
@ -33,7 +42,7 @@ class MeshMessageListView(ControlPanelMixin, ListView):
def get_queryset(self):
qs = super().get_queryset()
self.form = MeshMessageFilerForm(self.request.GET)
self.form = MeshMessageFilterForm(self.request.GET)
if self.form.is_valid():
if self.form.cleaned_data['message_types']:
qs = qs.filter(message_type__in=self.form.cleaned_data['message_types'])
@ -53,3 +62,40 @@ class MeshMessageListView(ControlPanelMixin, ListView):
'form_data': form_data.urlencode(),
})
return ctx
class MeshMessageSendView(ControlPanelMixin, FormView):
template_name = "control/mesh_message_send.html"
def get_form_class(self):
try:
return MeshMessageForm.get_form_for_type(MessageType[self.kwargs['msg_type']])
except KeyError:
raise Http404('unknown message type')
def get_form_kwargs(self):
return {
**super().get_form_kwargs(),
'recipient': self.kwargs.get('recipient', None),
}
def get_initial(self):
if 'recipient' in self.kwargs and self.kwargs['msg_type'].startswith('CONFIG_'):
try:
node = MeshNode.objects.get(address=self.kwargs['recipient'])
except MeshNode.DoesNotExist:
pass
else:
return node.last_messages[self.kwargs['msg_type']].parsed.tojson()
return {}
def get_success_url(self):
if 'recipient' in self.kwargs and False:
return reverse('control.mesh_node.detail', kwargs={'pk': self.kwargs['recipient']})
else:
return self.request.path
def form_valid(self, form):
form.send()
messages.success(self.request, _('Message sent successfully'))
return super().form_valid(form)