Skip to content

Commit

Permalink
Merge branch 'master' into demo/search-and-office
Browse files Browse the repository at this point in the history
  • Loading branch information
gannetson committed Sep 28, 2022
2 parents e59b896 + dd848ca commit 257b464
Show file tree
Hide file tree
Showing 22 changed files with 211 additions and 63 deletions.
2 changes: 0 additions & 2 deletions bluebottle/activities/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -588,8 +588,6 @@ def get_list_filter(self, request):

return filters

list_editable = ('highlight',)

list_display = ['__str__', 'created', 'type', 'state_name',
'link', 'highlight']

Expand Down
8 changes: 6 additions & 2 deletions bluebottle/activities/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,19 @@ def get_matching_properties(self, obj):
self.context['themes'] = [theme.pk for theme in user.favourite_themes.all()]

if 'location' not in self.context:
self.context['location'] = user.location or user.place
if user.location and user.location.position:
self.context['location'] = user.location

if user.place and user.place.position:
self.context['location'] = user.place

matching = {'location': False}
matching['skill'] = obj.expertise[0].id in self.context['skills'] if obj.expertise else False
matching['theme'] = obj.theme[0].id in self.context['themes'] if obj.theme else False

if obj.is_online:
matching['location'] = True
elif self.context['location'] and obj.position:
elif 'location' in self.context and obj.position:
positions = [obj.position] if 'lat' in obj.position else obj.position

dist = min(
Expand Down
4 changes: 4 additions & 0 deletions bluebottle/activities/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,10 @@ def get_queryset(self):
status__in=('accepted', 'succeeded',)
)

status = self.request.query_params.get('filter[status]')
if status:
queryset = queryset.filter(status=status)

return queryset.filter(
activity_id=self.kwargs['activity_id']
)
1 change: 0 additions & 1 deletion bluebottle/cms/content_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ class HomepageStatisticsBlockPlugin(CMSContentPlugin):
@plugin_pool.register
class ActivitiesBlockPlugin(CMSContentPlugin):
model = ActivitiesContent
raw_id_fields = ('activities', )
category = _('Activities')


Expand Down
21 changes: 21 additions & 0 deletions bluebottle/cms/migrations/0072_auto_20220922_1104.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 2.2.24 on 2022-09-22 09:04

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('cms', '0071_merge_20220906_0730'),
]

operations = [
migrations.RemoveField(
model_name='activitiescontent',
name='activities',
),
migrations.RemoveField(
model_name='activitiescontent',
name='highlighted',
),
]
6 changes: 0 additions & 6 deletions bluebottle/cms/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from parler.models import TranslatableModel, TranslatedFields
from solo.models import SingletonModel

from bluebottle.activities.models import Activity
from bluebottle.categories.models import Category
from bluebottle.geo.models import Location
from bluebottle.utils.fields import ImageField
Expand Down Expand Up @@ -253,11 +252,6 @@ class ActivitiesContent(TitledContent):
action_link = models.CharField(max_length=100, default="/initiatives/activities/list",
blank=True, null=True)

activities = models.ManyToManyField(
Activity, blank=True, db_table='cms_activitycontent_activities'
)
highlighted = models.BooleanField(default=False)

preview_template = 'admin/cms/preview/activities.html'

class Meta:
Expand Down
9 changes: 3 additions & 6 deletions bluebottle/cms/templates/admin/cms/preview/activities.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
<ul>
{% for activity in instance.activities.all %}
<li>{{ activity.title }}</li>
{% endfor %}
</ul>
{% load i18n%}

{{ instance.action }}
{% trans "Toggle 'highlight' on activities to show them in this block." %}
{{ instance.action }}
7 changes: 3 additions & 4 deletions bluebottle/cms/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,8 @@ def test_results_quotes(self):
self.assertEqual(quotes['quotes'][0]['quote'], self.quote.quote)

def test_results_activities(self):
activity = DateActivityFactory.create(status='open')
block = ActivitiesContent.objects.create_for_placeholder(self.placeholder)
block.activities.add(activity)
DateActivityFactory.create(status='open', highlight=True)
ActivitiesContent.objects.create_for_placeholder(self.placeholder)

response = self.client.get(self.url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
Expand Down Expand Up @@ -290,7 +289,7 @@ def test_homepage(self):

def test_activities_from_homepage(self):
DateActivityFactory.create_batch(10, status='open', highlight=True)
ActivitiesContent.objects.create_for_placeholder(self.placeholder, highlighted=True)
ActivitiesContent.objects.create_for_placeholder(self.placeholder)
response = self.client.get(self.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['blocks'][0]['type'], 'activities')
Expand Down
24 changes: 22 additions & 2 deletions bluebottle/files/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,32 @@ def formfield(self, **kwargs):
return super(DocumentField, self).formfield(**defaults)


class PrivateDocumentModelChoiceField(ModelChoiceField):
def __init__(self, related_field=None, view_name=None, *args, **kwargs):
self.related_field = related_field
self.view_name = view_name
super().__init__(*args, **kwargs)

def widget_attrs(self, widget):
attrs = super().widget_attrs(widget)

attrs['related_field'] = self.related_field
attrs['view_name'] = self.view_name

return attrs


class PrivateDocumentField(ForeignKey):

def __init__(self, to=None, on_delete=models.CASCADE, related_name=None, related_query_name=None,
limit_choices_to=None, parent_link=False, to_field=None,
db_constraint=True, **kwargs):
db_constraint=True, view_name=None, **kwargs):
if not to:
from bluebottle.files.models import PrivateDocument
to = PrivateDocument

self.view_name = view_name

super(PrivateDocumentField, self).__init__(
to, on_delete, related_name, related_query_name,
limit_choices_to, parent_link, to_field,
Expand All @@ -78,7 +96,9 @@ def formfield(self, **kwargs):
queryset = self.remote_field.model._default_manager.using(db)
defaults = {
'widget': PrivateDocumentWidget,
'form_class': ModelChoiceField,
'related_field': self.related_query_name(),
'view_name': self.view_name,
'form_class': PrivateDocumentModelChoiceField,
'queryset': queryset,
'to_field_name': self.remote_field.field_name,
}
Expand Down
17 changes: 4 additions & 13 deletions bluebottle/files/templates/widgets/document.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,4 @@
<!-- We need this to show the select icons properly -->
<select name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>
{% for group_name, group_choices, group_index in widget.optgroups %}
{% for option in group_choices %}
{% if option.selected %}
{% include option.template_name with widget=option %}
{{ option }}
{{ option.value }}
{% endif %}
{% endfor %}
{% endfor %}
</select>
<br>
{% load i18n %}
{% if download_link %}
<a href="{{download_link}}" class="private-document-link"/>{% trans "Download" %}</a>
{% endif %}
10 changes: 8 additions & 2 deletions bluebottle/files/widgets.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.forms import Select
from bluebottle.utils.utils import reverse_signed


class ImageWidget(Select):
Expand Down Expand Up @@ -32,9 +33,14 @@ class PrivateDocumentWidget(Select):

def get_context(self, name, value, attrs):
context = super(PrivateDocumentWidget, self).get_context(name, value, attrs)

if value:
from bluebottle.files.models import PrivateDocument
context['file'] = PrivateDocument.objects.get(pk=value).file
document = PrivateDocument.objects.get(pk=value)
context['download_link'] = reverse_signed(
self.attrs['view_name'],
args=(getattr(document, f"{self.attrs['related_field']}_set").first().pk, )
)
else:
context['file'] = None
context['download_link'] = None
return context
4 changes: 3 additions & 1 deletion bluebottle/funding/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,9 @@ def __str__(self):


class PlainPayoutAccount(PayoutAccount):
document = PrivateDocumentField(blank=True, null=True, on_delete=models.deletion.SET_NULL)
document = PrivateDocumentField(
blank=True, null=True, on_delete=models.deletion.SET_NULL, view_name='kyc-document'
)

ip_address = models.GenericIPAddressField(_('IP address'), blank=True, null=True, default=None)

Expand Down
2 changes: 1 addition & 1 deletion bluebottle/initiatives/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ def __init__(self, many=True, read_only=True, *args, **kwargs):
super().__init__(Activity, many=many, read_only=read_only, *args, **kwargs)

def get_url(self, name, view_name, kwargs, request):
return f"{self.reverse('activity-preview-list')}?filter[initiative.id]={kwargs['pk']}"
return f"{self.reverse('activity-preview-list')}?filter[initiative.id]={kwargs['pk']}&page[size]=100"


class InitiativeSerializer(NoCommitMixin, ModelSerializer):
Expand Down
4 changes: 4 additions & 0 deletions bluebottle/initiatives/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,10 @@ def test_get_owner(self):
self.assertTrue(
'/data/attributes/title' in (error['source']['pointer'] for error in data['meta']['required'])
)
self.assertEqual(
data['relationships']['activities']['links']['related'],
f'/api/activities/search?filter[initiative.id]={self.initiative.id}&page[size]=100'
)

def test_get_image_used_twice(self):
InitiativeFactory.create(image=self.initiative.image)
Expand Down
15 changes: 5 additions & 10 deletions bluebottle/segments/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,11 @@ def get_initiatives_count(self, obj):
return len(Initiative.objects.filter(status='approved', activities__segments=obj).distinct())

def get_activities_count(self, obj):
return len(
Activity.objects.filter(
segments=obj
).exclude(
status__in=(
'draft', 'needs_work', 'submitted', 'deleted',
'closed', 'cancelled', 'rejected'
)
)
)
total = Activity.objects.filter(
segments=obj,
status__in=['open', 'full']
).count()
return total

def get_stats(self, obj):
return get_stats_for_activities(obj.activities.all())
Expand Down
18 changes: 9 additions & 9 deletions bluebottle/segments/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,8 @@ def test_get_stats(self):

funding = FundingFactory.create(
initiative=initiative,
deadline=now() - datetime.timedelta(weeks=1),
status='succeeded'
deadline=now() + datetime.timedelta(weeks=1),
status='open'
)
funding.segments.set([self.model])
for donor in DonorFactory.create_batch(3, activity=funding, user=None, amount=Money(10, 'USD')):
Expand All @@ -249,9 +249,9 @@ def test_get_stats(self):

deed_activity = DeedFactory.create(
initiative=initiative,
status='succeeded',
status='open',
start=datetime.date.today() - datetime.timedelta(days=10),
end=datetime.date.today() - datetime.timedelta(days=5)
end=datetime.date.today() + datetime.timedelta(days=5)
)
deed_activity.segments.set([self.model])

Expand All @@ -262,8 +262,8 @@ def test_get_stats(self):

collect_activity = CollectActivityFactory.create(
initiative=initiative,
status='succeeded',
start=datetime.date.today() - datetime.timedelta(weeks=2),
status='open',
start=datetime.date.today() + datetime.timedelta(weeks=2),
)
collect_activity.segments.set([self.model])
collect_activity.realized = 100
Expand All @@ -272,9 +272,9 @@ def test_get_stats(self):

unrelated_activity = PeriodActivityFactory.create(
initiative=initiative,
status='succeeded',
status='open',
start=datetime.date.today() - datetime.timedelta(weeks=2),
deadline=datetime.date.today() - datetime.timedelta(weeks=1),
deadline=datetime.date.today() + datetime.timedelta(weeks=1),
registration_deadline=datetime.date.today() - datetime.timedelta(weeks=3)
)
PeriodParticipantFactory.create_batch(3, activity=unrelated_activity)
Expand All @@ -285,7 +285,7 @@ def test_get_stats(self):

self.assertEqual(response.status_code, status.HTTP_200_OK)

self.assertEqual(response.json()['data']['meta']['activities-count'], 5)
self.assertEqual(response.json()['data']['meta']['activities-count'], 4)
self.assertEqual(response.json()['data']['meta']['initiatives-count'], 1)

stats = response.json()['data']['meta']['stats']
Expand Down
1 change: 1 addition & 0 deletions bluebottle/time_based/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -805,6 +805,7 @@ class PeriodParticipantAdmin(ContributorChildAdmin):
inlines = ContributorChildAdmin.inlines + [TimeContributionInlineAdmin]
readonly_fields = ContributorChildAdmin.readonly_fields + ['total']
fields = ContributorChildAdmin.fields + ['total', 'motivation', 'current_period', 'document']
raw_id_fields = ContributorChildAdmin.raw_id_fields + ('document', )
list_display = ['__str__', 'activity_link', 'status']

def total(self, obj):
Expand Down
4 changes: 2 additions & 2 deletions bluebottle/time_based/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@ class Meta:

class DateParticipant(Participant):
motivation = models.TextField(blank=True, null=True)
document = PrivateDocumentField(blank=True, null=True)
document = PrivateDocumentField(blank=True, null=True, view_name='date-participant-document')

class Meta():
verbose_name = _("Participant on a date")
Expand All @@ -606,7 +606,7 @@ class JSONAPIMeta:

class PeriodParticipant(Participant, Contributor):
motivation = models.TextField(blank=True, null=True)
document = PrivateDocumentField(blank=True, null=True)
document = PrivateDocumentField(blank=True, null=True, view_name='period-participant-document')

current_period = models.DateField(null=True, blank=True)

Expand Down
Loading

0 comments on commit 257b464

Please sign in to comment.