summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2011-12-11 14:50:25 -0300
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2011-12-11 14:50:25 -0300
commit2ab5eaf579f39e490a3a36175d47818469eb4807 (patch)
tree3c107667ed1de1a1f3cadd513b274ecb1b894004
parentb159c234d18c9c1cd4236f5ef37ad89cd284e480 (diff)
parent78429a2ad57c0cb018889f167bb7b9da69ef0125 (diff)
downloadaskbot-2ab5eaf579f39e490a3a36175d47818469eb4807.tar.gz
askbot-2ab5eaf579f39e490a3a36175d47818469eb4807.tar.bz2
askbot-2ab5eaf579f39e490a3a36175d47818469eb4807.zip
merged Rosandras navigation branch to Tomasz models work
-rw-r--r--askbot/migrations/0088_install__post_view__for__development.py338
-rw-r--r--askbot/models/question.py1
-rw-r--r--askbot/search/state_manager.py49
-rw-r--r--askbot/skins/common/media/js/jquery.history.js1
-rw-r--r--askbot/skins/common/media/js/live_search.js256
-rw-r--r--askbot/skins/common/media/js/modernizr.custom.js4
-rw-r--r--askbot/skins/common/media/js/utils.js38
-rw-r--r--askbot/skins/common/templates/widgets/related_tags.html3
-rw-r--r--askbot/skins/common/templates/widgets/search_bar.html4
-rw-r--r--askbot/skins/default/templates/macros.html38
-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/meta/bottom_scripts.html17
-rw-r--r--askbot/skins/default/templates/meta/html_head_javascript.html1
-rw-r--r--askbot/skins/default/templates/tags.html1
-rw-r--r--askbot/skins/default/templates/widgets/logo.html5
-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/templatetags/extra_filters.py52
-rw-r--r--askbot/urls.py210
-rw-r--r--askbot/views/readers.py73
25 files changed, 1035 insertions, 121 deletions
diff --git a/askbot/migrations/0088_install__post_view__for__development.py b/askbot/migrations/0088_install__post_view__for__development.py
new file mode 100644
index 00000000..7d7d1ba9
--- /dev/null
+++ b/askbot/migrations/0088_install__post_view__for__development.py
@@ -0,0 +1,338 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+import askbot
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ create_post_view_sql = open(
+ askbot.get_path_to('models/post_view.sql')
+ ).read()
+ db.execute(create_post_view_sql)
+
+ def backwards(self, orm):
+ db.execute('DROP VIEW askbot_post')
+
+ models = {
+ 'askbot.activity': {
+ 'Meta': {'object_name': 'Activity', 'db_table': "u'activity'"},
+ 'active_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'activity_type': ('django.db.models.fields.SmallIntegerField', [], {}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_auditted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True'}),
+ 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+ 'recipients': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'incoming_activity'", 'symmetrical': 'False', 'through': "orm['askbot.ActivityAuditStatus']", 'to': "orm['auth.User']"}),
+ 'summary': ('django.db.models.fields.TextField', [], {'default': "''"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'askbot.activityauditstatus': {
+ 'Meta': {'unique_together': "(('user', 'activity'),)", 'object_name': 'ActivityAuditStatus'},
+ 'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Activity']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'askbot.anonymousanswer': {
+ 'Meta': {'object_name': 'AnonymousAnswer'},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+ 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'anonymous_answers'", 'to': "orm['askbot.Question']"}),
+ 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}),
+ 'text': ('django.db.models.fields.TextField', [], {}),
+ 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'askbot.anonymousquestion': {
+ 'Meta': {'object_name': 'AnonymousQuestion'},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+ 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}),
+ 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}),
+ 'text': ('django.db.models.fields.TextField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}),
+ 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'askbot.answer': {
+ 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['auth.User']"}),
+ 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_answers'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_answers'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_answers'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['askbot.Question']"}),
+ 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}),
+ 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'askbot.award': {
+ 'Meta': {'object_name': 'Award', 'db_table': "u'award'"},
+ 'awarded_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'badge': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_badge'", 'to': "orm['askbot.BadgeData']"}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'notified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"})
+ },
+ 'askbot.badgedata': {
+ 'Meta': {'ordering': "('slug',)", 'object_name': 'BadgeData'},
+ 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "orm['askbot.Award']", 'to': "orm['auth.User']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'})
+ },
+ 'askbot.comment': {
+ 'Meta': {'ordering': "('-added_at',)", 'object_name': 'Comment', 'db_table': "u'comment'"},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'comment': ('django.db.models.fields.CharField', [], {'max_length': '2048'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'html': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'offensive_flag_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"})
+ },
+ 'askbot.emailfeedsetting': {
+ 'Meta': {'object_name': 'EmailFeedSetting'},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'feed_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+ 'frequency': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '8'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'reported_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
+ 'subscriber': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notification_subscriptions'", 'to': "orm['auth.User']"})
+ },
+ 'askbot.favoritequestion': {
+ 'Meta': {'object_name': 'FavoriteQuestion', 'db_table': "u'favorite_question'"},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Thread']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'unused_user_favorite_questions'", 'to': "orm['auth.User']"})
+ },
+ 'askbot.markedtag': {
+ 'Meta': {'object_name': 'MarkedTag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'reason': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+ 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_selections'", 'to': "orm['askbot.Tag']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"})
+ },
+ 'askbot.post': {
+ 'Meta': {'object_name': 'Post', 'managed': 'False'},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'posts'", 'to': "orm['auth.User']"}),
+ 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_posts'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_posts'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_posts'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Post']", 'null': 'True', 'blank': 'True'}),
+ 'post_type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'self_answer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Answer']", 'null': 'True', 'blank': 'True'}),
+ 'self_question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}),
+ 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Thread']"}),
+ 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'askbot.postrevision': {
+ 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'), ('question', 'revision'))", 'object_name': 'PostRevision'},
+ 'answer': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'revisions'", 'null': 'True', 'to': "orm['askbot.Answer']"}),
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'postrevisions'", 'to': "orm['auth.User']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'question': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'revisions'", 'null': 'True', 'to': "orm['askbot.Question']"}),
+ 'revised_at': ('django.db.models.fields.DateTimeField', [], {}),
+ 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}),
+ 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}),
+ 'text': ('django.db.models.fields.TextField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'})
+ },
+ 'askbot.question': {
+ 'Meta': {'object_name': 'Question', 'db_table': "u'question'"},
+ 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': "orm['auth.User']"}),
+ 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_questions'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_questions'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_questions'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}),
+ 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'thread': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'unique': 'True', 'to': "orm['askbot.Thread']"}),
+ 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'askbot.questionview': {
+ 'Meta': {'object_name': 'QuestionView'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'viewed'", 'to': "orm['askbot.Question']"}),
+ 'when': ('django.db.models.fields.DateTimeField', [], {}),
+ 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"})
+ },
+ 'askbot.repute': {
+ 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"},
+ 'comment': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'negative': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'positive': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}),
+ 'reputation': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+ 'reputation_type': ('django.db.models.fields.SmallIntegerField', [], {}),
+ 'reputed_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'askbot.tag': {
+ 'Meta': {'ordering': "('-used_count', 'name')", 'object_name': 'Tag', 'db_table': "u'tag'"},
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_tags'", 'to': "orm['auth.User']"}),
+ 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_tags'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+ 'used_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
+ },
+ 'askbot.thread': {
+ 'Meta': {'object_name': 'Thread'},
+ 'accepted_answer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Answer']", 'null': 'True', 'blank': 'True'}),
+ 'answer_accepted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'answer_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'close_reason': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'closed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'closed_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'favorited_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'unused_favorite_threads'", 'symmetrical': 'False', 'through': "orm['askbot.FavoriteQuestion']", 'to': "orm['auth.User']"}),
+ 'favourite_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'followed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'followed_threads'", 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_activity_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_activity_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'unused_last_active_in_threads'", 'to': "orm['auth.User']"}),
+ 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'threads'", 'symmetrical': 'False', 'to': "orm['askbot.Tag']"}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}),
+ 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
+ },
+ 'askbot.vote': {
+ 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'Vote', 'db_table': "u'vote'"},
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['auth.User']"}),
+ 'vote': ('django.db.models.fields.SmallIntegerField', [], {}),
+ 'voted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'})
+ },
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}),
+ 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}),
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
+ 'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}),
+ 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
+ 'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
+ 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['askbot']
diff --git a/askbot/models/question.py b/askbot/models/question.py
index 0cff2a89..018671bc 100644
--- a/askbot/models/question.py
+++ b/askbot/models/question.py
@@ -448,7 +448,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/media/js/jquery.history.js b/askbot/skins/common/media/js/jquery.history.js
new file mode 100644
index 00000000..8d4edcd2
--- /dev/null
+++ b/askbot/skins/common/media/js/jquery.history.js
@@ -0,0 +1 @@
+window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c<f;c+=1)h[c]=str(c,i)||"null";return e=h.length===0?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]",gap=g,e}if(rep&&typeof rep=="object"){f=rep.length;for(c=0;c<f;c+=1)d=rep[c],typeof d=="string"&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e))}else for(d in i)Object.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e));return e=h.length===0?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}",gap=g,e}}"use strict",typeof Date.prototype.toJSON!="function"&&(Date.prototype.toJSON=function(a){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(a){return this.valueOf()});var JSON=window.JSON,cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;typeof JSON.stringify!="function"&&(JSON.stringify=function(a,b,c){var d;gap="",indent="";if(typeof c=="number")for(d=0;d<c;d+=1)indent+=" ";else typeof c=="string"&&(indent=c);rep=b;if(!b||typeof b=="function"||typeof b=="object"&&typeof b.length=="number")return str("",{"":a});throw new Error("JSON.stringify")}),typeof JSON.parse!="function"&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&typeof e=="object")for(c in e)Object.hasOwnProperty.call(e,c)&&(d=walk(e,c),d!==undefined?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),typeof reviver=="function"?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}(),function(a,b){"use strict";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()}(window),function(a,b){"use strict";var c=a.document,d=a.setTimeout||d,e=a.clearTimeout||e,f=a.setInterval||f,g=a.History=a.History||{};if(typeof g.initHtml4!="undefined")throw new Error("History.js HTML4 Support has already been loaded...");g.initHtml4=function(){if(typeof g.initHtml4.initialized!="undefined")return!1;g.initHtml4.initialized=!0,g.enabled=!0,g.savedHashes=[],g.isLastHash=function(a){var b=g.getHashByIndex(),c;return c=a===b,c},g.saveHash=function(a){return g.isLastHash(a)?!1:(g.savedHashes.push(a),!0)},g.getHashByIndex=function(a){var b=null;return typeof a=="undefined"?b=g.savedHashes[g.savedHashes.length-1]:a<0?b=g.savedHashes[g.savedHashes.length+a]:b=g.savedHashes[a],b},g.discardedHashes={},g.discardedStates={},g.discardState=function(a,b,c){var d=g.getHashByState(a),e;return e={discardedState:a,backState:c,forwardState:b},g.discardedStates[d]=e,!0},g.discardHash=function(a,b,c){var d={discardedHash:a,backState:c,forwardState:b};return g.discardedHashes[a]=d,!0},g.discardedState=function(a){var b=g.getHashByState(a),c;return c=g.discardedStates[b]||!1,c},g.discardedHash=function(a){var b=g.discardedHashes[a]||!1;return b},g.recycleState=function(a){var b=g.getHashByState(a);return g.discardedState(a)&&delete g.discardedStates[b],!0},g.emulated.hashChange&&(g.hashChangeInit=function(){g.checkerFunction=null;var b="",d,e,h,i;return g.isInternetExplorer()?(d="historyjs-iframe",e=c.createElement("iframe"),e.setAttribute("id",d),e.style.display="none",c.body.appendChild(e),e.contentWindow.document.open(),e.contentWindow.document.close(),h="",i=!1,g.checkerFunction=function(){if(i)return!1;i=!0;var c=g.getHash()||"",d=g.unescapeHash(e.contentWindow.document.location.hash)||"";return c!==b?(b=c,d!==c&&(h=d=c,e.contentWindow.document.open(),e.contentWindow.document.close(),e.contentWindow.document.location.hash=g.escapeHash(c)),g.Adapter.trigger(a,"hashchange")):d!==h&&(h=d,g.setHash(d,!1)),i=!1,!0}):g.checkerFunction=function(){var c=g.getHash();return c!==b&&(b=c,g.Adapter.trigger(a,"hashchange")),!0},g.intervalList.push(f(g.checkerFunction,g.options.hashChangeInterval)),!0},g.Adapter.onDomLoad(g.hashChangeInit)),g.emulated.pushState&&(g.onHashChange=function(b){var d=b&&b.newURL||c.location.href,e=g.getHashByUrl(d),f=null,h=null,i=null,j;return g.isLastHash(e)?(g.busy(!1),!1):(g.doubleCheckComplete(),g.saveHash(e),e&&g.isTraditionalAnchor(e)?(g.Adapter.trigger(a,"anchorchange"),g.busy(!1),!1):(f=g.extractState(g.getFullUrl(e||c.location.href,!1),!0),g.isLastSavedState(f)?(g.busy(!1),!1):(h=g.getHashByState(f),j=g.discardedState(f),j?(g.getHashByIndex(-2)===g.getHashByState(j.forwardState)?g.back(!1):g.forward(!1),!1):(g.pushState(f.data,f.title,f.url,!1),!0))))},g.Adapter.bind(a,"hashchange",g.onHashChange),g.pushState=function(b,d,e,f){if(g.getHashByUrl(e))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(f!==!1&&g.busy())return g.pushQueue({scope:g,callback:g.pushState,args:arguments,queue:f}),!1;g.busy(!0);var h=g.createStateObject(b,d,e),i=g.getHashByState(h),j=g.getState(!1),k=g.getHashByState(j),l=g.getHash();return g.storeState(h),g.expectedStateId=h.id,g.recycleState(h),g.setTitle(h),i===k?(g.busy(!1),!1):i!==l&&i!==g.getShortUrl(c.location.href)?(g.setHash(i,!1),!1):(g.saveState(h),g.Adapter.trigger(a,"statechange"),g.busy(!1),!0)},g.replaceState=function(a,b,c,d){if(g.getHashByUrl(c))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(d!==!1&&g.busy())return g.pushQueue({scope:g,callback:g.replaceState,args:arguments,queue:d}),!1;g.busy(!0);var e=g.createStateObject(a,b,c),f=g.getState(!1),h=g.getStateByIndex(-2);return g.discardState(f,e,h),g.pushState(e.data,e.title,e.url,!1),!0}),g.emulated.pushState&&g.getHash()&&!g.emulated.hashChange&&g.Adapter.onDomLoad(function(){g.Adapter.trigger(a,"hashchange")})},typeof g.init!="undefined"&&g.init()}(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a<b.length;a++)j(b[a]);m.intervalList=null}},m.debug=function(){(m.options.debug||!1)&&m.log.apply(m,arguments)},m.log=function(){var a=typeof c!="undefined"&&typeof c.log!="undefined"&&typeof c.log.apply!="undefined",b=d.getElementById("log"),e,f,g,h,i;a?(h=Array.prototype.slice.call(arguments),e=h.shift(),typeof c.debug!="undefined"?c.debug.apply(c,[e,h]):c.log.apply(c,[e,h])):e="\n"+arguments[0]+"\n";for(f=1,g=arguments.length;f<g;++f){i=arguments[f];if(typeof i=="object"&&typeof k!="undefined")try{i=k.stringify(i)}catch(j){}e+="\n"+i+"\n"}return b?(b.value+=e+"\n-----\n",b.scrollTop=b.scrollHeight-b.clientHeight):a||l(e),!0},m.getInternetExplorerMajorVersion=function(){var a=m.getInternetExplorerMajorVersion.cached=typeof m.getInternetExplorerMajorVersion.cached!="undefined"?m.getInternetExplorerMajorVersion.cached:function(){var a=3,b=d.createElement("div"),c=b.getElementsByTagName("i");while((b.innerHTML="<!--[if gt IE "+ ++a+"]><i></i><![endif]-->")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","&lt;").replace(">","&gt;").replace(" & "," &amp; ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file
diff --git a/askbot/skins/common/media/js/live_search.js b/askbot/skins/common/media/js/live_search.js
index 73e1453a..bb18ce3b 100644
--- a/askbot/skins/common/media/js/live_search.js
+++ b/askbot/skins/common/media/js/live_search.js
@@ -5,6 +5,7 @@ var liveSearch = function(){
var running = false;
var q_list_sel = 'question-list';//id of question listing div
var search_url = undefined;
+ var current_url = undefined;
var restart_query = function(){};
var process_query = function(){};
var render_result = function(){};
@@ -23,7 +24,9 @@ var liveSearch = function(){
sortMethod = prevSortMethod;
}
refresh_x_button();
- reset_query(sortMethod);
+ new_url = remove_from_url(search_url, 'query')
+ search_url = askbot['urls']['questions'] + 'reset_query:true/';
+ reset_query(new_url,sortMethod);
}
);
query.after(x_button);
@@ -189,23 +192,63 @@ 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, query_string){
+ var entry_html =
+ '<div class="short-summary">' +
+ '<div class="counts">' +
+ render_counter(
+ question['views'],
+ question['views_word'],
+ 'views',
+ question['views_class']
+ ) +
+ render_counter(
+ question['answers'],
+ question['answers_word'],
+ 'answers',
+ question['answers_class']
+ ) +
+ render_counter(
+ question['votes'],
+ question['votes_word'],
+ 'votes',
+ question['votes_class']
+ ) +
+ '<div style="clear:both"></div>' +
+ render_user_info(question) +
+ '</div>' +
+ render_title(question) +
+ render_tags(question['tags'], true, false, query_string) +
+ '</div>';
+ return entry_html;
+ };
+
+ var render_question_list = function(questions, query_string){
+ var output = '';
+ for (var i=0; i<questions.length; i++){
+ output += render_question(questions[i], query_string);
+ }
+ return output;
+ };
+
var render_faces = function(faces){
if (faces.length === 0){
return;
@@ -218,13 +261,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>' +
@@ -258,7 +301,7 @@ var liveSearch = function(){
return old_tags;
};
- var render_search_tags = function(tags){
+ var render_search_tags = function(tags, query_string){
var search_tags = $('#searchTags');
search_tags.children().remove();
if (tags.length == 0){
@@ -275,7 +318,7 @@ var liveSearch = function(){
tag.setLinkable(false);
tag.setDeleteHandler(
function(){
- remove_search_tag(tag_name);
+ remove_search_tag(tag_name, query_string);
}
);
search_tags.append(tag.getElement());
@@ -283,24 +326,112 @@ 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 remove_tag_from_url =function (query_string, tag){
+ url = askbot['urls']['questions'];
+ flag = false
+ author = ''
+ if (query_string !== null){
+ params = query_string.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(tag)){
+ if (new_tags !== ''){
+ new_tags += '+'
+ }
+ new_tags += escape(tags[j]);
+ }
+ }
+ if(new_tags !== ''){
+ url += 'tags:'+new_tags+'/'
+ }
+ flag = true
+ }
+ else if (params[i].substring(0, 7) == "author:"){
+ author = params[i];
+ }
+ else{
+ url += params[i] + '/';
+ }
+ }
+ }
+ if (author !== '') {
+ url += author+'/'
+ }
+ }
+ 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',
@@ -320,14 +451,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);
}
}
@@ -338,23 +469,31 @@ var liveSearch = function(){
}
};
- var change_rss_url = function(feed_url){
- if(feed_url){
- $("#ContentLeft a.rss:first").attr("href", feed_url);
- }
- }
-
- var remove_search_tag = function(tag_name){
+ var remove_search_tag = function(tag_name, query_string){
$.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
});
+ search_url = remove_tag_from_url(query_string, tag_name)
+ this.current_url = search_url
+ var context = { state:1, rand:Math.random() };
+ var title = "Questions";
+ var query = search_url;
+ History.pushState( context, title, query );
+
+ //var stateObj = { page: search_url };
+ //window.history.pushState(stateObj, "Questions", search_url);
};
- var activate_search_tags = function(){
+ var change_rss_url = function(feed_url){
+ if(feed_url){
+ $("#ContentLeft a.rss:first").attr("href", feed_url);
+ }
+ }
+
+ var activate_search_tags = function(query_string){
var search_tags = $('#searchTags .tag-left');
$.each(search_tags, function(idx, element){
var tag = new Tag();
@@ -363,7 +502,7 @@ var liveSearch = function(){
//must work after decorate & must have getName
tag.setDeleteHandler(
function(){
- remove_search_tag(tag.getName());
+ remove_search_tag(tag.getName(), query_string);
}
);
});
@@ -416,12 +555,13 @@ var liveSearch = function(){
//rename new div to old
render_paginator(data['paginator']);
set_question_count(data['question_counter']);
- render_search_tags(data['query_data']['tags']);
+ render_search_tags(data['query_data']['tags'], data['query_string']);
render_faces(data['faces']);
- render_related_tags(data['related_tags']);
- render_relevance_sort_tab();
+ 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']);
change_rss_url(data['feed_url']);
- set_active_sort_tab(sortMethod);
query.focus();
//show new div with a fadeIn effect
@@ -442,23 +582,37 @@ 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
});
prev_text = query_text;
+ var context = { state:1, rand:Math.random() };
+ var title = "Questions";
+ var query = search_url;
+ History.pushState( context, title, query );
+
+ //var stateObj = { page: search_url };
+ //window.history.pushState(stateObj, "Questions", search_url);
}
- var reset_query = function(sort_method){
+ var reset_query = function(new_url, 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
});
prev_text = '';
+ var context = { state:1, rand:Math.random() };
+ var title = "Questions";
+ var query = new_url;
+ History.pushState( context, title, query );
+
+ //var stateObj = { page: new_url };
+ //window.history.pushState(stateObj, "Questions", new_url);
}
var refresh_main_page = function(){
@@ -468,6 +622,15 @@ var liveSearch = function(){
dataType: 'json',
success: render_main_page_result
});
+
+
+ var context = { state:1, rand:Math.random() };
+ var title = "Questions";
+ var query = askbot['urls']['questions'];
+ History.pushState( context, title, query );
+
+ //var stateObj = { page: askbot['urls']['questions'] };
+ //window.history.pushState(stateObj, "Questions", askbot['urls']['questions']);
};
return {
@@ -475,13 +638,13 @@ 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');
search_url = askbot['urls']['questions'];
render_result = render_main_page_result;
-
+ this.current_url = search_url + query_string
process_query = function(){
if (prev_text.length === 0 && showSortByRelevance){
if (sortMethod === 'activity-desc'){
@@ -489,16 +652,37 @@ var liveSearch = function(){
sortMethod = 'relevance-desc';
}
}
+ if (this.current_url !== undefined){
+ search_url = '/'; //resetting search_url every times
+ query_string = this.current_url
+ }
+ else{
+ 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] + '/';
+ }
+ }
+ }
send_query(cur_text, sortMethod);
};
restart_query = function() {
reset_sort_method();
refresh_x_button();
- reset_query(sortMethod);
+ new_url = remove_from_url(search_url, 'query')
+ search_url = askbot['urls']['questions'] + 'reset_query:true/';
+ reset_query(new_url, sortMethod);
running = true;
};
- activate_search_tags();
+ activate_search_tags(query_string);
main_page_search_listen();
} else {
query = $('input#id_title.questionTitleInput');
diff --git a/askbot/skins/common/media/js/modernizr.custom.js b/askbot/skins/common/media/js/modernizr.custom.js
new file mode 100644
index 00000000..cf1d0196
--- /dev/null
+++ b/askbot/skins/common/media/js/modernizr.custom.js
@@ -0,0 +1,4 @@
+/* Modernizr 2.0.6 (Custom Build) | MIT & BSD
+ * Build: http://www.modernizr.com/download/#-history-iepp-cssclasses-load
+ */
+;window.Modernizr=function(a,b,c){function x(a,b){return!!~(""+a).indexOf(b)}function w(a,b){return typeof a===b}function v(a,b){return u(prefixes.join(a+";")+(b||""))}function u(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l,m=Object.prototype.toString,n={},o={},p={},q=[],r,s={}.hasOwnProperty,t;!w(s,c)&&!w(s.call,c)?t=function(a,b){return s.call(a,b)}:t=function(a,b){return b in a&&w(a.constructor.prototype[b],c)},n.history=function(){return!!a.history&&!!history.pushState};for(var y in n)t(n,y)&&(r=y.toLowerCase(),e[r]=n[y](),q.push((e[r]?"":"no-")+r));u(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b<g)a.createElement(f[b])}a.iepp=a.iepp||{};var d=a.iepp,e=d.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",f=e.split("|"),g=f.length,h=new RegExp("(^|\\s)("+e+")","gi"),i=new RegExp("<(/*)("+e+")","gi"),j=/^\s*[\{\}]\s*$/,k=new RegExp("(^|[^\\n]*?\\s)("+e+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),l=b.createDocumentFragment(),m=b.documentElement,n=m.firstChild,o=b.createElement("body"),p=b.createElement("style"),q=/print|all/,r;d.getCSS=function(a,b){if(a+""===c)return"";var e=-1,f=a.length,g,h=[];while(++e<f){g=a[e];if(g.disabled)continue;b=g.media||b,q.test(b)&&h.push(d.getCSS(g.imports,b),g.cssText),b="all"}return h.join("")},d.parseCSS=function(a){var b=[],c;while((c=k.exec(a))!=null)b.push(((j.exec(c[1])?"\n":c[1])+c[2]+c[3]).replace(h,"$1.iepp_$2")+c[4]);return b.join("\n")},d.writeHTML=function(){var a=-1;r=r||b.body;while(++a<g){var c=b.getElementsByTagName(f[a]),d=c.length,e=-1;while(++e<d)c[e].className.indexOf("iepp_")<0&&(c[e].className+=" iepp_"+f[a])}l.appendChild(r),m.appendChild(o),o.className=r.className,o.id=r.id,o.innerHTML=r.innerHTML.replace(i,"<$1font")},d._beforePrint=function(){p.styleSheet.cssText=d.parseCSS(d.getCSS(b.styleSheets,"all")),d.writeHTML()},d.restoreHTML=function(){o.innerHTML="",m.removeChild(o),m.appendChild(r)},d._afterPrint=function(){d.restoreHTML(),p.styleSheet.cssText=""},s(b),s(l);d.disablePP||(n.insertBefore(p,n.firstChild),p.media="print",p.className="iepp-printshim",a.attachEvent("onbeforeprint",d._beforePrint),a.attachEvent("onafterprint",d._afterPrint))}(a,b),e._version=d,g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+q.join(" "):"");return e}(this,this.document),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css";if(!a.e&&(w||r)){var e=function(a){m(function(){if(!d)try{a.sheet.cssRules.length?(d=1,j()):e(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,m(function(){j()},0)):e(a)}},0)};e(c)}else c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload();m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return Object(a)===a},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h<e;h++)g=F[b[h]],g&&(f=g(f));for(h=0;h<c;h++)f=E[h](f);return f}function e(a,b,e,g,h){var i=f(a),j=i.autoCallback;if(!i.bypass){b&&(b=D(b)?b:b[a]||b[g]||b[a.split("/").pop().split("?")[0]]);if(i.instead)return i.instead(a,b,e,g,h);e.load(i.url,i.forceCSS||!i.forceJS&&/css$/.test(i.url)?"c":c,i.noexec),(D(b)||D(j))&&e.load(function(){d(),b&&b(i.origUrl,h,g),j&&j(i.origUrl,h,g)})}}function b(a,b){function c(a){if(C(a))e(a,h,b,0,d);else if(B(a))for(i in a)a.hasOwnProperty(i)&&e(a[i],h,b,i,d)}var d=!!a.test,f=d?a.yep:a.nope,g=a.load||a.both,h=a.callback,i;c(f),c(g),a.complete&&b.load(a.complete)}var g,h,i=this.yepnope.loader;if(C(a))e(a,0,i,0);else if(A(a))for(g=0;g<a.length;g++)h=a[g],C(h)?e(h,0,i,0):A(h)?H(h):B(h)&&b(h,i);else B(a)&&b(a,i)},H.addPrefix=function(a,b){F[a]=b},H.addFilter=function(a){E.push(a)},H.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",G=function(){b.removeEventListener("DOMContentLoaded",G,0),b.readyState="complete"},0)),a.yepnope=d()}(this,this.document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
diff --git a/askbot/skins/common/media/js/utils.js b/askbot/skins/common/media/js/utils.js
index 0afd03a7..4d8cb92d 100644
--- a/askbot/skins/common/media/js/utils.js
+++ b/askbot/skins/common/media/js/utils.js
@@ -356,9 +356,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);
}
@@ -366,7 +398,7 @@ Tag.prototype.createDom = function(){
this._inner_element.attr('rel', 'tag');
if (this._title === null){
this.setTitle(
- interpolate(gettext("see questions tagged '%s'"), [this.getName()])
+ interpolate(gettext("see questions tagged '%s'"), [this.getName()])
);
}
this._inner_element.attr('title', this._title);
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 5efe3860..fffbebaa 100644
--- a/askbot/skins/common/templates/widgets/search_bar.html
+++ b/askbot/skins/common/templates/widgets/search_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">
<input type="submit" value="" name="search" class="searchBtn" />
@@ -36,7 +36,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 901d4b3f..f7005d3c 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 %}
@@ -557,17 +553,17 @@ answer {% if answer.accepted() %}accepted-answer{% endif %} {% if answer.author_
{% endif %}
{%- endmacro -%}
-{%- macro paginator(p, position='left') -%}{# p is paginator context dictionary #}
+{%- macro paginator(p, position='left', active_tab='') -%}{# p is paginator context dictionary #}
{% spaceless %}
{% 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_
{% 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_
{% 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/meta/bottom_scripts.html b/askbot/skins/default/templates/meta/bottom_scripts.html
index 0df25e7c..c506df58 100644
--- a/askbot/skins/default/templates/meta/bottom_scripts.html
+++ b/askbot/skins/default/templates/meta/bottom_scripts.html
@@ -37,6 +37,8 @@
src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"
{% endif %}
></script>
+<!-- History.js -->
+<script defer src="{{"/js/jquery.history.js"|media }}"></script>
<script type='text/javascript' src="{{"/js/utils.js"|media }}"></script>
<script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script>
{% if settings.ENABLE_MATHJAX %}
@@ -52,6 +54,21 @@
{% if active_tab != "tags" and active_tab != "users" %}
{# start asking question with title from search query #}
$(document).ready(function(){
+ if (Modernizr.history) {
+ // history management works!
+ } else {
+ // no history support :(
+ hash = unescape(window.location.hash).replace('#','').split("?")[0]
+ if (hash.substring(0,11)==askbot['urls']['questions']){
+ url = hash
+ }else{
+ url = askbot['urls']['questions']+hash
+ }
+ if (hash !== ''){
+ window.location = 'http://'+window.location.host+url
+ }
+ }
+
$('#nav_ask').click(
function(){
var starting_title = $('#keywords').attr('value');
diff --git a/askbot/skins/default/templates/meta/html_head_javascript.html b/askbot/skins/default/templates/meta/html_head_javascript.html
index f960d11d..2d453215 100644
--- a/askbot/skins/default/templates/meta/html_head_javascript.html
+++ b/askbot/skins/default/templates/meta/html_head_javascript.html
@@ -1,3 +1,4 @@
+<script src="{{"/js/modernizr.custom.js"|media }}"></script>
<script type="text/javascript">
var askbot = {};
askbot['data'] = {};
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/widgets/logo.html b/askbot/skins/default/templates/widgets/logo.html
index 6d4d86d2..1b251432 100644
--- a/askbot/skins/default/templates/widgets/logo.html
+++ b/askbot/skins/default/templates/widgets/logo.html
@@ -1,4 +1,5 @@
-<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>
+ 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 f5c3c962..554dc7f9 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 3b6d2182..bed34d44 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">{% trans %}Please ask your question here{% endtrans %}</div>
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 2c3d143d..708877b3 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 b75eafe2..18fe24e2 100644
--- a/askbot/views/readers.py
+++ b/askbot/views/readers.py
@@ -65,18 +65,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:
@@ -108,7 +139,7 @@ def questions(request):
paginator = Paginator(qs, search_state.page_size)
if paginator.num_pages < search_state.page:
- raise Http404
+ search_state.page = 1
page = paginator.page(search_state.page)
@@ -122,8 +153,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
@@ -144,6 +176,14 @@ def questions(request):
# Format the url with the QueryDict
context_feed_url = '/feeds/rss/?%s' % rss_query_dict.urlencode()
+ reset_method_count = 0
+ if search_state.query:
+ reset_method_count += 1
+ if search_state.tags:
+ reset_method_count += 1
+ if meta_data.get('author_name',None):
+ reset_method_count += 1
+
if request.is_ajax():
q_count = paginator.count
@@ -167,10 +207,11 @@ def questions(request):
if q_count > search_state.page_size:
paginator_tpl = get_template('main_page/paginator.html', request)
#todo: remove this patch on context after all templates are moved to jinja
- paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort
+ #paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort
data = {
'context': extra_tags.cnprog_paginator(paginator_context),
- 'questions_count': q_count
+ 'questions_count': q_count,
+ 'page_size' : search_state.page_size,
}
paginator_html = paginator_tpl.render(Context(data))
else:
@@ -192,6 +233,9 @@ def questions(request):
'related_tags': list(),
'faces': list(),
'feed_url': context_feed_url,
+ 'query_string': search_state.query_string(),
+ 'parameters': search_state.make_parameters(),
+ 'page_size' : search_state.page_size,
}
badge_levels = dict(const.BADGE_TYPE_CHOICES)
@@ -228,24 +272,18 @@ def questions(request):
'context': paginator_context,
'language_code': translation.get_language(),
'query': search_state.query,
+ 'reset_method_count': reset_method_count,
+ 'query_string': search_state.query_string(),
}
questions_html = questions_tpl.render(Context(data))
+ #import pdb; pdb.set_trace()
ajax_data['questions'] = questions_html.replace('\n','')
return HttpResponse(
simplejson.dumps(ajax_data),
mimetype = 'application/json'
)
- reset_method_count = 0
- if search_state.query:
- reset_method_count += 1
- if search_state.tags:
- reset_method_count += 1
- if meta_data.get('author_name',None):
- reset_method_count += 1
-
-
template_data = {
'active_tab': 'questions',
'author_name' : meta_data.get('author_name',None),
@@ -257,6 +295,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,
@@ -271,6 +310,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,
}