Esempio n. 1
0
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(),
        }
Esempio n. 2
0
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',
        ]
Esempio n. 3
0
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',
        ]
Esempio n. 4
0
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(),
        }
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 7
0
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