diff options
-rw-r--r-- | coip/apps/entity/__init__.py (renamed from coip/apps/service/__init__.py) | 0 | ||||
-rw-r--r-- | coip/apps/entity/admin.py | 4 | ||||
-rw-r--r-- | coip/apps/entity/models.py (renamed from coip/apps/service/models.py) | 12 | ||||
-rw-r--r-- | coip/apps/membership/forms.py | 29 | ||||
-rw-r--r-- | coip/apps/membership/models.py | 40 | ||||
-rw-r--r-- | coip/apps/membership/views.py | 57 | ||||
-rw-r--r-- | coip/apps/service/admin.py | 4 | ||||
-rw-r--r-- | coip/urls.py | 3 | ||||
-rw-r--r-- | site-media/css/style.css | 2 | ||||
-rw-r--r-- | templates/apps/membership/edit.html | 2 | ||||
-rw-r--r-- | templates/apps/name/name.html | 10 | ||||
-rw-r--r-- | templates/edit_fieldsets.html | 6 |
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> |