summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askbot/models/__init__.py49
-rw-r--r--askbot/models/user.py12
-rw-r--r--askbot/skins/default/templates/macros.html2
-rw-r--r--askbot/views/commands.py37
-rw-r--r--askbot/views/users.py17
5 files changed, 89 insertions, 28 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py
index d6f7ac5f..cba3d5a0 100644
--- a/askbot/models/__init__.py
+++ b/askbot/models/__init__.py
@@ -2228,8 +2228,18 @@ def user_can_make_group_private_posts(self):
"""simplest implementation: user belongs to at least one group"""
return self.get_groups(private=True).count() > 0
+def user_get_group_membership(self, group):
+ """returns a group membership object or None
+ if it is not there
+ """
+ try:
+ return GroupMembership.objects.get(user=self, group=group)
+ except GroupMembership.DoesNotExist:
+ return None
+
+
def user_get_groups_membership_info(self, groups):
- """returts a defaultdict with values that are
+ """returns a defaultdict with values that are
dictionaries with the following keys and values:
* key: acceptance_level, value: 'closed', 'moderated', 'open'
* key: membership_level, value: 'none', 'pending', 'full'
@@ -2246,15 +2256,14 @@ def user_get_groups_membership_info(self, groups):
lambda: {'acceptance_level': 'closed', 'membership_level': 'none'}
)
for membership in memberships:
- info[membership.group_id]['membership_level'] = 'full'
+ membership_level = membership.get_level_display()
+ info[membership.group_id]['membership_level'] = membership_level
for group in groups:
- info[group.id]['acceptance_level'] = group.get_acceptance_level_for_user(self)
+ info[group.id]['acceptance_level'] = group.get_openness_level_for_user(self)
return info
-
-
def user_get_karma_summary(self):
"""returns human readable sentence about
status of user's karma"""
@@ -2607,23 +2616,46 @@ def user_update_wildcard_tag_selections(
return new_tags
-def user_edit_group_membership(self, user = None, group = None, action = None):
+def user_edit_group_membership(self, user=None, group=None, action=None):
"""allows one user to add another to a group
or remove user from group.
If when adding, the group does not exist, it will be created
the delete function is not symmetric, the group will remain
even if it becomes empty
+
+ returns instance of GroupMembership (if action is "add") or None
"""
if action == 'add':
- GroupMembership.objects.get_or_create(user = user, group = group)
+ #calculate new level
+ openness = group.get_openness_level_for_user(user)
+
+ #a temporary shunt
+ if group.name == askbot_settings.GLOBAL_GROUP_NAME:
+ openness = 'open'
+ elif group.name == format_personal_group_name(user):
+ openness = 'open'
+
+ if openness == 'open':
+ level = GroupMembership.FULL
+ elif openness == 'moderated':
+ level = GroupMembership.PENDING
+ elif openness == 'closed':
+ raise django_exceptions.PermissionDenied()
+
+ membership, created = GroupMembership.objects.get_or_create(
+ user=user, group=group, level=level
+ )
+ return membership
+
elif action == 'remove':
GroupMembership.objects.get(user = user, group = group).delete()
+ return None
else:
raise ValueError('invalid action')
def user_join_group(self, group):
- self.edit_group_membership(group=group, user=self, action='add')
+ return self.edit_group_membership(group=group, user=self, action='add')
def user_leave_group(self, group):
self.edit_group_membership(group=group, user=self, action='remove')
@@ -2658,6 +2690,7 @@ User.add_to_class('get_marked_tags', user_get_marked_tags)
User.add_to_class('get_marked_tag_names', user_get_marked_tag_names)
User.add_to_class('get_groups', user_get_groups)
User.add_to_class('get_foreign_groups', user_get_foreign_groups)
+User.add_to_class('get_group_membership', user_get_group_membership)
User.add_to_class('get_personal_group', user_get_personal_group)
User.add_to_class('get_primary_group', user_get_primary_group)
User.add_to_class('strip_email_signature', user_strip_email_signature)
diff --git a/askbot/models/user.py b/askbot/models/user.py
index eaedab94..92927ef2 100644
--- a/askbot/models/user.py
+++ b/askbot/models/user.py
@@ -361,12 +361,14 @@ class GroupMembership(AuthUserGroups):
"""contains one-to-one relation to ``auth_user_group``
and extra membership profile fields"""
#note: this may hold info on when user joined, etc
+ NONE = -1#not part of the choices as for this records should be just missing
PENDING = 0
FULL = 1
LEVEL_CHOICES = (#'none' is by absence of membership
(PENDING, 'pending'),
(FULL, 'full')
)
+ ALL_LEVEL_CHOICES = LEVEL_CHOICES + ((NONE, 'none'),)
level = models.SmallIntegerField(
default=FULL,
choices=LEVEL_CHOICES,
@@ -375,6 +377,14 @@ class GroupMembership(AuthUserGroups):
class Meta:
app_label = 'askbot'
+ @classmethod
+ def get_level_value_display(cls, level):
+ """returns verbose value given a numerical value
+ includes the "fanthom" NONE
+ """
+ values_dict = dict(cls.ALL_LEVEL_CHOICES)
+ return values_dict[level]
+
class GroupQuerySet(models.query.QuerySet):
"""Custom query set for the group"""
@@ -461,7 +471,7 @@ class Group(AuthGroup):
(Group.CLOSED, _('Moderator adds users'))
)
- def get_acceptance_level_for_user(self, user):
+ def get_openness_level_for_user(self, user):
"""returns descriptive value, because it is to be used in the
templates. The value must match the verbose versions of the
openness choices!!!
diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html
index cf6bb922..b810cada 100644
--- a/askbot/skins/default/templates/macros.html
+++ b/askbot/skins/default/templates/macros.html
@@ -274,6 +274,8 @@ poor design of the data or methods on data objects #}
>
{% if membership_level == 'full' %}
{% trans %}You are a member{% endtrans %}
+ {% elif membership_level == 'pending' %}
+ {% trans %}Waiting approval{% endtrans %}
{% else %}
{% if acceptance_level == 'open' %}
{% trans %}Join this group{% endtrans %}
diff --git a/askbot/views/commands.py b/askbot/views/commands.py
index 0f050573..156d4ff1 100644
--- a/askbot/views/commands.py
+++ b/askbot/views/commands.py
@@ -883,12 +883,16 @@ def read_message(request):#marks message a read
@decorators.post_only
@decorators.admins_only
def edit_group_membership(request):
+ #todo: this call may need to go.
+ #it used to be the one creating groups
+ #from the user profile page
+ #we have a separate method
form = forms.EditGroupMembershipForm(request.POST)
if form.is_valid():
group_name = form.cleaned_data['group_name']
user_id = form.cleaned_data['user_id']
try:
- user = models.User.objects.get(id = user_id)
+ user = models.User.objects.get(id=user_id)
except models.User.DoesNotExist:
raise exceptions.PermissionDenied(
'user with id %d not found' % user_id
@@ -1033,25 +1037,30 @@ def edit_object_property_text(request):
@decorators.ajax_only
@decorators.post_only
def join_or_leave_group(request):
- """only current user can join/leave group"""
+ """called when user wants to join/leave
+ ask to join/cancel join request, depending
+ on the groups acceptance level for the given user
+
+ returns resulting "membership_level"
+ """
if request.user.is_anonymous():
raise exceptions.PermissionDenied()
+ Group = models.Group
+ Membership = models.GroupMembership
+
group_id = IntegerField().clean(request.POST['group_id'])
- group = models.Group.objects.get(id = group_id)
+ group = Group.objects.get(id=group_id)
- if request.user.is_group_member(group):
- action = 'remove'
- membership_level = 'none'
+ membership = request.user.get_group_membership(group)
+ if membership is None:
+ membership = request.user.join_group(group)
+ new_level = membership.get_level_display()
else:
- action = 'add'
- membership_level = 'full'
- request.user.edit_group_membership(
- user = request.user,
- group = group,
- action = action
- )
- return {'membership_level': membership_level}
+ membership.delete()
+ new_level = Membership.get_level_value_display(Membership.NONE)
+
+ return {'membership_level': new_level}
@csrf.csrf_exempt
diff --git a/askbot/views/users.py b/askbot/views/users.py
index 77911c02..e55c0cc3 100644
--- a/askbot/views/users.py
+++ b/askbot/views/users.py
@@ -87,17 +87,24 @@ def show_users(request, by_group=False, group_id=None, group_slug=None):
askbot_settings.GROUP_EMAIL_ADDRESSES_ENABLED \
and askbot_settings.ENABLE_CONTENT_MODERATION
)
- user_acceptance_level = group.get_acceptance_level_for_user(
+ user_acceptance_level = group.get_openness_level_for_user(
request.user
)
except models.Group.DoesNotExist:
raise Http404
if group_slug == slugify(group.name):
- users = users.filter(groups__id = group_id
- )
+ #filter users by full group memberships
+ #todo: refactor as Group.get_full_members()
+ full_level = models.GroupMembership.FULL
+ memberships = models.GroupMembership.objects.filter(
+ group=group, level=full_level
+ )
+ user_ids = memberships.values_list('user__id', flat=True)
+ users = users.filter(id__in=user_ids)
if request.user.is_authenticated():
- if bool(users.filter(id = request.user.id).count()):
- user_membership_level = 'full'
+ membership = request.user.get_group_membership(group)
+ if membership:
+ user_membership_level = membership.get_level_display()
else:
group_page_url = reverse(