diff options
Diffstat (limited to 'coip/apps/invitation')
-rw-r--r-- | coip/apps/invitation/__init__.py | 0 | ||||
-rw-r--r-- | coip/apps/invitation/admin.py | 4 | ||||
-rw-r--r-- | coip/apps/invitation/forms.py | 12 | ||||
-rw-r--r-- | coip/apps/invitation/models.py | 31 | ||||
-rw-r--r-- | coip/apps/invitation/views.py | 73 |
5 files changed, 120 insertions, 0 deletions
diff --git a/coip/apps/invitation/__init__.py b/coip/apps/invitation/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/coip/apps/invitation/__init__.py diff --git a/coip/apps/invitation/admin.py b/coip/apps/invitation/admin.py new file mode 100644 index 0000000..722b147 --- /dev/null +++ b/coip/apps/invitation/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from coip.apps.invitation.models import Invitation + +admin.site.register(Invitation)
\ No newline at end of file diff --git a/coip/apps/invitation/forms.py b/coip/apps/invitation/forms.py new file mode 100644 index 0000000..28add9b --- /dev/null +++ b/coip/apps/invitation/forms.py @@ -0,0 +1,12 @@ +''' +Created on Jun 23, 2010 + +@author: leifj +''' +from django import forms +from coip.apps.invitation.models import Invitation + +class InvitationForm(forms.ModelForm): + class Meta: + model = Invitation + fields = ['email','message','expires']
\ No newline at end of file diff --git a/coip/apps/invitation/models.py b/coip/apps/invitation/models.py new file mode 100644 index 0000000..574fc0b --- /dev/null +++ b/coip/apps/invitation/models.py @@ -0,0 +1,31 @@ +''' +Created on Jun 23, 2010 + +@author: leifj +''' +from django.db import models +from django.contrib.auth.models import User +from coip.apps.name.models import Name +import datetime +from pprint import pprint + +class Invitation(models.Model): + ''' + Invitation to a namespace/group + ''' + inviter = models.ForeignKey(User,related_name='inviter') + name = models.ForeignKey(Name,related_name='invitations') + email = models.EmailField() + message = models.TextField() + nonce = models.CharField(unique=True,max_length=255) + timecreated = models.DateTimeField(auto_now_add=True) + lastupdated = models.DateTimeField(auto_now=True) + expires = models.DateTimeField() + + def __unicode__(self): + return "%s invited to %s by %s" % (self.email,self.name,self.inviter) + + def send_email(self): + pprint("sent email to %s" % (self.email)) + return + diff --git a/coip/apps/invitation/views.py b/coip/apps/invitation/views.py new file mode 100644 index 0000000..e4c9a53 --- /dev/null +++ b/coip/apps/invitation/views.py @@ -0,0 +1,73 @@ +''' +Created on Jun 23, 2010 + +@author: leifj +''' +from django.contrib.auth.decorators import login_required +from coip.apps.invitation.models import Invitation +from coip.apps.invitation.forms import InvitationForm +from django.http import HttpResponseRedirect, Http404 +from coip.apps.auth.utils import nonce +from coip.multiresponse import respond_to, render403 +from twisted.python.reflect import ObjectNotFound +from coip.apps.name.models import Name +import datetime +from coip.apps.membership.models import Membership +from django.shortcuts import get_object_or_404 + +@login_required +def invite(request,id): + name = None + try: + name = Name.objects.get(id=id) + except ObjectNotFound: + raise Http404() + + if not name.has_permission(request.user,'i'): + return render403('You are not allowed to invite users to '+name) + + user = request.user + if request.method == 'POST': + invitation=Invitation(inviter=user,nonce=nonce(),name=name) + form = InvitationForm(request.POST,instance=invitation) + if form.is_valid(): + invitation = form.save() + invitation.send_email() + return HttpResponseRedirect("/name/id/%d" % (name.id)) + else: + exp = datetime.datetime.now()+datetime.timedelta(days=1) + invitation=Invitation(message="Please consider joining my group!",expires=exp.strftime("%Y-%m-%d")) + form = InvitationForm(instance=invitation); + + return respond_to(request,{'text/html': 'apps/invitation/edit.html'},{'form': form,'name': name,'formtitle': 'Invite to %s' % (name),'submitname': 'Invite User'}) + +@login_required +def accept(request,nonce): + invitation = None + try: + invitation = Invitation.objects.get(nonce=nonce) + except ObjectNotFound: + raise Http404() + + (membership,created) = Membership.objects.get_or_create(user=request.user,name=invitation.name) + if created or not membership.enabled: + membership.enabled = True + membership.save() + + for i in Invitation.objects.filter(user=request.user,name=invitation.name).all: + i.delete() + + return HttpResponseRedirect("/membership/%d" % (membership.id)) + +@login_required +def cancel(request,id): + invitation = get_object_or_404(Invitation,pk=id) + name = invitation.name + + if not name.has_permission(request.user,'w'): + return render403('You are not allowed to cancel pending invitations to %s' % (name)) + + invitation.delete() + return HttpResponseRedirect("/name/id/%d" % (name.id)) + +
\ No newline at end of file |