summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coip/apps/entity/__init__.py (renamed from coip/apps/service/__init__.py)0
-rw-r--r--coip/apps/entity/admin.py4
-rw-r--r--coip/apps/entity/models.py (renamed from coip/apps/service/models.py)12
-rw-r--r--coip/apps/membership/forms.py29
-rw-r--r--coip/apps/membership/models.py40
-rw-r--r--coip/apps/membership/views.py57
-rw-r--r--coip/apps/service/admin.py4
-rw-r--r--coip/urls.py3
-rw-r--r--site-media/css/style.css2
-rw-r--r--templates/apps/membership/edit.html2
-rw-r--r--templates/apps/name/name.html10
-rw-r--r--templates/edit_fieldsets.html6
12 files changed, 111 insertions, 58 deletions
diff --git a/coip/apps/service/__init__.py b/coip/apps/entity/__init__.py
index e69de29..e69de29 100644
--- a/coip/apps/service/__init__.py
+++ b/coip/apps/entity/__init__.py
diff --git a/coip/apps/entity/admin.py b/coip/apps/entity/admin.py
new file mode 100644
index 0000000..516e153
--- /dev/null
+++ b/coip/apps/entity/admin.py
@@ -0,0 +1,4 @@
+from django.contrib import admin
+from coip.apps.entity.models import Entity
+
+admin.site.register(Entity) \ No newline at end of file
diff --git a/coip/apps/service/models.py b/coip/apps/entity/models.py
index 64dfcd5..7cafa24 100644
--- a/coip/apps/service/models.py
+++ b/coip/apps/entity/models.py
@@ -8,14 +8,22 @@ from django.db import models
import re
from pprint import pformat
import logging
-from django.db.models.fields import CharField
+from django.db.models.fields import CharField, SmallIntegerField
-class Service(models.Model):
+class Entity(models.Model):
+
+ SP = 0
+ IDP = 1
+
entityId = CharField(max_length=1024,unique=True,editable=False)
display_name = CharField(max_length=1024,blank=True,null=True)
+ type = SmallIntegerField(blank=False,editable=False,choices=((IDP,"Identity Provider"),(SP,"Entity Provider")))
timecreated = models.DateTimeField(auto_now_add=True)
lastupdated = models.DateTimeField(auto_now=True)
+ def __unicode__(self):
+ return "%s (%s)" % (self.name(),self.type)
+
def name(self):
if self.display_name:
return self.display_name
diff --git a/coip/apps/membership/forms.py b/coip/apps/membership/forms.py
index 512647f..d9f7fe8 100644
--- a/coip/apps/membership/forms.py
+++ b/coip/apps/membership/forms.py
@@ -3,14 +3,29 @@ Created on Jun 23, 2010
@author: leifj
'''
-from django import forms
from coip.apps.membership.models import Membership
+from form_utils.forms import BetterModelForm
+from django.forms.fields import ChoiceField
+from django.forms.widgets import Select, TextInput
-class MembershipForm(forms.ModelForm):
+class MembershipForm(BetterModelForm):
+ type = ChoiceField(choices=(("user","I'm adding a user to the group"),("entity","I'm adding a relying party (SP or IdP) to the group")), label="", widget=Select(attrs={'class':'link'}), required=False, initial="user")
class Meta:
model = Membership
-
-class InvitationForm(forms.ModelForm):
- class Meta:
- model = Membership
- fields = ['email'] \ No newline at end of file
+ fields = ['entity','user']
+ widgets = {
+ 'user': TextInput()
+ }
+ fieldsets = [('type', {'fields': ['type'],
+ 'legend': 'Which type of member are you adding to the group?',
+ 'description': 'Groups can consist of users and/or relying partys. Adding a relying party to a group limits can be useful if you want to limit the visibility of your group. This is an advanced option and you should know what you are doing.',
+ 'classes': ['step']}),
+ ('entity', {'fields': ['entity'],
+ 'legend': 'Adding a federation entity to the group',
+ 'description': 'Select the relying party you wish to add to the group.',
+ 'classes': ['step','submit_step']}),
+ ('user', {'fields': ['user'],
+ 'legend': 'Adding a user to the group',
+ 'description': 'Provide the federation identifier of the user you wish to join. That user must have already logged in at least once. To add a user that has not yet logged in, send an invitation instead.',
+ 'classes': ['step','submit_step']})
+ ] \ No newline at end of file
diff --git a/coip/apps/membership/models.py b/coip/apps/membership/models.py
index 0bb1185..0dc06ca 100644
--- a/coip/apps/membership/models.py
+++ b/coip/apps/membership/models.py
@@ -9,14 +9,14 @@ from coip.apps.name.models import Name
import datetime
from pprint import pformat
import logging
-from coip.apps.service.models import Service
+from coip.apps.entity.models import Entity
class Membership(models.Model):
'''
Membership in a namespace/group
'''
user = models.ForeignKey(User,blank=True,null=True,related_name='user')
- service = models.ForeignKey(Service,blank=True,null=True,related_name='service')
+ entity = models.ForeignKey(Entity,blank=True,null=True,related_name='entity')
name = models.ForeignKey(Name,related_name='memberships')
enabled = models.BooleanField()
hidden = models.BooleanField()
@@ -39,39 +39,39 @@ class Membership(models.Model):
def is_user(self):
return self.user != None
- def is_service(self):
- return self.service != None
+ def is_entity(self):
+ return self.entity != None
-def add_member(name,userorservice,hidden=False):
- if isinstance(userorservice,User):
- (m,created) = Membership.objects.get_or_create(user=userorservice,name=name)
+def add_member(name,member_name,hidden=False):
+ if isinstance(member_name,User):
+ (m,created) = Membership.objects.get_or_create(user=member_name,name=name)
else:
- (m,created) = Membership.objects.get_or_create(service=userorservice,name=name)
+ (m,created) = Membership.objects.get_or_create(entity=member_name,name=name)
if created or not m.enabled or m.hidden != hidden:
m.enabled = True
m.hidden = hidden
m.save()
-def disable_member(name,userorservice):
- if isinstance(userorservice,User):
- m = Membership.objects.get(name=name,user=userorservice)
+def disable_member(name,member_name):
+ if isinstance(member_name,User):
+ m = Membership.objects.get(name=name,user=member_name)
else:
- m = Membership.objects.get(name=name,service=userorservice)
+ m = Membership.objects.get(name=name,entity=member_name)
if m:
m.enabled = False
m.save()
-def remove_member(name,userorservice):
- if isinstance(userorservice,User):
- m = Membership.objects.get(name=name,user=userorservice)
+def remove_member(name,member_name):
+ if isinstance(member_name,User):
+ m = Membership.objects.get(name=name,user=member_name)
else:
- m = Membership.objects.get(name=name,service=userorservice)
+ m = Membership.objects.get(name=name,entity=member_name)
if m:
m.delete()
-def has_member(name,userorservice):
- if isinstance(userorservice,User):
- return Membership.objects.filter(name=name,user=userorservice)
+def has_member(name,member_name):
+ if isinstance(member_name,User):
+ return Membership.objects.filter(name=name,user=member_name)
else:
- return Membership.objects.filter(name=name,service=userorservice) \ No newline at end of file
+ return Membership.objects.filter(name=name,entity=member_name) \ No newline at end of file
diff --git a/coip/apps/membership/views.py b/coip/apps/membership/views.py
index 2f96251..fd7036e 100644
--- a/coip/apps/membership/views.py
+++ b/coip/apps/membership/views.py
@@ -9,6 +9,10 @@ from coip.multiresponse import render403, respond_to
from django.contrib.auth.models import User
from coip.apps.name.models import Name
from django.http import HttpResponseRedirect
+from django.core.exceptions import ObjectDoesNotExist
+from coip.apps.entity.models import Entity
+from django.contrib.auth.decorators import login_required
+from coip.apps.membership.forms import MembershipForm
def show(request,id):
membership = get_object_or_404(Membership,pk=id)
@@ -16,24 +20,43 @@ def show(request,id):
if not name.has_permission(request.user,'r'):
return render403("You do not have permission to view membership information for %s" % (name))
- return respond_to(request,{'text/html': 'apps/membership/membership.html'},
- {'membership': membership,
- 'render': {'edit': name.has_permission(request.user,'w'),
- 'delete': name.has_permission(request.user,'d'),
- 'disable': name.has_permission(request.user,'d')}})
+ return respond_to(request,
+ {'text/html': 'apps/membership/membership.html'},
+ {'membership': membership})
-def join(request,id,member=None):
+@login_required
+def join(request,id,membername=None):
name = get_object_or_404(Name,pk=id)
- user = request.user
- if member:
- user = User.objects.get(username=member)
- add_member(name, user)
- return HttpResponseRedirect(name.url())
+ if not name.has_permission(request.user,'i'):
+ return render403("You do not have permission to add members to %s" % (name))
+
+ if request.method == "POST":
+ m = Membership(name=name,enabled=True)
+ form = MembershipForm(request.POST,instance=m)
+ if form.is_valid():
+ m = form.save()
+ return HttpResponseRedirect(name.url())
+ else:
+ if membername:
+ try:
+ member = User.objects.get(username=membername)
+ except ObjectDoesNotExist:
+ member = Entity.objects.get(entityId=name)
+ add_member(name, member)
+ return HttpResponseRedirect(name.url())
+ else:
+ form = MembershipForm()
+ return respond_to(request,
+ {'text/html': 'apps/membership/edit.html'},
+ {'form': form,'name': name, 'formtitle': 'Add a member to %s' % name.short})
-def leave(request,id,member=None):
+@login_required
+def leave(request,id,membername=None):
name = get_object_or_404(Name,pk=id)
- user = request.user
- if member:
- user = User.objects.get(username=member)
- remove_member(name, user)
- return HttpResponseRedirect(name.url()) \ No newline at end of file
+ if membername:
+ try:
+ member = User.objects.get(username=membername)
+ except ObjectDoesNotExist:
+ member = Entity.objects.get(entityId=name)
+ remove_member(name, member)
+ return HttpResponseRedirect(name.url())
diff --git a/coip/apps/service/admin.py b/coip/apps/service/admin.py
deleted file mode 100644
index 67ebea9..0000000
--- a/coip/apps/service/admin.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from django.contrib import admin
-from coip.apps.service.models import Service
-
-admin.site.register(Service) \ No newline at end of file
diff --git a/coip/urls.py b/coip/urls.py
index c201bd7..ffabf11 100644
--- a/coip/urls.py
+++ b/coip/urls.py
@@ -39,7 +39,8 @@ urlpatterns = patterns('',
(r'^name/(?P<id>[0-9]+)/delete$', 'coip.apps.name.views.delete'),
(r'^name/(?P<id>[0-9]+)/add$', 'coip.apps.name.views.add'),
(r'^name/(?P<id>[0-9]+)/join$', 'coip.apps.membership.views.join'),
- (r'^name/(?P<id>[0-9]+)/(?P<member>[^\/]+)/leave$', 'coip.apps.membership.views.leave'),
+ (r'^name/(?P<id>[0-9]+)/join/(?P<membername>[^\/]+)$', 'coip.apps.membership.views.join'),
+ (r'^name/(?P<id>[0-9]+)/leave/(?P<membername>[^\/]+)$', 'coip.apps.membership.views.leave'),
(r'^name/(?P<name>.+)(?:\.([^\.]+))?$', 'coip.apps.name.views.show_by_name'),
# Name Links
(r'^name/(?P<id>[0-9]+)/link/(?P<type>[0-9]+).json$', 'coip.apps.name.views.links'),
diff --git a/site-media/css/style.css b/site-media/css/style.css
index 36b61e1..b827c95 100644
--- a/site-media/css/style.css
+++ b/site-media/css/style.css
@@ -14,7 +14,7 @@ div#footer li { float: left; margin: 0 0.15em}
.ilist li { float: left; display: inline; padding: inherit; }
.rlist ul { list-style: none inside; padding: inherit; }
.rlist li { float: right; display: inline; padding: inherit; }
-p.description { }
+p.description { padding-top: 20px; padding-bottom: 5px; }
div#headline{ font: 300% "Trebuchet MS", sans-serif; margin-bottom: 20px;}
.name { font: 100% "Trebuchet MS", sans-serif; margin-top: 5px;}
div.toolbar{ padding: 4px; float: right; margin-right: 50px; margin-top: 6px; margin-bottom: 20px;}
diff --git a/templates/apps/membership/edit.html b/templates/apps/membership/edit.html
index e9074b0..8174aea 100644
--- a/templates/apps/membership/edit.html
+++ b/templates/apps/membership/edit.html
@@ -1,6 +1,6 @@
{% extends "edit_fieldsets.html" %}
{% block widgets %}
- $('#form').formwizard({
+ $('#wizard').formwizard({
validationEnabled: true,
focusFirstInput: true,
textSubmit: "Finish"
diff --git a/templates/apps/name/name.html b/templates/apps/name/name.html
index ebf0402..2b773bf 100644
--- a/templates/apps/name/name.html
+++ b/templates/apps/name/name.html
@@ -38,9 +38,13 @@
{% if render.invite %}
<li class="button"><a href="/name/{{name.id}}/invite">Invite</a></li>
{% endif %}
+ {% if render.invite %}
+ <li class="button"><a href="/name/{{name.id}}/join">Add Member</a></li>
+ {% endif %}
{% if render.join %}
- <li class="button"><a href="/name/{{name.id}}/join">Join</a></li>
+ <li class="button"><a href="/name/{{name.id}}/join/{{user.username}}">Join</a></li>
{% endif %}
+
</ul>
</div>
<div class="clear"></div>
@@ -58,10 +62,10 @@
<div class="rlist">
<ul>
{% if user == m.user %}
- <li class="button"><a href="/name/{{name.id}}/{{m.user.username}}/leave">Leave Group</a></li>
+ <li class="button"><a href="/name/{{name.id}}/leave/{{m.user.username}}">Leave Group</a></li>
{% else %}
{% if render.kick %}
- <li class="button"><a href="/name/{{name.id}}/{{m.user.username}}/leave">Remove from Group</a></li>
+ <li class="button"><a href="/name/{{name.id}}/leave/{{m.user.username}}">Remove from Group</a></li>
{% endif %}
{% endif %}
</ul>
diff --git a/templates/edit_fieldsets.html b/templates/edit_fieldsets.html
index b86f3d9..d528a4c 100644
--- a/templates/edit_fieldsets.html
+++ b/templates/edit_fieldsets.html
@@ -13,7 +13,7 @@
<legend class="ui-state-highlight ui-corner-all">{{ fieldset.legend }}</legend>
{% endif %}
{% if fieldset.description %}
- <p>{{ fieldset.description }}</p>
+ <p class="description">{{ fieldset.description }}</p>
{% endif %}
<ul class="links">
{% for field in fieldset %}
@@ -35,7 +35,9 @@
<ul>
<li><input type="reset" value="Back"/></li>
<li><input type="submit" value="Finish"/></li>
- <li><input type="button" style="float: right;" onClick="document.location='{{name.url}}'" value="Cancel"/></li>
+ {% if name %}
+ <li style="float: right;"><input type="button" onClick="document.location='{{name.url}}'" value="Cancel"/></li>
+ {% endif %}
</ul>
</div>
</form>