diff --git a/tos/models.py b/tos/models.py
index 3bf895b..681a538 100644
--- a/tos/models.py
+++ b/tos/models.py
@@ -4,6 +4,8 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _
+class NoActiveTermsOfService(ValidationError): pass
+
class BaseModel(models.Model):
created = models.DateTimeField(auto_now_add=True, editable=False)
@@ -15,8 +17,11 @@ class BaseModel(models.Model):
class TermsOfServiceManager(models.Manager):
def get_current_tos(self):
- return super(TermsOfServiceManager, self).get_query_set().get(active=True)
-
+ try:
+ return super(TermsOfServiceManager, self).get_query_set().get(active=True)
+ except TermsOfService.DoesNotExist:
+ raise NoActiveTermsOfService('Please create an active Terms-of-Service')
+
class TermsOfService(BaseModel):
@@ -44,7 +49,7 @@ class TermsOfService(BaseModel):
else:
if not TermsOfService.objects.exclude(id=self.id).filter(active=True):
- raise ValidationError('One of the terms of service must be marked active')
+ raise NoActiveTermsOfService('One of the terms of service must be marked active')
super(TermsOfService,self).save(*args, **kwargs)
diff --git a/tos/templates/tos/tos_check.html b/tos/templates/tos/tos_check.html
new file mode 100644
index 0000000..0e2ad12
--- /dev/null
+++ b/tos/templates/tos/tos_check.html
@@ -0,0 +1,10 @@
+
Terms of Service as of {{ tos.created }}
+
+{{ tos.content }}
+
+Accept Terms of Service?
+
+
\ No newline at end of file
diff --git a/tos/views.py b/tos/views.py
index ea632dd..f78c9de 100644
--- a/tos/views.py
+++ b/tos/views.py
@@ -10,9 +10,11 @@ from django.template import RequestContext
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
+from tos.models import has_user_agreed_latest_tos, TermsOfService
+
@csrf_protect
@never_cache
-def login(request, template_name='registration/login.html',
+def login_old(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm):
"""Displays the login form and handles the login action."""
@@ -22,12 +24,7 @@ def login(request, template_name='registration/login.html',
if request.method == "POST":
form = authentication_form(data=request.POST)
if form.is_valid():
-
- # force user to agree to TOS
- # 1. get latest TOS
- # 2. Confirm that user is on the TOS agreement list
- # 3. redirect them to TOS page if they have not yet agreed
-
+
# Light security check -- make sure redirect_to isn't garbage.
if not redirect_to or ' ' in redirect_to:
redirect_to = settings.LOGIN_REDIRECT_URL
@@ -63,3 +60,76 @@ def login(request, template_name='registration/login.html',
'site': current_site,
'site_name': current_site.name,
}, context_instance=RequestContext(request))
+
+@csrf_protect
+@never_cache
+def tos_check(request):
+
+ # force user to agree to TOS
+ # 1. get latest TOS
+ has_user_agreed_latest_tos
+
+ # 2. Confirm that user is on the TOS agreement list
+ # 3. redirect them to TOS page if they have not yet agreed
+
+def login(request, template_name='registration/login.html',
+ redirect_field_name=REDIRECT_FIELD_NAME,
+ authentication_form=AuthenticationForm):
+ """Displays the login form and handles the login action."""
+
+ redirect_to = request.REQUEST.get(redirect_field_name, '')
+
+ if request.method == "POST":
+ form = authentication_form(data=request.POST)
+ if form.is_valid():
+
+ # Light security check -- make sure redirect_to isn't garbage.
+ if not redirect_to or ' ' in redirect_to:
+ redirect_to = settings.LOGIN_REDIRECT_URL
+
+ # Heavier security check -- redirects to http://example.com should
+ # not be allowed, but things like /view/?param=http://example.com
+ # should be allowed. This regex checks if there is a '//' *before* a
+ # question mark.
+ elif '//' in redirect_to and re.match(r'[^\?]*//', redirect_to):
+ redirect_to = settings.LOGIN_REDIRECT_URL
+
+ # Okay, security checks complete. Check to see if user agrees to terms
+ if has_user_agreed_latest_tos(form.get_user()):
+
+ # Log the user in.
+ auth_login(request, form.get_user())
+
+ if request.session.test_cookie_worked():
+ request.session.delete_test_cookie()
+
+ return HttpResponseRedirect(redirect_to)
+
+ else:
+ # user has not yet agreed to latest tos
+ # force them to accept or refuse
+
+
+ return render_to_response('tos/tos_check.html', {
+ redirect_field_name: redirect_to,
+ 'tos':TermsOfService.objects.get_current_tos(),
+ 'form':authentication_form(request)
+ }, context_instance=RequestContext(request))
+
+ else:
+ form = authentication_form(request)
+
+ request.session.set_test_cookie()
+
+ if Site._meta.installed:
+ current_site = Site.objects.get_current()
+ else:
+ current_site = RequestSite(request)
+
+ return render_to_response(template_name, {
+ 'form': form,
+ redirect_field_name: redirect_to,
+ 'site': current_site,
+ 'site_name': current_site.name,
+ }, context_instance=RequestContext(request))
+