def user_profile(request, id, tab_name=None): """Main user view function that works as a switchboard id - id of the profile owner todo: decide what to do with slug - it is not used in the code in any way """ profile_owner = get_object_or_404(models.User, id=id) user_view_func = USER_VIEW_CALL_TABLE.get(tab_name, user_overview) search_state = SearchState( # Non-default SearchState with user data set scope=None, sort=None, tags=None, author=profile_owner.id, page=None, user_logged_in=profile_owner.is_authenticated(), node=None, module='qa' ) context = { 'view_user': profile_owner, 'search_state': search_state, 'user_follow_feature_on': ('followit' in django_settings.INSTALLED_APPS), 'tab_name': tab_name, } # context.update(view_context.get_for_user_profile(request)) return user_view_func(request, profile_owner, context)
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)
def get_empty_search_state(unused): from openode.search.state_manager import SearchState return SearchState.get_empty()
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&' % 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)