[damned-lies] Add form to edit team's details by coordinator (Fixes #592529)



commit e6557cb6be1870c032dc171b218929d95f91feec
Author: Claude Paroz <claude 2xlibre net>
Date:   Sat Oct 10 20:37:04 2009 +0200

    Add form to edit team's details by coordinator (Fixes #592529)

 media/img/edit_small.png       |  Bin 0 -> 855 bytes
 teams/forms.py                 |   12 +++++++++++-
 teams/models.py                |   13 ++++++++++---
 teams/tests.py                 |   18 ++++++++++++++++++
 teams/urls.py                  |    6 +++++-
 teams/views.py                 |   32 ++++++++++++++++++++++++++------
 templates/module_detail.html   |    2 +-
 templates/teams/team_base.html |    7 ++++++-
 templates/teams/team_edit.html |   17 +++++++++++++++++
 9 files changed, 94 insertions(+), 13 deletions(-)
---
diff --git a/media/img/edit_small.png b/media/img/edit_small.png
new file mode 100644
index 0000000..15bc3a2
Binary files /dev/null and b/media/img/edit_small.png differ
diff --git a/teams/forms.py b/teams/forms.py
index 00124a5..d0092f5 100644
--- a/teams/forms.py
+++ b/teams/forms.py
@@ -1,5 +1,15 @@
 from django import forms
-from teams.models import ROLE_CHOICES
+from teams.models import Team, ROLE_CHOICES
+
+class EditTeamDetailsForm(forms.ModelForm):
+    class Meta:
+        model = Team
+        fields = ('webpage_url', 'mailing_list', 'mailing_list_subscribe')
+
+    def __init__(self, *args, **kwargs):
+        super(EditTeamDetailsForm, self).__init__(*args, **kwargs)
+        for f in ('webpage_url', 'mailing_list', 'mailing_list_subscribe'):
+            self.fields[f].widget.attrs['size'] = 60
 
 class EditMemberRoleForm(forms.Form):
 
diff --git a/teams/models.py b/teams/models.py
index 2164957..c318bb9 100644
--- a/teams/models.py
+++ b/teams/models.py
@@ -85,9 +85,9 @@ class Team(models.Model):
     name = models.CharField(max_length=80)
     description = models.TextField()
     members = models.ManyToManyField(Person, through='Role', related_name='teams')
-    webpage_url = models.URLField(null=True, blank=True)
-    mailing_list = models.EmailField(null=True, blank=True)
-    mailing_list_subscribe = models.URLField(null=True, blank=True)
+    webpage_url = models.URLField(null=True, blank=True, verbose_name=_("Web page"))
+    mailing_list = models.EmailField(null=True, blank=True, verbose_name=_("Mailing list"))
+    mailing_list_subscribe = models.URLField(null=True, blank=True, verbose_name=_("URL to subscribe"))
     objects = TeamManager()
 
     class Meta:
@@ -105,6 +105,13 @@ class Team(models.Model):
     def get_absolute_url(self):
         return ('team_slug', [self.name])
 
+    def can_edit(self, user):
+        """ Return True if user is allowed to edit this team
+            user is a User (from request.user), not a Person
+        """
+        coordinator = self.get_coordinator()
+        return user.is_authenticated() and coordinator and user.username == coordinator.username
+
     def fill_role(self, role, person):
         """ Used by TeamManager to prefill roles in team """
         if not self.roles:
diff --git a/teams/tests.py b/teams/tests.py
index 6ac3ac3..1fc4d66 100644
--- a/teams/tests.py
+++ b/teams/tests.py
@@ -29,6 +29,7 @@ class TeamTest(TestCase):
 
         self.pcoo = Person(first_name='John', last_name='Coordinator',
             email='jcoo imthebigboss fr', username= 'jcoo')
+        self.pcoo.set_password('password')
         self.pcoo.save()
 
         self.t = Team(name='fr', description='French')
@@ -124,3 +125,20 @@ class TeamTest(TestCase):
         self.assertEquals(len(mail.outbox), 1)
         self.assertEquals(mail.outbox[0].recipients()[0], self.pcoo.email)
 
+    def test_edit_team(self):
+        """ Test team edit form """
+        c = Client()
+        edit_url = reverse('team_edit', args = ['fr'], current_app='teams')
+        response = c.get(edit_url)
+        self.assertEquals(response.status_code, 403)
+        # Login as team coordinator
+        response = c.post('/login/', {'username': self.pcoo.username, 'password': 'password'})
+        # Try team modification
+        response = c.post(edit_url, {
+            'webpage_url'  : u"http://www.gnomefr.org/";,
+            'mailing_list' : u"gnomefr traduc org",
+            'mailing_list_subscribe': u""
+        })
+        team = Team.objects.get(name='fr')
+        self.assertEquals(team.webpage_url, u"http://www.gnomefr.org/";)
+
diff --git a/teams/urls.py b/teams/urls.py
index ae4370c..3a03d4d 100644
--- a/teams/urls.py
+++ b/teams/urls.py
@@ -16,10 +16,14 @@ urlpatterns = patterns('',
         view = 'teams.views.teams',
         name = 'teams'),
     url(
-        regex = r'(?P<team_slug>[\w\- ]+)',
+        regex = r'(?P<team_slug>[\w\- ]+)$',
         view = 'teams.views.team',
         name = 'team_slug'),
     url(
+        regex = r'(?P<team_slug>[\w\- ]+)/edit/',
+        view = 'teams.views.team_edit',
+        name = 'team_edit'),
+    url(
         regex = r'(?P<object_id>\d+)',
         view = 'django.views.generic.list_detail.object_detail',
         kwargs = dict(info_dict),
diff --git a/teams/views.py b/teams/views.py
index fcde33c..2844397 100644
--- a/teams/views.py
+++ b/teams/views.py
@@ -20,11 +20,13 @@
 # 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 from django.utils.translation import ugettext_lazy as _
+from django.http import HttpResponseRedirect, HttpResponseForbidden
 from django.shortcuts import render_to_response, get_object_or_404
+from django.core.urlresolvers import reverse
 from django.template import RequestContext
 from common import utils
 from teams.models import Team, FakeTeam, Role
-from teams.forms import EditMemberRoleForm
+from teams.forms import EditMemberRoleForm, EditTeamDetailsForm
 from languages.models import Language
 
 def teams(request):
@@ -72,8 +74,12 @@ def team(request, team_slug):
         coordinator = None
         mem_groups = ()
 
-    # Compare username because request.user is User and get_coordinator is Person
-    if request.user.is_authenticated() and coordinator and request.user.username == coordinator.username:
+    context = {
+        'pageSection': 'teams',
+        'team': team,
+        'can_edit_team': False,
+    }
+    if team.can_edit(request.user):
         if request.method == 'POST':
             form_type = request.POST['form_type']
             roles = Role.objects.filter(team=team, role=form_type)
@@ -98,9 +104,23 @@ def team(request, team_slug):
         translate_roles = Role.objects.filter(team=team, role='translator')
         if translate_roles:
             mem_groups[2]['form'] = EditMemberRoleForm(translate_roles)
+        context['can_edit_team'] = True
+
+    context['mem_groups'] = mem_groups
+    return render_to_response('teams/team_detail.html', context, context_instance=RequestContext(request))
+
+def team_edit(request, team_slug):
+    team = get_object_or_404(Team, name=team_slug)
+    if not team.can_edit(request.user):
+        return HttpResponseForbidden("You are not allowed to edit this team.")
+    form = EditTeamDetailsForm(request.POST or None, instance=team)
+    if request.method == 'POST':
+        if form.is_valid():
+            form.save()
+            return HttpResponseRedirect(reverse('team_slug', args=[team_slug]))
     context = {
-        'pageSection': 'teams',
         'team': team,
-        'mem_groups': mem_groups
+        'form': form
     }
-    return render_to_response('teams/team_detail.html', context, context_instance=RequestContext(request))
+    return render_to_response('teams/team_edit.html', context, context_instance=RequestContext(request))
+
diff --git a/templates/module_detail.html b/templates/module_detail.html
index a68a1c6..bf87654 100644
--- a/templates/module_detail.html
+++ b/templates/module_detail.html
@@ -80,7 +80,7 @@ $(document).ready(function() {
     <a href="#{{ branch.name }}">{{ branch.name }}</a>
   {% endfor %}
   {% if can_edit_branches %}
-    <a href="{% url stats.views.module_edit_branches module_name=module.name %}"><img src="/media/img/edit.png" alt="Edit" /></a>
+    <a href="{% url stats.views.module_edit_branches module_name=module.name %}"><img src="{{ MEDIA_URL }}img/edit.png" alt="Edit" /></a>
   {% endif %}
   </p>
 
diff --git a/templates/teams/team_base.html b/templates/teams/team_base.html
index 8929792..6384b8d 100644
--- a/templates/teams/team_base.html
+++ b/templates/teams/team_base.html
@@ -3,7 +3,12 @@
 
 {% with team.get_description as lang %}
 <table width="100%"><tr><td valign="top" width="50%">
-  <h2>{% trans "Details" %}</h2>
+
+  <h2>{% trans "Details" %}
+      {% if can_edit_team %}<a href="{% url team_edit team.name %}">
+        <img src="{{ MEDIA_URL }}img/edit_small.png" alt="Edit"/></a>
+      {% endif %}
+  </h2>
 
   {% if team.webpage_url %}
   <strong>{% blocktrans %}{{ lang }} Translation Team Page:{% endblocktrans %}</strong> 
diff --git a/templates/teams/team_edit.html b/templates/teams/team_edit.html
new file mode 100644
index 0000000..0436082
--- /dev/null
+++ b/templates/teams/team_edit.html
@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{{ team.get_description }}{% endblock %}
+
+{% block content %}
+<div class="mainpage">
+<h1>{{ team.get_description }}</h1>
+
+<form action="#" method="POST">
+<table>
+{{ form.as_table }}
+<tr><td colspan="2" align="right"><input type="submit" value="{% trans 'Save' %}"/></td></tr>
+</table>
+</form>
+
+</div>
+{% endblock %}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]