Skip to content

Commit

Permalink
Merge branch 'master' into l10n_master2
Browse files Browse the repository at this point in the history
  • Loading branch information
eodolphi committed Aug 8, 2022
2 parents 0e8f9c8 + 223ebe6 commit d51de99
Show file tree
Hide file tree
Showing 11 changed files with 76 additions and 25 deletions.
12 changes: 11 additions & 1 deletion bluebottle/exports/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from bluebottle.initiatives.models import InitiativePlatformSettings
from bluebottle.segments.models import SegmentType

from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE


class ImpactMixin(object):

Expand All @@ -30,8 +32,16 @@ class DateRangeResource(ExportModelResource):
range_field = 'created'
select_related = None

def export_field(self, field, obj):
result = super().export_field(field, obj)

if type(result) == str:
result = ILLEGAL_CHARACTERS_RE.sub('', result)

return result

def get_queryset(self):
qs = super(DateRangeResource, self).get_queryset()
qs = super().get_queryset()
if self.select_related:
qs = qs.select_related(*self.select_related)
frm, to = self.kwargs.get('from_date'), self.kwargs.get('to_date')
Expand Down
4 changes: 3 additions & 1 deletion bluebottle/funding/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
from bluebottle.test.factory_models.accounts import BlueBottleUserFactory
from bluebottle.test.factory_models.geo import GeolocationFactory
from bluebottle.test.utils import BluebottleTestCase, JSONAPITestClient, APITestCase
from bluebottle.segments.tests.factories import SegmentTypeFactory


class BudgetLineListTestCase(BluebottleTestCase):
Expand Down Expand Up @@ -487,11 +488,12 @@ def test_get_owner_export_disabled(self):
self.assertIsNone(export_url)

def test_get_owner_export_enabled(self):
SegmentTypeFactory.create()
initiative_settings = InitiativePlatformSettings.load()
initiative_settings.enable_participant_exports = True
initiative_settings.save()
DonorFactory.create(activity=self.funding, amount=Money(20, 'EUR'), status='new')
DonorFactory.create(activity=self.funding, amount=Money(35, 'EUR'), status='succeeded')
DonorFactory.create(activity=self.funding, user=None, amount=Money(35, 'EUR'), status='succeeded')
response = self.client.get(self.funding_url, user=self.funding.owner)
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()['data']
Expand Down
13 changes: 7 additions & 6 deletions bluebottle/funding/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,12 +316,13 @@ def get(self, request, *args, **kwargs):
):
row = [prep_field(request, donor, field[0]) for field in self.fields]
for segment_type in self.get_segment_types():
segments = ", ".join(
donor.user.segments.filter(
segment_type=segment_type
).values_list('name', flat=True)
)
row.append(segments)
if donor.user:
segments = ", ".join(
donor.user.segments.filter(
segment_type=segment_type
).values_list('name', flat=True)
)
row.append(segments)
sheet.append(row)

return generate_xlsx_response(filename=filename, data=sheet)
12 changes: 7 additions & 5 deletions bluebottle/segments/serializers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from builtins import object

from rest_framework import serializers
from rest_framework_json_api.relations import HyperlinkedRelatedField

from bluebottle.activities.models import Activity
from bluebottle.activities.utils import get_stats_for_activities
Expand All @@ -12,10 +13,12 @@

class SegmentTypeSerializer(serializers.ModelSerializer):
name = serializers.CharField(required=False)

included_serializers = {
'segments': 'bluebottle.segments.serializers.SegmentListSerializer',
}
segments = HyperlinkedRelatedField(
many=True,
read_only=True,
related_link_view_name='related-segment-detail',
related_link_url_kwarg='segment_type',
)

class Meta(object):
model = SegmentType
Expand All @@ -25,7 +28,6 @@ class Meta(object):
)

class JSONAPIMeta(object):
included_resources = ['segments', ]
resource_name = 'segment-types'


Expand Down
8 changes: 5 additions & 3 deletions bluebottle/segments/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,11 @@ def test_list(self):
segment_type = SegmentType.objects.get(pk=result['id'])

self.assertEqual(segment_type.name, result['attributes']['name'])
self.assertEqual(
set(relation['id'] for relation in result['relationships']['segments']['data']),
set(str(segment.pk) for segment in segment_type.segments.all())

self.assertTrue(
result['relationships']['segments']['links']['related'].endswith(
reverse('related-segment-detail', args=(segment_type.pk, ))
)
)

def test_list_anonymous(self):
Expand Down
8 changes: 7 additions & 1 deletion bluebottle/segments/urls/api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.conf.urls import url

from bluebottle.segments.views import (
SegmentList, SegmentDetail, SegmentPublicDetail, SegmentTypeList
SegmentList, SegmentDetail, RelatedSegmentDetail, SegmentPublicDetail, SegmentTypeList
)


Expand All @@ -17,6 +17,12 @@
name='segment-list'
),

url(
r'^types/(?P<segment_type>\d+)/segments$',
RelatedSegmentDetail.as_view(),
name='related-segment-detail'
),

url(
r'^(?P<pk>\d+)$',
SegmentDetail.as_view(),
Expand Down
15 changes: 15 additions & 0 deletions bluebottle/segments/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,21 @@ class SegmentDetail(JsonApiViewMixin, RetrieveAPIView):
]


class RelatedSegmentDetail(JsonApiViewMixin, ListAPIView):
serializer_class = SegmentDetailSerializer
queryset = Segment.objects.filter(segment_type__is_active=True).select_related('segment_type')

permission_classes = [
OpenSegmentOrMember,
TenantConditionalOpenClose,
]

def get_queryset(self):
queryset = super().get_queryset()

return queryset.filter(segment_type_id=self.kwargs['segment_type'])


class SegmentPublicDetail(JsonApiViewMixin, RetrieveAPIView):
serializer_class = SegmentPublicDetailSerializer
queryset = Segment.objects.filter(segment_type__is_active=True).select_related('segment_type')
Expand Down
14 changes: 8 additions & 6 deletions bluebottle/time_based/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import dateutil
from django.db.models.functions import Trunc
from django.urls import reverse
from django.utils.timezone import now, get_current_timezone
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
Expand Down Expand Up @@ -397,13 +396,16 @@ class JSONAPIMeta(TimeBasedBaseSerializer.JSONAPIMeta):

class ParticipantsField(HyperlinkedRelatedField):
def __init__(self, many=True, read_only=True, *args, **kwargs):
super().__init__(Team, many=many, read_only=read_only, *args, **kwargs)
super().__init__(
many=many,
read_only=read_only,
related_link_view_name='period-participants',
related_link_url_kwarg='activity_id',
)

def get_url(self, name, view_name, kwargs, request):

if self.parent.instance.team_activity != 'teams':
url = reverse(self.related_link_view_name)
return f"{url}?activity_id={kwargs['pk']}"
return super().get_url(name, view_name, kwargs, request)


class PeriodActivitySerializer(TimeBasedBaseSerializer):
Expand All @@ -415,7 +417,7 @@ class PeriodActivitySerializer(TimeBasedBaseSerializer):
source='get_my_contributor'
)

contributors = ParticipantsField(related_link_view_name='period-participant-list')
contributors = ParticipantsField()

participants_export_url = PrivateFileSerializer(
'period-participant-export',
Expand Down
1 change: 0 additions & 1 deletion bluebottle/time_based/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,6 @@ def test_get_contributors(self):
self.response_data['meta']['contributor-count'],
4
)

response = self.client.get(
self.response_data['relationships']['contributors']['links']['related'],
user=self.activity.owner
Expand Down
13 changes: 12 additions & 1 deletion bluebottle/time_based/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,16 @@ def setUp(self):
)
self.slot = DateActivitySlotFactory.create(
activity=self.activity,
start=datetime.datetime(2022, 5, 15, tzinfo=UTC)
start=datetime.datetime(2022, 5, 15, tzinfo=UTC),
status='cancelled'
)

def _get_slot_dates(self):
return [str(s.start.date()) for s in self.activity.slots.all()]

def _get_slot_statuses(self):
return [s.status for s in self.activity.slots.all()]

def test_duplicate_every_day(self):
end = datetime.datetime(2022, 5, 20, tzinfo=UTC).date()
duplicate_slot(self.slot, 'day', end)
Expand All @@ -32,6 +36,13 @@ def test_duplicate_every_day(self):
'2022-05-18', '2022-05-19', '2022-05-20',
]
)
self.assertEqual(
self._get_slot_statuses(),
[
'cancelled', 'finished', 'finished',
'finished', 'finished', 'finished'
]
)

def test_duplicate_every_week(self):
end = datetime.datetime(2022, 7, 1, tzinfo=UTC).date()
Expand Down
1 change: 1 addition & 0 deletions bluebottle/time_based/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ def duplicate_slot(slot, interval, end):
for date in dates:
slot.id = None
slot.start = slot.start.replace(day=date.day, month=date.month, year=date.year)
slot.status = 'open'
slot.save()

0 comments on commit d51de99

Please sign in to comment.