Implement bulk message sending
This commit is contained in:
parent
48cb7d98bd
commit
c38b194f9c
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 4.0.4 on 2022-05-16 14:13
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("app", "0007_shiftregistration_state"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="message",
|
||||||
|
name="sent_at",
|
||||||
|
field=models.DateTimeField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
]
|
|
@ -149,7 +149,7 @@ class Message(models.Model):
|
||||||
text = models.CharField(max_length=160)
|
text = models.CharField(max_length=160)
|
||||||
to = models.ForeignKey(Helper, on_delete=models.CASCADE)
|
to = models.ForeignKey(Helper, on_delete=models.CASCADE)
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
sent_at = models.DateTimeField(null=True)
|
sent_at = models.DateTimeField(blank=True, null=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.to.name}({self.created_at}): {self.text}"
|
return f"{self.to.name}({self.created_at}): {self.text}"
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% for error in field.errors %}
|
{% for error in field.errors %}
|
||||||
<p class="help is-danger"> {{ error }}</p>
|
<p class="help is-danger">{{ error }}</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if field.help_text %}
|
{% if field.help_text %}
|
||||||
<p class="help">{{ field.help_text }}</p>
|
<p class="help">{{ field.help_text }}</p>
|
||||||
|
|
|
@ -10,3 +10,9 @@ class HelperShift(forms.Form):
|
||||||
helper = forms.ModelChoiceField(
|
helper = forms.ModelChoiceField(
|
||||||
label="Helfer*in", queryset=Helper.objects.order_by("name")
|
label="Helfer*in", queryset=Helper.objects.order_by("name")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BulkMessage(forms.Form):
|
||||||
|
message = forms.CharField(
|
||||||
|
label="Nachricht", widget=forms.Textarea(attrs={"class": "textarea"})
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
{% extends "team_base.html" %}
|
||||||
|
|
||||||
|
{% block title %}Massen-Nachricht{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<h3 class="title">Massen-Nachricht versenden</h3>
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% for field in form %}
|
||||||
|
<div class="field">
|
||||||
|
<label class="label" for="{{ field.id_for_label }}">{{ field.label }}</label>
|
||||||
|
<div class="control">
|
||||||
|
{{ field }}
|
||||||
|
</div>
|
||||||
|
{% for error in field.errors %}
|
||||||
|
<p class="help is-danger">{{ error }}</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
<button class="button is-primary" type="submit">Versenden</button>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
|
@ -7,6 +7,7 @@
|
||||||
<a class="navbar-item" href="{% url 'team:shift_overview' %}">Schichtübersicht</a>
|
<a class="navbar-item" href="{% url 'team:shift_overview' %}">Schichtübersicht</a>
|
||||||
<a class="navbar-item" href="{% url 'team:shift_free' %}">Freie Schichten</a>
|
<a class="navbar-item" href="{% url 'team:shift_free' %}">Freie Schichten</a>
|
||||||
<a class="navbar-item" href="{% url 'team:shift_all' %}">Alle Schichten</a>
|
<a class="navbar-item" href="{% url 'team:shift_all' %}">Alle Schichten</a>
|
||||||
|
<a class="navbar-item" href="{% url 'team:bulk_message' %}">Massen-Nachricht</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="navbar-end"></div>
|
<div class="navbar-end"></div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -10,4 +10,5 @@ urlpatterns = [
|
||||||
path("free_shifts/", views.FreeShiftList.as_view(), name="shift_free"),
|
path("free_shifts/", views.FreeShiftList.as_view(), name="shift_free"),
|
||||||
path("shift/<int:pk>", views.shift_detail, name="shift"),
|
path("shift/<int:pk>", views.shift_detail, name="shift"),
|
||||||
path("helper/<int:pk>", views.HelperDetail.as_view(), name="helper"),
|
path("helper/<int:pk>", views.HelperDetail.as_view(), name="helper"),
|
||||||
|
path("message/", views.bulk_message, name="bulk_message"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -3,11 +3,11 @@ from django.contrib.auth.decorators import login_required
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.db.models.fields import DateTimeField
|
from django.db.models.fields import DateTimeField
|
||||||
from django.db.models import F, Count, Q, ExpressionWrapper
|
from django.db.models import F, Count, Q, ExpressionWrapper
|
||||||
from .models import ShiftRegistration, Room, Shift, Helper
|
from .models import ShiftRegistration, Room, Shift, Helper, Message
|
||||||
from django.views.generic import DetailView, ListView
|
from django.views.generic import DetailView, ListView
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from .forms import HelperShift
|
from .forms import BulkMessage, HelperShift
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
def index(request):
|
def index(request):
|
||||||
|
@ -77,6 +77,36 @@ def shift_detail(request, pk):
|
||||||
return render(request, "shift_detail.html", context)
|
return render(request, "shift_detail.html", context)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def bulk_message(request):
|
||||||
|
form = BulkMessage()
|
||||||
|
|
||||||
|
if request.method == "POST":
|
||||||
|
form = BulkMessage(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
try:
|
||||||
|
Message.objects.bulk_create(
|
||||||
|
(
|
||||||
|
Message(text=form.cleaned_data["message"], to=helper)
|
||||||
|
for helper in Helper.objects.all()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
messages.add_message(
|
||||||
|
request, messages.SUCCESS, "Massen-Nachricht erfolgreich versendet"
|
||||||
|
)
|
||||||
|
except:
|
||||||
|
messages.add_message(
|
||||||
|
request,
|
||||||
|
messages.ERROR,
|
||||||
|
"Fehler beim Versenden der Massen-Nachricht",
|
||||||
|
)
|
||||||
|
|
||||||
|
context = {
|
||||||
|
"form": form,
|
||||||
|
}
|
||||||
|
return render(request, "bulk_message.html", context)
|
||||||
|
|
||||||
|
|
||||||
class HelperDetail(LoginRequiredMixin, DetailView):
|
class HelperDetail(LoginRequiredMixin, DetailView):
|
||||||
template_name = "helper_detail.html"
|
template_name = "helper_detail.html"
|
||||||
model = Helper
|
model = Helper
|
||||||
|
|
Loading…
Reference in New Issue