diff --git a/account/forms.py b/account/forms.py index 1f840d2..b6a3650 100644 --- a/account/forms.py +++ b/account/forms.py @@ -1,6 +1,5 @@ from django import forms - class LoginForm(forms.Form): username = forms.CharField(max_length=255) password = forms.CharField(max_length=255, widget=forms.PasswordInput) diff --git a/account/templates/dashboard.html b/account/templates/dashboard.html index ff65e1c..87b9e79 100644 --- a/account/templates/dashboard.html +++ b/account/templates/dashboard.html @@ -1,7 +1,6 @@ {% extends "base.html" %} -{% block body %} -
+{% block container %}

{{ request.user.username }}

@@ -29,5 +28,4 @@ {% endfor %}
-
-{% endblock body %} +{% endblock container %} diff --git a/account/urls.py b/account/urls.py index 6e24af4..8370e0f 100644 --- a/account/urls.py +++ b/account/urls.py @@ -3,6 +3,6 @@ from django.conf.urls import patterns, url urlpatterns = patterns( '', - url(r'^login/$', 'account.views.auth_login'), - url(r'^logout/$', 'account.views.auth_logout'), + url(r'^login/$', 'account.views.auth_login', name="auth_login"), + url(r'^logout/$', 'account.views.auth_logout', name="auth_logout"), ) \ No newline at end of file diff --git a/account/views.py b/account/views.py index 9e36077..a13ebf8 100644 --- a/account/views.py +++ b/account/views.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django.template.context import RequestContext @@ -6,9 +9,8 @@ from django.contrib.auth.models import User from account.forms import LoginForm - def auth_login(request): - redirect_to = request.REQUEST.get('next', '') or '/' + redirect_to = request.GET.get('next', '') or '/' if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): @@ -18,20 +20,26 @@ def auth_login(request): if user is not None: if user.is_active: login(request, user) - member, created = User.objects.get_or_create( - username=username) + member, created = \ + User.objects.get_or_create(username=username) if created: member.save() - return HttpResponseRedirect(redirect_to) + # save password in the session for later use with LDAP + request.session['ldap_password'] = password + response = HttpResponseRedirect(redirect_to) + response.set_cookie('sessionkey', 'bla') + return response else: print 'user is none' else: form = LoginForm() - return render_to_response('login.html', - RequestContext(request, locals())) + return render_to_response('login.html', + RequestContext(request, locals())) def auth_logout(request): - redirect_to = request.REQUEST.get('next', '') or '/' + redirect_to = request.GET.get('next', '') or '/' logout(request) - return HttpResponseRedirect(redirect_to) + response = HttpResponseRedirect(redirect_to) + response.delete_cookie('sessionkey') + return response diff --git a/cbmi/forms.py b/cbmi/forms.py index 93e4003..d06bbe6 100644 --- a/cbmi/forms.py +++ b/cbmi/forms.py @@ -18,4 +18,9 @@ class GastroPinField(forms.CharField): class GastroPinForm(forms.Form): - gastropin = GastroPinField() \ No newline at end of file + gastropin = GastroPinField() + + +class WlanPresenceForm(forms.Form): + # Boolean fields must never be required. + presence = forms.BooleanField(required=False) \ No newline at end of file diff --git a/cbmi/settings.py b/cbmi/settings.py index f322292..8db3812 100644 --- a/cbmi/settings.py +++ b/cbmi/settings.py @@ -88,6 +88,16 @@ TEMPLATE_LOADERS = ( 'django.template.loaders.app_directories.Loader', # 'django.template.loaders.eggs.Loader', ) +TEMPLATE_CONTEXT_PROCESSORS = ( + "django.contrib.auth.context_processors.auth", + "django.core.context_processors.debug", + "django.core.context_processors.i18n", + "django.core.context_processors.media", + "django.core.context_processors.static", + "django.core.context_processors.tz", + "django.contrib.messages.context_processors.messages", + "django.core.context_processors.request" +) MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', @@ -200,6 +210,8 @@ LOGGING = { } } +# LOGIN_URL = '/account/login' + try: from local_settings import * except ImportError, e: diff --git a/cbmi/templates/base.html b/cbmi/templates/base.html index ce4d198..2d43373 100644 --- a/cbmi/templates/base.html +++ b/cbmi/templates/base.html @@ -1,3 +1,4 @@ +{% load i18n %} @@ -63,6 +64,17 @@
{% block body %}
+ + {% block container %}
@@ -79,7 +91,8 @@
-
+ {% endblock container %} + {% endblock body %} diff --git a/cbmi/templates/group_list.html b/cbmi/templates/group_list.html index 9356146..0548fb2 100644 --- a/cbmi/templates/group_list.html +++ b/cbmi/templates/group_list.html @@ -1,7 +1,7 @@ {% extends "base.html" %} -{% block body %} -
+{% block container %} + BLA

members of {{ group.name }}

@@ -13,5 +13,4 @@ {% endfor %}
-
-{% endblock %} +{% endblock container %} diff --git a/cbmi/templates/wlan_presence.html b/cbmi/templates/wlan_presence.html new file mode 100644 index 0000000..ea201db --- /dev/null +++ b/cbmi/templates/wlan_presence.html @@ -0,0 +1,43 @@ +{% extends "base.html" %} +{% load i18n %} +{% block container %} +
+
+

{% trans "WiFi Presence"%}

+

{% blocktrans %}The WiFi Presence automatically logs you in + to the c-base presence system when you connect a device to the Crew-Wifi + (SSID: c-base-crew) with your username and password.{% endblocktrans %}

+ + {% if message %} +
{{ message }}
+ {% endif %} + + {{ form.non_field_errors }} + +
+ + {% csrf_token %} +
+ +
+ {{ form.presence.errors }} +
+
+ + + +
+
+
+
+ +
+
+
+
+
+{% endblock container %} diff --git a/cbmi/urls.py b/cbmi/urls.py index 72d5a43..1b9e252 100644 --- a/cbmi/urls.py +++ b/cbmi/urls.py @@ -13,4 +13,7 @@ urlpatterns = patterns('', url(r'^groups/(?P[^/]+)/', 'cbmi.views.groups_list'), url(r'^$', 'cbmi.views.landingpage'), url(r'^gastropin/$', 'cbmi.views.gastropin', name='gastropin'), + + url(r'^wlan_presence/$', 'cbmi.views.wlan_presence', name='wlan_presence'), + ) diff --git a/cbmi/views.py b/cbmi/views.py index e9d306b..f187c8a 100644 --- a/cbmi/views.py +++ b/cbmi/views.py @@ -1,11 +1,16 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import ldap +import copy + from django.shortcuts import render_to_response, get_object_or_404 from django.contrib.auth.decorators import login_required from django.contrib.auth.models import Group from django.shortcuts import render from django.utils.translation import ugettext as _ - -from forms import GastroPinForm +from forms import GastroPinForm, WlanPresenceForm def landingpage(request): is_ceymaster = is_admin = False @@ -16,6 +21,7 @@ def landingpage(request): groups = Group.objects.all() admins = Group.objects.get(name="ldap_admins").user_set.all() if request.user.is_authenticated(): + # values = get_user_values(request.user.username, request.session['ldap_password']) return render_to_response("dashboard.html", locals()) return render_to_response("base.html", locals()) @@ -49,3 +55,113 @@ def gastropin(request): form = GastroPinForm() return render(request, 'gastropin.html', {'form': form}) + +@login_required +def wlan_presence(request): + uv = UserValues(request.user.username, request.session['ldap_password']) + print "presence ist: ", uv.get_bool("wlanPresence") + + if request.method == 'POST': + form = WlanPresenceForm(request.POST) + if form.is_valid(): + + p = 'FALSE' + if form.cleaned_data['presence'] == True: + p = 'TRUE' + uv.set('wlanPresence', p) + uv.save() + new_form = WlanPresenceForm(initial={'presence': uv.get_bool("wlanPresence")}) + return render(request, 'wlan_presence.html', + {'message': _('Your Wifi Presenc has been set. Thank you!'), + 'form': new_form}) + else: + return render(request, 'wlan_presence.html', {'form:': form}) + else: + form = WlanPresenceForm(initial={'presence': uv.get_bool("wlanPresence")}) + + return render(request, 'wlan_presence.html', {'form': form}) + + +#def set_wlan_presence(request, value): +# """ +# +# """ +# set_boolean_value('wlanPresence', value, +# request.user.username, request.session['ldap_password']) + + +class UserValues(object): + """ + + """ + + def __init__(self, username, password): + self._username = username + self._password = password + self._old = self.get_user_values() + self._new = copy.deepcopy(self._old) + + def get(self, key, default=None): + return self._new.get(key, default)[0] + + def set(self, key, value): + self._new[key] = [value] + + def get_bool(self, key): + return self.get(key) == 'TRUE' + + def save(self): + """ + + """ + dn = "uid=%s,ou=crew,dc=c-base,dc=org" % self._username + print 'setting dn=', dn + + # TODO: Use settings for url + l = ldap.initialize("ldap://lea.cbrp3.c-base.org:389/") + l.simple_bind_s(dn, self._password) + + mod_attrs = [] + for new_key, new_value in self._new.items(): + # Replace is the default. + action = ldap.MOD_REPLACE + if new_key not in self._old.keys(): + action = ldap.MOD_ADD + mod_attrs.append((action, '%s' % new_key, new_value )) + continue + # Set the attribute and wait for the LDAP server to complete. + if self._old[new_key][0] != new_value[0]: + action = ldap.MOD_REPLACE + mod_attrs.append((action, '%s' % new_key, new_value )) + continue + + print "modattrs: ",mod_attrs + result = l.modify_s(dn, mod_attrs) + print "result is: ", result + + + def get_user_values(self): + """ + + """ + + dn = "ou=crew,dc=c-base,dc=org" + bind_dn = "uid=%s,ou=crew,dc=c-base,dc=org" % self._username + print('setting dn=', dn) + + # TODO: Use settings for url + l = ldap.initialize("ldap://lea.cbrp3.c-base.org:389/") + l.simple_bind_s(bind_dn, self._password) + + # Set the attribute and wait for the LDAP server to complete. + searchScope = ldap.SCOPE_SUBTREE + ## retrieve all attributes - again adjust to your needs - see documentation for more options + retrieveAttributes = None + searchFilter = "uid=%s" % self._username + + # get_attrs = [( ldap., 'wlanPresence', set_value )] + result = l.search_s(dn, searchScope, searchFilter, retrieveAttributes) + # TODO: latin1 + print "result is: ", result + # TODO: if len(result)==0 + return result[0][1]