Skip to content

Create shareable links for all seats, even if student is not assigned#87

Draft
abigailrb03 wants to merge 3 commits intomainfrom
issue73
Draft

Create shareable links for all seats, even if student is not assigned#87
abigailrb03 wants to merge 3 commits intomainfrom
issue73

Conversation

@abigailrb03
Copy link
Copy Markdown

@abigailrb03 abigailrb03 commented Mar 30, 2026

resolving issue #73 by opening shareable link in new tab whenever a seat is clicked on. See images below:
Screenshot 2026-03-30 at 4 05 38 PM

Screenshot 2026-03-30 at 4 05 52 PM

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for unit tests for Python 3.11
FileStmtsMissCoverMissing
server
   __init__.py50492%21–22, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1673579%56, 60, 63, 66, 69, 72–77, 107, 110–119, 122, 125, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259115%35, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py20765%17–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py65395%25, 28, 92
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py116596%29, 33–34, 43, 150
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py923166%18, 29–31, 33–35, 49–51, 68–76, 88–89, 101–108, 112–114, 125–126
server/services/email/templates
   __init__.py33197%20
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py34682%42, 53, 59–60, 69, 72
server/utils
   date.py7186%30
   misc.py161319%5–9, 13–19, 23
TOTAL2018108846% 

Tests Skipped Failures Errors Time
66 0 💤 0 ❌ 0 🔥 10.622s ⏱️

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for unit tests for Python 3.10
FileStmtsMissCoverMissing
server
   __init__.py50492%21–22, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1673579%56, 60, 63, 66, 69, 72–77, 107, 110–119, 122, 125, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259115%35, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py20765%17–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py65395%25, 28, 92
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py116596%29, 33–34, 43, 150
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py923166%18, 29–31, 33–35, 49–51, 68–76, 88–89, 101–108, 112–114, 125–126
server/services/email/templates
   __init__.py33197%20
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py34682%42, 53, 59–60, 69, 72
server/utils
   date.py7186%30
   misc.py161319%5–9, 13–19, 23
TOTAL2018108846% 

Tests Skipped Failures Errors Time
66 0 💤 0 ❌ 0 🔥 10.385s ⏱️

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for unit tests for Python 3.12
FileStmtsMissCoverMissing
server
   __init__.py50492%21–22, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1673579%56, 60, 63, 66, 69, 72–77, 107, 110–119, 122, 125, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259115%35, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py20765%17–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py65395%25, 28, 92
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py116596%29, 33–34, 43, 150
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py923166%18, 29–31, 33–35, 49–51, 68–76, 88–89, 101–108, 112–114, 125–126
server/services/email/templates
   __init__.py33197%20
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py34682%42, 53, 59–60, 69, 72
server/utils
   date.py7186%30
   misc.py161319%5–9, 13–19, 23
TOTAL2018108846% 

Tests Skipped Failures Errors Time
66 0 💤 0 ❌ 0 🔥 9.663s ⏱️

@codecov
Copy link
Copy Markdown

codecov bot commented Mar 30, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 46.08%. Comparing base (4b805f6) to head (b7412d3).

Additional details and impacted files
@@           Coverage Diff           @@
##             main      #87   +/-   ##
=======================================
  Coverage   46.08%   46.08%           
=======================================
  Files          28       28           
  Lines        2018     2018           
=======================================
  Hits          930      930           
  Misses       1088     1088           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for unit tests for Python 3.11
FileStmtsMissCoverMissing
server
   __init__.py50492%21–22, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1673579%56, 60, 63, 66, 69, 72–77, 107, 110–119, 122, 125, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259115%35, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py20765%17–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py65395%25, 28, 92
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py116596%29, 33–34, 43, 150
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py923166%18, 29–31, 33–35, 49–51, 68–76, 88–89, 101–108, 112–114, 125–126
server/services/email/templates
   __init__.py33197%20
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py34682%42, 53, 59–60, 69, 72
server/utils
   date.py7186%30
   misc.py161319%5–9, 13–19, 23
TOTAL2018108846% 

Tests Skipped Failures Errors Time
66 0 💤 0 ❌ 0 🔥 9.363s ⏱️

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for unit tests for Python 3.10
FileStmtsMissCoverMissing
server
   __init__.py50492%21–22, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1673579%56, 60, 63, 66, 69, 72–77, 107, 110–119, 122, 125, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259115%35, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py20765%17–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py65395%25, 28, 92
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py116596%29, 33–34, 43, 150
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py923166%18, 29–31, 33–35, 49–51, 68–76, 88–89, 101–108, 112–114, 125–126
server/services/email/templates
   __init__.py33197%20
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py34682%42, 53, 59–60, 69, 72
server/utils
   date.py7186%30
   misc.py161319%5–9, 13–19, 23
TOTAL2018108846% 

Tests Skipped Failures Errors Time
66 0 💤 0 ❌ 0 🔥 10.298s ⏱️

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for unit tests for Python 3.12
FileStmtsMissCoverMissing
server
   __init__.py50492%21–22, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1673579%56, 60, 63, 66, 69, 72–77, 107, 110–119, 122, 125, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259115%35, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py20765%17–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py65395%25, 28, 92
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py116596%29, 33–34, 43, 150
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py923166%18, 29–31, 33–35, 49–51, 68–76, 88–89, 101–108, 112–114, 125–126
server/services/email/templates
   __init__.py33197%20
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py34682%42, 53, 59–60, 69, 72
server/utils
   date.py7186%30
   misc.py161319%5–9, 13–19, 23
TOTAL2018108846% 

Tests Skipped Failures Errors Time
66 0 💤 0 ❌ 0 🔥 9.893s ⏱️

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for e2e tests for Python 3.11
FileStmtsMissCoverMissing
server
   __init__.py501080%13, 16–22, 27, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1674474%27–30, 56, 60, 63, 66, 69, 72–77, 103, 107, 110–119, 122, 125, 139, 142–144, 147, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259414%34–36, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 987, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py201240%8, 13–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py654925%10–13, 16, 19, 22, 25, 28, 36–37, 49, 53, 66–127, 141–157
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py1169617%29, 33–34, 38, 42–44, 48, 52, 59–170
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py927321%18, 26–39, 43–52, 57–77, 83–115, 120–126
server/services/email/templates
   __init__.py332330%9–11, 14–17, 20, 30–41, 45–47
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py341362%20–36, 42, 47, 53, 59–60, 69, 72
server/utils
   date.py7443%17–19, 30
   misc.py161319%5–9, 13–19, 23
TOTAL2018132234% 

Tests Skipped Failures Errors Time
8 0 💤 0 ❌ 0 🔥 31.252s ⏱️

@github-actions
Copy link
Copy Markdown

Coverage

Coverage for e2e tests for Python 3.10
FileStmtsMissCoverMissing
server
   __init__.py501080%13, 16–22, 27, 67, 75
   cache.py6183%12
   forms.py1221588%23–25, 41–43, 68–70, 149–152, 159, 167
   models.py1674474%27–30, 56, 60, 63, 66, 69, 72–77, 103, 107, 110–119, 122, 125, 139, 142–144, 147, 151, 163, 167, 171, 175–176, 182, 185, 205, 208, 229, 232, 246
   views.py69259414%34–36, 45–81, 91–125, 136–140, 157–166, 182–199, 210–217, 226–248, 259–272, 281, 292–295, 306–325, 338–362, 371–393, 402–429, 438–447, 456–498, 509–514, 522–526, 535–565, 574–604, 613–646, 655–685, 694–711, 718, 723–727, 736–782, 788–839, 845–855, 860–880, 885–910, 915–930, 935–954, 959–960, 965–978, 987, 992, 997, 1005–1006
server/controllers
   __init__.py824644%26–44, 47–49, 60–87, 90, 101–110, 113
   auth_controllers.py382534%13–15, 21–47, 53–55
   dev_login_controllers.py342332%11–25, 30–39, 44–56
   health_controllers.py201240%8, 13–18, 23–27
server/services/auth
   __init__.py29679%22, 51, 56–57, 62–63
server/services/canvas
   __init__.py806124%18–25, 29, 33, 37, 43, 55–64, 69–105, 109–124, 128
   fake_canvas.py392633%9, 12, 15, 20–25, 28–29, 37–46, 49–56
server/services/core
   assign.py654925%10–13, 16, 19, 22, 25, 28, 36–37, 49, 53, 66–127, 141–157
   data.py543731%12–17, 21–25, 29–33, 37–39, 43–54, 58, 69–71, 75–76, 80–81, 85–86
   export.py272219%11–44
   room.py61568%11–33, 41–89
   student.py1169617%29, 33–34, 38, 42–44, 48, 52, 59–170
server/services/csv
   __init__.py201335%11–12, 19, 26–29, 36–41
server/services/email
   __init__.py413124%19–36, 40–72
   smtp.py927321%18, 26–39, 43–52, 57–77, 83–115, 120–126
server/services/email/templates
   __init__.py332330%9–11, 14–17, 20, 30–41, 45–47
server/services/google
   __init__.py542946%23, 31, 33, 41–44, 48–54, 58–77
server/typings
   exception.py341362%20–36, 42, 47, 53, 59–60, 69, 72
server/utils
   date.py7443%17–19, 30
   misc.py161319%5–9, 13–19, 23
TOTAL2018132234% 

Tests Skipped Failures Errors Time
8 0 💤 0 ❌ 0 🔥 32.191s ⏱️

@abigailrb03
Copy link
Copy Markdown
Author

abigailrb03 commented Mar 30, 2026

@phrdang does the current fix meet the use case you had envisioned or would a different approach be more helpful?

perhaps a more user-friendly solution might follow something like this (very) low-fi drawing (though this will probably require rewriting some tests...)
IMG_D5A7FA353D74-1

@abigailrb03 abigailrb03 self-assigned this Mar 30, 2026
@abigailrb03 abigailrb03 requested a review from phrdang March 30, 2026 23:23
Copy link
Copy Markdown
Member

@phrdang phrdang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a bit difficult for me to properly review this since I'm not familiar with the seating tool code, but what you changed seems to make sense to me on paper. I might be helpful if you could do a screen recording of the flow in addition to the screenshots you already sent? (And in the screen recording somehow copy and paste the link in a new tab to show that it works?)

<img class="photo" src="{{ url_for('student_photo', exam_student=(room.exam, seat.assignment.student)) }}" alt="photo for: {{ seat.assignment.student.name }}"/>
<br>{{ seat.assignment.student.sid }}
{% endif %}
{% endif %} -m
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this -m intentional?

@phrdang
Copy link
Copy Markdown
Member

phrdang commented Mar 31, 2026

@phrdang does the current fix meet the use case you had envisioned or would a different approach be more helpful?

perhaps a more user-friendly solution might follow something like this (very) low-fi drawing (though this will probably require rewriting some tests...) IMG_D5A7FA353D74-1

Yeah that UI could be useful in case a staff member just wants to copy the URL and not go to the page for that seat (saves a few clicks).

@phrdang
Copy link
Copy Markdown
Member

phrdang commented Mar 31, 2026

Also thanks for working on this!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants