コード例 #1
0
class TaskFilterSet(django_filters.FilterSet):
    """Allows tasks to be filtered by whether they're resolved, and by who resolved them."""
    resolved = django_filters.BooleanFilter(label='Show Resolved',
                                            widget=forms.CheckboxInput())
    resolved_by = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserTaskAutocomplete'))
    assigned = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserTaskAutocomplete'))
    deferred = django_filters.BooleanFilter(label='Deferred',
                                            method='filter_deferred',
                                            widget=forms.CheckboxInput())
    date_created = django_filters.DateFromToRangeFilter(
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )

    class Meta:
        model = Task
        fields = ['resolved', 'resolved_by']

    def filter_deferred(self, queryset, name, value):
        """Check if the foia has a tracking number."""
        #pylint: disable=unused-argument
        if value:
            queryset = queryset.get_deferred()
        else:
            queryset = queryset.get_undeferred()
        return queryset
コード例 #2
0
class PortalTaskFilterSet(TaskFilterSet):
    """Allows portal tasks to be filtered by category"""
    # pylint: disable=invalid-name
    category = django_filters.ChoiceFilter(choices=PORTAL_CATEGORIES)
    agency = django_filters.ModelMultipleChoiceFilter(
        name='communication__foia__agency',
        label='Agency',
        queryset=Agency.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('AgencyAutocomplete'))
    communication__foia__portal__type = django_filters.ChoiceFilter(
        choices=PORTAL_TYPES,
        label='Portal Type',
    )
    resolved = django_filters.BooleanFilter(label='Show Resolved',
                                            widget=forms.CheckboxInput())
    resolved_by = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserTaskAutocomplete'))

    class Meta:
        model = PortalTask
        fields = [
            'category',
            'agency',
            'communication__foia__portal__type',
            'resolved',
            'resolved_by',
        ]
コード例 #3
0
class ArticleDateRangeFilterSet(django_filters.FilterSet):
    """Allows a list of news items to be filtered by a date range, an author, or many tags."""
    projects = django_filters.ModelMultipleChoiceFilter(
        name="projects",
        queryset=Project.objects.get_public(),
        widget=autocomplete_light.MultipleChoiceWidget('ProjectAutocomplete'),
    )
    authors = django_filters.ModelMultipleChoiceFilter(
        queryset=(User.objects.annotate(
            article_count=Count('authored_articles')).filter(
                article_count__gt=0)),
        widget=autocomplete_light.MultipleChoiceWidget(
            'UserAuthorAutocomplete'))
    pub_date = django_filters.DateFromToRangeFilter(
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        label='Tags',
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )

    class Meta:
        model = Article
        fields = ['projects', 'authors', 'pub_date']
コード例 #4
0
class AgencyFOIARequestFilterSet(django_filters.FilterSet):
    """Filters for agency users"""
    user = django_filters.ModelMultipleChoiceFilter(
        name='composer__user',
        label='User',
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserAutocomplete'))
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        label='Tags',
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )
    date_range = django_filters.DateFromToRangeFilter(
        name='communications__datetime',
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )

    class Meta:
        model = FOIARequest
        fields = ['user']
コード例 #5
0
ファイル: forms.py プロジェクト: titanous/muckrock
 class Meta:
     model = Project
     fields = [
         'title',
         'summary',
         'image',
         'tags',
         'description',
         'contributors',
         'requests',
         'articles',
     ]
     widgets = {
         'description':
         forms.Textarea(attrs={'class': 'prose-editor'}),
         'contributors':
         autocomplete_light.MultipleChoiceWidget('UserAutocomplete'),
         'requests':
         autocomplete_light.MultipleChoiceWidget('FOIARequestAutocomplete'),
         'articles':
         autocomplete_light.MultipleChoiceWidget('ArticleAutocomplete'),
     }
     help_texts = {
         'title': 'Changing the title will change the URL of your project.',
     }
コード例 #6
0
class MyFOIARequestFilterSet(JurisdictionFilterSet):
    """Allows filtering a request by status, agency, jurisdiction, or tags."""
    status = django_filters.ChoiceFilter(choices=BLANK_STATUS)
    agency = django_filters.ModelMultipleChoiceFilter(
        queryset=Agency.objects.get_approved(),
        widget=autocomplete_light.MultipleChoiceWidget('AgencyAutocomplete'))
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        label='Tags',
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )
    has_embargo = django_filters.BooleanFilter(
        name='embargo',
        widget=forms.Select(choices=NULL_BOOLEAN_CHOICES),
    )
    has_crowdfund = django_filters.BooleanFilter(
        name='crowdfund',
        lookup_expr='isnull',
        exclude=True,
        widget=forms.Select(choices=NULL_BOOLEAN_CHOICES),
    )
    minimum_pages = django_filters.NumberFilter(
        name='communications__files__pages',
        lookup_expr='gte',
        label='Min. Pages',
        distinct=True,
        widget=forms.NumberInput(),
    )
    date_range = django_filters.DateFromToRangeFilter(
        name='communications__datetime',
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )
    file_types = django_filters.CharFilter(
        label='File Types',
        method='filter_file_types',
    )

    def filter_file_types(self, queryset, name, value):
        """Filter requests with certain types of files"""
        #pylint: disable=unused-argument
        file_types = value.split(',')
        query = Q()
        for file_type in file_types:
            query |= Q(
                communications__files__ffile__endswith=file_type.strip())
        return queryset.filter(query)

    class Meta:
        model = FOIARequest
        fields = ['status', 'agency', 'jurisdiction']
コード例 #7
0
class FOIARequestFilterSet(django_filters.FilterSet):
    """Allows filtering a request by status, agency, jurisdiction, user, or tags."""
    status = django_filters.ChoiceFilter(choices=BLANK_STATUS)
    user = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserAutocomplete')
    )
    agency = django_filters.ModelMultipleChoiceFilter(
        queryset=Agency.objects.get_approved(),
        widget=autocomplete_light.MultipleChoiceWidget('AgencyAutocomplete')
    )
    jurisdiction = django_filters.ModelMultipleChoiceFilter(
        queryset=Jurisdiction.objects.filter(hidden=False),
        widget=autocomplete_light.MultipleChoiceWidget('JurisdictionAutocomplete')
    )
    projects = django_filters.ModelMultipleChoiceFilter(
        name="projects",
        queryset=Project.objects.get_public(),
        widget=autocomplete_light.MultipleChoiceWidget('ProjectAutocomplete'),
    )
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )
    has_embargo = django_filters.BooleanFilter(
        name='embargo',
        widget=forms.Select(choices=NULL_BOOLEAN_CHOICES),
    )
    has_crowdfund = django_filters.BooleanFilter(
        name='crowdfund',
        lookup_expr='isnull',
        exclude=True,
        widget=forms.Select(choices=NULL_BOOLEAN_CHOICES),
    )
    minimum_pages = django_filters.NumberFilter(
        name='communications__files__pages',
        lookup_expr='gte',
        label='Min. Pages',
        distinct=True,
        widget=forms.NumberInput(),
    )
    date_range = django_filters.DateFromToRangeFilter(
        name='communications__date',
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )


    class Meta:
        model = FOIARequest
        fields = ['status', 'user', 'agency', 'jurisdiction', 'projects', 'tags']
コード例 #8
0
class ProjectFilterSet(django_filters.FilterSet):
    """Allows a project to be filtered by whether it's featured or by its user."""
    contributors = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserAutocomplete'))
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        label='Tags',
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )

    class Meta:
        model = Project
        fields = ['contributors']
コード例 #9
0
class AddMembersForm(forms.Form):
    """A form that uses autocomplete to suggest users to add to an organization"""
    members = forms.ModelMultipleChoiceField(
        required=True,
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserOrganizationAutocomplete')
    )
コード例 #10
0
class JurisdictionFilterSet(django_filters.FilterSet):
    """Mix in for including state inclusive jurisdiction filter"""
    jurisdiction = django_filters.CharFilter(
        widget=autocomplete_light.MultipleChoiceWidget(
            'JurisdictionStateInclusiveAutocomplete'),
        method='filter_jurisdiction',
        label='Jurisdiction',
    )
    value_format = re.compile(r'\d+-(True|False)')
    jurisdiction_field = 'agency__jurisdiction'

    def filter_jurisdiction(self, queryset, name, value):
        """Filter jurisdction, allowing for state inclusive searches"""
        #pylint: disable=unused-argument
        values = self.request.GET.getlist('jurisdiction')
        query = Q()
        for value in values:
            if not self.value_format.match(value):
                continue
            pk, include_local = value.split('-')
            include_local = include_local == 'True'
            query |= Q(**{'{}__pk'.format(self.jurisdiction_field): pk})
            if include_local:
                query |= Q(
                    **{'{}__parent__pk'.format(self.jurisdiction_field): pk})
        return queryset.filter(query)
コード例 #11
0
ファイル: filters.py プロジェクト: lizconlan/muckrock
class QuestionFilterSet(django_filters.FilterSet):
    """Allows question to be filtered by user, date, or if it's unanswered."""
    user = django_filters.ModelChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.ChoiceWidget('UserAutocomplete')
    )
    date = django_filters.DateFromToRangeFilter(
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )
    unanswered = django_filters.MethodFilter(
        action='unanswered_filter',
        widget=forms.CheckboxInput()
    )
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )

    def unanswered_filter(self, queryset, value):
        """Filter to show either only unanswered questions or all questions"""
        # pylint: disable=no-self-use
        if value:
            return queryset.filter(answers__isnull=True)
        else:
            return queryset

    class Meta:
        model = Question
        fields = ['user', 'date']
コード例 #12
0
ファイル: forms.py プロジェクト: titanous/muckrock
class ProjectManagerForm(forms.Form):
    """Form for managing a list of projects"""
    projects = forms.ModelMultipleChoiceField(
        required=False,
        queryset=Project.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget(
            'ProjectManagerAutocomplete',
            attrs={'placeholder': 'Search for a project'}))
コード例 #13
0
 class Meta:
     # pylint: disable=too-few-public-methods
     model = FOIAMultiRequest
     fields = ['title', 'requested_docs', 'agencies']
     widgets = {
         'title': forms.TextInput(attrs={'placeholder': 'Pick a Title'}),
         'agencies': autocomplete_light.MultipleChoiceWidget('AgencyMultiRequestAutocomplete')
     }
コード例 #14
0
class FlaggedTaskFilterSet(TaskFilterSet):
    """Allows a flagged task to be filtered by a user."""
    user = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserAutocomplete'))

    class Meta:
        model = FlaggedTask
        fields = ['user', 'resolved', 'resolved_by']
コード例 #15
0
ファイル: filters.py プロジェクト: titanous/muckrock
class ProxyFilterSet(django_filters.FilterSet):
    """Allows proxies to be filtered by location."""
    location = django_filters.ModelMultipleChoiceFilter(
        label='State',
        queryset=Jurisdiction.objects.filter(level='s', hidden=False),
        widget=autocomplete_light.MultipleChoiceWidget('StateAutocomplete'))

    class Meta:
        model = Profile
        fields = ['location']
コード例 #16
0
class ProcessingFOIARequestFilterSet(JurisdictionFilterSet):
    """Allows filtering a request by user, agency, jurisdiction, or tags."""
    user = django_filters.ModelMultipleChoiceFilter(
        name='composer__user',
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserAutocomplete'))
    agency = django_filters.ModelMultipleChoiceFilter(
        queryset=Agency.objects.get_approved(),
        widget=autocomplete_light.MultipleChoiceWidget('AgencyAutocomplete'))
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        label='Tags',
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )

    class Meta:
        model = FOIARequest
        fields = ['user', 'agency', 'jurisdiction']
コード例 #17
0
ファイル: filters.py プロジェクト: pjsier/muckrock
class StaleAgencyTaskFilterSet(TaskFilterSet):
    """Allows a stale agency task to be filtered by jurisdiction."""
    jurisdiction = django_filters.ModelMultipleChoiceFilter(
        name='agency__jurisdiction',
        queryset=Jurisdiction.objects.filter(hidden=False),
        widget=autocomplete_light.MultipleChoiceWidget('JurisdictionAutocomplete')
    )
    class Meta:
        model = StaleAgencyTask
        fields = ['jurisdiction', 'resolved', 'resolved_by']
コード例 #18
0
class TaskFilterSet(django_filters.FilterSet):
    """Allows tasks to be filtered by whether they're resolved, and by who resolved them."""
    resolved = django_filters.BooleanFilter(widget=forms.CheckboxInput())
    resolved_by = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserTaskAutocomplete'))

    class Meta:
        model = Task
        fields = ['resolved', 'resolved_by']
コード例 #19
0
ファイル: filters.py プロジェクト: pjsier/muckrock
class FailedFaxTaskFilterSet(TaskFilterSet):
    """Allows a failed fax task to be filtered by the agency."""
    agency = django_filters.ModelMultipleChoiceFilter(
        name='communication__foia__agency',
        queryset=Agency.objects.get_approved(),
        widget=autocomplete_light.MultipleChoiceWidget('AgencyAutocomplete')
    )
    class Meta:
        model = FailedFaxTask
        fields = ['agency', 'resolved', 'resolved_by']
コード例 #20
0
ファイル: forms.py プロジェクト: puppycodes/muckrock
class FOIAAccessForm(forms.Form):
    """Form to add editors or viewers to a request."""
    users = forms.ModelMultipleChoiceField(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget(
            'UserRequestSharingAutocomplete'))
    access_choices = [
        ('edit', 'Can Edit'),
        ('view', 'Can View'),
    ]
    access = forms.ChoiceField(choices=access_choices)
コード例 #21
0
class ProjectManagerForm(forms.Form):
    """Form for managing a list of projects"""
    projects = forms.ModelMultipleChoiceField(
        required=False,
        queryset=Project.objects.none(),
        widget=autocomplete_light.MultipleChoiceWidget(
            'ProjectManagerAutocomplete',
            attrs={'placeholder': 'Search for a project'}))

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(ProjectManagerForm, self).__init__(*args, **kwargs)
        self.fields['projects'].queryset = Project.objects.get_manager(user)
コード例 #22
0
ファイル: filters.py プロジェクト: titanous/muckrock
class ArticleFilterSet(django_filters.FilterSet):
    """Allows filtering a list of news articles by author or tags"""
    projects = django_filters.ModelMultipleChoiceFilter(
        name="projects",
        queryset=Project.objects.get_public(),
        widget=autocomplete_light.MultipleChoiceWidget('ProjectAutocomplete'),
    )
    authors = django_filters.ModelMultipleChoiceFilter(
        queryset=(User.objects.annotate(
            article_count=Count('authored_articles')).filter(
                article_count__gt=0)),
        widget=autocomplete_light.MultipleChoiceWidget(
            'UserAuthorAutocomplete'))
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )

    class Meta:
        model = Article
        fields = ['projects', 'authors', 'projects', 'tags']
コード例 #23
0
class ReviewAgencyTaskFilterSet(JurisdictionFilterSet, TaskFilterSet):
    """Allows a review agency task to be filtered by jurisdiction."""

    jurisdiction_field = 'agency__jurisdiction'

    agency = django_filters.ModelMultipleChoiceFilter(
        name='agency',
        queryset=Agency.objects.exclude(reviewagencytask=None),
        widget=autocomplete_light.MultipleChoiceWidget('AgencyAutocomplete'))

    class Meta:
        model = ReviewAgencyTask
        fields = ['jurisdiction', 'agency', 'resolved', 'resolved_by']
コード例 #24
0
class SnailMailTaskFilterSet(TaskFilterSet):
    """Allows snail mail tasks to be filtered by category, as well as the
    presence of a tracking number or an agency note."""
    category = django_filters.ChoiceFilter(choices=[('', 'All')] +
                                           SNAIL_MAIL_CATEGORIES)
    has_tracking_number = django_filters.ChoiceFilter(
        method='filter_has_tracking_number',
        label='Has tracking number',
        choices=BOOLEAN_CHOICES,
    )
    has_agency_notes = django_filters.ChoiceFilter(
        method='filter_has_agency_notes',
        label='Has agency notes',
        choices=BOOLEAN_CHOICES,
    )
    resolved = django_filters.BooleanFilter(label='Show Resolved',
                                            widget=forms.CheckboxInput())
    resolved_by = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserTaskAutocomplete'))

    def blank_choice(self, queryset, name, value):
        """Check if the value is blank"""
        # pylint: disable=no-self-use
        if value == 'True':
            return queryset.exclude(**{name: ''})
        elif value == 'False':
            return queryset.filter(**{name: ''})
        return queryset

    def filter_has_tracking_number(self, queryset, name, value):
        """Check if the foia has a tracking number."""
        #pylint: disable=unused-argument
        return self.blank_choice(queryset, 'communication__foia__tracking_id',
                                 value)

    def filter_has_agency_notes(self, queryset, name, value):
        """Check if the agency has notes."""
        #pylint: disable=unused-argument
        return self.blank_choice(queryset,
                                 'communication__foia__agency__notes', value)

    class Meta:
        model = SnailMailTask
        fields = [
            'category',
            'has_tracking_number',
            'has_agency_notes',
            'resolved',
            'resolved_by',
        ]
コード例 #25
0
class FOIAAccessForm(forms.Form):
    """Form to add editors or viewers to a request."""
    users = forms.ModelMultipleChoiceField(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget(
            'UserRequestSharingAutocomplete'))
    access_choices = [
        ('edit', 'Can Edit'),
        ('view', 'Can View'),
    ]
    access = forms.ChoiceField(choices=access_choices)

    def __init__(self, *args, **kwargs):
        required = kwargs.pop('required', True)
        super(FOIAAccessForm, self).__init__(*args, **kwargs)
        self.fields['users'].required = required
        self.fields['access'].required = required
コード例 #26
0
class ReviewAgencyTaskFilterSet(JurisdictionFilterSet, TaskFilterSet):
    """Allows a review agency task to be filtered by jurisdiction."""

    COMPLICATED_LIMIT = 10

    jurisdiction_field = 'agency__jurisdiction'

    agency = django_filters.ModelMultipleChoiceFilter(
        name='agency',
        queryset=Agency.objects.exclude(reviewagencytask=None),
        widget=autocomplete_light.MultipleChoiceWidget('AgencyAutocomplete'))

    federal = django_filters.ChoiceFilter(
        method='filter_federal',
        label='Federal Agencies',
        choices=BOOLEAN_CHOICES,
    )

    complicated = django_filters.ChoiceFilter(
        method='filter_complicated',
        label='Complicated Tasks',
        choices=BOOLEAN_CHOICES,
    )

    class Meta:
        model = ReviewAgencyTask
        fields = ['jurisdiction', 'agency', 'resolved', 'resolved_by']

    def filter_federal(self, queryset, name, value):
        """Check if the task is for a federal agency"""
        #pylint: disable=unused-argument
        if value == 'True':
            return queryset.filter(agency__jurisdiction__level='f')
        else:
            return queryset.exclude(agency__jurisdiction__level='f')

    def filter_complicated(self, queryset, name, value):
        """Check if the task is for a federal agency"""
        #pylint: disable=unused-argument
        queryset = queryset.annotate(c=CountWhen(
            agency__foiarequest__status__in=['ack', 'processed', 'appealing']))
        if value == 'True':
            return queryset.filter(c__gte=self.COMPLICATED_LIMIT)
        else:
            return queryset.exclude(c__gte=self.COMPLICATED_LIMIT)
コード例 #27
0
ファイル: filters.py プロジェクト: titanous/muckrock
class ArticleAuthorFilterSet(django_filters.FilterSet):
    """Allows a list of articles by an author to be filtered by a date range or many tags."""
    pub_date = django_filters.DateFromToRangeFilter(
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )
    tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        queryset=Tag.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('TagAutocomplete'),
    )

    class Meta:
        model = Article
        fields = ['pub_date', 'tags']
コード例 #28
0
ファイル: filters.py プロジェクト: pjsier/muckrock
class TaskFilterSet(django_filters.FilterSet):
    """Allows tasks to be filtered by whether they're resolved, and by who resolved them."""
    resolved = django_filters.BooleanFilter(
        label='Show Resolved',
        widget=forms.CheckboxInput())
    resolved_by = django_filters.ModelMultipleChoiceFilter(
        queryset=User.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget('UserTaskAutocomplete')
    )
    date_created = django_filters.DateFromToRangeFilter(
        label='Date Range',
        lookup_expr='contains',
        widget=RangeWidget(attrs={
            'class': 'datepicker',
            'placeholder': 'MM/DD/YYYY',
        }),
    )

    class Meta:
        model = Task
        fields = ['resolved', 'resolved_by']
コード例 #29
0
class ModuloScriviMessaggioConDestinatariVisibili(
        ModuloScriviMessaggioSenzaDestinatari):
    destinatari = forms.ModelMultipleChoiceField(
        Persona.objects.all(),
        widget=autocomplete_light.MultipleChoiceWidget(
            'PersonaAutocompletamento'))
コード例 #30
0
class BaseComposerForm(forms.ModelForm):
    """This form creates and updates FOIA composers"""

    title = forms.CharField(
        widget=forms.TextInput(attrs={
            'placeholder': 'Add a title',
            'class': 'submit-required',
        }),
        max_length=255,
        required=False,
        help_text='i.e., "John Doe Arrest Report" or "2017 Agency Leadership '
        'Calendars". Agencies may see this on emailed requests.',
    )
    requested_docs = forms.CharField(
        widget=forms.Textarea(
            attrs={
                'placeholder':
                'Write a short description of the documents you are '
                'looking for. The more specific you can be, the better.',
                'class':
                'submit-required',
            }),
        required=False,
    )
    agencies = ComposerAgencyField(
        queryset=Agency.objects.get_approved(),
        widget=autocomplete_light.MultipleChoiceWidget(
            'AgencyComposerAutocomplete'),
        required=False,
        help_text='i.e., Police Department, Austin, TX or Office of the '
        'Governor, Arkansas')
    edited_boilerplate = forms.BooleanField(
        required=False,
        label='Edit Template Language',
    )
    embargo = forms.BooleanField(
        required=False,
        help_text='Embargoing a request keeps it completely private from '
        'other users until the embargo date you set. '
        'You may change this whenever you want.')
    permanent_embargo = forms.BooleanField(required=False)
    tags = TaggitField(
        widget=TaggitWidget('TagAutocomplete',
                            attrs={
                                'placeholder': 'Search tags',
                                'data-autocomplete-minimum-characters': 1
                            }),
        help_text='Separate tags with commas.',
        required=False,
    )
    parent = forms.ModelChoiceField(
        queryset=FOIAComposer.objects.none(),
        required=False,
        widget=forms.HiddenInput(),
    )
    action = forms.ChoiceField(
        choices=[
            ('save', 'Save'),
            ('submit', 'Submit'),
            ('delete', 'Delete'),
        ],
        widget=forms.HiddenInput(),
    )

    register_full_name = forms.CharField(
        label='Full Name or Handle (Public)',
        required=False,
    )
    register_email = forms.EmailField(label='Email', required=False)
    register_newsletter = forms.BooleanField(
        initial=True,
        required=False,
        label='Get MuckRock\'s weekly newsletter with '
        'FOIA news, tips, and more',
    )

    login_username = forms.CharField(label='Username', required=False)
    login_password = forms.CharField(label='Password',
                                     widget=forms.PasswordInput(),
                                     required=False)

    class Meta:
        model = FOIAComposer
        fields = [
            'title',
            'agencies',
            'requested_docs',
            'edited_boilerplate',
            'embargo',
            'permanent_embargo',
            'tags',
            'parent',
            'register_full_name',
            'register_email',
            'register_newsletter',
        ]

    def __init__(self, *args, **kwargs):
        if not hasattr(self, '_user'):
            self._user = kwargs.pop('user')
        self.request = kwargs.pop('request')
        super(BaseComposerForm, self).__init__(*args, **kwargs)
        if self._user.is_authenticated:
            del self.fields['register_full_name']
            del self.fields['register_email']
            del self.fields['register_newsletter']
            del self.fields['login_username']
            del self.fields['login_password']
        if not self._user.has_perm('foia.embargo_foiarequest'):
            del self.fields['embargo']
        if not self._user.has_perm('foia.embargo_perm_foiarequest'):
            del self.fields['permanent_embargo']
        self.fields['parent'].queryset = (FOIAComposer.objects.get_viewable(
            self._user).distinct())
        self.fields['agencies'].user = self._user
        self.fields['agencies'].queryset = (
            Agency.objects.get_approved_and_pending(self._user))

    def save(self, commit=True, update_owners=True):
        """Update the composer's user and organization"""
        # pylint: disable=arguments-differ
        if update_owners:
            self.instance.user = self.request.user
            self.instance.organization = self.request.user.profile.organization
        return super(BaseComposerForm, self).save(commit)

    def clean_register_email(self):
        """Do a case insensitive uniqueness check"""
        email = self.cleaned_data['register_email']
        if email and User.objects.filter(email__iexact=email).exists():
            raise forms.ValidationError(
                'User with this email already exists. Please login first.')
        return email

    def clean_title(self):
        """Make sure we have a non-blank(ish) title"""
        title = self.cleaned_data['title'].strip()
        if title:
            return title
        else:
            return 'Untitled'

    def clean_agencies(self):
        """Remove exempt agencies"""
        return [a for a in self.cleaned_data['agencies'] if not a.exempt]

    def clean(self):
        """Check cross field dependencies"""
        cleaned_data = super(BaseComposerForm, self).clean()
        if cleaned_data.get('action') == 'submit':
            for field in ['title', 'requested_docs', 'agencies']:
                if not self.cleaned_data.get(field):
                    self.add_error(
                        field,
                        'This field is required when submitting',
                    )
        if cleaned_data.get('permanent_embargo'):
            cleaned_data['embargo'] = True
        if not self._user.is_authenticated:
            register = (cleaned_data.get('register_full_name')
                        and cleaned_data.get('register_email'))
            login = (cleaned_data.get('login_username')
                     and cleaned_data.get('login_password'))
            if not register and not login:
                raise forms.ValidationError(
                    'You must supply either registration information or '
                    'login information')
            if login:
                try:
                    self._user = mini_login(
                        self.request,
                        cleaned_data.get('login_username'),
                        cleaned_data.get('login_password'),
                    )
                except HTTPError:
                    raise forms.ValidationError(
                        'Please enter a correct username and password')
        return cleaned_data