class AutoUpdateProfileForm(forms.ModelForm): username = forms.CharField(disabled=True, required=False) github = forms.CharField( disabled=True, required=False, help_text='If you want to change your github username, please email ' 'us at <a href="mailto:[email protected]">' '[email protected]</a>.') country = CountryField().formfield( required=False, help_text='Your country of residence.', widget=ListSelect2(), ) languages = forms.ModelMultipleChoiceField( label='Languages', required=False, queryset=Language.objects.all(), widget=ModelSelect2Multiple(url='language-lookup') ) helper = BootstrapHelper(add_cancel_button=False) class Meta: model = Person fields = [ 'personal', 'middle', 'family', 'email', 'gender', 'may_contact', 'publish_profile', 'lesson_publication_consent', 'country', 'airport', 'github', 'twitter', 'url', 'username', 'affiliation', 'domains', 'lessons', 'languages', 'occupation', 'orcid', ] readonly_fields = ( 'username', 'github', ) widgets = { 'gender': forms.RadioSelect(), 'domains': forms.CheckboxSelectMultiple(), 'lessons': forms.CheckboxSelectMultiple(), 'airport': ListSelect2(), }
class PersonFilter(AMYFilterSet): badges = django_filters.ModelMultipleChoiceFilter( queryset=Badge.objects.all(), label='Badges', widget=ModelSelect2Multiple(), ) taught_workshops = django_filters.ModelMultipleChoiceFilter( queryset=Tag.objects.all(), label='Taught at workshops of type', method=filter_taught_workshops, widget=ModelSelect2Multiple(), ) order_by = NamesOrderingFilter(fields=('email', ), ) class Meta: model = Person fields = [ 'badges', 'taught_workshops', ]
class EventFilter(AMYFilterSet): assigned_to = ForeignKeyAllValuesFilter(Person, widget=Select2()) host = ForeignKeyAllValuesFilter(Organization, widget=Select2()) administrator = ForeignKeyAllValuesFilter(Organization, widget=Select2()) STATUS_CHOICES = [ ('', 'All'), ('active', 'Active'), ('past_events', 'Past'), ('ongoing_events', 'Ongoing'), ('upcoming_events', 'Upcoming'), ('unpublished_events', 'Unpublished'), ('published_events', 'Published'), ('uninvoiced_events', 'Uninvoiced'), ('metadata_changed', 'Detected changes in metadata'), ] state = EventStateFilter(choices=STATUS_CHOICES, label='Status', widget=Select2()) invoice_status = django_filters.ChoiceFilter( choices=Event.INVOICED_CHOICES, ) tags = django_filters.ModelMultipleChoiceFilter( queryset=Tag.objects.all(), label='Tags', widget=ModelSelect2Multiple(), ) country = AllCountriesFilter(widget=Select2()) continent = ContinentFilter(widget=Select2(), label="Continent") order_by = django_filters.OrderingFilter(fields=( 'slug', 'start', 'end', ), ) class Meta: model = Event fields = [ 'assigned_to', 'tags', 'host', 'administrator', 'invoice_status', 'completed', 'country', 'continent', ]
class PersonForm(forms.ModelForm): airport = forms.ModelChoiceField(label='Airport', required=False, queryset=Airport.objects.all(), widget=ModelSelect2(url='airport-lookup')) languages = forms.ModelMultipleChoiceField( label='Languages', required=False, queryset=Language.objects.all(), widget=ModelSelect2Multiple(url='language-lookup')) helper = BootstrapHelper(add_cancel_button=False, duplicate_buttons_on_top=True) class Meta: model = Person # don't display the 'password', 'user_permissions', # 'groups' or 'is_superuser' fields # + reorder fields fields = [ 'username', 'personal', 'middle', 'family', 'may_contact', 'publish_profile', 'lesson_publication_consent', 'data_privacy_agreement', 'email', 'gender', 'country', 'airport', 'affiliation', 'github', 'twitter', 'url', 'occupation', 'orcid', 'user_notes', 'lessons', 'domains', 'languages', ] widgets = { 'country': ListSelect2(), }
class ProfileUpdateRequestFormNoCaptcha(forms.ModelForm): languages = forms.ModelMultipleChoiceField( label='Languages you can teach in', required=False, queryset=Language.objects.all(), widget=ModelSelect2Multiple(url='language-lookup')) helper = BootstrapHelper(wider_labels=True, add_cancel_button=False) class Meta: model = ProfileUpdateRequest exclude = ('active', 'created_at', 'last_updated_at') widgets = { 'occupation': RadioSelectWithOther('occupation_other'), 'gender': RadioSelectWithOther('gender_other'), 'domains': CheckboxSelectMultipleWithOthers('domains_other'), 'lessons': CheckboxSelectMultipleWithOthers('lessons_other'), 'country': ListSelect2(), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # set up a layout object for the helper self.helper.layout = self.helper.build_default_layout(self) # set up RadioSelectWithOther widget so that it can display additional # field inline self['occupation'].field.widget.other_field = self['occupation_other'] self['gender'].field.widget.other_field = self['gender_other'] self['domains'].field.widget.other_field = self['domains_other'] self['lessons'].field.widget.other_field = self['lessons_other'] # remove that additional field self.helper.layout.fields.remove('occupation_other') self.helper.layout.fields.remove('gender_other') self.helper.layout.fields.remove('domains_other') self.helper.layout.fields.remove('lessons_other') def clean_twitter(self): """Remove '@'s from the beginning of the Twitter handle.""" twitter_handle = self.cleaned_data['twitter'] return re.sub('^@+', '', twitter_handle)
class WorkshopStaffFilter(AMYFilterSet): country = django_filters.MultipleChoiceFilter( choices=list(Countries()), widget=Select2Multiple(), method="filter_country", ) lessons = django_filters.ModelMultipleChoiceFilter( label='Lessons', queryset=Lesson.objects.all(), widget=ModelSelect2Multiple(attrs=SIDEBAR_DAL_WIDTH), conjoined=True, # `AND` ) badges = django_filters.ModelMultipleChoiceFilter( label='Badges', queryset=Badge.objects.instructor_badges(), widget=ModelSelect2Multiple(attrs=SIDEBAR_DAL_WIDTH), conjoined=False, # `OR` ) languages = django_filters.ModelMultipleChoiceFilter( label='Languages', queryset=Language.objects.all(), widget=ModelSelect2Multiple( url='language-lookup', attrs=SIDEBAR_DAL_WIDTH, ), conjoined=True, # `AND` ) gender = django_filters.ChoiceFilter( label='Gender', choices=Person.GENDER_CHOICES, ) was_helper = django_filters.BooleanFilter( widget=widgets.CheckboxInput, method='filter_helper', ) was_organizer = django_filters.BooleanFilter( widget=widgets.CheckboxInput, method='filter_organizer', ) is_in_progress_trainee = django_filters.BooleanFilter( widget=widgets.CheckboxInput, method='filter_in_progress_trainee', ) def filter_country(self, qs, n, v): if v: return qs.filter( Q(airport__country__in=v) | Q(country__in=v) ) return qs def filter_helper(self, qs, n, v): if v: return qs.filter(num_helper__gte=1) return qs def filter_organizer(self, qs, n, v): if v: return qs.filter(num_organizer__gte=1) return qs def filter_in_progress_trainee(self, qs, n, v): if v: return qs.filter(is_trainee__gte=1) return qs
class WorkshopStaffForm(forms.Form): '''Represent instructor matching form.''' latitude = forms.FloatField(label='Latitude', min_value=-90.0, max_value=90.0, required=False) longitude = forms.FloatField(label='Longitude', min_value=-180.0, max_value=180.0, required=False) airport = forms.ModelChoiceField(label='Airport', required=False, queryset=Airport.objects.all(), widget=ModelSelect2( url='airport-lookup', attrs=SIDEBAR_DAL_WIDTH, )) languages = forms.ModelMultipleChoiceField(label='Languages', required=False, queryset=Language.objects.all(), widget=ModelSelect2Multiple( url='language-lookup', attrs=SIDEBAR_DAL_WIDTH, )) country = forms.MultipleChoiceField( choices=list(Countries()), required=False, widget=Select2Multiple, ) continent = forms.ChoiceField( choices=continent_list, required=False, widget=Select2, ) lessons = forms.ModelMultipleChoiceField( queryset=Lesson.objects.all(), widget=SelectMultiple(), required=False, ) badges = forms.ModelMultipleChoiceField( queryset=Badge.objects.instructor_badges(), widget=CheckboxSelectMultiple(), required=False, ) is_trainer = forms.BooleanField(required=False, label='Has Trainer badge') GENDER_CHOICES = ((None, '---------'), ) + Person.GENDER_CHOICES gender = forms.ChoiceField(choices=GENDER_CHOICES, required=False) was_helper = forms.BooleanField(required=False, label='Was helper at least once before') was_organizer = forms.BooleanField( required=False, label='Was organizer at least once before') is_in_progress_trainee = forms.BooleanField( required=False, label='Is an in-progress instructor trainee') def __init__(self, *args, **kwargs): '''Build form layout dynamically.''' super().__init__(*args, **kwargs) self.helper = FormHelper(self) self.helper.form_method = 'get' self.helper.layout = Layout( Div( Div(HTML('<h5 class="card-title">Location</h5>'), 'airport', HTML('<hr>'), 'country', HTML('<hr>'), 'continent', HTML('<hr>'), 'latitude', 'longitude', css_class='card-body'), css_class='card', ), 'badges', 'is_trainer', HTML('<hr>'), 'was_helper', 'was_organizer', 'is_in_progress_trainee', 'languages', 'gender', 'lessons', Submit('', 'Submit'), ) def clean(self): cleaned_data = super().clean() lat = bool(cleaned_data.get('latitude')) lng = bool(cleaned_data.get('longitude')) airport = bool(cleaned_data.get('airport')) country = bool(cleaned_data.get('country')) latlng = lat and lng # if searching by coordinates, then there must be both lat & lng # present if lat ^ lng: raise forms.ValidationError( 'Must specify both latitude and longitude if searching by ' 'coordinates') # User must search by airport, or country, or coordinates, or none # of them. Sum of boolean elements must be equal 0 (if general search) # or 1 (if searching by airport OR country OR lat/lng). if sum([airport, country, latlng]) not in [0, 1]: raise forms.ValidationError( 'Must specify an airport OR a country, OR use coordinates, OR ' 'none of them.') return cleaned_data