Enforce maximum group participant number checking
authorSofia Papagiannaki <papagian@gmail.com>
Tue, 13 Nov 2012 11:57:45 +0000 (13:57 +0200)
committerSofia Papagiannaki <papagian@gmail.com>
Tue, 13 Nov 2012 11:57:45 +0000 (13:57 +0200)
snf-astakos-app/astakos/im/models.py
snf-astakos-app/astakos/im/templates/im/astakosgroup_detail.html
snf-astakos-app/astakos/im/views.py

index ac8eebb..2b6e6f3 100644 (file)
@@ -44,6 +44,7 @@ from collections import defaultdict
 from django.db import models, IntegrityError
 from django.contrib.auth.models import User, UserManager, Group, Permission
 from django.utils.translation import ugettext as _
+from django.db import transaction
 from django.core.exceptions import ValidationError
 from django.db import transaction
 from django.db.models.signals import (pre_save, post_save, post_syncdb,
@@ -230,14 +231,20 @@ class AstakosGroup(Group):
         self.save()
         quota_disturbed.send(sender=self, users=self.approved_members)
 
+    @transaction.commit_manually
     def approve_member(self, person):
         m, created = self.membership_set.get_or_create(person=person)
         # update date_joined in any case
-        m.date_joined = datetime.now()
-        m.save()
+        try:
+            m.approve()
+        except:
+            transaction.rollback()
+            raise
+        else:
+            transaction.commit()
 
-    def disapprove_member(self, person):
-        self.membership_set.remove(person=person)
+#     def disapprove_member(self, person):
+#         self.membership_set.remove(person=person)
 
     @property
     def members(self):
@@ -564,6 +571,8 @@ class Membership(models.Model):
         return False
 
     def approve(self):
+        if self.group.max_participants:
+            assert len(self.group.approved_members) + 1 <= self.group.max_participants
         self.date_joined = datetime.now()
         self.save()
         quota_disturbed.send(sender=self, users=(self.person,))
index ea5b7ce..5fb0ea7 100644 (file)
@@ -75,6 +75,8 @@
                     {% endif %}
                 {% endfor %}&nbsp;
             </dd>
+            <dt>Max participants</dt>
+                       <dd>{% if object.max_participants%}{{object.max_participants}}{% else %}&nbsp;{% endif %}</dd>
                 </dl>
         </div>
         
index d2458b1..ae5fe10 100644 (file)
@@ -933,7 +933,11 @@ def group_detail(request, group_id):
         if update_form.is_valid():
             update_form.save()
         if addmembers_form.is_valid():
-            map(obj.approve_member, addmembers_form.valid_users)
+            try:
+                map(obj.approve_member, addmembers_form.valid_users)
+            except AssertionError:
+                msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
+                messages.error(request, msg)
             addmembers_form = AddGroupMembersForm()
 
     template_name = "%s/%s_detail.html" % (
@@ -1130,6 +1134,9 @@ def approve_member(request, membership):
         realname = membership.person.realname
         msg = _(astakos_messages.MEMBER_JOINED_GROUP) % locals()
         messages.success(request, msg)
+    except AssertionError:
+        msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
+        messages.error(request, msg)
     except BaseException, e:
         logger.exception(e)
         realname = membership.person.realname