This repository has been archived by the owner on Aug 1, 2023. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
19 changed files
with
437 additions
and
221 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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'] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.