setting wifi presence

This commit is contained in:
Uwe Kamper 2013-10-24 01:49:46 +02:00
parent 032bc5acaa
commit 0aade5be94
11 changed files with 220 additions and 24 deletions

View file

@ -1,6 +1,5 @@
from django import forms from django import forms
class LoginForm(forms.Form): class LoginForm(forms.Form):
username = forms.CharField(max_length=255) username = forms.CharField(max_length=255)
password = forms.CharField(max_length=255, widget=forms.PasswordInput) password = forms.CharField(max_length=255, widget=forms.PasswordInput)

View file

@ -1,7 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block body %} {% block container %}
<div class="container">
<div class="row"> <div class="row">
<div class="span12"> <div class="span12">
<h2>{{ request.user.username }}</h2> <h2>{{ request.user.username }}</h2>
@ -29,5 +28,4 @@
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
</div> {% endblock container %}
{% endblock body %}

View file

@ -3,6 +3,6 @@ from django.conf.urls import patterns, url
urlpatterns = patterns( urlpatterns = patterns(
'', '',
url(r'^login/$', 'account.views.auth_login'), url(r'^login/$', 'account.views.auth_login', name="auth_login"),
url(r'^logout/$', 'account.views.auth_logout'), url(r'^logout/$', 'account.views.auth_logout', name="auth_logout"),
) )

View file

@ -1,3 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.template.context import RequestContext from django.template.context import RequestContext
@ -6,9 +9,8 @@ from django.contrib.auth.models import User
from account.forms import LoginForm from account.forms import LoginForm
def auth_login(request): def auth_login(request):
redirect_to = request.REQUEST.get('next', '') or '/' redirect_to = request.GET.get('next', '') or '/'
if request.method == 'POST': if request.method == 'POST':
form = LoginForm(request.POST) form = LoginForm(request.POST)
if form.is_valid(): if form.is_valid():
@ -18,20 +20,26 @@ def auth_login(request):
if user is not None: if user is not None:
if user.is_active: if user.is_active:
login(request, user) login(request, user)
member, created = User.objects.get_or_create( member, created = \
username=username) User.objects.get_or_create(username=username)
if created: if created:
member.save() 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: else:
print 'user is none' print 'user is none'
else: else:
form = LoginForm() form = LoginForm()
return render_to_response('login.html', return render_to_response('login.html',
RequestContext(request, locals())) RequestContext(request, locals()))
def auth_logout(request): def auth_logout(request):
redirect_to = request.REQUEST.get('next', '') or '/' redirect_to = request.GET.get('next', '') or '/'
logout(request) logout(request)
return HttpResponseRedirect(redirect_to) response = HttpResponseRedirect(redirect_to)
response.delete_cookie('sessionkey')
return response

View file

@ -19,3 +19,8 @@ class GastroPinField(forms.CharField):
class GastroPinForm(forms.Form): class GastroPinForm(forms.Form):
gastropin = GastroPinField() gastropin = GastroPinField()
class WlanPresenceForm(forms.Form):
# Boolean fields must never be required.
presence = forms.BooleanField(required=False)

View file

@ -88,6 +88,16 @@ TEMPLATE_LOADERS = (
'django.template.loaders.app_directories.Loader', 'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.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 = ( MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
@ -200,6 +210,8 @@ LOGGING = {
} }
} }
# LOGIN_URL = '/account/login'
try: try:
from local_settings import * from local_settings import *
except ImportError, e: except ImportError, e:

View file

@ -1,3 +1,4 @@
{% load i18n %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
<head> <head>
@ -63,6 +64,17 @@
<br/> <br/>
{% block body %} {% block body %}
<div class="container"> <div class="container">
<ul class="nav nav-tabs">
{% url cbmi.views.landingpage as landing_page_url %}
<li class="{% if request.path == landing_page_url %}active{% endif %}">
<a href="{{ landing_page_url }}">{% trans "Home" %}</a>
</li>
{% url cbmi.views.wlan_presence as wlan_presence_url %}
<li class="{% if request.path == wlan_presence_url %}active{% endif %}">
<a href="{{ wlan_presence_url }}">{% trans "WLAN Presence" %}</a>
</li>
</ul>
{% block container %}
<div class="row"> <div class="row">
<div class="span12"> <div class="span12">
<div class="well"> <div class="well">
@ -79,7 +91,8 @@
</div> </div>
</div> </div>
</div> </div>
</div> {% endblock container %}
</div><!-- /.container -->
{% endblock body %} {% endblock body %}
<script src="/static/js/bootstrap.js"></script> <script src="/static/js/bootstrap.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>

View file

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block body %} {% block container %}
<div class="container"> BLA
<div class="row"> <div class="row">
<div class="span12"> <div class="span12">
<h2>members of {{ group.name }}</h2> <h2>members of {{ group.name }}</h2>
@ -13,5 +13,4 @@
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
</div> {% endblock container %}
{% endblock %}

View file

@ -0,0 +1,43 @@
{% extends "base.html" %}
{% load i18n %}
{% block container %}
<div class="row">
<div class="span12">
<h2>{% trans "WiFi Presence"%}</h2>
<p>{% 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 %}</p>
{% if message %}
<div class="alert alert-success">{{ message }}</div>
{% endif %}
{{ form.non_field_errors }}
<form action="{% url cbmi.views.wlan_presence %}" method="post" class="form-horizontal well">
{% csrf_token %}
<div class="control-group">
<label class="control-label" for="if_presence">{% trans "WLAN-Presence" %}</label>
<div>
{{ form.presence.errors }}
</div>
<div class="controls">
<label class="checkbox">
{{ form.presence }}
{# <input name="presence" value="1" id="id_presence" type="checkbox"#}
{# {% if form.presence.value %}checked="checked"{% endif %} /> {% trans "aktivieren?" %}#}
</label>
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn btn-primary">Speichern</button>
</div>
</div>
</form>
</div>
</div>
{% endblock container %}

View file

@ -13,4 +13,7 @@ urlpatterns = patterns('',
url(r'^groups/(?P<group_name>[^/]+)/', 'cbmi.views.groups_list'), url(r'^groups/(?P<group_name>[^/]+)/', 'cbmi.views.groups_list'),
url(r'^$', 'cbmi.views.landingpage'), url(r'^$', 'cbmi.views.landingpage'),
url(r'^gastropin/$', 'cbmi.views.gastropin', name='gastropin'), url(r'^gastropin/$', 'cbmi.views.gastropin', name='gastropin'),
url(r'^wlan_presence/$', 'cbmi.views.wlan_presence', name='wlan_presence'),
) )

View file

@ -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.shortcuts import render_to_response, get_object_or_404
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.shortcuts import render from django.shortcuts import render
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from forms import GastroPinForm, WlanPresenceForm
from forms import GastroPinForm
def landingpage(request): def landingpage(request):
is_ceymaster = is_admin = False is_ceymaster = is_admin = False
@ -16,6 +21,7 @@ def landingpage(request):
groups = Group.objects.all() groups = Group.objects.all()
admins = Group.objects.get(name="ldap_admins").user_set.all() admins = Group.objects.get(name="ldap_admins").user_set.all()
if request.user.is_authenticated(): 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("dashboard.html", locals())
return render_to_response("base.html", locals()) return render_to_response("base.html", locals())
@ -49,3 +55,113 @@ def gastropin(request):
form = GastroPinForm() form = GastroPinForm()
return render(request, 'gastropin.html', {'form': form}) 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]