Пример #1
0
    def get_queryset(self):

        form = self.form = ExamSearchForm(self.request.GET)
        form.is_valid()

        exams = Exam.objects.all()

        search_term = form.cleaned_data.get('query')
        if search_term:
            exams = exams.filter(Q(name__icontains=search_term) | Q(metadata__icontains=search_term)).distinct()

        author_term = form.cleaned_data.get('author')
        if author_term:
            authors = find_users(author_term)
            exams = exams.filter(author__in=authors).distinct()

        usage = form.cleaned_data.get('usage')
        usage_filters = {
            "any": Q(),
            "reuse": Q(licence__can_reuse=True),
            "modify": Q(licence__can_reuse=True, licence__can_modify=True),
            "sell": Q(licence__can_reuse=True, licence__can_sell=True),
            "modify-sell": Q(licence__can_reuse=True, licence__can_modify=True, licence__can_sell=True),
        }
        if usage in usage_filters:
            exams = exams.filter(usage_filters[usage])

        only_ready_to_use = form.cleaned_data.get('only_ready_to_use')
        if only_ready_to_use:
            exams = exams.filter(current_stamp__status='ok')

        exams = [e for e in exams if e.can_be_viewed_by(self.request.user)]

        return exams
Пример #2
0
    def get_queryset(self):
        form = self.form = QuestionSearchForm(self.request.GET)
        form.is_valid()

        questions = Question.objects.viewable_by(self.request.user)

        search_term = form.cleaned_data.get("query")
        if search_term:
            questions = questions.filter(
                Q(name__icontains=search_term)
                | Q(metadata__icontains=search_term)
                | Q(tags__name__istartswith=search_term)
            ).distinct()

        author = form.cleaned_data.get("author")
        if author:
            questions = questions.filter(author__in=find_users(author))

        tags = form.cleaned_data.get("tags")
        if len(tags):
            for tag in tags:
                questions = questions.filter(tags__name__in=[tag])

        exclude_tags = form.cleaned_data.get("exclude_tags")
        questions = questions.exclude(tags__name__in=exclude_tags)

        usage = form.cleaned_data.get("usage")
        usage_filters = {
            "any": Q(),
            "reuse": Q(licence__can_reuse=True),
            "modify": Q(licence__can_reuse=True, licence__can_modify=True),
            "sell": Q(licence__can_reuse=True, licence__can_sell=True),
            "modify-sell": Q(licence__can_reuse=True, licence__can_modify=True, licence__can_sell=True),
        }
        if usage in usage_filters:
            questions = questions.filter(usage_filters[usage])

        filter_copies = form.cleaned_data.get("filter_copies")
        if filter_copies:
            questions = questions.filter(copy_of=None)

        only_ready_to_use = form.cleaned_data.get("only_ready_to_use")
        if only_ready_to_use:
            questions = questions.filter(current_stamp__status="ok")

        questions = questions.distinct()

        return questions
Пример #3
0
    def get_queryset(self):

        form = self.form = ExamSearchForm(self.request.GET)
        form.is_valid()

        exams = Exam.objects.all()

        search_term = form.cleaned_data.get('query')
        if search_term:
            exams = exams.filter(
                Q(name__icontains=search_term)
                | Q(metadata__icontains=search_term)).distinct()

        author_term = form.cleaned_data.get('author')
        if author_term:
            authors = find_users(author_term)
            exams = exams.filter(author__in=authors).distinct()

        usage = form.cleaned_data.get('usage')
        usage_filters = {
            "any":
            Q(),
            "reuse":
            Q(licence__can_reuse=True),
            "modify":
            Q(licence__can_reuse=True, licence__can_modify=True),
            "sell":
            Q(licence__can_reuse=True, licence__can_sell=True),
            "modify-sell":
            Q(licence__can_reuse=True,
              licence__can_modify=True,
              licence__can_sell=True),
        }
        if usage in usage_filters:
            exams = exams.filter(usage_filters[usage])

        only_ready_to_use = form.cleaned_data.get('only_ready_to_use')
        if only_ready_to_use:
            exams = exams.filter(current_stamp__status='ok')

        exams = [e for e in exams if e.can_be_viewed_by(self.request.user)]

        return exams
Пример #4
0
    def get_queryset(self):
        form = self.form = QuestionSearchForm(self.request.GET)
        form.is_valid()

        questions = Question.objects.viewable_by(self.request.user)

        search_term = form.cleaned_data.get('query')
        if search_term:
            questions = questions.filter(Q(name__icontains=search_term) | Q(metadata__icontains=search_term) | Q(tags__name__istartswith=search_term)).distinct()

        author = form.cleaned_data.get('author')
        if author:
            questions = questions.filter(author__in=find_users(author))

        tags = form.cleaned_data.get('tags')
        if len(tags):
            for tag in tags:
                questions = questions.filter(tags__name__in=[tag])

        usage = form.cleaned_data.get('usage')
        usage_filters = {
            "any": Q(),
            "reuse": Q(licence__can_reuse=True),
            "modify": Q(licence__can_reuse=True, licence__can_modify=True),
            "sell": Q(licence__can_reuse=True, licence__can_sell=True),
            "modify-sell": Q(licence__can_reuse=True, licence__can_modify=True, licence__can_sell=True),
        }
        if usage in usage_filters:
            questions = questions.filter(usage_filters[usage])

        filter_copies = form.cleaned_data.get('filter_copies')
        if filter_copies:
            questions = questions.filter(copy_of=None)

        only_ready_to_use = form.cleaned_data.get('only_ready_to_use')
        if only_ready_to_use:
            questions = questions.filter(current_stamp__status='ok')

        questions = questions.distinct()

        return questions
Пример #5
0
    def get_queryset(self):

        data = deepcopy(self.request.GET)
        form = self.form = editor.forms.EditorItemSearchForm(data)
        for field in ('usage', 'item_types', 'order_by', 'tags'):
            form.data.setdefault(field, form.fields[field].initial)
        form.is_valid()

        items = self.get_viewable_items()

        # filter based on tags
        tags = self.tags = form.cleaned_data.get('tags')
        if tags:
            for tag in tags:
                items = items.filter(tags__name__icontains=tag)

        exclude_tags = self.exclude_tags = form.cleaned_data.get(
            'exclude_tags')
        self.filter_exclude_tags = Q()
        if exclude_tags:
            for tag in exclude_tags:
                self.filter_exclude_tags = self.filter_exclude_tags & Q(
                    tags__name__icontains=tag)
            items = items.exclude(self.filter_exclude_tags)

        # filter based on query
        query = self.query = form.cleaned_data.get('query')
        self.filter_query = Q()
        if query:
            words = [w for w in re.split(r'\s+', query) if w != '']
            for word in words:
                self.filter_query = self.filter_query & (
                    Q(name__icontains=word) | Q(metadata__icontains=word))
            items = items.filter(self.filter_query)

        # filter based on item type
        item_types = self.item_types = form.cleaned_data.get('item_types', [])
        if 'exams' in item_types:
            if 'questions' not in item_types:
                items = items.filter(filter_exam)
        elif 'questions' in item_types:
            items = items.filter(filter_question)

        # filter based on author
        author_term = form.cleaned_data.get('author')
        if author_term:
            authors = find_users(author_term)
            self.filter_authors = Q(author__in=authors)
            items = items.filter(self.filter_authors)
        else:
            self.filter_authors = Q()

        # filter based on usage
        usage = form.cleaned_data.get('usage')
        usage_filters = {
            "any":
            Q(),
            "reuse":
            Q(licence__can_reuse=True),
            "modify":
            Q(licence__can_reuse=True, licence__can_modify=True),
            "sell":
            Q(licence__can_reuse=True, licence__can_sell=True),
            "modify-sell":
            Q(licence__can_reuse=True,
              licence__can_modify=True,
              licence__can_sell=True),
        }
        if usage in usage_filters:
            self.filter_usage = usage_filters[usage]
            items = items.filter(self.filter_usage)
        else:
            self.filter_usage = Q()

        # filter based on ability level
        ability_levels = form.cleaned_data.get('ability_levels')
        if ability_levels.exists():
            d = ability_levels.aggregate(Min('start'), Max('end'))
            start = d['start__min']
            end = d['end__max']
            self.filter_ability_level = Q(ability_level_start__lt=end,
                                          ability_level_end__gt=start)
            items = items.filter(self.filter_ability_level)
        else:
            self.filter_ability_level = Q()

        # filter based on status
        status = form.cleaned_data.get('status')
        if status == 'draft':
            self.filter_status = Q(current_stamp=None)
            items = items.filter(self.filter_status)
        elif status and status != 'any':
            self.filter_status = Q(current_stamp__status=status)
            items = items.filter(self.filter_status)
        else:
            self.filter_status = Q()

        # filter based on taxonomy nodes
        taxonomy_nodes = form.cleaned_data.get('taxonomy_nodes')
        if taxonomy_nodes.exists():
            self.filter_taxonomy_node = Q(taxonomy_nodes__in=taxonomy_nodes)
            items = items.filter(self.filter_taxonomy_node).annotate(
                num_nodes=Count('taxonomy_nodes')).filter(
                    num_nodes=taxonomy_nodes.count())
        else:
            self.filter_taxonomy_node = Q()

        items = items.distinct()

        return items
Пример #6
0
    def get_queryset(self):

        data = deepcopy(self.request.GET)
        form = self.form = editor.forms.EditorItemSearchForm(data)
        for field in ('usage','item_types','order_by','tags'):
            form.data.setdefault(field,form.fields[field].initial)
        form.is_valid()

        items = self.get_viewable_items()

        # filter based on tags
        tags = self.tags = form.cleaned_data.get('tags')
        self.filter_tags = Q()
        if tags:
            for tag in tags:
                self.filter_tags = self.filter_tags & Q( tags__name__icontains=tag )
            items = items.filter(self.filter_tags)

        # filter based on query
        query = self.query = form.cleaned_data.get('query')
        self.filter_query = Q()
        if query:
            words = [w for w in re.split(r'\s+',query) if w!='']
            for word in words:
                self.filter_query = self.filter_query & (Q(name__icontains=word) | Q(metadata__icontains=word) )
            items = items.filter(self.filter_query)

        # filter based on item type
        item_types = self.item_types = form.cleaned_data.get('item_types',[])
        print(item_types)
        if 'exams' in item_types:
            if 'questions' not in item_types:
                items = items.filter(filter_exam)
        elif 'questions' in item_types:
            items = items.filter(filter_question)

        # filter based on author
        author_term = form.cleaned_data.get('author')
        if author_term:
            authors = find_users(author_term)
            self.filter_authors = Q(author__in=authors)
            items = items.filter(self.filter_authors)
        else:
            self.filter_authors = Q()

        # filter based on subject
        subjects = form.cleaned_data.get('subjects')
        if subjects and len(subjects):
            self.filter_subjects = Q(subjects__in=subjects)
            items = items.filter(self.filter_subjects)
        else:
            self.filter_subjects = Q()

        # filter based on topic
        topics = form.cleaned_data.get('topics')
        if topics and len(topics):
            self.filter_topics = Q(topics__in=topics)
            items = items.filter(self.filter_topics)
        else:
            self.filter_topics = Q()

        # filter based on usage
        usage = form.cleaned_data.get('usage')
        usage_filters = {
            "any": Q(),
            "reuse": Q(licence__can_reuse=True),
            "modify": Q(licence__can_reuse=True, licence__can_modify=True),
            "sell": Q(licence__can_reuse=True, licence__can_sell=True),
            "modify-sell": Q(licence__can_reuse=True, licence__can_modify=True, licence__can_sell=True),
        }
        if usage in usage_filters:
            self.filter_usage = usage_filters[usage]
            items = items.filter(self.filter_usage)
        else:
            self.filter_usage = Q()

        # filter based on ability level
        ability_levels = form.cleaned_data.get('ability_levels')
        if ability_levels.exists():
            d = ability_levels.aggregate(Min('start'),Max('end'))
            start = d['start__min']
            end = d['end__max']
            self.filter_ability_level = Q(ability_level_start__lt=end,ability_level_end__gt=start)
            items = items.filter(self.filter_ability_level)
        else:
            self.filter_ability_level = Q()

        # filter based on status
        status = form.cleaned_data.get('status')
        if status and status!='any':
            self.filter_status = Q(current_stamp__status=status)
            items = items.filter(self.filter_status)
        else:
            self.filter_status = Q()

        items = items.distinct()

        return items