diff options
| author | Leif Johansson <leifj@sunet.se> | 2011-03-01 01:25:44 +0100 | 
|---|---|---|
| committer | Leif Johansson <leifj@sunet.se> | 2011-03-01 01:25:44 +0100 | 
| commit | dfdfc57b631ea681b857b2b038d27d922af605c7 (patch) | |
| tree | baa19368a20612251c9ad431149e28fd5bb4da10 | |
| parent | a3c3141ad80eb1de6d67b2452a7e92b8c21e02c4 (diff) | |
leave and join groups
| -rw-r--r-- | coip/apps/membership/models.py | 35 | ||||
| -rw-r--r-- | coip/apps/membership/views.py | 23 | ||||
| -rw-r--r-- | coip/apps/name/views.py | 6 | ||||
| -rw-r--r-- | coip/multiresponse.py | 3 | ||||
| -rw-r--r-- | coip/urls.py | 2 | ||||
| -rw-r--r-- | site-media/css/style.css | 3 | ||||
| -rw-r--r-- | templates/apps/name/name.html | 49 | ||||
| -rw-r--r-- | 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<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 %} | 
