summaryrefslogtreecommitdiffstats
path: root/hyperkitty
diff options
context:
space:
mode:
Diffstat (limited to 'hyperkitty')
-rw-r--r--hyperkitty/middleware.py20
-rw-r--r--hyperkitty/migrations/0006_auto__add_field_userprofile_timezone.py98
-rw-r--r--hyperkitty/models.py4
-rw-r--r--hyperkitty/views/accounts.py10
-rw-r--r--hyperkitty/views/forms.py3
5 files changed, 131 insertions, 4 deletions
diff --git a/hyperkitty/middleware.py b/hyperkitty/middleware.py
index a52aba2..e026fb1 100644
--- a/hyperkitty/middleware.py
+++ b/hyperkitty/middleware.py
@@ -69,3 +69,23 @@ class SSLRedirect(object):
"""Django can't perform a SSL redirect while maintaining POST data.
Please structure your views so that redirects only occur during GETs."""
return HttpResponsePermanentRedirect(newurl)
+
+
+
+# https://docs.djangoproject.com/en/dev/topics/i18n/timezones/
+
+from django.utils import timezone
+from django.core.exceptions import ObjectDoesNotExist
+from hyperkitty.models import UserProfile
+
+class TimezoneMiddleware(object):
+
+ def process_request(self, request):
+ if not request.user.is_authenticated():
+ return
+ try:
+ user_profile = request.user.get_profile()
+ except ObjectDoesNotExist:
+ return
+ if user_profile.timezone:
+ timezone.activate(user_profile.timezone)
diff --git a/hyperkitty/migrations/0006_auto__add_field_userprofile_timezone.py b/hyperkitty/migrations/0006_auto__add_field_userprofile_timezone.py
new file mode 100644
index 0000000..dd9c9d8
--- /dev/null
+++ b/hyperkitty/migrations/0006_auto__add_field_userprofile_timezone.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding field 'UserProfile.timezone'
+ db.add_column(u'hyperkitty_userprofile', 'timezone',
+ self.gf('django.db.models.fields.CharField')(default=u'', max_length=100),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'UserProfile.timezone'
+ db.delete_column(u'hyperkitty_userprofile', 'timezone')
+
+
+ models = {
+ u'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ u'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': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ u'auth.permission': {
+ 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ u'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ u'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'}),
+ u'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'})
+ },
+ u'hyperkitty.favorite': {
+ 'Meta': {'object_name': 'Favorite'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'list_address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'threadid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
+ },
+ u'hyperkitty.lastview': {
+ 'Meta': {'object_name': 'LastView'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'list_address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'threadid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ 'view_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+ },
+ u'hyperkitty.rating': {
+ 'Meta': {'object_name': 'Rating'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'list_address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'messageid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ 'vote': ('django.db.models.fields.SmallIntegerField', [], {})
+ },
+ u'hyperkitty.tag': {
+ 'Meta': {'object_name': 'Tag'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'list_address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'threadid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'})
+ },
+ u'hyperkitty.userprofile': {
+ 'Meta': {'object_name': 'UserProfile'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'karma': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+ 'timezone': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '100'}),
+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
+ }
+ }
+
+ complete_apps = ['hyperkitty'] \ No newline at end of file
diff --git a/hyperkitty/models.py b/hyperkitty/models.py
index 317cb7a..8b2e514 100644
--- a/hyperkitty/models.py
+++ b/hyperkitty/models.py
@@ -23,6 +23,8 @@ from django.db import models
from django.contrib.auth.models import User
from django.contrib import admin
+import pytz
+
class Rating(models.Model):
@@ -53,6 +55,8 @@ class UserProfile(models.Model):
user = models.OneToOneField(User)
karma = models.IntegerField(default=1)
+ TIMEZONES = [ (tz, tz) for tz in pytz.common_timezones ]
+ timezone = models.CharField(max_length=100, choices=TIMEZONES, default=u"")
def __unicode__(self):
"""Unicode representation"""
diff --git a/hyperkitty/views/accounts.py b/hyperkitty/views/accounts.py
index 43ee5c6..5901a17 100644
--- a/hyperkitty/views/accounts.py
+++ b/hyperkitty/views/accounts.py
@@ -23,7 +23,7 @@ import logging
from django.conf import settings
from django.core.urlresolvers import reverse
-from django.core.exceptions import SuspiciousOperation
+from django.core.exceptions import SuspiciousOperation, ObjectDoesNotExist
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.contrib.auth import authenticate, login, get_backends
from django.contrib.auth.decorators import login_required
@@ -31,7 +31,7 @@ from django.contrib.auth.models import User
from django.contrib.auth.views import login as django_login_view
from django.shortcuts import render, redirect
from django.utils.http import is_safe_url
-from django.utils.timezone import utc
+from django.utils.timezone import utc, get_current_timezone
#from django.utils.translation import gettext as _
from social_auth.backends import SocialAuthBackend
@@ -67,8 +67,7 @@ def user_profile(request, user_email=None):
# try to render the user profile.
try:
user_profile = request.user.get_profile()
- # @TODO: Include the error name e.g, ProfileDoesNotExist?
- except:
+ except ObjectDoesNotExist:
user_profile = UserProfile.objects.create(user=request.user)
if request.method == 'POST':
@@ -76,7 +75,9 @@ def user_profile(request, user_email=None):
if form.is_valid():
request.user.first_name = form.cleaned_data["first_name"]
request.user.last_name = form.cleaned_data["last_name"]
+ user_profile.timezone = form.cleaned_data["timezone"]
request.user.save()
+ user_profile.save()
redirect_url = reverse('user_profile')
redirect_url += "?msg=updated-ok"
return redirect(redirect_url)
@@ -84,6 +85,7 @@ def user_profile(request, user_email=None):
form = UserProfileForm(initial={
"first_name": request.user.first_name,
"last_name": request.user.last_name,
+ "timezone": get_current_timezone(),
})
# Votes
diff --git a/hyperkitty/views/forms.py b/hyperkitty/views/forms.py
index 9cacad8..6f6c294 100644
--- a/hyperkitty/views/forms.py
+++ b/hyperkitty/views/forms.py
@@ -24,6 +24,7 @@ from django.core import validators
from django.contrib.auth.models import User
from django.utils.safestring import mark_safe
+from hyperkitty.models import UserProfile
def isValidUsername(username):
@@ -61,6 +62,8 @@ class RegistrationForm(forms.Form):
class UserProfileForm(forms.Form):
first_name = forms.CharField()
last_name = forms.CharField()
+ timezone = forms.ChoiceField(label="Time zone",
+ choices=UserProfile.TIMEZONES)