From 0637b6b97fec94799c3733e8b20519456814fce8 Mon Sep 17 00:00:00 2001 From: Aurélien Bompard Date: Thu, 30 Aug 2012 18:23:45 +0200 Subject: Normalize tabs to spaces --- hyperkitty/lib/__init__.py | 23 ++++++----- hyperkitty/models.py | 87 ++++++++++++++++++++------------------- hyperkitty/templates/message.html | 4 +- hyperkitty/tests/test_views.py | 28 ++++++------- hyperkitty/utils.py | 14 +++---- hyperkitty/views/accounts.py | 46 ++++++++++----------- hyperkitty/views/forms.py | 8 ++-- hyperkitty/views/list.py | 20 ++++----- hyperkitty/views/message.py | 28 ++++++------- hyperkitty/views/thread.py | 56 ++++++++++++------------- 10 files changed, 159 insertions(+), 155 deletions(-) (limited to 'hyperkitty') diff --git a/hyperkitty/lib/__init__.py b/hyperkitty/lib/__init__.py index d6ad4aa..887cfd5 100644 --- a/hyperkitty/lib/__init__.py +++ b/hyperkitty/lib/__init__.py @@ -12,16 +12,19 @@ import kittystore class ThreadSafeStorePool(object): - - def __init__(self): - self._local = threading.local() - - def get(self): - try: - return self._local.store - except AttributeError: - self._local.store = kittystore.get_store(settings.KITTYSTORE_URL, debug=False) - return self._local.store + """ + http://unpythonic.blogspot.fr/2007/11/using-storm-and-sqlite-in-multithreaded.html + """ + + def __init__(self): + self._local = threading.local() + + def get(self): + try: + return self._local.store + except AttributeError: + self._local.store = kittystore.get_store(settings.KITTYSTORE_URL, debug=False) + return self._local.store def gravatar_url(email): diff --git a/hyperkitty/models.py b/hyperkitty/models.py index 00c5128..0ed8f46 100644 --- a/hyperkitty/models.py +++ b/hyperkitty/models.py @@ -29,61 +29,62 @@ from hyperkitty.lib import ThreadSafeStorePool class Rating(models.Model): - # @TODO: instead of list_address, user list model from kittystore? - list_address = models.CharField(max_length=50) + # @TODO: instead of list_address, user list model from kittystore? + list_address = models.CharField(max_length=50) - # @TODO: instead of messsageid, use message model from kittystore? - messageid = models.CharField(max_length=100) + # @TODO: instead of messsageid, use message model from kittystore? + messageid = models.CharField(max_length=100) - user = models.ForeignKey(User) + user = models.ForeignKey(User) - vote = models.SmallIntegerField() + vote = models.SmallIntegerField() - def __unicode__(self): - """Unicode representation""" - if self.vote == 1: - return u'id = %s : %s voted up %s' % (self.id, unicode(self.user), self.messageid) - else: - return u'id = %s : %s voted down %s' % (self.id, unicode(self.user), self.messageid) + def __unicode__(self): + """Unicode representation""" + if self.vote == 1: + return u'id = %s : %s voted up %s' % (self.id, unicode(self.user), self.messageid) + else: + return u'id = %s : %s voted down %s' % (self.id, unicode(self.user), self.messageid) class UserProfile(models.Model): - # User Object - user = models.OneToOneField(User) + # User Object + user = models.OneToOneField(User) - karma = models.IntegerField(default=1) + karma = models.IntegerField(default=1) - def _get_votes(self): - "Returns all the votes by a user" - # Extract all the votes by this user - try: - votes = Rating.objects.filter(user=self.user) - except Rating.DoesNotExist: - votes = {} + def _get_votes(self): + "Returns all the votes by a user" + # Extract all the votes by this user + try: + votes = Rating.objects.filter(user=self.user) + except Rating.DoesNotExist: + votes = {} - for vote in votes: - list_name = vote.list_address.split('@')[0] - STORE = ThreadSafeStorePool().get() - message = STORE.get_message_by_id_from_list(vote.list_address, vote.messageid) - vote.message = message + STORE = ThreadSafeStorePool().get() + for vote in votes: + list_name = vote.list_address.split('@')[0] + message = STORE.get_message_by_id_from_list(vote.list_address, vote.messageid) + vote.message = message - return votes + return votes - votes = property(_get_votes) + votes = property(_get_votes) + + def __unicode__(self): + """Unicode representation""" + return u'%s' % (unicode(self.user)) - def __unicode__(self): - """Unicode representation""" - return u'%s' % (unicode(self.user)) class Tag(models.Model): - # @TODO: instead of list_address, user list model from kittystore? - list_address = models.CharField(max_length=50) - - # @TODO: instead of threadid, use thread model from kittystore? - threadid = models.CharField(max_length=100) - - tag = models.CharField(max_length=255) - - def __unicode__(self): - """Unicode representation""" - return u'threadid = %s , tag = %s ' % (unicode(self.list_address), unicode(self.threadid)) + # @TODO: instead of list_address, user list model from kittystore? + list_address = models.CharField(max_length=50) + + # @TODO: instead of threadid, use thread model from kittystore? + threadid = models.CharField(max_length=100) + + tag = models.CharField(max_length=255) + + def __unicode__(self): + """Unicode representation""" + return u'threadid = %s , tag = %s ' % (unicode(self.list_address), unicode(self.threadid)) diff --git a/hyperkitty/templates/message.html b/hyperkitty/templates/message.html index 5fd81a8..5d061e5 100644 --- a/hyperkitty/templates/message.html +++ b/hyperkitty/templates/message.html @@ -62,10 +62,10 @@ {% else %} alert('You need to login in order to vote'); {% endif %} - + }); - }); + }); {% endblock %} diff --git a/hyperkitty/tests/test_views.py b/hyperkitty/tests/test_views.py index 123989b..8f540c6 100644 --- a/hyperkitty/tests/test_views.py +++ b/hyperkitty/tests/test_views.py @@ -26,7 +26,7 @@ from django.core.urlresolvers import reverse import urllib class AccountViewsTestCase(TestCase): - + def setUp(self): self.client = Client() @@ -34,37 +34,37 @@ class AccountViewsTestCase(TestCase): # Try to access user profile (private data) without logging in response = self.client.get(reverse('user_profile')) self.assertRedirects(response, "%s?next=%s" % (reverse('user_login'), reverse('user_profile'))) - + def test_profile(self): User.objects.create_user('testuser', 'syst3m.w0rm+test@gmail.com', 'testPass') user = self.client.login(username='testuser', password='testPass') - + response = self.client.get(reverse('user_profile')) self.assertEqual(response.status_code, 200) - + # Verify that user_profile is present in request context self.assertTrue('user_profile' in response.context) - + # Verify karma for newly created user is 1 self.assertEqual(response.context['user_profile'].karma, 1) - - + + def test_registration(self): - + User.objects.create_user('testuser', 'syst3m.w0rm+test@gmail.com', 'testPass') user = self.client.login(username='testuser', password='testPass') - + # If the user if already logged in, redirect to index page..don't let him register again response = self.client.get(reverse('user_registration')) self.assertRedirects(response, reverse('index')) self.client.logout() - + # Access the user registration page after logging out and try to register now response = self.client.get(reverse('user_registration')) self.assertEqual(response.status_code, 200) - + # @TODO: Try to register a user and verify its working - + class MessageViewsTestCase(TestCase): def setUp(self): @@ -73,7 +73,7 @@ class MessageViewsTestCase(TestCase): def test_good_vote(self): User.objects.create_user('testuser', 'syst3m.w0rm+test@gmail.com', 'testPass') user = self.client.login(username='testuser', password='testPass') - + resp = self.client.post(reverse('message_vote', kwargs={'mlist_fqdn': 'list@list.com'}), {'vote': 1, 'messageid': 123, }) self.assertEqual(resp.status_code, 200) @@ -81,4 +81,4 @@ class MessageViewsTestCase(TestCase): resp = self.client.post(reverse('message_vote', kwargs={'mlist_fqdn': 'list@list.com'}), {'vote': 1, 'messageid': 123, }) url = "%s?next=%s" % (reverse('user_login'), urllib.quote(reverse('message_vote', kwargs={'mlist_fqdn': 'list@list.com'}))) self.assertRedirects(resp, url) - + diff --git a/hyperkitty/utils.py b/hyperkitty/utils.py index ae55826..4579cd2 100644 --- a/hyperkitty/utils.py +++ b/hyperkitty/utils.py @@ -48,7 +48,7 @@ class HyperKittyLogHandler(logging.Handler): def __init__(self, log_to_file=True, email_admins=True): logging.Handler.__init__(self) self.log_to_file = log_to_file - self.email_admins = email_admins + self.email_admins = email_admins def emit(self, record): try: @@ -81,13 +81,13 @@ class HyperKittyLogHandler(logging.Handler): reporter = ExceptionReporter(request, is_email=True, *exc_info) html_message = reporter.get_traceback_html() - if self.email_admins: - mail.mail_admins(subject, message, fail_silently=True, html_message=html_message) + if self.email_admins: + mail.mail_admins(subject, message, fail_silently=True, html_message=html_message) - if self.log_to_file: - log_file = open(LOG_FILE, 'a') - log_file.write(message) - log_file.close() + if self.log_to_file: + log_file = open(LOG_FILE, 'a') + log_file.write(message) + log_file.close() def format_subject(self, subject): """ diff --git a/hyperkitty/views/accounts.py b/hyperkitty/views/accounts.py index 4f3d96b..b81583f 100644 --- a/hyperkitty/views/accounts.py +++ b/hyperkitty/views/accounts.py @@ -47,8 +47,8 @@ def user_logout(request): return redirect('user_login') def user_login(request, template='login.html'): - - parse_r = urlparse(request.META.get('HTTP_REFERER', 'index')) + + parse_r = urlparse(request.META.get('HTTP_REFERER', 'index')) previous = '%s%s' % (parse_r.path, parse_r.query) next_var = request.POST.get('next', request.GET.get('next', previous)) @@ -57,12 +57,12 @@ def user_login(request, template='login.html'): form = AuthenticationForm(request.POST) user = authenticate(username=request.POST.get('username'), password=request.POST.get('password')) - - if user is not None: - log('debug', user) - if user.is_active: - login(request, user) - return redirect(next_var) + + if user is not None: + log('debug', user) + if user.is_active: + login(request, user) + return redirect(next_var) else: form = AuthenticationForm() @@ -73,20 +73,20 @@ def user_login(request, template='login.html'): def user_profile(request, user_email=None): if not request.user.is_authenticated(): return redirect('user_login') - + # try to render the user profile. try: - user_profile = request.user.get_profile() - # @TODO: Include the error name e.g, ProfileDoesNotExist? + user_profile = request.user.get_profile() + # @TODO: Include the error name e.g, ProfileDoesNotExist? except: - user_profile = UserProfile.objects.create(user=request.user) + user_profile = UserProfile.objects.create(user=request.user) t = loader.get_template('user_profile.html') c = RequestContext(request, { 'user_profile' : user_profile, }) - + return HttpResponse(t.render(c)) @@ -94,22 +94,22 @@ def user_registration(request): if request.user.is_authenticated(): # Already registered, redirect back to index page return redirect('index') - + if request.POST: form = RegistrationForm(request.POST) if form.is_valid(): - # Save the user data. - form.save(form.cleaned_data) - user = authenticate(username=form.cleaned_data['username'], - password=form.cleaned_data['password1']) + # Save the user data. + form.save(form.cleaned_data) + user = authenticate(username=form.cleaned_data['username'], + password=form.cleaned_data['password1']) if user is not None: - log('debug', user) - if user.is_active: - login(request, user) - return redirect('index') + log('debug', user) + if user.is_active: + login(request, user) + return redirect('index') else: form = RegistrationForm() - + return render_to_response('register.html', {'form': form}, context_instance=RequestContext(request)) diff --git a/hyperkitty/views/forms.py b/hyperkitty/views/forms.py index 97e5550..fc885c8 100644 --- a/hyperkitty/views/forms.py +++ b/hyperkitty/views/forms.py @@ -8,7 +8,7 @@ def isValidUsername(username): except User.DoesNotExist: return raise validators.ValidationError('The username "%s" is already taken.' % username) - + class RegistrationForm(forms.Form): username = forms.CharField(label='username', help_text=None, @@ -18,11 +18,11 @@ class RegistrationForm(forms.Form): ) email = forms.EmailField(required=True) - + password1 = forms.CharField(widget=forms.PasswordInput) - + password2 = forms.CharField(widget=forms.PasswordInput) - + def save(self, new_user_data): u = User.objects.create_user(new_user_data['username'], new_user_data['email'], diff --git a/hyperkitty/views/list.py b/hyperkitty/views/list.py index d122c84..e4a69bd 100644 --- a/hyperkitty/views/list.py +++ b/hyperkitty/views/list.py @@ -34,7 +34,7 @@ def archives(request, mlist_fqdn, year=None, month=None, day=None): # No year/month: past 32 days # year and month: find the 32 days for that month # @TODO : modify url.py to account for page number - + end_date = None if year or month or day: try: @@ -89,7 +89,7 @@ def archives(request, mlist_fqdn, year=None, month=None, day=None): totallikes = 0 totaldislikes = 0 messages = STORE.get_thread(mlist_fqdn, thread.thread_id) - + for message in messages: # Extract all the votes for this message try: @@ -107,27 +107,27 @@ def archives(request, mlist_fqdn, year=None, month=None, day=None): dislikes = dislikes + 1 else: pass - + totallikes = totallikes + likes totalvotes = totalvotes + likes + dislikes totaldislikes = totaldislikes + dislikes - + try: thread.avglike = totallikes / totalvotes except: thread.avglike = 0 - - try: + + try: thread.avgdislike = totaldislikes / totalvotes except: thread.avgdislike = 0 - + threads[cnt] = thread - cnt = cnt + 1 + cnt = cnt + 1 paginator = Paginator(threads, 10) pageNo = request.GET.get('page') - + try: threads = paginator.page(pageNo) except PageNotAnInteger: @@ -139,7 +139,7 @@ def archives(request, mlist_fqdn, year=None, month=None, day=None): archives_length = STORE.get_archives_length(mlist_fqdn) - + c = RequestContext(request, { 'list_name' : list_name, 'objects': threads.object_list, diff --git a/hyperkitty/views/message.py b/hyperkitty/views/message.py index 9f0191a..84997fd 100644 --- a/hyperkitty/views/message.py +++ b/hyperkitty/views/message.py @@ -28,21 +28,21 @@ def index (request, mlist_fqdn, hashid): message.sender_email = message.sender_email.strip() # Extract all the votes for this message try: - votes = Rating.objects.filter(messageid = hashid) + votes = Rating.objects.filter(messageid = hashid) except Rating.DoesNotExist: - votes = {} + votes = {} likes = 0 dislikes = 0 for vote in votes: - if vote.vote == 1: - likes = likes + 1 - elif vote.vote == -1: - dislikes = dislikes + 1 - else: - pass - + if vote.vote == 1: + likes = likes + 1 + elif vote.vote == -1: + dislikes = dislikes + 1 + else: + pass + message.votes = votes message.likes = likes message.dislikes = dislikes @@ -51,7 +51,7 @@ def index (request, mlist_fqdn, hashid): 'list_name' : list_name, 'list_address': mlist_fqdn, 'message': message, - 'hashid' : hashid, + 'hashid' : hashid, }) return HttpResponse(t.render(c)) @@ -61,19 +61,19 @@ def index (request, mlist_fqdn, hashid): def vote (request, mlist_fqdn): """ Add a rating to a given message identified by messageid. """ if not request.user.is_authenticated(): - return redirect('user_login') + return redirect('user_login') value = request.POST['vote'] hashid = request.POST['hashid'] # Checks if the user has already voted for a this message. If yes modify db entry else create a new one. try: - v = Rating.objects.get(user = request.user, messageid = hashid, list_address = mlist_fqdn) + v = Rating.objects.get(user = request.user, messageid = hashid, list_address = mlist_fqdn) except Rating.DoesNotExist: - v = Rating(list_address=mlist_fqdn, messageid = hashid, vote = value) + v = Rating(list_address=mlist_fqdn, messageid = hashid, vote = value) v.user = request.user - v.vote = value + v.vote = value v.save() response_dict = { } diff --git a/hyperkitty/views/thread.py b/hyperkitty/views/thread.py index 355dd39..7d78885 100644 --- a/hyperkitty/views/thread.py +++ b/hyperkitty/views/thread.py @@ -37,29 +37,29 @@ def thread_index (request, mlist_fqdn, threadid): cnt = 0 for message in threads: - # @TODO: Move this logic inside KittyStore? - message.sender_email = message.sender_email.strip() - - # Extract all the votes for this message - try: - votes = Rating.objects.filter(messageid=message.message_id) - except Rating.DoesNotExist: - votes = {} - - likes = 0 - dislikes = 0 - - for vote in votes: - if vote.vote == 1: - likes = likes + 1 - elif vote.vote == -1: - dislikes = dislikes + 1 - else: - pass - - message.votes = votes - message.likes = likes - message.dislikes = dislikes + # @TODO: Move this logic inside KittyStore? + message.sender_email = message.sender_email.strip() + + # Extract all the votes for this message + try: + votes = Rating.objects.filter(messageid=message.message_id) + except Rating.DoesNotExist: + votes = {} + + likes = 0 + dislikes = 0 + + for vote in votes: + if vote.vote == 1: + likes = likes + 1 + elif vote.vote == -1: + dislikes = dislikes + 1 + else: + pass + + message.votes = votes + message.likes = likes + message.dislikes = dislikes # Statistics on how many participants and threads this month participants[message.sender_name] = {'email': message.sender_email} @@ -68,7 +68,7 @@ def thread_index (request, mlist_fqdn, threadid): archives_length = STORE.get_archives_length(mlist_fqdn) from_url = '/thread/%s/%s/' % (mlist_fqdn, threadid) tag_form = AddTagForm(initial={'from_url' : from_url}) - + try: tags = Tag.objects.filter(threadid=threadid) except Tag.DoesNotExist: @@ -103,18 +103,18 @@ def add_tag(request, mlist_fqdn, email_id): form = AddTagForm(request.POST) if form.is_valid(): print "Adding tag..." - + tag = form.data['tag'] - + try: tag_obj = Tag.objects.get(threadid=email_id, list_address=mlist_fqdn, tag=tag) except Tag.DoesNotExist: tag_obj = Tag(list_address=mlist_fqdn, threadid=email_id, tag=tag) - + tag_obj.save() response_dict = { } else: response_dict = {'error' : 'Error adding tag, enter valid data' } - + return HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript') -- cgit