Split ApproachForm, full featured display of transport/journey settings.

This commit is contained in:
2018-02-27 15:59:12 +01:00
parent b97869d690
commit 5d8faa615e
13 changed files with 404 additions and 223 deletions

View File

@@ -1,5 +1,3 @@
- Anzeige Bahnfahrt
- ApproachForm aufteilen
- Save as Draft - Save as Draft
- Copy Event - Copy Event
- Tourenreferent managed Gruppen der Subreferenten - Tourenreferent managed Gruppen der Subreferenten

View File

@@ -14,6 +14,7 @@ TRAINER_NAME_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
PHONE_NUMBER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH PHONE_NUMBER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
LOCATION_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH LOCATION_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
TRANSPORT_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH TRANSPORT_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
DEPARTURE_RIDE_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
MEETING_POINT_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH MEETING_POINT_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
BASECAMP_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH BASECAMP_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
ACCOMMODATION_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH ACCOMMODATION_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
@@ -43,9 +44,10 @@ class FieldInitial(object):
'mode': session_data.get('mode', None), 'mode': session_data.get('mode', None),
'sport': session_data.get('sport', None), 'sport': session_data.get('sport', None),
'level': session_data.get('level', None), 'level': session_data.get('level', None),
'overnight': str(bool(session_data.get('last_day', None))),
'country': session_data.get('country', None), 'country': session_data.get('country', None),
'terrain': session_data.get('terrain', None), 'terrain': session_data.get('terrain', None),
'overnight': str(bool(session_data.get('last_day', None))), 'transport': session_data.get('transport', None),
} }
for tuple in self._tuples: for tuple in self._tuples:
constraint, result = tuple constraint, result = tuple

View File

@@ -49,19 +49,13 @@ FORM_INITIALS = {
'submountains', 'submountains',
), ),
}, },
'ApproachForm': { 'JourneyForm': {
'transport': FieldInitial(
'sport==M,country==DE,terrain==submountains',
'public',
'sport==W,country==DE,terrain==submountains',
'public',
),
'meeting_point': FieldInitial( 'meeting_point': FieldInitial(
'sport==M,country==DE,terrain==submountains', 'transport==public',
'hbf',
'sport==W,country==DE,terrain==submountains',
'hbf', 'hbf',
), ),
},
'AccommodationForm': {
'accommodation': FieldInitial('terrain==alpine', 'hut'), 'accommodation': FieldInitial('terrain==alpine', 'hut'),
'meals': FieldInitial('NONE'), 'meals': FieldInitial('NONE'),
}, },

View File

@@ -217,12 +217,6 @@ class ModeForm(EventCreateForm):
}, },
bootstrap_version=3)) bootstrap_version=3))
@property
def next_form_name(self):
if self.cleaned_data.get('mode') == 'training':
return 'TrainingForm'
return super(ModeForm, self).next_form_name
def clean(self): def clean(self):
cleaned_data = super(ModeForm, self).clean() cleaned_data = super(ModeForm, self).clean()
last_day = cleaned_data.get('last_day', None) last_day = cleaned_data.get('last_day', None)
@@ -234,52 +228,9 @@ class ModeForm(EventCreateForm):
return cleaned_data return cleaned_data
class TrainingForm(EventCreateForm):
_form_title = _(u'Kursinhalte / Kursziele')
_next_form_name = 'LocationForm'
course_topic_1 = forms.CharField(required=True,
label=u'%s - %s 1' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.Textarea(attrs={'rows': 2}))
course_topic_2 = forms.CharField(required=False,
label=u'%s - %s 2' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_3 = forms.CharField(required=False,
label=u'%s - %s 3' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_4 = forms.CharField(required=False,
label=u'%s - %s 4' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_5 = forms.CharField(required=False,
label=u'%s - %s 5' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_6 = forms.CharField(required=False,
label=u'%s - %s 6' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_1 = forms.CharField(required=True,
label=u'%s - %s 1' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.Textarea(attrs={'rows': 2}))
course_goal_2 = forms.CharField(required=False,
label=u'%s - %s 2' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_3 = forms.CharField(required=False,
label=u'%s - %s 3' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_4 = forms.CharField(required=False,
label=u'%s - %s 4' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_5 = forms.CharField(required=False,
label=u'%s - %s 5' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_6 = forms.CharField(required=False,
label=u'%s - %s 6' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
class LocationForm(EventCreateForm): class LocationForm(EventCreateForm):
_form_title = _(u'Ort') _form_title = _(u'Ort')
_next_form_name = 'ApproachForm' _next_form_name = 'JourneyForm'
country = LazyTypedChoiceField(choices=choices.COUNTRY_CHOICES, country = LazyTypedChoiceField(choices=choices.COUNTRY_CHOICES,
label=_(u'Land')) label=_(u'Land'))
@@ -305,6 +256,14 @@ class LocationForm(EventCreateForm):
attrs={'placeholder': _(u'Kann in Ausnahmefällen frei gelassen werden')} attrs={'placeholder': _(u'Kann in Ausnahmefällen frei gelassen werden')}
)) ))
transport = forms.ChoiceField(choices=choices.TRANSPORT_CHOICES,
label=_(u'Verkehrsmittel zur An- und Abreise'),
)
transport_other = forms.CharField(required=False,
max_length=config.TRANSPORT_OTHER_MAX_LENGTH,
label=_(u'Anderes Verkehrsmittel zur An- und Abreise'),
)
def _proceed_session_data(self, session_data): def _proceed_session_data(self, session_data):
super(LocationForm, self)._proceed_session_data(session_data) super(LocationForm, self)._proceed_session_data(session_data)
@@ -325,19 +284,13 @@ class LocationForm(EventCreateForm):
elif sport == 'W': elif sport == 'W':
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Maikammer, Pfalz' self.fields['location'].widget.attrs['placeholder'] = u'z.B. Maikammer, Pfalz'
self.fields['transport_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
class ApproachForm(EventCreateForm):
_form_title = _(u'An- und Abreise / Unterkunft') class JourneyForm(EventCreateForm):
_form_title = _(u'An- und Abreise - Teil 2')
_next_form_name = 'RequirementsForm' _next_form_name = 'RequirementsForm'
transport = forms.ChoiceField(choices=choices.TRANSPORT_CHOICES,
label=_(u'Verkehrsmittel'),
)
transport_other = forms.CharField(required=False,
max_length=config.TRANSPORT_OTHER_MAX_LENGTH,
label=_(u'Anderes Verkehrsmittel'),
)
meeting_point = forms.ChoiceField(choices=choices.MEETING_POINT_CHOICES, meeting_point = forms.ChoiceField(choices=choices.MEETING_POINT_CHOICES,
label=_(u'Treffpunkt'), label=_(u'Treffpunkt'),
) )
@@ -362,6 +315,63 @@ class ApproachForm(EventCreateForm):
}, },
bootstrap_version=3)) bootstrap_version=3))
departure_time = forms.TimeField(required=False,
label=_(u'Uhrzeit Abfahrt'),
help_text=u'%s - %s' % (
_(u'Format: hh:mm'),
_(u'Kann freigelassen werden'),
),
widget=TimeWidget(attrs={'id': 'id_departure_time_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
# usel10n=True,
options={
'format': 'hh:ii',
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
departure_ride = forms.CharField(required=False,
max_length=config.MEETING_POINT_OTHER_MAX_LENGTH,
label=_(u'Bahn- / Bus-Linie / evtl. Haltestelle'),
help_text=u'%s - %s' % (
_(u'Wo sollen die Teilnehmer einsteigen, wenn kein Treffpunkt ausgemacht ist'
u', oder jemand später zusteigen will'),
_(u'Kann freigelassen werden'),),
)
return_departure_time = forms.TimeField(required=False,
label=_(u'Uhrzeit Rückfahrt (Abfahrt am Tourenort)'),
help_text=u'%s - %s' % (
_(u'Format: hh:mm'),
_(u'Kann freigelassen werden'),
),
widget=TimeWidget(attrs={'id': 'id_return_departure_time_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
# usel10n=True,
options={
'format': 'hh:ii',
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
return_arrival_time = forms.TimeField(required=False,
label=_(u'oder: Uhrzeit Rückkunft (Ankunft in Karlsruhe)'),
help_text=u'%s - %s' % (
_(u'Format: hh:mm'),
_(u'Kann freigelassen werden'),
),
widget=TimeWidget(attrs={'id': 'id_return_arrival_time_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
# usel10n=True,
options={
'format': 'hh:ii',
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
arrival_previous_day = forms.BooleanField(required=False, arrival_previous_day = forms.BooleanField(required=False,
label=_(u'Anreise des Kurs-/Tourenleiters am Vortag'), label=_(u'Anreise des Kurs-/Tourenleiters am Vortag'),
help_text=u'%s %s' % ( help_text=u'%s %s' % (
@@ -370,21 +380,41 @@ class ApproachForm(EventCreateForm):
), ),
) )
return_time = forms.TimeField(required=False, @property
label=_(u'Uhrzeit Rückkunft'), def next_form_name(self):
help_text=u'%s - %s' % ( if bool(self._session_data.get('last_day', None)):
_(u'Format: hh:mm'), return 'AccommodationForm'
_(u'Kann freigelassen werden'), return super(JourneyForm, self).next_form_name
),
widget=TimeWidget(attrs={'id': 'id_back_time_widget', def _proceed_session_data(self, session_data):
'placeholder': _(u'Kann freigelassen werden'), super(JourneyForm, self)._proceed_session_data(session_data)
},
# usel10n=True, first_day = session_data.get('first_day', None)
options={ last_day = session_data.get('last_day', None)
'format': 'hh:ii', transport = session_data.get('transport', None)
'pickerPosition': 'bottom-left',
}, self.fields['meeting_point_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
bootstrap_version=3)) self.fields['departure_ride'].widget.attrs['placeholder'] = _(u'z.B. Linie S81 nach Freudenstadt, Gleis 9')
self.fields['meeting_time'].widget.options['startDate'] = first_day.strftime('%Y-%m-%d 00:00:00')
self.fields['meeting_time'].widget.options['endDate'] = first_day.strftime('%Y-%m-%d 23:59:59')
self.fields['departure_time'].widget.options['startDate'] = first_day.strftime('%Y-%m-%d 00:00:00')
self.fields['departure_time'].widget.options['endDate'] = first_day.strftime('%Y-%m-%d 23:59:59')
return_day = last_day or first_day
self.fields['return_departure_time'].widget.options['startDate'] = return_day.strftime('%Y-%m-%d 00:00:00')
self.fields['return_departure_time'].widget.options['endDate'] = return_day.strftime('%Y-%m-%d 23:59:59')
self.fields['return_arrival_time'].widget.options['startDate'] = return_day.strftime('%Y-%m-%d 00:00:00')
self.fields['return_arrival_time'].widget.options['endDate'] = return_day.strftime('%Y-%m-%d 23:59:59')
if transport != 'public':
self.fields['departure_time'].widget = forms.HiddenInput()
self.fields['departure_ride'].widget = forms.HiddenInput()
class AccommodationForm(EventCreateForm):
_form_title = _(u'Unterkunft')
_next_form_name = 'RequirementsForm'
basecamp = forms.CharField(required=False, basecamp = forms.CharField(required=False,
max_length=config.BASECAMP_MAX_LENGTH, max_length=config.BASECAMP_MAX_LENGTH,
@@ -409,34 +439,15 @@ class ApproachForm(EventCreateForm):
) )
def _proceed_session_data(self, session_data): def _proceed_session_data(self, session_data):
super(ApproachForm, self)._proceed_session_data(session_data) super(AccommodationForm, self)._proceed_session_data(session_data)
first_day = session_data.get('first_day', None)
last_day = session_data.get('last_day', None)
self.fields['transport_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
self.fields['meeting_point_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
self.fields['basecamp'].widget.attrs['placeholder'] = _(u'Kann freigelassen werden') self.fields['basecamp'].widget.attrs['placeholder'] = _(u'Kann freigelassen werden')
self.fields['accommodation_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten') self.fields['accommodation_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
self.fields['meals_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten') self.fields['meals_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
self.fields['meeting_time'].widget.options['startDate'] = first_day.strftime('%Y-%m-%d 00:00:00')
self.fields['meeting_time'].widget.options['endDate'] = first_day.strftime('%Y-%m-%d 23:59:59')
return_day = last_day or first_day
self.fields['return_time'].widget.options['startDate'] = return_day.strftime('%Y-%m-%d 00:00:00')
self.fields['return_time'].widget.options['endDate'] = return_day.strftime('%Y-%m-%d 23:59:59')
if not last_day:
self.fields['basecamp'].widget = forms.HiddenInput()
self.fields['accommodation'].widget = forms.HiddenInput()
self.fields['accommodation'].initial = 'NONE'
self.fields['accommodation_other'].widget = forms.HiddenInput()
class RequirementsForm(EventCreateForm): class RequirementsForm(EventCreateForm):
_form_title = _(u'Voraussetzungen / Vorbedingungen') _form_title = _(u'Voraussetzungen / Vorbedingungen')
_next_form_name = 'DescriptionForm' _next_form_name = 'TrainerForm'
requirements = forms.CharField(required=False, requirements = forms.CharField(required=False,
label=_(u'Anforderungen / Voraussetzungen'), label=_(u'Anforderungen / Voraussetzungen'),
@@ -492,53 +503,6 @@ class RequirementsForm(EventCreateForm):
bootstrap_version=3)) bootstrap_version=3))
class DescriptionForm(EventCreateForm):
_form_title = _(u'Titel / Beschreibung')
_next_form_name = 'TrainerForm'
title = forms.CharField(max_length=config.TITLE_MAX_LENGTH,
label=_(u'Name bzw. Titel der Veranstaltung'),
)
description = forms.CharField(label=_(u'Beschreibung'),
widget=forms.Textarea(attrs={'rows': 5}))
def get_initial_for_field(self, field, field_name):
value = super(DescriptionForm, self).get_initial_for_field(field, field_name)
if field_name == 'title' and value is None:
mode = self._session_data.get('mode', None)
sport = self._session_data.get('sport', None)
level = self._session_data.get('level', None)
terrain = self._session_data.get('terrain', None)
last_day = self._session_data.get('last_day', None)
value = u''
if mode == 'training':
if level == 'beginner':
value += u'%s ' % ugettext(u'Grundkurs')
else:
value += u'%s ' % ugettext(u'Aufbaukurs')
if sport == 'B':
value += u'%s' % ugettext(u'Alpin')
elif sport == 'K':
if terrain == 'gym':
value += ugettext(u'Indoorklettern')
elif terrain == 'crag':
value += ugettext(u'Fels')
elif terrain == 'alpine':
value += ugettext(u'Alpinklettern')
value += u': ...'
elif sport == 'W' and not last_day:
value += u'%s ...' % ugettext(u'Tageswanderung')
if app_config.settings.forms_development_init:
if not value:
value = u'%s' % choices.SPORT_CHOICES.get_label(sport)
return value
class TrainerForm(EventCreateForm): class TrainerForm(EventCreateForm):
_form_title = _(u'Tourenleitung') _form_title = _(u'Tourenleitung')
_next_form_name = 'RegistrationForm' _next_form_name = 'RegistrationForm'
@@ -701,7 +665,7 @@ class RegistrationForm(EventCreateForm):
class ChargesForm(EventCreateForm): class ChargesForm(EventCreateForm):
_form_title = _(u'Kosten') _form_title = _(u'Kosten')
_next_form_name = 'SummaryForm' _next_form_name = 'DescriptionForm'
charge_key = forms.CharField(disabled=True, charge_key = forms.CharField(disabled=True,
label=_(u'Kostenschlüssel'), label=_(u'Kostenschlüssel'),
@@ -735,6 +699,12 @@ class ChargesForm(EventCreateForm):
help_text=_(u'Kann freigelassen werden'), help_text=_(u'Kann freigelassen werden'),
) )
@property
def next_form_name(self):
if self._session_data.get('mode') == 'training':
return 'TrainingForm'
return super(ChargesForm, self).next_form_name
def _proceed_session_data(self, session_data): def _proceed_session_data(self, session_data):
super(ChargesForm, self)._proceed_session_data(session_data) super(ChargesForm, self)._proceed_session_data(session_data)
@@ -816,6 +786,96 @@ class ChargesForm(EventCreateForm):
self.fields['additional_costs'].initial = additional_costs_text self.fields['additional_costs'].initial = additional_costs_text
class TrainingForm(EventCreateForm):
_form_title = _(u'Kursinhalte / Kursziele')
_next_form_name = 'DescriptionForm'
course_topic_1 = forms.CharField(required=True,
label=u'%s - %s 1' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.Textarea(attrs={'rows': 2}))
course_topic_2 = forms.CharField(required=False,
label=u'%s - %s 2' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_3 = forms.CharField(required=False,
label=u'%s - %s 3' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_4 = forms.CharField(required=False,
label=u'%s - %s 4' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_5 = forms.CharField(required=False,
label=u'%s - %s 5' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_6 = forms.CharField(required=False,
label=u'%s - %s 6' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_1 = forms.CharField(required=True,
label=u'%s - %s 1' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.Textarea(attrs={'rows': 2}))
course_goal_2 = forms.CharField(required=False,
label=u'%s - %s 2' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_3 = forms.CharField(required=False,
label=u'%s - %s 3' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_4 = forms.CharField(required=False,
label=u'%s - %s 4' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_5 = forms.CharField(required=False,
label=u'%s - %s 5' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_6 = forms.CharField(required=False,
label=u'%s - %s 6' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
class DescriptionForm(EventCreateForm):
_form_title = _(u'Titel / Beschreibung')
_next_form_name = 'SummaryForm'
title = forms.CharField(max_length=config.TITLE_MAX_LENGTH,
label=_(u'Name bzw. Titel der Veranstaltung'),
)
description = forms.CharField(label=_(u'Beschreibung'),
widget=forms.Textarea(attrs={'rows': 5}))
def get_initial_for_field(self, field, field_name):
value = super(DescriptionForm, self).get_initial_for_field(field, field_name)
if field_name == 'title' and value is None:
mode = self._session_data.get('mode', None)
sport = self._session_data.get('sport', None)
level = self._session_data.get('level', None)
terrain = self._session_data.get('terrain', None)
last_day = self._session_data.get('last_day', None)
value = u''
if mode == 'training':
if level == 'beginner':
value += u'%s ' % ugettext(u'Grundkurs')
else:
value += u'%s ' % ugettext(u'Aufbaukurs')
if sport == 'B':
value += u'%s' % ugettext(u'Alpin')
elif sport == 'K':
if terrain == 'gym':
value += ugettext(u'Indoorklettern')
elif terrain == 'crag':
value += ugettext(u'Fels')
elif terrain == 'alpine':
value += ugettext(u'Alpinklettern')
value += u': ...'
elif sport == 'W' and not last_day:
value += u'%s ...' % ugettext(u'Tageswanderung')
if app_config.settings.forms_development_init:
if not value:
value = u'%s' % choices.SPORT_CHOICES.get_label(sport)
return value
class SummaryForm(EventCreateForm): class SummaryForm(EventCreateForm):
_form_title = _(u'Zusammenfassung') _form_title = _(u'Zusammenfassung')

View File

@@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.9 on 2018-02-27 14:08
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dav_events', '0016_event_registration_required'),
]
operations = [
migrations.RenameField(
model_name='event',
old_name='return_time',
new_name='return_arrival_time',
),
migrations.AddField(
model_name='event',
name='departure_time',
field=models.TimeField(blank=True, null=True),
),
migrations.AddField(
model_name='event',
name='return_departure_time',
field=models.TimeField(blank=True, null=True),
),
]

View File

@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.9 on 2018-02-27 14:23
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dav_events', '0017_auto_20180227_1408'),
]
operations = [
migrations.AddField(
model_name='event',
name='departure_ride',
field=models.CharField(blank=True, max_length=250),
),
]

View File

@@ -75,42 +75,35 @@ class Event(models.Model):
alt_last_day = models.DateField(blank=True, alt_last_day = models.DateField(blank=True,
null=True) null=True)
# TrainingForm
course_topic_1 = models.TextField(blank=True)
course_topic_2 = models.TextField(blank=True)
course_topic_3 = models.TextField(blank=True)
course_topic_4 = models.TextField(blank=True)
course_topic_5 = models.TextField(blank=True)
course_topic_6 = models.TextField(blank=True)
course_goal_1 = models.TextField(blank=True)
course_goal_2 = models.TextField(blank=True)
course_goal_3 = models.TextField(blank=True)
course_goal_4 = models.TextField(blank=True)
course_goal_5 = models.TextField(blank=True)
course_goal_6 = models.TextField(blank=True)
# LocationForm # LocationForm
country = CountryField(countries=choices.CountryChoiceSet) country = CountryField(countries=choices.CountryChoiceSet)
terrain = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, terrain = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.TERRAIN_CHOICES) choices=choices.TERRAIN_CHOICES)
location = models.CharField(max_length=config.LOCATION_MAX_LENGTH, location = models.CharField(max_length=config.LOCATION_MAX_LENGTH,
blank=True) blank=True)
# ApproachForm
transport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, transport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.TRANSPORT_CHOICES) choices=choices.TRANSPORT_CHOICES)
transport_other = models.CharField(max_length=config.TRANSPORT_OTHER_MAX_LENGTH, transport_other = models.CharField(max_length=config.TRANSPORT_OTHER_MAX_LENGTH,
blank=True) blank=True)
# JourneyForm
meeting_point = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, meeting_point = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.MEETING_POINT_CHOICES) choices=choices.MEETING_POINT_CHOICES)
meeting_point_other = models.CharField(max_length=config.MEETING_POINT_OTHER_MAX_LENGTH, meeting_point_other = models.CharField(max_length=config.MEETING_POINT_OTHER_MAX_LENGTH,
blank=True) blank=True)
meeting_time = models.TimeField(blank=True, meeting_time = models.TimeField(blank=True,
null=True) null=True)
departure_time = models.TimeField(blank=True,
null=True)
departure_ride = models.CharField(max_length=config.DEPARTURE_RIDE_MAX_LENGTH,
blank=True)
return_departure_time = models.TimeField(blank=True,
null=True)
return_arrival_time = models.TimeField(blank=True,
null=True)
arrival_previous_day = models.BooleanField(default=False) arrival_previous_day = models.BooleanField(default=False)
return_time = models.TimeField(blank=True,
null=True)
# AccommodationForm
basecamp = models.CharField(max_length=config.BASECAMP_MAX_LENGTH, basecamp = models.CharField(max_length=config.BASECAMP_MAX_LENGTH,
blank=True) blank=True)
@@ -163,6 +156,20 @@ class Event(models.Model):
additional_costs = models.CharField(max_length=config.ADDITIONAL_COSTS_MAX_LENGTH, additional_costs = models.CharField(max_length=config.ADDITIONAL_COSTS_MAX_LENGTH,
blank=True) blank=True)
# TrainingForm
course_topic_1 = models.TextField(blank=True)
course_topic_2 = models.TextField(blank=True)
course_topic_3 = models.TextField(blank=True)
course_topic_4 = models.TextField(blank=True)
course_topic_5 = models.TextField(blank=True)
course_topic_6 = models.TextField(blank=True)
course_goal_1 = models.TextField(blank=True)
course_goal_2 = models.TextField(blank=True)
course_goal_3 = models.TextField(blank=True)
course_goal_4 = models.TextField(blank=True)
course_goal_5 = models.TextField(blank=True)
course_goal_6 = models.TextField(blank=True)
# SummaryForm # SummaryForm
planned_publication_date = models.DateField(blank=True, planned_publication_date = models.DateField(blank=True,
null=True) null=True)
@@ -333,7 +340,7 @@ class Event(models.Model):
year_fmt = ' yy' year_fmt = ' yy'
else: else:
weekday_fmt = 'EEEE, ' weekday_fmt = 'EEEE, '
day_fmt = 'd.' day_fmt = 'dd.'
month_fmt = ' MMMM' month_fmt = ' MMMM'
year_fmt = ' yyyy' year_fmt = ' yyyy'
@@ -396,25 +403,17 @@ class Event(models.Model):
'alt_normalized_date': self.get_alt_formated_date(format='normalized'), 'alt_normalized_date': self.get_alt_formated_date(format='normalized'),
'alt_normalized_long_date': self.get_alt_formated_date(format='normalized_long'), 'alt_normalized_long_date': self.get_alt_formated_date(format='normalized_long'),
'alt_normalized_short_date': self.get_alt_formated_date(format='normalized_short'), 'alt_normalized_short_date': self.get_alt_formated_date(format='normalized_short'),
'course_topic_1': self.course_topic_1,
'course_topic_2': self.course_topic_2,
'course_topic_3': self.course_topic_3,
'course_topic_4': self.course_topic_4,
'course_topic_5': self.course_topic_5,
'course_topic_6': self.course_topic_6,
'course_goal_1': self.course_goal_1,
'course_goal_2': self.course_goal_2,
'course_goal_3': self.course_goal_3,
'course_goal_4': self.course_goal_4,
'course_goal_5': self.course_goal_5,
'course_goal_6': self.course_goal_6,
'country': self.country, 'country': self.country,
'location': self.location, 'location': self.location,
'transport': self.transport, 'transport': self.transport,
'transport_other': self.transport_other, 'transport_other': self.transport_other,
'meeting_time': self.meeting_time,
'meeting_point': self.meeting_point, 'meeting_point': self.meeting_point,
'meeting_point_other': self.meeting_point_other, 'meeting_point_other': self.meeting_point_other,
'meeting_time': self.meeting_time,
'departure_time': self.departure_time,
'departure_ride': self.departure_ride,
'return_departure_time': self.return_departure_time,
'return_arrival_time': self.return_arrival_time,
'basecamp': self.basecamp, 'basecamp': self.basecamp,
'accommodation': self.accommodation, 'accommodation': self.accommodation,
'accommodation_other': self.accommodation_other, 'accommodation_other': self.accommodation_other,
@@ -441,6 +440,18 @@ class Event(models.Model):
'registration_howto': self.registration_howto, 'registration_howto': self.registration_howto,
'charge': self.charge, 'charge': self.charge,
'additional_costs': self.additional_costs, 'additional_costs': self.additional_costs,
'course_topic_1': self.course_topic_1,
'course_topic_2': self.course_topic_2,
'course_topic_3': self.course_topic_3,
'course_topic_4': self.course_topic_4,
'course_topic_5': self.course_topic_5,
'course_topic_6': self.course_topic_6,
'course_goal_1': self.course_goal_1,
'course_goal_2': self.course_goal_2,
'course_goal_3': self.course_goal_3,
'course_goal_4': self.course_goal_4,
'course_goal_5': self.course_goal_5,
'course_goal_6': self.course_goal_6,
'planned_publication_date': self.planned_publication_date, 'planned_publication_date': self.planned_publication_date,
'internal_note': self.internal_note, 'internal_note': self.internal_note,
} }

View File

@@ -48,8 +48,10 @@ Veröffentlichung: {% if planned_publication_date %}{{ planned_publication_date|
{% endif %}{% if basecamp %}<strong>{% trans 'Stützpunkt' %}:</strong> {{ basecamp }}<br /> {% endif %}{% if basecamp %}<strong>{% trans 'Stützpunkt' %}:</strong> {{ basecamp }}<br />
{% endif %}{% if accommodation and accommodation != 'NONE' %}<strong>{% trans 'Unterkunft' %}:</strong> {% if accommodation == 'OTHER' %}{{ accommodation_other }}{% else %}{{ event.get_accommodation_display }}{% endif %}<br /> {% endif %}{% if accommodation and accommodation != 'NONE' %}<strong>{% trans 'Unterkunft' %}:</strong> {% if accommodation == 'OTHER' %}{{ accommodation_other }}{% else %}{{ event.get_accommodation_display }}{% endif %}<br />
{% endif %}{% if meals and meals != 'NONE' %}<strong>{% trans 'Verpflegung' %}:</strong> {% if meals == 'OTHER' %}{{ meals_other }}{% else %}{{ event.get_meals_display }}{% endif %}<br /> {% endif %}{% if meals and meals != 'NONE' %}<strong>{% trans 'Verpflegung' %}:</strong> {% if meals == 'OTHER' %}{{ meals_other }}{% else %}{{ event.get_meals_display }}{% endif %}<br />
{% endif %}{% if transport and transport != 'NONE' %}<strong>{% trans 'Anfahrt' %}:</strong> {% if transport == 'OTHER' %}{{ transport_other }}{% else %}{{ event.get_transport_display }}{% endif %}<br /> {% endif %}{% if transport and transport != 'NONE' and transport != 'public' %}<strong>{% trans 'Hin- / Rückfahrt' %}:</strong> {% if transport == 'OTHER' %}{{ transport_other }}{% else %}{{ event.get_transport_display }}{% endif %}<br />
{% endif %}{% if meeting_point and meeting_point != 'NONE' %}<strong>{% trans 'Treffpunkt' %}:</strong> {% if meeting_time %}{{ meeting_time|time:'G:i'|cut:':00' }} Uhr, {% endif %}{% if meeting_point == 'OTHER' %}{{ meeting_point_other }}{% else %}{{ event.get_meeting_point_display }}{% endif %}<br /> {% endif %}{% if meeting_point and meeting_point != 'NONE' %}<strong>{% trans 'Treffpunkt' %}:</strong> {% if meeting_time %}{{ meeting_time|time:'G:i'|cut:':00' }} Uhr, {% endif %}{% if meeting_point == 'OTHER' %}{{ meeting_point_other }}{% else %}{{ event.get_meeting_point_display }}{% endif %}<br />
{% endif %}{% if transport == 'public' %}{% if departure_time or departure_ride %}<strong>{% trans 'Abfahrt' %}:</strong> {% if departure_time %}{{ departure_time|time:'G:i'|cut:':00' }} Uhr{% endif %}{% if departure_time and departure_ride %}, {% endif %}{% if departure_ride %}{{ departure_ride }}{% endif %}<br />
{% endif %}{% endif %}{% if return_departure_time or return_arrival_time %}<strong>{% trans 'Rückfahrt' %}:</strong> {% if return_arrival_time %}{{ return_arrival_time|time:'G:i'|cut:':00' }} Uhr ({% trans 'Ankunft in' %} Karlsruhe){% elif return_departure_time %}{{ return_departure_time|time:'G:i'|cut:':00' }} Uhr ({% trans 'Abfahrt am Tourenort' %}){% endif %}<br />
{% endif %}{% if pre_meeting_1 %}{% if pre_meeting_2 %}<strong>{% trans 'Vortreffen' %} 1:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br /> {% endif %}{% if pre_meeting_1 %}{% if pre_meeting_2 %}<strong>{% trans 'Vortreffen' %} 1:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />
<strong>{% trans 'Vortreffen' %} 2:</strong> {{ pre_meeting_2|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br /> <strong>{% trans 'Vortreffen' %} 2:</strong> {{ pre_meeting_2|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />
{% else %}<strong>{% trans 'Vortreffen' %}:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />{% endif %} {% else %}<strong>{% trans 'Vortreffen' %}:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />{% endif %}

View File

@@ -104,8 +104,8 @@
{% endif %} {% endif %}
<br /> <br />
{% endif %} {% endif %}
{% if transport and transport != 'NONE' %} {% if transport and transport != 'NONE' and transport != 'public' %}
<strong>{% trans 'Anfahrt' %}:</strong> <strong>{% trans 'Hin- / Rückfahrt' %}:</strong>
{% if transport == 'OTHER' %} {% if transport == 'OTHER' %}
{{ transport_other }} {{ transport_other }}
{% else %} {% else %}
@@ -123,6 +123,20 @@
{% endif %} {% endif %}
<br /> <br />
{% endif %} {% endif %}
{% if transport == 'public' %}
{% if departure_time or departure_ride %}
<strong>{% trans 'Abfahrt' %}:</strong>
{% if departure_time %}{{ departure_time|time:'G:i'|cut:':00' }} Uhr{% endif %}{% if departure_time and departure_ride %}, {% endif %}{%if departure_ride %}{{ departure_ride }}{% endif %}
<br />
{% endif %}
{% endif %}
{% if return_departure_time or return_arrival_time %}
<strong>{% trans 'Rückfahrt' %}:</strong>
{% if return_arrival_time %}{{ return_arrival_time|time:'G:i'|cut:':00' }} Uhr ({% trans 'Ankunft in' %} Karlsruhe)
{% elif return_departure_time %}{{ return_departure_time|time:'G:i'|cut:':00' }} Uhr ({% trans 'Abfahrt am Tourenort' %})
{% endif %}
<br />
{% endif %}
{% if pre_meeting_1 %} {% if pre_meeting_1 %}
{% if pre_meeting_2 %} {% if pre_meeting_2 %}
<strong>{% trans 'Vortreffen' %} 1:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br /> <strong>{% trans 'Vortreffen' %} 1:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />

View File

@@ -34,8 +34,10 @@
{% endif %}{% if basecamp %}{% trans 'Stützpunkt' %}: {{ basecamp }} {% endif %}{% if basecamp %}{% trans 'Stützpunkt' %}: {{ basecamp }}
{% endif %}{% if accommodation and accommodation != 'NONE' %}{% trans 'Unterkunft' %}: {% if accommodation == 'OTHER' %}{{ accommodation_other }}{% else %}{{ event.get_accommodation_display }}{% endif %} {% endif %}{% if accommodation and accommodation != 'NONE' %}{% trans 'Unterkunft' %}: {% if accommodation == 'OTHER' %}{{ accommodation_other }}{% else %}{{ event.get_accommodation_display }}{% endif %}
{% endif %}{% if meals and meals != 'NONE' %}{% trans 'Verpflegung' %}: {% if meals == 'OTHER' %}{{ meals_other }}{% else %}{{ event.get_meals_display }}{% endif %} {% endif %}{% if meals and meals != 'NONE' %}{% trans 'Verpflegung' %}: {% if meals == 'OTHER' %}{{ meals_other }}{% else %}{{ event.get_meals_display }}{% endif %}
{% endif %}{% if transport and transport != 'NONE' %}{% trans 'Anfahrt' %}: {% if transport == 'OTHER' %}{{ transport_other }}{% else %}{{ event.get_transport_display }}{% endif %} {% endif %}{% if transport and transport != 'NONE' and transport != 'public' %}{% trans 'Hin- / Rückfahrt' %}: {% if transport == 'OTHER' %}{{ transport_other }}{% else %}{{ event.get_transport_display }}{% endif %}
{% endif %}{% if meeting_point and meeting_point != 'NONE' %}{% trans 'Treffpunkt' %}: {% if meeting_time %}{{ meeting_time|time:'G:i'|cut:':00' }} Uhr, {% endif %}{% if meeting_point == 'OTHER' %}{{ meeting_point_other }}{% else %}{{ event.get_meeting_point_display }}{% endif %} {% endif %}{% if meeting_point and meeting_point != 'NONE' %}{% trans 'Treffpunkt' %}: {% if meeting_time %}{{ meeting_time|time:'G:i'|cut:':00' }} Uhr, {% endif %}{% if meeting_point == 'OTHER' %}{{ meeting_point_other }}{% else %}{{ event.get_meeting_point_display }}{% endif %}
{% endif %}{% if transport == 'public' %}{% if departure_time or departure_ride %}{% trans 'Abfahrt' %}: {% if departure_time %}{{ departure_time|time:'G:i'|cut:':00' }} Uhr{% endif %}{% if departure_time and departure_ride %}, {% endif %}{% if departure_ride %}{{ departure_ride }}{% endif %}
{% endif %}{% endif %}{% if return_departure_time or return_arrival_time %}{% trans 'Rückfahrt' %}: {% if return_arrival_time %}{{ return_arrival_time|time:'G:i'|cut:':00' }} Uhr ({% trans 'Ankunft in' %} Karlsruhe){% elif return_departure_time %}{{ return_departure_time|time:'G:i'|cut:':00' }} Uhr ({% trans 'Abfahrt am Tourenort' %}){% endif %}
{% endif %}{% if pre_meeting_1 %}{% if pre_meeting_2 %}{% trans 'Vortreffen' %} 1: {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %} {% endif %}{% if pre_meeting_1 %}{% if pre_meeting_2 %}{% trans 'Vortreffen' %} 1: {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}
{% trans 'Vortreffen' %} 2: {{ pre_meeting_2|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}{% else %}{% trans 'Vortreffen' %}: {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}{% endif %} {% trans 'Vortreffen' %} 2: {{ pre_meeting_2|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}{% else %}{% trans 'Vortreffen' %}: {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}{% endif %}
{% endif %}{% if min_participants > 0 or max_participants > 0 %}{% trans 'Teilnehmerzahl' %}: {% if min_participants == max_participants %}{{ max_participants }} {% trans 'Teilnehmer' %}{% elif min_participants > 0 and max_participants > 0 %}{{ min_participants }} - {{ max_participants }} {% trans 'Teilnehmer' %}{% elif min_participants > 0 %}min. {{ min_participants }} {% trans 'Teilnehmer' %}{% else %}max. {{ max_participants }} {% trans 'Teilnehmer' %}{% endif %} {% endif %}{% if min_participants > 0 or max_participants > 0 %}{% trans 'Teilnehmerzahl' %}: {% if min_participants == max_participants %}{{ max_participants }} {% trans 'Teilnehmer' %}{% elif min_participants > 0 and max_participants > 0 %}{{ min_participants }} - {{ max_participants }} {% trans 'Teilnehmer' %}{% elif min_participants > 0 %}min. {{ min_participants }} {% trans 'Teilnehmer' %}{% else %}max. {{ max_participants }} {% trans 'Teilnehmer' %}{% endif %}

View File

@@ -0,0 +1,32 @@
{% extends "dav_events/event_create/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block head-additional %}
{% include 'dav_events/event_create/includes/select_other.html' %}
{% endblock head-additional %}
{% block form-fields-visible %}
<div class="row">
<div class="col-sm-12">
{% bootstrap_field form.basecamp %}
</div>
</div>
<div class="row">
<div class="col-sm-6">
{% bootstrap_field form.accommodation %}
</div>
<div class="col-sm-6">
{% bootstrap_field form.accommodation_other %}
</div>
</div>
<div class="row">
<div class="col-sm-6">
{% bootstrap_field form.meals %}
</div>
<div class="col-sm-6">
{% bootstrap_field form.meals_other %}
</div>
</div>
<div class="row">&nbsp;</div>
{% endblock form-fields-visible %}

View File

@@ -7,14 +7,6 @@
{% endblock head-additional %} {% endblock head-additional %}
{% block form-fields-visible %} {% block form-fields-visible %}
<div class="row">
<div class="col-sm-6">
{% bootstrap_field form.transport %}
</div>
<div class="col-sm-6">
{% bootstrap_field form.transport_other %}
</div>
</div>
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
{% bootstrap_field form.meeting_point %} {% bootstrap_field form.meeting_point %}
@@ -28,7 +20,20 @@
{% bootstrap_field form.meeting_time %} {% bootstrap_field form.meeting_time %}
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
{% bootstrap_field form.return_time %} {% bootstrap_field form.departure_time %}
</div>
</div>
<div class="row">
<div class="col-sm-12">
{% bootstrap_field form.departure_ride %}
</div>
</div>
<div class="row">
<div class="col-sm-6">
{% bootstrap_field form.return_departure_time %}
</div>
<div class="col-sm-6">
{% bootstrap_field form.return_arrival_time %}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@@ -36,26 +41,5 @@
{% bootstrap_field form.arrival_previous_day %} {% bootstrap_field form.arrival_previous_day %}
</div> </div>
</div> </div>
<div class="row">
<div class="col-sm-12">
{% bootstrap_field form.basecamp %}
</div>
</div>
<div class="row">
<div class="col-sm-6">
{% bootstrap_field form.accommodation %}
</div>
<div class="col-sm-6">
{% bootstrap_field form.accommodation_other %}
</div>
</div>
<div class="row">
<div class="col-sm-6">
{% bootstrap_field form.meals %}
</div>
<div class="col-sm-6">
{% bootstrap_field form.meals_other %}
</div>
</div>
<div class="row">&nbsp;</div> <div class="row">&nbsp;</div>
{% endblock form-fields-visible %} {% endblock form-fields-visible %}

View File

@@ -0,0 +1,32 @@
{% extends "dav_events/event_create/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block head-additional %}
{% include 'dav_events/event_create/includes/select_other.html' %}
{% endblock head-additional %}
{% block form-fields-visible %}
<div class="row">
<div class="col-sm-12">
{% bootstrap_field form.country %}
{% bootstrap_field form.terrain %}
{% bootstrap_field form.location %}
</div>
</div>
<div class="row">&nbsp;</div>
<div class="row">
<div class="col-sm-12">
<h3>An- und Abreise - Teil 1</h3>
</div>
</div>
<div class="row">
<div class="col-sm-6">
{% bootstrap_field form.transport %}
</div>
<div class="col-sm-6">
{% bootstrap_field form.transport_other %}
</div>
</div>
<div class="row">&nbsp;</div>
{% endblock form-fields-visible %}