summaryrefslogtreecommitdiffstats
path: root/hyperkitty
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2012-08-30 18:23:45 +0200
committerAurélien Bompard <aurelien@bompard.org>2012-08-30 18:23:45 +0200
commit0637b6b97fec94799c3733e8b20519456814fce8 (patch)
tree026d15d66afec93ab5046bea50faab6c5b5d90b1 /hyperkitty
parentec7da1aac20a01838d30e02d550c13b22414be73 (diff)
downloadhyperkitty-0637b6b97fec94799c3733e8b20519456814fce8.tar.gz
hyperkitty-0637b6b97fec94799c3733e8b20519456814fce8.tar.xz
hyperkitty-0637b6b97fec94799c3733e8b20519456814fce8.zip
Normalize tabs to spaces
Diffstat (limited to 'hyperkitty')
-rw-r--r--hyperkitty/lib/__init__.py23
-rw-r--r--hyperkitty/models.py87
-rw-r--r--hyperkitty/templates/message.html4
-rw-r--r--hyperkitty/tests/test_views.py28
-rw-r--r--hyperkitty/utils.py14
-rw-r--r--hyperkitty/views/accounts.py46
-rw-r--r--hyperkitty/views/forms.py8
-rw-r--r--hyperkitty/views/list.py20
-rw-r--r--hyperkitty/views/message.py28
-rw-r--r--hyperkitty/views/thread.py56
10 files changed, 159 insertions, 155 deletions
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 %}
-
+
});
- });
+ });
</script>
{% 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')