From 17ccd5e6648a3bde1995bac58a12be5b43969f99 Mon Sep 17 00:00:00 2001 From: dm03514 Date: Thu, 10 Nov 2011 23:17:24 -0500 Subject: Send Email Command Feature 131 --- askbot/management/commands/send_email.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 askbot/management/commands/send_email.py diff --git a/askbot/management/commands/send_email.py b/askbot/management/commands/send_email.py new file mode 100644 index 00000000..8f67ad2f --- /dev/null +++ b/askbot/management/commands/send_email.py @@ -0,0 +1,29 @@ +from askbot.utils.mail import send_mail +from django.core.exceptions import ValidationError +from django.core.management.base import BaseCommand, CommandError +from django.core.validators import validate_email + +class Command(BaseCommand): + args = '' + help = 'Sends a test email to the specified email address' + + def handle(self, *args, **options): + + if len(args) != 1: + raise CommandError('Recipients email address required') + + try: + validate_email(args[0]) + except ValidationError: + raise CommandError('%s is not a valid email address' % (args[0])) + + send_mail( + subject_line = 'Askbot Mail Test', + body_text = 'Askbot Mail Test', + recipient_list = [args[0]], + ) + + + + + -- cgit v1.2.3-1-g7c22 From 9df48b88129a948e08fce4c13ea46c3102a7c6cb Mon Sep 17 00:00:00 2001 From: dm03514 Date: Fri, 11 Nov 2011 11:12:05 -0500 Subject: Created a generic Merge Users Class. Feature 135. --- askbot/management/commands/merge_users.py | 54 ++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/askbot/management/commands/merge_users.py b/askbot/management/commands/merge_users.py index 4691c4b3..3c7069e5 100644 --- a/askbot/management/commands/merge_users.py +++ b/askbot/management/commands/merge_users.py @@ -1,18 +1,12 @@ from django.core.management.base import CommandError, BaseCommand from askbot.models import User - -class Command(BaseCommand): +class MergeUsersBaseCommand(BaseCommand): args = ' ' help = 'Merge an account and all information from a to a , deleting the ' - def parse_arguments(self, *arguments): - if len(arguments) != 2: - raise CommandError('Arguments are to ') - self.from_user = User.objects.get(id = arguments[0]) - self.to_user = User.objects.get(id = arguments[1]) - def handle(self, *arguments, **options): + self.parse_arguments(*arguments) for rel in User._meta.get_all_related_objects(): @@ -26,21 +20,23 @@ class Command(BaseCommand): self.process_m2m_field(rel.model, rel.field.name) except Exception, error: self.stdout.write(u'Warning: %s\n' % error) - - self.to_user.reputation += self.from_user.reputation - 1 - self.to_user.gold += self.from_user.gold - self.to_user.silver += self.from_user.silver - self.to_user.bronze += self.from_user.bronze - if self.from_user.last_seen > self.to_user.last_seen: - self.to_user.last_seen = self.from_user.last_seen + self.process_custom_user_fields() - if self.from_user.date_joined < self.to_user.date_joined: - self.to_user.date_joined = self.from_user.date_joined + self.cleanup() - self.to_user.save() + def cleanup(self): + raise Exception, 'Not implemented' + + def process_custom_user_fields(self): + """Put app specific logic here.""" + raise Exception, 'Not implemented' - self.from_user.delete() + def parse_arguments(self, *arguments): + if len(arguments) != 2: + raise CommandError('Arguments are to ') + self.from_user = User.objects.get(id = arguments[0]) + self.to_user = User.objects.get(id = arguments[1]) def process_field(self, model, field_name): """reassigns the related object to the new user""" @@ -58,3 +54,23 @@ class Command(BaseCommand): m2m_field = getattr(obj, field_name) m2m_field.remove(self.from_user) m2m_field.add(self.to_user) + + +class Command(MergeUsersBaseCommand): + + def process_custom_user_fields(self): + self.to_user.reputation += self.from_user.reputation - 1 + self.to_user.gold += self.from_user.gold + self.to_user.silver += self.from_user.silver + self.to_user.bronze += self.from_user.bronze + + if self.from_user.last_seen > self.to_user.last_seen: + self.to_user.last_seen = self.from_user.last_seen + + if self.from_user.date_joined < self.to_user.date_joined: + self.to_user.date_joined = self.from_user.date_joined + + def cleanup(self): + self.to_user.save() + self.from_user.delete() + -- cgit v1.2.3-1-g7c22 From 1da3603b8317c675edcb438a4ba3f0953ee14f90 Mon Sep 17 00:00:00 2001 From: dm03514 Date: Tue, 15 Nov 2011 16:29:59 -0500 Subject: Very Simple Embeddable widget to display questions corresponding to tags. --- .../skins/default/templates/question_widget.html | 39 ++++++++++++++++++++++ askbot/tests/page_load_tests.py | 5 +++ askbot/urls.py | 5 +++ askbot/views/readers.py | 21 ++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 askbot/skins/default/templates/question_widget.html diff --git a/askbot/skins/default/templates/question_widget.html b/askbot/skins/default/templates/question_widget.html new file mode 100644 index 00000000..1d702ae0 --- /dev/null +++ b/askbot/skins/default/templates/question_widget.html @@ -0,0 +1,39 @@ + + + + + + +
+ +
+ + + diff --git a/askbot/tests/page_load_tests.py b/askbot/tests/page_load_tests.py index 442b1bd7..349839ad 100644 --- a/askbot/tests/page_load_tests.py +++ b/askbot/tests/page_load_tests.py @@ -202,6 +202,11 @@ class PageLoadTestCase(AskbotTestCase): kwargs={'id':17}, template='revisions.html' ) + self.try_url( + 'widget_questions', + data={'tags': 'test'}, + template='question_widget.html', + ) self.try_url('users', template='users.html') #todo: really odd naming conventions for sort methods self.try_url( diff --git a/askbot/urls.py b/askbot/urls.py index 8c1e3c3a..4d820305 100644 --- a/askbot/urls.py +++ b/askbot/urls.py @@ -115,6 +115,11 @@ urlpatterns = patterns('', kwargs = {'object_name': 'Question'}, name='question_revisions' ), + url( + r'^%s$' % _('widget/'), + views.readers.widget_questions, + name='widget_questions' + ), url(#ajax only r'^comment/upvote/$', views.commands.upvote_comment, diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 4a12fe2c..0107e76b 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -12,6 +12,7 @@ import urllib import operator from django.shortcuts import get_object_or_404 from django.http import HttpResponseRedirect, HttpResponse, Http404 +from django.conf import settings as django_settings from django.core.paginator import Paginator, EmptyPage, InvalidPage from django.template import Context from django.utils.http import urlencode @@ -593,3 +594,23 @@ def get_question_body(request): return {'questions-titles': questions_dict} return {'questions-titles': questions_dict} + +def widget_questions(request): + """Returns the first x questions based on certain tags. + @returns template with those questions listed.""" + # make sure this is a GET request with the correct parameters. + if request.method != 'GET' or not request.GET.get('tags'): + raise Http404 + tags_list = request.GET['tags'].split(',') + # Get Questions that contain all the matching tags, could be OR instead. + matching_questions = models.Question.objects.filter(tags__name__in=tags_list)[:7] + data = [] + for matching_question in matching_questions: + data.append({ + 'url': '%s%s' % (django_settings.SITE_BASE_URL, + matching_question.get_absolute_url()), + 'title': matching_question.title + }) + #import ipdb; ipdb.set_trace() + return render_into_skin('question_widget.html', {'questions': data}, request) + -- cgit v1.2.3-1-g7c22 From 8bcb9ec5017cafc4bc4af33224c5a596871c5eea Mon Sep 17 00:00:00 2001 From: dm03514 Date: Tue, 15 Nov 2011 16:51:22 -0500 Subject: Removed debug statement. --- askbot/views/readers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 0107e76b..2cdf7115 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -611,6 +611,5 @@ def widget_questions(request): matching_question.get_absolute_url()), 'title': matching_question.title }) - #import ipdb; ipdb.set_trace() return render_into_skin('question_widget.html', {'questions': data}, request) -- cgit v1.2.3-1-g7c22