First step of the groups subapp, view groups and request access done

This commit is contained in:
2010-10-21 16:27:47 +01:00
parent 3b568f3156
commit f555e85e3d
14 changed files with 332 additions and 7 deletions

0
groups/__init__.py Normal file
View File

22
groups/app_defines.py Normal file
View File

@@ -0,0 +1,22 @@
# Group Types
GROUP_TYPE_BUILTIN = 0
GROUP_TYPE_PERMISSION = 1
GROUP_TYPE_CORPORATE = 2
GROUP_TYPE_CHOICES = (
(GROUP_TYPE_BUILTIN, 'Built-In'),
(GROUP_TYPE_PERMISSION, 'Permission'),
(GROUP_TYPE_CORPORATE, 'Corporate'),
)
# Request Status Codes
REQUEST_PENDING = 0
REQUEST_ACCEPTED = 1
REQUEST_REJECTED = 2
REQUEST_STATUS_CHOICES = (
(REQUEST_PENDING, 'Pending'),
(REQUEST_ACCEPTED, 'Accepted'),
(REQUEST_REJECTED, 'Rejected'),
)

11
groups/forms.py Normal file
View File

@@ -0,0 +1,11 @@
from django import forms
import settings
from groups.models import GroupRequest
from groups.app_defines import *
class GroupRequestForm(forms.ModelForm):
class Meta:
model = GroupRequest
exclude = ('group', 'user', 'status', 'changed_by', 'changed_date', 'created_date')

View File

@@ -0,0 +1,116 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'GroupInformation'
db.create_table('groups_groupinformation', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('group', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.Group'], unique=True)),
('type', self.gf('django.db.models.fields.IntegerField')()),
('public', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)),
('requestable', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)),
('description', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('groups', ['GroupInformation'])
# Adding M2M table for field admins on 'GroupInformation'
db.create_table('groups_groupinformation_admins', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('groupinformation', models.ForeignKey(orm['groups.groupinformation'], null=False)),
('user', models.ForeignKey(orm['auth.user'], null=False))
))
db.create_unique('groups_groupinformation_admins', ['groupinformation_id', 'user_id'])
# Adding model 'GroupRequest'
db.create_table('groups_grouprequest', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('group', self.gf('django.db.models.fields.related.ForeignKey')(related_name='requests', to=orm['auth.Group'])),
('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='grouprequests', to=orm['auth.User'])),
('reason', self.gf('django.db.models.fields.TextField')()),
('status', self.gf('django.db.models.fields.IntegerField')()),
('changed_by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('changed_date', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
('created_date', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
))
db.send_create_signal('groups', ['GroupRequest'])
def backwards(self, orm):
# Deleting model 'GroupInformation'
db.delete_table('groups_groupinformation')
# Removing M2M table for field admins on 'GroupInformation'
db.delete_table('groups_groupinformation_admins')
# Deleting model 'GroupRequest'
db.delete_table('groups_grouprequest')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'unique': 'True'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'max_length': '30', 'unique': 'True'})
},
'contenttypes.contenttype': {
'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'groups.groupinformation': {
'Meta': {'object_name': 'GroupInformation'},
'admins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False'}),
'description': ('django.db.models.fields.TextField', [], {}),
'group': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.Group']", 'unique': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'requestable': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'type': ('django.db.models.fields.IntegerField', [], {})
},
'groups.grouprequest': {
'Meta': {'object_name': 'GroupRequest'},
'changed_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'created_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'requests'", 'to': "orm['auth.Group']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'reason': ('django.db.models.fields.TextField', [], {}),
'status': ('django.db.models.fields.IntegerField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'grouprequests'", 'to': "orm['auth.User']"})
}
}
complete_apps = ['groups']

View File

38
groups/models.py Normal file
View File

@@ -0,0 +1,38 @@
from django.db import models
from django.db.models import signals
from django.contrib.auth.models import Group, User
from groups.app_defines import *
class GroupInformation(models.Model):
""" Extended group information """
group = models.OneToOneField(Group)
type = models.IntegerField("Group Type", choices=GROUP_TYPE_CHOICES, default=GROUP_TYPE_BUILTIN)
admins = models.ManyToManyField(User)
public = models.BooleanField("Public", default=False)
requestable = models.BooleanField("Requestable", default=False)
description = models.TextField()
@staticmethod
def create_group(sender, instance, created, **kwargs):
if created:
profile, created = GroupInformation.objects.get_or_create(group=instance)
signals.post_save.connect(GroupInformation.create_group, sender=Group)
class GroupRequest(models.Model):
""" Join requests for a group """
group = models.ForeignKey(Group, null=False, related_name='requests')
user = models.ForeignKey(User, null=False, related_name='grouprequests')
reason = models.TextField("Reason")
status = models.IntegerField("Request Status", choices=REQUEST_STATUS_CHOICES, null=False, default=REQUEST_PENDING)
changed_by = models.ForeignKey(User)
changed_date = models.DateTimeField("Changed Date/Time", auto_now=True)
created_date = models.DateTimeField("Created Date/Time", auto_now_add=True)

23
groups/tests.py Normal file
View File

@@ -0,0 +1,23 @@
"""
This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.failUnlessEqual(1 + 1, 2)
__test__ = {"doctest": """
Another way to test that 1 + 1 is equal to 2.
>>> 1 + 1 == 2
True
"""}

9
groups/urls.py Normal file
View File

@@ -0,0 +1,9 @@
from django.conf.urls.defaults import *
from groups import views
urlpatterns = patterns('',
('^$', views.index),
(r'^list/$', views.group_list),
(r'^request/(?P<groupid>\d+)/$', views.create_request),
)

64
groups/views.py Normal file
View File

@@ -0,0 +1,64 @@
from django.db.models import Q
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.core.urlresolvers import reverse
from django.contrib.auth.models import Group
from django.contrib.auth.decorators import login_required
from groups.app_defines import *
from groups.forms import GroupRequestForm
def index(request):
return HttpResponseRedirect(reverse('groups.views.group_list'))
@login_required
def group_list(request):
""" View all groups, for users only public ones """
if request.user.is_superuser:
groups = Group.objects.select_related('groupinformation').all()
else:
groups = Group.objects.select_related('groupinformation').filter(Q(groupinformation__public=True) |
Q(groupinformation__admins__in=[request.user]) |
Q(user_set__in=[request.user]))
# Process the query into a list of tuples including status
group_list = []
for group in groups:
if request.user in group.groupinformation.admins.all():
group_list.append((group.id, group.name, 'Admin', group.groupinformation.requestable))
elif request.user in group.user_set.all():
group_list.append((group.id, group.name, 'Member', group.groupinformation.requestable))
else:
group_list.append((group.id, group.name, None, group.groupinformation.requestable))
return render_to_response('groups/group_list.html', locals(), context_instance=RequestContext(request))
@login_required
def view_group(request):
pass
@login_required
def create_request(request, groupid):
group = get_object_or_404(Group, id=groupid)
if not group.groupinformation.requestable and not request.user in group.user_set.all():
return HttpResponseRedirect(reverse('groups.views.index'))
if request.method == 'POST':
form = GroupRequestForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.group = group
obj.changed_by = request.user
obj.save()
request.user.message_set.create(message="You membership request has been created.")
return HttpResponseRedirect(reverse('groups.views.index')) # Redirect after POST
else:
form = GroupRequestForm() # An unbound form
return render_to_response('groups/create_request.html', locals(), context_instance=RequestContext(request))