Skip to content
Snippets Groups Projects
Verified Commit b06120b8 authored by Tom Teichler's avatar Tom Teichler :beers:
Browse files

Re-implement event feedback

parent d7d79ec4
No related branches found
No related tags found
1 merge request!55WIP: Resolve "Migrate to AlekSIS app"
Pipeline #6867 passed
from django.utils.translation import gettext_lazy as _
from aleksis.core.filters import MultipleCharFilter
from django_filters import FilterSet
from material import Layout, Row
from aleksis.core.filters import MultipleCharFilter
from .models import EventRegistration, FeedbackAspect, TeckidsMember, Voucher
......
......@@ -4,14 +4,13 @@ from collections import OrderedDict
from django import forms
from django.utils.translation import ugettext_lazy as _
from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget
import phonenumbers
from django_starfield import Stars
from material import Fieldset, Layout, Row
from aleksis.core.mixins import ExtensibleForm
from aleksis.core.models import Group, Person
from aleksis.core.util.core_helpers import get_site_preferences
from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget
from django_starfield import Stars
from material import Fieldset, Layout, Row
from .models import EventRegistration, FeedbackAspect, TeckidsEvent, TeckidsMember, Voucher
......@@ -180,7 +179,9 @@ class EditEventForm(forms.ModelForm):
layout = Layout(
Fieldset(
_("Base data"),
"group", Row("display_name", "description"), Row("place", "published"),
"group",
Row("display_name", "description"),
Row("place", "published"),
Fieldset(_("Date data"), Row("date_event", "date_registration", "date_retraction")),
Fieldset(_("Event details"), Row("cost", "max_participants")),
Fieldset(_("Feedback aspects"), "feedback_aspects"),
......@@ -201,6 +202,7 @@ class EditEventForm(forms.ModelForm):
),
}
class EditVoucherForm(forms.ModelForm):
"""Form to edit and create vouchers."""
......@@ -230,10 +232,10 @@ class GenerateListForm(forms.Form):
)
landscape = forms.BooleanField(
label=_("Landscape"),
help_text=_("Select if output should be in landscape."),
label=_("Landscape"), help_text=_("Select if output should be in landscape."),
)
class RegisterEventForm(forms.ModelForm):
"""Form to register for an event."""
......
from django.utils.translation import gettext_lazy as _
from jsonstore import CharField
from aleksis.core.models import Person
from jsonstore import CharField
# Additional fields for persons
Person.field(school=CharField(verbose_name=_("Name of school")))
......
......@@ -2,10 +2,9 @@ from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django_iban.fields import IBANField
from aleksis.core.mixins import ExtensibleModel, PureDjangoModel
from aleksis.core.models import Group, Person
from django_iban.fields import IBANField
class TeckidsMember(ExtensibleModel):
......@@ -106,12 +105,51 @@ class TeckidsEvent(ExtensibleModel):
return self.group.owners.all()
class EventFeedback(ExtensibleModel):
class Meta:
verbose_name = _("Event feedback")
verbose_name_plural = _("Event feedbacks")
COMMENT_CHOICES = [
("first", _("Only first name")),
("first_age", _("First name and age")),
("first_last_age", _("First name, last name and age")),
]
LICENCE_CHOICES = [
("CC-BY-4.0+", _("Creative Commons with attribution, 4.0 or later")),
(
"CC-BY-SA-4.0+",
_(
"Creative Commons with attribution and distribution only"
"under the same conditions, 4.0 or later"
),
),
]
event = models.ForeignKey(
TeckidsEvent, on_delete=models.CASCADE, verbose_name=_("Event"), related_name="feedback"
)
person = models.ForeignKey(
Person, on_delete=models.CASCADE, verbose_name=_("Person"), related_name="feedback"
)
comment_private = models.TextField(verbose_name=_("Private comment"), blank=True)
comment_public = models.TextField(verbose_name=_("Public comment"), blank=True)
comment_public_info = models.CharField(
choices=COMMENT_CHOICES, verbose_name=_("Information in the comment")
)
photos = models.ImageField(verbose_name=_("Photos"), upload_to="feedback/", blank=True)
photos_licence = models.CharField(choices=LICENCE_CHOICES, verbose_name=_("Photo licence"))
class Voucher(ExtensibleModel):
class Meta:
verbose_name = _("Vouchers")
verbose_name_plural = _("Vouchers")
code = models.CharField(max_length=8, blank=True, null=True)
code = models.CharField(max_length=8, blank=True)
event = models.ForeignKey(
TeckidsEvent,
related_name="vouchers",
......@@ -167,8 +205,8 @@ class EventRegistration(ExtensibleModel):
person = models.ForeignKey(Person, on_delete=models.CASCADE, verbose_name=_("Person"))
date_registred = models.DateTimeField(auto_now_add=True, verbose_name=_("Registration date"))
comment = models.TextField(verbose_name=_("Comment / remarks"), blank=True, null=True)
channel = models.CharField(verbose_name=_("Channel"), max_length=255, blank=True, null=True)
comment = models.TextField(verbose_name=_("Comment / remarks"), blank=True)
channel = models.CharField(verbose_name=_("Channel"), max_length=255, blank=True)
voucher = models.ForeignKey(
Voucher, on_delete=models.CASCADE, verbose_name=_("Voucher"), blank=True, null=True,
)
......
from django.contrib.auth import get_user_model
from rules import predicate
from aleksis.core.models import Group, Person
from aleksis.core.util.predicates import check_object_permission
from rules import predicate
from .models import EventRegistration, Voucher
......
from django.utils.translation import gettext_lazy as _
from aleksis.core.registries import site_preferences_registry
from dynamic_preferences.preferences import Section
from dynamic_preferences.types import StringPreference
from aleksis.core.registries import site_preferences_registry
ticdesk = Section("ticdesk")
......
import rules
from aleksis.core.models import Group
from aleksis.core.util.predicates import (
has_any_object,
......
INSTALLED_APPS = [
"django_extensions",
"django_starfield",
"django_filters",
"django_tables2",
"django_cron",
]
# django-starfield
......
{% load i18n %}
{% block subject %} {% trans "New feedback on" %} {{ feedback.event }} {% endblock %}
{% block plain %}
{% blocktrans with feedback.event=feedback.event %}New feedback on: {{ feedback.event }}{% endblocktrans %}
*** {% trans "Event" %} *****
* {% trans "Event" %}: {{ feedback.event }}
**** {% trans "Person " %} ****
* {% trans "Name" %}: {{ feedback.person }}
* {% trans "Date of birth" %}: {{ feedback.person.date_of_birth }}
* {% trans "Email address" %}: {{ feedback.person.email }}
**** {% trans "Comments" %} ****
* {% trans "Private comment" %}: {{ feedback.comment_private }}
* {% trans "Public comment" %}: {{ feedback.comment_public }}
* {% trans "Public comment info" %}: {{ feedback.comment_public_info }}
**** {% trans 'Photos' %} ****
{% for photo in feedback.photos %}
* {{ photo }}
{% endfor %}
* {% trans "Photo licence" %}: {{ feedback.photos_licence }}
{% trans "Your AlekSIS team" %}
{% endblock %}
{% block html %}
<main>
<p>{% blocktrans with new_feedback.event=new_feedback.event %}New feedback.event: {{ feedback.event}}{% endblocktrans %}</p>
<blockquote>
<h5>{% trans "Event" %}</h5>
<ul>
<li>{% trans "Event" %}: {{ feedback.event.feedback.event }}</li>
</ul>
<h5>{% trans "Person" %</h5>
<ul>
<li>{% trans "Name" %}: {{ feedback.event.person }}</li>
<li>{% trans "Date of birth" %}: {{ feedback.event.date_of_birth }}</li>
<li>{% trans "Email address" %}: {{ feedback.event.person.email }}</li>
</ul>
<h5>{% trans "Comments" %}</h5>
<ul>
<li>{% trans "Private comment" %}: {{ feedback.comment_private }}</li>
<li>{% trans "Public comment" %}: {{ feedback.comment_public }}</li>
<li>{% trans "Public comment info" %}: {{ feedback.comment_public_info }}</li>
</ul>
<h5>{% trans "Photos" %}</h5>
{% for photo in feedback.photos %}
<img src="{{ photo }}" alt="Feedback photo"></img>
{% endfor %}
<ul>
<li>{% trans "Photo licence" %}: {{ feedback.photos_licence }}</li>
</ul>
</blockquote>
<p>
<i>{% trans "Your AlekSIS team" %}</i>
</p>
</main>
{% endblock %}
import json
from typing import Optional
from django.contrib.auth.decorators import login_required
from django.core.mail import EmailMessage
from django.http import HttpRequest, HttpResponse
from django.shortcuts import redirect, render
from django.utils import timezone
......@@ -10,15 +8,14 @@ from django.utils.translation import ugettext as _
from django.views.generic.list import ListView
import reversion
from aleksis.core.models import Activity, Person
from aleksis.core.util import messages
from aleksis.core.util.core_helpers import lazy_preference, objectgetter_optional
from django_tables2 import RequestConfig
from reversion.views import create_revision
from rules.contrib.views import PermissionRequiredMixin, permission_required
from templated_email import send_templated_mail
from aleksis.core.models import Activity, Person
from aleksis.core.util import messages
from aleksis.core.util.core_helpers import objectgetter_optional, lazy_preference
from .filters import (
EventRegistrationFilter,
FeedbackAspectsFilter,
......@@ -44,7 +41,7 @@ from .tables import (
TeckidsMemberTable,
VouchersTable,
)
from .util import form_to_text_table, generate_code, upload_file_to_media_url
from .util import generate_code
def events(request):
......@@ -241,36 +238,17 @@ def feedback_event(request, id_):
if request.method == "POST":
if feedback_form.is_valid():
feedback = feedback_form.save(commit=True)
context["feedback"] = feedback
# Handle photo uploads, if any
photo_urls = []
for file in request.FILES.getlist("photos"):
url = upload_file_to_media_url(file, "ticdesk/teckids_events/feedback/photos")
photo_urls.append(url)
# Produce e-mail to registration queue
message = EmailMessage()
message.subject = _("Feedback: %s von %s") % (
event.display_name,
current_person.user.username,
)
message.extra_headers = {
"X-OTRS-DynamicField-TeckidsEvent": event.short_name,
"X-OTRS-CustomerUser": current_person.user.username,
}
message.body = form_to_text_table(feedback_form, 78)
if photo_urls:
message.body += "\n\n" + _("Photos:") + "\n\n"
for url in photo_urls:
message.body += request.build_absolute_uri(url) + "\n"
# Attach raw form data as attachment
message.attach(
"feedback_form.json",
json.dumps(feedback_form.cleaned_data, indent=4, default=str),
"application/json",
send_templated_mail(
template_name="event_feedback",
from_email=lazy_preference("mail", "address"),
recipient_list=["verein@teckids.org"],
headers={"reply_to": [request.person.email,],},
context=context,
)
message.send()
# Set success
messages.success(request, _("Feedback successfully submitted."))
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -35,7 +35,7 @@ python-pam = "^1.8.4"
python-resize-image = "^1.1.19"
redis-collections = "^0.8.0"
django-iban-field = "^0.8"
aleksis-core = "^2.0a4.dev0"
aleksis-core = "^2.0a5.dev0"
[tool.poetry.plugins."aleksis.app"]
ticdesk = "aleksis.apps.ticdesk.apps:TICDeskConfig"
......
......@@ -13,7 +13,7 @@ commands_pre =
poetry run aleksis-admin yarn install
poetry run aleksis-admin collectstatic --no-input
commands =
poetry run pytest --cov=. {posargs} ticdesk/
poetry run pytest --cov=. {posargs} aleksis/
[testenv:selenium]
setenv =
......@@ -24,9 +24,9 @@ setenv =
[testenv:lint]
commands =
poetry run black --check --diff ticdesk/
poetry run isort -c --diff --stdout ticdesk/
poetry run flake8 {posargs} ticdesk/
poetry run black --check --diff aleksis/
poetry run isort -c --diff --stdout aleksis/
poetry run flake8 {posargs} aleksis/
[testenv:security]
commands =
......@@ -42,8 +42,8 @@ commands = poetry run make -C docs/ html {posargs}
[testenv:reformat]
commands =
poetry run isort ticdesk/
poetry run black ticdesk/
poetry run isort aleksis/
poetry run black aleksis/
[flake8]
max_line_length = 100
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment