4 Commits

Author SHA1 Message Date
66417ac9ff Merge remote-tracking branch 'origin/master'
All checks were successful
Run tests / Execute tox to run the test suite (push) Successful in 4m55s
2025-05-22 14:34:03 +02:00
7dcd5a5d30 added participation conditions link 2024-12-20 16:20:41 +01:00
34eaa24e36 added senior level 2024-12-20 16:15:32 +01:00
7807dad400 added participation acceptance field 2024-12-20 15:36:13 +01:00
6 changed files with 40 additions and 2 deletions

View File

@@ -76,6 +76,7 @@ LEVEL_CHOICES = ChoiceSet([
('beginner', _(u'Anfänger')), ('beginner', _(u'Anfänger')),
('advanced', _(u'Fortgeschrittene')), ('advanced', _(u'Fortgeschrittene')),
('family', _(u'Familien')), ('family', _(u'Familien')),
('senior', _(u'Senioren'))
]) ])
MEALS_CHOICES = ChoiceSet([ MEALS_CHOICES = ChoiceSet([

View File

@@ -56,6 +56,10 @@ class AbstractParticipant(models.Model):
privacy_policy_accepted = models.BooleanField(default=False, privacy_policy_accepted = models.BooleanField(default=False,
verbose_name=_('Einwilligung zur Datenspeicherung')) verbose_name=_('Einwilligung zur Datenspeicherung'))
participation_conditions_accepted = models.BooleanField(default=False,
verbose_name=_('Einwilligung der Teilnahmebedingungen'))
paid = models.BooleanField('Teilnehmerbeitrag bezahlt', default=False) paid = models.BooleanField('Teilnehmerbeitrag bezahlt', default=False)
purge_at = models.DateTimeField() purge_at = models.DateTimeField()

View File

@@ -51,7 +51,7 @@ class RegistrationForm(forms.ModelForm):
' Das finden wir gut,' ' Das finden wir gut,'
' aber bitte melde dich besser mal per E-Mail bei uns.'), ' aber bitte melde dich besser mal per E-Mail bei uns.'),
params={'max_age': max_age}, params={'max_age': max_age},
code='to_old', code='too_old',
) )
return val return val
@@ -79,6 +79,16 @@ class RegistrationForm(forms.ModelForm):
) )
return val return val
def clean_participation_conditions_accepted(self):
val = self.cleaned_data.get('participation_conditions_accepted')
if not val:
raise forms.ValidationError(
ugettext('Um an dieser Veranstaltung teilnehmen zu können,'
' musst du die Teilnahmebedingungen akzeptieren.'),
code='participation_conditions_not_accepted',
)
return val
def clean(self): def clean(self):
super().clean() super().clean()
dav_member = self.cleaned_data.get('dav_member') dav_member = self.cleaned_data.get('dav_member')

View File

@@ -84,6 +84,8 @@ class Registration(models.Model):
verbose_name=_('Einwilligung zur Datenspeicherung')) verbose_name=_('Einwilligung zur Datenspeicherung'))
purge_at = models.DateTimeField(_('Zeitpunkt der Datenlöschung')) purge_at = models.DateTimeField(_('Zeitpunkt der Datenlöschung'))
participation_conditions_accepted = models.BooleanField(default=False, verbose_name=_('Einwilligung der Teilnahmebedingungen'))
answered_obsolete = models.BooleanField(default=False, verbose_name=_('Durch Tourleitung beantwortet')) answered_obsolete = models.BooleanField(default=False, verbose_name=_('Durch Tourleitung beantwortet'))
def approx_age(self): def approx_age(self):

View File

@@ -9,6 +9,7 @@
<button id="btn-filter-All" type="button" class="btn btn-xs btn-green">Alle Touren</button> <button id="btn-filter-All" type="button" class="btn btn-xs btn-green">Alle Touren</button>
<button id="btn-filter-B" type="button" class="btn btn-xs btn-sport-B btn-white">Bergsteigen</button> <button id="btn-filter-B" type="button" class="btn btn-xs btn-sport-B btn-white">Bergsteigen</button>
<button id="btn-filter-family" type="button" class="btn btn-xs btn-level-family btn-white">Familien</button> <button id="btn-filter-family" type="button" class="btn btn-xs btn-level-family btn-white">Familien</button>
<button id="btn-filter-senior" type="button" class="btn btn-xs btn-level-senior btn-white">Senioren</button>
<button id="btn-filter-K" type="button" class="btn btn-xs btn-sport-K btn-white">Klettern</button> <button id="btn-filter-K" type="button" class="btn btn-xs btn-sport-K btn-white">Klettern</button>
<button id="btn-filter-M" type="button" class="btn btn-xs btn-sport-M btn-white">Mountainbike</button> <button id="btn-filter-M" type="button" class="btn btn-xs btn-sport-M btn-white">Mountainbike</button>
<button id="btn-filter-S" type="button" class="btn btn-xs btn-sport-S btn-white">Ski</button> <button id="btn-filter-S" type="button" class="btn btn-xs btn-sport-S btn-white">Ski</button>
@@ -127,7 +128,7 @@
<script type="text/javascript"> <script type="text/javascript">
function filter_table(table, filter) { function filter_table(table, filter) {
const sport_choices = ["B", "K", "M", "S", "W"]; const sport_choices = ["B", "K", "M", "S", "W"];
const level_choices = ["beginner", "advanced", "family"]; const level_choices = ["beginner", "advanced", "family", "senior"];
var choices = sport_choices.concat(level_choices); var choices = sport_choices.concat(level_choices);
var filter_cleaned = []; var filter_cleaned = [];
var filter_expr; var filter_expr;
@@ -200,6 +201,9 @@
$("#btn-filter-family").on("click", function() { $("#btn-filter-family").on("click", function() {
toggle_filter(table, filter, "family"); toggle_filter(table, filter, "family");
} ); } );
$("#btn-filter-senior").on("click", function() {
toggle_filter(table, filter, "senior");
} );
$("#searchfield").on( "keyup change", function() { $("#searchfield").on( "keyup change", function() {
table.column(0).search( this.value ).draw(); table.column(0).search( this.value ).draw();
} ); } );

View File

@@ -182,6 +182,23 @@
Der/die Tourenleiter/in wird dir also persönlich per E-Mail zu- oder absagen. Der/die Tourenleiter/in wird dir also persönlich per E-Mail zu- oder absagen.
</small></p> </small></p>
</div> </div>
{% if form.participation_conditions_accepted.errors %}
<div class="has-error">
{% endif %}
<div class="checkbox">
<label>
<input type="checkbox" name="participation_conditions_accepted" {% if form.participation_conditions_accepted.value %}checked="checked"{% endif %}>
{% trans 'Ich habe den oben erläuterten Teilnahmevorbehalt und die <a href="https://www.alpenverein-karlsruhe.de/programm/teilnahmebedingungen" target="_blank" rel="noreferrer noopener">Teilnahmebedingungen</a> gelesen und akzeptiert.' %}
</label>
</div>
{% if form.participation_conditions_accepted.errors %}
<div class="help-block">
{% for error in form.participation_conditions_accepted.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
</div>
{% endif %}
</div> </div>
</div> </div>
<div class="row">&nbsp;</div> <div class="row">&nbsp;</div>