Beispiel #1
0
def node_module_thread(request, node, module, **kwargs):

    redirect = False
    search_user_form = SearchUserForm(request.GET)
    if search_user_form.is_valid():
        ids = [
            int(_id) for _id in
            extract_numbers(search_user_form.data["authors"])
        ]
        kwargs.update({"author": ids})
        redirect = True

    search_state = SearchState(
        user_logged_in=request.user.is_authenticated(),
        node=node,
        module=module,
        request=request,
        **kwargs
        )

    if redirect:
        return HttpResponseRedirect(search_state.full_url())

    if search_state.author:
        search_user_form.data["authors"] = extract_numbers(search_state.author)

    page_size = int(openode_settings.DEFAULT_QUESTIONS_PAGE_SIZE)

    qs, meta_data = models.Thread.objects.run_advanced_search(
        request_user=request.user,
        search_state=search_state
        )
    if meta_data['non_existing_tags']:
        search_state = search_state.remove_tags(meta_data['non_existing_tags'])

    paginator = Paginator(qs, page_size)
    if paginator.num_pages < search_state.page:
        search_state.page = 1
    page = paginator.page(search_state.page)
    page.object_list = list(page.object_list)  # evaluate the queryset

    # INFO: Because for the time being we need question posts and thread authors
    #       down the pipeline, we have to precache them in thread objects

    models.Thread.objects.precache_view_data_hack(threads=page.object_list)

    related_tags = Tag.objects.get_related_to_search(
        threads=page.object_list,
        ignored_tag_names=meta_data.get('ignored_tag_names', [])
    )
    tag_list_type = openode_settings.TAG_LIST_FORMAT
    if tag_list_type == 'cloud':  # force cloud to sort by name
        related_tags = sorted(related_tags, key=operator.attrgetter('name'))

    contributors = list(
        models.Thread.objects.get_thread_contributors(
            thread_list=page.object_list
        ).only('id', 'username', 'gravatar')
    )

    paginator_context = {
        'is_paginated': (paginator.count > page_size),

        'pages': paginator.num_pages,
        'page': search_state.page,
        'has_previous': page.has_previous(),
        'has_next': page.has_next(),
        'previous': page.previous_page_number(),
        'next': page.next_page_number(),

        'base_url': search_state.query_string(),
        'page_size': page_size,
    }

    # We need to pass the rss feed url based
    # on the search state to the template.
    # We use QueryDict to get a querystring
    # from dicts and arrays. Much cleaner
    # than parsing and string formating.
    rss_query_dict = QueryDict("").copy()
    if search_state.query:
        # We have search string in session - pass it to
        # the QueryDict
        rss_query_dict.update({"q": search_state.query})
    if search_state.tags:
        # We have tags in session - pass it to the
        # QueryDict but as a list - we want tags+
        rss_query_dict.setlist("tags", search_state.tags)

    reset_method_count = len(filter(None, [search_state.query, search_state.tags, meta_data.get('author_name', None)]))

    if request.is_ajax():
        # q_count = paginator.count

        # question_counter = ungettext('%(q_num)s question', '%(q_num)s questions', q_count)
        # question_counter = question_counter % {'q_num': humanize.intcomma(q_count)}

        # if q_count > page_size:
        #     paginator_tpl = get_template('node/paginator.html', request)
        #     paginator_html = paginator_tpl.render(Context({
        #         'context': functions.setup_paginator(paginator_context),
        #         'questions_count': q_count,
        #         'page_size': page_size,
        #         'search_state': search_state,
        #     }))
        # else:
        #     paginator_html = ''

        # questions_tpl = get_template('node/questions_loop.html', request)
        # questions_html = questions_tpl.render(Context({
        #     'threads': page,
        #     'search_state': search_state,
        #     'reset_method_count': reset_method_count,
        #     'request': request
        # }))

        # ajax_data = {
        #     'query_data': {
        #         'tags': search_state.tags,
        #         'sort_order': search_state.sort,
        #         'ask_query_string': search_state.ask_query_string(),
        #     },
        #     'paginator': paginator_html,
        #     'question_counter': question_counter,
        #     'faces': [],  # [extra_tags.gravatar(contributor, 48) for contributor in contributors],
        #     'query_string': search_state.query_string(),
        #     'page_size': page_size,
        #     'questions': questions_html.replace('\n', ''),
        #     'non_existing_tags': meta_data['non_existing_tags']
        # }
        # ajax_data['related_tags'] = [{
        #     'name': escape(tag.name),
        #     'used_count': humanize.intcomma(tag.local_used_count)
        # } for tag in related_tags]

        ajax_data = {"msg": "bad request"}
        node.visit(request.user)
        return HttpResponse(simplejson.dumps(ajax_data), mimetype='application/json')

    else:  # non-AJAX branch

        template_data = {
            # ThreadCategory Tree root
            "categories": node.thread_categories.filter(level=0),
            "search_user_form": search_user_form,
            'active_tab': 'questions',
            'authors': meta_data.get('authors', []),
            'contributors': contributors,
            'context': paginator_context,
            'is_unanswered': False,  # remove this from template
            'interesting_tag_names': meta_data.get('interesting_tag_names', None),
            'ignored_tag_names': meta_data.get('ignored_tag_names', None),
            'subscribed_tag_names': meta_data.get('subscribed_tag_names', None),
            'language_code': translation.get_language(),
            'name_of_anonymous_user': models.get_name_of_anonymous_user(),
            'page_class': 'main-page',
            'page_size': page_size,
            'threads': page,
            'questions_count': paginator.count,
            'reset_method_count': reset_method_count,
            'tags': related_tags,
            'tag_list_type': tag_list_type,
            'font_size': extra_tags.get_tag_font_size(related_tags),
            'display_tag_filter_strategy_choices': conf.get_tag_display_filter_strategy_choices(),
            'email_tag_filter_strategy_choices': const.TAG_EMAIL_FILTER_STRATEGY_CHOICES,
            'update_avatar_data': schedules.should_update_avatar_data(request),
            'search_state': search_state,
            'node': node,
            'module': module
        }

        # load opened nodes from session
        opened_categories = list(
            request.session.setdefault(
                OPENED_CATEGORIES_KEY,
                set()
                # set(ThreadCategory.objects.filter(display_opened=True).values_list("pk", flat=True))
            )
        )
        template_data.update({"opened_categories": opened_categories})

        template_file = NODE_MODULE_TEMPLATE_FILE[module]

        if module == 'library':

            # get categories (with path to root) with thread (documents) with is unread
            # maybe is better way to create document/category tree structure in python and in template only render.

            categories_ids_witn_unread_thread = set()

            def _recursively(categories):
                for category in categories.iterator():
                    for thread in category.threads.iterator():
                        if thread.has_unread_main_post_for_user(request.user):
                            categories_ids_witn_unread_thread.update(
                                category.get_ancestors(include_self=True).values_list("pk", flat=True)
                            )
                            break
                    _recursively(category.get_children())
            _recursively(node.thread_categories.filter(level=0))

            ####################################################################

            template_data.update({
                "download_zip_form": DownloadZipForm(),
                "free_threads": node.threads.filter(is_deleted=False, category=None, thread_type=const.THREAD_TYPE_DOCUMENT).order_by("title"),  # Thread.objects.filter(thread__node=node, thread__category=None).select_related("thread"),
                "categories_ids_witn_unread_thread": categories_ids_witn_unread_thread
                # "categorized_threads": node.threads.exclude(category=None),  # Thread.objects.filter(thread__node=node, thread__category=None).select_related("thread"),
                # "free_documents": Document.objects.filter(thread__node=node, thread__category=None).select_related("thread"),
                # "category_documents": Document.objects.filter(thread__node=node).exclude(thread__category=None),
            })
        node.visit(request.user)
        return render_into_skin(template_file, template_data, request)
Beispiel #2
0
def node_module_thread(request, node, module, **kwargs):
    redirect = False
    search_user_form = SearchUserForm(request.GET)
    if search_user_form.is_valid():
        ids = [
            int(_id) for _id in
            extract_numbers(search_user_form.data["authors"])
        ]
        kwargs.update({"author": ids})
        redirect = True

    search_state = SearchState(
        user_logged_in=request.user.is_authenticated(),
        node=node,
        module=module,
        request=request,
        **kwargs
        )

    if redirect:
        return HttpResponseRedirect(search_state.full_url())

    if search_state.author:
        search_user_form.data["authors"] = extract_numbers(search_state.author)

    page_size = int(openode_settings.DEFAULT_QUESTIONS_PAGE_SIZE)

    qs, meta_data = models.Thread.objects.run_advanced_search(
        request_user=request.user,
        search_state=search_state
        )

    if meta_data['non_existing_tags']:
        search_state = search_state.remove_tags(meta_data['non_existing_tags'])

    paginator = Paginator(qs, page_size)
    if paginator.num_pages < search_state.page:
        search_state.page = 1
    page = paginator.page(search_state.page)
    page.object_list = list(page.object_list)  # evaluate the queryset

    # INFO: Because for the time being we need question posts and thread authors
    #       down the pipeline, we have to precache them in thread objects

    models.Thread.objects.precache_view_data_hack(threads=page.object_list)

    related_tags = Tag.objects.get_related_to_search(
        threads=page.object_list,
        ignored_tag_names=meta_data.get('ignored_tag_names', [])
    )
    tag_list_type = openode_settings.TAG_LIST_FORMAT
    if tag_list_type == 'cloud':  # force cloud to sort by name
        related_tags = sorted(related_tags, key=operator.attrgetter('name'))

    contributors = list(
        models.Thread.objects.get_thread_contributors(
            thread_list=page.object_list
        ).only('id', 'username', 'gravatar')
    )

    paginator_context = {
        'is_paginated': (paginator.count > page_size),

        'pages': paginator.num_pages,
        'page': search_state.page,
        'has_previous': page.has_previous(),
        'has_next': page.has_next(),
        'previous': page.previous_page_number(),
        'next': page.next_page_number(),

        'base_url': search_state.query_string(),
        'page_size': page_size,
    }

    # We need to pass the rss feed url based
    # on the search state to the template.
    # We use QueryDict to get a querystring
    # from dicts and arrays. Much cleaner
    # than parsing and string formating.
    rss_query_dict = QueryDict("").copy()
    if search_state.query:
        # We have search string in session - pass it to
        # the QueryDict
        rss_query_dict.update({"q": search_state.query})
    if search_state.tags:
        # We have tags in session - pass it to the
        # QueryDict but as a list - we want tags+
        rss_query_dict.setlist("tags", search_state.tags)

    reset_method_count = len(filter(None, [search_state.query, search_state.tags, meta_data.get('author_name', None)]))

    if request.is_ajax():
        # q_count = paginator.count

        # question_counter = ungettext('%(q_num)s question', '%(q_num)s questions', q_count)
        # question_counter = question_counter % {'q_num': humanize.intcomma(q_count)}

        # if q_count > page_size:
        #     paginator_tpl = get_template('node/paginator.html', request)
        #     paginator_html = paginator_tpl.render(Context({
        #         'context': functions.setup_paginator(paginator_context),
        #         'questions_count': q_count,
        #         'page_size': page_size,
        #         'search_state': search_state,
        #     }))
        # else:
        #     paginator_html = ''

        # questions_tpl = get_template('node/questions_loop.html', request)
        # questions_html = questions_tpl.render(Context({
        #     'threads': page,
        #     'search_state': search_state,
        #     'reset_method_count': reset_method_count,
        #     'request': request
        # }))

        # ajax_data = {
        #     'query_data': {
        #         'tags': search_state.tags,
        #         'sort_order': search_state.sort,
        #         'ask_query_string': search_state.ask_query_string(),
        #     },
        #     'paginator': paginator_html,
        #     'question_counter': question_counter,
        #     'faces': [],  # [extra_tags.gravatar(contributor, 48) for contributor in contributors],
        #     'query_string': search_state.query_string(),
        #     'page_size': page_size,
        #     'questions': questions_html.replace('\n', ''),
        #     'non_existing_tags': meta_data['non_existing_tags']
        # }
        # ajax_data['related_tags'] = [{
        #     'name': escape(tag.name),
        #     'used_count': humanize.intcomma(tag.local_used_count)
        # } for tag in related_tags]

        ajax_data = {"msg": "bad request"}
        node.visit(request.user)
        return HttpResponse(simplejson.dumps(ajax_data), mimetype='application/json')

    else:  # non-AJAX branch

        template_data = {
            # ThreadCategory Tree root
            "categories": node.thread_categories.filter(level=0),
            "search_user_form": search_user_form,
            'active_tab': 'questions',
            'authors': meta_data.get('authors', []),
            'contributors': contributors,
            'context': paginator_context,
            'is_unanswered': False,  # remove this from template
            'interesting_tag_names': meta_data.get('interesting_tag_names', None),
            'ignored_tag_names': meta_data.get('ignored_tag_names', None),
            'subscribed_tag_names': meta_data.get('subscribed_tag_names', None),
            'language_code': translation.get_language(),
            'name_of_anonymous_user': models.get_name_of_anonymous_user(),
            'page_class': 'main-page',
            'page_size': page_size,
            'threads': page,
            'questions_count': paginator.count,
            'reset_method_count': reset_method_count,
            'tags': related_tags,
            'tag_list_type': tag_list_type,
            'font_size': extra_tags.get_tag_font_size(related_tags),
            'display_tag_filter_strategy_choices': conf.get_tag_display_filter_strategy_choices(),
            'email_tag_filter_strategy_choices': const.TAG_EMAIL_FILTER_STRATEGY_CHOICES,
            'update_avatar_data': schedules.should_update_avatar_data(request),
            'search_state': search_state,
            'node': node,
            'module': module
        }

        # load opened nodes from session
        opened_categories = list(
            request.session.setdefault(
                OPENED_CATEGORIES_KEY,
                set()
                # set(ThreadCategory.objects.filter(display_opened=True).values_list("pk", flat=True))
            )
        )
        template_data.update({"opened_categories": opened_categories})

        template_file = NODE_MODULE_TEMPLATE_FILE[module]

        if module == 'library':

            # get categories (with path to root) with thread (documents) with is unread
            # maybe is better way to create document/category tree structure in python and in template only render.

            categories_ids_witn_unread_thread = set()

            def _recursively(categories):
                for category in categories.iterator():
                    for thread in category.threads.iterator():
                        if thread.has_unread_main_post_for_user(request.user):
                            categories_ids_witn_unread_thread.update(
                                category.get_ancestors(include_self=True).values_list("pk", flat=True)
                            )
                            break
                    _recursively(category.get_children())
            _recursively(node.thread_categories.filter(level=0))

            ####################################################################

            template_data.update({
                "download_zip_form": DownloadZipForm(),
                "free_threads": node.threads.filter(is_deleted=False, category=None, thread_type=const.THREAD_TYPE_DOCUMENT).order_by("title"),  # Thread.objects.filter(thread__node=node, thread__category=None).select_related("thread"),
                "categories_ids_witn_unread_thread": categories_ids_witn_unread_thread
                # "categorized_threads": node.threads.exclude(category=None),  # Thread.objects.filter(thread__node=node, thread__category=None).select_related("thread"),
                # "free_documents": Document.objects.filter(thread__node=node, thread__category=None).select_related("thread"),
                # "category_documents": Document.objects.filter(thread__node=node).exclude(thread__category=None),
            })
        node.visit(request.user)
        return render_into_skin(template_file, template_data, request)
Beispiel #3
0
def tag_list(request):  # view showing a listing of available tags - plain list

    tag_list_type = openode_settings.TAG_LIST_FORMAT

    if tag_list_type == 'list':

        stag = ""
        sortby = request.GET.get('sort', 'used')
        try:
            page = int(request.GET.get('page', '1'))
        except ValueError:
            page = 1

        stag = request.GET.get("query", "").strip()
        if stag != '':
            objects_list = Paginator(
                Tag.objects.valid_tags().filter(deleted=False, name__icontains=stag).exclude(used_count=0),
                DEFAULT_PAGE_SIZE
            )
        else:
            if sortby == "name":
                objects_list = Paginator(Tag.objects.valid_tags().filter(deleted=False).exclude(used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
            else:
                objects_list = Paginator(Tag.objects.valid_tags().filter(deleted=False).exclude(used_count=0).order_by("-used_count"), DEFAULT_PAGE_SIZE)

        try:
            tags = objects_list.page(page)
        except (EmptyPage, InvalidPage):
            tags = objects_list.page(objects_list.num_pages)

        paginator_data = {
            'is_paginated': bool(objects_list.count > DEFAULT_PAGE_SIZE),
            'pages': objects_list.num_pages,
            'page': page,
            'has_previous': tags.has_previous(),
            'has_next': tags.has_next(),
            'previous': tags.previous_page_number(),
            'next': tags.next_page_number(),
            'base_url': reverse('tags') + '?sort=%s&amp;' % sortby
        }
        paginator_context = setup_paginator(paginator_data)
        data = {
            'active_tab': 'tags',
            'page_class': 'tags-page',
            'tags': tags,
            'tag_list_type': tag_list_type,
            'stag': stag,
            'tab_id': sortby,
            'keywords': stag,
            'paginator_context': paginator_context,
        }

    else:

        stag = ""
        sortby = request.GET.get('sort', 'name')

        if request.method == "GET":
            stag = request.GET.get("query", "").strip()
            if stag != '':
                tags = Tag.objects.filter(deleted=False, name__icontains=stag).exclude(used_count=0)
            else:
                if sortby == "name":
                    tags = Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name")
                else:
                    tags = Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count")

        font_size = extra_tags.get_tag_font_size(tags)

        data = {
            'active_tab': 'tags',
            'page_class': 'tags-page',
            'tags': tags,
            'tag_list_type': tag_list_type,
            'font_size': font_size,
            'stag': stag,
            'tab_id': sortby,
            'keywords': stag,
            'search_state': SearchState(*[None for x in range(7)])
        }

    return render_into_skin('tag_list.html', data, request)
Beispiel #4
0
def tag_list(request):  # view showing a listing of available tags - plain list

    tag_list_type = openode_settings.TAG_LIST_FORMAT

    if tag_list_type == 'list':

        stag = ""
        sortby = request.GET.get('sort', 'used')
        try:
            page = int(request.GET.get('page', '1'))
        except ValueError:
            page = 1

        stag = request.GET.get("query", "").strip()
        if stag != '':
            objects_list = Paginator(
                Tag.objects.valid_tags().filter(
                    deleted=False, name__icontains=stag).exclude(used_count=0),
                DEFAULT_PAGE_SIZE)
        else:
            if sortby == "name":
                objects_list = Paginator(
                    Tag.objects.valid_tags().filter(deleted=False).exclude(
                        used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
            else:
                objects_list = Paginator(
                    Tag.objects.valid_tags().filter(deleted=False).exclude(
                        used_count=0).order_by("-used_count"),
                    DEFAULT_PAGE_SIZE)

        try:
            tags = objects_list.page(page)
        except (EmptyPage, InvalidPage):
            tags = objects_list.page(objects_list.num_pages)

        paginator_data = {
            'is_paginated': bool(objects_list.count > DEFAULT_PAGE_SIZE),
            'pages': objects_list.num_pages,
            'page': page,
            'has_previous': tags.has_previous(),
            'has_next': tags.has_next(),
            'previous': tags.previous_page_number(),
            'next': tags.next_page_number(),
            'base_url': reverse('tags') + '?sort=%s&amp;' % sortby
        }
        paginator_context = setup_paginator(paginator_data)
        data = {
            'active_tab': 'tags',
            'page_class': 'tags-page',
            'tags': tags,
            'tag_list_type': tag_list_type,
            'stag': stag,
            'tab_id': sortby,
            'keywords': stag,
            'paginator_context': paginator_context,
        }

    else:

        stag = ""
        sortby = request.GET.get('sort', 'name')

        if request.method == "GET":
            stag = request.GET.get("query", "").strip()
            if stag != '':
                tags = Tag.objects.filter(
                    deleted=False, name__icontains=stag).exclude(used_count=0)
            else:
                if sortby == "name":
                    tags = Tag.objects.all().filter(deleted=False).exclude(
                        used_count=0).order_by("name")
                else:
                    tags = Tag.objects.all().filter(deleted=False).exclude(
                        used_count=0).order_by("-used_count")

        font_size = extra_tags.get_tag_font_size(tags)

        data = {
            'active_tab': 'tags',
            'page_class': 'tags-page',
            'tags': tags,
            'tag_list_type': tag_list_type,
            'font_size': font_size,
            'stag': stag,
            'tab_id': sortby,
            'keywords': stag,
            'search_state': SearchState(*[None for x in range(7)])
        }

    return render_into_skin('tag_list.html', data, request)