From 97ca457c3fd8f030ff898ad24d49bd9368118240 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Mon, 27 Aug 2012 21:37:36 -0400 Subject: made the migration print nicer output --- .../0137_migrate_data_to_internal_group_models.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/askbot/migrations/0137_migrate_data_to_internal_group_models.py b/askbot/migrations/0137_migrate_data_to_internal_group_models.py index 92fb72d6..e6388db4 100644 --- a/askbot/migrations/0137_migrate_data_to_internal_group_models.py +++ b/askbot/migrations/0137_migrate_data_to_internal_group_models.py @@ -3,6 +3,7 @@ import datetime from south.db import db from south.v2 import DataMigration from django.db import models +from askbot.utils.console import ProgressBar class Migration(DataMigration): @@ -10,13 +11,14 @@ class Migration(DataMigration): "Write your forwards methods here." profiles = orm['askbot.GroupProfile'].objects.all() - print 'Transfering group information from Tag to Group model' - for profile in profiles.iterator(): + items = profiles.iterator() + count = profiles.count() + message = 'Transfering group information from Tag to Group model' + for profile in ProgressBar(items, count, message): group_tag = profile.group_tag group_name = group_tag.name.replace('-', ' ') if group_name.startswith('_internal_'): group_name = group_name.replace('_internal_', '', 1) - print 'Group: %s' % group_name group = orm['askbot.Group']() group.name = group_name @@ -30,31 +32,28 @@ class Migration(DataMigration): #see if such group is already there auth_group = orm['auth.Group'].objects.get(name=group_name) group.group_ptr = auth_group - print 'merging with Django group' except orm['auth.Group'].DoesNotExist: pass group.save() - print 'moving users' memberships = group_tag.user_memberships.iterator() for old_membership in memberships: old_membership.user.groups.add(group) - print 'moving threads' threads = orm['askbot.Thread'].objects.filter(groups=group_tag) for thread in threads: thread.new_groups.add(group) thread.groups.remove(group_tag) - print 'moving posts' posts = orm['askbot.Post'].objects.filter(groups=group_tag) for post in posts: post.new_groups.add(group) post.groups.remove(group_tag) - print 'Deleting old group information' - for profile in profiles.iterator(): + message = 'Deleting old group information' + items = profiles.iterator() + for profile in ProgressBar(items, count, message): group_tag = profile.group_tag group_tag.user_memberships.all().delete() profile.delete() -- cgit v1.2.3-1-g7c22 From c3cd75e92d07f38502c35b485db9cb982b4d83d9 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Mon, 27 Aug 2012 23:08:33 -0400 Subject: removed old askbot group models --- askbot/migrations/0138_del__old_group_models.py | 69 +++++++++++++++++++++++++ askbot/models/__init__.py | 7 +-- askbot/models/post.py | 17 +----- askbot/models/question.py | 5 +- askbot/models/tag.py | 9 ++-- askbot/models/user.py | 38 -------------- 6 files changed, 80 insertions(+), 65 deletions(-) create mode 100644 askbot/migrations/0138_del__old_group_models.py diff --git a/askbot/migrations/0138_del__old_group_models.py b/askbot/migrations/0138_del__old_group_models.py new file mode 100644 index 00000000..a91eccb1 --- /dev/null +++ b/askbot/migrations/0138_del__old_group_models.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing unique constraint on 'GroupMembership', fields ['group', 'user'] + db.delete_unique('askbot_groupmembership', ['group_id', 'user_id']) + + # Removing unique constraint on 'PostToGroup', fields ['post', 'tag'] + db.delete_unique('askbot_post_groups_old', ['post_id', 'tag_id']) + # Removing M2M table for field groups on 'Post' + db.delete_table('askbot_post_groups_old') + + # Deleting model 'GroupProfile' + db.delete_table('askbot_groupprofile') + + # Deleting model 'GroupMembership' + db.delete_table('askbot_groupmembership') + + # Removing M2M table for field new_groups on 'Thread' + db.delete_unique('askbot_thread_groups_old', ['thread_id', 'tag_id']) + db.delete_table('askbot_thread_groups_old') + + def backwards(self, orm): + # Adding model 'GroupProfile' + db.create_table('askbot_groupprofile', ( + ('preapproved_emails', self.gf('django.db.models.fields.TextField')(default='', null=True, blank=True)), + ('is_open', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('preapproved_email_domains', self.gf('django.db.models.fields.TextField')(default='', null=True, blank=True)), + ('moderate_email', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('logo_url', self.gf('django.db.models.fields.URLField')(max_length=200, null=True)), + ('group_tag', self.gf('django.db.models.fields.related.OneToOneField')(related_name='group_profile', unique=True, to=orm['askbot.Tag'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['GroupProfile']) + + # Adding model 'GroupMembership' + db.create_table('askbot_groupmembership', ( + ('group', self.gf('django.db.models.fields.related.ForeignKey')(related_name='user_memberships', to=orm['askbot.Tag'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='group_memberships', to=orm['auth.User'])), + )) + db.send_create_signal('askbot', ['GroupMembership']) + + # Adding unique constraint on 'GroupMembership', fields ['group', 'user'] + db.create_unique('askbot_groupmembership', ['group_id', 'user_id']) + + # Adding M2M table for field groups on 'Post' + db.create_table('askbot_post_groups_old', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('post', models.ForeignKey(orm['askbot.post'], null=False)), + ('tag', models.ForeignKey(orm['askbot.tag'], null=False)) + )) + db.create_unique('askbot_post_groups_old', ['post_id', 'tag_id']) + + # Adding M2M table for field new_groups on 'Thread' + db.create_table('askbot_thread_groups_old', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('thread', models.ForeignKey(orm['askbot.thread'], null=False)), + ('group', models.ForeignKey(orm['auth.group'], null=False)) + )) + db.create_unique('askbot_thread_groups_old', ['thread_id', 'group_id']) + + complete_apps = ['askbot'] diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index 549f3277..d5758b67 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -43,10 +43,11 @@ from askbot.models.tag import get_group_names from askbot.models.tag import get_groups from askbot.models.tag import format_personal_group_name from askbot.models.user import EmailFeedSetting, ActivityAuditStatus, Activity -from askbot.models.user import GroupMembership, GroupProfile +from askbot.models.user import AuthUserGroups as GroupMembership +from askbot.models.user import Group from askbot.models.post import Post, PostRevision from askbot.models.post import PostFlagReason, AnonymousAnswer -from askbot.models.post import PostToGroup +from askbot.models.post import PostToGroup2 as PostToGroup from askbot.models.post import DraftAnswer from askbot.models.reply_by_email import ReplyAddress from askbot.models import signals @@ -3530,7 +3531,7 @@ __all__ = [ 'ActivityAuditStatus', 'EmailFeedSetting', 'GroupMembership', - 'GroupProfile', + 'Group', 'User', diff --git a/askbot/models/post.py b/askbot/models/post.py index 9c24637e..8b14a845 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -27,7 +27,7 @@ from askbot.utils.slug import slugify from askbot import const from askbot.models.user import Activity from askbot.models.user import EmailFeedSetting -from askbot.models.user import GroupMembership +#from askbot.models.user import Group from askbot.models.tag import Tag, MarkedTag from askbot.models.tag import get_groups, tags_match_some_wildcard from askbot.models.tag import get_global_group @@ -42,19 +42,6 @@ from askbot.utils.diff import textDiff as htmldiff from askbot.utils import mysql -class PostToGroup(models.Model): - """the "trough" table for the - relation of groups to posts - """ - post = models.ForeignKey('Post') - tag = models.ForeignKey('Tag') - - class Meta: - unique_together = ('post', 'tag') - db_table = 'askbot_post_groups' - app_label = 'askbot' - - class PostToGroup2(models.Model): post = models.ForeignKey('Post') group = models.ForeignKey(Group) @@ -62,6 +49,7 @@ class PostToGroup2(models.Model): class Meta: unique_together = ('post', 'group') app_label = 'askbot' + db_table = 'askbot_post_groups' class PostQuerySet(models.query.QuerySet): @@ -333,7 +321,6 @@ class Post(models.Model): parent = models.ForeignKey('Post', blank=True, null=True, related_name='comments') # Answer or Question for Comment thread = models.ForeignKey('Thread', blank=True, null=True, default = None, related_name='posts') - groups = models.ManyToManyField('Tag', through='PostToGroup', related_name = 'group_posts')#used for group-private posts new_groups = models.ManyToManyField(Group, through='PostToGroup2') author = models.ForeignKey(User, related_name='posts') diff --git a/askbot/models/question.py b/askbot/models/question.py index 17e334f4..d1af1224 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -24,7 +24,7 @@ from askbot.models.tag import delete_tags, separate_unused_tags from askbot.models.base import DraftContent, BaseQuerySetManager from askbot.models.tag import Tag, get_groups from askbot.models.post import Post, PostRevision -from askbot.models.post import PostToGroup +from askbot.models.post import PostToGroup2 as PostToGroup from askbot.models import signals from askbot import const from askbot.utils.lists import LazyList @@ -442,8 +442,7 @@ class Thread(models.Model): title = models.CharField(max_length=300) tags = models.ManyToManyField('Tag', related_name='threads') - groups = models.ManyToManyField('Tag', related_name='group_threads') - new_groups = models.ManyToManyField(Group, db_table='askbot_thread_groups') + groups = models.ManyToManyField(Group, db_table='askbot_thread_groups') # Denormalised data, transplanted from Question tagnames = models.CharField(max_length=125) diff --git a/askbot/models/tag.py b/askbot/models/tag.py index 7c5d8d97..5b6d7076 100644 --- a/askbot/models/tag.py +++ b/askbot/models/tag.py @@ -192,11 +192,7 @@ class TagManager(BaseQuerySetManager): def get_content_tags(self): """temporary function that filters out the group tags""" - return self.annotate( - member_count = models.Count('user_memberships') - ).filter( - member_count = 0 - ) + return self.all() def create(self, name = None, created_by = None, **kwargs): """Creates a new tag""" @@ -392,7 +388,8 @@ class MarkedTag(models.Model): app_label = 'askbot' def get_groups(): - return Tag.group_tags.get_all() + from askbot.models import Group + return Group.objects.all() def get_group_names(): #todo: cache me diff --git a/askbot/models/user.py b/askbot/models/user.py index a6ff72a2..e93ce06e 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -356,19 +356,6 @@ class AuthUserGroups(models.Model): managed = False -class GroupMembership(models.Model): - """an explicit model to link users and the groups - that by being recorded with this relation automatically - become group tags - """ - group = models.ForeignKey(Tag, related_name = 'user_memberships') - user = models.ForeignKey(User, related_name = 'group_memberships') - - class Meta: - app_label = 'askbot' - unique_together = ('group', 'user') - - class Group(AuthGroup): """group profile for askbot""" logo_url = models.URLField(null = True) @@ -388,31 +375,6 @@ class Group(AuthGroup): app_label = 'askbot' db_table = 'askbot_group' - -class GroupProfile(models.Model): - """stores group profile data""" - group_tag = models.OneToOneField( - Tag, - unique = True, - related_name = 'group_profile' - ) - logo_url = models.URLField(null = True) - moderate_email = models.BooleanField(default = True) - is_open = models.BooleanField(default = False) - #preapproved email addresses and domain names to auto-join groups - #trick - the field is padded with space and all tokens are space separated - preapproved_emails = models.TextField( - null = True, blank = True, default = '' - ) - #only domains - without the '@' or anything before them - preapproved_email_domains = models.TextField( - null = True, blank = True, default = '' - ) - - class Meta: - #added to make account merges work properly - app_label = 'askbot' - def can_accept_user(self, user): """True if user is preapproved to join the group""" if user.is_anonymous(): -- cgit v1.2.3-1-g7c22 From 4b879e66e06f705ea25b0dbafd42c37b563338de Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 28 Aug 2012 00:18:42 -0400 Subject: switched from relations to auth_group to askbot_group --- askbot/models/post.py | 3 +-- askbot/models/question.py | 3 ++- askbot/models/user.py | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/askbot/models/post.py b/askbot/models/post.py index 8b14a845..0ca31750 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -9,7 +9,6 @@ from django.contrib.sitemaps import ping_google from django.utils import html from django.conf import settings from django.contrib.auth.models import User -from django.contrib.auth.models import Group from django.core import urlresolvers from django.db import models from django.utils import html as html_utils @@ -27,7 +26,7 @@ from askbot.utils.slug import slugify from askbot import const from askbot.models.user import Activity from askbot.models.user import EmailFeedSetting -#from askbot.models.user import Group +from askbot.models.user import Group from askbot.models.tag import Tag, MarkedTag from askbot.models.tag import get_groups, tags_match_some_wildcard from askbot.models.tag import get_global_group diff --git a/askbot/models/question.py b/askbot/models/question.py index d1af1224..85495e08 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -4,7 +4,7 @@ import re from django.conf import settings from django.db import models -from django.contrib.auth.models import User, Group +from django.contrib.auth.models import User from django.core import cache # import cache, not from cache import cache, to be able to monkey-patch cache.cache in test cases from django.core.urlresolvers import reverse from django.utils.hashcompat import md5_constructor @@ -25,6 +25,7 @@ from askbot.models.base import DraftContent, BaseQuerySetManager from askbot.models.tag import Tag, get_groups from askbot.models.post import Post, PostRevision from askbot.models.post import PostToGroup2 as PostToGroup +from askbot.models.user import Group from askbot.models import signals from askbot import const from askbot.utils.lists import LazyList diff --git a/askbot/models/user.py b/askbot/models/user.py index e93ce06e..a5b6dd1b 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -344,7 +344,6 @@ class EmailFeedSetting(models.Model): class AuthUserGroups(models.Model): """explicit model for the auth_user_groups bridge table. - Should not be used directly, but via a subclass """ group = models.ForeignKey(AuthGroup) user = models.ForeignKey(User) -- cgit v1.2.3-1-g7c22 From 8278bbeffc5346800ee12c7fae41c1c2d3fd14f7 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Wed, 29 Aug 2012 03:28:55 -0400 Subject: tests pass, but group-related features need some manual testing and more test cases --- askbot/context.py | 7 ++- askbot/mail/lamson_handlers.py | 11 ++-- .../0137_migrate_data_to_internal_group_models.py | 3 -- askbot/models/__init__.py | 20 ++++---- askbot/models/post.py | 19 +++---- askbot/models/question.py | 18 +++++-- askbot/models/tag.py | 58 ++-------------------- askbot/models/user.py | 53 ++++++++++++++++++-- .../default/templates/widgets/group_info.html | 18 +++---- askbot/tests/db_api_tests.py | 22 +++++--- askbot/tests/page_load_tests.py | 4 +- askbot/tests/thread_model_tests.py | 4 +- askbot/tests/user_model_tests.py | 6 +-- askbot/tests/utils.py | 5 +- askbot/views/commands.py | 42 ++++++++-------- askbot/views/users.py | 20 ++++---- 16 files changed, 154 insertions(+), 156 deletions(-) diff --git a/askbot/context.py b/askbot/context.py index 402183ea..111845fb 100644 --- a/askbot/context.py +++ b/askbot/context.py @@ -55,9 +55,8 @@ def application_settings(request): } if askbot_settings.GROUPS_ENABLED: - context['group_list'] = models.Tag.group_tags.get_all().filter( - deleted=False - ).exclude( - name__startswith='_internal_') + context['group_list'] = models.Group.objects.exclude( + name__startswith='_internal_' + ) return context diff --git a/askbot/mail/lamson_handlers.py b/askbot/mail/lamson_handlers.py index 6bafbc3f..59d707c7 100644 --- a/askbot/mail/lamson_handlers.py +++ b/askbot/mail/lamson_handlers.py @@ -6,7 +6,7 @@ from django.template import Context from django.utils.translation import ugettext as _ from lamson.routing import route, stateless from lamson.server import Relay -from askbot.models import ReplyAddress, Tag +from askbot.models import ReplyAddress, Group, Tag from askbot import mail from askbot.conf import settings as askbot_settings from askbot.skins.loaders import get_template @@ -199,15 +199,12 @@ def ASK(message, host = None, addr = None): if askbot_settings.GROUP_EMAIL_ADDRESSES_ENABLED == False: return try: - group_tag = Tag.group_tags.get( - deleted = False, - name__iexact = addr - ) + group = Group.objects.get(name__iexact=addr) mail.process_emailed_question( from_address, subject, body_text, stored_files, - group_id = group_tag.id + group_id = group.id ) - except Tag.DoesNotExist: + except Group.DoesNotExist: #do nothing because this handler will match all emails return except Tag.MultipleObjectsReturned: diff --git a/askbot/migrations/0137_migrate_data_to_internal_group_models.py b/askbot/migrations/0137_migrate_data_to_internal_group_models.py index e6388db4..0f18846e 100644 --- a/askbot/migrations/0137_migrate_data_to_internal_group_models.py +++ b/askbot/migrations/0137_migrate_data_to_internal_group_models.py @@ -17,9 +17,6 @@ class Migration(DataMigration): for profile in ProgressBar(items, count, message): group_tag = profile.group_tag group_name = group_tag.name.replace('-', ' ') - if group_name.startswith('_internal_'): - group_name = group_name.replace('_internal_', '', 1) - group = orm['askbot.Group']() group.name = group_name group.logo_url = profile.logo_url diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index d5758b67..6a957265 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -47,7 +47,7 @@ from askbot.models.user import AuthUserGroups as GroupMembership from askbot.models.user import Group from askbot.models.post import Post, PostRevision from askbot.models.post import PostFlagReason, AnonymousAnswer -from askbot.models.post import PostToGroup2 as PostToGroup +from askbot.models.post import PostToGroup from askbot.models.post import DraftAnswer from askbot.models.reply_by_email import ReplyAddress from askbot.models import signals @@ -2207,11 +2207,11 @@ def get_profile_link(self): def user_get_groups(self, private=False): """returns a query set of groups to which user belongs""" #todo: maybe cache this query - return Tag.group_tags.get_for_user(self, private=private) + return Group.objects.get_for_user(self, private=private) def user_get_personal_group(self): group_name = format_personal_group_name(self) - return Tag.group_tags.get(name=group_name) + return Group.objects.get(name=group_name) def user_get_foreign_groups(self): """returns a query set of groups to which user does not belong""" @@ -2243,8 +2243,6 @@ def user_get_groups_membership_info(self, groups): ``groups`` is a group tag query set """ - groups = groups.select_related('group_profile') - group_ids = groups.values_list('id', flat = True) memberships = GroupMembership.objects.filter( user__id = self.id, @@ -2258,7 +2256,7 @@ def user_get_groups_membership_info(self, groups): info[membership.group_id]['is_member'] = True for group in groups: - info[group.id]['can_join'] = group.group_profile.can_accept_user(self) + info[group.id]['can_join'] = group.can_accept_user(self) return info @@ -2634,8 +2632,12 @@ def user_join_group(self, group): def user_leave_group(self, group): self.edit_group_membership(group=group, user=self, action='remove') -def user_is_group_member(self, group = None): - return self.group_memberships.filter(group = group).count() == 1 +def user_is_group_member(self, group=None): + import pdb + pdb.set_trace() + return GroupMembership.objects.filter( + user=self, group=group + ).count() == 1 User.add_to_class( 'add_missing_askbot_subscriptions', @@ -3371,7 +3373,7 @@ def add_user_to_personal_group(sender, instance, created, **kwargs): #in theore here we may have two users that will have #identical group names!!! group_name = format_personal_group_name(instance) - group = Tag.group_tags.get_or_create( + group = Group.objects.get_or_create( group_name=group_name, user=instance ) instance.edit_group_membership( diff --git a/askbot/models/post.py b/askbot/models/post.py index 0ca31750..fb9491f1 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -27,6 +27,7 @@ from askbot import const from askbot.models.user import Activity from askbot.models.user import EmailFeedSetting from askbot.models.user import Group +from askbot.models.user import AuthUserGroups as GroupMembership from askbot.models.tag import Tag, MarkedTag from askbot.models.tag import get_groups, tags_match_some_wildcard from askbot.models.tag import get_global_group @@ -41,7 +42,7 @@ from askbot.utils.diff import textDiff as htmldiff from askbot.utils import mysql -class PostToGroup2(models.Model): +class PostToGroup(models.Model): post = models.ForeignKey('Post') group = models.ForeignKey(Group) @@ -320,7 +321,7 @@ class Post(models.Model): parent = models.ForeignKey('Post', blank=True, null=True, related_name='comments') # Answer or Question for Comment thread = models.ForeignKey('Thread', blank=True, null=True, default = None, related_name='posts') - new_groups = models.ManyToManyField(Group, through='PostToGroup2') + groups = models.ManyToManyField(Group, through='PostToGroup') author = models.ForeignKey(User, related_name='posts') added_at = models.DateTimeField(default=datetime.datetime.now) @@ -558,21 +559,21 @@ class Post(models.Model): def add_to_groups(self, groups): #todo: use bulk-creation for group in groups: - PostToGroup.objects.get_or_create(post=self, tag=group) + PostToGroup.objects.get_or_create(post=self, group=group) if self.is_answer() or self.is_question(): comments = self.comments.all() for group in groups: for comment in comments: - PostToGroup.objects.get_or_create(post=comment, tag=group) + PostToGroup.objects.get_or_create(post=comment, group=group) def remove_from_groups(self, groups): - PostToGroup.objects.filter(post=self, tag__in=groups).delete() + PostToGroup.objects.filter(post=self, group__in=groups).delete() if self.is_answer() or self.is_question(): comment_ids = self.comments.all().values_list('id', flat=True) PostToGroup.objects.filter( post__id__in=comment_ids, - tag__in=groups + group__in=groups ).delete() @@ -650,7 +651,7 @@ class Post(models.Model): todo: this is a copy-paste in thread and post """ if group_id: - group = Tag.group_tags.get(id=group_id) + group = Group.objects.get(id=group_id) groups = [group] self.add_to_groups(groups) @@ -1965,9 +1966,9 @@ class PostRevision(models.Model): if self.by_email and self.email_address: group_name = self.email_address.split('@')[0] try: - group = Tag.objects.get(name = group_name, deleted = False) + group = Group.objects.get(name = group_name, deleted = False) return group.group.profile.moderate_email - except Tag.DoesNotExist: + except Group.DoesNotExist: pass return True return False diff --git a/askbot/models/question.py b/askbot/models/question.py index 85495e08..c30d7089 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -24,7 +24,7 @@ from askbot.models.tag import delete_tags, separate_unused_tags from askbot.models.base import DraftContent, BaseQuerySetManager from askbot.models.tag import Tag, get_groups from askbot.models.post import Post, PostRevision -from askbot.models.post import PostToGroup2 as PostToGroup +from askbot.models.post import PostToGroup from askbot.models.user import Group from askbot.models import signals from askbot import const @@ -534,11 +534,19 @@ class Thread(models.Model): groups = self.groups.filter(name__startswith='_internal_') if exclude_user: - groups = groups.exclude(created_by__id=exclude_user.id) + exclude_user_group = exclude_user.get_personal_group() + groups = groups.exclude(name=exclude_user_group.name) - user_ids = groups.values_list('created_by__id', flat=True) if max_count: - user_ids = user_ids[:max_count] + groups = groups[:max_count] + + from askbot.models import GroupMembership + user_ids = GroupMembership.objects.filter( + group__in=groups + ).values_list( + 'user__id', flat=True + ) + return User.objects.filter(id__in=user_ids) def get_groups_shared_with(self, max_count=None): @@ -904,7 +912,7 @@ class Thread(models.Model): The add by ID now only works if user belongs to that group """ if group_id: - group = Tag.group_tags.get(id=group_id) + group = Group.objects.get(id=group_id) groups = [group] self.add_to_groups(groups) diff --git a/askbot/models/tag.py b/askbot/models/tag.py index 5b6d7076..c04b36da 100644 --- a/askbot/models/tag.py +++ b/askbot/models/tag.py @@ -17,15 +17,11 @@ def get_global_group(): #revert the values #todo: change groups to django groups group_name = askbot_settings.GLOBAL_GROUP_NAME + from askbot.models import Group try: - return Tag.group_tags.get(name=group_name) - except Tag.DoesNotExist: - from askbot.models import get_admin - return Tag.group_tags.get_or_create( - group_name=group_name, - user=get_admin(), - is_open=False - ) + return Group.objects.get(name=group_name) + except Group.DoesNotExist: + return Group.objects.create(name=group_name, is_open=False) def delete_tags(tags): """deletes tags in the list""" @@ -282,28 +278,6 @@ class TagManager(BaseQuerySetManager): return created_tags -class GroupTagQuerySet(TagQuerySet): - """Custom query set for the group""" - - def get_for_user(self, user=None, private=False): - if private: - global_group = get_global_group() - return self.filter( - user_memberships__user=user - ).exclude(id=global_group.id) - else: - return self.filter(user_memberships__user = user) - - def get_all(self): - return self.annotate( - member_count = models.Count('user_memberships') - ).filter( - member_count__gt = 0 - ) - - def get_by_name(self, group_name = None): - return self.get(name = clean_group_name(group_name)) - def clean_group_name(name): """group names allow spaces, @@ -311,29 +285,6 @@ def clean_group_name(name): to replace spaces with dashes""" return re.sub('\s+', '-', name.strip()) -class GroupTagManager(BaseQuerySetManager): - """manager for group tags""" - - def get_query_set(self): - return GroupTagQuerySet(self.model) - - def get_or_create(self, group_name = None, user = None, is_open=True): - """creates a group tag or finds one, if exists""" - #todo: here we might fill out the group profile - - #replace spaces with dashes - group_name = clean_group_name(group_name) - try: - #iexact is important!!! b/c we don't want case variants - #of tags - tag = self.get(name__iexact = group_name) - except self.model.DoesNotExist: - tag = self.model(name = group_name, created_by = user) - tag.save() - from askbot.models.user import GroupProfile - group_profile = GroupProfile(group_tag = tag, is_open=is_open) - group_profile.save() - return tag class Tag(models.Model): #a couple of status constants @@ -364,7 +315,6 @@ class Tag(models.Model): ) objects = TagManager() - group_tags = GroupTagManager() class Meta: app_label = 'askbot' diff --git a/askbot/models/user.py b/askbot/models/user.py index a5b6dd1b..0eb48f6f 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -14,7 +14,9 @@ from django.utils.html import strip_tags from askbot import const from askbot.conf import settings as askbot_settings from askbot.utils import functions -from askbot.models.tag import Tag +from askbot.models.base import BaseQuerySetManager +from askbot.models.tag import Tag, get_global_group +from askbot.models.tag import clean_group_name#todo - delete this from askbot.forms import DomainNameField from askbot.utils.forms import email_is_allowed @@ -355,6 +357,49 @@ class AuthUserGroups(models.Model): managed = False +class GroupQuerySet(models.query.QuerySet): + """Custom query set for the group""" + + def get_for_user(self, user=None, private=False): + if private: + global_group = get_global_group() + return self.filter( + user=user + ).exclude(id=global_group.id) + else: + return self.filter(user = user) + + def get_by_name(self, group_name = None): + return self.get(name = clean_group_name(group_name)) + + +class GroupManager(BaseQuerySetManager): + """model manager for askbot groups""" + + def get_query_set(self): + return GroupQuerySet(self.model) + + def create(self, **kwargs): + name = kwargs['name'] + try: + group_ptr = AuthGroup.objects.get(name=name) + kwargs['group_ptr'] = group_ptr + except AuthGroup.DoesNotExist: + pass + return super(GroupManager, self).create(**kwargs) + + def get_or_create(self, group_name = None, user = None, is_open=True): + """creates a group tag or finds one, if exists""" + #todo: here we might fill out the group profile + try: + #iexact is important!!! b/c we don't want case variants + #of tags + group = self.get(name__iexact = group_name) + except self.model.DoesNotExist: + group = self.create(name=group_name, is_open=is_open) + return group + + class Group(AuthGroup): """group profile for askbot""" logo_url = models.URLField(null = True) @@ -370,6 +415,8 @@ class Group(AuthGroup): null = True, blank = True, default = '' ) + objects = GroupManager() + class Meta: app_label = 'askbot' db_table = 'askbot_group' @@ -380,7 +427,7 @@ class Group(AuthGroup): return False #a special case - automatic global group cannot be joined or left - if self.group_tag.name == askbot_settings.GLOBAL_GROUP_NAME: + if self.name == askbot_settings.GLOBAL_GROUP_NAME: return False if self.is_open: @@ -423,4 +470,4 @@ class Group(AuthGroup): def save(self, *args, **kwargs): self.clean() - super(GroupProfile, self).save(*args, **kwargs) + super(Group, self).save(*args, **kwargs) diff --git a/askbot/skins/default/templates/widgets/group_info.html b/askbot/skins/default/templates/widgets/group_info.html index 5d3a4c7f..85fcd693 100644 --- a/askbot/skins/default/templates/widgets/group_info.html +++ b/askbot/skins/default/templates/widgets/group_info.html @@ -2,8 +2,8 @@

{% trans %}Group info{% endtrans %}

{% trans %}edit description{% endtrans %} - {% if group.group_profile.logo_url %} + {% if group.logo_url %} | @@ -39,7 +39,7 @@ {% if group_email_moderation_enabled %}