Commit 7ed7b4f220c6bdba7890436de9b84b389d5becf1

Authored by Kevin Mach
1 parent 6c8360177c
Exists in master

updated R3

Showing 1 changed file with 15 additions and 23 deletions Inline Diff

DesignUseCases.tex View file @ 7ed7b4f
\documentclass[letterpaper]{scrartcl} % or whatever 1 1 \documentclass[letterpaper]{scrartcl} % or whatever
\usepackage{tgpagella} 2 2 \usepackage{tgpagella}
\setkomafont{disposition}{\normalfont\bfseries} 3 3 \setkomafont{disposition}{\normalfont\bfseries}
%\usepackage[markuppercase]{scrpage2} 4 4 %\usepackage[markuppercase]{scrpage2}
\title{\huge Design Use Cases} 5 5 \title{\huge Design Use Cases}
\date{\today} 6 6 \date{\today}
\author{\Large Students With A Goal (S.W.A.G.)} 7 7 \author{\Large Students With A Goal (S.W.A.G.)}
\usepackage[pass]{geometry} 8 8 \usepackage[pass]{geometry}
\usepackage{hyperref} 9 9 \usepackage{hyperref}
\usepackage{graphicx} 10 10 \usepackage{graphicx}
\usepackage{enumitem} 11 11 \usepackage{enumitem}
\setlist[description]{style=multiline,leftmargin=3cm,font=\normalfont\textbf} 12 12 \setlist[description]{style=multiline,leftmargin=3cm,font=\normalfont\textbf}
\setlistdepth{9} 13 13 \setlistdepth{9}
14 14
\setlist[itemize,1]{label=$\bullet$} 15 15 \setlist[itemize,1]{label=$\bullet$}
\setlist[itemize,2]{label=$\bullet$} 16 16 \setlist[itemize,2]{label=$\bullet$}
\setlist[itemize,3]{label=$\bullet$} 17 17 \setlist[itemize,3]{label=$\bullet$}
\setlist[itemize,4]{label=$\bullet$} 18 18 \setlist[itemize,4]{label=$\bullet$}
\setlist[itemize,5]{label=$\bullet$} 19 19 \setlist[itemize,5]{label=$\bullet$}
\setlist[itemize,6]{label=$\bullet$} 20 20 \setlist[itemize,6]{label=$\bullet$}
\setlist[itemize,7]{label=$\bullet$} 21 21 \setlist[itemize,7]{label=$\bullet$}
\setlist[itemize,8]{label=$\bullet$} 22 22 \setlist[itemize,8]{label=$\bullet$}
\setlist[itemize,9]{label=$\bullet$} 23 23 \setlist[itemize,9]{label=$\bullet$}
\renewlist{itemize}{itemize}{9} 24 24 \renewlist{itemize}{itemize}{9}
\begin{document} 25 25 \begin{document}
\maketitle 26 26 \maketitle
\begin{center} 27 27 \begin{center}
\includegraphics[width=12cm]{../swag_logo.png}\\ 28 28 \includegraphics[width=12cm]{../swag_logo.png}\\
29 29
\begin{tabular}{l r} 30 30 \begin{tabular}{l r}
Melody Jeng & System Architect \\ 31 31 Melody Jeng & System Architect \\
Arno Gau & Senior System Analyst \\ 32 32 Arno Gau & Senior System Analyst \\
Rachel Lee & Software Development Lead \\ 33 33 Rachel Lee & Software Development Lead \\
Laura Hawkins & Project Manager \\ 34 34 Laura Hawkins & Project Manager \\
Rohan Rangray & Algorithms Specialist\\ 35 35 Rohan Rangray & Algorithms Specialist\\
Andrew Buss & Database Specialist \\ 36 36 Andrew Buss & Database Specialist \\
Phuong Tran & Quality Assurance Lead \\ 37 37 Phuong Tran & Quality Assurance Lead \\
Chung Kang Wang & Business Analyst\\ 38 38 Chung Kang Wang & Business Analyst\\
Masud Rahman & User Interface Specialist\\ 39 39 Masud Rahman & User Interface Specialist\\
Kevin Mach & User Interface Specialist\\ 40 40 Kevin Mach & User Interface Specialist\\
\end{tabular} 41 41 \end{tabular}
\end{center} 42 42 \end{center}
\newpage 43 43 \newpage
\tableofcontents 44 44 \tableofcontents
\newpage 45 45 \newpage
46 46
\section{Accounts} 47 47 \section{Accounts}
\subsection{[A1] User Registration} 48 48 \subsection{[A1] User Registration}
\begin{description}[style=multiline,leftmargin=3cm] 49 49 \begin{description}[style=multiline,leftmargin=3cm]
\item[Description]{To create flashcards and save them into decks, the system requires the user to create an account prior. The user will be able to create an account by registering.} 50 50 \item[Description]{To create flashcards and save them into decks, the system requires the user to create an account prior. The user will be able to create an account by registering.}
\item[Desired Outcome]{An account will be created for the user from the 51 51 \item[Desired Outcome]{An account will be created for the user from the
specified username, password, and email. The user will be able to log into 52 52 specified username, password, and email. The user will be able to log into
the aforementioned account.} 53 53 the aforementioned account.}
\\ 54 54 \\
\item[User Goals]{The user shall have an account to participate in the 55 55 \item[User Goals]{The user shall have an account to participate in the
application's activities.} 56 56 application's activities.}
57 57
\item[Primary Actor]{User (student)} 58 58 \item[Primary Actor]{User (student)}
59 59
\item[Dependency Use Cases]{None} 60 60 \item[Dependency Use Cases]{None}
\\ 61 61 \\
\item[Priority Level]{``Must''} 62 62 \item[Priority Level]{``Must''}
63 63
\item[Status]{Implemented} 64 64 \item[Status]{Implemented}
65 65
\item[Pre-conditions]{None} 66 66 \item[Pre-conditions]{None}
67 67
\item[Post-conditions] 68 68 \item[Post-conditions]{The user has an account registered with the system.}
69 69
\begin{itemize} 70
\itemsep1pt\parskip0pt\parsep0pt 71
\item 72
{The user has an account registered with the system.} 73
\end{itemize} 74
75
\item[Trigger]{The user wants to create an account.} 76 70 \item[Trigger]{The user wants to create an account.}
77 71
\item[Workflow] 78 72 \item[Workflow]
79 73
\begin{enumerate} 80 74 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 81 75 \itemsep1pt\parskip0pt\parsep0pt
\item 82 76 \item
{The frontend renders the login form described in login.html.} 83 77 {The frontend renders the login form described in login.html.}
\item 84 78 \item
{The user shall click the sign up tab.} 85 79 {The user shall click the sign up tab.}
\item 86 80 \item
{The frontend shall render a registration form and display it to the user.} 87 81 {The frontend shall render a registration form and display it to the user.}
\item 88 82 \item
{The user shall fill in the form.} 89 83 {The user shall fill in the form.}
\item 90 84 \item
{The frontend checks that the provided email is not invalid, and that 91 85 {The frontend checks that the provided email is not invalid, and that
the password is not invalid. If anything is not valid, it displays an 92 86 the password is not invalid. If anything is not valid, it displays an
error and returns this to the user. } 93 87 error and returns this to the user. }
\item 94 88 \item
{If the form is valid, the frontend POSTs the form in JSON format to the 95 89 {If the form is valid, the frontend POSTs the form in JSON format to the
backend API at /api/verify\_email/.} 96 90 backend API at /api/verify\_email/.}
\item 97 91 \item
{The backend deserializes and validates the data in /api/register. If it's not valid, it returns an error to the frontend.} 98 92 {The backend deserializes and validates the data in /api/register. If it's not valid, it returns an error to the frontend.}
\item 99 93 \item
{The backend creates a new user object from the provided data, filling 100 94 {The backend creates a new user object from the provided data, filling
in the email and password fields in models.py in model method create\_user.} 101 95 in the email and password fields in models.py in model method create\_user.}
\item 102 96 \item
{The backend saves the user object in models.py.} 103 97 {The backend saves the user object in models.py.}
\item 104 98 \item
{The backend marks the user's email as unverified.} 105 99 {The backend marks the user's email as unverified.}
\item 106 100 \item
{The backend sends an email to the user's address with a link to validate the user's email address from models.py in function send\_confirmation\_email.} 107 101 {The backend sends an email to the user's address with a link to validate the user's email address from models.py in function send\_confirmation\_email.}
\item 108 102 \item
{The backend responds with success and logs the user in on a new session for the User.} 109 103 {The backend responds with success and logs the user in on a new session for the User.}
\item 110 104 \item
{The frontend reports success to the user and stores the sessionid for future requests.} 111 105 {The frontend reports success to the user and stores the sessionid for future requests.}
\end{enumerate} 112 106 \end{enumerate}
113 107
{Verification Workflow:} 114 108 {Verification Workflow:}
115 109
\begin{enumerate} 116 110 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 117 111 \itemsep1pt\parskip0pt\parsep0pt
\item 118 112 \item
{The user receives an email with a link to verify their email. The user clicks the link} 119 113 {The user receives an email with a link to verify their email. The user clicks the link}
\item 120 114 \item
{The frontend in VerifyEmailController submits a POST request to the backend.} 121 115 {The frontend in VerifyEmailController submits a POST request to the backend.}
\item 122 116 \item
{The backend validates the code in views.py in function veryify\_email. If the code is not valid, it returns an error to the frontend.} 123 117 {The backend validates the code in views.py in function veryify\_email. If the code is not valid, it returns an error to the frontend.}
\item 124 118 \item
{The backend marks the user's email as confirmed and saves the user object 125 119 {The backend marks the user's email as confirmed and saves the user object
again in models.py in function confirm\_email. The user's account is now active.} 126 120 again in models.py in function confirm\_email. The user's account is now active.}
\item 127 121 \item
{The frontend's VerifyEmailController.js reports success and logs the user in to the application.} 128 122 {The frontend's VerifyEmailController.js reports success and logs the user in to the application.}
\end{enumerate} 129 123 \end{enumerate}
130 124
\end{description} 131 125 \end{description}
132 126
\newpage 133 127 \newpage
\subsection{[A2] User Login} 134 128 \subsection{[A2] User Login}
135 129
\begin{description} 136 130 \begin{description}
\item[Description]{The user is able to login to personal account.} 137 131 \item[Description]{The user is able to login to personal account.}
138 132
\item[Desired Outcome]{The user shall be able to provide their username and 139 133 \item[Desired Outcome]{The user shall be able to provide their username and
password to access their courses and flash cards. The user shall gain 140 134 password to access their courses and flash cards. The user shall gain
access to the list of the courses they have added, and be able to review 141 135 access to the list of the courses they have added, and be able to review
the flash cards they have added to their decks.} 142 136 the flash cards they have added to their decks.}
\\ 143 137 \\
\item[User Goals]{The user wants to resume use of the site on another 144 138 \item[User Goals]{The user wants to resume use of the site on another
device, or use the site after logging out.} 145 139 device, or use the site after logging out.}
146 140
\item[Primary Actor]{User (student)} 147 141 \item[Primary Actor]{User (student)}
148 142
\item[Dependency Use Cases]{{[}A1{]} User Registration} 149 143 \item[Dependency Use Cases]{{[}A1{]} User Registration}
\\ 150 144 \\
\item[Priority Level]{``Must''} 151 145 \item[Priority Level]{``Must''}
152 146
\item[Status]{Implemented} 153 147 \item[Status]{Implemented}
154 148
\item[Pre-conditions] 155 149 \item[Pre-conditions]
156 150
\begin{itemize} 157 151 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 158 152 \itemsep1pt\parskip0pt\parsep0pt
\item 159 153 \item
{The user has registered an account.} 160 154 {The user has registered an account.}
{The user knows their email and password.} 161 155 {The user knows their email and password.}
\end{itemize} 162 156 \end{itemize}
163 157
\item[Post-conditions] 164 158 \item[Post-conditions]
165 159
\begin{itemize} 166 160 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 167 161 \itemsep1pt\parskip0pt\parsep0pt
\item 168 162 \item
{The user can navigate the site and see their data.} 169 163 {The user can navigate the site and see their data.}
\end{itemize} 170 164 \end{itemize}
171 165
\item[Trigger]{The user wants to use the application and its core features.} 172 166 \item[Trigger]{The user wants to use the application and its core features.}
173 167
\item[Workflow] 174 168 \item[Workflow]
175 169
\begin{enumerate} 176 170 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 177 171 \itemsep1pt\parskip0pt\parsep0pt
\item 178 172 \item
{The frontend shall render the login form described in login.html and implemented in LoginController.js} 179 173 {The frontend shall render the login form described in login.html and implemented in LoginController.js}
\item 180 174 \item
{The user shall type in their email and password.} 181 175 {The user shall type in their email and password.}
\item 182 176 \item
{The backend shall verify that the user has submitted their email and password in views.py in function login.} 183 177 {The backend shall verify that the user has submitted their email and password in views.py in function login.}
\item 184 178 \item
{The backend shall check that the user is active in views.py in function login.} 185 179 {The backend shall check that the user is active in views.py in function login.}
\item 186 180 \item
{The backend shall log the user in using the Django login feature.} 187 181 {The backend shall log the user in using the Django login feature.}
\item 188 182 \item
{The frontend shall displays the home page for the user.} 189 183 {The frontend shall displays the home page for the user.}
\end{enumerate} 190 184 \end{enumerate}
\end{description} 191 185 \end{description}
\newpage 192 186 \newpage
193 187
\subsection{[A3] Add a Class} 194 188 \subsection{[A3] Add a Class}
\begin{description} 195 189 \begin{description}
\item[Description]{The user shall be able to add a class and access the 196 190 \item[Description]{The user shall be able to add a class and access the
flashcards associated with that class.} 197 191 flashcards associated with that class.}
198 192
\item[Desired Outcome]{The class shall be connected to the student's account 199 193 \item[Desired Outcome]{The class shall be connected to the student's account
and the user shall have the ability to read and publish flashcards 200 194 and the user shall have the ability to read and publish flashcards
for this class.} 201 195 for this class.}
\\ 202 196 \\
\item[User Goals]{The user wants to publish flashcards for this class, and 203 197 \item[User Goals]{The user wants to publish flashcards for this class, and
read the flashcards for this class that are published by other users.} 204 198 read the flashcards for this class that are published by other users.}
205 199
\item[Primary Actor]{User (student)} 206 200 \item[Primary Actor]{User (student)}
207 201
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 208 202 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 209 203 Login}
\\ 210 204 \\
\item[Priority Level]{``Must''} 211 205 \item[Priority Level]{``Must''}
212 206
\item[Status]{Implemented} 213 207 \item[Status]{Implemented}
214 208
\item[Pre-conditions] 215 209 \item[Pre-conditions]
216 210
\begin{itemize} 217 211 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 218 212 \itemsep1pt\parskip0pt\parsep0pt
\item 219 213 \item
{The user has registered an account.} 220 214 {The user has registered an account.}
\item 221 215 \item
{The user has successfully logged in to the application.} 222 216 {The user has successfully logged in to the application.}
\end{itemize} 223 217 \end{itemize}
224 218
\item[Post-conditions] 225 219 \item[Post-conditions]
226 220
\begin{itemize} 227 221 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 228 222 \itemsep1pt\parskip0pt\parsep0pt
\item 229 223 \item
{The user can view the flashcards being published for the class and 230 224 {The user can view the flashcards being published for the class and
add them to their deck.} 231 225 add them to their deck.}
\item 232 226 \item
{The user can publish flashcards to be viewed and added by other users 233 227 {The user can publish flashcards to be viewed and added by other users
in the same class.} 234 228 in the same class.}
\end{itemize} 235 229 \end{itemize}
236 230
\item[Trigger]{The user wants to make flashcards and view flashcards for a class.} 237 231 \item[Trigger]{The user wants to make flashcards and view flashcards for a class.}
238 232
\item[Workflow] 239 233 \item[Workflow]
240 234
\begin{enumerate} 241 235 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 242 236 \itemsep1pt\parskip0pt\parsep0pt
\item 243 237 \item
{The user shall click "Add a Class" from the "Classes" drop down menu in the upper left hand corner.} 244 238 {The user shall click "Add a Class" from the "Classes" drop down menu in the upper left hand corner.}
\item 245 239 \item
{The frontend shall navigate to the new page described by addclass.html.} 246 240 {The frontend shall navigate to the new page described by addclass.html.}
\item 247 241 \item
{The user shall begin to type the class department code, course title, course number, or instructor in the text box.} 248 242 {The user shall begin to type the class department code, course title, course number, or instructor in the text box.}
\item 249 243 \item
{The frontend in ClassAddController.js shall send a get request to the backend at api/sections/search/.} 250 244 {The frontend in ClassAddController.js shall send a get request to the backend at api/sections/search/.}
\item 251 245 \item
{The backend shall search the database for the classes matching department code, course title, course number, or instructor in models.py in function search.} 252 246 {The backend shall search the database for the classes matching department code, course title, course number, or instructor in models.py in function search.}
\item 253 247 \item
{The frontend shall show the classes that the backend has found.} 254 248 {The frontend shall show the classes that the backend has found.}
\item 255 249 \item
{The user shall select from the classes the one that they want to add.} 256 250 {The user shall select from the classes the one that they want to add.}
\item 257 251 \item
{The frontend shall enable the 'Add Class' button.} 258 252 {The frontend shall enable the 'Add Class' button.}
\item 259 253 \item
{The user shall click 'Add Class' button to the right of the text box.} 260 254 {The user shall click 'Add Class' button to the right of the text box.}
\item 261 255 \item
{The frontend shall send a post request to api/sections/.} 262 256 {The frontend shall send a post request to api/sections/.}
\item 263 257 \item
{The backend shall in views.py in function enroll shall call the method enroll in models.py.} 264 258 {The backend shall in views.py in function enroll shall call the method enroll in models.py.}
\item 265 259 \item
{The backend in models.py in function enroll shall add the class to the User's sections.} 266 260 {The backend in models.py in function enroll shall add the class to the User's sections.}
\item 267 261 \item
{The frontend shall redirect the user to the class's Live Feed using the ClassAddController.js.} 268 262 {The frontend shall redirect the user to the class's Live Feed using the ClassAddController.js.}
\item 269 263 \item
{The frontend shall present the live feed for the class by using feed.html and FeedController.js.} 270 264 {The frontend shall present the live feed for the class by using feed.html and FeedController.js.}
271 265
\end{enumerate} 272 266 \end{enumerate}
273 267
\item[Alternate Workflow: User is whitelisted.\\] 274 268 \item[Alternate Workflow: User is whitelisted.\\]
\begin{enumerate} 275 269 \begin{enumerate}
\setcounter{enumi}{3} 276 270 \setcounter{enumi}{3}
\itemsep1pt\parskip0pt\parsep0pt 277 271 \itemsep1pt\parskip0pt\parsep0pt
\item []{ Precondition: The class has a whitelist, a whitelist is a list of email addresses that can add themselves to the class.\\} 278 272 \item []{ Precondition: The class has a whitelist, a whitelist is a list of email addresses that can add themselves to the class.\\}
\item 279 273 \item
{The user shall select their desired class, which has a whitelist, by clicking on ``Add Class''.} 280 274 {The user shall select their desired class, which has a whitelist, by clicking on ``Add Class''.}
\item 281 275 \item
{The frontend shall submit a POST request to /api/me/sections with 282 276 {The frontend shall submit a POST request to /api/me/sections with
the course ID that the User typed. } 283 277 the course ID that the User typed. }
\item 284 278 \item
{The backend shall check if there is a whitelist for the class that the 285 279 {The backend shall check if there is a whitelist for the class that the
user has selected in models.py at function is\_whitelisted.} 286 280 user has selected in models.py at function is\_whitelisted.}
\item 287 281 \item
{The backend shall check if the user is on the whitelist in models.py 288 282 {The backend shall check if the user is on the whitelist in models.py
in function is\_user\_on\_whitelist.} 289 283 in function is\_user\_on\_whitelist.}
\item 290 284 \item
{The backend shall add the user to the class following steps above.} 291 285 {The backend shall add the user to the class following steps above.}
\item 292 286 \item
{The frontend shall redirect the user to the class's live feed followed the last step in the Workflow above.} 293 287 {The frontend shall redirect the user to the class's live feed followed the last step in the Workflow above.}
\end{enumerate} 294 288 \end{enumerate}
295 289
\item[Alternate Workflow: User is not whitelisted.] 296 290 \item[Alternate Workflow: User is not whitelisted.]
\begin{enumerate} 297 291 \begin{enumerate}
\setcounter{enumi}{7} 298 292 \setcounter{enumi}{7}
\itemsep1pt\parskip0pt\parsep0pt 299 293 \itemsep1pt\parskip0pt\parsep0pt
\item []{ Precondition: The class has a whitelist, a whitelist is a list of email addresses that can add themselves to the class.\\} 300 294 \item []{ Precondition: The class has a whitelist, a whitelist is a list of email addresses that can add themselves to the class.\\}
\item 301 295 \item
{The backend shall will check that the user is in the whitelist in models.py.} 302 296 {The backend shall will check that the user is in the whitelist in models.py.}
\item 303 297 \item
{The frontend shall display that the class is whitelisted and the Add Class button will not be enabled.} 304 298 {The frontend shall display that the class is whitelisted and the Add Class button will not be enabled.}
\end{enumerate} 305 299 \end{enumerate}
306 300
\end{description} 307 301 \end{description}
{} 308 302 {}
309 303
\newpage 310 304 \newpage
311 305
{} 312 306 {}
313 307
\subsection{[A4] Drop a Class} 314 308 \subsection{[A4] Drop a Class}
315 309
\begin{description} 316 310 \begin{description}
\item[Description]{The user can remove themselves from a course he/she is 317 311 \item[Description]{The user can remove themselves from a course he/she is
registered to} 318 312 registered to}
319 313
\item[Desired Outcome]{The user has dropped the class and no longer need 320 314 \item[Desired Outcome]{The user has dropped the class and no longer need
access to the flashcards for said class. This means they can no longer 321 315 access to the flashcards for said class. This means they can no longer
see the flashcards associated to the class that they dropped } 322 316 see the flashcards associated to the class that they dropped }
\\ 323 317 \\
\item[User Goals]{The user shall not have access to a class and the 324 318 \item[User Goals]{The user shall not have access to a class and the
flashcards associated with that class. They will no longer see the class 325 319 flashcards associated with that class. They will no longer see the class
listed in their drop down menu.} 326 320 listed in their drop down menu.}
327 321
\item[Primary Actor]{User (student)} 328 322 \item[Primary Actor]{User (student)}
329 323
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 330 324 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 331 325 Login, {[}A3{]} Add a Class}
\\ 332 326 \\
\item[Priority Level]{ ``Should''} 333 327 \item[Priority Level]{ ``Should''}
334 328
\item[Status]{Implemented } 335 329 \item[Status]{Implemented }
336 330
\item[Pre-conditions] 337 331 \item[Pre-conditions]
338 332
\begin{itemize} 339 333 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 340 334 \itemsep1pt\parskip0pt\parsep0pt
\item 341 335 \item
{The user has a valid account.} 342 336 {The user has a valid account.}
\item 343 337 \item
{The user is logged in.} 344 338 {The user is logged in.}
\item 345 339 \item
{The user has enrolled in at least one class.} 346 340 {The user has enrolled in at least one class.}
\item 347 341 \item
{The user has navigated to the Settings page.} 348 342 {The user has navigated to the Settings page.}
\end{itemize} 349 343 \end{itemize}
350 344
\item[Post-conditions]{} 351 345 \item[Post-conditions]{}
352 346
\begin{itemize} 353 347 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 354 348 \itemsep1pt\parskip0pt\parsep0pt
\item 355 349 \item
{The user shall no longer have access to dropped class, or associated 356 350 {The user shall no longer have access to dropped class, or associated
flashcards} 357 351 flashcards}
\end{itemize} 358 352 \end{itemize}
359 353
\item[Trigger]{The user no longer wants to see flashcards from that class.} 360 354 \item[Trigger]{The user no longer wants to see flashcards from that class.}
361 355
\item[Workflow] 362 356 \item[Workflow]
363 357
\begin{enumerate} 364 358 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 365 359 \itemsep1pt\parskip0pt\parsep0pt
\item 366 360 \item
{The user shall click `Drop' button to the right of the class they wish to drop.} 367 361 {The user shall click `Drop' button to the right of the class they wish to drop.}
\item 368 362 \item
{The frontend shall submit a DELETE request to 369 363 {The frontend shall submit a DELETE request to
/api/me/sections/\textless{}section ID number\textgreater{}.} 370 364 /api/me/sections/\textless{}section ID number\textgreater{}.}
\item 371 365 \item
{The backend shall check that the user is enrolled in the section in models.py in function drop.} 372 366 {The backend shall check that the user is enrolled in the section in models.py in function drop.}
\item 373 367 \item
{The server shall remove the selected class from a user's list of section in models.py in function drop.} 374 368 {The server shall remove the selected class from a user's list of section in models.py in function drop.}
\item 375 369 \item
{The frontend shall remove the class from the list in setting and show toast reading 'Dropped'.} 376 370 {The frontend shall remove the class from the list in setting and show toast reading 'Dropped'.}
\end{enumerate} 377 371 \end{enumerate}
\end{description} 378 372 \end{description}
\newpage 379 373 \newpage
380 374
{} 381 375 {}
382 376
\subsection{[A5] Password change} 383 377 \subsection{[A5] Password change}
384 378
\begin{description} 385 379 \begin{description}
\item[Description]{The user shall be able to change the password for their 386 380 \item[Description]{The user shall be able to change the password for their
account in the account settings. } 387 381 account in the account settings. }
388 382
\item[Desired Outcome]{The user's password shall be changed and the User 389 383 \item[Desired Outcome]{The user's password shall be changed and the User
shall be able to log in with the new password in the future} 390 384 shall be able to log in with the new password in the future}
\\\\ 391 385 \\\\
\item[User Goals]{The User wants to use a different password in the future} 392 386 \item[User Goals]{The User wants to use a different password in the future}
393 387
\item[Primary Actor]{User (student)} 394 388 \item[Primary Actor]{User (student)}
395 389
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 396 390 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 397 391 Login}
\\ 398 392 \\
\item[Details]{The user provides their current password and a new password 399 393 \item[Details]{The user provides their current password and a new password
in a form. If the current password is correct, the system updates their 400 394 in a form. If the current password is correct, the system updates their
password to the requested new password.} 401 395 password to the requested new password.}
402 396
\item[Priority Level]{``Must''} 403 397 \item[Priority Level]{``Must''}
404 398
\item[Status]{Implemented} 405 399 \item[Status]{Implemented}
406 400
\item[Pre-conditions] 407 401 \item[Pre-conditions]
408 402
\begin{itemize} 409 403 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 410 404 \itemsep1pt\parskip0pt\parsep0pt
\item 411 405 \item
{The user has registered an account.} 412 406 {The user has registered an account.}
\item 413 407 \item
{The user has logged in.} 414 408 {The user has logged in.}
\item 415 409 \item
{The user knows their current password.} 416 410 {The user knows their current password.}
\item 417 411 \item
{The user has navigated to the Settings page.} 418 412 {The user has navigated to the Settings page.}
\end{itemize} 419 413 \end{itemize}
420 414
\item[Post-conditions] 421 415 \item[Post-conditions]
422 416
\begin{itemize} 423 417 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 424 418 \itemsep1pt\parskip0pt\parsep0pt
\item 425 419 \item
{The user's password is changed} 426 420 {The user's password is changed}
\item 427 421 \item
{The user can log in with the new password} 428 422 {The user can log in with the new password}
\end{itemize} 429 423 \end{itemize}
430 424
\item[Trigger]{The user wants to change their password.} 431 425 \item[Trigger]{The user wants to change their password.}
432 426
\item[Error Handling] 433 427 \item[Error Handling]
\begin{description} 434 428 \begin{description}
\item[\small Missing Fields] \begin{itemize} 435 429 \item[\small Missing Fields] \begin{itemize}
\item The frontend shall enforce required fields 436 430 \item The frontend shall enforce required fields
\item The backend will return an HTTP Bad Request error to the frontend. 437 431 \item The backend will return an HTTP Bad Request error to the frontend.
\end{itemize} 438 432 \end{itemize}
\item[\small Incorrect Old Password] \begin{itemize} 439 433 \item[\small Incorrect Old Password] \begin{itemize}
\item The backend will return an HTTP Forbidden error to the frontend. 440 434 \item The backend will return an HTTP Forbidden error to the frontend.
\end{itemize} 441 435 \end{itemize}
\item[\small Blank New Password] \begin{itemize} 442 436 \item[\small Blank New Password] \begin{itemize}
\item The backend will return an HTTP Bad Request error to the frontend. 443 437 \item The backend will return an HTTP Bad Request error to the frontend.
\end{itemize} 444 438 \end{itemize}
\end{description} 445 439 \end{description}
\item[Workflow] 446 440 \item[Workflow]
447 441
\begin{enumerate} 448 442 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 449 443 \itemsep1pt\parskip0pt\parsep0pt
\item 450 444 \item
{The frontend shall render a form that requires the user to enter their 451 445 {The frontend shall render a form that requires the user to enter their
old password and new password from settings.html} 452 446 old password and new password from settings.html}
\item 453 447 \item
{The user shall type in their current password, the desired new 454 448 {The user shall type in their current password, the desired new
password, and retype the desired new password to confirm.} 455 449 password, and retype the desired new password to confirm.}
\item 456 450 \item
{The frontend shall submit the data to the server by sending a PATCH 457 451 {The frontend shall submit the data to the server by sending a PATCH
request to /api/me containing ``old\_password'' and 458 452 request to /api/me containing ``old\_password'' and
``new\_password'' values in SettingsController.js.} 459 453 ``new\_password'' values in SettingsController.js.}
\item (The ) 460 454 \item (The )
\item 461 455 \item
{The backend shall check the user's current password in views.py in function patch under UserDetail.} 462 456 {The backend shall check the user's current password in views.py in function patch under UserDetail.}
\item The backend shall update the user's current password in views.py in function patch under UserDetail. 463 457 \item The backend shall update the user's current password in views.py in function patch under UserDetail.
\item 464 458 \item
{The frontend shall present a toast reading "Password successfully changed" and redirect the user to the Add a Class page.} 465 459 {The frontend shall present a toast reading "Password successfully changed" and redirect the user to the Add a Class page.}
\end{enumerate} 466 460 \end{enumerate}
\end{description} 467 461 \end{description}
{} 468 462 {}
469 463
\newpage 470 464 \newpage
471 465
{} 472 466 {}
473 467
\subsection{[A6] Password reset} 474 468 \subsection{[A6] Password reset}
475 469
\begin{description} 476 470 \begin{description}
\item[Description]{The user shall be able to reset their password without 477 471 \item[Description]{The user shall be able to reset their password without
being logged in.} 478 472 being logged in.}
479 473
\item[Desired Outcome]{The user's password shall be changed to one that 480 474 \item[Desired Outcome]{The user's password shall be changed to one that
they remember.} 481 475 they remember.}
\\ 482 476 \\
\item[User Goals]{The user will be able to log into the site with a new password.} 483 477 \item[User Goals]{The user will be able to log into the site with a new password.}
484 478
\item[Primary Actor]{User (student)} 485 479 \item[Primary Actor]{User (student)}
486 480
\item[Dependency Use Cases]{{[}A1{]} User Registration} 487 481 \item[Dependency Use Cases]{{[}A1{]} User Registration}
\\ 488 482 \\
\item[Details]{The user provides their email in a password reset form. If 489 483 \item[Details]{The user provides their email in a password reset form. If
the address is valid, the site sends a password reset link with a random 490 484 the address is valid, the site sends a password reset link with a random
token to that address. If the address is invalid, the site does not send 491 485 token to that address. If the address is invalid, the site does not send
a link. For security reasons, we do not reveal to the User whether the 492 486 a link. For security reasons, we do not reveal to the User whether the
email address was valid, and we expire the link after 24 hours. When a 493 487 email address was valid, and we expire the link after 24 hours. When a
user visits the link emailed to them, they are able to specify a new 494 488 user visits the link emailed to them, they are able to specify a new
password in a form. When they submit the form, their password is updated 495 489 password in a form. When they submit the form, their password is updated
if the token is correct. } 496 490 if the token is correct. }
497 491
\item[Priority Level]{``Must''} 498 492 \item[Priority Level]{``Must''}
499 493
\item[Status]{Implemented} 500 494 \item[Status]{Implemented}
501 495
\item[Pre-conditions] 502 496 \item[Pre-conditions]
503 497
\begin{itemize} 504 498 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 505 499 \itemsep1pt\parskip0pt\parsep0pt
\item 506 500 \item
{The user has created an account before.} 507 501 {The user has created an account before.}
\item 508 502 \item
{The user knows the email address attached to their account for our application.} 509 503 {The user knows the email address attached to their account for our application.}
\item 510 504 \item
{The user can log into their email account.} 511 505 {The user can log into their email account.}
\end{itemize} 512 506 \end{itemize}
513 507
\item[Post-conditions] 514 508 \item[Post-conditions]
515 509
\begin{itemize} 516 510 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 517 511 \itemsep1pt\parskip0pt\parsep0pt
\item 518 512 \item
{The user's password is changed.} 519 513 {The user's password is changed.}
\item 520 514 \item
{The user can log in with the new password.} 521 515 {The user can log in with the new password.}
\end{itemize} 522 516 \end{itemize}
523 517
\item[Trigger]{The user wants to log into the site but does not know their password.} 524 518 \item[Trigger]{The user wants to log into the site but does not know their password.}
\item[Workflow] 525 519 \item[Workflow]
526 520
\begin{enumerate} 527 521 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 528 522 \itemsep1pt\parskip0pt\parsep0pt
\item 529 523 \item
{The User clicks ``Forgot Password'' text on the login page} 530 524 {The User clicks ``Forgot Password'' text on the login page}
\item 531 525 \item
{The frontend shall render the password reset page from the template requestpasswordreset.html.} 532 526 {The frontend shall render the password reset page from the template requestpasswordreset.html.}
\item 533 527 \item
{The user shall type in their email address for their account and click the "Reset" button.} 534 528 {The user shall type in their email address for their account and click the "Reset" button.}
\item 535 529 \item
{The frontend shall send a POST request to /api/request\_password\_reset/ from RequestResetController.js.} 536 530 {The frontend shall send a POST request to /api/request\_password\_reset/ from RequestResetController.js.}
\item 537 531 \item
{The backend shall check if an account exists with the email entered by 538 532 {The backend shall check if an account exists with the email entered by
the User in views.py in function request\_password\_reset.} 539 533 the User in views.py in function request\_password\_reset.}
\item 540 534 \item
{The backend shal send an email to the User with a link to the password reset page in models.py in function 541 535 {The backend shal send an email to the User with a link to the password reset page in models.py in function
request\_password\_reset.} 542 536 request\_password\_reset.}
\item 543 537 \item
{The user will navigate to their email account, open the email, and click the link.} 544 538 {The user will navigate to their email account, open the email, and click the link.}
\item 545 539 \item
{The frontend shall render the password reset page from the template resetpassword.html.} 546 540 {The frontend shall render the password reset page from the template resetpassword.html.}
\item 547 541 \item
{The user shall type in their new password and re-type it to confirm it.} 548 542 {The user shall type in their new password and re-type it to confirm it.}
\item 549 543 \item
{The frontend shall check if the new password is long enough and if the confirmed password is the same as the new password in ResetPasswordController.js.} 550 544 {The frontend shall check if the new password is long enough and if the confirmed password is the same as the new password in ResetPasswordController.js.}
\item 551 545 \item
{The frontend shall send a POST request to /api/reset\_password from ResetPasswordController.js.} 552 546 {The frontend shall send a POST request to /api/reset\_password from ResetPasswordController.js.}
\item 553 547 \item
{The backend shall change the user's password in views.py in function reset\_password.} 554 548 {The backend shall change the user's password in views.py in function reset\_password.}
\item 555 549 \item
{The frontend shall redirect the User to the login page. } 556 550 {The frontend shall redirect the User to the login page. }
\item 557 551 \item
{The user shall use their new password to login to the application.} 558 552 {The user shall use their new password to login to the application.}
\end{enumerate} 559 553 \end{enumerate}
\end{description} 560 554 \end{description}
\newpage 561 555 \newpage
562 556
{} 563 557 {}
564 558
\subsection{[A7] Limit Student Access to Courses} 565 559 \subsection{[A7] Limit Student Access to Courses}
566 560
\begin{description} 567 561 \begin{description}
\item[Description]{The instructor shall be able to limit access to the courses that they are in charge of by whitelisting only those students that are actually in the class.} 568 562 \item[Description]{The instructor shall be able to limit access to the courses that they are in charge of by whitelisting only those students that are actually in the class.}
569 563
\item[Desired Outcome]{The class will have limited access and only those Users who are whitelisted may enroll in the class.} 570 564 \item[Desired Outcome]{The class will have limited access and only those Users who are whitelisted may enroll in the class.}
\\ 571 565 \\
\item[User Goals]{The instructor wants to limit access to their class so only 572 566 \item[User Goals]{The instructor wants to limit access to their class so only
the students who are actually in their class participate, and nobody else.} 573 567 the students who are actually in their class participate, and nobody else.}
574 568
\item[Primary Actor]{Instructor} 575 569 \item[Primary Actor]{Instructor}
576 570
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 577 571 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 578 572 Login}
\\ 579 573 \\
\item[Priority Level]{``Should''} 580 574 \item[Priority Level]{``Should''}
581 575
\item[Status]{Implemented} 582 576 \item[Status]{Implemented}
583 577
\item[Pre-conditions] 584 578 \item[Pre-conditions]
585 579
\begin{itemize} 586 580 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 587 581 \itemsep1pt\parskip0pt\parsep0pt
\item 588 582 \item
{The user has valid instructor's account} 589 583 {The user has valid instructor's account}
\end{itemize} 590 584 \end{itemize}
591 585
\item[Post-conditions] 592 586 \item[Post-conditions]
593 587
\begin{itemize} 594 588 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 595 589 \itemsep1pt\parskip0pt\parsep0pt
\item 596 590 \item
{Only those users who were whitelisted may add the class.} 597 591 {Only those users who were whitelisted may add the class.}
\end{itemize} 598 592 \end{itemize}
599 593
\item[Trigger]{The course instructor wants to limit the students who 600 594 \item[Trigger]{The course instructor wants to limit the students who
can add their class on our application.} 601 595 can add their class on our application.}
602 596
\item[Workflow] 603 597 \item[Workflow]
604 598
\begin{enumerate} 605 599 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 606 600 \itemsep1pt\parskip0pt\parsep0pt
\item 607 601 \item
{The instructor emails the administrators from their UCSD email address 608 602 {The instructor emails the administrators from their UCSD email address
and requests to limit access to their course. They provides a list of 609 603 and requests to limit access to their course. They provides a list of
emails of the students that are to be whitelisted.} 610 604 emails of the students that are to be whitelisted.}
\item 611 605 \item
{The administrators visit a custom admin page, select the course, and 612 606 {The administrators visit a custom admin page, select the course, and
paste the list of emails. They submit the page directly (no separate 613 607 paste the list of emails. They submit the page directly (no separate
frontend here) to the server.} 614 608 frontend here) to the server.}
\item 615 609 \item
{The backend shall create a WhitelistedAddress for each provided email, 616 610 {The backend shall create a WhitelistedAddress for each provided email,
attaching it to the section taught by the instructor.} 617 611 attaching it to the section taught by the instructor.}
\item 618 612 \item
{The backend shall add any existing users whose email addresses appear 619 613 {The backend shall add any existing users whose email addresses appear
in the whitelist to the class.} 620 614 in the whitelist to the class.}
\end{enumerate} 621 615 \end{enumerate}
\end{description} 622 616 \end{description}
\newpage 623 617 \newpage
624 618
\subsection{[A8] User Logout} 625 619 \subsection{[A8] User Logout}
626 620
\begin{description} 627 621 \begin{description}
\item[Description]{The user shall be able to log out of their account on 628 622 \item[Description]{The user shall be able to log out of their account on
the site.} 629 623 the site.}
630 624
\item[Desired Outcome]{The user's information and data will no longer be 631 625 \item[Desired Outcome]{The user's information and data will no longer be
accessible after logging out. } 632 626 accessible after logging out. }
\\ 633 627 \\
\item[User Goals]{The user is done with his/her session of using the 634 628 \item[User Goals]{The user is done with his/her session of using the
website, and wants to make sure others cannot access the data in their 635 629 website, and wants to make sure others cannot access the data in their
account.} 636 630 account.}
637 631
\item[Primary Actor]{User (student)} 638 632 \item[Primary Actor]{User (student)}
639 633
\item[Dependency Use Cases] None 640 634 \item[Dependency Use Cases] None
\\ 641 635 \\
\item[Priority Level]{``Must''} 642 636 \item[Priority Level]{``Must''}
643 637
\item[Status]{Implemented} 644 638 \item[Status]{Implemented}
645 639
\item[Pre-conditions]{The user is logged into their account} 646 640 \item[Pre-conditions]{The user is logged into their account}
647 641
\item[Post-conditions]{}{The user's data can no longer be accessed.} 648 642 \item[Post-conditions]{}{The user's data can no longer be accessed.}
649 643
\item[Trigger]{The user no longer wants to be logged into the application.} 650 644 \item[Trigger]{The user no longer wants to be logged into the application.}
651 645
\item[Workflow] 652 646 \item[Workflow]
653 647
\begin{enumerate} 654 648 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 655 649 \itemsep1pt\parskip0pt\parsep0pt
\item 656 650 \item
{The user clicks the 'Logout' button in the upper right hand corner.} 657 651 {The user clicks the 'Logout' button in the upper right hand corner.}
\item 658 652 \item
{The backend shall log the user out using the Django logout feature.} 659 653 {The backend shall log the user out using the Django logout feature.}
\item 660 654 \item
{The frontend renders the application login page using login.html.} 661 655 {The frontend renders the application login page using login.html.}
\end{enumerate} 662 656 \end{enumerate}
663 657
\end{description} 664 658 \end{description}
665 659
\newpage 666 660 \newpage
667 661
668 662
669 663
\subsection{[A9] Contact Admin} 670 664 \subsection{[A9] Contact Admin}
671 665
\begin{description} 672 666 \begin{description}
\item[Description]{The user shall be able to contact the admin.} 673 667 \item[Description]{The user shall be able to contact the admin.}
674 668
\item[Desired Outcome]{The user shall send a message to the admin; the 675 669 \item[Desired Outcome]{The user shall send a message to the admin; the
admin shall receive the message.} 676 670 admin shall receive the message.}
677 671
{User Goals:}{The user sends a message to the admin.} 678 672 {User Goals:}{The user sends a message to the admin.}
679 673
\item[Primary Actor]{User} 680 674 \item[Primary Actor]{User}
681 675
\item[Dependency Use Cases]{None} 682 676 \item[Dependency Use Cases]{None}
\\ 683 677 \\
\item[Priority Level]{``Must''} 684 678 \item[Priority Level]{``Must''}
685 679
\item[Status]{Implemented} 686 680 \item[Status]{Implemented}
687 681
\item[Pre-conditions]{None.} 688 682 \item[Pre-conditions]{None.}
689 683
\item[Post-conditions]{The admin receives the user's message.} 690 684 \item[Post-conditions]{The admin receives the user's message.}
691 685
\item[Trigger]{The user wants to contact the adiminstators of the site with 692 686 \item[Trigger]{The user wants to contact the adiminstators of the site with
bug reports, questions, or praise. } 693 687 bug reports, questions, or praise. }
694 688
\item[Workflow] 695 689 \item[Workflow]
696 690
\begin{enumerate} 697 691 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 698 692 \itemsep1pt\parskip0pt\parsep0pt
\item 699 693 \item
{The user shall click the '?' button in the right corner of the navigation bar.} 700 694 {The user shall click the '?' button in the right corner of the navigation bar.}
\item 701 695 \item
{The frontend shall render the page using the help.html template.} 702 696 {The frontend shall render the page using the help.html template.}
\item 703 697 \item
{The user shall scroll to the bottom of the page.} 704 698 {The user shall scroll to the bottom of the page.}
\item 705 699 \item
{The user shall click the text reading "Send Us an Email!"} 706 700 {The user shall click the text reading "Send Us an Email!"}
\item 707 701 \item
{The frontend shall open Microsoft Outlook or a similar application using the HelpController.js.} 708 702 {The frontend shall open Microsoft Outlook or a similar application using the HelpController.js.}
\item 709 703 \item
{The user shall see our email address in the recipients text box.} 710 704 {The user shall see our email address in the recipients text box.}
\end{enumerate} 711 705 \end{enumerate}
\end{description} 712 706 \end{description}
\newpage 713 707 \newpage
714 708
{} 715 709 {}
\section{Flashcards} 716 710 \section{Flashcards}
\subsection{[F1] Push Flashcard} 717 711 \subsection{[F1] Push Flashcard}
718 712
\begin{description} 719 713 \begin{description}
\item[Description]{The user shall be able to create a flashcard with their 720 714 \item[Description]{The user shall be able to create a flashcard with their
input. } 721 715 input. }
722 716
\item[Desired Outcome]{The user shall have the flashcard added to their own 723 717 \item[Desired Outcome]{The user shall have the flashcard added to their own
deck and the Live Feed. } 724 718 deck and the Live Feed. }
\\ 725 719 \\
\item[User Goals]{The user will see their flashcard in their deck and the 726 720 \item[User Goals]{The user will see their flashcard in their deck and the
flashcard will be shared with others. } 727 721 flashcard will be shared with others. }
728 722
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 729 723 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 730 724 Login, {[}A3{]} Add a Class}
\\ 731 725 \\
\item[Pre-conditions] 732 726 \item[Pre-conditions]
733 727
\begin{itemize} 734 728 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 735 729 \itemsep1pt\parskip0pt\parsep0pt
\item 736 730 \item
{The user has an account.} 737 731 {The user has an account.}
\item 738 732 \item
{The user has added at least one class.} 739 733 {The user has added at least one class.}
\item 740 734 \item
{The user has navigated to the live feed for a class.} 741 735 {The user has navigated to the live feed for a class.}
\end{itemize} 742 736 \end{itemize}
743 737
\item[Post-conditions] 744 738 \item[Post-conditions]
745 739
\begin{itemize} 746 740 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 747 741 \itemsep1pt\parskip0pt\parsep0pt
\item 748 742 \item
{The user has flashcard added to their deck.} 749 743 {The user has flashcard added to their deck.}
\item 750 744 \item
{The Flashcard is shown in the Live Feed.} 751 745 {The Flashcard is shown in the Live Feed.}
\item 752 746 \item
{Other users can add this flashcard to their decks.} 753 747 {Other users can add this flashcard to their decks.}
\end{itemize} 754 748 \end{itemize}
755 749
\item[Trigger]{The user wants to make a flashcard to study.} 756 750 \item[Trigger]{The user wants to make a flashcard to study.}
757 751
\item[Workflow] 758 752 \item[Workflow]
759 753
\begin{enumerate} 760 754 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 761 755 \itemsep1pt\parskip0pt\parsep0pt
\item 762 756 \item
{The user is at the live feed for the class from feed.html.} 763 757 {The user is at the live feed for the class from feed.html.}
\item 764 758 \item
{The user shall click on the '+' button at the bottom right of the screen.} 765 759 {The user shall click on the '+' button at the bottom right of the screen.}
\item 766 760 \item
{The frontend shall present a modal for inputting the flashcard text to the User.} 767 761 {The frontend shall present a modal for inputting the flashcard text to the User.}
\item 768 762 \item
{The user shall type in the content of their flashcard.} 769 763 {The user shall type in the content of their flashcard.}
\item 770 764 \item
{The user shall highlight keywords in the flashcard text.} 771 765 {The user shall highlight keywords in the flashcard text.}
\item 772 766 \item
{The user shall click on the `Contribute' button.} 773 767 {The user shall click on the `Contribute' button.}
\item {The frontend shall generate a POST request consisting of the flashcard text, 774 768 \item {The frontend shall generate a POST request consisting of the flashcard text,
blanks, and material date, in JSON form in FeedController.js and send it to /api/flashcards/.} 775 769 blanks, and material date, in JSON form in FeedController.js and send it to /api/flashcards/.}
\item 776 770 \item
{The backend shall obtain the flashcard information by deserializing 777 771 {The backend shall obtain the flashcard information by deserializing
the JSON in the POST request in views.py.} 778 772 the JSON in the POST request in views.py.}
\item 779 773 \item
{The backend shall create a new record for this flashcard in the 780 774 {The backend shall create a new record for this flashcard in the
Flashcards table in the database in models.py.} 781 775 Flashcards table in the database in models.py.}
\item 782 776 \item
{The frontend shall publish the newly created card to the live feed of 783 777 {The frontend shall publish the newly created card to the live feed of
the class using FeedController.js.} 784 778 the class using FeedController.js.}
\end{enumerate} 785 779 \end{enumerate}
\end{description} 786 780 \end{description}
\newpage 787 781 \newpage
{} 788 782 {}
789 783
\subsection{[F2] Edit Flashcard} 790 784 \subsection{[F2] Edit Flashcard}
791 785
\begin{description} 792 786 \begin{description}
\item[Description]{The User shall be able to duplicate the flashcard authored by a different user and make changes to it.} 793 787 \item[Description]{The User shall be able to duplicate the flashcard authored by a different user and make changes to it.}
794 788
\item[Desired Outcome]{The new flashcard is edited and saved appropriately.} 795 789 \item[Desired Outcome]{The new flashcard is edited and saved appropriately.}
\\ 796 790 \\
\item[User Goals]{To create a flashcard similar to an existing flashcard but with minor changes.} 797 791 \item[User Goals]{To create a flashcard similar to an existing flashcard but with minor changes.}
798 792
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 799 793 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull 800 794 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull
Flashcard} 801 795 Flashcard}
802 796
\item[Pre-conditions] 803 797 \item[Pre-conditions]
804 798
\begin{itemize} 805 799 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 806 800 \itemsep1pt\parskip0pt\parsep0pt
\item 807 801 \item
{The flashcard to be edited is visible in the user's feed view or deck view.} 808 802 {The flashcard to be edited is visible in the user's feed view or deck view.}
\item 809 803 \item
{The user is currently in the feed view or the deck view of the course the card to be edited belongs to.} 810 804 {The user is currently in the feed view or the deck view of the course the card to be edited belongs to.}
\end{itemize} 811 805 \end{itemize}
812 806
\item[Post-conditions] 813 807 \item[Post-conditions]
814 808
\begin{itemize} 815 809 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 816 810 \itemsep1pt\parskip0pt\parsep0pt
\item 817 811 \item
{A duplicate flashcard with some differences is created.} 818 812 {A duplicate flashcard with some differences is created.}
\end{itemize} 819 813 \end{itemize}
820 814
\item[Trigger] {The User wants to duplicate a card and make some changes to it and thus create a new flashcard.} 821 815 \item[Trigger] {The User wants to duplicate a card and make some changes to it and thus create a new flashcard.}
\item[Workflow] 822 816 \item[Workflow]
823 817
\begin{enumerate} 824 818 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 825 819 \itemsep1pt\parskip0pt\parsep0pt
\item{The user shall hover over the card to be edited and and click on the 826 820 \item{The user shall hover over the card to be edited and and click on the
pencil button that appears on the bottom left of the card.} 827 821 pencil button that appears on the bottom left of the card.}
\item 828 822 \item
{The frontend shall produce an editable dialog box containing the flashcard 829 823 {The frontend shall produce an editable dialog box containing the flashcard
text } 830 824 text }
\item 831 825 \item
{The user shall make desired changes} 832 826 {The user shall make desired changes}
\item 833 827 \item
{The user shall click `Save Changes'} 834 828 {The user shall click `Save Changes'}
\item 835 829 \item
{The client shall generate a PATCH request for a new flashcard in CardGridController.js 836 830 {The client shall generate a PATCH request for a new flashcard in CardGridController.js
and send it to the server at /api/flashcards/} 837 831 and send it to the server at /api/flashcards/}
\item 838 832 \item
{If the user changed only the blanks of the cards, the server shall 839 833 {If the user changed only the blanks of the cards, the server shall
create a new FlashcardMask object and update the appropriate 840 834 create a new FlashcardMask object and update the appropriate
UserFlashcard object with a reference to it.} 841 835 UserFlashcard object with a reference to it.}
\item 842 836 \item
{If the user changed the text of the card, the server will instead:} 843 837 {If the user changed the text of the card, the server will instead:}
844 838
\begin{enumerate} 845 839 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 846 840 \itemsep1pt\parskip0pt\parsep0pt
\item 847 841 \item
{Create a new flashcard for the section} 848 842 {Create a new flashcard for the section}
\item 849 843 \item
{Push it to the feed} 850 844 {Push it to the feed}
\item 851 845 \item
{Add it to the user's deck} 852 846 {Add it to the user's deck}
\item 853 847 \item
{Hide the old card from the user} 854 848 {Hide the old card from the user}
\item 855 849 \item
{Return the new card to the user} 856 850 {Return the new card to the user}
\end{enumerate} 857 851 \end{enumerate}
\end{enumerate} 858 852 \end{enumerate}
\end{description} 859 853 \end{description}
{} 860 854 {}
861 855
\newpage 862 856 \newpage
863 857
{} 864 858 {}
865 859
\subsection{[F3] Pull Flashcard} 866 860 \subsection{[F3] Pull Flashcard}
\begin{description} 867 861 \begin{description}
\item[Description]{The User shall be able to add flash cards to their own 868 862 \item[Description]{The User shall be able to add flash cards to their own
deck from the Live Feed. } 869 863 deck from the Live Feed. }
870 864
\item[Desired Outcome]{The User shall have the flashcard added to their own 871 865 \item[Desired Outcome]{The User shall have the flashcard added to their own
deck } 872 866 deck }
\\ 873 867 \\
\item[User Goals]{The user will be able to review that flashcard. } 874 868 \item[User Goals]{The user will be able to review that flashcard. }
875 869
\item[Primary Actor]{User (student)} 876 870 \item[Primary Actor]{User (student)}
877 871
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 878 872 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashard} 879 873 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashard}
\\ 880 874 \\
\item[Priority Level]{``Must'' } 881 875 \item[Priority Level]{``Must'' }
882 876
\item[Status]{Implemented} 883 877 \item[Status]{Implemented}
884 878
\item[Pre-conditions] 885 879 \item[Pre-conditions]
886 880
\begin{itemize} 887 881 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 888 882 \itemsep1pt\parskip0pt\parsep0pt
\item 889 883 \item
{A flashcard has been created and is in the Live Feed for a class. } 890 884 {A flashcard has been created and is in the Live Feed for a class. }
\item 891 885 \item
{The User is currently viewing the Live Feed for that class.} 892 886 {The User is currently viewing the Live Feed for that class.}
\end{itemize} 893 887 \end{itemize}
894 888
\item[Post-conditions] 895 889 \item[Post-conditions]
896 890
\begin{itemize} 897 891 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 898 892 \itemsep1pt\parskip0pt\parsep0pt
\item 899 893 \item
{User shall have that flashcard added to their deck.} 900 894 {User shall have that flashcard added to their deck.}
\item 901 895 \item
{User can review this flashcard later.} 902 896 {User can review this flashcard later.}
\end{itemize} 903 897 \end{itemize}
904 898
\item[Trigger]{The User wants to save a flashcard for review later.} 905 899 \item[Trigger]{The User wants to save a flashcard for review later.}
906 900
\item[Workflow] 907 901 \item[Workflow]
908 902
\begin{enumerate} 909 903 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 910 904 \itemsep1pt\parskip0pt\parsep0pt
\item 911 905 \item
{The user shall hover over the flashcard he wants to add to his deck and click on the '+' 912 906 {The user shall hover over the flashcard he wants to add to his deck and click on the '+'
icon that appears in the center of the card.} 913 907 icon that appears in the center of the card.}
\item 914 908 \item
{The frontend shall make the pulled Flashcard appear in the user's deck.} 915 909 {The frontend shall make the pulled Flashcard appear in the user's deck.}
\item 916 910 \item
{The frontend shall generate a POST request in FlashcardFactory.js and send it to 917 911 {The frontend shall generate a POST request in FlashcardFactory.js and send it to
/api/flashcards/\textless{}flashcard id\textgreater{}/pull} 918 912 /api/flashcards/\textless{}flashcard id\textgreater{}/pull}
\item 919 913 \item
{The server shall call the FlashcardViewSet.pull to handle the POST request sent by the frontend.} 920 914 {The server shall call the FlashcardViewSet.pull to handle the POST request sent by the frontend.}
\item 921 915 \item
{The FlashcardViewSet.pull method should call the user.pull method in models.py with the flashcard object 922 916 {The FlashcardViewSet.pull method should call the user.pull method in models.py with the flashcard object
to be pulled as an argument} 923 917 to be pulled as an argument}
\item 924 918 \item
{The user.pull method shall create a UserFlashcard object associated with the request's user and the 925 919 {The user.pull method shall create a UserFlashcard object associated with the request's user and the
passed in flashcard object and save it in the database.} 926 920 passed in flashcard object and save it in the database.}
\item 927 921 \item
{The server shall notify connected clients about the new card rating, 928 922 {The server shall notify connected clients about the new card rating,
if any} 929 923 if any}
\item 930 924 \item
{Connected clients will take the new rating into account when next 931 925 {Connected clients will take the new rating into account when next
rearranging the feed.} 932 926 rearranging the feed.}
\end{enumerate} 933 927 \end{enumerate}
\end{description} 934 928 \end{description}
\newpage 935 929 \newpage
936 930
{} 937 931 {}
938 932
\subsection{[F4] Flag Inappropriate Cards} 939 933 \subsection{[F4] Flag Inappropriate Cards}
940 934
\begin{description} 941 935 \begin{description}
\item[Description]{Cards may be flagged indicating inappropriate content} 942 936 \item[Description]{Cards may be flagged indicating inappropriate content}
943 937
\item[Desired Outcome]{The flashcard's inappropriateness variable is 944 938 \item[Desired Outcome]{The flashcard's inappropriateness variable is
adjusted.} 945 939 adjusted.}
\\ 946 940 \\
\item[User Goals]{To notify the admins if a card is inappropriate and 947 941 \item[User Goals]{To notify the admins if a card is inappropriate and
should not be displayed in the feed.} 948 942 should not be displayed in the feed.}
949 943
\item[Primary Actor]{User (Student)} 950 944 \item[Primary Actor]{User (Student)}
951 945
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 952 946 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 953 947 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 954 948 \\
\item[Priority Level]{``Should''} 955 949 \item[Priority Level]{``Should''}
956 950
\item[Status]{Implemented} 957 951 \item[Status]{Implemented}
958 952
\item[Pre-conditions] 959 953 \item[Pre-conditions]
960 954
\begin{itemize} 961 955 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 962 956 \itemsep1pt\parskip0pt\parsep0pt
\item 963 957 \item
{The user is enrolled in a class} 964 958 {The user is enrolled in a class}
\item 965 959 \item
{The flashcard has been created.} 966 960 {The flashcard has been created.}
\item 967 961 \item
{The flashcard is viewable in feed.} 968 962 {The flashcard is viewable in feed.}
\item 969 963 \item
{The user has clicked the red 'eye' icon on the flashcard which is the "Hide Card" button.} 970 964 {The user has clicked the red 'eye' icon on the flashcard which is the "Hide Card" button.}
\end{itemize} 971 965 \end{itemize}
972 966
\item[Post-conditions] 973 967 \item[Post-conditions]
974 968
\begin{itemize} 975 969 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 976 970 \itemsep1pt\parskip0pt\parsep0pt
\item 977 971 \item
{Flashcard is hidden from user.} 978 972 {Flashcard is hidden from user.}
\item 979 973 \item
{The flashcard is marked as being inappropriate.} 980 974 {The flashcard is marked as being inappropriate.}
\end{itemize} 981 975 \end{itemize}
982 976
\item[Trigger]{The User does not like the particular flashcard.} 983 977 \item[Trigger]{The User does not like the particular flashcard.}
984 978
\item[Workflow] 985 979 \item[Workflow]
986 980
\begin{enumerate} 987 981 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 988 982 \itemsep1pt\parskip0pt\parsep0pt
\item 989 983 \item
{The frontend displays a toast that offers the user the report text.} 990 984 {The frontend displays a toast that offers the user the report text.}
\item 991 985 \item
{The user clicks the ``Report'' text on the flashcard.} 992 986 {The user clicks the ``Report'' text on the flashcard.}
\item 993 987 \item
{The frontend shall hide the flashcard from the user in FlashcardFactory.js.} 994 988 {The frontend shall hide the flashcard from the user in FlashcardFactory.js.}
\item 995 989 \item
{The frontend shall generate a POST request in Flashcard.report in FlashcardFactory.js 996 990 {The frontend shall generate a POST request in Flashcard.report in FlashcardFactory.js
and send it to /api/flashcards/\textless{}flashcard id \textgreater{}/report} 997 991 and send it to /api/flashcards/\textless{}flashcard id \textgreater{}/report}
\item 998 992 \item
{The backend shall check if the user already hid the flashcard in views.py function report.} 999 993 {The backend shall check if the user already hid the flashcard in views.py function report.}
\item 1000 994 \item
{The backend shall hide the flashcard in models.py in class FlashcardHide. } 1001 995 {The backend shall hide the flashcard in models.py in class FlashcardHide. }
\end{enumerate} 1002 996 \end{enumerate}
\end{description} 1003 997 \end{description}
{} 1004 998 {}
1005 999
{} 1006 1000 {}
1007 1001
\newpage 1008 1002 \newpage
1009 1003
{} 1010 1004 {}
1011 1005
\subsection{[F5] Filter Flashcards } 1012 1006 \subsection{[F5] Filter Flashcards }
1013 1007
\begin{description} 1014 1008 \begin{description}
\item[Description]{The user is able to filter for flashcards by material date and text.} 1015 1009 \item[Description]{The user is able to filter for flashcards by material date and text.}
1016 1010
\item[Desired Outcome]{The user shall see flashcards based on the filter 1017 1011 \item[Desired Outcome]{The user shall see flashcards based on the filter
options: the material date and the text of the card.} 1018 1012 options: the material date and the text of the card.}
1019 1013
{User Goals:}{The user can find what he/she is specifically looking 1020 1014 {User Goals:}{The user can find what he/she is specifically looking
for.} 1021 1015 for.}
1022 1016
\item[Primary Actor]{User} 1023 1017 \item[Primary Actor]{User}
1024 1018
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1025 1019 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull 1026 1020 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull
Flashcard} 1027 1021 Flashcard}
\\ 1028 1022 \\
\item[Priority Level]{''Should''} 1029 1023 \item[Priority Level]{''Should''}
1030 1024
\item[Status]{Implemented } 1031 1025 \item[Status]{Implemented }
1032 1026
\item[Pre-conditions] 1033 1027 \item[Pre-conditions]
1034 1028
\begin{itemize} 1035 1029 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1036 1030 \itemsep1pt\parskip0pt\parsep0pt
\item 1037 1031 \item
{The user has added a class.} 1038 1032 {The user has added a class.}
\item 1039 1033 \item
{The class in question contains non-zero number of flashcards.} 1040 1034 {The class in question contains non-zero number of flashcards.}
\end{itemize} 1041 1035 \end{itemize}
1042 1036
\item[Post-conditions]{} 1043 1037 \item[Post-conditions]{}
1044 1038
\begin{itemize} 1045 1039 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1046 1040 \itemsep1pt\parskip0pt\parsep0pt
\item 1047 1041 \item
{The user only sees the flashcards that match his filter criterion.} 1048 1042 {The user only sees the flashcards that match his filter criterion.}
\end{itemize} 1049 1043 \end{itemize}
1050 1044
\item[Trigger]{The user wants to only see cards for a specific date range or with a specific substring in their text.} 1051 1045 \item[Trigger]{The user wants to only see cards for a specific date range or with a specific substring in their text.}
1052 1046
\item[Workflow] 1053 1047 \item[Workflow]
1054 1048
\begin{enumerate} 1055 1049 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1056 1050 \itemsep1pt\parskip0pt\parsep0pt
\item 1057 1051 \item
{The frontend shall render the page described in study.html using CardListController.js.} 1058 1052 {The frontend shall render the page described in study.html using CardListController.js.}
\item 1059 1053 \item
{The user shall select the weeks that the filtered cards should belong to.} 1060 1054 {The user shall select the weeks that the filtered cards should belong to.}
\item 1061 1055 \item
{The user shall type in the appropriate search filter in the text input box on the top right of the screen.} 1062 1056 {The user shall type in the appropriate search filter in the text input box on the top right of the screen.}
\item 1063 1057 \item
{The frontend generates a POST request with the flashcard dates and the flashcard text filter as 1064 1058 {The frontend generates a POST request with the flashcard dates and the flashcard text filter as
parameteres and sends it to /api/study.} 1065 1059 parameteres and sends it to /api/study.}
\item 1066 1060 \item
{The system displays only the cards that match the filter criteria specified by the user.} 1067 1061 {The system displays only the cards that match the filter criteria specified by the user.}
1068 1062
\end{enumerate} 1069 1063 \end{enumerate}
\end{description} 1070 1064 \end{description}
{} 1071 1065 {}
1072 1066
\newpage 1073 1067 \newpage
1074 1068
{} 1075 1069 {}
1076 1070
\subsection{[F6] Blank Out Words in Flashcard} 1077 1071 \subsection{[F6] Blank Out Words in Flashcard}
1078 1072
\begin{description} 1079 1073 \begin{description}
\item[Description]{The User shall be able to blank out keywords in any 1080 1074 \item[Description]{The User shall be able to blank out keywords in any
flashcard in his deck. } 1081 1075 flashcard in his deck. }
1082 1076
\item[Desired Outcome]{The blanked out words in the flashcard notify the 1083 1077 \item[Desired Outcome]{The blanked out words in the flashcard notify the
System that they are keywords. } 1084 1078 System that they are keywords. }
\\ 1085 1079 \\
\item[User Goals]{The User shall mark some words as keywords so the System 1086 1080 \item[User Goals]{The User shall mark some words as keywords so the System
may later quiz theirself by blanking out the keywords and having the 1087 1081 may later quiz theirself by blanking out the keywords and having the
User guess what they are.} 1088 1082 User guess what they are.}
1089 1083
{Primary Actor: }{User (student)} 1090 1084 {Primary Actor: }{User (student)}
1091 1085
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1092 1086 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1093 1087 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1094 1088 \\
\item[Priority Level]{``Must''} 1095 1089 \item[Priority Level]{``Must''}
1096 1090
\item[Status]{Implemented.} 1097 1091 \item[Status]{Implemented.}
1098 1092
\item[Pre-conditions] 1099 1093 \item[Pre-conditions]
1100 1094
\begin{itemize} 1101 1095 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1102 1096 \itemsep1pt\parskip0pt\parsep0pt
\item 1103 1097 \item
{The User has an account and is logged in.} 1104 1098 {The User has an account and is logged in.}
\item 1105 1099 \item
{The User shall be on the Live Feed for the class.} 1106 1100 {The User shall be on the Live Feed for the class.}
\item 1107 1101 \item
{The User has clicked the 'c' hotkey or the 'plus' button to start making a card.} 1108 1102 {The User has clicked the 'c' hotkey or the 'plus' button to start making a card.}
\item 1109 1103 \item
{The User shall type in information relevant to their class.} 1110 1104 {The User shall type in information relevant to their class.}
\end{itemize} 1111 1105 \end{itemize}
1112 1106
{Post-conditions: } 1113 1107 {Post-conditions: }
1114 1108
\begin{itemize} 1115 1109 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1116 1110 \itemsep1pt\parskip0pt\parsep0pt
\item 1117 1111 \item
{The blanked out words in the flashcard are marked as keywords.} 1118 1112 {The blanked out words in the flashcard are marked as keywords.}
\item 1119 1113 \item
{The System shall blank out the keywords and let the User guess what 1120 1114 {The System shall blank out the keywords and let the User guess what
they are when it presents the flashcard to the User for reviewing.} 1121 1115 they are when it presents the flashcard to the User for reviewing.}
\end{itemize} 1122 1116 \end{itemize}
1123 1117
\item[Trigger]{The User wants to make a flashcard and be quizzed on parts of the flashcard while they study.} 1124 1118 \item[Trigger]{The User wants to make a flashcard and be quizzed on parts of the flashcard while they study.}
1125 1119
\item[Workflow] 1126 1120 \item[Workflow]
1127 1121
\begin{enumerate} 1128 1122 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1129 1123 \itemsep1pt\parskip0pt\parsep0pt
\item 1130 1124 \item
{The User shall highlight the words that he wishes to blank out.} 1131 1125 {The User shall highlight the words that he wishes to blank out.}
\item 1132 1126 \item
{The frontend shall enclose the selected text in \textless{}b\textgreater{} tags to alter its appearance.} 1133 1127 {The frontend shall enclose the selected text in \textless{}b\textgreater{} tags to alter its appearance.}
\item 1134 1128 \item
{The User shall click the 'Contribute' button.} 1135 1129 {The User shall click the 'Contribute' button.}
\item 1136 1130 \item
{The frontend shall convert the blanked portion of the text into a list of offsets to be 1137 1131 {The frontend shall convert the blanked portion of the text into a list of offsets to be
sent to the backend in FeedController.js.} 1138 1132 sent to the backend in FeedController.js.}
\item 1139 1133 \item
{The backend shall mark those words by updating the field mask for 1140 1134 {The backend shall mark those words by updating the field mask for
that userflashcard object in views.py in function create. } 1141 1135 that userflashcard object in views.py in function create. }
\item 1142 1136 \item
{The backend shall save the new mask in models.py.} 1143 1137 {The backend shall save the new mask in models.py.}
\end{enumerate} 1144 1138 \end{enumerate}
1145 1139
{Alternative Workflows:} 1146 1140 {Alternative Workflows:}
1147 1141
\begin{enumerate} 1148 1142 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1149 1143 \itemsep1pt\parskip0pt\parsep0pt
\item 1150 1144 \item
{Precondition: The User has clicked the edit flashcard button instead of creating a new card.} 1151 1145 {Precondition: The User has clicked the edit flashcard button instead of creating a new card.}
\item 1152 1146 \item
{The User shall highlight selection text and click either ctrl-b or 'Blank Selected Text'.} 1153 1147 {The User shall highlight selection text and click either ctrl-b or 'Blank Selected Text'.}
\item 1154 1148 \item
{The frontend shall enclose the selected text in \textless{}b\textgreater{} tags to alter its appearance.} 1155 1149 {The frontend shall enclose the selected text in \textless{}b\textgreater{} tags to alter its appearance.}
\item 1156 1150 \item
{The frontend shall convert the blanked portion of the text into a list of offsets to be 1157 1151 {The frontend shall convert the blanked portion of the text into a list of offsets to be
sent to the backend in CardGridController.js.} 1158 1152 sent to the backend in CardGridController.js.}
\item 1159 1153 \item
{The backend shall mark those words by updating the field mask for 1160 1154 {The backend shall mark those words by updating the field mask for
that userflashcard object in views.py in function create. } 1161 1155 that userflashcard object in views.py in function create. }
\item 1162 1156 \item
{The backend shall save those in models.py.} 1163 1157 {The backend shall save those in models.py.}
\end{enumerate} 1164 1158 \end{enumerate}
\end{description} 1165 1159 \end{description}
{} 1166 1160 {}
1167 1161
\newpage 1168 1162 \newpage
1169 1163
{} 1170 1164 {}
1171 1165
\subsection{[F7] Fix Flashcard} 1172 1166 \subsection{[F7] Fix Flashcard}
1173 1167
\begin{description} 1174 1168 \begin{description}
\item[Description]{The User shall be able to alter a flashcard he/she made 1175 1169 \item[Description]{The User shall be able to alter a flashcard he/she made
originally and not have to make a new copy of it.} 1176 1170 originally and not have to make a new copy of it.}
1177 1171
\item[Desired Outcome]{The User shall alter one flashcard and that 1178 1172 \item[Desired Outcome]{The User shall alter one flashcard and that
alteration will be shown to all users of that flashcard} 1179 1173 alteration will be shown to all users of that flashcard}
\\ 1180 1174 \\
\item[User Goals]{The user shall make the flashcard say something different 1181 1175 \item[User Goals]{The user shall make the flashcard say something different
than it did originally.} 1182 1176 than it did originally.}
1183 1177
\item[Primary Actor]{User (student) } 1184 1178 \item[Primary Actor]{User (student) }
1185 1179
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1186 1180 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1187 1181 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1188 1182 \\
\item[Priority Level]{Must} 1189 1183 \item[Priority Level]{Must}
1190 1184
\item[Status]{Implemented} 1191 1185 \item[Status]{Implemented}
1192 1186
\item[Pre-conditions] 1193 1187 \item[Pre-conditions]
1194 1188
\begin{itemize} 1195 1189 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1196 1190 \itemsep1pt\parskip0pt\parsep0pt
\item 1197 1191 \item
{User has created the flashcard} 1198 1192 {User has created the flashcard}
\end{itemize} 1199 1193 \end{itemize}
1200 1194
\item[Post-conditions]{} 1201 1195 \item[Post-conditions]{}
1202 1196
\begin{itemize} 1203 1197 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1204 1198 \itemsep1pt\parskip0pt\parsep0pt
\item 1205 1199 \item
{The user shall see their alteration for that flashcard} 1206 1200 {The user shall see their alteration for that flashcard}
\item 1207 1201 \item
{Other users will be notified of the alteration} 1208 1202 {Other users will be notified of the alteration}
\end{itemize} 1209 1203 \end{itemize}
1210 1204
\item[Trigger]{User (creator of original card) has clicked on the button 1211 1205 \item[Trigger]{User (creator of original card) has clicked on the button
``Edit''} 1212 1206 ``Edit''}
1213 1207
\item[Workflow] 1214 1208 \item[Workflow]
1215 1209
\begin{enumerate} 1216 1210 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1217 1211 \itemsep1pt\parskip0pt\parsep0pt
\item 1218 1212 \item
{User shall select one of the Flashcards they authored.} 1219 1213 {User shall select one of the Flashcards they authored.}
\item 1220 1214 \item
{User shall select ``Edit'' button on the flashcard.} 1221 1215 {User shall select ``Edit'' button on the flashcard.}
\item 1222 1216 \item
{Client shall display an ``Edit Flashcard'' view.} 1223 1217 {Client shall display an ``Edit Flashcard'' view.}
\item 1224 1218 \item
{The Flashcard will display editable fields/areas.} 1225 1219 {The Flashcard will display editable fields/areas.}
\item 1226 1220 \item
{The User shall input any changes to the Flashcard.} 1227 1221 {The User shall input any changes to the Flashcard.}
\item 1228 1222 \item
{The User shall select the ``Done Editing'' button.} 1229 1223 {The User shall select the ``Done Editing'' button.}
\item 1230 1224 \item
{The Client shall close the ``Edit Flashcard'' view.} 1231 1225 {The Client shall close the ``Edit Flashcard'' view.}
\item 1232 1226 \item
{The server shall update the Flashcard's content.} 1233 1227 {The server shall update the Flashcard's content.}
\item 1234 1228 \item
{Client shall notify users with the Flashcard that the Flashcard has 1235 1229 {Client shall notify users with the Flashcard that the Flashcard has
been edited, allowing the other users to keep or to discard the 1236 1230 been edited, allowing the other users to keep or to discard the
changes.} 1237 1231 changes.}
\end{enumerate} 1238 1232 \end{enumerate}
\end{description} 1239 1233 \end{description}
{} 1240 1234 {}
1241 1235
{} 1242 1236 {}
1243 1237
{} 1244 1238 {}
1245 1239
\newpage 1246 1240 \newpage
1247 1241
{} 1248 1242 {}
1249 1243
\subsection{[F8] Hide Cards} 1250 1244 \subsection{[F8] Hide Cards}
1251 1245
\begin{description} 1252 1246 \begin{description}
\item[Description]{The user shall be able to hide cards from feed} 1253 1247 \item[Description]{The user shall be able to hide cards from feed}
1254 1248
\item[Desired Outcome]{The card is no longer visible to the user} 1255 1249 \item[Desired Outcome]{The card is no longer visible to the user}
\\ 1256 1250 \\
\item[User Goals]{The card has been looked at and should be hidden to 1257 1251 \item[User Goals]{The card has been looked at and should be hidden to
reduce screen clutter} 1258 1252 reduce screen clutter}
1259 1253
{Primary Actor: }{User (Student)} 1260 1254 {Primary Actor: }{User (Student)}
1261 1255
\item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User 1262 1256 \item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1263 1257 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1264 1258 \\
\item[Priority Level]{``Should''} 1265 1259 \item[Priority Level]{``Should''}
1266 1260
{Status:}{Implemented} 1267 1261 {Status:}{Implemented}
1268 1262
\item[Pre-conditions]{Flashcard is created, flashcard is viewable by user.} 1269 1263 \item[Pre-conditions]{Flashcard is created, flashcard is viewable by user.}
1270 1264
\item[Post-conditions]{Flashcard is not viewable by user} 1271 1265 \item[Post-conditions]{Flashcard is not viewable by user}
1272 1266
\item[Trigger]{The User no longer wants to see a card in their feed and deck.} 1273 1267 \item[Trigger]{The User no longer wants to see a card in their feed and deck.}
1274 1268
\item[Workflow] 1275 1269 \item[Workflow]
1276 1270
\begin{enumerate} 1277 1271 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1278 1272 \itemsep1pt\parskip0pt\parsep0pt
\item 1279 1273 \item
{The User chooses a class from the drop down menu.} 1280 1274 {The User chooses a class from the drop down menu.}
\item 1281 1275 \item
{The frontend renders the Live Feed for the selected class from feed.html.} 1282 1276 {The frontend renders the Live Feed for the selected class from feed.html.}
\item 1283 1277 \item
{The User sees a card they want to hide.} 1284 1278 {The User sees a card they want to hide.}
\item 1285 1279 \item
{The User shall press the ``Hide Flashcard'' button on the card to be 1286 1280 {The User shall press the ``Hide Flashcard'' button on the card to be
hidden.} 1287 1281 hidden.}
\item 1288 1282 \item
{The frontend shall make a request to the backend from FeedController.js.} 1289 1283 {The frontend shall make a request to the backend from FeedController.js.}
\item 1290 1284 \item
{The backend shall check if the User has already hidden that card in views.py.} 1291 1285 {The backend shall check if the User has already hidden that card in views.py.}
\item 1292 1286 \item
{The backend shall change the falshcard to hidden in the models.py.} 1293 1287 {The backend shall change the falshcard to hidden in the models.py.}
\item 1294 1288 \item
{The frontend shall no longer show that card when the feed is rendered.} 1295 1289 {The frontend shall no longer show that card when the feed is rendered.}
\end{enumerate} 1296 1290 \end{enumerate}
1297 1291
\end{description} 1298 1292 \end{description}
1299 1293
\newpage 1300 1294 \newpage
1301 1295
{} 1302 1296 {}
1303 1297
\subsection{[F9] View a Feed} 1304 1298 \subsection{[F9] View a Feed}
1305 1299
\begin{description} 1306 1300 \begin{description}
\item[Description]{The User shall be able to view Live Feeds for different 1307 1301 \item[Description]{The User shall be able to view Live Feeds for different
classes} 1308 1302 classes}
1309 1303
\item[Desired Outcome]{The system shall only show the user Live Feeds for 1310 1304 \item[Desired Outcome]{The system shall only show the user Live Feeds for
specific classes. } 1311 1305 specific classes. }
\\ 1312 1306 \\
\item[User Goals]{The User will see only one Live Feed at a time. } 1313 1307 \item[User Goals]{The User will see only one Live Feed at a time. }
1314 1308
\item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User 1315 1309 \item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 1316 1310 Login, {[}A3{]} Add a Class}
\\ 1317 1311 \\
\item[Priority Level]{``Must''} 1318 1312 \item[Priority Level]{``Must''}
1319 1313
{Status:}{Implemented} 1320 1314 {Status:}{Implemented}
1321 1315
\item[Pre-conditions]{User has added a class.} 1322 1316 \item[Pre-conditions]{User has added a class.}
1323 1317
\item[Post-conditions]{User shall see the Live Feed for that class} 1324 1318 \item[Post-conditions]{User shall see the Live Feed for that class}
1325 1319
\item[Trigger]{User shall select a class} 1326 1320 \item[Trigger]{User shall select a class}
1327 1321
\item[Workflow] 1328 1322 \item[Workflow]
1329 1323
\begin{enumerate} 1330 1324 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1331 1325 \itemsep1pt\parskip0pt\parsep0pt
\item 1332 1326 \item
{The User logs into their account.} 1333 1327 {The User logs into their account.}
\item 1334 1328 \item
{The System verifies the User's credentials and saves their session.} 1335 1329 {The System verifies the User's credentials and saves their session.}
\item 1336 1330 \item
{The User is at their dashboard.} 1337 1331 {The User is at their dashboard.}
\item 1338 1332 \item
{The Client shows the User's dashboard.} 1339 1333 {The Client shows the User's dashboard.}
\item 1340 1334 \item
{The User selects a class from their dashboard.} 1341 1335 {The User selects a class from their dashboard.}
\item 1342 1336 \item
{The Client displays the Live Feed for the class.} 1343 1337 {The Client displays the Live Feed for the class.}
\end{enumerate} 1344 1338 \end{enumerate}
1345 1339
\end{description} 1346 1340 \end{description}
\newpage 1347 1341 \newpage
1348 1342
{} 1349 1343 {}
\section{Decks} 1350 1344 \section{Decks}
1351 1345
\subsection{[D1] Remove a card from a deck} 1352 1346 \subsection{[D1] Remove a card from a deck}
1353 1347
\begin{description} 1354 1348 \begin{description}
\item[Description]{The user can remove flashcards from their deck.} 1355 1349 \item[Description]{The user can remove flashcards from their deck.}
1356 1350
\item[Desired Outcome]{The user will not be notified about that card. } 1357 1351 \item[Desired Outcome]{The user will not be notified about that card. }
\\ 1358 1352 \\
\item[User Goals]{To only review cards that the user wants to review. } 1359 1353 \item[User Goals]{To only review cards that the user wants to review. }
1360 1354
\item[Primary Actor]{User (student)} 1361 1355 \item[Primary Actor]{User (student)}
1362 1356
\item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck 1363 1357 \item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck
{[}F1{]}, Make a Flashcard {[}F3{]}} 1364 1358 {[}F1{]}, Make a Flashcard {[}F3{]}}
\\ 1365 1359 \\
\item[Priority Level]{``Must''} 1366 1360 \item[Priority Level]{``Must''}
1367 1361
\item[Status]{Implemented} 1368 1362 \item[Status]{Implemented}
1369 1363
\item[Pre-conditions] 1370 1364 \item[Pre-conditions]
1371 1365
\begin{itemize} 1372 1366 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1373 1367 \itemsep1pt\parskip0pt\parsep0pt
\item 1374 1368 \item
{The User has an account with the application} 1375 1369 {The User has an account with the application}
\item 1376 1370 \item
{The User is logged in} 1377 1371 {The User is logged in}
\end{itemize} 1378 1372 \end{itemize}
1379 1373
\item[Post-conditions] 1380 1374 \item[Post-conditions]
1381 1375
\begin{itemize} 1382 1376 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1383 1377 \itemsep1pt\parskip0pt\parsep0pt
\item 1384 1378 \item
{Desired cards are hidden to the user.} 1385 1379 {Desired cards are hidden to the user.}
\end{itemize} 1386 1380 \end{itemize}
1387 1381
\item[Trigger]{The User no longer wishes to be able to study a card. } 1388 1382 \item[Trigger]{The User no longer wishes to be able to study a card. }
1389 1383
\item[Workflow] 1390 1384 \item[Workflow]
1391 1385
\begin{enumerate} 1392 1386 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1393 1387 \itemsep1pt\parskip0pt\parsep0pt
\item 1394 1388 \item
{The Client shows the user the dashboard.} 1395 1389 {The Client shows the user the dashboard.}
\item 1396 1390 \item
{The User shall select the appropriate class.} 1397 1391 {The User shall select the appropriate class.}
\item 1398 1392 \item
{The System checks if the class is in session.} 1399 1393 {The System checks if the class is in session.}
\item 1400 1394 \item
{The User shall select deck view.} 1401 1395 {The User shall select deck view.}
\item 1402 1396 \item
{The Client shall route the user to the deck view.} 1403 1397 {The Client shall route the user to the deck view.}
\item 1404 1398 \item
{The User clicks a flashcard's remove button.} 1405 1399 {The User clicks a flashcard's remove button.}
\item 1406 1400 \item
{The Client shall send a DELETE request to the server}{}{at 1407 1401 {The Client shall send a DELETE request to the server}{}{at
/api/flashcard/\textless{}flashcard ID\textgreater{}/remove} 1408 1402 /api/flashcard/\textless{}flashcard ID\textgreater{}/remove}
\item 1409 1403 \item
{The Server removes the flashcard from the User's Deck.} 1410 1404 {The Server removes the flashcard from the User's Deck.}
\item 1411 1405 \item
{The Server updates the flashcard's position in the Live Feed.} 1412 1406 {The Server updates the flashcard's position in the Live Feed.}
\item 1413 1407 \item
{The Client updates the User's Deck.} 1414 1408 {The Client updates the User's Deck.}
\end{enumerate} 1415 1409 \end{enumerate}
1416 1410
{} 1417 1411 {}
1418 1412
{Alternate Workflow:} 1419 1413 {Alternate Workflow:}
1420 1414
\begin{enumerate} 1421 1415 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1422 1416 \itemsep1pt\parskip0pt\parsep0pt
\item 1423 1417 \item
{The Client shows the user the dashboard.} 1424 1418 {The Client shows the user the dashboard.}
\item 1425 1419 \item