foerderbarometer/input/forms.py

235 lines
7.7 KiB
Python
Raw Normal View History

from django.conf import settings
from django.forms import ModelForm, ChoiceField, RadioSelect, BooleanField
2020-09-29 10:16:10 +00:00
from django.contrib.admin.widgets import AdminDateWidget
2025-08-20 12:28:46 +00:00
from django.forms.renderers import DjangoTemplates
from django.utils.html import format_html
from django.utils.safestring import mark_safe
2020-09-29 10:16:10 +00:00
from .models import (
TYPE_CHOICES,
Project,
ConcreteVolunteer,
ConcreteExtern,
IFG,
Library,
ELiterature,
Software,
HonoraryCertificate,
Travel,
Email,
Literature,
List,
BusinessCard,
)
2020-09-29 07:54:31 +00:00
2020-11-17 15:11:10 +00:00
2025-08-20 12:28:46 +00:00
class TableFormRenderer(DjangoTemplates):
form_template_name = 'django/forms/table.html'
2020-11-17 15:11:10 +00:00
class FdbForm(ModelForm):
'''this base class provides the required css class for all forms'''
required_css_class = 'required'
class ProjectForm(FdbForm):
2020-09-29 10:16:10 +00:00
# start = DateField(widget=AdminDateWidget())
2020-09-29 10:16:10 +00:00
2020-09-29 07:54:31 +00:00
class Meta:
model = Project
exclude = ('pid', 'project_of_year', 'finance_id','granted', 'granted_date', 'realname', 'email',\
2023-02-27 17:09:29 +00:00
'end_mail_send', 'status', 'persons', 'survey_mail_date', 'mail_state')
widgets = {'start': AdminDateWidget(),
'end': AdminDateWidget(),}
2020-10-01 08:51:19 +00:00
class Media:
js = ('dropdown/js/otrs_link.js',)
2020-11-17 15:11:10 +00:00
class ExternForm(FdbForm):
2020-10-01 08:51:19 +00:00
choice = ChoiceField(choices=TYPE_CHOICES.items(), widget=RadioSelect,
2020-10-19 12:46:58 +00:00
label='Was möchtest Du beantragen?')
2020-10-01 08:51:19 +00:00
check = BooleanField(required=True,
2025-06-16 09:43:08 +00:00
label=format_html("Ich stimme den <a href='{}' target='_blank' rel='noopener'>Datenschutzbestimmungen</a> und der<br> <a href='{}' target='_blank' rel='noopener'>Richtlinie zur Förderung der Communitys</a> zu",
settings.DATAPROTECTION, settings.FOERDERRICHTLINIEN))
2020-10-20 11:16:03 +00:00
2020-10-01 08:51:19 +00:00
class Meta:
2021-07-06 11:00:34 +00:00
model = ConcreteExtern
exclude = ('username', 'granted', 'granted_date', 'survey_mail_send', 'service_id', 'survey_mail_date', 'mail_state')
2020-10-01 08:51:19 +00:00
INTERN_CHOICES = {'PRO': 'Projektsteckbrief',
'HON': 'Ehrenamtsbescheinigung, Akkreditierung oder Redaktionsbestätigung',
'TRAV': 'Reisekostenerstattung'}
2020-10-21 07:54:12 +00:00
2020-11-17 15:11:10 +00:00
class InternForm(FdbForm):
choice = ChoiceField(choices = INTERN_CHOICES.items(), widget=RadioSelect,
2020-10-21 07:54:12 +00:00
label = 'Was möchtest Du eingeben?')
class Meta:
model = ConcreteVolunteer
2023-02-27 17:09:29 +00:00
exclude = ('granted', 'granted_date', 'survey_mail_send', 'survey_mail_date', 'mail_state')
2020-10-21 07:54:12 +00:00
HOTEL_CHOICES = {'TRUE': mark_safe('Hotelzimmer benötigt'),
'FALSE': mark_safe('Kein Hotelzimmer benötigt')
}
2020-11-17 15:11:10 +00:00
class TravelForm(FdbForm):
2020-11-03 11:56:40 +00:00
# TODO: add some javascript to show/hide other-field
2025-08-19 12:10:15 +00:00
# this is the code, to change required to false if needed
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['project_name'].required = True
self.fields['transport'].required = True
self.fields['travelcost'].required = True
self.fields['checkin'].required = True
self.fields['checkout'].required = True
self.fields['hotel'].required = True
2020-10-26 10:38:56 +00:00
class Meta:
model = Travel
2023-02-27 17:09:29 +00:00
exclude = ('granted', 'granted_date', 'survey_mail_send', 'realname', 'email', 'survey_mail_date', 'project', 'request_url', 'payed_for_hotel_by', 'payed_for_travel_by', 'intern_notes', 'mail_state' )
2020-11-02 13:04:01 +00:00
widgets = {'checkin': AdminDateWidget(),
'checkout': AdminDateWidget(),}
2023-02-27 17:09:29 +00:00
fields = ['project_name', 'transport', 'travelcost', 'checkin', 'checkout', 'hotel', 'notes']
hotel = ChoiceField(label='Hotelzimmer benötigt:', choices=HOTEL_CHOICES.items(), widget=RadioSelect())
2020-10-21 07:54:12 +00:00
class Media:
js = ('dropdown/js/otrs_link.js',)
css = {
'all': ('css/dateFieldNoNowShortcutInTravels.css',)
}
2020-11-17 15:11:10 +00:00
class LibraryForm(FdbForm):
2020-10-19 11:29:36 +00:00
2020-10-01 08:51:19 +00:00
class Meta:
model = Library
fields = ['cost', 'library', 'duration', 'notes', 'survey_mail_send']
2023-02-27 17:09:29 +00:00
exclude = ['intern_notes', 'survey_mail_send', 'mail_state']
2020-10-01 08:51:19 +00:00
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['library'].label = self._meta.model.LIBRARY_LABEL
self.fields['library'].help_text = self._meta.model.LIBRARY_HELP_TEXT
self.fields['duration'].help_text = self._meta.model.DURATION_HELP_TEXT
class ELiteratureForm(LibraryForm):
class Meta(LibraryForm.Meta):
model = ELiterature
class SoftwareForm(LibraryForm):
class Meta(LibraryForm.Meta):
model = Software
2020-11-18 17:02:23 +00:00
class HonoraryCertificateForm(FdbForm):
2025-08-19 12:10:15 +00:00
2020-11-18 17:02:23 +00:00
class Meta:
model = HonoraryCertificate
fields = ['request_url', 'project']
exclude = ['intern_notes']
class Media:
js = ('dropdown/js/otrs_link.js',)
2025-08-19 12:10:15 +00:00
2020-11-18 17:02:23 +00:00
2020-11-17 15:11:10 +00:00
class IFGForm(FdbForm):
2020-10-01 08:51:19 +00:00
class Meta:
2020-10-01 10:08:02 +00:00
model = IFG
fields = ['cost', 'url', 'notes']
2023-02-27 17:09:29 +00:00
exclude = ['intern_notes', 'survey_mail_send', 'mail_state']
2020-10-21 07:54:12 +00:00
2020-10-27 10:00:58 +00:00
class CheckForm(FdbForm):
termstoaccept = settings.NUTZUNGSBEDINGUNGEN
2025-06-16 09:43:08 +00:00
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Check if the model field 'terms_accepted' is present
if 'terms_accepted' in self.fields:
# Make the field required (HTML5 validation)
self.fields['terms_accepted'].required = True
# Set custom label with link to terms
self.fields['terms_accepted'].label = format_html(
2025-06-16 09:43:08 +00:00
"Ich stimme den <a href='{}'>Nutzungsbedingungen</a> zu",
self.termstoaccept
)
2020-11-18 17:02:23 +00:00
class LiteratureForm(CheckForm):
2025-06-16 09:43:08 +00:00
termstoaccept = settings.NUTZUNGSBEDINGUNGEN_LITERATURSTIPENDIUM
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['selfbuy_give_data'].required = True
class Meta:
model = Literature
fields = ['cost', 'info', 'source', 'notes', 'selfbuy', 'selfbuy_data', 'selfbuy_give_data', 'terms_accepted']
2023-02-27 17:09:29 +00:00
exclude = ['intern_notes', 'survey_mail_send', 'mail_state']
class Media:
2023-02-27 17:09:29 +00:00
js = ('dropdown/js/literature.js',)
ADULT_CHOICES = {'TRUE': mark_safe('Ich bin volljährig.'),
'FALSE': mark_safe('Ich bin noch nicht volljährig.')
}
class EmailForm(CheckForm):
2025-06-16 09:43:08 +00:00
termstoaccept = settings.NUTZUNGSBEDINGUNGEN_EMAIL_SERVICE
2025-08-19 12:10:15 +00:00
2023-02-27 17:09:29 +00:00
# this is the code, to change required to false if needed
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['adult'].required = True
2023-02-27 17:09:29 +00:00
self.fields['other'].required = True
2023-02-27 17:09:29 +00:00
adult = ChoiceField(label='Volljährigkeit', choices=ADULT_CHOICES.items(), widget=RadioSelect())
2020-10-27 10:00:58 +00:00
# TODO: add some javascript to show/hide other-field
class Meta:
model = Email
fields = ['domain', 'address', 'other', 'adult', 'terms_accepted']
2023-02-27 17:09:29 +00:00
exclude = ['intern_notes', 'survey_mail_send', 'mail_state']
class Media:
2023-02-27 17:09:29 +00:00
js = ('dropdown/js/mail.js',)
class BusinessCardForm(CheckForm):
2025-06-16 09:43:08 +00:00
termstoaccept = settings.NUTZUNGSBEDINGUNGEN_VISITENKARTEN
# this is the code, to change required to false if needed
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['url_of_pic'].required = True
2023-02-27 17:09:29 +00:00
self.fields['send_data_to_print'].required = True
2025-06-16 09:43:08 +00:00
class Meta:
model = BusinessCard
2025-08-19 12:10:15 +00:00
exclude = ['intern_notes', 'survey_mail_send', 'mail_state']
fields = ['project', 'data', 'variant', 'url_of_pic', 'send_data_to_print', 'sent_to', 'terms_accepted']
2025-06-16 09:43:08 +00:00
class Media:
2023-02-27 17:09:29 +00:00
js = ('dropdown/js/businessCard.js',)
class ListForm(CheckForm):
2025-06-16 09:43:08 +00:00
termstoaccept = settings.NUTZUNGSBEDINGUNGEN_MAILINGLISTEN
class Meta:
model = List
fields = ['domain', 'address', 'terms_accepted']
2023-02-27 17:09:29 +00:00
exclude = ['intern_notes', 'survey_mail_send','mail_state']