New event: add Competition ID (games) and a Gathering time, both optional

- Competition ID (Event.external_game_id) sits under Competition, game-only,
  one-off only (no EventSeries equivalent) -- was already part of EventForm,
  just never rendered here.
- Gathering time (Event.gathering / EventSeries.gathering_offset) is
  available for every kind, in both the one-off and recurring paths -- the
  recurring form had this explicitly cut earlier; un-cut now that it's
  wanted, mirroring the existing Answers-close/deadline_minutes_before
  pattern right next to it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-23 17:35:59 +02:00
parent 1eaf92c977
commit b9900510b1
3 changed files with 86 additions and 12 deletions

View File

@@ -3700,6 +3700,65 @@ class CoachCreateEventViewTests(TestCase):
self.assertEqual(event.opponent, opponent)
self.assertEqual(event.competition, "Regional League")
def test_can_set_a_competition_id_for_a_game(self):
self.client.force_login(self.user)
self._post(kind="game", title="Away game", external_game_id="4460")
event = Event.objects.get(title="Away game")
self.assertEqual(event.external_game_id, "4460")
def test_competition_id_is_optional(self):
self.client.force_login(self.user)
self._post(title="Plain practice")
event = Event.objects.get(title="Plain practice")
self.assertEqual(event.external_game_id, "")
def test_can_set_a_gathering_time(self):
self.client.force_login(self.user)
gathering = timezone.localtime(timezone.now() + datetime.timedelta(days=5, hours=-1)).strftime("%Y-%m-%dT%H:%M")
self._post(title="Early gather practice", gathering=gathering)
event = Event.objects.get(title="Early gather practice")
self.assertIsNotNone(event.gathering)
def test_gathering_time_is_optional(self):
self.client.force_login(self.user)
self._post(title="No gather practice")
event = Event.objects.get(title="No gather practice")
self.assertIsNone(event.gathering)
def test_recurring_can_set_a_gathering_offset(self):
self.client.force_login(self.user)
dtstart = timezone.localtime(timezone.now() + datetime.timedelta(days=1)).strftime("%Y-%m-%dT%H:%M")
self.client.post(
reverse("mobile:coach_create_event"),
{
"is_recurring": "on",
"kind": "training",
"title": "Gathering series",
"teams": [str(self.team.pk)],
"dtstart": dtstart,
"frequency": "weekly",
"interval": "1",
"weekdays": ["MO"],
"gathering_minutes_before": "30",
},
HTTP_HOST="ajax-united.rosterchief.app",
)
series = EventSeries.objects.get(title="Gathering series")
self.assertEqual(series.gathering_offset, datetime.timedelta(minutes=30))
occurrence = series.occurrences.first()
self.assertIsNotNone(occurrence)
self.assertEqual(occurrence.gathering, occurrence.start - datetime.timedelta(minutes=30))
def test_invited_members_pool_excludes_the_current_roster(self):
on_roster = Member.objects.create(first_name="On", last_name="Roster")
TeamMembership.objects.create(team=self.team, member=on_roster, season=self.season)