diff --git a/hobo/default_settings.py b/hobo/default_settings.py
index 172c105..f74ebc6 100644
--- a/hobo/default_settings.py
+++ b/hobo/default_settings.py
@@ -41,7 +41,6 @@ INSTALLED_APPS = (
'gadjo',
'hobo.environment',
'hobo.agent',
- 'allauth_authentic2',
)
MIDDLEWARE_CLASSES = (
diff --git a/hobo/static/css/style.css b/hobo/static/css/style.css
index a8a9f92..364e822 100644
--- a/hobo/static/css/style.css
+++ b/hobo/static/css/style.css
@@ -42,3 +42,17 @@ a.delete-service:after, a.delete-variable:after, a.delete-tenant:after {
position: absolute;
top: 0;
}
+
+ul.login li {
+ list-style-type: none;
+ margin: .5em auto;
+}
+
+ul.login li ul.errorlist {
+ margin-left: 10em;
+}
+
+ul.login label {
+ float: left;
+ width: 10em;
+}
\ No newline at end of file
diff --git a/hobo/templates/hobo/base.html b/hobo/templates/hobo/base.html
index c394374..1e2509d 100644
--- a/hobo/templates/hobo/base.html
+++ b/hobo/templates/hobo/base.html
@@ -6,3 +6,9 @@
{% block css %}
{% endblock %}
+
+{% if user.is_authenticated %}
+{% block logout-url %}
+{% url "logout" %}
+{% endblock %}
+{% endif %}
diff --git a/hobo/templates/hobo/login.html b/hobo/templates/hobo/login.html
new file mode 100644
index 0000000..3e1ad89
--- /dev/null
+++ b/hobo/templates/hobo/login.html
@@ -0,0 +1,16 @@
+{% extends "hobo/base.html" %}
+{% load i18n %}
+
+{% block appbar %}
+
{% trans "Authentication" %}
+{% endblock %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/hobo/urls.py b/hobo/urls.py
index 18ab34c..88b5004 100644
--- a/hobo/urls.py
+++ b/hobo/urls.py
@@ -1,13 +1,19 @@
+from django.conf import settings
from django.conf.urls import patterns, include, url
+from django.contrib.auth.decorators import login_required
from django.contrib import admin
admin.autodiscover()
+from url_utils import decorated_includes
+
urlpatterns = patterns('',
url(r'^$', 'hobo.views.home', name='home'),
- url(r'^environment/', include('hobo.environment.urls')),
-
+ url(r'^environment/', decorated_includes(login_required, include('hobo.environment.urls'))),
url(r'^hobos.json$', 'hobo.views.hobo'),
-
url(r'^admin/', include(admin.site.urls)),
+ url(r'^accounts/login', 'django.contrib.auth.views.login',
+ {'template_name': 'hobo/login.html'}, name='login'),
+ url(r'^accounts/logout', 'django.contrib.auth.views.logout',
+ {'next_page': '/'}, name='logout'),
)
diff --git a/hobo/urls_utils.py b/hobo/urls_utils.py
new file mode 100644
index 0000000..13c3413
--- /dev/null
+++ b/hobo/urls_utils.py
@@ -0,0 +1,31 @@
+# Decorating URL includes,
+
+from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
+
+class DecoratedURLPattern(RegexURLPattern):
+ def resolve(self, *args, **kwargs):
+ result = super(DecoratedURLPattern, self).resolve(*args, **kwargs)
+ if result:
+ result.func = self._decorate_with(result.func)
+ return result
+
+class DecoratedRegexURLResolver(RegexURLResolver):
+ def resolve(self, *args, **kwargs):
+ result = super(DecoratedRegexURLResolver, self).resolve(*args, **kwargs)
+ if result:
+ result.func = self._decorate_with(result.func)
+ return result
+
+def decorated_includes(func, includes, *args, **kwargs):
+ urlconf_module, app_name, namespace = includes
+
+ for item in urlconf_module:
+ if isinstance(item, RegexURLPattern):
+ item.__class__ = DecoratedURLPattern
+ item._decorate_with = func
+
+ elif isinstance(item, RegexURLResolver):
+ item.__class__ = DecoratedRegexURLResolver
+ item._decorate_with = func
+
+ return urlconf_module, app_name, namespace
diff --git a/hobo/views.py b/hobo/views.py
index d0b9d3f..ffad3d3 100644
--- a/hobo/views.py
+++ b/hobo/views.py
@@ -5,6 +5,7 @@ from django.utils.translation import ugettext as _
from django.views.generic.base import TemplateView
from django.views.generic import edit
from django.core.urlresolvers import reverse
+from django.contrib.auth.decorators import login_required
from .environment.utils import Zone, get_operational_services
from .forms import HoboForm, HoboUpdateForm, get_tenant_model
@@ -23,7 +24,7 @@ class Home(TemplateView):
context['zones'].append(Zone(_('Environment Settings'), 'settings', 'environment/'))
return context
-home = Home.as_view()
+home = login_required(Home.as_view())
class ManagerHome(edit.CreateView):
template_name = 'hobo/manager_home.html'
@@ -47,7 +48,7 @@ class ManagerHome(edit.CreateView):
self.object.create_schema(True)
return response
-manager_home = ManagerHome.as_view()
+manager_home = login_required(ManagerHome.as_view())
class ManagerUpdateTenant(edit.UpdateView):
model = get_tenant_model()
@@ -62,7 +63,7 @@ class ManagerUpdateTenant(edit.UpdateView):
self.object.create_schema(True)
return response
-update_tenant = ManagerUpdateTenant.as_view()
+update_tenant = login_required(ManagerUpdateTenant.as_view())
class ManagerDeleteTenant(edit.DeleteView):
template_name = 'environment/tenant_confirm_delete.html'
@@ -71,7 +72,7 @@ class ManagerDeleteTenant(edit.DeleteView):
def get_success_url(self):
return reverse('manager-home', self.object.id)
-delete_tenant = ManagerDeleteTenant.as_view()
+delete_tenant = login_required(ManagerDeleteTenant.as_view())
def hobos(request, *args, **kwargs):
response = HttpResponse(content_type='application/json')