diff --git a/devday/attendee/forms.py b/devday/attendee/forms.py index d44d9ee3..bbc07355 100644 --- a/devday/attendee/forms.py +++ b/devday/attendee/forms.py @@ -377,7 +377,11 @@ def clean_attendee(self): ) ) if attendee.checked_in is not None: - raise ValidationError(_("{} is already checked in!".format(attendee.user))) + raise ValidationError( + _("%(user)s is already checked in!"), + code="checked_in", + params={"attendee": attendee, "user": attendee.user}, + ) return attendee @@ -452,9 +456,18 @@ def __init__(self, *args, **kwargs): self.helper.form_method = "post" self.helper.html5_required = True self.helper.layout = Layout( - Div(Field("title", wrapper_class="col-12"), css_class="form-row",), - Div(Field("contact", wrapper_class="col-12"), css_class="form-row",), - Div(Field("topics", wrapper_class="col-12"), css_class="form-row",), + Div( + Field("title", wrapper_class="col-12"), + css_class="form-row", + ), + Div( + Field("contact", wrapper_class="col-12"), + css_class="form-row", + ), + Div( + Field("topics", wrapper_class="col-12"), + css_class="form-row", + ), Div( Submit("submit", _("Submit your badge data")), css_class="col-12 text-center", diff --git a/devday/attendee/locale/de/LC_MESSAGES/django.po b/devday/attendee/locale/de/LC_MESSAGES/django.po index d026de5a..012c8656 100644 --- a/devday/attendee/locale/de/LC_MESSAGES/django.po +++ b/devday/attendee/locale/de/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: devday attendee app\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-09 15:26+0200\n" -"PO-Revision-Date: 2024-04-09 15:30+0200\n" +"POT-Creation-Date: 2024-04-10 18:07+0200\n" +"PO-Revision-Date: 2024-04-10 18:07+0200\n" "Last-Translator: Jan Dittberner \n" "Language-Team: Jan Dittberner \n" "Language: de\n" @@ -122,23 +122,24 @@ msgstr "" "Unbekannter Check-In-Code oder Email-Adresse, oder der Teilnehmer ist nicht " "für die aktuelle Veranstaltung registriert." -#: attendee/forms.py:380 -msgid "{} is already checked in!" -msgstr "{} ist bereits eingecheckt!" +#: attendee/forms.py:381 +#, python-format +msgid "%(user)s is already checked in!" +msgstr "%(user)s ist bereits eingecheckt!" -#: attendee/forms.py:392 +#: attendee/forms.py:396 msgid "How much did you like the Event?" msgstr "Wie gut hat Dir die Veranstaltung gefallen?" -#: attendee/forms.py:394 attendee/templates/attendee/event_summary.html:10 +#: attendee/forms.py:398 attendee/templates/attendee/event_summary.html:10 msgid "How well has the event been organised?" msgstr "Wie zufrieden warst Du mit der Organisation?" -#: attendee/forms.py:397 attendee/templates/attendee/event_summary.html:12 +#: attendee/forms.py:401 attendee/templates/attendee/event_summary.html:12 msgid "How much did the sessions fulfill your expectations?" msgstr "Inwieweit haben die Sessions Deine Erwartungen erfüllt?" -#: attendee/forms.py:400 attendee/templates/attendee/event_summary.html:14 +#: attendee/forms.py:404 attendee/templates/attendee/event_summary.html:14 msgid "" "Please tell us what you liked specifically and what should be different next " "time." @@ -146,11 +147,11 @@ msgstr "" "Gerne kannst Du uns in dem nachfolgenden Freitextfeld mitteilen, was Dir " "besonders gut gefallen hat oder was das nächste Mal anders sein sollte." -#: attendee/forms.py:430 +#: attendee/forms.py:434 msgid "Submit your feedback" msgstr "Feedback abschicken" -#: attendee/forms.py:459 +#: attendee/forms.py:472 msgid "Submit your badge data" msgstr "Deine Badge-Daten anpassen" @@ -191,7 +192,7 @@ msgstr "Nutzer" msgid "users" msgstr "Nutzer" -#: attendee/models.py:148 attendee/models.py:265 +#: attendee/models.py:148 attendee/models.py:266 msgid "Event" msgstr "Veranstaltung" @@ -227,7 +228,7 @@ msgstr "Verlosung" msgid "Take part in the raffle" msgstr "An der Verlosung teilnehmen" -#: attendee/models.py:177 attendee/models.py:223 attendee/models.py:257 +#: attendee/models.py:177 attendee/models.py:223 attendee/models.py:258 msgid "Attendee" msgstr "Teilnehmer" @@ -253,48 +254,48 @@ msgstr "" "Wie möchtest du genannt werden (diese Information wird auch für dein ÖPNV-" "Ticket genutzt)" -#: attendee/models.py:237 +#: attendee/models.py:238 msgid "Contact" msgstr "Kontakt" -#: attendee/models.py:240 +#: attendee/models.py:241 msgid "optional contact information (i.e. a social media handle)" msgstr "optionale Kontaktinformation (z.B. ein Social-Media-Handle)" -#: attendee/models.py:243 +#: attendee/models.py:244 msgid "Topics" msgstr "Themen" -#: attendee/models.py:246 +#: attendee/models.py:247 msgid "Topics you would like to talk about" msgstr "Themen über die du gern sprechen möchtest" -#: attendee/models.py:250 attendee/models.py:251 +#: attendee/models.py:251 attendee/models.py:252 msgid "Badge data" msgstr "Badge-Daten" -#: attendee/models.py:270 +#: attendee/models.py:271 msgid "Event score" msgstr "Bewertung Veranstaltung" -#: attendee/models.py:272 +#: attendee/models.py:273 msgid "Organisation score" msgstr "Bewertung Organisation" -#: attendee/models.py:274 +#: attendee/models.py:275 msgid "Session score" msgstr "Bewertung Sessions" -#: attendee/models.py:275 +#: attendee/models.py:276 msgid "Comment" msgstr "Kommentar" -#: attendee/models.py:279 +#: attendee/models.py:280 msgctxt "attendee event feedback singular form" msgid "Attendee event feedback" msgstr "Teilnehmerfeedback für Veranstaltung" -#: attendee/models.py:282 +#: attendee/models.py:283 msgctxt "attendee event feedback plural form" msgid "Attendee event feedback" msgstr "Teilnehmerfeedback für Veranstaltung" @@ -526,6 +527,12 @@ msgstr "Bearbeite deine Badge-Daten" msgid "You are registered for the event "%(event)s"." msgstr "Du bist für die Veranstaltung "%(event)s" angemeldet." +#: attendee/templates/attendee/checkin.html:14 +#: attendee/templates/attendee/checkin_result.html:15 +msgid "Attention: Attendee is a Speaker!" +msgstr "" +"Achtung: Der Teilnehmer ist ein Speaker!" + #: attendee/templates/attendee/checkin_qrcode.html:15 #, python-format msgid "Ticket for %(name)s" @@ -557,11 +564,11 @@ msgstr "QR-Code zum Checkin vor Ort bei %(current_event)s" msgid "Your check in code:" msgstr "Dein Check-In-Code:" -#: attendee/templates/attendee/checkin_result.html:18 +#: attendee/templates/attendee/checkin_result.html:25 msgid "QR code not working?" msgstr "QR-Code funktioniert nicht?" -#: attendee/templates/attendee/checkin_result.html:24 +#: attendee/templates/attendee/checkin_result.html:31 msgid "Go to manual check in" msgstr "Zum manuellen Checkin" @@ -787,55 +794,55 @@ msgstr "Du bist nicht für die aktuelle Veranstaltung angemeldet." msgid "Account does not match the activation code" msgstr "Benutzerkonto passt nicht zum Aktivierungscode" -#: attendee/views.py:638 +#: attendee/views.py:640 msgid "Attendee has confirmed place for" msgstr "Teilnehmer hat reservierten Platz für" -#: attendee/views.py:645 +#: attendee/views.py:647 msgid "Attendee has no reservations." msgstr "Teilnehmer hat keine Reservierungen." -#: attendee/views.py:652 +#: attendee/views.py:654 #, python-brace-format msgid "{email} has been checked in successfully to {event}!" msgstr "{email} wurde erfolgreich für {event} eingecheckt!" -#: attendee/views.py:703 +#: attendee/views.py:725 msgid "Invalid verification URL" msgstr "Ungültige Verifizierungs-URL" -#: attendee/views.py:704 +#: attendee/views.py:726 msgid "Try again scanning the QR code." msgstr "Den QR-Code nochmal scannen." -#: attendee/views.py:714 +#: attendee/views.py:736 msgid "Attendee not found" msgstr "Teilnehmer nicht gefunden" -#: attendee/views.py:715 +#: attendee/views.py:737 msgid "The attendee is (no longer) registered." msgstr "Der Teilnehmer ist (nicht mehr) registriert." -#: attendee/views.py:723 +#: attendee/views.py:745 msgid "Code is for the wrong event" msgstr "Der Code ist für die falsche Veranstaltung" -#: attendee/views.py:724 +#: attendee/views.py:746 msgid "This checkin code is for another event." msgstr "Der Checkin-Code ist für eine andere Veranstaltung." -#: attendee/views.py:735 +#: attendee/views.py:757 msgid "Already checked in" msgstr "Bereits eingecheckt" -#: attendee/views.py:737 +#: attendee/views.py:759 msgid "Attendee {} has checked in at {}." msgstr "Teilnehmer {} hat bereits um {} eingecheckt." -#: attendee/views.py:748 +#: attendee/views.py:771 msgid "Welcome!" msgstr "Willkommen!" -#: attendee/views.py:750 +#: attendee/views.py:773 msgid "Attendee {} was successfully checked in." msgstr "Teilnehmer {} wurde erfolgreich eingecheckt." diff --git a/devday/attendee/templates/attendee/checkin.html b/devday/attendee/templates/attendee/checkin.html index ee136fb0..3c7fbfe6 100644 --- a/devday/attendee/templates/attendee/checkin.html +++ b/devday/attendee/templates/attendee/checkin.html @@ -1,20 +1,27 @@ {% extends "devday_site.html" %} {% load cms_tags crispy_forms_tags i18n %} {% block content_body %} -
-
- {% static_placeholder "checkin-instructions" %} -
+
+
+ {% static_placeholder "checkin-instructions" %}
-
-
-

{{ checkin_message | safe }}

- {{ checkin_reservations | safe }} +
+
+
+

{{ checkin_message | safe }}

+ {% if is_speaker %} +
+ {% blocktrans trimmed %} + Attention: Attendee is a Speaker! + {% endblocktrans %}
+ {% endif %} + {{ checkin_reservations | safe }}
-
-
- {% crispy form %} -
+
+
+
+ {% crispy form %}
+
{% endblock %} diff --git a/devday/attendee/templates/attendee/checkin_result.html b/devday/attendee/templates/attendee/checkin_result.html index abf37758..f179fd24 100644 --- a/devday/attendee/templates/attendee/checkin_result.html +++ b/devday/attendee/templates/attendee/checkin_result.html @@ -10,6 +10,13 @@

{{ checkin_result }}

{{ checkin_message | safe }}

+ {% if is_speaker %} +
+ {% blocktrans trimmed %} + Attention: Attendee is a Speaker! + {% endblocktrans %} +
+ {% endif %} {{ checkin_reservations | safe }}
@@ -21,7 +28,7 @@

{% trans 'QR code not working?' %}

{% trans 'Go to manual check in' %}

+ href='{% url 'attendee_checkin' event=event.slug %}'>{% trans 'Go to manual check in' %}

{% endblock %} diff --git a/devday/attendee/views.py b/devday/attendee/views.py index 2468f116..6de2c721 100644 --- a/devday/attendee/views.py +++ b/devday/attendee/views.py @@ -589,11 +589,13 @@ def render_to_response(self, context): ( attendee.user.email, attendee.user.date_joined.strftime("%Y-%m-%d %H:%M:%S"), - attendee.user.contact_permission_date.strftime( - "%Y-%m-%d %H:%M:%S" - ) - if attendee.user.contact_permission_date - else "", + ( + attendee.user.contact_permission_date.strftime( + "%Y-%m-%d %H:%M:%S" + ) + if attendee.user.contact_permission_date + else "" + ), ) for attendee in context.get("object_list", []) ] @@ -662,6 +664,8 @@ def form_valid(self, form): attendee.save() context = self.get_form_kwargs() context["form"] = form + event = Event.objects.get(slug=self.kwargs.get("event")) + context["is_speaker"] = is_speaker(attendee, event) context["checkin_message"] = self.get_success_message(form.cleaned_data) context["checkin_reservations"] = get_reservation_list(attendee) return self.render_to_response(context) @@ -669,6 +673,15 @@ def form_valid(self, form): def form_invalid(self, form): context = self.get_form_kwargs() context["form"] = form + if form.has_error("attendee", "checked_in"): + error_data = [ + e.params + for e in form.errors.as_data()["attendee"] + if e.code == "checked_in" + ][0] + attendee = error_data["attendee"] + event = Event.objects.get(slug=self.kwargs.get("event")) + context["is_speaker"] = is_speaker(attendee, event) return self.render_to_response(context) def get_success_message(self, cleaned_data): @@ -688,15 +701,24 @@ def get_context_data(self, **kwargs): return context +def is_speaker(attendee, event): + try: + return attendee.user.speaker.publishedspeaker_set.filter(event=event).exists() + except ObjectDoesNotExist: + return False + + class CheckInAttendeeUrlView(StaffUserMixin, TemplateView): template_name = "attendee/checkin_result.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["event"] = Event.objects.get(slug=self.kwargs.get("event")) - id = self.kwargs["id"] + event = Event.objects.get(slug=self.kwargs.get("event")) + context["event"] = event + + attendee_id = self.kwargs["id"] verification = self.kwargs["verification"] - if not Attendee.objects.is_verification_valid(id, verification): + if not Attendee.objects.is_verification_valid(attendee_id, verification): context.update( { "checkin_code": "invalid", @@ -706,7 +728,7 @@ def get_context_data(self, **kwargs): ) return context try: - attendee = Attendee.objects.get(id=id) + attendee = Attendee.objects.get(id=attendee_id) except ObjectDoesNotExist: context.update( { @@ -738,6 +760,7 @@ def get_context_data(self, **kwargs): ).format( attendee.user, attendee.checked_in.strftime("%H:%M %d.%m.%y") ), + "is_speaker": is_speaker(attendee, event), "checkin_reservations": get_reservation_list(attendee), } ) @@ -750,6 +773,7 @@ def get_context_data(self, **kwargs): "Attendee {} was successfully checked in." ).format(attendee.user), "checkin_reservations": get_reservation_list(attendee), + "is_speaker": is_speaker(attendee, event), } ) return context