fix: label > 26 sessions per group (#7599)

* fix: label > 26 sessions correctly

* test: test new helper

---------

Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
This commit is contained in:
Jennifer Richards 2024-09-04 17:39:03 -03:00 committed by GitHub
parent b6f8ede98a
commit 36847428d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 25 additions and 5 deletions

View file

@ -1205,19 +1205,30 @@ class Session(models.Model):
else: else:
return "" return ""
@staticmethod
def _alpha_str(n: int):
"""Convert integer to string of a-z characters (a, b, c, ..., aa, ab, ...)"""
chars = []
while True:
chars.append(string.ascii_lowercase[n % 26])
n //= 26
# for 2nd letter and beyond, 0 means end the string
if n == 0:
break
# beyond the first letter, no need to represent a 0, so decrement
n -= 1
return "".join(chars[::-1])
def docname_token(self): def docname_token(self):
sess_mtg = Session.objects.filter(meeting=self.meeting, group=self.group).order_by('pk') sess_mtg = Session.objects.filter(meeting=self.meeting, group=self.group).order_by('pk')
index = list(sess_mtg).index(self) index = list(sess_mtg).index(self)
return 'sess%s' % (string.ascii_lowercase[index]) return f"sess{self._alpha_str(index)}"
def docname_token_only_for_multiple(self): def docname_token_only_for_multiple(self):
sess_mtg = Session.objects.filter(meeting=self.meeting, group=self.group).order_by('pk') sess_mtg = Session.objects.filter(meeting=self.meeting, group=self.group).order_by('pk')
if len(list(sess_mtg)) > 1: if len(list(sess_mtg)) > 1:
index = list(sess_mtg).index(self) index = list(sess_mtg).index(self)
if index < 26: token = f"sess{self._alpha_str(index)}"
token = 'sess%s' % (string.ascii_lowercase[index])
else:
token = 'sess%s%s' % (string.ascii_lowercase[index//26],string.ascii_lowercase[index%26])
return token return token
return None return None

View file

@ -10,6 +10,7 @@ from django.test import override_settings
from ietf.group.factories import GroupFactory, GroupHistoryFactory from ietf.group.factories import GroupFactory, GroupHistoryFactory
from ietf.meeting.factories import MeetingFactory, SessionFactory, AttendedFactory, SessionPresentationFactory from ietf.meeting.factories import MeetingFactory, SessionFactory, AttendedFactory, SessionPresentationFactory
from ietf.meeting.models import Session
from ietf.stats.factories import MeetingRegistrationFactory from ietf.stats.factories import MeetingRegistrationFactory
from ietf.utils.test_utils import TestCase from ietf.utils.test_utils import TestCase
from ietf.utils.timezone import date_today, datetime_today from ietf.utils.timezone import date_today, datetime_today
@ -147,6 +148,14 @@ class SessionTests(TestCase):
session.chat_room = 'fnord' session.chat_room = 'fnord'
self.assertEqual(session.chat_room_name(), 'fnord') self.assertEqual(session.chat_room_name(), 'fnord')
def test_alpha_str(self):
self.assertEqual(Session._alpha_str(0), "a")
self.assertEqual(Session._alpha_str(1), "b")
self.assertEqual(Session._alpha_str(25), "z")
self.assertEqual(Session._alpha_str(26), "aa")
self.assertEqual(Session._alpha_str(27 * 26 - 1), "zz")
self.assertEqual(Session._alpha_str(27 * 26), "aaa")
def test_session_recording_url(self): def test_session_recording_url(self):
group_acronym = "foobar" group_acronym = "foobar"
meeting_date = datetime.date.today() meeting_date = datetime.date.today()