Skip to content

Commit

Permalink
Merge branch 'master' into ticket/BB-19447-filter-initiatives-closed-…
Browse files Browse the repository at this point in the history
…segments
  • Loading branch information
gannetson committed Sep 6, 2022
2 parents c802cc9 + fb28404 commit be57e61
Show file tree
Hide file tree
Showing 265 changed files with 25,309 additions and 12,242 deletions.
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ before_install:
install:
- pip install pip==20.2.1
- pip install setuptools
- pip install wheel==0.29.0 mercurial==5.7.1
- pip install wheel==0.29.0
- pip install --upgrade -I flake8==3.9.2
- pip install -e .[test] --trusted-host github.com
before_script:
Expand All @@ -47,4 +47,4 @@ notifications:
secure: TOveMBh9HePYKWuGTrWF+hTXzxGZvbVsa3KU0sB1yv6qkcixb5/ggvmkTeRddYEd/zyWyMenicFsrXVBgsP0SmbNgke6kq5+EN0U5oJWse998lvCVCpwmJQMdwDHvYsOtbFEOppQrbRK4vmH8qibx3x2YVg+u+61ePHvWYF9z6U=
after_success:
- bash post_travis.sh
- python -m coverage combine; python -m coverage report --omit **/migrations/**; coveralls
- python -m coverage combine; python -m coverage report --omit "**/migrations/**"; coveralls
205 changes: 132 additions & 73 deletions bluebottle/activities/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from pytz import timezone

from django import forms
from django.conf.urls import url
from django.contrib import admin
Expand All @@ -14,7 +16,9 @@

from bluebottle.activities.forms import ImpactReminderConfirmationForm
from bluebottle.activities.messages import ImpactReminderMessage
from bluebottle.activities.models import Activity, Contributor, Organizer, Contribution, EffortContribution
from bluebottle.activities.models import (
Activity, Contributor, Organizer, Contribution, EffortContribution, Team
)
from bluebottle.bluebottle_dashboard.decorators import confirmation_form
from bluebottle.collect.models import CollectContributor, CollectActivity
from bluebottle.deeds.models import Deed, DeedParticipant
Expand Down Expand Up @@ -71,43 +75,13 @@ def contributor_link(self, obj):
contributor_link.short_description = _('Edit contributor')


class ContributionAdminInline(StackedPolymorphicInline):
model = Contribution
readonly_fields = ['created']
fields = readonly_fields
extra = 0
can_delete = False
ordering = ['-created']

class EffortContributionInline(ContributionInlineChild):
readonly_fields = ['contributor_link', 'status', 'start']
fields = readonly_fields
model = EffortContribution

class TimeContributionInline(ContributionInlineChild):
readonly_fields = ['contributor_link', 'status', 'start', 'end', 'value']
fields = readonly_fields
model = TimeContribution

class MoneyContributionInline(ContributionInlineChild):
readonly_fields = ['contributor_link', 'status', 'value']
fields = readonly_fields
model = MoneyContribution

child_inlines = (
EffortContributionInline,
TimeContributionInline,
MoneyContributionInline
)


class ContributorChildAdmin(PolymorphicInlineSupportMixin, PolymorphicChildModelAdmin, StateMachineAdmin):
base_model = Contributor
search_fields = ['user__first_name', 'user__last_name', 'activity__title']
list_filter = [StateMachineFilter, ]
ordering = ('-created',)
show_in_index = True
raw_id_fields = ('user', 'activity')
raw_id_fields = ('user', 'activity', 'team')

date_hierarchy = 'contributor_date'

Expand All @@ -120,6 +94,8 @@ class ContributorChildAdmin(PolymorphicInlineSupportMixin, PolymorphicChildModel
superadmin_fields = ['force_status']

def get_fieldsets(self, request, obj=None):
if InitiativePlatformSettings.team_activities and 'team' not in self.fields:
self.fields += ('team',)
fieldsets = (
(_('Details'), {'fields': self.fields}),
)
Expand Down Expand Up @@ -252,21 +228,50 @@ def __init__(self, *args, **kwargs):
self.initial[segment_type.field_name] = self.instance.segments.filter(
segment_type=segment_type).all()

def save(self, commit=True):
activity = super(ActivityForm, self).save(commit=commit)
segments = []
for segment_type in SegmentType.objects.all():
segments += self.cleaned_data.get(segment_type.field_name, [])
if segments:
activity.segments.set(segments)
del self.cleaned_data['segments']
return activity

class TeamInline(admin.TabularInline):
model = Team
raw_id_fields = ('owner',)
readonly_fields = ('team_link', 'slot_link', 'created', 'status')
fields = readonly_fields + ('owner',)

extra = 0
ordering = ['slot__start']

def team_link(self, obj):
return format_html(
'<a href="{}">{}</a>',
reverse('admin:activities_team_change', args=(obj.id,)),
obj
)
team_link.short_description = _('Edit')

def slot_link(self, obj):
if getattr(obj, 'slot', None):
if obj.slot.location:
return format_html(
'<a href="{}#/tab/inline_1/">{}</a>',
reverse('admin:activities_team_change', args=(obj.id,)),
obj.slot.start.astimezone(timezone(obj.slot.location.timezone)).strftime('%c')
)
else:
return format_html(
'<a href="{}#/tab/inline_1/">{}</a>',
reverse('admin:activities_team_change', args=(obj.id,)),
obj.slot.start.strftime('%c')
)
return format_html(
'<a href="{}#/tab/inline_1/">{}</a>',
reverse('admin:activities_team_change', args=(obj.id,)),
_('Add time slot')
)
slot_link.short_description = _('Time slot')


class ActivityChildAdmin(PolymorphicChildModelAdmin, StateMachineAdmin):
base_model = Activity
raw_id_fields = ['owner', 'initiative']
inlines = (FollowAdminInline, WallpostInline,)
inlines = (FollowAdminInline, WallpostInline, )
form = ActivityForm

def lookup_allowed(self, key, value):
Expand All @@ -284,6 +289,15 @@ def save_model(self, request, obj, form, change):

super().save_model(request, obj, form, change)

segments = []
for segment_type in SegmentType.objects.all():
segments += form.cleaned_data.get(segment_type.field_name, [])

if segments:
del form.cleaned_data['segments']
obj.segments.set(segments)
obj.save()

show_in_index = True
date_hierarchy = 'created'

Expand All @@ -303,7 +317,7 @@ def save_model(self, request, obj, form, change):
detail_fields = (
'title',
'initiative',
'owner',
'owner'
)

description_fields = (
Expand Down Expand Up @@ -332,17 +346,30 @@ def get_inline_instances(self, request, obj=None):
):
inlines.append(impact_goal_inline)

if obj and (
obj.team_activity != Activity.TeamActivityChoices.teams or
obj._initial_values['team_activity'] != Activity.TeamActivityChoices.teams
):
inlines = [
inline for inline in inlines if not isinstance(inline, TeamInline)
]

return inlines

def get_list_filter(self, request):
filters = list(self.list_filter)
settings = InitiativePlatformSettings.objects.get()
from bluebottle.geo.models import Location
if Location.objects.count():
filters = filters + ['initiative__location']
if InitiativePlatformSettings.objects.get().enable_office_regions:
if settings.enable_office_regions:
filters = filters + [
'initiative__location__subregion',
'initiative__location__subregion__region']

if settings.team_activities:
filters = filters + ['team_activity']

return filters

def get_list_display(self, request):
Expand Down Expand Up @@ -514,32 +541,6 @@ def get_form(self, request, obj=None, **kwargs):
return super(ActivityChildAdmin, self).get_form(request, obj, **kwargs)


class ContributorInline(admin.TabularInline):
raw_id_fields = ('user',)
readonly_fields = ('contributor_date', 'created', 'edit', 'state_name',)
fields = ('edit', 'user', 'created', 'state_name',)

extra = 0

def state_name(self, obj):
if obj.states.current_state:
return obj.states.current_state.name

state_name.short_description = _('status')

def edit(self, obj):
url = reverse(
'admin:{}_{}_change'.format(
obj._meta.app_label,
obj._meta.model_name,
),
args=(obj.id,)
)
return format_html('<a href="{}">{}</a>', url, obj.id)

edit.short_description = _('edit')


@admin.register(Activity)
class ActivityAdmin(PolymorphicParentModelAdmin, StateMachineAdmin):
base_model = Activity
Expand All @@ -552,10 +553,11 @@ class ActivityAdmin(PolymorphicParentModelAdmin, StateMachineAdmin):
)
date_hierarchy = 'transition_date'
readonly_fields = ['link', 'review_status', 'location_link']
list_filter = [PolymorphicChildModelFilter, StateMachineFilter, 'highlight']
list_filter = [PolymorphicChildModelFilter, StateMachineFilter, 'highlight', ]

def lookup_allowed(self, key, value):
if key in [
'goals__type__id__exact',
'initiative__location__id__exact',
'initiative__location__subregion__id__exact',
'initiative__location__subregion__region__id__exact',
Expand All @@ -564,14 +566,21 @@ def lookup_allowed(self, key, value):
return super(ActivityAdmin, self).lookup_allowed(key, value)

def get_list_filter(self, request):
settings = InitiativePlatformSettings.objects.get()
filters = list(self.list_filter)

from bluebottle.geo.models import Location
if Location.objects.count():
filters = filters + ['initiative__location']
if InitiativePlatformSettings.objects.get().enable_office_regions:
if settings.enable_office_regions:
filters = filters + [
'initiative__location__subregion',
'initiative__location__subregion__region']
'initiative__location__subregion__region'
]

if settings.team_activities:
filters = filters + ['team_activity']

return filters

list_editable = ('highlight',)
Expand Down Expand Up @@ -604,6 +613,8 @@ def link(self, obj):
ordering = ('-created',)

def type(self, obj):
if obj.team_activity == 'teams':
return _('Team activity')
return obj.get_real_instance_class()._meta.verbose_name


Expand Down Expand Up @@ -684,3 +695,51 @@ class PaginationFormSet(PaginationFormSetBase, formset_class):
PaginationFormSet.request = request
PaginationFormSet.per_page = self.per_page
return PaginationFormSet


@admin.register(Team)
class TeamAdmin(StateMachineAdmin):
raw_id_fields = ['owner', 'activity']
readonly_fields = ['created', 'activity_link', 'invite_link']
fields = ['activity', 'invite_link', 'created', 'owner', 'status', 'states']
superadmin_fields = ['force_status']
list_display = ['__str__', 'activity_link', 'status']

def get_inline_instances(self, request, obj=None):
self.inlines = []
if isinstance(obj.activity, PeriodActivity):
from bluebottle.time_based.admin import PeriodParticipantAdminInline, TeamSlotInline
self.inlines = [
PeriodParticipantAdminInline,
TeamSlotInline
]
return super(TeamAdmin, self).get_inline_instances(request, obj)

def get_fieldsets(self, request, obj=None):
fieldsets = (
(_('Details'), {'fields': self.fields}),
)
if request.user.is_superuser:
fieldsets += (
(_('Super admin'), {'fields': self.superadmin_fields}),
)
return fieldsets

def activity_link(self, obj):
url = reverse("admin:{}_{}_change".format(
obj.activity._meta.app_label,
obj.activity._meta.model_name),
args=(obj.activity.id,)
)
return format_html(u"<a href='{}'>{}</a>", url, obj.activity.title or '-empty-')

activity_link.short_description = _('Activity')

def invite_link(self, obj):
url = obj.activity.get_absolute_url()
contributor = obj.members.filter(user=obj.owner).first()

if contributor.invite:
return f'{url}?inviteId={contributor.invite.pk}'

invite_link.short_description = _('Shareable link')
41 changes: 26 additions & 15 deletions bluebottle/activities/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,18 +75,11 @@ class ActivityDocument(Document):
}
)

is_online = fields.BooleanField('is_online')
is_online = fields.BooleanField()
team_activity = fields.KeywordField()

location = fields.NestedField(
attr='location',
properties={
'id': fields.LongField(),
'formatted_address': fields.TextField(),
}
)

initiative_location = fields.NestedField(
attr='fallback_location',
properties={
'id': fields.LongField(),
'name': fields.TextField(),
Expand Down Expand Up @@ -142,17 +135,35 @@ def prepare_type(self, instance):
return str(instance.__class__.__name__.lower())

def prepare_country(self, instance):
country_ids = []
if instance.initiative.location:
return instance.initiative.location.country_id
country_ids.append(instance.initiative.location.country_id)
if hasattr(instance, 'office_location') and instance.office_location:
country_ids.append(instance.office_location.country_id)
if instance.initiative.place:
return instance.initiative.place.country_id
country_ids.append(instance.initiative.place.country_id)
return country_ids

def prepare_location(self, instance):
locations = []
if hasattr(instance, 'location') and instance.location:
return {
'id': instance.location.pk,
'formatted_address': instance.location.formatted_address
}
locations.append({
'name': instance.location.formatted_address,
'city': instance.location.locality
})
if hasattr(instance, 'office_location') and instance.office_location:
locations.append({
'id': instance.office_location.pk,
'name': instance.office_location.name,
'city': instance.office_location.city,
})
elif instance.initiative.location:
locations.append({
'id': instance.initiative.location.pk,
'name': instance.initiative.location.name,
'city': instance.initiative.location.city,
})
return locations

def prepare_expertise(self, instance):
if hasattr(instance, 'expertise') and instance.expertise:
Expand Down
Loading

0 comments on commit be57e61

Please sign in to comment.