diff --git a/symposion/teams/urls.py b/symposion/teams/urls.py index abe7803338645292407858d6d5a3ff7edbd65ea5..c96ca0d8c8c1ba34ecbaec53bb9686b676ba0a03 100644 --- a/symposion/teams/urls.py +++ b/symposion/teams/urls.py @@ -2,5 +2,8 @@ from django.conf.urls.defaults import * urlpatterns = patterns("symposion.teams.views", - url(r"^([\w\-]+)/$", "team_detail", name="team_detail"), + url(r"^(?P[\w\-]+)/$", "team_detail", name="team_detail"), + url(r"^(?P[\w\-]+)/join/$", "team_join", name="team_join"), + url(r"^(?P[\w\-]+)/leave/$", "team_leave", name="team_leave"), + ) diff --git a/symposion/teams/views.py b/symposion/teams/views.py index 3dcb5946fb61f6ded14ef43d1253714baed665b8..a2d719d0f2a1335d50f81bc6ce38f78bc7df873c 100644 --- a/symposion/teams/views.py +++ b/symposion/teams/views.py @@ -1,9 +1,35 @@ from django.http import Http404 -from django.shortcuts import render, get_object_or_404 +from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required -from symposion.teams.models import Team +from symposion.teams.models import Team, Membership + + +## perm checks +# +# @@@ these can be moved + +def can_join(team, user): + state = team.get_state_for_user(user) + + if team.access == "open" and state is None: + return True + elif team.access == "invitation" and state is "invited": + return True + else: + return False + + +def can_leave(team, user): + state = team.get_state_for_user(user) + if state == "member": # managers can't leave at the moment + return True + else: + return False + + +## views @login_required @@ -16,4 +42,39 @@ def team_detail(request, slug): return render(request, "teams/team_detail.html", { "team": team, "state": state, + "can_join": can_join(team, request.user), + "can_leave": can_leave(team, request.user), }) + + +@login_required +def team_join(request, slug): + team = get_object_or_404(Team, slug=slug) + state = team.get_state_for_user(request.user) + if team.access == "invitation" and state is None: + raise Http404() + + if can_join(team, request.user) and request.method == "POST": + membership, created = Membership.objects.get_or_create(team=team, user=request.user) + membership.state = "member" + membership.save() + # contrib.message + return redirect("team_detail", slug=slug) + else: + return redirect("team_detail", slug=slug) + + +@login_required +def team_leave(request, slug): + team = get_object_or_404(Team, slug=slug) + state = team.get_state_for_user(request.user) + if team.access == "invitation" and state is None: + raise Http404() + + if can_leave(team, request.user) and request.method == "POST": + membership = Membership.objects.get(team=team, user=request.user) + membership.delete() + # contrib.message + return redirect("dashboard") + else: + return redirect("team_detail", slug=slug) diff --git a/symposion_project/templates/dashboard.html b/symposion_project/templates/dashboard.html index 170ae704aba3ef85ca41a059979f5ee7e15ab425..559526282bd2444b0ffaad4bb59125d2613918a9 100644 --- a/symposion_project/templates/dashboard.html +++ b/symposion_project/templates/dashboard.html @@ -132,18 +132,14 @@
{% if user.memberships.exists %}

Your Teams

-
    +
    {% for membership in user.memberships.all %} -
  • - {% if membership.state == "manager" %} - {{ membership.team.name }} - {% else %} - {{ membership.team.name }} - {% endif %} - {{ membership.get_state_display }} -
  • +
    + {{ membership.team.name }} + {{ membership.get_state_display }} +
    {% endfor %} -
+ {% endif %} {% available_teams as available_teams %} {% if available_teams %} diff --git a/symposion_project/templates/teams/team_detail.html b/symposion_project/templates/teams/team_detail.html index c0723be67014db40fcbb62c97acdba2b128987b4..b423b6d5839563e257913b76c22d21ae27955c5e 100644 --- a/symposion_project/templates/teams/team_detail.html +++ b/symposion_project/templates/teams/team_detail.html @@ -5,4 +5,18 @@ {% block body %}

{{ team.name }}

+ {% if can_join %} +
+ {% csrf_token %} + +
+ {% endif %} + + {% if can_leave %} +
+ {% csrf_token %} + +
+ {% endif %} + {% endblock %}