diff --git a/apiserver/apiserver/api/utils_stats.py b/apiserver/apiserver/api/utils_stats.py
index 570efc5..65fba11 100644
--- a/apiserver/apiserver/api/utils_stats.py
+++ b/apiserver/apiserver/api/utils_stats.py
@@ -18,6 +18,8 @@ DEFAULTS = {
'last_card_change': time.time(),
'next_meeting': None,
'next_clean': None,
+ 'next_class': None,
+ 'prev_class': None,
'member_count': None,
'paused_count': None,
'green_count': None,
@@ -44,8 +46,11 @@ def changed_card():
def calc_next_events():
sessions = models.Session.objects
+ # TODO, go by tag?
member_meeting = sessions.filter(is_cancelled=False, course__in=[317, 413], datetime__gte=now()).first()
monthly_clean = sessions.filter(is_cancelled=False, course=273, datetime__gte=now()).first()
+ next_class = sessions.exclude(course__in=[317, 413]).filter(is_cancelled=False, datetime__gte=now()).order_by('datetime').first()
+ prev_class = sessions.exclude(course__in=[317, 413]).filter(is_cancelled=False, datetime__lte=now()).order_by('datetime').last()
if member_meeting:
cache.set('next_meeting', member_meeting.datetime)
@@ -57,6 +62,17 @@ def calc_next_events():
else:
cache.set('next_clean', None)
+ if next_class:
+ cache.set('next_class', dict(datetime=next_class.datetime, id=next_class.id, name=next_class.course.name))
+ else:
+ cache.set('next_class', None)
+
+ if prev_class:
+ cache.set('prev_class', dict(datetime=prev_class.datetime, id=prev_class.id, name=prev_class.course.name))
+ else:
+ cache.set('prev_class', None)
+
+
def calc_member_counts():
members = models.Member.objects
not_paused = members.filter(paused_date__isnull=True)
diff --git a/webclient/src/Home.js b/webclient/src/Home.js
index 1058c1a..d544a84 100644
--- a/webclient/src/Home.js
+++ b/webclient/src/Home.js
@@ -189,6 +189,19 @@ export function Home(props) {
const getZeroStat = (x) => stats && stats[x] ? stats[x] : '0';
const getDateStat = (x) => stats && stats[x] ? moment.utc(stats[x]).tz('America/Edmonton').format('MMM Do @ LT') : 'Unknown';
+ const getNextStat = (x) => {
+ if (stats && stats[x]) {
+ const datetime = moment.utc(stats[x].datetime).tz('America/Edmonton');
+ if (datetime.isSame(moment().tz('America/Edmonton'), 'day') ) {
+ return <>{datetime.format('LT')} | {stats[x].name}>;
+ } else {
+ return <>{datetime.format('MMM Do')} | {stats[x].name}>;
+ }
+ } else {
+ return 'Unknown';
+ }
+ };
+
const mcPlayers = stats && stats['minecraft_players'] ? stats['minecraft_players'] : [];
const mumbleUsers = stats && stats['mumble_users'] ? stats['mumble_users'] : [];
@@ -239,8 +252,9 @@ export function Home(props) {
Next member meeting: {getDateStat('next_meeting')}
Next monthly clean: {getDateStat('next_clean')}
+Next class: {getNextStat('next_class')}
+Last class: {getNextStat('prev_class')}
Member count: {getStat('member_count')} [more]
-Green members: {getStat('green_count')}
Card scans today: {getZeroStat('card_scans')}
diff --git a/webclient/src/light.css b/webclient/src/light.css index 50f09a2..695a4b9 100644 --- a/webclient/src/light.css +++ b/webclient/src/light.css @@ -151,6 +151,12 @@ body { margin-bottom: 0.5em; } +.nowrap-stat { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + .footer { margin-top: -20rem;