Skip to content
This repository has been archived by the owner on Aug 1, 2023. It is now read-only.

Commit

Permalink
Merge branch 'teams' into api
Browse files Browse the repository at this point in the history
  • Loading branch information
coordt committed May 28, 2012
2 parents 1659054 + eb5ab8d commit eac25db
Show file tree
Hide file tree
Showing 19 changed files with 437 additions and 221 deletions.
10 changes: 5 additions & 5 deletions apps/profiles/forms.py
@@ -1,5 +1,5 @@
class OrganizationCreationForm(forms.ModelForm):
"""
A form for creating an organziation
"""

from userena.forms import EditProfileForm

class LimitedEditProfileForm(EditProfileForm):
class Meta(EditProfileForm.Meta):
exclude = ['user', 'organization', 'group', 'creator_id', 'privacy']
13 changes: 6 additions & 7 deletions apps/profiles/models.py
@@ -1,5 +1,5 @@
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import User, Group

from userena.models import UserenaBaseProfile

Expand All @@ -8,9 +8,8 @@ class Profile(UserenaBaseProfile):
User,
unique=True,
related_name='profile')
# organization = models.BooleanField(default=False)
# members = models.ManyToManyField(
# User,
# blank=True,
# related_name="organizations")
# creator_id = models.IntegerField(blank=True, null=True)
organization = models.BooleanField(default=False)
# group = models.ForeignKey(Group, blank=True, null=True)
creator_id = models.IntegerField(blank=True, null=True)


Empty file added apps/teams/__init__.py
Empty file.
8 changes: 8 additions & 0 deletions apps/teams/admin.py
@@ -0,0 +1,8 @@
from django.contrib import admin

from teams.models import TeamMember

class TeamMemberAdmin(admin.ModelAdmin):
list_display = ('team', 'user',)

admin.site.register(TeamMember, TeamMemberAdmin)
80 changes: 80 additions & 0 deletions apps/teams/forms.py
@@ -0,0 +1,80 @@
from django.contrib.auth.models import User
from django import forms
from django.forms.models import inlineformset_factory

from teams.models import TeamMember
from selectable.base import ModelLookup
from selectable.forms import AutoCompleteSelectField
from selectable.registry import registry, LookupAlreadyRegistered

class UserLookup(ModelLookup):
model = User
search_fields = (
'username__icontains',
'first_name__icontains',
'last_name__icontains',
)
filters = {'is_active': True, }

def get_item_value(self, item):
# Display for currently selected item
return item.username

def get_item_label(self, item):
# Display for choice listings
return u"%s (%s)" % (item.username, item.get_full_name())
try:
registry.register(UserLookup)
except LookupAlreadyRegistered:
pass


class TeamCreationForm(forms.Form):
"""
A form for creating an organziation
"""
creator = forms.IntegerField(widget=forms.HiddenInput)
name = forms.CharField(max_length=80)
# email = forms.EmailField()

def clean_name(self):
org_name = self.cleaned_data['name']
if User.objects.filter(username=org_name).count():
raise forms.ValidationError('%s is not a unique name.' % org_name)
return org_name


class TeamMemberForm(forms.ModelForm):
user = AutoCompleteSelectField(lookup_class=UserLookup)

class Meta:
model = TeamMember
exclude = ['creator'],

def clean_user(self):
"""
Make sure the user isn't already on the team
"""
user = self.cleaned_data['user']
team = self.cleaned_data['team']
if self.initial and self.initial.has_key('user'):
users = TeamMember.objects.filter(team=team, user=user).exclude(user__pk=self.initial['user']).count()
else:
users = TeamMember.objects.filter(team=team, user=user).count()
if users > 0:
raise forms.ValidationError("%s is already a member of the team." % user.username)
return user

TeamMemberFormset = inlineformset_factory(User, TeamMember,
fk_name='team', form=TeamMemberForm, extra=1)

class TeamUpdateForm(forms.ModelForm):
"""
A form for updating an organziation
"""
id = forms.IntegerField(widget=forms.HiddenInput)

class Meta:
model = User
fields = ['id']

39 changes: 39 additions & 0 deletions apps/teams/models.py
@@ -0,0 +1,39 @@
from django.contrib.auth.models import User
from django.db import models

PERMISSION_CHOICES = (
(1, 'Read Packages'),
(2, 'Update Packages'),
(3, 'Create Packages'),
(4, 'Administrator'),
)
PERMISSION_NAMES = (
'read_packages',
'update_packages',
'create_packages',
'admin',
)

class TeamMember(models.Model):
"""
A User working as part of a Team (which is a User unlogginable account)
"""
team = models.ForeignKey(User, related_name="members")
user = models.ForeignKey(User, related_name="memberships")
permission = models.IntegerField(choices=PERMISSION_CHOICES)
creator = models.BooleanField(default=False)

def __unicode__(self):
return "%s on team %s" % (self.user.username, self.team.username)

def save(self, *args, **kwargs):
"""
Give the user proper permissions so django guardian can check them
"""
from guardian.shortcuts import assign
super(TeamMember, self).save(*args, **kwargs)
assign(PERMISSION_NAMES[self.permission - 1], self.user, self.team)

@models.permalink
def get_absolute_url(self):
return ('userrouter-index', [self.team.username])
83 changes: 83 additions & 0 deletions apps/teams/views.py
@@ -0,0 +1,83 @@
from django.contrib.auth.models import User, Group
from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect, HttpResponse
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext, loader

from teams.forms import TeamCreationForm, TeamUpdateForm, TeamMemberFormset
from teams.models import TeamMember
from profiles.models import Profile


def create_team(request, username):
"""
Display the TeamCreationForm
"""
if request.method == 'POST':
form = TeamCreationForm(request.POST)
if form.is_valid() and request.user.pk == form.cleaned_data['creator']:
team = User.objects.create_user(form.cleaned_data['name'])
team_creator_attrs = dict(
team=team,
user=request.user,
permission=4,
creator=True
)
team_creator = TeamMember(**team_creator_attrs)
team_creator.save()
try:
profile = team.get_profile()
except Profile.DoesNotExist:
profile = Profile(user=team)
profile.organization = True
profile.creator_id = request.user.pk
profile.save()
HttpResponseRedirect(reverse('update_team', args=(form.cleaned_data["name"],)))
else:
form = TeamCreationForm(initial={'creator': request.user.pk})
return render_to_response('team/team_create.html',
{'form': form, 'username': username},
context_instance=RequestContext(request))

def update_team(request, username):
"""
Display the TeamUpdateForm
"""
template_name='teams/team_manage.html'

obj = get_object_or_404(User, username=username)

if not obj.get_profile().organization:
raise Http404

# Check that requesting user has admin privileges on this team
if not request.user.has_perm('admin', obj):
try:
template = loader.get_template("403.html")
except TemplateDoesNotExist:
return http.HttpResponseForbidden('<h1>403 Forbidden</h1>')

# Should prevent the deletion of the creator user. Not sure how to do this

if request.method == 'POST':
form = TeamUpdateForm(request.POST, instance=obj)
if form.is_valid():
obj = form.save(commit=False)
member_formset = TeamMemberFormset(request.POST, instance=obj)
if member_formset.is_valid():
obj.save()
member_formset.save()
return HttpResponseRedirect(reverse('update_team', kwargs={'username': username}))
else:
form = TeamUpdateForm(instance=obj)
member_formset = TeamMemberFormset(instance=obj)

t = loader.get_template(template_name)
c = RequestContext(request, {
'form': form,
'member_formset': member_formset,
'profile': obj.get_profile(),
})
response = HttpResponse(t.render(c))
return response

4 changes: 3 additions & 1 deletion apps/userrouter/decorators.py
Expand Up @@ -14,7 +14,9 @@ def user_owns(view_func):
"""
@wraps(view_func)
def _wrapped_view(request, username, *args, **kwargs):
if request.user.username != username:
usernames = [x.team.username for x in request.user.memberships.all()]
usernames.append(request.user.username)
if username not in usernames:
try:
template = loader.get_template("403.html")
except TemplateDoesNotExist:
Expand Down
11 changes: 9 additions & 2 deletions apps/userrouter/urls.py
Expand Up @@ -5,10 +5,12 @@
from userena import views
from userpypi.views.packages import PackageListView
from userrouter.decorators import user_owns
from profiles.forms import LimitedEditProfileForm

urlpatterns = patterns('',
url(r'^(?P<owner>[^/]+)/$',
TemplateView.as_view(template_name="user_home.html"),
url(r'^(?P<username>[^/]+)/$',
user_owns(views.direct_to_user_template),
{'template_name':"user_home.html"},
name="userrouter-index"),

# User Signup
Expand Down Expand Up @@ -58,7 +60,12 @@
# Edit profile
url(r'^(?P<username>[\.\w]+)/edit/$',
user_owns(views.profile_edit),
{'edit_profile_form': LimitedEditProfileForm},
name='userena_profile_edit'),

url(r'^(?P<username>[^/]+)/profile/$',
'userena.views.profile_detail',
name='userena_profile_detail'),

('', include('userpypi.urls')),
)

0 comments on commit eac25db

Please sign in to comment.