diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2009-08-05 22:50:08 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2009-08-05 22:50:08 -0400 |
commit | ef8f66ba6c7a22c277c6315df8040365b5684e6c (patch) | |
tree | 53397ba83b39bbfc9d567840b68c251e6cdd8d2f /forum | |
parent | 8ddd362a54981c4fa6434792723cdf04a77c6f32 (diff) | |
download | askbot-ef8f66ba6c7a22c277c6315df8040365b5684e6c.tar.gz askbot-ef8f66ba6c7a22c277c6315df8040365b5684e6c.tar.bz2 askbot-ef8f66ba6c7a22c277c6315df8040365b5684e6c.zip |
added anonymous posting, per-question subscription and fixes by Pothers and some more, see development.log
Diffstat (limited to 'forum')
-rw-r--r-- | forum/admin.py | 5 | ||||
-rw-r--r-- | forum/feed.py | 14 | ||||
-rw-r--r-- | forum/forms.py | 42 | ||||
-rw-r--r-- | forum/management/commands/once_award_badges.py | 1 | ||||
-rw-r--r-- | forum/models.py | 159 | ||||
-rw-r--r-- | forum/templatetags/extra_tags.py | 4 | ||||
-rw-r--r-- | forum/user.py | 1 | ||||
-rw-r--r-- | forum/views.py | 261 |
8 files changed, 391 insertions, 96 deletions
diff --git a/forum/admin.py b/forum/admin.py index 438a99e7..482da048 100644 --- a/forum/admin.py +++ b/forum/admin.py @@ -4,6 +4,9 @@ from django.contrib import admin from models import * +class AnonymousQuestionAdmin(admin.ModelAdmin): + """AnonymousQuestion admin class""" + class QuestionAdmin(admin.ModelAdmin): """Question admin class""" @@ -68,4 +71,4 @@ admin.site.register(Repute, ReputeAdmin) admin.site.register(Activity, ActivityAdmin) admin.site.register(Book, BookAdmin) admin.site.register(BookAuthorInfo, BookAuthorInfoAdmin) -admin.site.register(BookAuthorRss, BookAuthorRssAdmin)
\ No newline at end of file +admin.site.register(BookAuthorRss, BookAuthorRssAdmin) diff --git a/forum/feed.py b/forum/feed.py index 6374ba71..373f8a87 100644 --- a/forum/feed.py +++ b/forum/feed.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python #encoding:utf-8 #------------------------------------------------------------------------------- # Name: Syndication feed class for subsribtion @@ -13,16 +13,16 @@ from django.contrib.syndication.feeds import Feed, FeedDoesNotExist from django.utils.translation import ugettext as _ from models import Question +import settings class RssLastestQuestionsFeed(Feed): - title = _('site title') + _(' - ') + _('site slogan') + _(' - ')+ _('latest questions') - #EDIT!!! - link = 'http://where.com/questions/' - description = _('meta site content') + title = settings.APP_TITLE + _(' - ')+ _('latest questions') + link = settings.APP_URL + '/' + _('questions/') + description = settings.APP_DESCRIPTION #ttl = 10 - copyright = _('copyright message') + copyright = settings.APP_COPYRIGHT def item_link(self, item): - return '/questions/%s/' % item.id + return self.link + '%s/' % item.id def item_author_name(self, item): return item.author.username diff --git a/forum/forms.py b/forum/forms.py index 9d866720..59d0d620 100644 --- a/forum/forms.py +++ b/forum/forms.py @@ -43,7 +43,8 @@ class TagNamesField(forms.CharField): self.widget = forms.TextInput(attrs={'size' : 50, 'autocomplete' : 'off'}) self.max_length = 255 self.label = _('tags') - self.help_text = _('please use space to separate tags (this enables autocomplete feature)') + #self.help_text = _('please use space to separate tags (this enables autocomplete feature)') + self.help_text = _('Tags are short keywords, with no spaces within. Up to five tags can be used.') self.initial = '' def clean(self, value): @@ -74,6 +75,10 @@ class WikiField(forms.BooleanField): self.label = _('community wiki') self.help_text = _('if you choose community wiki option, the question and answer do not generate points and name of author will not be shown') +class EmailNotifyField(forms.BooleanField): + def __init__(self, *args, **kwargs): + super(EmailNotifyField, self).__init__(*args, **kwargs) + self.required = False class SummaryField(forms.CharField): def __init__(self, *args, **kwargs): @@ -94,18 +99,28 @@ class AskForm(forms.Form): user = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) email = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) - - class AnswerForm(forms.Form): text = EditorField() wiki = WikiField() openid = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 40, 'class':'openid-input'})) user = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) email = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) - def __init__(self, question, *args, **kwargs): + email_notify = EmailNotifyField() + def __init__(self, question, user, *args, **kwargs): super(AnswerForm, self).__init__(*args, **kwargs) + self.fields['email_notify'].widget.attrs['id'] = 'question-subscribe-updates'; if question.wiki: self.fields['wiki'].initial = True + if user.is_authenticated(): + try: + feed = EmailFeed.objects.get(feed_id=question.id, subscriber_id=user.id) + if feed.subscriber == user and feed.content == question: + self.fields['email_notify'].initial = True + return + except EmailFeed.DoesNotExist: + pass + self.fields['email_notify'].initial = False + class CloseForm(forms.Form): reason = forms.ChoiceField(choices=CLOSE_REASONS) @@ -181,13 +196,14 @@ class EditUserForm(forms.Form): def clean_email(self): """For security reason one unique email in database""" if self.user.email != self.cleaned_data['email']: - if 'email' in self.cleaned_data: - try: - user = User.objects.get(email = self.cleaned_data['email']) - except User.DoesNotExist: - return self.cleaned_data['email'] - except User.MultipleObjectsReturned: + #todo dry it, there is a similar thing in openidauth + if settings.EMAIL_UNIQUE == True: + if 'email' in self.cleaned_data: + try: + user = User.objects.get(email = self.cleaned_data['email']) + except User.DoesNotExist: + return self.cleaned_data['email'] + except User.MultipleObjectsReturned: + raise forms.ValidationError(_('this email has already been registered, please use another one')) raise forms.ValidationError(_('this email has already been registered, please use another one')) - raise forms.ValidationError(_('this email has already been registered, please use another one')) - else: - return self.cleaned_data['email'] + return self.cleaned_data['email'] diff --git a/forum/management/commands/once_award_badges.py b/forum/management/commands/once_award_badges.py index 447e8971..03982c79 100644 --- a/forum/management/commands/once_award_badges.py +++ b/forum/management/commands/once_award_badges.py @@ -12,6 +12,7 @@ # Licence: GPL V2 #------------------------------------------------------------------------------- +from datetime import datetime, date from django.db import connection from django.shortcuts import get_object_or_404 from django.contrib.contenttypes.models import ContentType diff --git a/forum/models.py b/forum/models.py index b966ccb0..a6cb1697 100644 --- a/forum/models.py +++ b/forum/models.py @@ -12,16 +12,40 @@ from django.template.defaultfilters import slugify from django.db.models.signals import post_delete, post_save, pre_save from django.utils.translation import ugettext as _ import django.dispatch +import settings from forum.managers import * from const import * +class EmailFeed(models.Model): + #subscription key for unsubscribe by visiting emailed link + key = models.CharField(max_length=32) + #generic relation with feed content (i.e. question or tags) + feed_content_type = models.ForeignKey(ContentType,related_name='content_emailfeed') + feed_id = models.PositiveIntegerField() + content = generic.GenericForeignKey('feed_content_type','feed_id') + #generic relation with owner - either nameless email or User + subscriber_content_type = models.ForeignKey(ContentType,related_name='subscriber_emailfeed') + subscriber_id = models.PositiveIntegerField() + subscriber = generic.GenericForeignKey('subscriber_content_type','subscriber_id') + added_at = models.DateTimeField(default=datetime.datetime.now) + reported_at = models.DateTimeField(default=datetime.datetime.now) + + #getter functions rely on implementations of similar functions in content + #of subscriber objects + def get_update_summary(self): + return self.content.get_update_summary(last_reported_at = self.reported_at,recipient_email = self.get_email()) + + def get_email(self): + return self.subscriber.email + class Tag(models.Model): name = models.CharField(max_length=255, unique=True) created_by = models.ForeignKey(User, related_name='created_tags') deleted = models.BooleanField(default=False) deleted_at = models.DateTimeField(null=True, blank=True) deleted_by = models.ForeignKey(User, null=True, blank=True, related_name='deleted_tags') + email_feeds = generic.GenericRelation(EmailFeed) # Denormalised data used_count = models.PositiveIntegerField(default=0) @@ -131,6 +155,7 @@ class Question(models.Model): comments = generic.GenericRelation(Comment) votes = generic.GenericRelation(Vote) flagged_items = generic.GenericRelation(FlaggedItem) + email_feeds = generic.GenericRelation(EmailFeed) objects = QuestionManager() @@ -173,7 +198,10 @@ class Question(models.Model): attr = CONST['deleted'] else: attr = None - return u'%s %s' % (self.title, attr) if attr is not None else self.title + if attr is not None: + return u'%s %s' % (self.title, attr) + else: + return self.title def get_revision_url(self): return reverse('question_revisions', args=[self.id]) @@ -181,6 +209,57 @@ class Question(models.Model): def get_latest_revision(self): return self.revisions.all()[0] + def get_update_summary(self,last_reported_at=None,recipient_email=''): + edited = False + if self.last_edited_at and self.last_edited_at > last_reported_at: + if self.last_edited_by.email != recipient_email: + edited = True + comments = [] + for comment in self.comments.all(): + if comment.added_at > last_reported_at and comment.user.email != recipient_email: + comments.append(comment) + new_answers = [] + answer_comments = [] + modified_answers = [] + for answer in self.answers.all(): + if (answer.added_at > last_reported_at): + new_answers.append(answer) + if (answer.last_edited_at + and answer.last_edited_at > last_reported_at + and answer.last_edited_by.email != recipient_email): + modified_answers.append(answer) + for comment in answer.comments.all(): + if comment.added_at > last_reported_at and comment.user.email != recipient_email: + answer_comments.append(comment) + if edited or comments or new_answers or modified_answers or answer_comments: + import sets + out = [] + if edited: + out.append(_('%(author)s modified the question') % {'author':self.last_edited_by.username}) + if new_answers: + names = sets.Set(map(lambda x: x.author.username,new_answers)) + people = ', '.join(names) + out.append(_('%(people)s posted %(new_answer_count)s new answers') \ + % {'new_answer_count':len(new_answers),'people':people}) + if comments: + names = sets.Set(map(lambda x: x.user.username,comments)) + people = ', '.join(names) + out.append(_('%(people)s commented the question') % {'people':people}) + if answer_comments: + names = sets.Set(map(lambda x: x.user.username,answer_comments)) + people = ', '.join(names) + if len(answer_comments) > 1: + out.append(_('%(people)s commented answers') % {'people':people}) + else: + out.append(_('%(people)s commented the answer') % {'people':people}) + url = settings.APP_URL + self.get_absolute_url() + retval = '<a href="%s">%s</a>:<br>\n' % (url,self.title) + out = map(lambda x: '<li>' + x + '</li>',out) + retval += '<ul>' + '\n'.join(out) + '</ul><br>\n' + return retval + else: + return None + def __unicode__(self): return self.title @@ -219,6 +298,44 @@ class QuestionRevision(models.Model): def __unicode__(self): return u'revision %s of %s' % (self.revision, self.title) +class AnonymousAnswer(models.Model): + question = models.ForeignKey(Question, related_name='anonymous_answers') + session_key = models.CharField(max_length=40) #session id for anonymous questions + wiki = models.BooleanField(default=False) + added_at = models.DateTimeField(default=datetime.datetime.now) + ip_addr = models.IPAddressField(max_length=21) #allow high port numbers + author = models.ForeignKey(User,null=True) + text = models.TextField() + summary = models.CharField(max_length=180) + + def publish(self,user): + from forum.views import create_new_answer + added_at = datetime.datetime.now() + print user.id + create_new_answer(question=self.question,wiki=self.wiki, + added_at=added_at,text=self.text, + author=user) + self.delete() + +class AnonymousQuestion(models.Model): + title = models.CharField(max_length=300) + session_key = models.CharField(max_length=40) #session id for anonymous questions + text = models.TextField() + summary = models.CharField(max_length=180) + tagnames = models.CharField(max_length=125) + wiki = models.BooleanField(default=False) + added_at = models.DateTimeField(default=datetime.datetime.now) + ip_addr = models.IPAddressField(max_length=21) #allow high port numbers + author = models.ForeignKey(User,null=True) + + def publish(self,user): + from forum.views import create_new_question + added_at = datetime.datetime.now() + create_new_question(title=self.title, author=user, added_at=added_at, + wiki=self.wiki, tagnames=self.tagnames, + summary=self.summary, text=self.text) + self.delete() + class Answer(models.Model): question = models.ForeignKey(Question, related_name='answers') author = models.ForeignKey(User, related_name='answers') @@ -447,6 +564,13 @@ class BookAuthorRss(models.Model): class Meta: db_table = u'book_author_rss' +class AnonymousEmail(models.Model): + #validation key, if used + key = models.CharField(max_length=32) + email = models.EmailField(null=False,unique=True) + isvalid = models.BooleanField(default=False) + feeds = generic.GenericRelation(EmailFeed) + # User extend properties QUESTIONS_PER_PAGE_CHOICES = ( (10, u'10'), @@ -454,8 +578,11 @@ QUESTIONS_PER_PAGE_CHOICES = ( (50, u'50'), ) +User.add_to_class('email_isvalid', models.BooleanField(default=False)) +User.add_to_class('email_key', models.CharField(max_length=16, null=True)) User.add_to_class('reputation', models.PositiveIntegerField(default=1)) User.add_to_class('gravatar', models.CharField(max_length=32)) +User.add_to_class('email_feeds', generic.GenericRelation(EmailFeed)) User.add_to_class('favorite_questions', models.ManyToManyField(Question, through=FavoriteQuestion, related_name='favorited_by')) @@ -480,11 +607,14 @@ edit_question_or_answer = django.dispatch.Signal(providing_args=["instance", "mo delete_post_or_answer = django.dispatch.Signal(providing_args=["instance", "deleted_by"]) mark_offensive = django.dispatch.Signal(providing_args=["instance", "mark_by"]) user_updated = django.dispatch.Signal(providing_args=["instance", "updated_by"]) +user_logged_in = django.dispatch.Signal(providing_args=["session"]) + + def get_messages(self): - messages = [] - for m in self.message_set.all(): - messages.append(m.message) - return messages + messages = [] + for m in self.message_set.all(): + messages.append(m.message) + return messages def delete_messages(self): self.message_set.all().delete() @@ -632,6 +762,24 @@ def record_user_full_updated(instance, **kwargs): activity = Activity(user=instance, active_at=datetime.datetime.now(), content_object=instance, activity_type=TYPE_ACTIVITY_USER_FULL_UPDATED) activity.save() +def post_stored_anonymous_content(sender,user,session_key,signal,*args,**kwargs): + aq_list = AnonymousQuestion.objects.filter(session_key = session_key) + aa_list = AnonymousAnswer.objects.filter(session_key = session_key) + import settings + if settings.EMAIL_VALIDATION == 'on':#add user to the record + for aq in aq_list: + aq.author = user + aq.save() + for aa in aa_list: + aa.author = user + aa.save() + #maybe add pending posts message? + else: #just publish the questions + for aq in aq_list: + aq.publish(user) + for aa in aa_list: + aa.publish(user) + #signal for User modle save changes pre_save.connect(calculate_gravatar_hash, sender=User) post_save.connect(record_ask_event, sender=Question) @@ -652,3 +800,4 @@ mark_offensive.connect(record_mark_offensive, sender=Answer) tags_updated.connect(record_update_tags, sender=Question) post_save.connect(record_favorite_question, sender=FavoriteQuestion) user_updated.connect(record_user_full_updated, sender=User) +user_logged_in.connect(post_stored_anonymous_content) diff --git a/forum/templatetags/extra_tags.py b/forum/templatetags/extra_tags.py index 6c826771..ac4e6ca3 100644 --- a/forum/templatetags/extra_tags.py +++ b/forum/templatetags/extra_tags.py @@ -1,4 +1,4 @@ -import time +import time import datetime import math import re @@ -237,4 +237,4 @@ def get_latest_changed_timestamp(): timestr = strftime("%H:%M %b-%d-%Y %Z", localtime(latest)) except: timestr = '' - return timestr
\ No newline at end of file + return timestr diff --git a/forum/user.py b/forum/user.py index ed4494d6..41811db9 100644 --- a/forum/user.py +++ b/forum/user.py @@ -1,4 +1,3 @@ -# coding=utf-8 from django.utils.translation import ugettext as _ class UserView: def __init__(self, id, tab_title, tab_description, page_title, view_name, template_file, data_size=0): diff --git a/forum/views.py b/forum/views.py index 2c61d41e..98ecda11 100644 --- a/forum/views.py +++ b/forum/views.py @@ -168,46 +168,140 @@ def questions(request, tagname=None, unanswered=False): 'pagesize' : pagesize }}, context_instance=RequestContext(request)) +def create_new_answer( question=None, author=None,\ + added_at=None, wiki=False,\ + text='', email_notify=False): + + html = sanitize_html(markdowner.convert(text)) + + #create answer + answer = Answer( + question = question, + author = author, + added_at = added_at, + wiki = wiki, + html = html + ) + if answer.wiki: + answer.last_edited_by = answer.author + answer.last_edited_at = added_at + answer.wikified_at = added_at + + answer.save() + + #update question data + question.last_activity_at = added_at + question.last_activity_by = author + question.save() + Question.objects.update_answer_count(question) + + #update revision + AnswerRevision.objects.create( + answer = answer, + revision = 1, + author = author, + revised_at = added_at, + summary = CONST['default_version'], + text = text + ) + + #set notification/delete + if email_notify: + try: + EmailFeed.objects.get(feed_id = question.id, subscriber_id = author.id, feed_content_type=question_type) + except EmailFeed.DoesNotExist: + feed = EmailFeed(content = question, subscriber = author) + feed.save() + else: + #not sure if this is necessary. ajax should take care of this... + try: + feed = Email.objects.get(feed_id = question.id, subscriber_id = author.id, feed_content_type=question_type) + feed.delete() + except: + pass + +def create_new_question(title=None,author=None,added_at=None, + wiki=False,tagnames=None,summary=None, + text=None): + """this is not a view + and maybe should become one of the methods on Question object? + """ + html = sanitize_html(markdowner.convert(text)) + question = Question( + title = title, + author = author, + added_at = added_at, + last_activity_at = added_at, + last_activity_by = author, + wiki = wiki, + tagnames = tagnames, + html = html, + summary = summary + ) + if question.wiki: + question.last_edited_by = question.author + question.last_edited_at = added_at + question.wikified_at = added_at + + question.save() + + # create the first revision + QuestionRevision.objects.create( + question = question, + revision = 1, + title = question.title, + author = author, + revised_at = added_at, + tagnames = question.tagnames, + summary = CONST['default_version'], + text = text + ) + return question + #TODO: allow anynomus user to ask question by providing email and username. -@login_required +#@login_required def ask(request): if request.method == "POST": form = AskForm(request.POST) if form.is_valid(): - added_at = datetime.datetime.now() - html = sanitize_html(markdowner.convert(form.cleaned_data['text'])) - question = Question( - title = strip_tags(form.cleaned_data['title']), - author = request.user, - added_at = added_at, - last_activity_at = added_at, - last_activity_by = request.user, - wiki = form.cleaned_data['wiki'], - tagnames = form.cleaned_data['tags'].strip(), - html = html, - summary = strip_tags(html)[:120] - ) - if question.wiki: - question.last_edited_by = question.author - question.last_edited_at = added_at - question.wikified_at = added_at - - question.save() - # create the first revision - QuestionRevision.objects.create( - question = question, - revision = 1, - title = question.title, - author = request.user, - revised_at = added_at, - tagnames = question.tagnames, - summary = CONST['default_version'], - text = form.cleaned_data['text'] - ) + added_at = datetime.datetime.now() + title = strip_tags(form.cleaned_data['title']) + wiki = form.cleaned_data['wiki'] + tagnames = form.cleaned_data['tags'].strip() + text = form.cleaned_data['text'] + html = sanitize_html(markdowner.convert(text)) + summary = strip_tags(html)[:120] - return HttpResponseRedirect(question.get_absolute_url()) + if request.user.is_authenticated(): + author = request.user + + question = create_new_question( + title = title, + author = author, + added_at = added_at, + wiki = wiki, + tagnames = tagnames, + summary = summary, + text = text + ) + return HttpResponseRedirect(question.get_absolute_url()) + else: + request.session.flush() + session_key = request.session.session_key + question = AnonymousQuestion( + session_key = session_key, + title = title, + tagnames = tagnames, + wiki = wiki, + text = text, + summary = summary, + added_at = added_at, + ip_addr = request.META['REMOTE_ADDR'], + ) + question.save() + return HttpResponseRedirect('%s%s%s' % ( _('/account/'),_('signin/'),('newquestion/'))) else: form = AskForm() @@ -233,7 +327,7 @@ def question(request, id): question = get_object_or_404(Question, id=id) if question.deleted and not can_view_deleted_post(request.user, question): raise Http404 - answer_form = AnswerForm(question) + answer_form = AnswerForm(question,request.user) answers = Answer.objects.get_answers_from_question(question, request.user) answers = answers.select_related(depth=1) @@ -254,7 +348,16 @@ def question(request, id): if answers is not None: answers = answers.order_by("-accepted", orderby) - objects_list = Paginator(answers, ANSWERS_PAGE_SIZE) + + filtered_answers = [] + for answer in answers: + if answer.deleted == True: + if answer.author_id == request.user.id: + filtered_answers.append(answer) + else: + filtered_answers.append(answer) + + objects_list = Paginator(filtered_answers, ANSWERS_PAGE_SIZE) page_objects = objects_list.page(page) # update view count Question.objects.update_view_count(question) @@ -558,42 +661,38 @@ def answer_revisions(request, id): 'revisions': revisions, }, context_instance=RequestContext(request)) -#TODO: allow anynomus -@login_required def answer(request, id): question = get_object_or_404(Question, id=id) if request.method == "POST": - form = AnswerForm(question, request.POST) + form = AnswerForm(question, request.user, request.POST) if form.is_valid(): + wiki = form.cleaned_data['wiki'] + text = form.cleaned_data['text'] update_time = datetime.datetime.now() - answer = Answer( - question = question, - author = request.user, - added_at = update_time, - wiki = form.cleaned_data['wiki'], - html = sanitize_html(markdowner.convert(form.cleaned_data['text'])), - ) - if answer.wiki: - answer.last_edited_by = answer.author - answer.last_edited_at = update_time - answer.wikified_at = update_time - answer.save() - Question.objects.update_answer_count(question) - - question = get_object_or_404(Question, id=id) - question.last_activity_at = update_time - question.last_activity_by = request.user - question.save() - - AnswerRevision.objects.create( - answer = answer, - revision = 1, - author = request.user, - revised_at = update_time, - summary = CONST['default_version'], - text = form.cleaned_data['text'] - ) + if request.user.is_authenticated(): + create_new_answer( + question=question, + author=request.user, + added_at=update_time, + wiki=wiki, + text=text, + email_notify=form.cleaned_data['email_notify'] + ) + else: + request.session.flush() + html = sanitize_html(markdowner.convert(text)) + summary = strip_tags(html)[:120] + anon = AnonymousAnswer( + question = question, + wiki = wiki, + text = text, + summary = summary, + session_key = request.session.session_key, + ip_addr = request.META['REMOTE_ADDR'], + ) + anon.save() + return HttpResponseRedirect('/account/signin/newanswer') return HttpResponseRedirect(question.get_absolute_url()) @@ -655,6 +754,7 @@ def vote(request, id): offensiveAnswer:8, removeQuestion: 9, removeAnswer:10 + questionSubscribeUpdates:11 accept answer code: response_data['allowed'] = -1, Accept his own answer 0, no allowed - Anonymous 1, Allowed - by default @@ -831,6 +931,31 @@ def vote(request, id): else: onDeleted(post, request.user) delete_post_or_answer.send(sender=post.__class__, instance=post, delete_by=request.user) + elif vote_type == '11':#subscribe q updates + user = request.user + if user.is_authenticated(): + try: + EmailFeed.objects.get(feed_id=question.id,subscriber_id=user.id,feed_content_type=question_type) + except EmailFeed.DoesNotExist: + feed = EmailFeed(subscriber=user,content=question) + feed.save() + if settings.EMAIL_VALIDATION == 'on' and user.email_isvalid == False: + response_data['message'] = _('subscription saved, %(email)s needs validation') % {'email':user.email} + #response_data['status'] = 1 + #responst_data['allowed'] = 1 + else: + pass + #response_data['status'] = 0 + #response_data['allowed'] = 0 + elif vote_type == '12':#unsubscribe q updates + user = request.user + if user.is_authenticated(): + try: + feed = EmailFeed.objects.get(feed_id=question.id,subscriber_id=user.id) + feed.delete() + except EmailFeed.DoesNotExist: + pass + else: response_data['success'] = 0 response_data['message'] = u'Request mode is not supported. Please try again.' @@ -905,7 +1030,11 @@ def edit_user(request, id): if request.method == "POST": form = EditUserForm(user, request.POST) if form.is_valid(): - user.email = sanitize_html(form.cleaned_data['email']) + new_email = sanitize_html(form.cleaned_data['email']) + + from django_authopenid.views import set_new_email + set_new_email(user, new_email) + user.real_name = sanitize_html(form.cleaned_data['realname']) user.website = sanitize_html(form.cleaned_data['website']) user.location = sanitize_html(form.cleaned_data['city']) @@ -1498,7 +1627,6 @@ def user_reputation(request, user_id, user_view): reputation.query.group_by = ['question_id'] - rep_list = [] for rep in Repute.objects.filter(user=user).order_by('reputed_at'): dic = '[%s,%s]' % (calendar.timegm(rep.reputed_at.timetuple()) * 1000, rep.reputation) @@ -1683,7 +1811,6 @@ def read_message(request): if request.method == "POST": if request.POST['formdata'] == 'required': request.session['message_silent'] = 1 - if request.user.is_authenticated(): request.user.delete_messages() return HttpResponse('') |