diff options
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("<","<").replace(">",">").replace(" & "," & ")}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">× ' + 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">× ' ~ - 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}} ▲</span></a> {% elif sort == key_name + "-desc" %}{# "best first" #} <a id="by_{{key_name}}" - href="?sort={{key_name}}-asc" + href={% url questions %}{{ query_string|replace_in_url("sort:"+key_name+"-asc") }} class="rev on" title="{{asc_tooltip}}"><span>{{label}} ▼</span></a> {% else %}{# default, when other button is active #} <a id="by_{{key_name}}" - href="?sort={{key_name}}-desc" + href={% url questions %}{{ query_string|replace_in_url("sort:"+key_name+"-desc") }} class="off" title="{{desc_tooltip}}"><span>{{label}}</span></a> {% endif %} @@ -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 %}"> « {% 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 %} »</a></span> + <span class="next"><a href="{% if active_tab == "questions" %}{% url questions%}{% endif %}{{p.base_url}}page{% if active_tab == "questions" %}:{%else%}={%endif%}{{ p.next }}/{{ p.extend_url }}" title="{% trans %}next page{% endtrans %}">{% trans %}next page{% endtrans %} »</a></span> {% endif %} </div> {% endif %} @@ -602,19 +598,19 @@ answer {% if answer.accepted() %}accepted-answer{% endif %} {% if answer.author_ {% if p.page_size == 10 %} <span class="curr">10</span> {% else %} - <span class="page"><a href="{{p.base_url}}page_size=10">10</a></span> + <span class="page"><a href="{% url questions %}{{p.base_url}}page_size:10/">10</a></span> {% endif %} {% if p.page_size == 30 %} <span class="curr">30</span> {% else %} - <span class="page"><a href="{{p.base_url}}page_size=30">30</a></span> + <span class="page"><a href="{% url questions %}{{p.base_url}}page_size:30/">30</a></span> {% endif %} {% if p.page_size == 50 %} <span class="curr">50</span> {% else %} - <span class="page"><a href="{{p.base_url}}page_size=50">50</a></span> + <span class="page"><a href="{% url questions %}{{p.base_url}}page_size:50/">50</a></span> {% endif %} </div> {% endif %} diff --git a/askbot/skins/default/templates/main_page/headline.html b/askbot/skins/default/templates/main_page/headline.html index 2ba156c8..444787e6 100644 --- a/askbot/skins/default/templates/main_page/headline.html +++ b/askbot/skins/default/templates/main_page/headline.html @@ -23,16 +23,16 @@ <p class="search-tips"><b>{% trans %}Search tips:{% endtrans %}</b> {% if reset_method_count > 1 %} {% if author_name %} - <a href="{% url questions %}?reset_author=true">{% trans %}reset author{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('author') }}">{% trans %}reset author{% endtrans %}</a> {% endif %} {% if search_tags %}{% if author_name and query %}, {% elif author_name %}{% trans %} or {% endtrans %}{% endif %} - <a href="{% url questions %}?reset_tags=true">{% trans %}reset tags{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('tags') }}">{% trans %}reset tags{% endtrans %}</a> {% endif %} {% if query %}{% trans %} or {% endtrans %} - <a href="{% url questions %}?start_over=true">{% trans %}start over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}start over{% endtrans %}</a> {% endif %} {% else %} - <a href="{% url questions %}?start_over=true">{% trans %}start over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}start over{% endtrans %}</a> {% endif %} {% trans %} - to expand, or dig in by adding more tags and revising the query.{% endtrans %} </p> diff --git a/askbot/skins/default/templates/main_page/javascript.html b/askbot/skins/default/templates/main_page/javascript.html index e35113dd..e726d5b4 100644 --- a/askbot/skins/default/templates/main_page/javascript.html +++ b/askbot/skins/default/templates/main_page/javascript.html @@ -5,7 +5,7 @@ $(document).ready(function(){ /*var on_tab = '#nav_questions'; $(on_tab).attr('className','on');*/ - liveSearch().init('main_page'); + liveSearch().init('main_page', '{{query_string}}'); Hilite.exact = false; Hilite.elementid = "question-list"; Hilite.debug_referrer = location.href; @@ -48,3 +48,19 @@ <script type='text/javascript' src='{{"/js/tag_selector.js"|media}}'></script> {% endif %} <script type="text/javascript" src="{{"/js/live_search.js"|media}}"></script> +{% if active_tab != "tags" and active_tab != "users" %} +<script> +$("form#searchForm").submit(function(event) { + event.preventDefault(); + form_action = $("form#searchForm").attr('action') + query = $("input#keywords").attr('value').split(' ').join('+') + $("input#keywords").attr('value', '') + $("input#searchButton").attr('value', '') + form_action += 'section:{{parameters.scope}}/sort:{{parameters.sort}}/' + + 'query:' + query + '/search:search/' + + '{% if parameters.tags %}tags:{{parameters.tags}}/{% endif %}' + + '{% if parameters.author %}author:{{parameters.author}}/{% endif %}' + window.location.href = form_action; +}); +</script> +{% endif %} diff --git a/askbot/skins/default/templates/main_page/nothing_found.html b/askbot/skins/default/templates/main_page/nothing_found.html index e6d65ea5..8e7624cc 100644 --- a/askbot/skins/default/templates/main_page/nothing_found.html +++ b/askbot/skins/default/templates/main_page/nothing_found.html @@ -13,16 +13,16 @@ {% trans %}You can expand your search by {% endtrans %} {% if reset_method_count > 1 %} {% if author_name %} - <a href="{% url questions %}?reset_author=true">{% trans %}resetting author{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('author') }}">{% trans %}resetting author{% endtrans %}</a> {% endif %} {% if search_tags %}{% if author_name and query %}, {% elif author_name %}{% trans %} or {% endtrans %}{% endif %} - <a href="{% url questions %}?reset_tags=true">{% trans %}resetting tags{% endtrans %}</a> + <a href="{% url questions %}{{ query_string|remove_from_url('tags') }}">{% trans %}resetting tags{% endtrans %}</a> {% endif %} {% if query %}{% trans %} or {% endtrans %} - <a href="{% url questions %}?start_over=true">{% trans %}starting over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}starting over{% endtrans %}</a> {% endif %} {% else %} - <a href="{% url questions %}?start_over=true">{% trans %}starting over{% endtrans %}</a> + <a href="{% url questions %}">{% trans %}starting over{% endtrans %}</a> {% endif %} </p> {% endif %} diff --git a/askbot/skins/default/templates/main_page/paginator.html b/askbot/skins/default/templates/main_page/paginator.html index b7fd9501..6766261b 100644 --- a/askbot/skins/default/templates/main_page/paginator.html +++ b/askbot/skins/default/templates/main_page/paginator.html @@ -1,7 +1,7 @@ {% import "macros.html" as macros %} -{% if questions_count > 10 %}{# todo: remove magic number #} +{% if questions_count > page_size %}{# todo: remove magic number #} <div id="pager" class="pager"> - {{ macros.paginator(context|setup_paginator, position='left') }} + {{ macros.paginator(context|setup_paginator, position='left', active_tab=active_tab) }} {{ macros.pagesize_switch(context, position='right') }} <div class="clean"></div> </div> diff --git a/askbot/skins/default/templates/main_page/questions_loop.html b/askbot/skins/default/templates/main_page/questions_loop.html index 1a920516..8e6c0492 100644 --- a/askbot/skins/default/templates/main_page/questions_loop.html +++ b/askbot/skins/default/templates/main_page/questions_loop.html @@ -1,7 +1,7 @@ {% import "macros.html" as macros %} {% cache 0 "questions" questions search_tags scope sort query context.page context.page_size language_code %} {% for question in questions.object_list %} - {{macros.question_summary(question)}} + {{macros.question_summary(question, query_string=query_string)}} {% endfor %} {% endcache %} {# comment todo: fix css here #} diff --git a/askbot/skins/default/templates/main_page/tab_bar.html b/askbot/skins/default/templates/main_page/tab_bar.html index 5ed6e5b5..1802640f 100644 --- a/askbot/skins/default/templates/main_page/tab_bar.html +++ b/askbot/skins/default/templates/main_page/tab_bar.html @@ -1,4 +1,5 @@ {% import "macros.html" as macros %} +{% load extra_filters %} {% cache 0 "scope_sort_tabs" search_tags request.user scope sort query context.page context.page_size language_code %} <a class="rss" {% if feed_url %} @@ -19,11 +20,11 @@ {% if query %} <a id="by_relevance" {% if sort == "relevance-desc" %} - href="?sort=relevance-desc" + href="{% url questions %}{{ query_string|replace_in_url("sort:relevance-desc") }}" class="on" title="{{asc_relevance_tooltip}}"><span>{{relevance_label}} ▼</span> {% else %} - href="?sort=relevance-desc" + href="{% url questions %}{{ query_string|replace_in_url("sort:relevance-desc") }}" class="off" title="{{desc_relevance_tooltip}}"><span>{{relevance_label}}</span> {% endif %} @@ -43,7 +44,8 @@ label = gettext('by date'), asc_tooltip = gettext('click to see the oldest questions'), desc_tooltip = gettext('click to see the newest questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} {{macros.reversible_sort_button( @@ -51,7 +53,8 @@ label = gettext('by activity'), asc_tooltip = gettext('click to see the least recently updated questions'), desc_tooltip = gettext('click to see the most recently updated questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} {{macros.reversible_sort_button( @@ -59,7 +62,8 @@ label = gettext('by answers'), asc_tooltip = gettext('click to see the least answered questions'), desc_tooltip = gettext('click to see the most answered questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} {{macros.reversible_sort_button( @@ -67,7 +71,8 @@ label = gettext('by votes'), asc_tooltip = gettext('click to see least voted questions'), desc_tooltip = gettext('click to see most voted questions'), - current_sort_method = sort + current_sort_method = sort, + query_string = query_string, ) }} diff --git a/askbot/skins/default/templates/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">× ' ~ 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&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&' % 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, } |