Skip to content

Commit a58ddcb

Browse files
committed
Calendar Updates
1 parent 4598672 commit a58ddcb

1 file changed

Lines changed: 142 additions & 25 deletions

File tree

Calendar/Calendar.py

Lines changed: 142 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,72 @@
1616

1717
global 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+
1962
def 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

3787
def 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

107168
def 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

Comments
 (0)