Пример #1
0
class ReporterSearchForm(forms.Form):
    q = forms.CharField(
        required=False,
        label='',
        widget=SearchInput(attrs={'placeholder': _lazy('Search by keyword')}))
    product = forms.ChoiceField(choices=PROD_CHOICES,
                                label=_lazy('Product:'),
                                initial=FIREFOX.short,
                                required=False)
    version = forms.ChoiceField(required=False,
                                label=_lazy('Version:'),
                                choices=VERSION_CHOICES[FIREFOX])
    sentiment = forms.ChoiceField(required=False,
                                  label=_lazy('Sentiment:'),
                                  choices=SENTIMENT_CHOICES)
    locale = forms.ChoiceField(required=False,
                               label=_lazy('Locale:'),
                               choices=LOCALE_CHOICES)
    platform = forms.ChoiceField(required=False,
                                 label=_lazy('PLATFORM:'),
                                 choices=PLATFORM_CHOICES)
    manufacturer = forms.ChoiceField(required=False,
                                     choices=MANUFACTURER_CHOICES)
    device = forms.ChoiceField(required=False, choices=DEVICE_CHOICES)
    date_start = forms.DateField(
        required=False,
        widget=DateInput(attrs={'class': 'datepicker'}),
        label=_lazy('Date range:'))
    date_end = forms.DateField(
        required=False,
        widget=DateInput(
            # L10n: This indicates the second part of a date range.
            attrs={'class': 'datepicker'}),
        label=_lazy('to'))
    page = forms.IntegerField(widget=forms.HiddenInput, required=False)

    # TODO(davedash): Make this prettier.
    def __init__(self, *args, **kwargs):
        """Pick version choices and initial product based on site ID."""
        super(ReporterSearchForm, self).__init__(*args, **kwargs)
        self.fields['version'].choices = VERSION_CHOICES[FIREFOX]

        # Show Mobile versions if that was picked by the user.
        picked = None
        if self.is_bound:
            try:
                picked = self.fields['product'].clean(self.data.get('product'))
            except forms.ValidationError:
                pass
        if (picked == MOBILE.short or not self.is_bound
                and settings.SITE_ID == settings.MOBILE_SITE_ID):
            # We default to Firefox. Only change if this is the mobile site.
            self.fields['product'].initial = MOBILE.short
            self.fields['version'].choices = VERSION_CHOICES[MOBILE]

    def clean(self):
        cleaned = self.cleaned_data

        # default date_end to today
        if (self.cleaned_data.get('date_start')
                and not self.cleaned_data.get('date_end')):
            self.cleaned_data['date_end'] = date.today()

        # Flip start and end if necessary.
        if (cleaned.get('date_start') and cleaned.get('date_end')
                and cleaned['date_start'] > cleaned['date_end']):
            (cleaned['date_start'],
             cleaned['date_end']) = (cleaned['date_end'],
                                     cleaned['date_start'])

        # Ensure page is a natural number.
        try:
            cleaned['page'] = int(cleaned.get('page'))
            assert cleaned['page'] > 0
        except (TypeError, AssertionError):
            cleaned['page'] = 1

        if not cleaned.get('version'):
            cleaned['version'] = (getattr(FIREFOX, 'default_version', None)
                                  or Version(LATEST_BETAS[FIREFOX]).simplified)
        elif cleaned['version'] == '--':
            cleaned['version'] = ''

        return cleaned

    def full_clean(self):
        """
        Like Django's but we don't delete cleaned_data on error.
        """
        self._errors = ErrorDict()
        if not self.is_bound:  # Stop further processing.
            return
        self.cleaned_data = {}
        # If the form is permitted to be empty, and none of the form data has
        # changed from the initial data, short circuit any validation.
        if self.empty_permitted and not self.has_changed():
            return
        self._clean_fields()
        self._clean_form()
        self._post_clean()
        # Errors are for data-prudes
        for field in self._errors.keys():
            self.cleaned_data[field] = ''
        self._errors = ErrorDict()
Пример #2
0
class ReporterSearchForm(forms.Form):
    q = forms.CharField(required=False, label='', widget=SearchInput(
        attrs={'placeholder': _lazy('Search by keyword')}))
    product = forms.ChoiceField(choices=PROD_CHOICES, label=_lazy('Product:'),
                                initial=FIREFOX.short, required=False)
    version = forms.ChoiceField(required=False, label=_lazy('Version:'),
            choices=VERSION_CHOICES[FIREFOX])
    sentiment = forms.ChoiceField(required=False, label=_lazy('Sentiment:'),
                                  choices=SENTIMENT_CHOICES)
    locale = forms.ChoiceField(required=False, label=_lazy('Locale:'),
                               choices=LOCALE_CHOICES)
    platform = forms.ChoiceField(required=False, label=_lazy('PLATFORM:'),
                           choices=PLATFORM_CHOICES)
    manufacturer = forms.ChoiceField(required=False,
                                     choices=MANUFACTURER_CHOICES)
    device = forms.ChoiceField(required=False, choices=DEVICE_CHOICES)
    date_start = forms.DateField(required=False, widget=DateInput(
        attrs={'class': 'datepicker'}), label=_lazy('Date range:'))
    date_end = forms.DateField(required=False, widget=DateInput(
        # L10n: This indicates the second part of a date range.
        attrs={'class': 'datepicker'}), label=_lazy('to'))
    page = forms.IntegerField(widget=forms.HiddenInput, required=False)

    # TODO(davedash): Make this prettier.
    def __init__(self, *args, **kwargs):
        """Pick version choices and initial product based on site ID."""
        super(ReporterSearchForm, self).__init__(*args, **kwargs)
        self.fields['version'].choices = VERSION_CHOICES[FIREFOX]

        # Show Mobile versions if that was picked by the user.
        picked = None
        if self.is_bound:
            try:
                picked = self.fields['product'].clean(self.data.get('product'))
            except forms.ValidationError:
                pass
        if (picked == MOBILE.short or not self.is_bound and
            settings.SITE_ID == settings.MOBILE_SITE_ID):
            # We default to Firefox. Only change if this is the mobile site.
            self.fields['product'].initial = MOBILE.short
            self.fields['version'].choices = VERSION_CHOICES[MOBILE]

    def clean(self):
        cleaned = self.cleaned_data

        # default date_end to today
        if (self.cleaned_data.get('date_start') and
            not self.cleaned_data.get('date_end')):
            self.cleaned_data['date_end'] = date.today()

        # Flip start and end if necessary.
        if (cleaned.get('date_start') and cleaned.get('date_end') and
            cleaned['date_start'] > cleaned['date_end']):
            (cleaned['date_start'], cleaned['date_end']) = (
                    cleaned['date_end'], cleaned['date_start'])

        # Ensure page is a natural number.
        try:
            cleaned['page'] = int(cleaned.get('page'))
            assert cleaned['page'] > 0
        except (TypeError, AssertionError):
            cleaned['page'] = 1

        if not cleaned.get('version'):
            cleaned['version'] = (getattr(FIREFOX, 'default_version', None) or
                                    Version(LATEST_BETAS[FIREFOX]).simplified)
        elif cleaned['version'] == '--':
            cleaned['version'] = ''

        return cleaned

    def full_clean(self):
        """
        Like Django's but we don't delete cleaned_data on error.
        """
        self._errors = ErrorDict()
        if not self.is_bound: # Stop further processing.
            return
        self.cleaned_data = {}
        # If the form is permitted to be empty, and none of the form data has
        # changed from the initial data, short circuit any validation.
        if self.empty_permitted and not self.has_changed():
            return
        self._clean_fields()
        self._clean_form()
        self._post_clean()
        # Errors are for data-prudes
        for field in self._errors.keys():
            self.cleaned_data[field] = ''
        self._errors = ErrorDict()