diff options
-rw-r--r-- | askbot/3 | 206 | ||||
-rw-r--r-- | askbot/conf/group_settings.py | 5 | ||||
-rw-r--r-- | askbot/context.py | 2 | ||||
-rw-r--r-- | askbot/models/__init__.py | 5 | ||||
-rw-r--r-- | askbot/models/post.py | 11 | ||||
-rw-r--r-- | askbot/models/question.py | 13 | ||||
-rw-r--r-- | askbot/models/tag.py | 15 | ||||
-rw-r--r-- | askbot/models/user.py | 18 | ||||
-rw-r--r-- | askbot/tests/db_api_tests.py | 9 | ||||
-rw-r--r-- | askbot/tests/question_views_tests.py | 13 | ||||
-rw-r--r-- | askbot/tests/thread_model_tests.py | 5 | ||||
-rw-r--r-- | askbot/views/commands.py | 3 | ||||
-rw-r--r-- | askbot/views/users.py | 5 |
13 files changed, 253 insertions, 57 deletions
diff --git a/askbot/3 b/askbot/3 new file mode 100644 index 00000000..223f65f6 --- /dev/null +++ b/askbot/3 @@ -0,0 +1,206 @@ +from bs4 import BeautifulSoup +from askbot.conf import settings as askbot_settings +from askbot import const +from askbot.tests.utils import AskbotTestCase +from askbot import models +from django.core.urlresolvers import reverse + + +class PrivateQuestionViewsTests(AskbotTestCase): + + def setUp(self): + self._backup = askbot_settings.GROUPS_ENABLED + askbot_settings.update('GROUPS_ENABLED', True) + self.user = self.create_user('user') + self.group = models.Group.objects.create( + name='the group', openness=models.Group.OPEN + ) + self.user.join_group(self.group) + self.qdata = { + 'title': 'test question title', + 'text': 'test question text' + } + self.client.login(user_id=self.user.id, method='force') + + def tearDown(self): + askbot_settings.update('GROUPS_ENABLED', self._backup) + + def test_post_private_question(self): + data = self.qdata + data['post_privately'] = 'checked' + response1 = self.client.post(reverse('ask'), data=data) + response2 = self.client.get(response1['location']) + dom = BeautifulSoup(response2.content) + title = dom.find('h1').text + self.assertTrue(const.POST_STATUS['private'] in title) + question = models.Thread.objects.get(id=1) + self.assertEqual(question.title, self.qdata['title']) + self.assertFalse(models.Group.objects.get_global_group() in set(question.groups.all())) + + #private question is not accessible to unauthorized users + self.client.logout() + response = self.client.get(question._question_post().get_absolute_url()) + self.assertEqual(response.status_code, 302) + self.assertEqual(response.content, '') + #private question link is not shown on the main page + #to unauthorized users + response = self.client.get(reverse('questions')) + self.assertFalse(self.qdata['title'] in response.content) + #private question link is not shown on the poster profile + #to the unauthorized users + response = self.client.get(self.user.get_profile_url()) + self.assertFalse(self.qdata['title'] in response.content) + + def test_publish_private_question(self): + question = self.post_question(user=self.user, is_private=True) + title = question.thread.get_title() + self.assertTrue(const.POST_STATUS['private'] in title) + data = self.qdata + #data['post_privately'] = 'false' + data['select_revision'] = 'false' + data['text'] = 'edited question text' + response1 = self.client.post( + reverse('edit_question', kwargs={'id':question.id}), + data=data + ) + response2 = self.client.get(question.get_absolute_url()) + dom = BeautifulSoup(response2.content) + title = dom.find('h1').text + self.assertTrue(models.Group.objects.get_global_group() in set(question.groups.all())) + self.assertEqual(title, self.qdata['title']) + + self.client.logout() + response = self.client.get(question.get_absolute_url()) + self.assertTrue('edited question text' in response.content) + + def test_privatize_public_question(self): + question = self.post_question(user=self.user) + title = question.thread.get_title() + self.assertFalse(const.POST_STATUS['private'] in title) + data = self.qdata + data['post_privately'] = 'checked' + data['select_revision'] = 'false' + response1 = self.client.post( + reverse('edit_question', kwargs={'id':question.id}), + data=data + ) + response2 = self.client.get(question.get_absolute_url()) + dom = BeautifulSoup(response2.content) + title = dom.find('h1').text + self.assertFalse(models.Group.objects.get_global_group() in set(question.groups.all())) + self.assertTrue(const.POST_STATUS['private'] in title) + + def test_private_checkbox_is_on_when_editing_private_question(self): + question = self.post_question(user=self.user, is_private=True) + response = self.client.get( + reverse('edit_question', kwargs={'id':question.id}) + ) + dom = BeautifulSoup(response.content) + checkbox = dom.find( + 'input', attrs={'type': 'checkbox', 'name': 'post_privately'} + ) + self.assertEqual(checkbox['checked'], 'checked') + + def test_private_checkbox_is_off_when_editing_public_question(self): + question = self.post_question(user=self.user) + response = self.client.get( + reverse('edit_question', kwargs={'id':question.id}) + ) + dom = BeautifulSoup(response.content) + checkbox = dom.find( + 'input', attrs={'type': 'checkbox', 'name': 'post_privately'} + ) + self.assertEqual(checkbox.get('checked', False), False) + + +class PrivateAnswerViewsTests(AskbotTestCase): + + def setUp(self): + self._backup = askbot_settings.GROUPS_ENABLED + askbot_settings.update('GROUPS_ENABLED', True) + self.user = self.create_user('user') + group = models.Group.objects.create( + name='the group', openness=models.Group.OPEN + ) + self.user.join_group(group) + self.question = self.post_question(user=self.user) + self.client.login(user_id=self.user.id, method='force') + + def tearDown(self): + askbot_settings.update('GROUPS_ENABLED', self._backup) + + def test_post_private_answer(self): + response1 = self.client.post( + reverse('answer', kwargs={'id': self.question.id}), + data={'text': 'some answer text', 'post_privately': 'checked'} + ) + answer = self.question.thread.get_answers(user=self.user)[0] + self.assertFalse(models.Group.objects.get_global_group() in set(answer.groups.all())) + self.client.logout() + + user2 = self.create_user('user2') + self.client.login(user_id=user2.id, method='force') + response = self.client.get(self.question.get_absolute_url()) + self.assertFalse('some answer text' in response.content) + + self.client.logout() + response = self.client.get(self.question.get_absolute_url()) + self.assertFalse('some answer text' in response.content) + + + def test_private_checkbox_is_on_when_editing_private_answer(self): + answer = self.post_answer( + question=self.question, user=self.user, is_private=True + ) + response = self.client.get( + reverse('edit_answer', kwargs={'id': answer.id}) + ) + dom = BeautifulSoup(response.content) + checkbox = dom.find( + 'input', attrs={'type': 'checkbox', 'name': 'post_privately'} + ) + self.assertEqual(checkbox['checked'], 'checked') + + def test_privaet_checkbox_is_off_when_editing_public_answer(self): + answer = self.post_answer(question=self.question, user=self.user) + response = self.client.get( + reverse('edit_answer', kwargs={'id': answer.id}) + ) + dom = BeautifulSoup(response.content) + checkbox = dom.find( + 'input', attrs={'type': 'checkbox', 'name': 'post_privately'} + ) + self.assertEqual(checkbox.get('checked', False), False) + + def test_publish_private_answer(self): + answer = self.post_answer( + question=self.question, user=self.user, is_private=True + ) + self.client.post( + reverse('edit_answer', kwargs={'id': answer.id}), + data={'text': 'edited answer text', 'select_revision': 'false'} + ) + answer = self.reload_object(answer) + self.assertTrue(models.Group.objects.get_global_group() in answer.groups.all()) + self.client.logout() + response = self.client.get(self.question.get_absolute_url()) + self.assertTrue('edited answer text' in response.content) + + + def test_privatize_public_answer(self): + answer = self.post_answer(question=self.question, user=self.user) + self.client.post( + reverse('edit_answer', kwargs={'id': answer.id}), + data={ + 'text': 'edited answer text', + 'post_privately': 'checked', + 'select_revision': 'false' + } + ) + #check that answer is not visible to the "everyone" group + answer = self.reload_object(answer) + self.assertFalse(models.Group.objects.get_global_group() in answer.groups.all()) + #check that countent is not seen by an anonymous user + self.client.logout() + response = self.client.get(self.question.get_absolute_url()) + self.assertFalse('edited answer text' in response.content) diff --git a/askbot/conf/group_settings.py b/askbot/conf/group_settings.py index 2933b831..04be618f 100644 --- a/askbot/conf/group_settings.py +++ b/askbot/conf/group_settings.py @@ -20,14 +20,15 @@ settings.register( ) def group_name_update_callback(old_name, new_name): - from askbot.models.tag import get_global_group, clean_group_name + from askbot.models.tag import clean_group_name + from askbot.models import Group cleaned_new_name = clean_group_name(new_name.strip()) if new_name == '': #name cannot be empty return old_name - group = get_global_group() + group = Group.objects.get_global_group() group.name = cleaned_new_name group.save() return new_name diff --git a/askbot/context.py b/askbot/context.py index 5e53febc..61f833cb 100644 --- a/askbot/context.py +++ b/askbot/context.py @@ -69,7 +69,7 @@ def application_settings(request): ) #load id's and names of all groups - global_group = models.tag.get_global_group() + global_group = models.Group.objects.get_global_group() groups = models.Group.objects.exclude_personal() groups = groups.exclude(id=global_group.id) groups_data = list(groups.values('id', 'name')) diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index db9674e2..9c9880b2 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -41,8 +41,6 @@ from askbot.models.question import QuestionView, AnonymousQuestion from askbot.models.question import DraftQuestion from askbot.models.question import FavoriteQuestion from askbot.models.tag import Tag, MarkedTag -from askbot.models.tag import get_global_group -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 @@ -3464,9 +3462,8 @@ def add_user_to_global_group(sender, instance, created, **kwargs): ``instance`` is an instance of ``User`` class """ if created: - from askbot.models.tag import get_global_group instance.edit_group_membership( - group=get_global_group(), + group=Group.objects.get_global_group(), user=instance, action='add' ) diff --git a/askbot/models/post.py b/askbot/models/post.py index 0c5e2b00..85628f55 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -31,7 +31,6 @@ from askbot.models.user import Group from askbot.models.user import 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 from askbot.conf import settings as askbot_settings from askbot import exceptions from askbot.utils import markup @@ -62,7 +61,7 @@ class PostQuerySet(models.query.QuerySet): def get_for_user(self, user): if askbot_settings.GROUPS_ENABLED: if user is None or user.is_anonymous(): - groups = [get_global_group()] + groups = [Group.objects.get_global_group()] else: groups = user.get_groups() return self.filter(groups__in = groups).distinct() @@ -692,7 +691,7 @@ class Post(models.Model): groups = [group] self.add_to_groups(groups) - global_group = get_global_group() + global_group = Group.objects.get_global_group() if group != global_group: self.remove_from_groups((global_group,)) else: @@ -706,7 +705,7 @@ class Post(models.Model): groups = user.get_groups(private=True) self.add_to_groups(groups) - self.remove_from_groups((get_global_group(),)) + self.remove_from_groups((Group.objects.get_global_group(),)) if len(groups) == 0: message = 'Sharing did not work, because group is unknown' @@ -714,13 +713,13 @@ class Post(models.Model): def make_public(self): """removes the privacy mark from users groups""" - groups = (get_global_group(),) + groups = (Group.objects.get_global_group(),) self.add_to_groups(groups) def is_private(self): """true, if post belongs to the global group""" if askbot_settings.GROUPS_ENABLED: - group = get_global_group() + group = Group.objects.get_global_group() return not self.groups.filter(id=group.id).exists() return False diff --git a/askbot/models/question.py b/askbot/models/question.py index f94265b0..76411ffa 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -18,7 +18,6 @@ from askbot import mail from askbot.mail import messages from askbot.models.tag import Tag from askbot.models.tag import get_groups -from askbot.models.tag import get_global_group from askbot.models.tag import get_tags_by_names from askbot.models.tag import filter_accepted_tags, filter_suggested_tags from askbot.models.tag import delete_tags, separate_unused_tags @@ -41,7 +40,7 @@ class ThreadQuerySet(models.query.QuerySet): if user.is_authenticated(): groups = user.get_groups() else: - groups = [get_global_group()] + groups = [Group.objects.get_global_group()] return self.filter(groups__in=groups).distinct() class ThreadManager(BaseQuerySetManager): @@ -825,7 +824,7 @@ class Thread(models.Model): thread_posts = self.posts.all() if askbot_settings.GROUPS_ENABLED: if user is None or user.is_anonymous(): - groups = (get_global_group(),) + groups = (Group.objects.get_global_group(),) else: groups = user.get_groups() @@ -1078,7 +1077,7 @@ class Thread(models.Model): def make_public(self, recursive=False): """adds the global group to the thread""" - groups = (get_global_group(), ) + groups = (Group.objects.get_global_group(), ) self.add_to_groups(groups, recursive=recursive) if recursive == False: self._question_post().make_public() @@ -1093,13 +1092,13 @@ class Thread(models.Model): groups = [group] self.add_to_groups(groups) - global_group = get_global_group() + global_group = Group.objects.get_global_group() if group != global_group: self.remove_from_groups((global_group,)) else: groups = user.get_groups(private=True) self.add_to_groups(groups) - self.remove_from_groups((get_global_group(),)) + self.remove_from_groups((Group.objects.get_global_group(),)) self._question_post().make_private(user, group_id) @@ -1110,7 +1109,7 @@ class Thread(models.Model): def is_private(self): """true, if thread belongs to the global group""" if askbot_settings.GROUPS_ENABLED: - group = get_global_group() + group = Group.objects.get_global_group() return not self.groups.filter(id=group.id).exists() return False diff --git a/askbot/models/tag.py b/askbot/models/tag.py index 647ea5cf..0c029d27 100644 --- a/askbot/models/tag.py +++ b/askbot/models/tag.py @@ -9,21 +9,6 @@ from askbot import const from askbot.conf import settings as askbot_settings from askbot.utils import category_tree -def get_global_group(): - """Returns the global group, - if necessary, creates one - """ - #todo: when groups are disconnected from tags, - #find comment as shown below in the test cases and - #revert the values - #todo: change groups to django groups - group_name = askbot_settings.GLOBAL_GROUP_NAME - from askbot.models import Group - try: - return Group.objects.get(name=group_name) - except Group.DoesNotExist: - return Group.objects.create(name=group_name) - def delete_tags(tags): """deletes tags in the list""" tag_ids = [tag.id for tag in tags] diff --git a/askbot/models/user.py b/askbot/models/user.py index e5cccbf3..00e9428a 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -15,7 +15,7 @@ from askbot import const from askbot.conf import settings as askbot_settings from askbot.utils import functions from askbot.models.base import BaseQuerySetManager -from askbot.models.tag import Tag, get_global_group +from askbot.models.tag import Tag from askbot.models.tag import clean_group_name#todo - delete this from askbot.forms import DomainNameField from askbot.utils.forms import email_is_allowed @@ -411,7 +411,7 @@ class GroupQuerySet(models.query.QuerySet): def get_for_user(self, user=None, private=False): if private: - global_group = get_global_group() + global_group = Group.objects.get_global_group() return self.filter( user=user ).exclude(id=global_group.id) @@ -428,6 +428,20 @@ class GroupManager(BaseQuerySetManager): def get_query_set(self): return GroupQuerySet(self.model) + def get_global_group(self): + """Returns the global group, + if necessary, creates one + """ + #todo: when groups are disconnected from tags, + #find comment as shown below in the test cases and + #revert the values + #todo: change groups to django groups + group_name = askbot_settings.GLOBAL_GROUP_NAME + try: + return self.get_query_set().get(name=group_name) + except Group.DoesNotExist: + return self.get_query_set().create(name=group_name) + def create(self, **kwargs): name = kwargs['name'] try: diff --git a/askbot/tests/db_api_tests.py b/askbot/tests/db_api_tests.py index 8a6ffe0e..0af6d955 100644 --- a/askbot/tests/db_api_tests.py +++ b/askbot/tests/db_api_tests.py @@ -15,7 +15,6 @@ from askbot.tests.utils import with_settings from askbot import models from askbot import const from askbot.conf import settings as askbot_settings -from askbot.models.tag import get_global_group import datetime class DBApiTests(AskbotTestCase): @@ -515,11 +514,11 @@ class GroupTests(AskbotTestCase): def test_global_group_name_setting_changes_group_name(self): askbot_settings.update('GLOBAL_GROUP_NAME', 'all-people') - group = get_global_group() + group = models.Group.objects.get_global_group() self.assertEqual(group.name, 'all-people') def test_ask_global_group_by_id_works(self): - group = get_global_group() + group = models.Group.objects.get_global_group() q = self.post_question(user=self.u1, group_id=group.id) self.assertEqual(q.groups.count(), 2) self.assertEqual(q.groups.filter(name=group.name).exists(), True) @@ -601,7 +600,7 @@ class GroupTests(AskbotTestCase): data['thread'].make_public(recursive=True) - global_group = get_global_group() + global_group = models.Group.objects.get_global_group() groups = [global_group, private_group, self.u1.get_personal_group()] self.assertObjectGroupsEqual(data['thread'], groups) self.assertObjectGroupsEqual(data['question'], groups) @@ -616,7 +615,7 @@ class GroupTests(AskbotTestCase): thread = data['thread'] thread.add_to_groups([private_group], recursive=True) - global_group = get_global_group() + global_group = models.Group.objects.get_global_group() groups = [global_group, private_group, self.u1.get_personal_group()] self.assertObjectGroupsEqual(thread, groups) self.assertObjectGroupsEqual(data['question'], groups) diff --git a/askbot/tests/question_views_tests.py b/askbot/tests/question_views_tests.py index b1836f9e..223f65f6 100644 --- a/askbot/tests/question_views_tests.py +++ b/askbot/tests/question_views_tests.py @@ -3,7 +3,6 @@ from askbot.conf import settings as askbot_settings from askbot import const from askbot.tests.utils import AskbotTestCase from askbot import models -from askbot.models.tag import get_global_group from django.core.urlresolvers import reverse @@ -36,7 +35,7 @@ class PrivateQuestionViewsTests(AskbotTestCase): self.assertTrue(const.POST_STATUS['private'] in title) question = models.Thread.objects.get(id=1) self.assertEqual(question.title, self.qdata['title']) - self.assertFalse(get_global_group() in set(question.groups.all())) + self.assertFalse(models.Group.objects.get_global_group() in set(question.groups.all())) #private question is not accessible to unauthorized users self.client.logout() @@ -67,7 +66,7 @@ class PrivateQuestionViewsTests(AskbotTestCase): response2 = self.client.get(question.get_absolute_url()) dom = BeautifulSoup(response2.content) title = dom.find('h1').text - self.assertTrue(get_global_group() in set(question.groups.all())) + self.assertTrue(models.Group.objects.get_global_group() in set(question.groups.all())) self.assertEqual(title, self.qdata['title']) self.client.logout() @@ -88,7 +87,7 @@ class PrivateQuestionViewsTests(AskbotTestCase): response2 = self.client.get(question.get_absolute_url()) dom = BeautifulSoup(response2.content) title = dom.find('h1').text - self.assertFalse(get_global_group() in set(question.groups.all())) + self.assertFalse(models.Group.objects.get_global_group() in set(question.groups.all())) self.assertTrue(const.POST_STATUS['private'] in title) def test_private_checkbox_is_on_when_editing_private_question(self): @@ -136,7 +135,7 @@ class PrivateAnswerViewsTests(AskbotTestCase): data={'text': 'some answer text', 'post_privately': 'checked'} ) answer = self.question.thread.get_answers(user=self.user)[0] - self.assertFalse(get_global_group() in set(answer.groups.all())) + self.assertFalse(models.Group.objects.get_global_group() in set(answer.groups.all())) self.client.logout() user2 = self.create_user('user2') @@ -182,7 +181,7 @@ class PrivateAnswerViewsTests(AskbotTestCase): data={'text': 'edited answer text', 'select_revision': 'false'} ) answer = self.reload_object(answer) - self.assertTrue(get_global_group() in answer.groups.all()) + self.assertTrue(models.Group.objects.get_global_group() in answer.groups.all()) self.client.logout() response = self.client.get(self.question.get_absolute_url()) self.assertTrue('edited answer text' in response.content) @@ -200,7 +199,7 @@ class PrivateAnswerViewsTests(AskbotTestCase): ) #check that answer is not visible to the "everyone" group answer = self.reload_object(answer) - self.assertFalse(get_global_group() in answer.groups.all()) + self.assertFalse(models.Group.objects.get_global_group() in answer.groups.all()) #check that countent is not seen by an anonymous user self.client.logout() response = self.client.get(self.question.get_absolute_url()) diff --git a/askbot/tests/thread_model_tests.py b/askbot/tests/thread_model_tests.py index baf51e8e..33a2055c 100644 --- a/askbot/tests/thread_model_tests.py +++ b/askbot/tests/thread_model_tests.py @@ -1,7 +1,6 @@ from askbot.tests.utils import AskbotTestCase from askbot.conf import settings as askbot_settings from askbot import models -from askbot.models.tag import get_global_group import django.core.mail from django.core.urlresolvers import reverse @@ -63,7 +62,7 @@ class ThreadModelTestsWithGroupsEnabled(AskbotTestCase): def test_answer_to_private_question_is_not_globally_visible(self): question = self.post_question(user=self.admin, is_private=True) answer = self.post_answer(question=question, user=self.admin, is_private=False) - global_group = get_global_group() + global_group = models.Group.objects.get_global_group() self.assertEqual( global_group in set(answer.groups.all()), False @@ -74,7 +73,7 @@ class ThreadModelTestsWithGroupsEnabled(AskbotTestCase): question = self.post_question(user=self.user, group_id=self.group.id) #answer posted by a group member answer = self.post_answer(question=question, user=self.admin, is_private=False) - global_group = get_global_group() + global_group = models.Group.objects.get_global_group() self.assertEqual( global_group in set(answer.groups.all()), False diff --git a/askbot/views/commands.py b/askbot/views/commands.py index f7d22f48..5a76790f 100644 --- a/askbot/views/commands.py +++ b/askbot/views/commands.py @@ -30,7 +30,6 @@ from askbot import models from askbot import forms from askbot.conf import should_show_sort_by_relevance from askbot.conf import settings as askbot_settings -from askbot.models.tag import get_global_group from askbot.utils import category_tree from askbot.utils import decorators from askbot.utils import url_utils @@ -649,7 +648,7 @@ def add_tag_category(request): def get_groups_list(request): """returns names of group tags for the autocomplete function""" - global_group = get_global_group() + global_group = models.Group.objects.get_global_group() groups = models.Group.objects.exclude_personal() group_names = groups.exclude( name=global_group.name diff --git a/askbot/views/users.py b/askbot/views/users.py index c22fd294..b30e546d 100644 --- a/askbot/views/users.py +++ b/askbot/views/users.py @@ -39,7 +39,6 @@ from askbot.conf import settings as askbot_settings from askbot import models from askbot import exceptions from askbot.models.badges import award_badges_signal -from askbot.models.tag import get_global_group from askbot.models.tag import get_groups from askbot.models.tag import format_personal_group_name from askbot.skins.loaders import render_into_skin @@ -65,7 +64,7 @@ def show_users(request, by_group=False, group_id=None, group_slug=None): """Users view, including listing of users by group""" if askbot_settings.GROUPS_ENABLED and not by_group: - default_group = get_global_group() + default_group = models.Group.objects.get_global_group() group_slug = slugify(default_group.name) new_url = reverse('users_by_group', kwargs={'group_id': default_group.id, @@ -491,7 +490,7 @@ def user_stats(request, user, context): user_groups = models.Group.objects.get_for_user(user = user) user_groups = user_groups.exclude_personal() - global_group = get_global_group() + global_group = models.Group.objects.get_global_group() user_groups = user_groups.exclude(name=global_group.name) if request.user == user: |