From fe50d9b4651cee3791c3cc8bf0ec5ed657c72122 Mon Sep 17 00:00:00 2001 From: Oliver Zander Date: Tue, 19 Aug 2025 16:08:48 +0200 Subject: [PATCH] replaced format_html with mark_safe where no formatting is applied --- input/forms.py | 9 +++++---- input/models.py | 53 ++++++++++++++++++++++++------------------------- input/views.py | 36 +++++++++++++++------------------ 3 files changed, 47 insertions(+), 51 deletions(-) diff --git a/input/forms.py b/input/forms.py index d73bb10..3a58720 100755 --- a/input/forms.py +++ b/input/forms.py @@ -2,6 +2,7 @@ from django.conf import settings from django.forms import ModelForm, DateField, ChoiceField, RadioSelect, BooleanField from django.contrib.admin.widgets import AdminDateWidget from django.utils.html import format_html +from django.utils.safestring import mark_safe from .models import Project, Volunteer, ConcreteVolunteer, Extern, ConcreteExtern, IFG, Library, TYPE_CHOICES,\ HonoraryCertificate, Travel, Email, Literature, List,\ @@ -56,8 +57,8 @@ class InternForm(FdbForm): exclude = ('granted', 'granted_date', 'survey_mail_send', 'survey_mail_date', 'mail_state') -HOTEL_CHOICES = {'TRUE': format_html('Hotelzimmer benötigt'), - 'FALSE': format_html('Kein Hotelzimmer benötigt') +HOTEL_CHOICES = {'TRUE': mark_safe('Hotelzimmer benötigt'), + 'FALSE': mark_safe('Kein Hotelzimmer benötigt') } @@ -148,8 +149,8 @@ class LiteratureForm(CheckForm): class Media: js = ('dropdown/js/literature.js',) -ADULT_CHOICES = {'TRUE': format_html('Ich bin volljährig.'), - 'FALSE': format_html('Ich bin noch nicht volljährig.') +ADULT_CHOICES = {'TRUE': mark_safe('Ich bin volljährig.'), + 'FALSE': mark_safe('Ich bin noch nicht volljährig.') } diff --git a/input/models.py b/input/models.py index eeb335c..c761cab 100755 --- a/input/models.py +++ b/input/models.py @@ -1,8 +1,7 @@ from datetime import date from django.db import models -from django.utils.html import format_html - +from django.utils.safestring import mark_safe EMAIL_STATES = {'NONE': 'noch keine Mail versendet', 'INF': 'die Benachrichtigung zur Projektabschlussmail wurde versendet', @@ -13,7 +12,7 @@ class Volunteer(models.Model): realname = models.CharField(max_length=200, null=True, verbose_name="Realname", help_text="Bitte gib deinen Vornamen und deinen Nachnamen ein.", default='') email = models.EmailField(max_length=200, null=True, verbose_name='E-Mail-Adresse', - help_text=format_html('Bitte gib deine E-Mail-Adresse ein, damit dich
Wikimedia Deutschland bei Rückfragen oder für
die Zusage kontaktieren kann.')) + help_text=mark_safe('Bitte gib deine E-Mail-Adresse ein, damit dich
Wikimedia Deutschland bei Rückfragen oder für
die Zusage kontaktieren kann.')) # the following Fields are not supposed to be edited by users @@ -40,7 +39,7 @@ class Extern(Volunteer): ''' abstract basis class for all data entered by extern volunteers ''' username = models.CharField(max_length=200, null=True, verbose_name='Benutzer_innenname', - help_text=format_html("Wikimedia Benutzer_innenname")) + help_text=mark_safe("Wikimedia Benutzer_innenname")) # the following Fields are not supposed to be edited by users service_id = models.CharField(max_length=15, null=True, blank=True) @@ -188,8 +187,8 @@ TRANSPORT_CHOICES = {'BAHN': 'Bahn', PAYEDBY_CHOICES = {'WMDE': 'WMDE', 'REQU': 'Antragstellender Mensch'} -HOTEL_CHOICES = {'TRUE': format_html('Hotelzimmer benötigt'), - 'FALSE': format_html('Kein Hotelzimmer benötigt') +HOTEL_CHOICES = {'TRUE': mark_safe('Hotelzimmer benötigt'), + 'FALSE': mark_safe('Kein Hotelzimmer benötigt') } from django.contrib.contenttypes.models import ContentType @@ -244,15 +243,15 @@ class Grant(Extern): abstract = True -TYPE_CHOICES = {'BIB': format_html('Bibliotheksstipendium'), - 'ELIT': format_html('eLiteraturstipendium'), - 'MAIL': format_html('E-Mail-Adresse'), - 'IFG': format_html('Kostenübernahme IFG-Anfrage'), - 'LIT': format_html('Literaturstipendium'), - 'LIST': format_html('Mailingliste'), - 'TRAV': format_html('Reisekosten'), - 'SOFT': format_html('Softwarestipendium'), - 'VIS': format_html('Visitenkarten'), +TYPE_CHOICES = {'BIB': mark_safe('Bibliotheksstipendium'), + 'ELIT': mark_safe('eLiteraturstipendium'), + 'MAIL': mark_safe('E-Mail-Adresse'), + 'IFG': mark_safe('Kostenübernahme IFG-Anfrage'), + 'LIT': mark_safe('Literaturstipendium'), + 'LIST': mark_safe('Mailingliste'), + 'TRAV': mark_safe('Reisekosten'), + 'SOFT': mark_safe('Softwarestipendium'), + 'VIS': mark_safe('Visitenkarten'), } # same model is used for Library, ELitStip and Software! @@ -270,21 +269,21 @@ class Library(Grant): return self.library -SELFBUY_CHOICES = {'TRUE': format_html('Ich möchte das Werk selbst kaufen und per Kostenerstattung bei Wikimedia Deutschland abrechnen.'), - 'FALSE': format_html('Ich möchte, dass Wikimedia Deutschland das Werk für mich kauft'), +SELFBUY_CHOICES = {'TRUE': mark_safe('Ich möchte das Werk selbst kaufen und per Kostenerstattung bei Wikimedia Deutschland abrechnen.'), + 'FALSE': mark_safe('Ich möchte, dass Wikimedia Deutschland das Werk für mich kauft'), } class Literature(Grant): info = models.CharField(max_length=500, verbose_name='Informationen zum Werk', - help_text=format_html("Bitte gib alle Informationen zum benötigten Werk an,
\ + help_text=mark_safe("Bitte gib alle Informationen zum benötigten Werk an,
\ die eine eindeutige Identifizierung ermöglichen (Autor, Titel, Verlag, ISBN, ...)")) source = models.CharField(max_length=200, verbose_name='Bezugsquelle', help_text="Bitte gib an, wo du das Werk kaufen möchtest.") selfbuy = models.CharField( max_length=10, verbose_name='Selbstkauf?', choices=SELFBUY_CHOICES.items(), default='TRUE') - selfbuy_give_data = models.BooleanField(verbose_name=format_html('Datenweitergabe erlauben'), help_text=format_html('Ich stimme der Weitergabe meiner Daten (Name, Postadresse) an den von mir angegebenen Anbieter/Dienstleister zu.')) + selfbuy_give_data = models.BooleanField(verbose_name=mark_safe('Datenweitergabe erlauben'), help_text=mark_safe('Ich stimme der Weitergabe meiner Daten (Name, Postadresse) an den von mir angegebenen Anbieter/Dienstleister zu.')) selfbuy_data = models.TextField(max_length=1000, verbose_name='Persönliche Daten sowie Adresse', default='',\ - help_text=format_html("Bitte gib hier alle persönlichen Daten an, die wir benötigen, um das Werk
\ + help_text=mark_safe("Bitte gib hier alle persönlichen Daten an, die wir benötigen, um das Werk
\ für dich zu kaufen und es dir anschließend zu schicken (z.B. Vorname Nachname, Anschrift,
\ Telefonnummer, E-Mail-Adresse usw.). Trenne die einzelnen Angaben durch Zeilenumbrüche.")) intern_notes = models.TextField(max_length=1000, blank=True, verbose_name="interne Anmerkungen") @@ -315,15 +314,15 @@ MAIL_CHOICES = {'REALNAME': 'Vorname.Nachname', 'USERNAME': 'Username', 'OTHER': 'Sonstiges:'} -ADULT_CHOICES = {'TRUE': format_html('Ich bin volljährig.'), - 'FALSE': format_html('Ich bin noch nicht volljährig.') +ADULT_CHOICES = {'TRUE': mark_safe('Ich bin volljährig.'), + 'FALSE': mark_safe('Ich bin noch nicht volljährig.') } class Email(Domain): address = models.CharField(max_length=50, choices=MAIL_CHOICES.items(), default='USERNAME', verbose_name='Adressbestandteil', - help_text=format_html("Bitte gib hier den gewünschten Adressbestandteil an,
der sich vor der Domain befinden soll.")) + help_text=mark_safe("Bitte gib hier den gewünschten Adressbestandteil an,
der sich vor der Domain befinden soll.")) other = models.CharField(max_length=50,blank=True,null=True, verbose_name="Sonstiges") adult = models.CharField( max_length=10, verbose_name='Volljährigkeit', choices=ADULT_CHOICES.items(), default='FALSE') @@ -332,7 +331,7 @@ class Email(Domain): class List(Domain): address = models.CharField(max_length=50, default='NO_ADDRESS', verbose_name="Adressbestandteil für Projektmailingliste", - help_text=format_html("Bitte gib hier den gewünschten Adressbestandteil an,
der sich vor der Domain befinden soll.")) + help_text=mark_safe("Bitte gib hier den gewünschten Adressbestandteil an,
der sich vor der Domain befinden soll.")) intern_notes = models.TextField(max_length=1000, blank=True, verbose_name="interne Anmerkungen") PROJECT_CHOICE = {'PEDIA': 'Wikipedia', @@ -354,7 +353,7 @@ class BusinessCard(Extern): help_text='Für welches Wikimedia-Projekt möchtest Du Visitenkarten?') data = models.TextField(max_length=1000, verbose_name='Persönliche Daten für die Visitenkarten', default='', - help_text=format_html("Bitte gib hier alle persönlichen Daten an, und zwar genau so,
\ + help_text=mark_safe("Bitte gib hier alle persönlichen Daten an, und zwar genau so,
\ wie sie (auch in der entsprechenden Reihenfolge) auf den Visitenkarten stehen sollen
\ (z.B. Vorname Nachname, Benutzer:/Benutzerin:, Benutzer-/-innenname, Anschrift,
\ Telefonnummer, E-Mail-Adresse usw.). Trenne die einzelnen Angaben durch Zeilenumbrüche.
\ @@ -363,12 +362,12 @@ class BusinessCard(Extern): Adresse, die du ebenfalls beantragen kannst, sofern du nicht bereits eine besitzt.")) variant = models.CharField(max_length=5, choices=BC_VARIANT.items(), default='NOPIC', verbose_name='Variante', - help_text=format_html('so sehen die Varianten aus: \ + help_text=mark_safe('so sehen die Varianten aus: \ mit Bild ohne Bild' )) url_of_pic = models.CharField(max_length=200, verbose_name='Url des Bildes', default='', help_text="Bitte gib die Wikimedia-Commons-URL des Bildes an.") sent_to = models.TextField(max_length=1000, verbose_name='Versandadresse', default='', help_text="Bitte gib den Namen und die vollständige Adresse ein, an welche die Visitenkarten geschickt werden sollen.") - send_data_to_print = models.BooleanField(default=False, verbose_name=format_html('Datenweitergabe erlauben'), help_text=format_html('Hiermit erlaube ich die Weitergabe meiner Daten (Name, Postadresse) an den von Wikimedia
Deutschland ausgewählten Dienstleister (z. B. wir-machen-druck.de) zum Zwecke des direkten
Versands der Druckerzeugnisse an mich.')) + send_data_to_print = models.BooleanField(default=False, verbose_name=mark_safe('Datenweitergabe erlauben'), help_text=mark_safe('Hiermit erlaube ich die Weitergabe meiner Daten (Name, Postadresse) an den von Wikimedia
Deutschland ausgewählten Dienstleister (z. B. wir-machen-druck.de) zum Zwecke des direkten
Versands der Druckerzeugnisse an mich.')) intern_notes = models.TextField(max_length=1000, blank=True, verbose_name="interne Anmerkungen") diff --git a/input/views.py b/input/views.py index 2be7384..213ecb5 100755 --- a/input/views.py +++ b/input/views.py @@ -2,18 +2,14 @@ from datetime import date from smtplib import SMTPException from django.shortcuts import render -from django.forms import modelformset_factory from django.http import HttpResponse +from django.utils.safestring import mark_safe from formtools.wizard.views import CookieWizardView -from django.core.mail import send_mail, BadHeaderError, EmailMultiAlternatives -from django.conf import settings +from django.core.mail import BadHeaderError, EmailMultiAlternatives from django.template.loader import get_template -from django.template import Context from django.conf import settings from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin -from django.utils.html import format_html -from django.utils.translation import gettext as _ from .forms import ProjectForm, ExternForm, LibraryForm, IFGForm, LiteratureForm,\ HonoraryCertificateForm, InternForm, TravelForm, EmailForm,\ @@ -102,7 +98,7 @@ class InternView(LoginRequiredMixin, CookieWizardView): # pragma: no cover self.choice = choice else: form = super().get_form(step, data, files) - form.fields['realname'].help_text = format_html("Vor- und Zuname (Realname), Wer hat das Projekt beantragt?
\ + form.fields['realname'].help_text = mark_safe("Vor- und Zuname (Realname), Wer hat das Projekt beantragt?
\ Wer ist Hauptansprechperson? Bei WMDE-MAs immer „(WMDE)“,
\ bei externen Partnern „(PART)“ hinzufügen.") return form @@ -144,18 +140,18 @@ class InternView(LoginRequiredMixin, CookieWizardView): # pragma: no cover # these where used as labels in the second form TYPE_CHOICES is used for the first form and the # text above the second form. only used for BIB, SOFT, ELIT in the moment -LABEL_CHOICES = {'BIB': format_html('Bibliothek'), - 'ELIT': format_html('Datenbank/Online-Ressource'), - 'MAIL': format_html('E-Mail-Adresse'), - 'IFG': format_html('Kostenübernahme IFG-Anfrage'), - 'LIT': format_html('Literaturstipendium'), - 'LIST': format_html('Mailingliste'), - 'TRAV': format_html('Reisekosten'), - 'SOFT': format_html('Software'), - 'VIS': format_html('Visitenkarten'), +LABEL_CHOICES = {'BIB': mark_safe('Bibliothek'), + 'ELIT': mark_safe('Datenbank/Online-Ressource'), + 'MAIL': mark_safe('E-Mail-Adresse'), + 'IFG': mark_safe('Kostenübernahme IFG-Anfrage'), + 'LIT': mark_safe('Literaturstipendium'), + 'LIST': mark_safe('Mailingliste'), + 'TRAV': mark_safe('Reisekosten'), + 'SOFT': mark_safe('Software'), + 'VIS': mark_safe('Visitenkarten'), } -HELP_CHOICES = {'BIB': format_html("In welchem Zeitraum möchtest du recherchieren oder
wie lange ist der Bibliotheksausweis gültig?"), +HELP_CHOICES = {'BIB': mark_safe("In welchem Zeitraum möchtest du recherchieren oder
wie lange ist der Bibliotheksausweis gültig?"), 'ELIT': "Wie lange gilt der Zugang?", 'SOFT': "Wie lange gilt die Lizenz?", } @@ -180,7 +176,7 @@ class ExternView(CookieWizardView): print(f'choice detection in ExternView: {TYPE_CHOICES[choice]}') if choice == 'IFG': form = IFGForm(data) - form.fields['notes'].help_text = format_html("Bitte gib an, wie die gewonnenen Informationen den
Wikimedia-Projekten zugute kommen sollen.") + form.fields['notes'].help_text = mark_safe("Bitte gib an, wie die gewonnenen Informationen den
Wikimedia-Projekten zugute kommen sollen.") elif choice in ('BIB', 'SOFT', 'ELIT'): form = LibraryForm(data) form.fields['library'].label = LABEL_CHOICES[choice] @@ -188,7 +184,7 @@ class ExternView(CookieWizardView): form.fields['duration'].help_text = HELP_CHOICES[choice] elif choice == 'MAIL': form = EmailForm(data) - form.fields['domain'].help_text = format_html("Mit welcher Domain, bzw. für welches Wikimedia-Projekt,
möchtest du eine Mailadresse beantragen?") + form.fields['domain'].help_text = mark_safe("Mit welcher Domain, bzw. für welches Wikimedia-Projekt,
möchtest du eine Mailadresse beantragen?") elif choice == 'LIT': form = LiteratureForm(data) form.fields['notes'].help_text = "Bitte gib an, wofür du die Literatur verwenden möchtest." @@ -196,7 +192,7 @@ class ExternView(CookieWizardView): form = BusinessCardForm(data) elif choice == 'LIST': form = ListForm(data) - form.fields['domain'].help_text = format_html("Mit welcher Domain, bzw. für welches Wikimedia-Projekt,
möchtest du eine Mailingliste beantragen?") + form.fields['domain'].help_text = mark_safe("Mit welcher Domain, bzw. für welches Wikimedia-Projekt,
möchtest du eine Mailingliste beantragen?") elif choice == 'TRAV': form = TravelForm(data) else: # pragma: no cover