summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askbot/models/question.py1
-rw-r--r--askbot/search/state_manager.py49
-rw-r--r--askbot/skins/common/templates/widgets/related_tags.html3
-rw-r--r--askbot/skins/common/templates/widgets/search_bar.html2
-rw-r--r--askbot/skins/default/templates/macros.html36
-rw-r--r--askbot/skins/default/templates/main_page/headline.html8
-rw-r--r--askbot/skins/default/templates/main_page/javascript.html18
-rw-r--r--askbot/skins/default/templates/main_page/nothing_found.html8
-rw-r--r--askbot/skins/default/templates/main_page/paginator.html4
-rw-r--r--askbot/skins/default/templates/main_page/questions_loop.html2
-rw-r--r--askbot/skins/default/templates/main_page/tab_bar.html17
-rw-r--r--askbot/skins/default/templates/tags.html1
-rw-r--r--askbot/skins/default/templates/user_profile/user_stats.html3
-rw-r--r--askbot/skins/default/templates/widgets/logo.html2
-rw-r--r--askbot/skins/default/templates/widgets/question_summary.html2
-rw-r--r--askbot/skins/default/templates/widgets/scope_nav.html6
-rw-r--r--askbot/skins/old/media/js/live_search.js115
-rw-r--r--askbot/skins/old/media/js/utils.js36
-rw-r--r--askbot/skins/old/templates/blocks/header.html2
-rw-r--r--askbot/skins/old/templates/blocks/input_bar.html6
-rw-r--r--askbot/skins/old/templates/blocks/paginator.html2
-rw-r--r--askbot/templatetags/extra_filters.py52
-rw-r--r--askbot/urls.py210
-rw-r--r--askbot/views/readers.py45
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">&#215; ' ~
- 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}} &#9650;</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}} &#9660;</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 %}">
&laquo; {% 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 %} &raquo;</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 %} &raquo;</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}} &#9660;</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">&#215; ' ~
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">&#215; ' ~
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&amp;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">&#215; ' +
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&amp;' % 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,
}