summaryrefslogtreecommitdiff
path: root/coip/apps/invitation
diff options
context:
space:
mode:
Diffstat (limited to 'coip/apps/invitation')
-rw-r--r--coip/apps/invitation/__init__.py0
-rw-r--r--coip/apps/invitation/admin.py4
-rw-r--r--coip/apps/invitation/forms.py12
-rw-r--r--coip/apps/invitation/models.py31
-rw-r--r--coip/apps/invitation/views.py73
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