From dfdfc57b631ea681b857b2b038d27d922af605c7 Mon Sep 17 00:00:00 2001 From: Leif Johansson Date: Tue, 1 Mar 2011 01:25:44 +0100 Subject: leave and join groups --- coip/apps/membership/models.py | 35 ++++++++++++++++++++++++------ coip/apps/membership/views.py | 23 ++++++++++++++++++-- coip/apps/name/views.py | 6 +++--- coip/multiresponse.py | 3 +++ coip/urls.py | 2 ++ site-media/css/style.css | 3 +-- templates/apps/name/name.html | 49 ++++++++++++++++++++++++++++++++++++------ templates/base.html | 2 +- 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[0-9]+)/edit$', 'coip.apps.name.views.edit'), (r'^name/(?P[0-9]+)/delete$', 'coip.apps.name.views.delete'), (r'^name/(?P[0-9]+)/add$', 'coip.apps.name.views.add'), + (r'^name/(?P[0-9]+)/join$', 'coip.apps.membership.views.join'), + (r'^name/(?P[0-9]+)/(?P[^\/]+)/leave$', 'coip.apps.membership.views.leave'), (r'^name/(?P.+)(?:\.([^\.]+))?$', 'coip.apps.name.views.show_by_name'), # Name Links (r'^name/(?P[0-9]+)/link/(?P[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 %}

This is the top of the namespace

{% endif %} - {% if name.description %} -
- {% autoescape off %} -

{{name.description|safe}}

- {% endautoescape %} +
+ {% if name.description %} + {% autoescape off %} +

{{name.description|safe}}

+ {% endautoescape %} + {% endif %} + {% if name %} + +
+ {% endif %} {% if memberships and render.invite %}

Members

@@ -30,7 +53,21 @@ {% for m in memberships.all %}

{{m.user|lastidentifier}}

-
{{m.user|userdisplay}} ({{m.user|lastidentifier}}) became a member of {{name.shortname}} {{m.timecreated|datehumanize}}.
+
+
{{m.user|userdisplay}} ({{m.user|lastidentifier}}) became a member of {{name.shortname}} {{m.timecreated|datehumanize}}.
+ +
+
{% empty %}

No members yet...

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 @@
{% endif %} - {% if name %} + {% if noname %}