<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,7 +1,9 @@
 from django import forms
 from django.utils.translation import ugettext_lazy as _
 
-from newprojects.models import Project
+from django.contrib.auth.models import User
+
+from newprojects.models import Project, ProjectMember
 
 # @@@ we should have auto slugs, even if suggested and overrideable
 
@@ -41,3 +43,33 @@ class ProjectUpdateForm(forms.ModelForm):
     class Meta:
         model = Project
         fields = ('name', 'description')
+
+
+class AddUserForm(forms.Form):
+    
+    recipient = forms.CharField(label=_(u&quot;User&quot;))
+    
+    def __init__(self, *args, **kwargs):
+        self.project = kwargs.pop(&quot;project&quot;)
+        super(AddUserForm, self).__init__(*args, **kwargs)
+    
+    def clean_recipient(self):
+        try:
+            user = User.objects.get(username__exact=self.cleaned_data['recipient'])
+        except User.DoesNotExist:
+            raise forms.ValidationError(_(&quot;There is no user with this username.&quot;))
+        
+        if ProjectMember.objects.filter(project=self.project, user=user).count() &gt; 0:
+            raise forms.ValidationError(_(&quot;User is already a member of this project.&quot;))
+        
+        return self.cleaned_data['recipient']
+    
+    def save(self, user):
+        new_member = User.objects.get(username__exact=self.cleaned_data['recipient'])
+        project_member = ProjectMember(project=self.project, user=new_member)
+        project_member.save()
+        self.project.members.add(project_member)
+        #if notification:
+        #    notification.send(self.project.member_users.all(), &quot;projects_new_member&quot;, {&quot;new_member&quot;: new_member, &quot;project&quot;: self.project})
+        #    notification.send([new_member], &quot;projects_added_as_member&quot;, {&quot;adder&quot;: user, &quot;project&quot;: self.project})
+        user.message_set.create(message=&quot;added %s to project&quot; % new_member)</diff>
      <filename>pinax/apps/newprojects/forms.py</filename>
    </modified>
    <modified>
      <diff>@@ -16,7 +16,7 @@ else:
     notification = None
 
 from newprojects.models import Project, ProjectMember
-from newprojects.forms import ProjectForm, ProjectUpdateForm
+from newprojects.forms import ProjectForm, ProjectUpdateForm, AddUserForm
 
 TOPIC_COUNT_SQL = &quot;&quot;&quot;
 SELECT COUNT(*)
@@ -97,45 +97,37 @@ def your_projects(request, template_name=&quot;newprojects/your_projects.html&quot;):
     }, context_instance=RequestContext(request))
 
 
-def project(request, group_slug=None, form_class=ProjectUpdateForm,
+def project(request, group_slug=None, form_class=ProjectUpdateForm, adduser_form_class=AddUserForm,
         template_name=&quot;newprojects/project.html&quot;):
     project = get_object_or_404(Project, slug=group_slug)
     
-    project_form = form_class(request.POST or None, instance=project)
-    
     if not request.user.is_authenticated():
         is_member = False
     else:
         is_member = project.user_is_member(request.user)
     
-    action = request.POST.get('action')
-    if action == 'update' and project_form.is_valid():
-        project = project_form.save()
-    elif action == 'join':
-        # @@@ should move to a method on the Project model?
-        if not is_member:
-            project_member = ProjectMember(project=project, user=request.user)
-            project.members.add(project_member)
-            project_member.save()
-            request.user.message_set.create(
-                message=_(&quot;You have joined the project %(project_name)s&quot;) % {&quot;project_name&quot;: project.name})
-            if notification:
-                notification.send([project.creator], &quot;projects_created_new_member&quot;, {&quot;user&quot;: request.user, &quot;project&quot;: project})
-                notification.send(project.member_users.all(), &quot;projects_new_member&quot;, {&quot;user&quot;: request.user, &quot;project&quot;: project})
-        else:
-            request.user.message_set.create(
-                message=_(&quot;You are already a member of project %(project_name)s&quot;) % {&quot;project_name&quot;: project.name})
-    elif action == 'leave':
-        project.members.remove(request.user)
-        request.user.message_set.create(message=&quot;You have left the project %(project_name)s&quot; % {&quot;project_name&quot;: project.name})
-        if notification:
-            pass # @@@ no notification on departure yet
+    action = request.POST.get(&quot;action&quot;)
+    if request.user == project.creator and action == &quot;update&quot;:
+        project_form = form_class(request.POST, instance=project)
+        if project_form.is_valid():
+            project = project_form.save()
+    else:
+        project_form = form_class(instance=project)
+    if request.user == project.creator and action == &quot;add&quot;:
+        adduser_form = adduser_form_class(request.POST, project=project)
+        if adduser_form.is_valid():
+            adduser_form.save(request.user)
+            adduser_form = adduser_form_class(project=project) # clear form
+    else:
+        adduser_form = adduser_form_class(project=project)
     
     # TODO: Shouldn't have to do this in the view. Should write new &quot;groupurl&quot; templatetag :(
     new_topic_url = reverse('topic_list', kwargs=project.get_url_kwargs())
     
+    print project_form._errors
     return render_to_response(template_name, {
         &quot;project_form&quot;: project_form,
+        &quot;adduser_form&quot;: adduser_form,
         &quot;project&quot;: project,
         &quot;is_member&quot;: is_member,
         &quot;new_topic_url&quot;: new_topic_url,</diff>
      <filename>pinax/apps/newprojects/views.py</filename>
    </modified>
    <modified>
      <diff>@@ -64,40 +64,41 @@
                 &lt;/form&gt;
             &lt;/div&gt;
             
-            {% ifequal project.members.all.count 1 %}
-                &lt;p&gt;&lt;img src=&quot;{{ MEDIA_URL }}pinax/images/silk/icons/delete.png&quot; /&gt; &lt;a href=&quot;#&quot; onclick=&quot;$('#delete_project_form').toggle(); return false;&quot;&gt;{% trans &quot;Delete project&quot; %}&lt;/a&gt;&lt;p&gt;
-                 &lt;form class=&quot;delete_form&quot; id=&quot;delete_project_form&quot; action=&quot;{% url project_delete project.slug %}&quot; method=&quot;POST&quot; style=&quot;display: none;&quot;&gt;
-                     &lt;input type=&quot;submit&quot; value=&quot;{% trans &quot;Delete Project&quot; %}&quot; /&gt; (all content will be removed)
-                &lt;/form&gt;
-            {% else %}
-                &lt;p&gt;{% trans &quot;You are not the only member of the project so you can't delete the project.&quot; %}&lt;/p&gt;
-            {% endifequal %}
-            
         {% endifequal %}
         
         {% if user.is_authenticated %}
             &lt;div&gt;
-                &lt;form method=&quot;POST&quot; action=&quot;&quot;&gt;
-                    {% if is_member %}
-                        {% ifequal user project.creator %}
-                            &lt;p&gt;{% trans &quot;You are the creator of this project so can't leave (yet).&quot; %}&lt;/p&gt;
-                        {% else %}
-                            &lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;leave&quot; /&gt;
-                            &lt;input type=&quot;submit&quot; value=&quot;{% trans &quot;leave&quot; %}&quot;/&gt;
-                        {% endifequal %}
+                {% if is_member %}
+                    {% ifequal user project.creator %}
+                        &lt;p&gt;You are the creator of this project.&lt;/p&gt;
+                        
+                        &lt;div class=&quot;form-toggle&quot;&gt;
+                            &lt;p&gt;&lt;span id=&quot;add-member-toggle&quot;&gt;{% trans &quot;Add new member&quot; %}&lt;/a&gt;&lt;/p&gt;
+                            
+                            &lt;form class=&quot;uniForm&quot; id=&quot;add-member&quot; method=&quot;POST&quot; action=&quot;&quot;&gt;
+                                &lt;fieldset class=&quot;inlineLabels&quot;&gt;
+                                    {{ adduser_form|as_uni_form }}
+                                    &lt;div class=&quot;form_block&quot;&gt;
+                                        &lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;add&quot; /&gt;
+                                        &lt;input type=&quot;submit&quot; value=&quot;{% trans &quot;add&quot; %}&quot;/&gt;
+                                    &lt;/div&gt;
+                                &lt;/fieldset&gt;
+                            &lt;/form&gt;
+                        &lt;/div&gt;
+                        
+                        &lt;p&gt;&lt;img src=&quot;{{ MEDIA_URL }}pinax/images/silk/icons/delete.png&quot; /&gt; &lt;a href=&quot;#&quot; onclick=&quot;$('#delete_project_form').toggle(); return false;&quot;&gt;{% trans &quot;Delete project&quot; %}&lt;/a&gt;&lt;p&gt;
+                         &lt;form class=&quot;delete_form&quot; id=&quot;delete_project_form&quot; action=&quot;{% url project_delete project.slug %}&quot; method=&quot;POST&quot; style=&quot;display: none;&quot;&gt;
+                             &lt;input type=&quot;submit&quot; value=&quot;{% trans &quot;Delete Project&quot; %}&quot; /&gt; (all content will be removed)
+                        &lt;/form&gt;
                     {% else %}
-                        &lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;join&quot; /&gt;
-                        &lt;input type=&quot;submit&quot; value=&quot;{% trans &quot;join project&quot; %}&quot;/&gt;
-                    {% endif %}
-                &lt;/form&gt;
+                        &lt;p&gt;You are member of this project.&lt;/p&gt;
+                    {% endifequal %}
+                {% else %}
+                    &lt;p&gt;It is up to the creator of this project (&lt;a href=&quot;{% url profile_detail project.creator.username %}&quot;&gt;{{ project.creator }}&lt;/a&gt;) to add you.&lt;/p&gt;
+                {% endif %}
             &lt;/div&gt;
-        {% else %}
-            {% url acct_signup as signup_url %}
-            {% url acct_login as login_url %}
-            &lt;p&gt;{% blocktrans %}&lt;a href=&quot;{{ signup_url }}&quot;&gt;Sign up&lt;/a&gt; and &lt;a href=&quot;{{ login_url }}&quot;&gt;log in &lt;/a&gt; to join this project.{% endblocktrans %}&lt;/p&gt;
         {% endif %}
         
-        
         {% if user.is_authenticated %}
             &lt;h2&gt;{% trans &quot;Discussion Topics&quot; %}{% if project.topics.all.count %} ({{ project.topics.all.count }}){% endif %}&lt;/h2&gt;
             
@@ -163,6 +164,16 @@
                 $('#edit-project').show();
                 $('#edit-project .error').autoscroll();
             }
+            $('#add-member').hide();
+            $('#add-member-toggle').click(function() {
+                $('#add-member').toggle();
+                $('#add-member').autoscroll();
+                return false;
+            });
+            if ($('#add-member .error').length) {
+                $('#add-member').show();
+                $('#add-member .error').autoscroll();
+            }
         });
     &lt;/script&gt;
     </diff>
      <filename>pinax/templates/default/newprojects/project.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b96644f9686e0aae6c0a8debb26ee8c03b7f1e62</id>
    </parent>
  </parents>
  <author>
    <name>James Tauber</name>
    <email>jtauber@jtauber.com</email>
  </author>
  <url>http://github.com/pinax/pinax/commit/a1b6d301348981aafda5d514f7bccf839941fd5c</url>
  <id>a1b6d301348981aafda5d514f7bccf839941fd5c</id>
  <committed-date>2009-06-23T22:37:08-07:00</committed-date>
  <authored-date>2009-06-23T22:37:08-07:00</authored-date>
  <message>changed newprojects to have same approach to membership as old projects and not just copied from newtribes</message>
  <tree>0f5dd9d7314636a06ddcf1e3a202e87e761f9882</tree>
  <committer>
    <name>James Tauber</name>
    <email>jtauber@jtauber.com</email>
  </committer>
</commit>
