diff options
24 files changed, 530 insertions, 100 deletions
diff --git a/askbot/models/question.py b/askbot/models/question.py index e09f2335..3d17a388 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -177,7 +177,6 @@ class QuestionQuerySet(models.query.QuerySet): 'sort', const.DEFAULT_POST_SORT_METHOD ) - qs = self.filter(deleted=False)#todo - add a possibility to see deleted questions #return metadata diff --git a/askbot/search/state_manager.py b/askbot/search/state_manager.py index d441e33b..1ea4e405 100644 --- a/askbot/search/state_manager.py +++ b/askbot/search/state_manager.py @@ -152,13 +152,14 @@ class SearchState(object): self.__init__() self.logged_in = is_logged_in - def update_value(self, key, store): + def update_value(self, key, store, reset_page=True): if key in store: old_value = getattr(self, key) new_value = store[key] if new_value != old_value: setattr(self, key, new_value) - self.reset_page() + if reset_page == True: + self.reset_page() def relax_stickiness(self, input_dict, view_log): if view_log.get_previous(1) == 'questions': @@ -172,22 +173,20 @@ class SearchState(object): if 'start_over' in input_dict: self.reset() + reset_page = True if 'page' in input_dict: self.page = input_dict['page'] - #special case - on page flip no other input is accepted - return + reset_page = False # This is done to keep page from resetting in other sorting modes if 'page_size' in input_dict: self.update_value('page_size', input_dict) self.reset_page()#todo may be smarter here - start with ~same q - #same as with page - return right away - return if 'scope' in input_dict: if input_dict['scope'] == 'favorite' and self.logged_in == False: self.reset_scope() else: - self.update_value('scope', input_dict) + self.update_value('scope', input_dict, reset_page=reset_page) if 'tags' in input_dict: if self.tags: @@ -223,20 +222,20 @@ class SearchState(object): self.reset_sort() return - self.update_value('author', input_dict) + self.update_value('author', input_dict, reset_page=reset_page) if 'query' in input_dict: query_bits = parse_query(input_dict['query']) tmp_input_dict = copy.deepcopy(input_dict) tmp_input_dict.update(query_bits) - self.update_value('query', tmp_input_dict)#the original query + self.update_value('query', tmp_input_dict, reset_page=reset_page)#the original query #pull out values of [title:xxx], [user:some one] #[tag: sometag], title:'xxx', title:"xxx", @user, @'some user', #and #tag - (hash symbol to delineate the tag - self.update_value('stripped_query', tmp_input_dict) - self.update_value('query_tags', tmp_input_dict) - self.update_value('query_users', tmp_input_dict) - self.update_value('query_title', tmp_input_dict) + self.update_value('stripped_query', tmp_input_dict, reset_page=reset_page) + self.update_value('query_tags', tmp_input_dict, reset_page=reset_page) + self.update_value('query_users', tmp_input_dict, reset_page=reset_page) + self.update_value('query_title', tmp_input_dict, reset_page=reset_page) self.sort = 'relevance-desc' elif 'search' in input_dict: #a case of use nulling search query by hand @@ -253,7 +252,7 @@ class SearchState(object): if input_dict['sort'] == 'relevance-desc' and self.query is None: self.reset_sort() else: - self.update_value('sort', input_dict) + self.update_value('sort', input_dict, reset_page=reset_page) #todo: plug - mysql has no relevance sort if not askbot.conf.should_show_sort_by_relevance(): @@ -295,6 +294,28 @@ class SearchState(object): def reset_scope(self): self.scope = const.DEFAULT_POST_SCOPE + def query_string(self): + out = 'section:%s' % self.scope + out += '/sort:%s' % self.sort + if self.query: + out += '/query:%s' % '+'.join(self.query.split(' ')) + if self.tags: + out += '/tags:%s' % '+'.join(self.tags) + if self.author: + out += '/author:%s' % self.author + return out+'/' + + def make_parameters(self): + params_dict = { + 'scope': self.scope, + 'sort': self.sort, + 'query': '+'.join(self.query.split(' ')) if self.query else None, + 'tags': '+'.join(self.tags) if self.tags else None, + 'author': self.author, + 'page_size': self.page_size + } + return params_dict + class ViewLog(object): """The ViewLog helper obejcts store the trail of the page visits for a given user. The trail is recorded only up to a certain depth. diff --git a/askbot/skins/common/templates/widgets/related_tags.html b/askbot/skins/common/templates/widgets/related_tags.html index 34ea698e..9e1bfd86 100644 --- a/askbot/skins/common/templates/widgets/related_tags.html +++ b/askbot/skins/common/templates/widgets/related_tags.html @@ -9,7 +9,8 @@ tag.name, html_tag = 'div', extra_content = '<span class="tag-number">× ' ~ - tag.local_used_count|intcomma ~ '</span>' + tag.local_used_count|intcomma ~ '</span>', + url_params = query_string, )}} </li> {% endfor %} diff --git a/askbot/skins/common/templates/widgets/search_bar.html b/askbot/skins/common/templates/widgets/search_bar.html index d5a7859b..c696fba3 100644 --- a/askbot/skins/common/templates/widgets/search_bar.html +++ b/askbot/skins/common/templates/widgets/search_bar.html @@ -40,7 +40,7 @@ value="X" name="reset_query" {# todo - make sure it works on Enter keypress #} - onclick="window.location.href='{% url questions %}?reset_query=true'" + onclick="window.location.href='{% url questions %}{{ query_string|remove_from_url('query') }}'" class="cancelSearchBtn"/> {% endif %} diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index 22272e9f..a51b6bc4 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -1,3 +1,5 @@ +{% load extra_filters %} + {%- macro share(site = None, site_label = None, icon = False) -%} <a class="{{ site }}-share{% if icon == True %} icon{% endif %}" title="{% trans %}Share this question on {{site}}{% endtrans %}" @@ -211,13 +213,7 @@ poor design of the data or methods on data objects #} <{% if not is_link or tag[-1] == '*' %}span{% else %}a{% endif %} class="tag tag-right{% if css_class %} {{ css_class }}{% endif %}" {% if is_link %} - href="{% url questions %}?tags={{tag|urlencode}}{{ - if_else( - url_params != None, - '&' ~ url_params, - '' - )|escape - }}" + href="{% url questions %}{% if url_params %}{{url_params|add_tag_to_url(tag|urlencode)}}{% else %}tags:{{ tag|urlencode }}/{% endif %}" title="{% trans %}see questions tagged '{{ tag }}'{% endtrans %}" {% endif %} rel="tag" @@ -252,7 +248,7 @@ poor design of the data or methods on data objects #} {% endfor %} {%- endmacro -%} -{%- macro question_summary(question, extra_class=None) -%} +{%- macro question_summary(question, extra_class=None, query_string=None) -%} {%include "widgets/question_summary.html" %} {%- endmacro -%} @@ -383,7 +379,7 @@ for the purposes of the AJAX comment editor #} {%- endmacro -%} {%- macro reversible_sort_button(button_sort_criterium=None, asc_tooltip=None, - desc_tooltip=None, label=None, current_sort_method=None) -%} + desc_tooltip=None, label=None, current_sort_method=None, query_string=None) -%} {# sort button where descending sort is default and the search method is togglable between ascending and descending @@ -396,17 +392,17 @@ for the purposes of the AJAX comment editor #} {% set sort = current_sort_method %} {% if sort == key_name + "-asc" %}{# "worst" first #} <a id="by_{{key_name}}" - href="?sort={{key_name}}-desc" + href={% url questions %}{{ query_string|replace_in_url("sort:"+key_name+"-desc") }} class="rev on" title="{{desc_tooltip}}"><span>{{label}} ▲</span></a> {% elif sort == key_name + "-desc" %}{# "best first" #} <a id="by_{{key_name}}" - href="?sort={{key_name}}-asc" + href={% url questions %}{{ query_string|replace_in_url("sort:"+key_name+"-asc") }} class="rev on" title="{{asc_tooltip}}"><span>{{label}} ▼</span></a> {% else %}{# default, when other button is active #} <a id="by_{{key_name}}" - href="?sort={{key_name}}-desc" + href={% url questions %}{{ query_string|replace_in_url("sort:"+key_name+"-desc") }} class="off" title="{{desc_tooltip}}"><span>{{label}}</span></a> {% endif %} @@ -562,12 +558,12 @@ answer {% if answer.accepted %}accepted-answer{% endif %} {% if answer.author_id {% if p.is_paginated %} <div class="paginator" style="float:{{position}}"> {% if p.has_previous %} - <span class="prev"><a href="{{p.base_url}}page={{ p.previous }}{{ p.extend_url }}" title="{% trans %}previous{% endtrans %}"> + <span class="prev"><a href="{% if active_tab == "questions" %}{% url questions%}{% endif %}{{p.base_url}}page{% if active_tab == "questions" %}:{%else%}={%endif%}{{ p.previous }}/{{ p.extend_url }}" title="{% trans %}previous{% endtrans %}"> « {% trans %}previous{% endtrans %}</a></span> {% endif %} {% if not p.in_leading_range %} {% for num in p.pages_outside_trailing_range %} - <span class="page"><a href="{{p.base_url}}page={{ num }}{{ p.extend_url }}" >{{ num }}</a></span> + <span class="page"><a href="{% if active_tab == "questions" %}{% url questions%}{% endif %}{{p.base_url}}page{% if active_tab == "questions" %}:{%else%}={%endif%}{{ num }}/{{ p.extend_url }}" >{{ num }}</a></span> {% endfor %} ... {% endif %} @@ -576,18 +572,18 @@ answer {% if answer.accepted %}accepted-answer{% endif %} {% if answer.author_id {% if num == p.page and p.pages != 1%} <span class="curr" title="{% trans %}current page{% endtrans %}">{{ num }}</span> {% else %} - <span class="page"><a href="{{p.base_url}}page={{ num }}{{ p.extend_url }}" title="{% trans %}page number {{num}}{% endtrans %}">{{ num }}</a></span> + <span class="page"><a href="{% if active_tab == "questions" %}{% url questions%}{% endif %}{{p.base_url}}page{% if active_tab == "questions" %}:{%else%}={%endif%}{{ num }}/{{ p.extend_url }}" title="{% trans %}page number {{num}}{% endtrans %}">{{ num }}</a></span> {% endif %} {% endfor %} {% if not p.in_trailing_range %} ... {% for num in p.pages_outside_leading_range|reverse %} - <span class="page"><a href="{{p.base_url}}page={{ num }}{{ p.extend_url }}" title="{% trans %}page number {{ num }}{% endtrans %}">{{ num }}</a></span> + <span class="page"><a href="{% if active_tab == "questions" %}{% url questions%}{% endif %}{{p.base_url}}page{% if active_tab == "questions" %}:{%else%}={%endif%}{{ num }}/{{ p.extend_url }}" title="{% trans %}page number {{ num }}{% endtrans %}">{{ num }}</a></span> {% endfor %} {% endif %} {% if p.has_next %} - <span class="next"><a href="{{p.base_url}}page={{ p.next }}{{ p.extend_url }}" title="{% trans %}next page{% endtrans %}">{% trans %}next page{% endtrans %} »</a></span> + <span class="next"><a href="{% if active_tab == "questions" %}{% url questions%}{% endif %}{{p.base_url}}page{% if active_tab == "questions" %}:{%else%}={%endif%}{{ p.next }}/{{ p.extend_url }}" title="{% trans %}next page{% endtrans %}">{% trans %}next page{% endtrans %} »</a></span> {% endif %} </div> {% endif %} @@ -602,19 +598,19 @@ answer {% if answer.accepted %}accepted-answer{% endif %} {% if answer.author_id {% if p.page_size == 10 %} <span class="curr">10</span> {% else %} - <span class="page"><a href="{{p.base_url}}page_size=10">10</a></span> + <span class="page"><a href="{% url questions %}{{p.base_url}}page_size:10/">10</a></span> {% endif %} {% if p.page_size == 30 %} <span class="curr">30</span> {% else %} - <span class="page"><a href="{{p.base_url}}page_size=30">30</a></span> + <span class="page"><a href="{% url questions %}{{p.base_url}}page_size:30/">30</a></span> {% endif %} {% if p.page_size == 50 %} <span class="curr">50</span> {% else %} - <span class="page"><a href="{{p.base_url}}page_size=50">50</a></span> + <span class="page"><a href="{% url questions %}{{p.base_url}}page_size:50/">50</a></span> {% endif %} </div> {% endif %} diff --git a/askbot/skins/default/templates/main_page/headline.html b/askbot/skins/default/templates/main_page/headline.html index 2ba156c8..444787e6 100644 --- a/askbot/skins/default/templates/main_page/headline.html +++ b/askbot/skins/default/templates/main_page/headline.html @@ -23,16 +23,16 @@ <p class="search-tips"><b>{% trans %}Search tips:{% endtrans %}</b> {% if reset_method_count > 1 %} {% if author_name %} - <a href="{% url questions %}?reset_author=true">{% trans %}reset author{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('author') }}">{% trans %}reset author{% endtrans %}</a> {% endif %} {% if search_tags %}{% if author_name and query %}, {% elif author_name %}{% trans %} or {% endtrans %}{% endif %} - <a href="{% url questions %}?reset_tags=true">{% trans %}reset tags{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('tags') }}">{% trans %}reset tags{% endtrans %}</a> {% endif %} {% if query %}{% trans %} or {% endtrans %} - <a href="{% url questions %}?start_over=true">{% trans %}start over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}start over{% endtrans %}</a> {% endif %} {% else %} - <a href="{% url questions %}?start_over=true">{% trans %}start over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}start over{% endtrans %}</a> {% endif %} {% trans %} - to expand, or dig in by adding more tags and revising the query.{% endtrans %} </p> diff --git a/askbot/skins/default/templates/main_page/javascript.html b/askbot/skins/default/templates/main_page/javascript.html index e35113dd..e726d5b4 100644 --- a/askbot/skins/default/templates/main_page/javascript.html +++ b/askbot/skins/default/templates/main_page/javascript.html @@ -5,7 +5,7 @@ $(document).ready(function(){ /*var on_tab = '#nav_questions'; $(on_tab).attr('className','on');*/ - liveSearch().init('main_page'); + liveSearch().init('main_page', '{{query_string}}'); Hilite.exact = false; Hilite.elementid = "question-list"; Hilite.debug_referrer = location.href; @@ -48,3 +48,19 @@ <script type='text/javascript' src='{{"/js/tag_selector.js"|media}}'></script> {% endif %} <script type="text/javascript" src="{{"/js/live_search.js"|media}}"></script> +{% if active_tab != "tags" and active_tab != "users" %} +<script> +$("form#searchForm").submit(function(event) { + event.preventDefault(); + form_action = $("form#searchForm").attr('action') + query = $("input#keywords").attr('value').split(' ').join('+') + $("input#keywords").attr('value', '') + $("input#searchButton").attr('value', '') + form_action += 'section:{{parameters.scope}}/sort:{{parameters.sort}}/' + + 'query:' + query + '/search:search/' + + '{% if parameters.tags %}tags:{{parameters.tags}}/{% endif %}' + + '{% if parameters.author %}author:{{parameters.author}}/{% endif %}' + window.location.href = form_action; +}); +</script> +{% endif %} diff --git a/askbot/skins/default/templates/main_page/nothing_found.html b/askbot/skins/default/templates/main_page/nothing_found.html index e6d65ea5..8e7624cc 100644 --- a/askbot/skins/default/templates/main_page/nothing_found.html +++ b/askbot/skins/default/templates/main_page/nothing_found.html @@ -13,16 +13,16 @@ {% trans %}You can expand your search by {% endtrans %} {% if reset_method_count > 1 %} {% if author_name %} - <a href="{% url questions %}?reset_author=true">{% trans %}resetting author{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('author') }}">{% trans %}resetting author{% endtrans %}</a> {% endif %} {% if search_tags %}{% if author_name and query %}, {% elif author_name %}{% trans %} or {% endtrans %}{% endif %} - <a href="{% url questions %}?reset_tags=true">{% trans %}resetting tags{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('tags') }}">{% trans %}resetting tags{% endtrans %}</a> {% endif %} {% if query %}{% trans %} or {% endtrans %} - <a href="{% url questions %}?start_over=true">{% trans %}starting over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}starting over{% endtrans %}</a> {% endif %} {% else %} - <a href="{% url questions %}?start_over=true">{% trans %}starting over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}starting over{% endtrans %}</a> {% endif %} </p> {% endif %} diff --git a/askbot/skins/default/templates/main_page/paginator.html b/askbot/skins/default/templates/main_page/paginator.html index b7fd9501..6766261b 100644 --- a/askbot/skins/default/templates/main_page/paginator.html +++ b/askbot/skins/default/templates/main_page/paginator.html @@ -1,7 +1,7 @@ {% import "macros.html" as macros %} -{% if questions_count > 10 %}{# todo: remove magic number #} +{% if questions_count > page_size %}{# todo: remove magic number #} <div id="pager" class="pager"> - {{ macros.paginator(context|setup_paginator, position='left') }} + {{ macros.paginator(context|setup_paginator, position='left', active_tab=active_tab) }} {{ macros.pagesize_switch(context, position='right') }} <div class="clean"></div> </div> diff --git a/askbot/skins/default/templates/main_page/questions_loop.html b/askbot/skins/default/templates/main_page/questions_loop.html index 1a920516..8e6c0492 100644 --- a/askbot/skins/default/templates/main_page/questions_loop.html +++ b/askbot/skins/default/templates/main_page/questions_loop.html @@ -1,7 +1,7 @@ {% import "macros.html" as macros %} {% cache 0 "questions" questions search_tags scope sort query context.page context.page_size language_code %} {% for question in questions.object_list %} - {{macros.question_summary(question)}} + {{macros.question_summary(question, query_string=query_string)}} {% endfor %} {% endcache %} {# comment todo: fix css here #} diff --git a/askbot/skins/default/templates/main_page/tab_bar.html b/askbot/skins/default/templates/main_page/tab_bar.html index 5ed6e5b5..1802640f 100644 --- a/askbot/skins/default/templates/main_page/tab_bar.html +++ b/askbot/skins/default/templates/main_page/tab_bar.html @@ -1,4 +1,5 @@ {% import "macros.html" as macros %} +{% load extra_filters %} {% cache 0 "scope_sort_tabs" search_tags request.user scope sort query context.page context.page_size language_code %} <a class="rss" {% if feed_url %} @@ -19,11 +20,11 @@ {% if query %} <a id="by_relevance" {% if sort == "relevance-desc" %} - href="?sort=relevance-desc" + href="{% url questions %}{{ query_string|replace_in_url("sort:relevance-desc") }}" class="on" title="{{asc_relevance_tooltip}}"><span>{{relevance_label}} ▼</span> {% else %} - href="?sort=relevance-desc" + href="{% url questions %}{{ query_string|replace_in_url("sort:relevance-desc") }}" class="off" title="{{desc_relevance_tooltip}}"><span>{{relevance_label}}</span> {% endif %} @@ -43,7 +44,8 @@ label = gettext('by date'), asc_tooltip = gettext('click to see the oldest questions'), desc_tooltip = gettext('click to see the newest questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} {{macros.reversible_sort_button( @@ -51,7 +53,8 @@ label = gettext('by activity'), asc_tooltip = gettext('click to see the least recently updated questions'), desc_tooltip = gettext('click to see the most recently updated questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} {{macros.reversible_sort_button( @@ -59,7 +62,8 @@ label = gettext('by answers'), asc_tooltip = gettext('click to see the least answered questions'), desc_tooltip = gettext('click to see the most answered questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} {{macros.reversible_sort_button( @@ -67,7 +71,8 @@ label = gettext('by votes'), asc_tooltip = gettext('click to see least voted questions'), desc_tooltip = gettext('click to see most voted questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} diff --git a/askbot/skins/default/templates/tags.html b/askbot/skins/default/templates/tags.html index 1cd4c4b9..4894bdb1 100644 --- a/askbot/skins/default/templates/tags.html +++ b/askbot/skins/default/templates/tags.html @@ -37,7 +37,6 @@ <li> {{ macros.tag_widget( tag = tag.name, - url_params = 'start_over=true', html_tag = 'div', extra_content = '<span class="tag-number">× ' ~ tag.used_count|intcomma ~ '</span>' diff --git a/askbot/skins/default/templates/user_profile/user_stats.html b/askbot/skins/default/templates/user_profile/user_stats.html index 2551015c..92e4d495 100644 --- a/askbot/skins/default/templates/user_profile/user_stats.html +++ b/askbot/skins/default/templates/user_profile/user_stats.html @@ -73,8 +73,7 @@ tag.name, html_tag = 'div', url_params = - "author=" ~ view_user.id ~ - "&start_over=true", + "author:" ~ view_user.id, extra_content = '<span class="tag-number">× ' ~ tag.user_tag_usage_count|intcomma ~ diff --git a/askbot/skins/default/templates/widgets/logo.html b/askbot/skins/default/templates/widgets/logo.html index d0d67db8..dc67edf0 100644 --- a/askbot/skins/default/templates/widgets/logo.html +++ b/askbot/skins/default/templates/widgets/logo.html @@ -1,5 +1,5 @@ {% if settings.SHOW_LOGO %} - <a id="logo" href="{% url questions %}?start_over=true"><img + <a id="logo" href="{% url questions %}"><img src="{{ settings.SITE_LOGO_URL|media }}" title="{% trans %}back to home page{% endtrans %}" alt="{% trans site=settings.APP_SHORT_NAME %}{{site}} logo{% endtrans %}"/></a> diff --git a/askbot/skins/default/templates/widgets/question_summary.html b/askbot/skins/default/templates/widgets/question_summary.html index 9c527140..067454a7 100644 --- a/askbot/skins/default/templates/widgets/question_summary.html +++ b/askbot/skins/default/templates/widgets/question_summary.html @@ -53,6 +53,6 @@ </div> </div> <h2><a title="{{question.summary|escape}}" href="{{ question.get_absolute_url() }}">{{question.get_question_title()|escape}}</a></h2> - {{ tag_list_widget(question.get_tag_names()) }} + {{ tag_list_widget(question.get_tag_names(), url_params=query_string) }} </div> diff --git a/askbot/skins/default/templates/widgets/scope_nav.html b/askbot/skins/default/templates/widgets/scope_nav.html index 222195d5..bdc36cc6 100644 --- a/askbot/skins/default/templates/widgets/scope_nav.html +++ b/askbot/skins/default/templates/widgets/scope_nav.html @@ -1,11 +1,11 @@ {% if active_tab != "ask" %} <a class="scope-selector {% if scope == 'all' %}on{% endif %}" - href="{% url questions %}?scope=all" title="{% trans %}see all questions{% endtrans %}">ALL</a> + href="{% url questions %}{{ query_string|replace_in_url("section:all")|replace_in_url("sort:activity-desc") }}" title="{% trans %}see all questions{% endtrans %}">ALL</a> <a class="scope-selector {% if scope == 'unanswered' %}on{% endif %}" - href="{% url questions %}?scope=unanswered&sort=answers-asc" title="{% trans %}see unanswered questions{% endtrans %}">UNANSWERED</a> + href="{% url questions %}{{ query_string|replace_in_url("section:unanswered")|replace_in_url("sort:answers-asc") }}" title="{% trans %}see unanswered questions{% endtrans %}">UNANSWERED</a> {% if request.user.is_authenticated() %} <a class="scope-selector {% if scope == 'favorite' %}on{% endif %}" - href="{% url questions %}?scope=favorite" title="{% trans %}see your followed questions{% endtrans %}">FOLLOWED</a> + href="{% url questions %}{{ query_string|replace_in_url("section:favorite") }}" title="{% trans %}see your followed questions{% endtrans %}">FOLLOWED</a> {% endif %} {% else %} <div class="scope-selector ask-message">Please ask your question here</div> diff --git a/askbot/skins/old/media/js/live_search.js b/askbot/skins/old/media/js/live_search.js index f9f03453..bf855e60 100644 --- a/askbot/skins/old/media/js/live_search.js +++ b/askbot/skins/old/media/js/live_search.js @@ -23,6 +23,7 @@ var liveSearch = function(){ sortMethod = prevSortMethod; } refresh_x_button(); + search_url = askbot['urls']['questions'] + 'reset_query:true/'; reset_query(sortMethod); } ); @@ -190,24 +191,25 @@ var liveSearch = function(){ return user_html; }; - var render_tag = function(tag_name, linkable, deletable){ + var render_tag = function(tag_name, linkable, deletable, query_string){ var tag = new Tag(); tag.setName(tag_name); tag.setDeletable(deletable); tag.setLinkable(linkable); + tag.setUrlParams(query_string); return tag.getElement().outerHTML(); }; - var render_tags = function(tags, linkable, deletable){ + var render_tags = function(tags, linkable, deletable, query_string){ var tags_html = '<ul class="tags">'; $.each(tags, function(idx, item){ - tags_html += render_tag(item, linkable, deletable); + tags_html += render_tag(item, linkable, deletable, query_string); }); tags_html += '</ul>'; return tags_html; }; - var render_question = function(question){ + var render_question = function(question, query_string){ var entry_html = '<div class="short-summary">' + '<div class="counts">' + @@ -233,15 +235,15 @@ var liveSearch = function(){ render_user_info(question) + '</div>' + render_title(question) + - render_tags(question['tags'], true, false) + + render_tags(question['tags'], true, false, query_string) + '</div>'; return entry_html; }; - var render_question_list = function(questions){ + var render_question_list = function(questions, query_string){ var output = ''; for (var i=0; i<questions.length; i++){ - output += render_question(questions[i]); + output += render_question(questions[i], query_string); } return output; }; @@ -258,13 +260,13 @@ var liveSearch = function(){ $('#contrib-users').append(html); }; - var render_related_tags = function(tags){ + var render_related_tags = function(tags, query_string){ if (tags.length === 0){ return; } var html = ''; for (var i=0; i<tags.length; i++){ - html += render_tag(tags[i]['name'], true, false); + html += render_tag(tags[i]['name'], true, false, query_string); html += '<span class="tag-number">× ' + tags[i]['used_count'] + '</span>' + @@ -316,24 +318,74 @@ var liveSearch = function(){ }); }; - var create_relevance_tab = function(){ + var create_relevance_tab = function(query_string){ relevance_tab = $('<a></a>'); - relevance_tab.attr('href', '?sort=relevance-desc'); + href = '/questions/' + replace_in_url(query_string, 'sort:relevance-desc') + relevance_tab.attr('href', href); relevance_tab.attr('id', 'by_relevance'); relevance_tab.html('<span>' + sortButtonData['relevance']['label'] + '</span>'); return relevance_tab; } - var set_active_sort_tab = function(sort_method){ + var replace_in_url = function (query_string, param){ + values = param.split(':') + type = values[0] + value = values[1] + params = query_string.split('/') + url="" + + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, type.length) == type){ + url += param + '/' + } + else{ + url += params[i] + '/' + } + } + } + + return url + + } + + var remove_from_url = function (query_string, type){ + params = query_string.split('/') + url="" + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, type.length) !== type){ + url += params[i] + '/' + } + } + } + return url + } + + var set_section_tabs = function(query_string){ + var tabs = $('#section_tabs>a'); + tabs.each(function(index, element){ + var tab = $(element); + var tab_name = tab.attr('id').replace(/^by_/,''); + href = '/questions/' + replace_in_url(query_string, 'section:'+tab_name) + tab.attr( + 'href', + href + ); + }); + }; + + var set_active_sort_tab = function(sort_method, query_string){ var tabs = $('#sort_tabs>a'); tabs.attr('class', 'off'); tabs.each(function(index, element){ var tab = $(element); var tab_name = tab.attr('id').replace(/^by_/,''); if (tab_name in sortButtonData){ + href = '/questions/' + replace_in_url(query_string, 'sort:'+tab_name+'-desc') tab.attr( 'href', - '?sort=' + tab_name + '-desc' + href ); tab.attr( 'title', @@ -353,14 +405,14 @@ var liveSearch = function(){ active_tab.html(sortButtonData[name]['label'] + arrow); }; - var render_relevance_sort_tab = function(){ + var render_relevance_sort_tab = function(query_string){ if (showSortByRelevance === false){ return; } var relevance_tab = $('#by_relevance'); if (prev_text && prev_text.length > 0){ if (relevance_tab.length == 0){ - relevance_tab = create_relevance_tab(); + relevance_tab = create_relevance_tab(query_string); $('#sort_tabs>span').after(relevance_tab); } } @@ -373,8 +425,7 @@ var liveSearch = function(){ var remove_search_tag = function(tag_name){ $.ajax({ - url: askbot['urls']['questions'], - data: {remove_tag: tag_name}, + url: askbot['urls']['questions']+'remove_tag:'+escape(tag_name)+'/', dataType: 'json', success: render_result, complete: try_again @@ -433,7 +484,7 @@ var liveSearch = function(){ if (data['questions'].length > 0){ old_list.stop(true); - new_list.html(render_question_list(data['questions'])); + new_list.html(render_question_list(data['questions'], data['query_string'])); //old_list.hide(); old_list.after(new_list); //old_list.remove(); @@ -442,9 +493,10 @@ var liveSearch = function(){ set_question_count(data['question_counter']); render_search_tags(data['query_data']['tags']); render_faces(data['faces']); - render_related_tags(data['related_tags']); - render_relevance_sort_tab(); - set_active_sort_tab(sortMethod); + render_related_tags(data['related_tags'], data['query_string']); + render_relevance_sort_tab(data['query_string']); + set_active_sort_tab(sortMethod, data['query_string']); + set_section_tabs(data['query_string']); query.focus(); //show new div with a fadeIn effect @@ -465,7 +517,7 @@ var liveSearch = function(){ var post_data = {query: query_text}; $.ajax({ url: search_url, - data: {query: query_text, sort: sort_method}, + //data: {query: query_text, sort: sort_method}, dataType: 'json', success: render_result, complete: try_again @@ -476,7 +528,7 @@ var liveSearch = function(){ var reset_query = function(sort_method){ $.ajax({ url: search_url, - data: {reset_query: true, sort: sort_method}, + //data: {reset_query: true, sort: sort_method}, dataType: 'json', success: render_result, complete: try_again @@ -498,7 +550,7 @@ var liveSearch = function(){ query = $('input#keywords'); refresh_main_page(); }, - init: function(mode){ + init: function(mode, query_string){ if (mode === 'main_page'){ //live search for the main page query = $('input#keywords'); @@ -512,11 +564,26 @@ var liveSearch = function(){ sortMethod = 'relevance-desc'; } } + search_url = askbot['urls']['questions']; //resetting search_url every times + params = query_string.split('/') + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, 5) == "sort:"){ //change the sort method + search_url += 'sort:'+sortMethod+'/' + search_url += 'query:'+ cur_text.split(' ').join('+') + '/' //we add the query here + } + else{ + search_url += params[i] + '/'; + } + } + } + //search_url = '/questions/'+search_url send_query(cur_text, sortMethod); }; restart_query = function() { reset_sort_method(); refresh_x_button(); + search_url = askbot['urls']['questions'] + 'reset_query:true/'; reset_query(sortMethod); running = true; }; diff --git a/askbot/skins/old/media/js/utils.js b/askbot/skins/old/media/js/utils.js index ec55e535..ba321e04 100644 --- a/askbot/skins/old/media/js/utils.js +++ b/askbot/skins/old/media/js/utils.js @@ -343,9 +343,41 @@ Tag.prototype.createDom = function(){ this._inner_element = this.makeElement(this._inner_html_tag); if (this.isLinkable()){ var url = askbot['urls']['questions']; - url += '?tags=' + escape(this.getName()); + var flag = false + var author = '' if (this._url_params !== null){ - url += escape('&' + this._url_params); + params = this._url_params.split('/') + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, 5) == "tags:"){ + tags = params[i].substr(5).split('+'); + new_tags = '' + for(var j = 0; j < tags.length; j++){ + if(escape(tags[j]) !== escape(this.getName())){ + new_tags += escape(tags[j]) + '+'; + } + } + new_tags += escape(this.getName()) + url += 'tags:'+new_tags+'/' + flag = true + } + else if (params[i].substring(0, 7) == "author:"){ + author = params[i]; + } + else{ + url += params[i] + '/'; + } + } + } + if (flag == false) { + url += 'tags:'+escape(this.getName())+'/' + } + if (author !== '') { + url += author+'/' + } + } + else{ + url += 'tags:' + escape(this.getName()) + '/'; } this._inner_element.attr('href', url); } diff --git a/askbot/skins/old/templates/blocks/header.html b/askbot/skins/old/templates/blocks/header.html index d7359007..c4a09043 100644 --- a/askbot/skins/old/templates/blocks/header.html +++ b/askbot/skins/old/templates/blocks/header.html @@ -3,7 +3,7 @@ <div id="ab-header"> <div class="content-wrapper"> {% if settings.SHOW_LOGO %} - <a id="ab-logo" href="{% url questions %}?start_over=true"><img + <a id="ab-logo" href="{% url questions %}"><img src="{{ settings.SITE_LOGO_URL|media }}" title="{% trans %}back to home page{% endtrans %}" alt="{% trans site=settings.APP_SHORT_NAME %}{{site}} logo{% endtrans %}"/></a> diff --git a/askbot/skins/old/templates/blocks/input_bar.html b/askbot/skins/old/templates/blocks/input_bar.html index bed97eb4..050fbb3b 100644 --- a/askbot/skins/old/templates/blocks/input_bar.html +++ b/askbot/skins/old/templates/blocks/input_bar.html @@ -8,7 +8,7 @@ {% elif active_tab == "users" %} action="{% url users %}" {% else %} - action="{% url questions %}" + action="{% url questions %}" id="searchForm" {% endif %} method="get"> {# class was searchInput #} @@ -28,10 +28,10 @@ value="x" name="reset_query" {# todo - make sure it works on Enter keypress #} - onclick="window.location.href='{% url questions %}?reset_query=true'" + onclick="window.location.href='{% url questions %}{{ query_string|remove_from_url('query') }}'" class="cancelSearchBtn"/> {% endif %} - <input type="submit" value="{% trans %}search{% endtrans %}" name="search" class="searchBtn" /> + <input type="submit" value="{% trans %}search{% endtrans %}" name="search" class="searchBtn" id='searchButton'/> {% if active_tab == "tags" %} <input type="hidden" name="t" value="tag"/> {% else %} diff --git a/askbot/skins/old/templates/blocks/paginator.html b/askbot/skins/old/templates/blocks/paginator.html index 9782407f..cef84f12 100644 --- a/askbot/skins/old/templates/blocks/paginator.html +++ b/askbot/skins/old/templates/blocks/paginator.html @@ -1,4 +1,4 @@ <!-- paginator.html --> {% import "macros.html" as macros %} -{{ macros.paginator(paginator_context)}} +{{ macros.paginator(paginator_context, active_tab = active_tab)}} <!-- end paginator.html --> diff --git a/askbot/templatetags/extra_filters.py b/askbot/templatetags/extra_filters.py index ffdfd9d8..7bf3a8af 100644 --- a/askbot/templatetags/extra_filters.py +++ b/askbot/templatetags/extra_filters.py @@ -5,6 +5,7 @@ from askbot import exceptions as askbot_exceptions from askbot import auth from askbot.conf import settings as askbot_settings from askbot.utils.slug import slugify +import urllib2 register = template.Library() @@ -156,3 +157,54 @@ def humanize_counter(number): @register.filter def absolute_value(number): return abs(number) + + +@register.filter +def replace_in_url(query_string, param): + type, value = param.split(':') + params = query_string.rstrip('/').split('/') + + for p in params: + if type in p: + params[params.index(p)] = param + + query_string = '/'.join(params)+'/' + return query_string + +@register.filter +def add_tag_to_url(query_string, param): + if query_string: + params = query_string.rstrip('/').split('/') + flag = False + + tags = [s for s in params if "tags:" in s] + if tags: + tags = tags[0] + flag = True + type, value = tags.split(':') + values = value.split('+') + if not urllib2.unquote(param) in values: + values.append(param) + values = [urllib2.quote(value) for value in values] + params[params.index(tags)] = 'tags:'+'+'.join(values) + + if not flag: + author = [s for s in params if "author:" in s] + if author: + author = author[0] + params.insert(params.index(author), 'tags:'+param) + else: + params.append('tags:'+param) + query_string = '/'.join(params)+'/' + return query_string + +@register.filter +def remove_from_url(query_string, param_type): + if query_string: + params = query_string.rstrip('/').split('/') + new_params = [] + for p in params: + if not p.startswith(param_type): + new_params.append(p) + query_string = '/'.join(new_params)+'/' + return query_string diff --git a/askbot/urls.py b/askbot/urls.py index be21217b..acab5f4b 100644 --- a/askbot/urls.py +++ b/askbot/urls.py @@ -68,11 +68,217 @@ urlpatterns = patterns('', kwargs = {'object_name': 'Answer'}, name='answer_revisions' ), - url(#this url works both normally and through ajax - r'^%s$' % _('questions/'), + + # BEGIN Questions (main page) urls. All this urls work both normally and through ajax + + url( # section/sort/query/search/tags/author + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/search:search/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/tags/author/page_size Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/tags/author/page Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/tags/author for use with ajax + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/author/page_size Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/author/page Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/author for use with ajax + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/author:(?P<author>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/search/author + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/search:search/author:(?P<author>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/tags/page_size Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/tags:(?P<tags>[\w\d\-\+\#]+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/tags/page Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/tags:(?P<tags>[\w\d\-\+\#]+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/search/tags + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/search:search/tags:(?P<tags>[\w\d\-\+\#]+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/tags for use with ajax + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/tags:(?P<tags>[\w\d\-\+\#]+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + + url( # section/sort/query/search + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/search:search/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/page_size Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query/page Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/query for use with ajax + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/query:(?P<query>[\w\d\-\+\#]+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/tags/author/page_size Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/tags/author/page Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/tags/author for use with ajax + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/author/page_size Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/author:(?P<author>\d+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/author/page Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/author:(?P<author>\d+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/author for use with ajax + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/author:(?P<author>\d+)/$' % _('questions'), views.readers.questions, name='questions' ), + url( # section/sort/tags/page_size Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/tags:(?P<tags>[\w\d\-\+\#]+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # section/sort/tags/page Note:issues with default start_over + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/tags:(?P<tags>[\w\d\-\+\#]+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # include section/sort/tags + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/tags:(?P<tags>[\w\d\-\+\#]+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # tags/author/page_size Note:issues with default start_over + r'^%s/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # tags/author/page Note:issues with default start_over + r'^%s/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # include tags/author + r'^%s/tags:(?P<tags>[\w\d\-\+\#]+)/author:(?P<author>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + + url( # author/page_size Note:issues with default start_over + r'^%s/author:(?P<author>\d+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # author/page Note:issues with default start_over + r'^%s/author:(?P<author>\d+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # include author + r'^%s/author:(?P<author>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + + url( # tags/page_size Note:issues with default start_over + r'^%s/tags:(?P<tags>[\w\d\-\+\#]+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # tags/page Note:issues with default start_over + r'^%s/tags:(?P<tags>[\w\d\-\+\#]+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # include tags + r'^%s/tags:(?P<tags>[\w\d\-\+\#]+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # include section/sort/page_size + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/page_size:(?P<page_size>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # include section/sort/page + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/page:(?P<page>\d+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # include section/sort + r'^%s/section:(?P<scope>\w+)/sort:(?P<sort>[\w\-]+)/$' % _('questions'), + views.readers.questions, + name='questions' + ), + url( # removes tag, this is used only with ajax and this parameters is always used alone + r'^%s/remove_tag:(?P<remove_tag>[\w\d\-\#]+)/$' % _('questions'), + views.readers.questions, + {'start_over': (None)}, # this parameter is true by default, so we are making it false here + name='questions' + ), + url( # reset_query, for ajax use + r'^%s/reset_query:(?P<reset_query>\w+)/$' % _('questions'), + views.readers.questions, + {'start_over': (None)}, # this parameter is true by default, so we are making it false here + name='questions' + ), + url( + r'^%s$' % _('questions/'), + views.readers.questions, + name='questions' + ), + + # END main page urls + url( r'^api/get_questions/', views.commands.api_get_questions, diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 53ef519e..7aeba23b 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -64,18 +64,49 @@ def index(request):#generates front page - shows listing of questions sorted in """ return HttpResponseRedirect(reverse('questions')) -def questions(request): +def questions(request, scope=const.DEFAULT_POST_SCOPE, sort=const.DEFAULT_POST_SORT_METHOD, query=None, \ + search=None, tags=None, author=None, page=None, reset_tags=None, \ + reset_author=None, reset_query=None, start_over=True, \ + remove_tag=None, page_size=None): """ List of Questions, Tagged questions, and Unanswered questions. matching search query or user selection """ + #make parameters dictionary + params_dict = { + 'scope': scope, + 'sort': sort, + } + if query: + params_dict['query'] = ' '.join(query.split('+')) + if search: + params_dict['search'] = search + if tags: + params_dict['tags'] = ' '.join(tags.split('+')) + if author: + params_dict['author'] = author + if page: + params_dict['page'] = page + if reset_tags: + params_dict['reset_tags'] = reset_tags + if reset_author: + params_dict['reset_author'] = reset_author + if reset_query: + params_dict['reset_query'] = reset_query + if start_over: + params_dict['start_over'] = start_over + if remove_tag: + params_dict['remove_tag'] = remove_tag.decode("utf8") + if page_size: + params_dict['page_size'] = page_size + #before = datetime.datetime.now() #don't allow to post to this view if request.method == 'POST': raise Http404 - #update search state - form = AdvancedSearchForm(request.GET) + #form = AdvancedSearchForm(request.GET) + form = AdvancedSearchForm(params_dict) if form.is_valid(): user_input = form.cleaned_data else: @@ -121,8 +152,9 @@ def questions(request): 'has_next': page.has_next(), 'previous': page.previous_page_number(), 'next': page.next_page_number(), - 'base_url' : request.path + '?sort=%s&' % search_state.sort,#todo in T sort=>sort_method + 'base_url' : search_state.query_string(),#todo in T sort=>sort_method 'page_size' : search_state.page_size,#todo in T pagesize -> page_size + 'parameters': search_state.make_parameters(), } # We need to pass the rss feed url based @@ -191,6 +223,8 @@ def questions(request): 'related_tags': list(), 'faces': list(), 'feed_url': context_feed_url, + 'query_string': search_state.query_string(), + 'parameters': search_state.make_parameters(), } badge_levels = dict(const.BADGE_TYPE_CHOICES) @@ -256,6 +290,7 @@ def questions(request): 'language_code': translation.get_language(), 'name_of_anonymous_user' : models.get_name_of_anonymous_user(), 'page_class': 'main-page', + 'page_size': search_state.page_size, 'query': search_state.query, 'questions' : page, 'questions_count' : paginator.count, @@ -270,6 +305,8 @@ def questions(request): 'font_size' : font_size, 'tag_filter_strategy_choices': const.TAG_FILTER_STRATEGY_CHOICES, 'update_avatar_data': schedules.should_update_avatar_data(request), + 'query_string': search_state.query_string(), + 'parameters': search_state.make_parameters(), 'feed_url': context_feed_url, } |