1616
1717global model , Data , q
1818
19+ def user_can_edit_event (event ):
20+ """ Determine if the current user can edit the given event. The event is a row from any of several queries, but
21+ it must have isLeader and isMember fields."""
22+ if model .IsUserInRole ("Admin" ):
23+ return True
24+
25+ if hasattr (event , 'IsLeader' ) and event .IsLeader :
26+ return True
27+
28+ return False
29+
30+ def user_can_see_event_details (event ):
31+ """ Determine if the current user can see details for the given event. The event is a row from any of several queries, but
32+ it must have isLeader, isMember fields."""
33+ if model .IsUserInRole ("Admin" ):
34+ return True
35+
36+ if not model .IsUserInRole ("OrgLeaderOnly" ):
37+ return True
38+
39+ if hasattr (event , 'IsMember' ) and event .IsMember :
40+ return True
41+
42+ if hasattr (event , 'IsExpected' ) and event .IsExpected :
43+ return True
44+
45+ return False
46+
47+ def user_is_expected_at_event (event ):
48+ """ Determine if the current user is expected at the given event. The event is a row from any of several queries, but
49+ it must have isMember and isExpected field."""
50+
51+ if hasattr (event , 'IsNotExpected' ) and event .IsNotExpected :
52+ return False
53+
54+ if hasattr (event , 'IsMember' ) and event .IsExpected :
55+ return True
56+
57+ if hasattr (event , 'IsExpected' ) and event .IsExpected :
58+ return True
59+
60+ return False
61+
1962def get_events (dt ):
2063 return q .QuerySql ("""
2164 SELECT
2265 m.MeetingDate,
2366 m.MeetingEnd,
2467 COALESCE(NULLIF(m.Description,''), o.organizationName) as MeetingName,
2568 m.MeetingId,
26- 1 * o.ShowInSites as Featured
69+ 1 * o.ShowInSites as Featured,
70+ IIF(l_mt.attendanceTypeId > 0, 1, 0) as IsMember,
71+ IIF(l_mt.attendanceTypeId = 10, 1, 0) as IsLeader,
72+ IIF(a.AttendanceFlag = 1 OR a.Commitment IN (1, 2), 1, 0) as IsExpected,
73+ IIF((a.AttendanceFlag = 0 AND a.MeetingDate < GETDATE()) OR a.Commitment IN (0, 3), 1, 0) as IsNotExpected
2774 FROM Meetings m
2875 LEFT JOIN Organizations o ON m.OrganizationId = o.OrganizationId
76+ LEFT JOIN OrganizationMembers om ON o.OrganizationId = om.OrganizationId AND {1} = om.PeopleId
77+ LEFT JOIN lookup.MemberType l_mt ON om.MemberTypeId = l_mt.Id
78+ LEFT JOIN Attend a ON m.MeetingId = a.MeetingId AND {1} = a.PeopleId
2979
3080 WHERE m.MeetingDate < DATEADD(day, 1, '{0}')
3181 AND COALESCE(m.MeetingEnd, m.MeetingDate) > '{0}'
3282 AND m.Canceled = 0
3383 ORDER BY MeetingDate, o.DivisionId
34- """ .format (dt ))
84+ """ .format (dt , model . CurrentPeopleId ))
3585
3686
3787def get_reservables ():
@@ -68,7 +118,8 @@ def get_reservations(dt):
68118 COALESCE(NULLIF(m.Description, ''), o.OrganizationName) as Name,
69119 0 as Quantity,
70120 m.MeetingId,
71- o.LeaderName
121+ o.LeaderName,
122+ o.OrganizationId
72123 INTO #reservables
73124 FROM Reservations rv
74125 JOIN Reservable rb ON rv.ReservableId = rb.ReservableId
@@ -88,7 +139,8 @@ def get_reservations(dt):
88139 COALESCE(NULLIF(m.Description, ''), o.OrganizationName) as Name,
89140 ri.Quantity,
90141 m.MeetingId,
91- o.LeaderName
142+ o.LeaderName,
143+ o.OrganizationId
92144 INTO #Jawns
93145 FROM ReservationItems ri
94146 LEFT JOIN Reservations rv ON ri.ReservationId = rv.ReservationId
@@ -97,11 +149,20 @@ def get_reservations(dt):
97149 JOIN Organizations o ON m.OrganizationId = o.OrganizationId
98150 WHERE rv.MeetingId IS NOT NULL
99151 AND rv.MeetingEnd > '{0}'
100- AND rv.MeetingStart < DATEADD(day, 1, '{0}')
101- ;
152+ AND rv.MeetingStart < DATEADD(day, 1, '{0}');
153+
154+ SELECT * INTO #unioned FROM #reservables UNION SELECT * FROM #Jawns
102155
103- SELECT * FROM #reservables UNION SELECT * FROM #Jawns;
104- """ .format (dt ))
156+ SELECT u.*,
157+ IIF(l_mt.attendanceTypeId > 0, 1, 0) as IsMember,
158+ IIF(l_mt.attendanceTypeId = 10, 1, 0) as IsLeader,
159+ IIF(a.AttendanceFlag = 1 OR a.Commitment IN (1, 2), 1, 0) as IsExpected,
160+ IIF((a.AttendanceFlag = 0 AND a.MeetingDate < GETDATE()) OR a.Commitment IN (0, 3), 1, 0) as IsNotExpected
161+ FROM #unioned u
162+ LEFT JOIN OrganizationMembers om ON u.OrganizationId = om.OrganizationId AND {1} = om.PeopleId
163+ LEFT JOIN lookup.MemberType l_mt ON om.MemberTypeId = l_mt.Id
164+ LEFT JOIN Attend a ON m.MeetingId = a.MeetingId AND {1} = a.PeopleId;
165+ """ .format (dt , model .CurrentPeopleId ))
105166
106167
107168def get_rooms_for_meeting (meeting_id ):
@@ -209,21 +270,35 @@ def generate_calendar_html(date):
209270 for ev in events :
210271
211272 classes = ['event' ]
273+ edit = user_can_edit_event (ev )
274+ view = user_can_see_event_details (ev )
212275
213- if ev .Featured :
276+ if ev .Featured and view :
214277 classes .append ('feat' )
215278
216- html .append ("<a href='/Meeting/MeetingDetails/%s'>" % ev .MeetingId )
279+ if edit :
280+ html .append ("<a href='/Meeting/MeetingDetails/%s'>" % ev .MeetingId )
281+ else :
282+ html .append ("<div>" )
217283
218284 html .append ("<div class='%s'>" % ' ' .join (classes ))
219285
220- html .append ("%s<br>" % ev .MeetingName )
286+ if view :
287+ html .append ("%s<br>" % ev .MeetingName )
288+ else :
289+ html .append ("Event<br>" )
290+
221291 html .append (("<small>%s - %s</small>" % (
222292 ev .MeetingDate .ToString ("h:mmtt" ).replace ('M' ,'' ), # TODO: make this work better with multi-day events.
223293 ev .MeetingDate .ToString ("h:mmtt" ).replace ('M' ,'' ) if ev .MeetingEnd is None else ev .MeetingEnd .ToString ("h:mmtt" ).replace ('M' ,'' )
224294 )).lower ().replace (":00" ,"" ))
225295
226- html .append ("</div></a>" )
296+ html .append ("</div>" )
297+
298+ if edit :
299+ html .append ("</a>" )
300+ else :
301+ html .append ("</div>" )
227302 html .append ("</td>" )
228303 html .append ("</tr>" )
229304
@@ -364,6 +439,10 @@ def generate_list_html(start_date, day_count, with_setups = False):
364439
365440 current_day = None
366441 for ev in events :
442+
443+ view = user_can_see_event_details (ev )
444+ edit = user_can_edit_event (ev )
445+
367446 ev_date = ev .MeetingDate .Date
368447 if ev_date != current_day :
369448 if current_day is not None :
@@ -380,23 +459,30 @@ def generate_list_html(start_date, day_count, with_setups = False):
380459 continue # skip events with no rooms if showing setups
381460
382461 classes = []
383- if ev .Featured :
462+ if ev .Featured and view :
384463 classes .append ('feat' )
385464
386- html .append ("<a href='/Meeting/MeetingDetails/%s'>" % ev .MeetingId )
465+ if edit :
466+ html .append ("<a href='/Meeting/MeetingDetails/%s'>" % ev .MeetingId )
467+ else :
468+ html .append ("<div>" )
387469
388470 html .append ("<section class='event'>" )
389471
390472 html .append ("<header class='%s'>" % ' ' .join (classes ))
391- html .append ("<h3>%s</h3>" % ev .MeetingName )
473+ if view :
474+ html .append ("<h3>%s</h3>" % ev .MeetingName )
475+ else :
476+ html .append ("<h3>Event</h3>" )
477+
392478 html .append (("<small>%s - %s</small>" % (
393479 ev .MeetingDate .ToString ("h:mmtt" ).replace ('M' ,'' ), # TODO make this work better with multi-day events.
394480 ev .MeetingDate .ToString ("h:mmtt" ).replace ('M' ,'' ) if ev .MeetingEnd is None else ev .MeetingEnd .ToString ("h:mmtt" ).replace ('M' ,'' )
395481 )).lower ().replace (":00" ,"" ))
396482
397483 html .append ("</header>" )
398484
399- if with_setups :
485+ if view and with_setups :
400486 html .append ("<div class='rooms'>" )
401487 for room in rooms :
402488 rsrc = get_reservations_for_room_reservation (room .ReservationId )
@@ -432,7 +518,12 @@ def generate_list_html(start_date, day_count, with_setups = False):
432518 html .append ("</div>" )
433519 html .append ("</div>" )
434520
435- html .append ("</section></a>" )
521+ html .append ("</section>" )
522+
523+ if edit :
524+ html .append ("</a>" )
525+ else :
526+ html .append ("</div>" )
436527
437528 if current_day is not None :
438529 html .append ("</div>" ) # close last day
@@ -595,19 +686,31 @@ def generate_calendar_vert_html(start_date, day_count):
595686 width = 100.0 / lane_count
596687 left = lane_index * width
597688
689+ edit = user_can_edit_event (ev )
690+ view = user_can_see_event_details (ev )
691+
598692 classes = ['event' ]
599- if ev .Featured :
693+ if ev .Featured and view :
600694 classes .append ('feat' )
601695
602- html .append ("<a href='/Meeting/MeetingDetails/%s' title=\" %s\" >" % (ev .MeetingId , ev .MeetingName ))
696+ if edit :
697+ html .append ("<a href='/Meeting/MeetingDetails/%s' title=\" %s\" >" % (ev .MeetingId , ev .MeetingName ))
698+ else :
699+ html .append ("<div>" )
700+
603701 html .append ("<div class='%s' style='top:%dvh; height:%dvh; left:%.2f%%; width:%.2f%%'>" % (
604702 ' ' .join (classes ), top , height , left , width ))
605703 html .append ("%s<br><small>%s - %s</small>" % (
606- ev .MeetingName ,
704+ ev .MeetingName if view else "Event" ,
607705 ev .MeetingDate .ToString ("h:mmtt" ).lower ().replace (":00" ,"" ).replace ('m' ,'' ),
608706 ev .MeetingEnd .ToString ("h:mmtt" ).lower ().replace (":00" ,"" ).replace ('m' ,'' ) if ev .MeetingEnd else ""
609707 ))
610- html .append ("</div></a>" )
708+ html .append ("</div>" )
709+
710+ if edit :
711+ html .append ("</a>" )
712+ else :
713+ html .append ("</div>" )
611714
612715 html .append ("</div>" ) # end daycol
613716
@@ -735,21 +838,32 @@ def render_row(rsbl):
735838 setup_start = start .AddMinutes (- res .SetupMinutes )
736839 teardown_end = end .AddMinutes (res .TeardownMinutes )
737840
841+ view = user_can_see_event_details (res )
842+ edit = user_can_edit_event (res )
843+
738844 l = time_to_vw (start )
739845 width = time_to_vw (end ) - l
740846 setup_left = time_to_vw (setup_start )
741847 setup_width = time_to_vw (teardown_end ) - setup_left
742848
743849 color = reservable_dict [res .ReservableId ].Color
744850
745- html .append ("<a href='/Meeting/MeetingDetails/%s'>" % res .MeetingId )
851+ if edit :
852+ html .append ("<a href='/Meeting/MeetingDetails/%s'>" % res .MeetingId )
853+ else :
854+ html .append ("<div>" )
746855
747856
748857 lane = rsbl ._lanes [0 ][res ]
749858 top_offset = round (lane / (.01 * rsbl ._lanes [1 ]), 2 )
750859 bot_offset = round (((rsbl ._lanes [1 ] - 1 - lane ) / (.01 * rsbl ._lanes [1 ])), 2 )
751860
752- if res .SetupMinutes > 0 or res .TeardownMinutes > 0 :
861+ if not view :
862+ res .Name = "Reserved"
863+ l = setup_left
864+ width = setup_width
865+
866+ if (res .SetupMinutes > 0 or res .TeardownMinutes > 0 ) and view :
753867 html .append ("<div class='bar setup' style='left:%.2fvw; width:%.2fvw; background:%s; top:calc(%.2f%% + 1px); bottom:calc(%.2f%% + 1px);'></div>" % (
754868 setup_left , setup_width , color , top_offset , bot_offset
755869 ))
@@ -760,12 +874,15 @@ def render_row(rsbl):
760874 lbl = ""
761875 if res .Quantity > 0 :
762876 lbl = "(%d) " % res .Quantity
763- if res .LeaderName is not None :
877+ if res .LeaderName is not None and view :
764878 lbl = "%s%s" % (lbl , res .LeaderName )
765879 if lbl != "" :
766880 html .append ("<small><br />%s</small>" % lbl )
767881 html .append ("</div>" )
768- html .append ("</a>" )
882+ if edit :
883+ html .append ("</a>" )
884+ else :
885+ html .append ("</div>" )
769886 html .append ("</div>" )
770887
771888 for child in children .get (rsbl .ReservableId , []):
0 commit comments