Skip to content

Commit

Permalink
Merge pull request #5209 from onepercentclub/master
Browse files Browse the repository at this point in the history
master in release
  • Loading branch information
gannetson committed Aug 18, 2022
2 parents eb3dc9b + f08cc89 commit 1eeec5c
Show file tree
Hide file tree
Showing 66 changed files with 2,727 additions and 1,388 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
36 changes: 31 additions & 5 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 Down Expand Up @@ -230,20 +232,41 @@ def __init__(self, *args, **kwargs):
class TeamInline(admin.TabularInline):
model = Team
raw_id_fields = ('owner',)
readonly_fields = ('team_link', 'created', 'status')
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
Expand Down Expand Up @@ -589,6 +612,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 @@ -675,16 +700,17 @@ class PaginationFormSet(PaginationFormSetBase, formset_class):
class TeamAdmin(StateMachineAdmin):
raw_id_fields = ['owner', 'activity']
readonly_fields = ['created', 'activity_link', 'invite_link']
fields = ['activity', 'invite_link', 'created', 'owner', 'states']
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
from bluebottle.time_based.admin import PeriodParticipantAdminInline, TeamSlotInline
self.inlines = [
PeriodParticipantAdminInline
PeriodParticipantAdminInline,
TeamSlotInline
]
return super(TeamAdmin, self).get_inline_instances(request, obj)

Expand Down
12 changes: 6 additions & 6 deletions bluebottle/activities/effects.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,15 @@ def is_valid(self):
self.instance.activity.team_activity == Activity.TeamActivityChoices.teams
)

def post_save(self, **kwargs):
def pre_save(self, **kwargs):
if self.instance.accepted_invite:
self.instance.team = self.instance.accepted_invite.contributor.team
self.instance.save()

def post_save(self, **kwargs):
if not self.instance.team:
self.instance.team = Team.objects.create(
owner=self.instance.user,
activity=self.instance.activity
activity=self.instance.activity,
)
self.instance.save()

Expand Down Expand Up @@ -128,19 +128,19 @@ def is_valid(self):
)

def pre_save(self, effects):
self.transitioned_conributions = []
self.transitioned_contributions = []
for contribution in self.contributions:
effect = TransitionEffect(self.transition)(contribution)

if effect.is_valid:
self.transitioned_conributions.append(contribution)
self.transitioned_contributions.append(contribution)
effect.pre_save(effects=effects)
effects.append(effect)

contribution.execute_triggers(effects=effects)

def post_save(self):
for contribution in self.transitioned_conributions:
for contribution in self.transitioned_contributions:
try:
contribution.contributor.refresh_from_db()
contribution.save()
Expand Down
31 changes: 22 additions & 9 deletions bluebottle/activities/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,8 @@ class TeamNotification(ActivityNotification):
context = {
'title': 'activity.title',
'team_captain_email': 'owner.email',
'team_name': 'name'
'team_name': 'name',
'team_captain_name': 'owner.full_name'
}

@property
Expand All @@ -286,7 +287,7 @@ def action_link(self):
action_title = pgettext('email', 'View activity')

def get_recipients(self):
"""acitvity mananager"""
"""activity manager"""
return [self.obj.activity.owner]


Expand All @@ -300,13 +301,19 @@ class TeamAppliedMessage(TeamNotification):
template = 'messages/team_applied'


class TeamAcceptedMessage(TeamNotification):
class TeamCaptainAcceptedMessage(TeamNotification):
subject = pgettext('email', 'Your team has been accepted for "{title}"')
template = 'messages/team_accepted'
template = 'messages/team_captain_accepted'

context = {
'title': 'activity.title',
'team_captain_email': 'team.owner.email',
'team_name': 'team.name'
}

def get_recipients(self):
"""team captain"""
return [self.obj.owner]
return [self.obj.user]


class TeamCancelledMessage(TeamNotification):
Expand All @@ -321,12 +328,18 @@ def get_recipients(self):


class TeamCancelledTeamCaptainMessage(TeamNotification):
subject = pgettext('email', "Your team has been rejected for '{title}'")
subject = pgettext('email', 'Your team has been rejected for "{title}"')
template = 'messages/team_cancelled_team_captain'

context = {
'title': 'activity.title',
'team_captain_email': 'team.owner.email',
'team_name': 'team.name'
}

def get_recipients(self):
"""team captain"""
return [self.obj.owner]
return [self.obj.user]


class TeamWithdrawnMessage(TeamNotification):
Expand Down Expand Up @@ -369,7 +382,7 @@ def get_recipients(self):


class TeamMemberAddedMessage(ActivityNotification):
subject = pgettext('email', "New team member")
subject = pgettext('email', 'Someone has joined your team for "{title}"')
template = 'messages/team_member_added'

context = {
Expand All @@ -391,7 +404,7 @@ def get_recipients(self):


class TeamMemberWithdrewMessage(ActivityNotification):
subject = pgettext('email', "Withdrawal for '{title}'")
subject = pgettext('email', 'A participant has withdrawn from your team for "{title}"')
template = 'messages/team_member_withdrew'

context = {
Expand Down
18 changes: 18 additions & 0 deletions bluebottle/activities/migrations/0058_auto_20220622_1050.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.2.24 on 2022-06-22 08:50

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('activities', '0057_auto_20220608_1513'),
]

operations = [
migrations.AlterField(
model_name='activity',
name='team_activity',
field=models.CharField(blank=True, choices=[('teams', 'Teams'), ('individuals', 'Individuals')], default='individuals', help_text='Is this activity open for individuals or can only teams sign up?', max_length=100, verbose_name='participation'),
),
]
19 changes: 19 additions & 0 deletions bluebottle/activities/migrations/0059_auto_20220804_1214.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 2.2.24 on 2022-08-04 10:14

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('activities', '0058_auto_20220622_1050'),
]

operations = [
migrations.AlterField(
model_name='contributor',
name='team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='members', to='activities.Team', verbose_name='team'),
),
]
10 changes: 9 additions & 1 deletion bluebottle/activities/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ class Contributor(TriggerMixin, AnonymizationMixin, PolymorphicModel):

team = models.ForeignKey(
'activities.Team', verbose_name=_('team'),
null=True, blank=True, related_name='members', on_delete=models.SET_NULL
null=True, blank=True, related_name='members', on_delete=models.CASCADE
)
user = models.ForeignKey(
'members.Member', verbose_name=_('user'),
Expand Down Expand Up @@ -290,6 +290,14 @@ class Team(TriggerMixin, models.Model):
'members.Member', related_name='teams', null=True, on_delete=models.SET_NULL
)

@property
def accepted_participants(self):
return self.members.filter(status='accepted')

@property
def accepted_participants_count(self):
return len(self.accepted_participants)

class Meta(object):
ordering = ('-created',)
verbose_name = _("Team")
Expand Down
2 changes: 1 addition & 1 deletion bluebottle/activities/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class Meta(object):
'matching_properties',
)

class JSONAPIMeta(object):
class JSONAPIMeta:
included_resources = [
'owner',
'initiative',
Expand Down
37 changes: 35 additions & 2 deletions bluebottle/activities/states.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,18 @@ class TeamStateMachine(ModelStateMachine):
_('The team is cancelled. Contributors can no longer register')
)

running = State(
_('running'),
'running',
_('The team is currently running the activity.')
)

finished = State(
_('finished'),
'finished',
_('The team has completed the activity.')
)

def is_team_captain(self, user):
return user == self.instance.owner

Expand Down Expand Up @@ -428,7 +440,10 @@ def is_activity_owner(self, user):
)

cancel = Transition(
open,
[
open,
new
],
cancelled,
automatic=False,
permission=is_activity_owner,
Expand All @@ -437,10 +452,28 @@ def is_activity_owner(self, user):
)

reopen = Transition(
cancelled,
[cancelled, running, finished],
open,
automatic=False,
permission=is_activity_owner,
name=_('accept'),
description=_('The team is reopened. Contributors can apply again')
)

start = Transition(
[open, finished],
running,
name=_("Start"),
description=_(
"The slot is currently taking place."
)
)
finish = Transition(
[open, running],
finished,
name=_("Finish"),
description=_(
"The slot has ended. "
"Triggered when slot has ended."
)
)
15 changes: 0 additions & 15 deletions bluebottle/activities/templates/mails/messages/team_accepted.html

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
{% blocktrans context 'email' %}{{team_name}} has joined your activity "{{title}}".{% endblocktrans %}
</p>
<p>
{% blocktrans context 'email' %}Please contact them to sort out any details via {{team_captain_email}}.{% endblocktrans %}
{% blocktrans context 'email' %}Next steps{% endblocktrans %}
</p>
<ol>
<li>{% blocktrans context 'email' %}Contact team captain {{team_captain_name}} to settle on a date, time and location for when they will participate in this activity.{% endblocktrans %}</li>
<li>{% blocktrans context 'email' %}Add this information to the team via the unscheduled team list on the activity page so it is visible for the team members.{% endblocktrans %}</li>
</ol>
<p>{% blocktrans context 'email' %}Team captain contact details:{% endblocktrans %}</p>
<p>{{team_captain_email}}</p>
{% endblock %}
12 changes: 8 additions & 4 deletions bluebottle/activities/templates/mails/messages/team_applied.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@
{% blocktrans context 'email' %}{{team_name}} has applied to your activity "{{title}}".{% endblocktrans %}
</p>
<p>
{% blocktrans context 'email' %}Please contact them to sort out any details via {{team_captain_email}}.{% endblocktrans %}
</p>
<p>
{% blocktrans context 'email' %}You can accept or reject the team on the activity page.{% endblocktrans %}
{% blocktrans context 'email' %}Next steps{% endblocktrans %}
</p>
<ol>
<li>{% blocktrans context 'email' %}Contact team captain {{team_captain_name}} to settle on a date, time and location for when they will participate in this activity.{% endblocktrans %}</li>
<li>{% blocktrans context 'email' %}Add this information to the team via the unscheduled team list on the activity page so it is visible for the team members.{% endblocktrans %}</li>
<li>{% blocktrans context 'email' %}Accept the team after you have added the details so when the team members are invited to join the activity it includes the time, date and location.{% endblocktrans %}</li>
</ol>
<p>{% blocktrans context 'email' %}Team captain contact details:{% endblocktrans %}</p>
<p>{{team_captain_email}}</p>
{% endblock %}
Loading

0 comments on commit 1eeec5c

Please sign in to comment.