From e60ea36cb6c7fda30d370cc38f8bbfc20de5f592 Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Tue, 13 Nov 2012 13:57:45 +0200 Subject: [PATCH] Enforce maximum group participant number checking --- snf-astakos-app/astakos/im/models.py | 17 +++++++++++++---- .../astakos/im/templates/im/astakosgroup_detail.html | 2 ++ snf-astakos-app/astakos/im/views.py | 9 ++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/snf-astakos-app/astakos/im/models.py b/snf-astakos-app/astakos/im/models.py index ac8eebb..2b6e6f3 100644 --- a/snf-astakos-app/astakos/im/models.py +++ b/snf-astakos-app/astakos/im/models.py @@ -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,)) diff --git a/snf-astakos-app/astakos/im/templates/im/astakosgroup_detail.html b/snf-astakos-app/astakos/im/templates/im/astakosgroup_detail.html index ea5b7ce..5fb0ea7 100644 --- a/snf-astakos-app/astakos/im/templates/im/astakosgroup_detail.html +++ b/snf-astakos-app/astakos/im/templates/im/astakosgroup_detail.html @@ -75,6 +75,8 @@ {% endif %} {% endfor %}  +
Max participants
+
{% if object.max_participants%}{{object.max_participants}}{% else %} {% endif %}
diff --git a/snf-astakos-app/astakos/im/views.py b/snf-astakos-app/astakos/im/views.py index d2458b1..ae5fe10 100644 --- a/snf-astakos-app/astakos/im/views.py +++ b/snf-astakos-app/astakos/im/views.py @@ -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 -- 1.7.10.4