Example #1
0
def filter_queryset(params, queryset, all_fields=None, with_active_date=True):
    """Useful in ModelViewSets for filtering querysets based on params received from the client (angular).

    A typical Ocom App List Page (http://ocom.com.au/lookbook/code/list.html) would have
        - Filters: q, searchField, filter (Active / Not Active / All)
        - Pagination: offset, limit
        - Sorting: sort (sort by model), order (asc/desc)

    Sample Usage:
    from ocom.utils.drf_snippets import filter_queryset
    class CompanyRateModelViewSet(OcomModelViewSet):
        def get_queryset(self):
            queryset = CompanyRate.objects.all()
            queryset = filter_queryset(self.request.query_params, queryset)
            return queryset

    Defaults:
    - Filtering will be 'active' by default.
    """

    q = params.get('q', None)
    search_field = params.get('searchField', None)
    queryset_filter = params.get('filter', None)
    # offset = params.get('offset', None)
    # limit = params.get('limit', None)

    if q:
        if search_field:
            if all_fields is not None:
                if search_field not in all_fields:
                    raise ValueError("Cannot find field " + search_field +
                                     " in list of fields")

            search_field = search_field + "__icontains"
            queryset = queryset.filter(**{search_field: q})

        else:  # Search all CharFields
            if all_fields:
                if len(all_fields) == 1:
                    queryset = queryset.filter(id__startswith=q) \
                        if all_fields[0] == 'id' else queryset.filter(id__icontains=q)
                else:
                    q_objects = Q()  # Create an empty Q object to start with

                    for field in all_fields:
                        q_objects |= Q(
                            **{"id__startswith": q}) if field == 'id' else Q(
                                **{field + "__icontains": q})
                        # 'or' the Q objects together

                    queryset = queryset.filter(q_objects)

    if with_active_date or queryset_filter in ('active', 'inactive'):
        queryset = filter_queryset_by_active_status(queryset) if queryset_filter != 'inactive' else \
            filter_queryset_by_inactive_status(queryset)

    return sort_queryset(params, queryset)
Example #2
0
    def get_queryset(self):
        queryset = filter_queryset_by_active_status(self.queryset)
        user = self.get_user(self.request)

        if user is not None:
            # TODO SW: Does this CODE return all users if the user us NOT logged in???

            # If the Request has a User then use that ID so we can't get Other peoples roles.
            # assumes the presence of the param means we want our own Data.
            queryset = queryset.filter(user=user)[:1]
        else:
            queryset = queryset.none()

        return queryset
Example #3
0
 def filter_called_up(self, request, queryset):
     # we select active records only
     return filter_queryset_by_active_status(
         queryset.filter(call_up_date__isnull=False))
Example #4
0
 def filter_active(self, request, queryset):
     ''' Standard "Filter' for FitlerFilter Backend to get Active Items '''
     return filter_queryset_by_active_status(queryset)
Example #5
0
 def filter_active(self, request, queryset):
     return filter_queryset_by_active_status(queryset)
Example #6
0
    def filter_queryset(self, request, queryset, view):
        queryset = filter_queryset_by_active_status(queryset)

        return queryset
Example #7
0
    def queryset(self, request, queryset):
        if self.value() == 'active' or self.value() is None:
            return filter_queryset_by_active_status(queryset)

        if self.value() == 'inactive':
            return filter_queryset_by_inactive_status(queryset)