Skip to content

Commit

Permalink
Merge branch 'master' of git@github.com:pinax/pinax
Browse files Browse the repository at this point in the history
  • Loading branch information
jezdez committed May 12, 2009
2 parents 8ba4a57 + ca167d7 commit a511f0e
Show file tree
Hide file tree
Showing 30 changed files with 446 additions and 491 deletions.
4 changes: 2 additions & 2 deletions pinax/apps/profiles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ def profile(request, username, template_name="profiles/profile.html"):
'to_user': username,
'message': ugettext("Let's be friends!"),
})
previous_invitations_to = FriendshipInvitation.objects.filter(to_user=other_user, from_user=request.user)
previous_invitations_from = FriendshipInvitation.objects.filter(to_user=request.user, from_user=other_user)
previous_invitations_to = FriendshipInvitation.objects.filter(to_user=other_user, from_user=request.user).exclude(status=8)
previous_invitations_from = FriendshipInvitation.objects.filter(to_user=request.user, from_user=other_user).exclude(status=8)

if is_me:
if request.method == "POST":
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"pk": 1,
"model": "auth.user",
"fields": {
"username": "tester",
"first_name": "",
"last_name": "",
"is_active": true,
"is_superuser": false,
"is_staff": false,
"last_login": "2009-05-11 12:00:00",
"groups": [],
"user_permissions": [],
"password": "sha1$1d0c5$628050793db288b947f240952a8468062440452d",
"email": "",
"date_joined": "2009-05-11 12:00:00"
}
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

{% block rtab_id %}id="groups_tab"{% endblock %}

{% block extra_head %}
<link rel="stylesheet" href="{{ MEDIA_URL }}basic_groups/css/basic_groups.css" />
{% endblock %}

{% block subnav %}
<ul>
{% if user.is_authenticated %}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{% extends "basic_groups/base.html" %}

{% load i18n %}
{% load uni_form %}
{% load humanize %}
{% load pagination_tags %}
{% load order_by %}
{% load extra_tagging_tags %}
{% load group_tags %}
{% load uni_form %}

{% block head_title %}{% blocktrans %}Create Group{% endblocktrans %}{% endblock %}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ <h1>{% trans "Group" %} {{ group.name }}</h1>
{% if user.is_authenticated %}
<div>
<form method="POST" action="">
{% if are_member %}
{% if is_member %}
{% ifequal user group.creator %}
<p>{% trans "You are the creator of this group so can't leave (yet)." %}</p>
{% else %}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from django.test import TestCase

from basic_groups.models import BasicGroup

class BasicGroupsTest(TestCase):
fixtures = ["basic_groups_auth.json"]

def test_unauth_create_get(self):
"""can an unauth'd user get to page?"""

response = self.client.get("/groups/create/")
self.assertEqual(response.status_code, 302)
self.assertEqual(response["location"], "http://testserver/account/login?next=/groups/create/")

def test_auth_create_get(self):
"""can an auth'd user get to page?"""

logged_in = self.client.login(username="tester", password="tester")
self.assertTrue(logged_in)
response = self.client.get("/groups/create/")
self.assertEqual(response.status_code, 200)

def test_unauth_create_post(self):
"""can an unauth'd user post to create a new group?"""

response = self.client.post("/groups/create/")
self.assertEqual(response.status_code, 302)
self.assertEqual(response["location"], "http://testserver/account/login?next=/groups/create/")

def test_auth_create_post(self):
"""can an auth'd user post to create a new group?"""

logged_in = self.client.login(username="tester", password="tester")
self.assertTrue(logged_in)
response = self.client.post("/groups/create/", {
"slug": "test",
"name": "Test Group",
"description": "A test group.",
})
self.assertEqual(response.status_code, 302)
self.assertEqual(response["location"], "http://testserver/groups/group/test/")
self.assertEqual(BasicGroup.objects.get(slug="test").creator.username, "tester")
self.assertEqual(BasicGroup.objects.get(slug="test").members.all()[0].username, "tester")

def test_auth_creator_membership(self):
"""is membership for creator correct?"""

logged_in = self.client.login(username="tester", password="tester")
self.assertTrue(logged_in)
response = self.client.post("/groups/create/", {
"slug": "test",
"name": "Test Group",
"description": "A test group.",
})
response = self.client.get("/groups/group/test/")
self.assertEqual(BasicGroup.objects.get(slug="test").creator.username, "tester")
self.assertEqual(BasicGroup.objects.get(slug="test").members.all()[0].username, "tester")
self.assertEqual(response.context[0]["is_member"], True)
74 changes: 35 additions & 39 deletions pinax/projects/temp_group_project/apps/basic_groups/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,19 @@

@login_required
def create(request, form_class=BasicGroupForm, template_name="basic_groups/create.html"):
if request.method == "POST":
if request.POST["action"] == "create": # @@@ why bother?
group_form = form_class(request.POST)
if group_form.is_valid():
group = group_form.save(commit=False)
group.creator = request.user
group.save()
group.members.add(request.user)
group.save()
if notification:
# @@@ might be worth having a shortcut for sending to all users
notification.send(User.objects.all(), "groups_new_group", {"group": group}, queue=True)
return HttpResponseRedirect(group.get_absolute_url())
else:
group_form = form_class()
else:
group_form = form_class()

group_form = form_class(request.POST or None)

if group_form.is_valid():
group = group_form.save(commit=False)
group.creator = request.user
group.save()
group.members.add(request.user)
group.save()
if notification:
# @@@ might be worth having a shortcut for sending to all users
notification.send(User.objects.all(), "groups_new_group", {"group": group}, queue=True)
return HttpResponseRedirect(group.get_absolute_url())

return render_to_response(template_name, {
"group_form": group_form,
Expand Down Expand Up @@ -74,31 +70,31 @@ def your_groups(request, template_name="basic_groups/your_groups.html"):
def group(request, group_slug=None, form_class=BasicGroupUpdateForm, template_name="basic_groups/group.html"):
group = get_object_or_404(BasicGroup, slug=group_slug)

if request.user.is_authenticated() and request.method == "POST":
if request.POST["action"] == "update" and request.user == group.creator:
group_form = form_class(request.POST, instance=group)
if group_form.is_valid():
group = group_form.save()
else:
group_form = form_class(instance=group)
if request.POST["action"] == "join":
group.members.add(request.user)
request.user.message_set.create(message="You have joined the group %s" % group.name)
if notification:
notification.send([group.creator], "groups_created_new_member", {"user": request.user, "group": group})
notification.send(group.members.all(), "groups_new_member", {"user": request.user, "group": group})
elif request.POST["action"] == "leave":
group.members.remove(request.user)
request.user.message_set.create(message="You have left the group %s" % group.name)
if notification:
pass # @@@ no notification on departure yet
else:
group_form = form_class(instance=group)
group_form = form_class(request.POST or None, instance=group)

are_member = request.user in group.members.all()
action = request.POST.get('action')

if action == "update" and group_form.is_valid():
group = group_form.save()
elif action == "join":
group.members.add(request.user)
request.user.message_set.create(message="You have joined the group %s" % group.name)
if notification:
notification.send([group.creator], "groups_created_new_member", {"user": request.user, "group": group})
notification.send(group.members.all(), "groups_new_member", {"user": request.user, "group": group})
elif action == "leave":
group.members.remove(request.user)
request.user.message_set.create(message="You have left the group %s" % group.name)
if notification:
pass # @@@ no notification on departure yet

if not request.user.is_authenticated():
is_member = False
else:
is_member = group.user_is_member(request.user)

return render_to_response(template_name, {
"group_form": group_form,
"group": group,
"are_member": are_member,
"is_member": is_member,
}, context_instance=RequestContext(request))
2 changes: 1 addition & 1 deletion pinax/projects/temp_group_project/apps/groups_ng/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Group(models.Model):

slug = models.SlugField(_('slug'), unique=True)
name = models.CharField(_('name'), max_length=80, unique=True)
creator = models.ForeignKey(User, verbose_name=_('creator'))
creator = models.ForeignKey(User, verbose_name=_('creator'), related_name="%(class)s_created")
created = models.DateTimeField(_('created'), default=datetime.datetime.now)
description = models.TextField(_('description'))
# Subclass must provide members field or replace user_is_member()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"pk": 1,
"model": "auth.user",
"fields": {
"username": "tester",
"first_name": "",
"last_name": "",
"is_active": true,
"is_superuser": false,
"is_staff": false,
"last_login": "2009-05-11 12:00:00",
"groups": [],
"user_permissions": [],
"password": "sha1$1d0c5$628050793db288b947f240952a8468062440452d",
"email": "",
"date_joined": "2009-05-11 12:00:00"
}
}
]
24 changes: 22 additions & 2 deletions pinax/projects/temp_group_project/apps/newprojects/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from datetime import datetime

from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
Expand All @@ -7,10 +9,28 @@

class Project(Group):

members = models.ManyToManyField(User, related_name='projects', verbose_name=_('members'))
member_users = models.ManyToManyField(User, through="ProjectMember", verbose_name=_('members'))

# private means only members can see the project
private = models.BooleanField(_('private'), default=False)

def get_absolute_url(self):
return reverse('project_detail', kwargs={'group_slug': self.slug})

def user_is_member(self, user):
if ProjectMember.objects.filter(project=self, user=user).count() > 0: # @@@ is there a better way?
return True
else:
return False

def get_url_kwargs(self):
return {'group_slug': self.slug}
return {'group_slug': self.slug}


class ProjectMember(models.Model):
project = models.ForeignKey(Project, related_name="members", verbose_name=_('project'))
user = models.ForeignKey(User, related_name="projects", verbose_name=_('user'))

away = models.BooleanField(_('away'), default=False)
away_message = models.CharField(_('away_message'), max_length=500)
away_since = models.DateTimeField(_('away since'), default=datetime.now)
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<ul>
{% if user.is_authenticated %}
<li><a href="{% url your_projects %} ">{% trans "Your Projects" %}</a></li>
<li><a href="{% url project_create %}">{% trans "Create a Project" %}</a></li>
{% endif %}
<li><a href="{% url project_list %}">{% trans "All Projects" %}</a></li>
</ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ <h2>{% trans "Members" %}</h2>
{% for member in project.members.all %}
{% if forloop.counter0|divisibleby:"3" %}<tr>{% endif %}
<td>
<div class="avatar">{% gravatar member 40 %}</div>
<div class="details"><a href="{% url profile_detail member.username %}" title="{{ member.username }}">{{ member.username }}</a></div>
<div class="avatar">{% gravatar member.user 40 %}</div>
<div class="details"><a href="{% url profile_detail member.user.username %}" title="{{ member.user.username }}">{{ member.user.username }}</a></div>
</td>
{% if forloop.counter0|add:"1"|divisibleby:"3" %}</tr>{% endif %}
{% endfor %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,7 @@ <h1>{% trans "Projects" %}</h1>

<p>{% trans "A <b>project</b> is a group of people working on a common set of tasks." %}</p>
{% if user.is_authenticated %}
<div class="form-toggle">
<p><span id="start-project-toggle">{% trans "Start your own project" %}</a></p>
<form class="uniForm" id="start-project" method="POST" action="{% url project_create %}">
<fieldset class="inlineLabels">
{% get_project_form as project_form %}
{{ project_form|as_uni_form }}
<div class="form_block">
<input type="hidden" name="action" value="create" />
<input type="submit" value="{% trans "create" %}"/>
</div>
</fieldset>
</form>
</div>
<p><a href="{% url project_create %}">Create</a> your own project.</p>
{% else %}
{% url acct_signup as signup_url %}
{% url acct_login as login_url %}
Expand Down Expand Up @@ -60,20 +48,3 @@ <h1>{% trans "Projects" %}</h1>
{% endif %}

{% endblock %}

{% block extra_body %}
<script type="text/javascript">
$(document).ready(function() {
$('#start-project').hide();
$('#start-project-toggle').click(function() {
$('#start-project').toggle();
$('#start-project').autoscroll();
return false;
});
if ($('#start-project .error').length) {
$('#start-project').show();
$('#start-project .error').autoscroll();
}
});
</script>
{% endblock %}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,6 @@

register = template.Library()

def do_get_project_form(parser, token):
try:
tag_name, _, context_name = token.split_contents()
except ValueError:
tagname = token.contents.split()[0]
raise (template.TemplateSyntaxError,
("%(tagname)r tag syntax is as follows: "
"{%% %(tagname)r as VARIABLE %%}" % {'tagname': tagname}))
return ProjectFormNode(context_name)

class ProjectFormNode(template.Node):
def __init__(self, context_name):
self.context_name = context_name
def render(self, context):
context[self.context_name] = ProjectForm()
return ''

register.tag('get_project_form', do_get_project_form)


@register.inclusion_tag("newprojects/project_item.html", takes_context=True)
def show_project(context, project):
return {'project': project, 'request': context['request']}
Expand Down
Loading

0 comments on commit a511f0e

Please sign in to comment.