From 28cdf64f76ca798060175600367b5f02df8f93ed Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Thu, 9 Mar 2023 17:34:08 +0000 Subject: [PATCH] Add hosting high scores to LCARS display --- apiserver/apiserver/api/views.py | 18 ++++++++++++++ webclient/public/toast.png | Bin 0 -> 8263 bytes webclient/src/Display.js | 40 +++++++++++++++++++++++++++++++ webclient/src/light.css | 6 +++++ 4 files changed, 64 insertions(+) create mode 100644 webclient/public/toast.png diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py index 1a15b25..405dbd4 100644 --- a/apiserver/apiserver/api/views.py +++ b/apiserver/apiserver/api/views.py @@ -1607,6 +1607,24 @@ class HostingViewSet(Base): return Response(200) + @action(detail=False, methods=['get']) + def high_scores(self, request): + members = models.Member.objects.all() + members = members.annotate( + hosting_hours=Sum('user__hosting__hours'), + ).exclude(hosting_hours__isnull=True).order_by('-hosting_hours') + + hours = [] + + for member in members: + hours.append(dict( + name=member.preferred_name + ' ' + member.last_name[0], + hours=member.hosting_hours, + member_id=member.id, + )) + + return Response(hours) + class RegistrationView(RegisterView): serializer_class = serializers.MyRegisterSerializer diff --git a/webclient/public/toast.png b/webclient/public/toast.png new file mode 100644 index 0000000000000000000000000000000000000000..0f59c62eac3417f6343c579060923d9e365efacf GIT binary patch literal 8263 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®k%>wuyqc=DXxJkU%DcU)IK{+)eAz*b8^Uu|1> zloE4m=nd@KaO06nk>I$Uh%#oov5dkagAyDP65i^HYPp)1wj6@0p#0YSHxC^OBg5D> z$CJ0lUazMi!66b^%h1v5;aI+j+b#a1v#1xy0U3bjL*XWWe zu}^(>e?R#svOO)7jOwU3a_T!cDExkUJ;o|Eh%i#>)0R9jovQGW>)&)-o_}qHY1XNA zx8!F9c*`{>4+$$Naut9H?O*3Os`E025sP9sxy`9JGe%#rIlK=_=_nI!5aASq`dh2J z$Oc;MyQq?QrGH`{)ba0nHaku52dse!1d^KJM9(iTUwD;FWb8TkEON6g)s>}{OtjOc zCRS1@TrwJGdedkNcP1Xtr#n!=-*-Xo!x8{`w(}5?T29keg({FsiTi`a;F+n6)Y!ik z5wiB-2sNZhzKqjGesYAIoeoQqA2L#Nhy_vd@0&|j87GA!SuHoa`$Nxg^*Q7s8ekp^ zuAHBiA~Ul*RPCm!s;c_C$qeMDh7A&?0M6{hqg!tdQU_Z!CP1v~Ym{f@Ex9yKY_okI z^LOQ#>}J1>WpTpBNt?IzabUGL_o{rw-H=4G-kX*R?>`uO2> z9@tN7^?HrUAg&|yY;M0x99Q*4zkJaixkAxdzC415B-ri!m~OXLha8NRW%!#`7PbN) z!ONN`rJk=MWQ%$nDZDk6JO~jDCZjqjGuq}H&3@QMl`d?1+j+u)suttW&~Qa?$T-EZ z)(EGaUH($ZWK@vDwzJ{58jKTe*tjg59NVMTsO5^m=RQ$zMoSQXi6E9uF{5=NW0G_L zaSgs==MGe#P>ioresgiPg|Qhx-N-H~-CAXuZHv$hE7oqI4_14u1*)ZY=xP5$J1?`h7EEbCO zo{c`J2Bpp0bm%?=`;2lZ8Fbrs9+yTM`0*%Aisv!iJ2>Q$d?`(rD^;g1J+Loz(dERS zYE-<2Zq#HgL%Tc9?BfF?2Y#o>*pt^1W_b=m6uf>ptz`MPYtk76J4O{SZ3+y6vS!`J z62eLVcU1dMFaJc*U1k=QEhAfq%8QRAhs$m`W_DnAXQ`o}F5BFVojB?XHm3vaT-0iz zBEnVLj77Gvq{Dx#)qn5ia1Fl^O3jv~PR(v--&0^qT|sd{k|e*u;6xpkKos<99yGKR zE88&eS&?BPBm}~>G||Kc*LSDw!XsG=f#pcicfS-^C5orMlVVuQ@< zmL6-*$Pg(E^3D(aKb*B5&Me}*Hg)uQCU}g4M6uctqDr~+bWz`}>%c9`uo%%4GnAy5 zC<%A>{ayN(Qmwkx{sje)Yx<+hK+jlb!kw=m*i&Q#If~42`y49fvzRI8t`KuY5QiqU zUz+$Z#|)SPNVXw@<`s-%p<~r8WNhq*TI}F_k=@q$$7Ob9a?D28H+mq->w8PYiSmxL66c8WYB z^y;|Jhjn?+`kK!&1`HZANTo8K5p&l6ww|TwW>8_FgN3iC4jco; zyU@${n~#a(WJuVIEZsbDW(iPi?ZQ>no8gLzR_UakTUHA@#~s|&AB^At%^K2w|FV8z z+oeJq#LRq(e%a&Dm(yTXS-rt1sU7}e-lQGyFbt`!t!=a{T!^h+Fs#&EsRD3yZKZY9 zyW08w>Fv;NsO+lm=>gP$Sv|p)iyYG*PM%iEk+&K=-@1I0+3dt@Og;+FS5(=2 zKo{x_e0&8r1`rAI@(S?s@#*sEF{I~!`cMne3ky*S6B9(&{8k0dcWjzF0s6E|0*YReQWk4Tu-=X4>Sh|ugKu^Tba);~ zcd$1mlIp{YRX~rx90+>9az%$|3`f3`+6g;;fe8+P)Qbq<9V4*g#f|QXT4SY#CeOvj z#>$+JXgz)yQ(&LQe_kzkEN>yg4V+1A3pdEU1nx3pIn$U3_nGSb_YH-Tl~j^w5Hk+> EAAY2x@Bjb+ literal 0 HcmV?d00001 diff --git a/webclient/src/Display.js b/webclient/src/Display.js index 92bfdf0..72939f0 100644 --- a/webclient/src/Display.js +++ b/webclient/src/Display.js @@ -38,6 +38,10 @@ export function LCARS1Display(props) { +
+ +
+
@@ -122,3 +126,39 @@ export function DisplayScores(props) { ); }; + +export function DisplayHosting(props) { + const { token, name } = props; + const [scores, setScores] = useState(false); + + const getScores = () => { + requester('/hosting/high_scores/', 'GET') + .then(res => { + setScores(res); + }) + .catch(err => { + console.log(err); + setScores(false); + }); + }; + + useEffect(() => { + getScores(); + const interval = setInterval(getScores, 60000); + return () => clearInterval(interval); + }, []); + + return ( + <> +
Most Host
+ + {scores && scores.slice(0, 5).map((x, i) => +
+
#{i+1} — {x.name}. {i === 0 ? : ''}
+

{x.hours.toFixed(2)} hours

+
+ )} + + + ); +}; diff --git a/webclient/src/light.css b/webclient/src/light.css index ab8987f..f7b9abe 100644 --- a/webclient/src/light.css +++ b/webclient/src/light.css @@ -203,6 +203,12 @@ body { text-align: right; } +.display .display-scores .toast { + width: 40px; + height: 40px; + margin-bottom: 15px; +} + .usage { height: 100vh; background-color: black;