From 3e5cc9dc7f6315cb35946a77b5ece71e909cc0a9 Mon Sep 17 00:00:00 2001 From: Loek van Gent Date: Mon, 15 Aug 2022 17:59:42 +0200 Subject: [PATCH 1/6] Add setting for create initiatives --- bluebottle/members/admin.py | 8 +++++++ .../migrations/0062_auto_20220815_1751.py | 21 +++++++++++++++++++ bluebottle/members/models.py | 3 +++ bluebottle/members/serializers.py | 1 + 4 files changed, 33 insertions(+) create mode 100644 bluebottle/members/migrations/0062_auto_20220815_1751.py diff --git a/bluebottle/members/admin.py b/bluebottle/members/admin.py index 5c63f36c12..f3c5a67282 100644 --- a/bluebottle/members/admin.py +++ b/bluebottle/members/admin.py @@ -140,6 +140,14 @@ class MemberPlatformSettingsAdmin(BasePlatformSettingsAdmin, NonSortableParentAd ) } ), + ( + _('Initiatives'), + { + 'fields': ( + 'create_initiatives', + ) + } + ), ) def get_fieldsets(self, request, obj=None): diff --git a/bluebottle/members/migrations/0062_auto_20220815_1751.py b/bluebottle/members/migrations/0062_auto_20220815_1751.py new file mode 100644 index 0000000000..47cbfea4d4 --- /dev/null +++ b/bluebottle/members/migrations/0062_auto_20220815_1751.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.24 on 2022-08-15 15:51 + +import bluebottle.bb_accounts.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0061_auto_20220808_1113'), + ] + + operations = [ + migrations.AddField( + model_name='memberplatformsettings', + name='create_initiatives', + field=models.BooleanField(default=True, help_text='Members can create activities'), + ), + + ] diff --git a/bluebottle/members/models.py b/bluebottle/members/models.py index 56cb40d7f9..fe8a31fe21 100644 --- a/bluebottle/members/models.py +++ b/bluebottle/members/models.py @@ -35,6 +35,9 @@ class MemberPlatformSettings(BasePlatformSettings): closed = models.BooleanField( default=False, help_text=_('Require login before accessing the platform') ) + create_initiatives = models.BooleanField( + default=True, help_text=_('Members can create initiatives') + ) login_methods = MultiSelectField(max_length=100, choices=LOGIN_METHODS, default=['password']) confirm_signup = models.BooleanField( default=False, help_text=_('Require verifying the user\'s email before signup') diff --git a/bluebottle/members/serializers.py b/bluebottle/members/serializers.py index e2077de64d..5c3e8528d9 100644 --- a/bluebottle/members/serializers.py +++ b/bluebottle/members/serializers.py @@ -670,6 +670,7 @@ class Meta(object): 'require_address', 'require_birthdate', 'require_phone_number', + 'create_initiatives' ) From d13f4e82f548cc8e8cc2d9163c3f79738c638dd2 Mon Sep 17 00:00:00 2001 From: Ernst Odolphi Date: Tue, 16 Aug 2022 11:53:59 +0200 Subject: [PATCH 2/6] Add upcoming filter to activity list api endpoint --- bluebottle/activities/filters.py | 7 ++++ bluebottle/activities/tests/test_api.py | 43 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/bluebottle/activities/filters.py b/bluebottle/activities/filters.py index 6acbe1d205..2d804f614f 100644 --- a/bluebottle/activities/filters.py +++ b/bluebottle/activities/filters.py @@ -31,6 +31,7 @@ class ActivitySearchFilter(ElasticSearchFilter): 'expertise.id', 'type', 'status', + 'upcoming', 'location.id', 'segment', 'team_activity' @@ -152,6 +153,12 @@ def get_type_filter(self, value, request): return Term(type=value) + def get_upcoming_filter(self, value, request): + if value == 'true': + return Terms(status=['open', 'full']) + if value == 'false': + return Terms(status=['succeeded', 'partially_funded']) + def get_duration_filter(self, value, request): start = request.GET.get('filter[start]') end = request.GET.get('filter[end]') diff --git a/bluebottle/activities/tests/test_api.py b/bluebottle/activities/tests/test_api.py index 7571975167..d4e56f2b4c 100644 --- a/bluebottle/activities/tests/test_api.py +++ b/bluebottle/activities/tests/test_api.py @@ -647,6 +647,49 @@ def test_filter_segment(self): self.assertEqual(data['meta']['pagination']['count'], 1) self.assertEqual(data['data'][0]['id'], str(first.pk)) + def test_filter_upcoming(self): + first = DateActivityFactory.create() + + second = DateActivityFactory.create() + second.status = 'full' + second.save() + + succeeded = DateActivityFactory.create() + succeeded.status = 'succeeded' + succeeded.save() + + response = self.client.get( + self.url + '?filter[upcoming]=true', + user=self.owner + ) + + data = json.loads(response.content) + + self.assertEqual(data['meta']['pagination']['count'], 2) + self.assertEqual(data['data'][0]['id'], str(first.pk)) + self.assertEqual(data['data'][1]['id'], str(second.pk)) + + def test_filter_upcoming_false(self): + DateActivityFactory.create() + + second = DateActivityFactory.create() + second.status = 'full' + second.save() + + succeeded = DateActivityFactory.create() + succeeded.status = 'succeeded' + succeeded.save() + + response = self.client.get( + self.url + '?filter[upcoming]=false', + user=self.owner + ) + + data = json.loads(response.content) + + self.assertEqual(data['meta']['pagination']['count'], 1) + self.assertEqual(data['data'][0]['id'], str(succeeded.pk)) + def test_filter_segment_mismatch(self): first = DateActivityFactory.create( status='open', From 3f3c0980c863a1b7affb20e8185f03742a0b8662 Mon Sep 17 00:00:00 2001 From: Ernst Odolphi Date: Tue, 16 Aug 2022 16:34:21 +0200 Subject: [PATCH 3/6] Fix test --- bluebottle/activities/tests/test_api.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bluebottle/activities/tests/test_api.py b/bluebottle/activities/tests/test_api.py index d4e56f2b4c..aa7d6c00ea 100644 --- a/bluebottle/activities/tests/test_api.py +++ b/bluebottle/activities/tests/test_api.py @@ -648,7 +648,9 @@ def test_filter_segment(self): self.assertEqual(data['data'][0]['id'], str(first.pk)) def test_filter_upcoming(self): - first = DateActivityFactory.create() + first = DateActivityFactory.create( + status='open', + ) second = DateActivityFactory.create() second.status = 'full' @@ -670,7 +672,9 @@ def test_filter_upcoming(self): self.assertEqual(data['data'][1]['id'], str(second.pk)) def test_filter_upcoming_false(self): - DateActivityFactory.create() + DateActivityFactory.create( + status='open', + ) second = DateActivityFactory.create() second.status = 'full' From e17ef1a0d8ca4e2024e00135b2469db7cca4c5e6 Mon Sep 17 00:00:00 2001 From: Loek van Gent Date: Wed, 17 Aug 2022 13:38:38 +0200 Subject: [PATCH 4/6] Add test --- bluebottle/members/tests/test_api.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bluebottle/members/tests/test_api.py b/bluebottle/members/tests/test_api.py index c843488071..a45ebf1c7a 100644 --- a/bluebottle/members/tests/test_api.py +++ b/bluebottle/members/tests/test_api.py @@ -1099,3 +1099,14 @@ def test_required_questions(self): settings.save() response = self.client.get(self.url, token=self.user_token) self.assertEqual(response.json()['platform']['members']['required_questions_location'], 'contribution') + + def test_create_initiatives(self): + settings = MemberPlatformSettings.load() + settings.create_initiatives = False + settings.save() + response = self.client.get(self.url, token=self.user_token) + self.assertEqual(response.json()['platform']['members']['create_initiatives'], False) + settings.create_initiatives = True + settings.save() + response = self.client.get(self.url, token=self.user_token) + self.assertEqual(response.json()['platform']['members']['create_initiatives'], True) From 1a5c33a380f7035a2f958a7cddb4c86c3590992b Mon Sep 17 00:00:00 2001 From: Loek van Gent Date: Wed, 17 Aug 2022 13:40:12 +0200 Subject: [PATCH 5/6] dd admin test too --- bluebottle/members/tests/test_admin.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bluebottle/members/tests/test_admin.py b/bluebottle/members/tests/test_admin.py index 358ce2a355..4241609733 100644 --- a/bluebottle/members/tests/test_admin.py +++ b/bluebottle/members/tests/test_admin.py @@ -325,6 +325,17 @@ def test_require_profile_fields(self): self.assertTrue(settings_platform.require_address) self.assertTrue(settings_platform.require_birthdate) + def test_create_initiatives(self): + LocationFactory.create_batch(3) + self.app.set_user(self.superuser) + page = self.app.get(reverse('admin:members_memberplatformsettings_change')) + form = page.forms[0] + form['create_initiatives'].checked = True + + form.submit() + settings_platform = MemberPlatformSettings.load() + self.assertTrue(settings_platform.create_initiatives) + class MemberAdminExportTest(BluebottleTestCase): """ From 99499dc1d10030771513b05c677c328b7d7011a0 Mon Sep 17 00:00:00 2001 From: Loek van Gent Date: Wed, 17 Aug 2022 14:49:02 +0200 Subject: [PATCH 6/6] Add has_initiatives to current user api --- bluebottle/members/serializers.py | 6 +++++- bluebottle/members/tests/test_api.py | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/bluebottle/members/serializers.py b/bluebottle/members/serializers.py index 5c3e8528d9..eadec905a5 100644 --- a/bluebottle/members/serializers.py +++ b/bluebottle/members/serializers.py @@ -226,6 +226,10 @@ class CurrentUserSerializer(BaseUserPreviewSerializer): segments = serializers.PrimaryKeyRelatedField( many=True, queryset=Segment.objects ) + has_initiatives = serializers.SerializerMethodField() + + def get_has_initiatives(self, obj): + return obj.own_initiatives.exists() class Meta(object): model = BB_USER_MODEL @@ -233,7 +237,7 @@ class Meta(object): 'id_for_ember', 'primary_language', 'email', 'full_name', 'phone_number', 'last_login', 'date_joined', 'location', 'verified', 'permissions', 'matching_options_set', - 'organization', 'segments', 'required' + 'organization', 'segments', 'required', 'has_initiatives' ) diff --git a/bluebottle/members/tests/test_api.py b/bluebottle/members/tests/test_api.py index a45ebf1c7a..43b5b6b430 100644 --- a/bluebottle/members/tests/test_api.py +++ b/bluebottle/members/tests/test_api.py @@ -17,6 +17,7 @@ from bluebottle.auth.middleware import authorization_logger from bluebottle.clients import properties +from bluebottle.initiatives.tests.factories import InitiativeFactory from bluebottle.members.models import MemberPlatformSettings, UserActivity, Member from bluebottle.offices.tests.factories import LocationFactory from bluebottle.segments.tests.factories import SegmentTypeFactory, SegmentFactory @@ -1079,6 +1080,17 @@ def test_get_current_user_with_unverified_required_location(self): response = self.client.get(self.current_user_url, token=self.user_token) self.assertEqual(response.json()['required'], []) + def test_get_current_user_with_initiatives(self): + InitiativeFactory.create( + owner=self.user + ) + response = self.client.get(self.current_user_url, token=self.user_token) + self.assertEqual(response.json()['has_initiatives'], True) + + def test_get_current_user_without_initiatives(self): + response = self.client.get(self.current_user_url, token=self.user_token) + self.assertEqual(response.json()['has_initiatives'], False) + class MemberSettingsAPITestCase(BluebottleTestCase):