2
0
Fork 0

add helper feedback

This commit is contained in:
Andreas (@xAndy) Zimmermann 2023-05-25 17:08:58 +02:00
parent f16e6f15a5
commit d91e1e607a
14 changed files with 184 additions and 11 deletions

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class FeedbackConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "shiftregister.feedback"

View File

@ -0,0 +1,20 @@
from .models import Feedback
from django.forms import ModelForm
from django import forms
class FeedbackForm(ModelForm):
class Meta:
model = Feedback
fields = ("party", "next_year", "feedback_text")
labels = {
"party": "Kommst du zum HelferInnen Fest?",
"feedback_text": "Wie wars?",
"next_year": "Dürfen wir dich nächstes Jahr wieder kontaktieren?",
}
help_texts = {
"feedback_text": "Was hat dir gefallen? Was hat geklappt? Was können wir naechstes Jahr besser machen?",
}
widgets = {
"party": forms.RadioSelect,
}

View File

@ -0,0 +1,43 @@
# Generated by Django 4.0.4 on 2023-05-25 14:16
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
("app", "0011_room_description"),
]
operations = [
migrations.CreateModel(
name="Feedback",
fields=[
(
"helper",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
primary_key=True,
serialize=False,
to="app.helper",
),
),
(
"party",
models.CharField(
choices=[
("yes", "ja"),
("no", "nein"),
("maybe", "vielleicht"),
],
max_length=7,
),
),
("next_year", models.BooleanField()),
("feedback_text", models.TextField(blank=True, default="")),
],
),
]

View File

@ -0,0 +1,19 @@
from django.db import models
from shiftregister.app.models import Helper
class Feedback(models.Model):
helper = models.OneToOneField(Helper, primary_key=True, on_delete=models.CASCADE)
class PartyState(models.TextChoices):
YES = "yes", "ja"
NO = "no", "nein"
MAYBE = "maybe", "vielleicht"
party = models.CharField(
max_length=7,
choices=PartyState.choices,
blank=False,
)
next_year = models.BooleanField()
feedback_text = models.TextField(blank=True, default="")

View File

@ -0,0 +1,31 @@
{% extends "helper_base.html" %}
{% block title %}Danke :){% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{% for field in form %}
<div class="field">
{% if field.widget_type == 'checkbox' %}
<div class="control">
<label class="checkbox" for="{{ field.id_for_label }}">{{ field }} {{ field.label }}</label>
</div>
{% else %}
<label class="label" for="{{ field.id_for_label }}">{{ field.label }}</label>
<div class="control">
{{ field }}
</div>
{% endif %}
{% for error in field.errors %}
<p class="help is-danger">{{ error }}</p>
{% endfor %}
{% if field.help_text %}
<p class="help">{{ field.help_text }}</p>
{% endif %}
</div>
{% endfor %}
<button class="button is-link" type="submit">Speichern</button>
</form>
{% endblock %}

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,11 @@
from django.urls import path
from . import views
urlpatterns = [
path(
"f/<slug:token>",
views.feedback,
name="feedback",
),
]

View File

@ -0,0 +1,34 @@
from django.shortcuts import render, get_object_or_404
from .forms import FeedbackForm
from .models import Feedback
from shiftregister.app.models import LoginToken
from django.contrib import messages
def feedback(request, token):
tk = get_object_or_404(LoginToken, pk=token)
helper = tk.helper
form = FeedbackForm()
prev_data = Feedback.objects.filter(helper=helper).first()
if prev_data:
form = FeedbackForm(instance=prev_data)
if request.method == "POST":
form = FeedbackForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.helper = helper
obj.save()
messages.add_message(
request,
messages.SUCCESS,
"Deine Angaben wurden gespeichert.",
)
return render(
request,
"feedback.html",
{
"form": form,
"helper": helper,
},
)

View File

@ -47,6 +47,7 @@ INSTALLED_APPS = [
"shiftregister.pages.apps.PagesConfig", "shiftregister.pages.apps.PagesConfig",
"shiftregister.signage.apps.SignageConfig", "shiftregister.signage.apps.SignageConfig",
"shiftregister.team.apps.TeamConfig", "shiftregister.team.apps.TeamConfig",
"shiftregister.feedback.apps.FeedbackConfig",
"django.contrib.admin", "django.contrib.admin",
"django.contrib.auth", "django.contrib.auth",
"django.contrib.contenttypes", "django.contrib.contenttypes",

View File

@ -146,18 +146,19 @@ def bulk_message(request):
).filter(number_validated=True, shift_count__gte=1) ).filter(number_validated=True, shift_count__gte=1)
try: try:
Message.objects.bulk_create( outbox = []
( for helper in helpers:
Message(
text = form.cleaned_data["message"].replace( text = form.cleaned_data["message"].replace(
"$token", "$token",
f"https://helfen.kntkt.de{helper.logintoken_set.first().get_absolute_url()}", f"https://helfen.kntkt.de{helper.logintoken_set.first().get_absolute_url()}",
),
to=helper,
)
for helper in helpers
) )
text = text.replace(
"$fb",
f"https://helfen.kntkt.de/f/{helper.logintoken_set.first().id}",
) )
outbox.append(Message(text=text, to=helper))
Message.objects.bulk_create(outbox)
messages.add_message( messages.add_message(
request, messages.SUCCESS, "Massen-Nachricht erfolgreich versendet" request, messages.SUCCESS, "Massen-Nachricht erfolgreich versendet"
) )

View File

@ -20,6 +20,7 @@ urlpatterns = [
path("", include("shiftregister.metrics.urls")), path("", include("shiftregister.metrics.urls")),
path("", include("shiftregister.app.urls")), path("", include("shiftregister.app.urls")),
path("", include("shiftregister.pages.urls")), path("", include("shiftregister.pages.urls")),
path("", include("shiftregister.feedback.urls")),
path("team/", include("shiftregister.team.urls")), path("team/", include("shiftregister.team.urls")),
path("team/", include("shiftregister.fallback.urls")), path("team/", include("shiftregister.fallback.urls")),
path("dashboard/", include("shiftregister.signage.urls")), path("dashboard/", include("shiftregister.signage.urls")),