summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coip/apps/membership/models.py35
-rw-r--r--coip/apps/membership/views.py23
-rw-r--r--coip/apps/name/views.py6
-rw-r--r--coip/multiresponse.py3
-rw-r--r--coip/urls.py2
-rw-r--r--site-media/css/style.css3
-rw-r--r--templates/apps/name/name.html49
-rw-r--r--templates/base.html2
8 files changed, 103 insertions, 20 deletions
diff --git a/coip/apps/membership/models.py b/coip/apps/membership/models.py
index 1430f64..0bb1185 100644
--- a/coip/apps/membership/models.py
+++ b/coip/apps/membership/models.py
@@ -9,12 +9,14 @@ from coip.apps.name.models import Name
import datetime
from pprint import pformat
import logging
+from coip.apps.service.models import Service
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')
name = models.ForeignKey(Name,related_name='memberships')
enabled = models.BooleanField()
hidden = models.BooleanField()
@@ -33,22 +35,43 @@ class Membership(models.Model):
return "active"
else:
return "inactive";
+
+ def is_user(self):
+ return self.user != None
+
+ def is_service(self):
+ return self.service != None
-def add_member(name,user,hidden=False):
- (m,created) = Membership.objects.get_or_create(user=user,name=name)
+def add_member(name,userorservice,hidden=False):
+ if isinstance(userorservice,User):
+ (m,created) = Membership.objects.get_or_create(user=userorservice,name=name)
+ else:
+ (m,created) = Membership.objects.get_or_create(service=userorservice,name=name)
+
if created or not m.enabled or m.hidden != hidden:
m.enabled = True
m.hidden = hidden
m.save()
-def disable_member(name,user):
- m = Membership.objects.get(name=name,user=user)
+def disable_member(name,userorservice):
+ if isinstance(userorservice,User):
+ m = Membership.objects.get(name=name,user=userorservice)
+ else:
+ m = Membership.objects.get(name=name,service=userorservice)
if m:
m.enabled = False
m.save()
-def remove_member(name,user):
- m = Membership.objects.get(name=name,user=user)
+def remove_member(name,userorservice):
+ if isinstance(userorservice,User):
+ m = Membership.objects.get(name=name,user=userorservice)
+ else:
+ m = Membership.objects.get(name=name,service=userorservice)
if m:
m.delete()
+def has_member(name,userorservice):
+ if isinstance(userorservice,User):
+ return Membership.objects.filter(name=name,user=userorservice)
+ else:
+ return Membership.objects.filter(name=name,service=userorservice) \ No newline at end of file
diff --git a/coip/apps/membership/views.py b/coip/apps/membership/views.py
index 11ce133..2f96251 100644
--- a/coip/apps/membership/views.py
+++ b/coip/apps/membership/views.py
@@ -4,8 +4,11 @@ Created on Jun 23, 2010
@author: leifj
'''
from django.shortcuts import get_object_or_404
-from coip.apps.membership.models import Membership
+from coip.apps.membership.models import Membership, add_member, remove_member
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
def show(request,id):
membership = get_object_or_404(Membership,pk=id)
@@ -17,4 +20,20 @@ def show(request,id):
{'membership': membership,
'render': {'edit': name.has_permission(request.user,'w'),
'delete': name.has_permission(request.user,'d'),
- 'disable': name.has_permission(request.user,'d')}}) \ No newline at end of file
+ 'disable': name.has_permission(request.user,'d')}})
+
+def join(request,id,member=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())
+
+def leave(request,id,member=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
diff --git a/coip/apps/name/views.py b/coip/apps/name/views.py
index c6d0621..90c0773 100644
--- a/coip/apps/name/views.py
+++ b/coip/apps/name/views.py
@@ -39,7 +39,7 @@ def delete(request,id):
name.remove(False)
if parent:
- return HttpResponseRedirect("/name/id/%d" % parent.id)
+ return HttpResponseRedirect(parent.url())
else:
return HttpResponseRedirect("/name");
else:
@@ -64,7 +64,7 @@ def add(request,id):
if form.is_valid():
name = form.save()
name.copyacl(name.parent)
- return HttpResponseRedirect("/name/id/%d" % name.id)
+ return HttpResponseRedirect(name.url())
else:
form = NewNameForm()
@@ -81,7 +81,7 @@ def edit(request,id):
form = NameEditForm(request.POST,instance=name)
if form.is_valid():
form.save()
- return HttpResponseRedirect("/name/id/%d" % name.id)
+ return HttpResponseRedirect(name.url())
else:
form = NameEditForm(instance=name)
diff --git a/coip/multiresponse.py b/coip/multiresponse.py
index 04a3721..c10c69a 100644
--- a/coip/multiresponse.py
+++ b/coip/multiresponse.py
@@ -7,6 +7,7 @@ from coip.apps.userprofile.utils import user_profile
from django.utils import simplejson
from django.template import loader
from coip.settings import PREFIX_URL
+from coip.apps.membership.models import has_member
default_suffix_mapping = {"\.htm(l?)$": "text/html",
"\.json$": "application/json",
@@ -38,8 +39,10 @@ def make_response_dict(request,d={}):
d['render'] = {'delete': name.has_permission(request.user,'d'),
'edit': name.has_permission(request.user,'w'),
'invite': name.has_permission(request.user,'i'),
+ 'kick': name.has_permission(request.user,'i'),
'acl': name.has_permission(request.user,'a'),
'add': name.has_permission(request.user,'w'),
+ 'join': name.has_permission(request.user,'i') and not has_member(name,request.user),
'up': (name.parent and name.parent.has_permission(request.user,'r')) or not name.parent}
return d
diff --git a/coip/urls.py b/coip/urls.py
index 5d2c65d..c201bd7 100644
--- a/coip/urls.py
+++ b/coip/urls.py
@@ -38,6 +38,8 @@ urlpatterns = patterns('',
(r'^name/(?P<id>[0-9]+)/edit$', 'coip.apps.name.views.edit'),
(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<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 a2d8996..5b70ffd 100644
--- a/site-media/css/style.css
+++ b/site-media/css/style.css
@@ -12,14 +12,13 @@ div#footer li { float: left; margin: 0 0.15em}
.navlist li { float: right; display: inline; margin: 0 0.15em; }
.ilist ul { list-style: none inside; padding: 0; margin: 0; }
.ilist li { float: left; display: inline; margin: 0; }
-.description { inherit: none; margin-bottom: 10px; }
+.description { padding: 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;}
div#left { float: left; width: 30%; padding-left: 5px; }
div#right { float: right; width: 65%; padding-left: 20px; height: 400px; }
div#related { position: absolute; bottom: 30%;}
-div#description { border-bottom: 1px solid #CECECE; }
ul.links { list-style: none inside; padding: 0; margin: 0; }
li.links { padding: 0; margin: 0; }
form .ui-widget ul { list-style: none inside; padding: 0; margin: 0; }
diff --git a/templates/apps/name/name.html b/templates/apps/name/name.html
index dce2028..d697c78 100644
--- a/templates/apps/name/name.html
+++ b/templates/apps/name/name.html
@@ -17,12 +17,35 @@
{% if not name %}
<h1>This is the top of the namespace</h1>
{% endif %}
- {% if name.description %}
- <div id="description" class="ui-widget infopanel">
- {% autoescape off %}
- <p class="description">{{name.description|safe}}</p>
- {% endautoescape %}
+ <div class="ui-widget ui-widget-content ui-helper-reset ui-corner-all">
+ {% if name.description %}
+ {% autoescape off %}
+ <p class="description">{{name.description|safe}}</p>
+ {% endautoescape %}
+ {% endif %}
+ {% if name %}
+ <div class="navlist toolbar">
+ <ul>
+ {% if render.acl %}
+ <li class="button"><a href="/name/{{name.id}}/link/0">Modify Access</a></li>
+ {% endif %}
+ {% if render.edit %}
+ <li class="button"><a href="/name/{{name.id}}/edit">Modify</a></li>
+ {% endif %}
+ {% if render.delete %}
+ <li class="button"><a href="/name/{{name.id}}/delete">Delete</a></li>
+ {% endif %}
+ {% if render.invite %}
+ <li class="button"><a href="/name/{{name.id}}/invite">Invite</a></li>
+ {% endif %}
+ {% if render.join %}
+ <li class="button"><a href="/name/{{name.id}}/join">Join</a></li>
+ {% endif %}
+ </ul>
+ </div>
+ <div class="clear"></div>
</div>
+
{% endif %}
{% if memberships and render.invite %}
<h3>Members</h3>
@@ -30,7 +53,21 @@
{% for m in memberships.all %}
<div id="m{{m.id}}" class="{{m.status}}">
<h3 class="listheader">{{m.user|lastidentifier}}</h3>
- <div>{{m.user|userdisplay}} ({{m.user|lastidentifier}}) became a member of {{name.shortname}} {{m.timecreated|datehumanize}}.</div>
+ <div>
+ <div>{{m.user|userdisplay}} ({{m.user|lastidentifier}}) became a member of {{name.shortname}} {{m.timecreated|datehumanize}}.</div>
+ <div class="navlist" style="margin-top: 10px;">
+ <ul>
+ {% if user == m.user %}
+ <li class="button"><a href="/name/{{name.id}}/{{m.user.username}}/leave">Leave Group</a></li>
+ {% else %}
+ {% if render.kick %}
+ <li class="button"><a href="/name/{{name.id}}/{{m.user.username}}/leave">Kick</a></li>
+ {% endif %}
+ {% endif %}
+ </ul>
+ </div>
+ <div class="clear"></div>
+ </div>
</div>
{% empty %}
<p>No members yet...</p>
diff --git a/templates/base.html b/templates/base.html
index d0f22ea..c702d71 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -81,7 +81,7 @@
</ul>
</div>
{% endif %}
- {% if name %}
+ {% if noname %}
<div class="navlist toolbar">
<ul>
{% if render.acl %}