Commit de2420793d5a7c36a02da2a2d39522012e27a223

Authored by Chung Wang
1 parent b088df505a
Exists in master

Testing numbers

Showing 1 changed file with 1 additions and 0 deletions Inline Diff

DesignUseCases.tex View file @ de24207
\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
\section{Accounts} 46 46 \section{Accounts}
\subsection{[A1] User Registration} 47 47 \subsection{[A1] User Registration}
\begin{description}[style=multiline,leftmargin=3cm] 48 48 \begin{description}[style=multiline,leftmargin=3cm]
\item[Description]{To create and save decks, the system requires the user 49 49 \item[Description]{To create and save decks, the system requires the user
to create an account prior. The user will be able to create an account 50 50 to create an account prior. The user will be able to create an account
through registering.} 51 51 through registering.}
\item[Desired Outcome]{An account will be created for the user from the 52 52 \item[Desired Outcome]{An account will be created for the user from the
specified username, password, email. The user will be able to log into 53 53 specified username, password, email. The user will be able to log into
the aforementioned account.} 54 54 the aforementioned account.}
\\ 55 55 \\
\item[User Goals]{The user shall have an account to participate in the 56 56 \item[User Goals]{The user shall have an account to participate in the
website's activities.} 57 57 website's activities.}
58 58
\item[Primary Actor]{User (student)} 59 59 \item[Primary Actor]{User (student)}
60 60
\item[Dependency Use Cases]{None} 61 61 \item[Dependency Use Cases]{None}
\\ 62 62 \\
\item[Priority Level]{``Must''} 63 63 \item[Priority Level]{``Must''}
64 64
\item[Status]{Not Implemented} 65 65 \item[Status]{Not Implemented}
66 66
\item[Pre-conditions] 67 67 \item[Pre-conditions]
68 68
\item[Post-conditions] 69 69 \item[Post-conditions]
70 70
\begin{itemize} 71 71 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 72 72 \itemsep1pt\parskip0pt\parsep0pt
\item 73 73 \item
{The user has an account registered with the system.} 74 74 {The user has an account registered with the system.}
\end{itemize} 75 75 \end{itemize}
76 76
\item[Trigger]{The user wants to create an account.} 77 77 \item[Trigger]{The user wants to create an account.}
78 78
\item[Workflow] 79 79 \item[Workflow]
80 80
\begin{enumerate} 81 81 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 82 82 \itemsep1pt\parskip0pt\parsep0pt
\item 83 83 \item
{The user shall click the sign up button.} 84 84 {The user shall click the sign up button.}
\item 85 85 \item
{The client renders a registration form and displays it to the user} 86 86 {The client renders a registration form and displays it to the user}
\item 87 87 \item
{The user fills the form} 88 88 {The user fills the form}
\item 89 89 \item
{The client checks that the provided email is not invalid, and that 90 90 {The client checks that the provided email is not invalid, and that
the password is not valid. If anything is not valid, it displays an 91 91 the password is not valid. If anything is not valid, it displays an
error and returns this to the user. } 92 92 error and returns this to the user. }
\item 93 93 \item
{If the form is valid, the client POSTs the form in JSON format to the 94 94 {If the form is valid, the client POSTs the form in JSON format to the
server API at /api/users/me.} 95 95 server API at /api/users/me.}
\item 96 96 \item
{The server deserializes and validates the data. If it's not valid, it 97 97 {The server deserializes and validates the data. If it's not valid, it
returns an error to the client.} 98 98 returns an error to the client.}
\item 99 99 \item
{The server creates a new User object from the provided data, filling 100 100 {The server creates a new User object from the provided data, filling
in the appropriate fields} 101 101 in the appropriate fields}
\item 102 102 \item
{The server saves the user object} 103 103 {The server saves the user object}
\item 104 104 \item
{The server marks the user's email as unverified} 105 105 {The server marks the user's email as unverified}
\item 106 106 \item
{The server sends an email to the user's address with a link to 107 107 {The server sends an email to the user's address with a link to
validate the user's email address.} 108 108 validate the user's email address.}
\item 109 109 \item
{The server responds with success and logs the user in on a new 110 110 {The server responds with success and logs the user in on a new
session for the user. } 111 111 session for the user. }
\item 112 112 \item
{The client reports success to the user and stores the sessionid for 113 113 {The client reports success to the user and stores the sessionid for
future requests.} 114 114 future requests.}
\end{enumerate} 115 115 \end{enumerate}
116 116
{Verification Workflow:} 117 117 {Verification Workflow:}
118 118
\begin{enumerate} 119 119 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 120 120 \itemsep1pt\parskip0pt\parsep0pt
\item 121 121 \item
{The user receives an email with a link to verify their email. The 122 122 {The user receives an email with a link to verify their email. The
user clicks the link} 123 123 user clicks the link}
\item 124 124 \item
{The client submits the verification code to the server} 125 125 {The client submits the verification code to the server}
\item 126 126 \item
{The server validates the code. If the code is not valid, it returns 127 127 {The server validates the code. If the code is not valid, it returns
an error to the client.} 128 128 an error to the client.}
\item 129 129 \item
{The server marks the user's email as valid and saves the User object 130 130 {The server marks the user's email as valid and saves the User object
again. The user's account is now active} 131 131 again. The user's account is now active}
\item 132 132 \item
{The client reports success. } 133 133 {The client reports success. }
\end{enumerate} 134 134 \end{enumerate}
135 135
\end{description} 136 136 \end{description}
137 137
\newpage 138 138 \newpage
\subsection{{{{[}A2{]} User 139 139 \subsection{{{{[}A2{]} User
Login}}{{[}A2{]} User Login}} 140 140 Login}}{{[}A2{]} User Login}}
141 141
\begin{description} 142 142 \begin{description}
\item[Description]{User is able to login to personal account.} 143 143 \item[Description]{User is able to login to personal account.}
144 144
\item[Desired Outcome]{The user shall be able to provide their username and 145 145 \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 146 146 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 147 147 access to the list of the courses they have added, and be able to review
the flash cards they have added to their decks.} 148 148 the flash cards they have added to their decks.}
\\ 149 149 \\
\item[User Goals]{The user wants to resume use of the site on another 150 150 \item[User Goals]{The user wants to resume use of the site on another
device, or use the site after logging out.} 151 151 device, or use the site after logging out.}
152 152
\item[Primary Actor]{User (student)} 153 153 \item[Primary Actor]{User (student)}
154 154
\item[Dependency Use Cases]{{[}A1{]} User Registration} 155 155 \item[Dependency Use Cases]{{[}A1{]} User Registration}
\\ 156 156 \\
\item[Priority Level]{``Must''} 157 157 \item[Priority Level]{``Must''}
158 158
\item[Status]{Not Implemented} 159 159 \item[Status]{Not Implemented}
160 160
\item[Pre-conditions] 161 161 \item[Pre-conditions]
162 162
\begin{itemize} 163 163 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 164 164 \itemsep1pt\parskip0pt\parsep0pt
\item 165 165 \item
{The user has created an account before.} 166 166 {The user has created an account before.}
\end{itemize} 167 167 \end{itemize}
168 168
\item[Post-conditions] 169 169 \item[Post-conditions]
170 170
\begin{itemize} 171 171 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 172 172 \itemsep1pt\parskip0pt\parsep0pt
\item 173 173 \item
{The user can navigate the site and see their data.} 174 174 {The user can navigate the site and see their data.}
\end{itemize} 175 175 \end{itemize}
176 176
\item[Trigger]{The User shall enter their email and password into the Login 177 177 \item[Trigger]{The User shall enter their email and password into the Login
form. The user then submits this information by clicking the ``Login'' 178 178 form. The user then submits this information by clicking the ``Login''
button or pressing the return key.} 179 179 button or pressing the return key.}
180 180
\item[Workflow] 181 181 \item[Workflow]
182 182
\begin{enumerate} 183 183 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 184 184 \itemsep1pt\parskip0pt\parsep0pt
\item 185 185 \item
{The server verifies that the User has submitted an email and password} 186 186 {The server verifies that the User has submitted an email and password}
\item 187 187 \item
{The server authenticates the User's email and password and checks if the 188 188 {The server authenticates the User's email and password and checks if the
User is active} 189 189 User is active}
\item 190 190 \item
{The server logs the User in using the Django login feature} 191 191 {The server logs the User in using the Django login feature}
\item 192 192 \item
{Front-end displays the home page for the User} 193 193 {Front-end displays the home page for the User}
\end{enumerate} 194 194 \end{enumerate}
\end{description} 195 195 \end{description}
\newpage 196 196 \newpage
197 197
\subsection{{[}A3{]} Add a Class} 198 198 \subsection{{[}A3{]} Add a Class}
\begin{description} 199 199 \begin{description}
\item[Description]{The user shall be able to add a class and access the 200 200 \item[Description]{The user shall be able to add a class and access the
flashcards associated with that class.} 201 201 flashcards associated with that class.}
202 202
\item[Desired Outcome]{The class shall be linked with the student's account 203 203 \item[Desired Outcome]{The class shall be linked with the student's account
and the student shall have the ability to read and publish flashcards 204 204 and the student shall have the ability to read and publish flashcards
for this class.} 205 205 for this class.}
\\ 206 206 \\
\item[User Goals]{The user wants to publish flashcards for this class, and 207 207 \item[User Goals]{The user wants to publish flashcards for this class, and
reads the flashcards for this class that are published by other users.} 208 208 reads the flashcards for this class that are published by other users.}
209 209
\item[Primary Actor]{User (student)} 210 210 \item[Primary Actor]{User (student)}
211 211
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 212 212 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 213 213 Login}
\\ 214 214 \\
\item[Priority Level]{``Must''} 215 215 \item[Priority Level]{``Must''}
216 216
\item[Status]{Not implemented} 217 217 \item[Status]{Not implemented}
218 218
\item[Pre-conditions] 219 219 \item[Pre-conditions]
220 220
\begin{itemize} 221 221 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 222 222 \itemsep1pt\parskip0pt\parsep0pt
\item 223 223 \item
{The user has created an account.} 224 224 {The user has created an account.}
\item 225 225 \item
{The user is logged in to their account and is at root view} 226 226 {The user is logged in to their account and is at root view}
\end{itemize} 227 227 \end{itemize}
228 228
\item[Post-conditions] 229 229 \item[Post-conditions]
230 230
\begin{itemize} 231 231 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 232 232 \itemsep1pt\parskip0pt\parsep0pt
\item 233 233 \item
{The user can read the flashcards being published for the class and 234 234 {The user can read the flashcards being published for the class and
add them to his/her deck.} 235 235 add them to his/her deck.}
\item 236 236 \item
{The user can publish flashcards to be viewed and added by other users 237 237 {The user can publish flashcards to be viewed and added by other users
in the same class.} 238 238 in the same class.}
\end{itemize} 239 239 \end{itemize}
240 240
\item[Trigger]{The user wants to add a class.} 241 241 \item[Trigger]{The user wants to add a class.}
242 242
\item[Workflow] 243 243 \item[Workflow]
244 244
\begin{enumerate} 245 245 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 246 246 \itemsep1pt\parskip0pt\parsep0pt
\item 247 247 \item
{The user shall click add a class on the sidebar.} 248 248 {The user shall click add a class on the sidebar.}
\item 249 249 \item
{The client shall bring the user to a AddClassView.} 250 250 {The client shall bring the user to a AddClassView.}
\item 251 251 \item
{The user begins to type their class name or number.} 252 252 {The user begins to type their class name or number.}
\item 253 253 \item
{The ShowSuggestion shall show suggestions as a user types.} 254 254 {The ShowSuggestion shall show suggestions as a user types.}
\end{enumerate} 255 255 \end{enumerate}
256 256
\begin{itemize} 257 257 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 258 258 \itemsep1pt\parskip0pt\parsep0pt
\item 259 259 \item
{Implementation unspecified at present; need to do further research 260 260 {Implementation unspecified at present; need to do further research
(django-autocomplete-lite?)} 261 261 (django-autocomplete-lite?)}
\end{itemize} 262 262 \end{itemize}
263 263
\begin{enumerate} 264 264 \begin{enumerate}
\setcounter{enumi}{3} 265 265 \setcounter{enumi}{3}
\itemsep1pt\parskip0pt\parsep0pt 266 266 \itemsep1pt\parskip0pt\parsep0pt
\item 267 267 \item
{The user shall select a class by clicking on ``Add Class''.} 268 268 {The user shall select a class by clicking on ``Add Class''.}
\item 269 269 \item
{The client shall submit a POST request to /api/users/me/sections with 270 270 {The client shall submit a POST request to /api/users/me/sections with
the course ID that the User added. } 271 271 the course ID that the User added. }
\item 272 272 \item
{The server shall check if there is a whitelist for the class that the 273 273 {The server shall check if there is a whitelist for the class that the
user is trying to add.} 274 274 user is trying to add.}
\item 275 275 \item
{The server shall ensure that the user is whitelisted.} 276 276 {The server shall ensure that the user is whitelisted.}
\item 277 277 \item
{The server shall link the user to the section.} 278 278 {The server shall link the user to the section.}
\end{enumerate} 279 279 \end{enumerate}
280 280
\item[Alternate Workflow: User is not whitelisted.] 281 281 \item[Alternate Workflow: User is not whitelisted.]
\begin{enumerate} 282 282 \begin{enumerate}
283 \setcounter{enumi}{7}
\itemsep1pt\parskip0pt\parsep0pt 283 284 \itemsep1pt\parskip0pt\parsep0pt
\item 284 285 \item
{The server shall . } 285 286 {The server shall . }
286 287
\end{enumerate} 287 288 \end{enumerate}
\end{description} 288 289 \end{description}
{} 289 290 {}
290 291
\newpage 291 292 \newpage
292 293
{} 293 294 {}
294 295
\subsection{{{{[}A4{]} }{Drop a 295 296 \subsection{{{{[}A4{]} }{Drop a
Class}}{{[}A4{]} Drop a Class}} 296 297 Class}}{{[}A4{]} Drop a Class}}
297 298
\begin{description} 298 299 \begin{description}
\item[Description]{The user can remove themselves from a course he/she is 299 300 \item[Description]{The user can remove themselves from a course he/she is
registered to} 300 301 registered to}
301 302
\item[Desired Outcome]{The user has dropped the class and no longer need 302 303 \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 303 304 access to the flashcards for said class. This means they can no longer
see the flashcards associated to the class that they dropped } 304 305 see the flashcards associated to the class that they dropped }
\\ 305 306 \\
\item[User Goals]{The user shall not have access to a class and the 306 307 \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 307 308 flashcards associated with that class. They will no longer see the class
listed in their list of ``Enrolled Classes''} 308 309 listed in their list of ``Enrolled Classes''}
309 310
\item[Primary Actor]{User (student)} 310 311 \item[Primary Actor]{User (student)}
311 312
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 312 313 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 313 314 Login, {[}A3{]} Add a Class}
\\ 314 315 \\
\item[Priority Level]{ ``Should''} 315 316 \item[Priority Level]{ ``Should''}
316 317
\item[Status]{Not Implemented } 317 318 \item[Status]{Not Implemented }
318 319
\item[Pre-conditions] 319 320 \item[Pre-conditions]
320 321
\begin{itemize} 321 322 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 322 323 \itemsep1pt\parskip0pt\parsep0pt
\item 323 324 \item
{User has a valid account.} 324 325 {User has a valid account.}
\item 325 326 \item
{User is logged in.} 326 327 {User is logged in.}
\item 327 328 \item
{User has enrolled in classes.} 328 329 {User has enrolled in classes.}
\end{itemize} 329 330 \end{itemize}
330 331
\item[Post-conditions]{} 331 332 \item[Post-conditions]{}
332 333
\begin{itemize} 333 334 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 334 335 \itemsep1pt\parskip0pt\parsep0pt
\item 335 336 \item
{User shall no longer have access to dropped class, or associated 336 337 {User shall no longer have access to dropped class, or associated
flashcards} 337 338 flashcards}
\end{itemize} 338 339 \end{itemize}
339 340
\item[Trigger]{User clicked button to drop class.} 340 341 \item[Trigger]{User clicked button to drop class.}
341 342
\item[Workflow] 342 343 \item[Workflow]
343 344
\begin{enumerate} 344 345 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 345 346 \itemsep1pt\parskip0pt\parsep0pt
\item 346 347 \item
{The user shall click ``Drop'' (or equivalent) button.} 347 348 {The user shall click ``Drop'' (or equivalent) button.}
\item 348 349 \item
{The client shall display a dialogue box which will say ``Are you 349 350 {The client shall display a dialogue box which will say ``Are you
sure you want to drop this class?''} 350 351 sure you want to drop this class?''}
\item 351 352 \item
{The user shall click ``Yes'' to confirm that they want to drop the 352 353 {The user shall click ``Yes'' to confirm that they want to drop the
class} 353 354 class}
\item 354 355 \item
{The client shall submit a DELETE request to 355 356 {The client shall submit a DELETE request to
/api/users/me/sections/\textless{}section ID number\textgreater{}.} 356 357 /api/users/me/sections/\textless{}section ID number\textgreater{}.}
\item 357 358 \item
{If the user is not already enrolled in the section, the server will 358 359 {If the user is not already enrolled in the section, the server will
return a 404 Not Found error, which the client shall handle. (The 359 360 return a 404 Not Found error, which the client shall handle. (The
client should not show an error to the user)} 360 361 client should not show an error to the user)}
\item 361 362 \item
{The server shall remove the selected class from a user's list of 362 363 {The server shall remove the selected class from a user's list of
classes. } 363 364 classes. }
\item 364 365 \item
{The server shall return success to the client} 365 366 {The server shall return success to the client}
\end{enumerate} 366 367 \end{enumerate}
\end{description} 367 368 \end{description}
\newpage 368 369 \newpage
369 370
{} 370 371 {}
371 372
\subsection{{{{[}A5{]} Password 372 373 \subsection{{{{[}A5{]} Password
change}}{{[}A5{]} Password change}} 373 374 change}}{{[}A5{]} Password change}}
374 375
\begin{description} 375 376 \begin{description}
\item[Description]{The user shall be able to change the password for their 376 377 \item[Description]{The user shall be able to change the password for their
account in the account settings. This requires that they are logged in. 377 378 account in the account settings. This requires that they are logged in.
} 378 379 }
379 380
\item[Desired Outcome]{The user's password shall be changed and the user 380 381 \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} 381 382 shall be able to log in with the new password in the future}
\\\\ 382 383 \\\\
\item[User Goals]{The user wants to use a different password in the future} 383 384 \item[User Goals]{The user wants to use a different password in the future}
384 385
\item[Primary Actor]{User (student)} 385 386 \item[Primary Actor]{User (student)}
386 387
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 387 388 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 388 389 Login}
\\ 389 390 \\
\item[Details]{The user provides their current password and a new password 390 391 \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 391 392 in a form. If the current password is correct, the system updates their
password to the requested new password.} 392 393 password to the requested new password.}
393 394
\item[Priority Level]{``Must''} 394 395 \item[Priority Level]{``Must''}
395 396
\item[Status]{Not }{implemented} 396 397 \item[Status]{Not }{implemented}
397 398
\item[Pre-conditions] 398 399 \item[Pre-conditions]
399 400
\begin{itemize} 400 401 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 401 402 \itemsep1pt\parskip0pt\parsep0pt
\item 402 403 \item
{The user has created an account} 403 404 {The user has created an account}
\item 404 405 \item
{The user has logged in } 405 406 {The user has logged in }
\item 406 407 \item
{The user knows their current password} 407 408 {The user knows their current password}
\end{itemize} 408 409 \end{itemize}
409 410
\item[Post-conditions] 410 411 \item[Post-conditions]
411 412
\begin{itemize} 412 413 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 413 414 \itemsep1pt\parskip0pt\parsep0pt
\item 414 415 \item
{The user's password is changed} 415 416 {The user's password is changed}
\item 416 417 \item
{The user can log in with the new password} 417 418 {The user can log in with the new password}
\end{itemize} 418 419 \end{itemize}
419 420
\item[Trigger]{User clicks ``Change Password'' button in Accounts page} 420 421 \item[Trigger]{User clicks ``Change Password'' button in Accounts page}
421 422
\item[Workflow] 422 423 \item[Workflow]
423 424
\begin{enumerate} 424 425 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 425 426 \itemsep1pt\parskip0pt\parsep0pt
\item 426 427 \item
{The user shall press the ``Change Password'' button} 427 428 {The user shall press the ``Change Password'' button}
\item 428 429 \item
{The client shall render a form that requires the user to enter their 429 430 {The client shall render a form that requires the user to enter their
old password and new password} 430 431 old password and new password}
\item 431 432 \item
{The user shall enter their current password and the desired new 432 433 {The user shall enter their current password and the desired new
password} 433 434 password}
\item 434 435 \item
{The client shall verify that no fields are blank} 435 436 {The client shall verify that no fields are blank}
\item 436 437 \item
{The client shall submit the data to the server by sending a PATCH 437 438 {The client shall submit the data to the server by sending a PATCH
request to /api/users/me containing ``old\_password'' and 438 439 request to /api/users/me containing ``old\_password'' and
``new\_password'' values.} 439 440 ``new\_password'' values.}
\item 440 441 \item
{The server shall validate the pre-existing password} 441 442 {The server shall validate the pre-existing password}
\item 442 443 \item
{If server cannot validate the pre-existing password, the client will 443 444 {If server cannot validate the pre-existing password, the client will
render the same form with a message informing the user that the 444 445 render the same form with a message informing the user that the
pre-existing password that they have provided is incorrect} 445 446 pre-existing password that they have provided is incorrect}
\item 446 447 \item
{If the server successfully validates the pre-existing password, the 447 448 {If the server successfully validates the pre-existing password, the
system shall change the user's password} 448 449 system shall change the user's password}
\item 449 450 \item
{The client shall return a success to the user} 450 451 {The client shall return a success to the user}
\end{enumerate} 451 452 \end{enumerate}
\end{description} 452 453 \end{description}
{} 453 454 {}
454 455
\newpage 455 456 \newpage
456 457
{} 457 458 {}
458 459
\subsection{{{{[}A6{]} Password reset 459 460 \subsection{{{{[}A6{]} Password reset
}}{{[}A6{]} Password reset }} 460 461 }}{{[}A6{]} Password reset }}
461 462
\begin{description} 462 463 \begin{description}
\item[Description]{The user shall be able to reset their password without 463 464 \item[Description]{The user shall be able to reset their password without
being logged in } 464 465 being logged in }
465 466
\item[Desired Outcome]{The user's password shall be changed to one that 466 467 \item[Desired Outcome]{The user's password shall be changed to one that
they remember} 467 468 they remember}
\\ 468 469 \\
\item[User Goals]{The user does not know their current password but wants 469 470 \item[User Goals]{The user does not know their current password but wants
to log into the site} 470 471 to log into the site}
471 472
\item[Primary Actor]{User (student)} 472 473 \item[Primary Actor]{User (student)}
473 474
\item[Dependency Use Cases]{{[}A1{]} User Registration} 474 475 \item[Dependency Use Cases]{{[}A1{]} User Registration}
\\ 475 476 \\
\item[Details]{The user provides their email in a password reset form. If 476 477 \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 477 478 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 478 479 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 479 480 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 480 481 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 481 482 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 482 483 password in a form. When they submit the form, their password is updated
if the token is correct. } 483 484 if the token is correct. }
484 485
\item[Priority Level]{``Must''} 485 486 \item[Priority Level]{``Must''}
486 487
\item[Status]{Not i}{mplemented} 487 488 \item[Status]{Not i}{mplemented}
488 489
\item[Pre-conditions] 489 490 \item[Pre-conditions]
490 491
\begin{itemize} 491 492 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 492 493 \itemsep1pt\parskip0pt\parsep0pt
\item 493 494 \item
{The user has created an account before} 494 495 {The user has created an account before}
\item 495 496 \item
{The user knows the email address attached to their account} 496 497 {The user knows the email address attached to their account}
\end{itemize} 497 498 \end{itemize}
498 499
\item[Post-conditions] 499 500 \item[Post-conditions]
500 501
\begin{itemize} 501 502 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 502 503 \itemsep1pt\parskip0pt\parsep0pt
\item 503 504 \item
{The user's password is changed} 504 505 {The user's password is changed}
\item 505 506 \item
{The user can log in with the new password} 506 507 {The user can log in with the new password}
\end{itemize} 507 508 \end{itemize}
508 509
\item[Trigger]{User clicks ``Forgot Password'' button on the login page} 509 510 \item[Trigger]{User clicks ``Forgot Password'' button on the login page}
510 511
\item[Workflow, requesting password reset] 511 512 \item[Workflow, requesting password reset]
512 513
\begin{enumerate} 513 514 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 514 515 \itemsep1pt\parskip0pt\parsep0pt
\item 515 516 \item
{The user shall click ``Forgot Password'' (or equivalent) button} 516 517 {The user shall click ``Forgot Password'' (or equivalent) button}
\item 517 518 \item
{The client shall prompt the user for their current email} 518 519 {The client shall prompt the user for their current email}
\item 519 520 \item
{The user shall submit their email address} 520 521 {The user shall submit their email address}
\item 521 522 \item
{The client shall validate that the email address is formatted 522 523 {The client shall validate that the email address is formatted
correctly} 523 524 correctly}
\item 524 525 \item
{The client shall submit the email address to the server in a POST 525 526 {The client shall submit the email address to the server in a POST
request to /api/reset\_password with an ``email'' value} 526 527 request to /api/reset\_password with an ``email'' value}
\item 527 528 \item
{The server shall check if an account exists with the email entered by 528 529 {The server shall check if an account exists with the email entered by
the user} 529 530 the user}
\item 530 531 \item
{If no such account exists, the server shall return an error to the 531 532 {If no such account exists, the server shall return an error to the
frontend, which will display it to the user} 532 533 frontend, which will display it to the user}
\item 533 534 \item
{If the account does exist, the server will:} 534 535 {If the account does exist, the server will:}
\end{enumerate} 535 536 \end{enumerate}
536 537
\begin{enumerate} 537 538 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 538 539 \itemsep1pt\parskip0pt\parsep0pt
\item 539 540 \item
{Create a new password reset token for the user} 540 541 {Create a new password reset token for the user}
\item 541 542 \item
{Send an email to the user with a link containing the token and the 542 543 {Send an email to the user with a link containing the token and the
user's ID} 543 544 user's ID}
\end{enumerate} 544 545 \end{enumerate}
545 546
\item[Workflow, resetting password] 546 547 \item[Workflow, resetting password]
547 548
\begin{enumerate} 548 549 \begin{enumerate}
\setcounter{enumi}{8} 549 550 \setcounter{enumi}{8}
\itemsep1pt\parskip0pt\parsep0pt 550 551 \itemsep1pt\parskip0pt\parsep0pt
\item 551 552 \item
{The user shall click the link in the email and visit 552 553 {The user shall click the link in the email and visit
/app/password\_reset} 553 554 /app/password\_reset}
\item 554 555 \item
{The client shall render a form that will prompt the user for a new 555 556 {The client shall render a form that will prompt the user for a new
password} 556 557 password}
\item 557 558 \item
{The user shall provide a new password in the form} 558 559 {The user shall provide a new password in the form}
\item 559 560 \item
{The client shall submit the password to the server} 560 561 {The client shall submit the password to the server}
\item 561 562 \item
{If the user tries to submit without a password in the text field, the 562 563 {If the user tries to submit without a password in the text field, the
client shall display a message saying ``Password cannot be blank.''} 563 564 client shall display a message saying ``Password cannot be blank.''}
\item 564 565 \item
{The server first verifies that the token is valid for the user} 565 566 {The server first verifies that the token is valid for the user}
\item 566 567 \item
{The server then verifies that the user's new password is non-blank} 567 568 {The server then verifies that the user's new password is non-blank}
\item 568 569 \item
{If neither of the above verifications fail, the server shall change 569 570 {If neither of the above verifications fail, the server shall change
the password associated with the user's email. } 570 571 the password associated with the user's email. }
\end{enumerate} 571 572 \end{enumerate}
\end{description} 572 573 \end{description}
\newpage 573 574 \newpage
574 575
{} 575 576 {}
576 577
\subsection{{{{[}A7{]} Limit Student Access to Courses 577 578 \subsection{{{{[}A7{]} Limit Student Access to Courses
}}{{[}A7{]} Limit Student Access to Courses }} 578 579 }}{{[}A7{]} Limit Student Access to Courses }}
579 580
\begin{description} 580 581 \begin{description}
\item[Description]{The instructor shall be able to limit access to the 581 582 \item[Description]{The instructor shall be able to limit access to the
courses that he is in charge of by whitelisting only those students that 582 583 courses that he is in charge of by whitelisting only those students that
are actually in the class.} 583 584 are actually in the class.}
584 585
\item[Desired Outcome]{The class will have limited access and only those 585 586 \item[Desired Outcome]{The class will have limited access and only those
users who are whitelisted may enroll in the class.} 586 587 users who are whitelisted may enroll in the class.}
\\ 587 588 \\
\item[User Goals]{The instructor wants to limit access to his class so only 588 589 \item[User Goals]{The instructor wants to limit access to his class so only
the students who are actually in his class participate, and nobody 589 590 the students who are actually in his class participate, and nobody
else.} 590 591 else.}
591 592
{Primary Actor: }{User (instructor)} 592 593 {Primary Actor: }{User (instructor)}
593 594
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 594 595 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 595 596 Login}
\\ 596 597 \\
\item[Priority Level]{``Should''} 597 598 \item[Priority Level]{``Should''}
598 599
\item[Status]{Not Implemented} 599 600 \item[Status]{Not Implemented}
600 601
\item[Pre-conditions] 601 602 \item[Pre-conditions]
602 603
\begin{itemize} 603 604 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 604 605 \itemsep1pt\parskip0pt\parsep0pt
\item 605 606 \item
{User has valid instructor's account} 606 607 {User has valid instructor's account}
\end{itemize} 607 608 \end{itemize}
608 609
\item[Post-conditions] 609 610 \item[Post-conditions]
610 611
\begin{itemize} 611 612 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 612 613 \itemsep1pt\parskip0pt\parsep0pt
\item 613 614 \item
{Only those users who were whitelisted may add the class.} 614 615 {Only those users who were whitelisted may add the class.}
\end{itemize} 615 616 \end{itemize}
616 617
\item[Trigger]{The instructor emails the administrator and requests to 617 618 \item[Trigger]{The instructor emails the administrator and requests to
limit access to his class.} 618 619 limit access to his class.}
619 620
\item[Workflow] 620 621 \item[Workflow]
621 622
\begin{enumerate} 622 623 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 623 624 \itemsep1pt\parskip0pt\parsep0pt
\item 624 625 \item
{The instructor emails the administrators from his UCSD email address 625 626 {The instructor emails the administrators from his UCSD email address
and requests to limit access to his course. He provides a list of 626 627 and requests to limit access to his course. He provides a list of
emails of the students that are to be whitelisted.} 627 628 emails of the students that are to be whitelisted.}
\item 628 629 \item
{The administrators visit a custom admin page, select the course, and 629 630 {The administrators visit a custom admin page, select the course, and
paste the list of emails. They submit the page directly (no separate 630 631 paste the list of emails. They submit the page directly (no separate
frontend here) to the server.} 631 632 frontend here) to the server.}
\item 632 633 \item
{The server shall create a WhitelistedAddress for each provided email, 633 634 {The server shall create a WhitelistedAddress for each provided email,
attaching it to the section taught by the instructor.} 634 635 attaching it to the section taught by the instructor.}
\item 635 636 \item
{The server shall add any existing users whose email addresses appear 636 637 {The server shall add any existing users whose email addresses appear
in the whitelist to the class. } 637 638 in the whitelist to the class. }
\end{enumerate} 638 639 \end{enumerate}
\end{description} 639 640 \end{description}
\newpage 640 641 \newpage
641 642
\subsection{{{{[}A8{]} User 642 643 \subsection{{{{[}A8{]} User
Logout}}{{[}A8{]} User Logout}} 643 644 Logout}}{{[}A8{]} User Logout}}
644 645
\begin{description} 645 646 \begin{description}
\item[Description]{The user shall be able to log out of his/her account on 646 647 \item[Description]{The user shall be able to log out of his/her account on
the site.} 647 648 the site.}
648 649
\item[Desired Outcome]{The user's information and data will no longer be 649 650 \item[Desired Outcome]{The user's information and data will no longer be
accessible after logging out. } 650 651 accessible after logging out. }
\\ 651 652 \\
\item[User Goals]{The user is done with his/her session of using the 652 653 \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 his/her 653 654 website, and wants to make sure others cannot access the data in his/her
account.} 654 655 account.}
655 656
\item[Primary Actor]{User (student)} 656 657 \item[Primary Actor]{User (student)}
657 658
\item[Dependency Use Cases] None 658 659 \item[Dependency Use Cases] None
\\ 659 660 \\
\item[Priority Level]{``Must''} 660 661 \item[Priority Level]{``Must''}
661 662
\item[Status]{Implemented} 662 663 \item[Status]{Implemented}
663 664
\item[Pre-conditions]{The user is logged into their account} 664 665 \item[Pre-conditions]{The user is logged into their account}
665 666
\item[Post-conditions]{}{The user's data can no longer be accessed.} 666 667 \item[Post-conditions]{}{The user's data can no longer be accessed.}
667 668
\item[Trigger]{User clicks ``Logout'' button} 668 669 \item[Trigger]{User clicks ``Logout'' button}
669 670
\item[Workflow] 670 671 \item[Workflow]
671 672
\begin{enumerate} 672 673 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 673 674 \itemsep1pt\parskip0pt\parsep0pt
\item 674 675 \item
{The server logs the User out using the Django logout feature} 675 676 {The server logs the User out using the Django logout feature}
\item 676 677 \item
{Front-end displays application login page} 677 678 {Front-end displays application login page}
\end{enumerate} 678 679 \end{enumerate}
679 680
\end{description} 680 681 \end{description}
681 682
\newpage 682 683 \newpage
683 684
684 685
685 686
\subsection{{{{[}A9{]} Contact 686 687 \subsection{{{{[}A9{]} Contact
Admin}}{{[}A9{]} Contact Admin}} 687 688 Admin}}{{[}A9{]} Contact Admin}}
688 689
\begin{description} 689 690 \begin{description}
\item[Description]{The user shall be able to contact the admin.} 690 691 \item[Description]{The user shall be able to contact the admin.}
691 692
\item[Desired Outcome]{The user shall send a message to the admin; the 692 693 \item[Desired Outcome]{The user shall send a message to the admin; the
admin shall receive the message.} 693 694 admin shall receive the message.}
694 695
{User Goals:}{The user sends a message to the admin.} 695 696 {User Goals:}{The user sends a message to the admin.}
696 697
\item[Primary Actor]{User} 697 698 \item[Primary Actor]{User}
698 699
\item[Dependency Use Cases]{None} 699 700 \item[Dependency Use Cases]{None}
\\ 700 701 \\
\item[Priority Level]{``Must''} 701 702 \item[Priority Level]{``Must''}
702 703
\item[Status]{Not implemented} 703 704 \item[Status]{Not implemented}
704 705
\item[Pre-conditions]{None.} 705 706 \item[Pre-conditions]{None.}
706 707
\item[Post-conditions]{The admin receives the user's message.} 707 708 \item[Post-conditions]{The admin receives the user's message.}
708 709
\item[Trigger]{User has navigated to our website. } 709 710 \item[Trigger]{User has navigated to our website. }
710 711
\item[Workflow] 711 712 \item[Workflow]
712 713
\begin{enumerate} 713 714 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 714 715 \itemsep1pt\parskip0pt\parsep0pt
\item 715 716 \item
{The frontend displays the admin email address on every page in the 716 717 {The frontend displays the admin email address on every page in the
application.} 717 718 application.}
\end{enumerate} 718 719 \end{enumerate}
\end{description} 719 720 \end{description}
\newpage 720 721 \newpage
721 722
{} 722 723 {}
\section{Flashcards} 723 724 \section{Flashcards}
\subsection{{{{[}F1{]} Push Flashcard 724 725 \subsection{{{{[}F1{]} Push Flashcard
}}{{[}F1{]} Push Flashcard }} 725 726 }}{{[}F1{]} Push Flashcard }}
726 727
\begin{description} 727 728 \begin{description}
\item[Description]{The user shall be able to create a flashcard with their 728 729 \item[Description]{The user shall be able to create a flashcard with their
input. } 729 730 input. }
730 731
\item[Desired Outcome]{The user shall have the flashcard added to their own 731 732 \item[Desired Outcome]{The user shall have the flashcard added to their own
deck and the Live Feed. } 732 733 deck and the Live Feed. }
\\ 733 734 \\
\item[User Goals]{The user will see their flashcard in their deck and the 734 735 \item[User Goals]{The user will see their flashcard in their deck and the
flashcard will be shared with others. } 735 736 flashcard will be shared with others. }
736 737
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 737 738 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 738 739 Login, {[}A3{]} Add a Class}
\\ 739 740 \\
\item[Pre-conditions] 740 741 \item[Pre-conditions]
741 742
\begin{itemize} 742 743 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 743 744 \itemsep1pt\parskip0pt\parsep0pt
\item 744 745 \item
{The User has an account } 745 746 {The User has an account }
\item 746 747 \item
{The User has added at least one class} 747 748 {The User has added at least one class}
\item 748 749 \item
{The User is on the class' page} 749 750 {The User is on the class' page}
\end{itemize} 750 751 \end{itemize}
751 752
\item[Post-conditions] 752 753 \item[Post-conditions]
753 754
\begin{itemize} 754 755 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 755 756 \itemsep1pt\parskip0pt\parsep0pt
\item 756 757 \item
{The User has flashcard added to their deck} 757 758 {The User has flashcard added to their deck}
\item 758 759 \item
{The Flashcard is shown in the Live Feed} 759 760 {The Flashcard is shown in the Live Feed}
\item 760 761 \item
{Other users can add this flashcard to their decks} 761 762 {Other users can add this flashcard to their decks}
\end{itemize} 762 763 \end{itemize}
763 764
\item[Trigger]{} 764 765 \item[Trigger]{}
765 766
\begin{itemize} 766 767 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 767 768 \itemsep1pt\parskip0pt\parsep0pt
\item 768 769 \item
{The User has clicked on the button ``Make New Flashcard''.} 769 770 {The User has clicked on the button ``Make New Flashcard''.}
\item 770 771 \item
{The Server receives a POST request containing the flashcard data.} 771 772 {The Server receives a POST request containing the flashcard data.}
\end{itemize} 772 773 \end{itemize}
773 774
\item[Workflow] 774 775 \item[Workflow]
775 776
\begin{enumerate} 776 777 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 777 778 \itemsep1pt\parskip0pt\parsep0pt
\item 778 779 \item
{The User is at the live feed for the class.} 779 780 {The User is at the live feed for the class.}
\item 780 781 \item
{The User shall click on the button}{Push 781 782 {The User shall click on the button}{Push
Flashcard} 782 783 Flashcard}
\item 783 784 \item
{The 784 785 {The
}{Client}{shall 785 786 }{Client}{shall
present a dialog box for inputting the flashcard text to the User.} 786 787 present a dialog box for inputting the flashcard text to the User.}
\item 787 788 \item
{The User shall input the flashcard text.} 788 789 {The User shall input the flashcard text.}
\item 789 790 \item
{Optionally, the User shall mark keywords in the flashcard text.} 790 791 {Optionally, the User shall mark keywords in the flashcard text.}
\item 791 792 \item
{If the User creates this flashcard outside of the lecture time, he 792 793 {If the User creates this flashcard outside of the lecture time, he
will get the option to change the material date.} 793 794 will get the option to change the material date.}
\item 794 795 \item
{The User shall click on the `Submit' button to submit the flashcard 795 796 {The User shall click on the `Submit' button to submit the flashcard
text, blanks, and material date, in JSON form as a POST request.} 796 797 text, blanks, and material date, in JSON form as a POST request.}
\item 797 798 \item
{The Server shall obtain the flashcard information by deserializing 798 799 {The Server shall obtain the flashcard information by deserializing
the JSON in the POST request.} 799 800 the JSON in the POST request.}
\item 800 801 \item
{The Server shall create a new record for this flashcard in the 801 802 {The Server shall create a new record for this flashcard in the
Flashcards table in the database.} 802 803 Flashcards table in the database.}
\item 803 804 \item
{The Server shall publish the newly created card to the live feed of 804 805 {The Server shall publish the newly created card to the live feed of
the class.} 805 806 the class.}
\end{enumerate} 806 807 \end{enumerate}
\end{description} 807 808 \end{description}
{Alternative Workflow:} 808 809 {Alternative Workflow:}
809 810
\begin{enumerate} 810 811 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 811 812 \itemsep1pt\parskip0pt\parsep0pt
\item 812 813 \item
{The User shall view a flashcard that he/she did not create} 813 814 {The User shall view a flashcard that he/she did not create}
\item 814 815 \item
{The User shall click ``Edit''} 815 816 {The User shall click ``Edit''}
\item 816 817 \item
{The client shall present a dialog box for editing the existing 817 818 {The client shall present a dialog box for editing the existing
flashcard text} 818 819 flashcard text}
\item 819 820 \item
{The User shall make edits} 820 821 {The User shall make edits}
\item 821 822 \item
{The User shall click ``save''} 822 823 {The User shall click ``save''}
\item 823 824 \item
{The client shall send a POST request} 824 825 {The client shall send a POST request}
\item 825 826 \item
{The server shall remove the original card from user's deck} 826 827 {The server shall remove the original card from user's deck}
\item 827 828 \item
{The Server shall obtain the flashcard information by deserializing 828 829 {The Server shall obtain the flashcard information by deserializing
the JSON in the POST request.} 829 830 the JSON in the POST request.}
\item 830 831 \item
{The Server shall create a new record for this flashcard in the 831 832 {The Server shall create a new record for this flashcard in the
Flashcards table in the database.} 832 833 Flashcards table in the database.}
\item 833 834 \item
{The Server shall publish the newly created card to the live feed of 834 835 {The Server shall publish the newly created card to the live feed of
the class.} 835 836 the class.}
\end{enumerate} 836 837 \end{enumerate}
837 838
\newpage 838 839 \newpage
839 840
{} 840 841 {}
841 842
\subsection{{{{[}F2{]} Edit 842 843 \subsection{{{{[}F2{]} Edit
Flashcard}}{{[}F2{]} Edit Flashcard}} 843 844 Flashcard}}{{[}F2{]} Edit Flashcard}}
844 845
\begin{description} 845 846 \begin{description}
\item[Description]{The user shall be able to edit the text on their own 846 847 \item[Description]{The user shall be able to edit the text on their own
flashcard } 847 848 flashcard }
848 849
\item[Desired Outcome]{Flashcard is edited and saved appropriately} 849 850 \item[Desired Outcome]{Flashcard is edited and saved appropriately}
\\ 850 851 \\
\item[User Goals]{To be able to change text on a flashcard} 851 852 \item[User Goals]{To be able to change text on a flashcard}
852 853
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 853 854 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull 854 855 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull
Flashcard} 855 856 Flashcard}
856 857
\item[Pre-conditions] 857 858 \item[Pre-conditions]
858 859
\begin{itemize} 859 860 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 860 861 \itemsep1pt\parskip0pt\parsep0pt
\item 861 862 \item
{Flashcard is created} 862 863 {Flashcard is created}
\item 863 864 \item
{Flashcard in user's deck} 864 865 {Flashcard in user's deck}
\item 865 866 \item
{Flashcard is viewable} 866 867 {Flashcard is viewable}
\end{itemize} 867 868 \end{itemize}
868 869
\item[Post-conditions] 869 870 \item[Post-conditions]
870 871
\begin{itemize} 871 872 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 872 873 \itemsep1pt\parskip0pt\parsep0pt
\item 873 874 \item
{Flashcard is edited} 874 875 {Flashcard is edited}
\end{itemize} 875 876 \end{itemize}
876 877
\item[Trigger]{User has clicked ``Edit'' button when viewing a specific 877 878 \item[Trigger]{User has clicked ``Edit'' button when viewing a specific
flashcard} 878 879 flashcard}
879 880
\item[Workflow] 880 881 \item[Workflow]
881 882
\begin{enumerate} 882 883 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 883 884 \itemsep1pt\parskip0pt\parsep0pt
\item 884 885 \item
{The user shall view their deck} 885 886 {The user shall view their deck}
\item 886 887 \item
{The client shall present user with a grid view of cards in 887 888 {The client shall present user with a grid view of cards in
chronological creation order} 888 889 chronological creation order}
\item 889 890 \item
{The user shall select a flashcard and click `Edit'} 890 891 {The user shall select a flashcard and click `Edit'}
\item 891 892 \item
{The client shall produce an editable dialog box containing flashcard 892 893 {The client shall produce an editable dialog box containing flashcard
text} 893 894 text}
\item 894 895 \item
{The user shall make desired changes} 895 896 {The user shall make desired changes}
\item 896 897 \item
{The user shall click `Save'} 897 898 {The user shall click `Save'}
\item 898 899 \item
{The client shall generate a POST request for a new flashcard and send 899 900 {The client shall generate a POST request for a new flashcard and send
it to the server} 900 901 it to the server}
\item 901 902 \item
{If the user changed only the blanks of the cards, the server shall 902 903 {If the user changed only the blanks of the cards, the server shall
create a new FlashcardMask object and update the appropriate 903 904 create a new FlashcardMask object and update the appropriate
UserFlashcard object with a reference to it.} 904 905 UserFlashcard object with a reference to it.}
\item 905 906 \item
{If the user changed the text of the card, the server will instead:} 906 907 {If the user changed the text of the card, the server will instead:}
\end{enumerate} 907 908 \end{enumerate}
908 909
\begin{enumerate} 909 910 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 910 911 \itemsep1pt\parskip0pt\parsep0pt
\item 911 912 \item
{create a new flashcard for the section} 912 913 {create a new flashcard for the section}
\item 913 914 \item
{push it to the feed} 914 915 {push it to the feed}
\item 915 916 \item
{add it to the user's deck} 916 917 {add it to the user's deck}
\item 917 918 \item
{hide the old card from the user} 918 919 {hide the old card from the user}
\item 919 920 \item
{and return the new card to the user} 920 921 {and return the new card to the user}
\end{enumerate} 921 922 \end{enumerate}
\end{description} 922 923 \end{description}
{} 923 924 {}
924 925
\newpage 925 926 \newpage
926 927
{} 927 928 {}
928 929
\subsection{{{{[}F3{]} Pull 929 930 \subsection{{{{[}F3{]} Pull
Flashcard}}{{[}F3{]} Pull Flashcard}} 930 931 Flashcard}}{{[}F3{]} Pull Flashcard}}
\begin{description} 931 932 \begin{description}
\item[Description]{The User shall be able to add flash cards to their own 932 933 \item[Description]{The User shall be able to add flash cards to their own
deck from the Live Feed. } 933 934 deck from the Live Feed. }
934 935
\item[Desired Outcome]{The User shall have the flashcard added to their own 935 936 \item[Desired Outcome]{The User shall have the flashcard added to their own
deck } 936 937 deck }
\\ 937 938 \\
\item[User Goals]{The user will be able to review that flashcard. } 938 939 \item[User Goals]{The user will be able to review that flashcard. }
939 940
\item[Primary Actor]{User (student)} 940 941 \item[Primary Actor]{User (student)}
941 942
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 942 943 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashard} 943 944 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashard}
\\ 944 945 \\
\item[Priority Level]{``Must'' } 945 946 \item[Priority Level]{``Must'' }
946 947
\item[Status]{Not Implemented} 947 948 \item[Status]{Not Implemented}
948 949
\item[Pre-conditions] 949 950 \item[Pre-conditions]
950 951
\begin{itemize} 951 952 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 952 953 \itemsep1pt\parskip0pt\parsep0pt
\item 953 954 \item
{Flashcard has been created } 954 955 {Flashcard has been created }
\item 955 956 \item
{That flashcard is in the Live Feed} 956 957 {That flashcard is in the Live Feed}
\end{itemize} 957 958 \end{itemize}
958 959
\item[Post-conditions] 959 960 \item[Post-conditions]
960 961
\begin{itemize} 961 962 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 962 963 \itemsep1pt\parskip0pt\parsep0pt
\item 963 964 \item
{User shall have that flashcard added to their deck} 964 965 {User shall have that flashcard added to their deck}
\item 965 966 \item
{User can review this flashcard later} 966 967 {User can review this flashcard later}
\end{itemize} 967 968 \end{itemize}
968 969
\item[Trigger]{User has clicked on the flashcard in the Live Feed.} 969 970 \item[Trigger]{User has clicked on the flashcard in the Live Feed.}
970 971
\item[Workflow] 971 972 \item[Workflow]
972 973
\begin{enumerate} 973 974 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 974 975 \itemsep1pt\parskip0pt\parsep0pt
\item 975 976 \item
{The User is in the Live Feed.} 976 977 {The User is in the Live Feed.}
\item 977 978 \item
{User shall click on the ``Pull Flashcard'' button on a Flashcard in 978 979 {User shall click on the ``Pull Flashcard'' button on a Flashcard in
the Feed.} 979 980 the Feed.}
\item 980 981 \item
{The Client shall make the pulled Flashcard disappear from the Live 981 982 {The Client shall make the pulled Flashcard disappear from the Live
Feed} 982 983 Feed}
\item 983 984 \item
{The Client shall make the pulled Flashcard appear in the User's Deck 984 985 {The Client shall make the pulled Flashcard appear in the User's Deck
on the sidebar.} 985 986 on the sidebar.}
\item 986 987 \item
{The Client shall submit a POST request to 987 988 {The Client shall submit a POST request to
/api/flashcards/\textless{}flashcard id\textgreater{}/pull} 988 989 /api/flashcards/\textless{}flashcard id\textgreater{}/pull}
\item 989 990 \item
{The server shall create a UserFlashcard object to represent that the 990 991 {The server shall create a UserFlashcard object to represent that the
user's deck contains the card.} 991 992 user's deck contains the card.}
\item 992 993 \item
{The server shall notify connected clients about the new card rating, 993 994 {The server shall notify connected clients about the new card rating,
if any} 994 995 if any}
\item 995 996 \item
{Connected clients will take the new rating into account when next 996 997 {Connected clients will take the new rating into account when next
rearranging the feed.} 997 998 rearranging the feed.}
\end{enumerate} 998 999 \end{enumerate}
\end{description} 999 1000 \end{description}
\newpage 1000 1001 \newpage
1001 1002
{} 1002 1003 {}
1003 1004
\subsection{{{{[}F4{]} Flag Inappropriate 1004 1005 \subsection{{{{[}F4{]} Flag Inappropriate
Cards}}{{[}F4{]} Flag Inappropriate Cards}} 1005 1006 Cards}}{{[}F4{]} Flag Inappropriate Cards}}
1006 1007
\begin{description} 1007 1008 \begin{description}
\item[Description]{Cards may be flagged indicating inappropriate content} 1008 1009 \item[Description]{Cards may be flagged indicating inappropriate content}
1009 1010
\item[Desired Outcome]{The flashcard's inappropriateness variable is 1010 1011 \item[Desired Outcome]{The flashcard's inappropriateness variable is
adjusted} 1011 1012 adjusted}
\\ 1012 1013 \\
\item[User Goals]{To note if a card should not belong in the class and 1013 1014 \item[User Goals]{To note if a card should not belong in the class and
should not be displayed in the feed} 1014 1015 should not be displayed in the feed}
1015 1016
\item[Primary Actor]{User (Student)} 1016 1017 \item[Primary Actor]{User (Student)}
1017 1018
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1018 1019 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1019 1020 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1020 1021 \\
\item[Priority Level]{``Should''} 1021 1022 \item[Priority Level]{``Should''}
1022 1023
\item[Status]{Unimplemented} 1023 1024 \item[Status]{Unimplemented}
1024 1025
\item[Pre-conditions] 1025 1026 \item[Pre-conditions]
1026 1027
\begin{itemize} 1027 1028 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1028 1029 \itemsep1pt\parskip0pt\parsep0pt
\item 1029 1030 \item
{User is enrolled in a class} 1030 1031 {User is enrolled in a class}
\end{itemize} 1031 1032 \end{itemize}
1032 1033
\begin{itemize} 1033 1034 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1034 1035 \itemsep1pt\parskip0pt\parsep0pt
\item 1035 1036 \item
{Flashcard is created} 1036 1037 {Flashcard is created}
\item 1037 1038 \item
{Flashcard is viewable in feed} 1038 1039 {Flashcard is viewable in feed}
\end{itemize} 1039 1040 \end{itemize}
1040 1041
\item[Post-conditions] 1041 1042 \item[Post-conditions]
1042 1043
\begin{itemize} 1043 1044 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1044 1045 \itemsep1pt\parskip0pt\parsep0pt
\item 1045 1046 \item
{Flashcard is hidden from user} 1046 1047 {Flashcard is hidden from user}
\item 1047 1048 \item
{Flashcard internal variable is adjusted} 1048 1049 {Flashcard internal variable is adjusted}
\end{itemize} 1049 1050 \end{itemize}
1050 1051
\item[Trigger]{User clicks flag on a specific flashcard} 1051 1052 \item[Trigger]{User clicks flag on a specific flashcard}
1052 1053
\item[Workflow] 1053 1054 \item[Workflow]
1054 1055
\begin{enumerate} 1055 1056 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1056 1057 \itemsep1pt\parskip0pt\parsep0pt
\item 1057 1058 \item
{The User is at a page of their classes.} 1058 1059 {The User is at a page of their classes.}
\item 1059 1060 \item
{The User selects one of their classes to enter the Live Feed.} 1060 1061 {The User selects one of their classes to enter the Live Feed.}
\item 1061 1062 \item
{The User is on the Live Feed for his/her class.} 1062 1063 {The User is on the Live Feed for his/her class.}
\item 1063 1064 \item
{The User shall identify an inappropriate card and flag the card.} 1064 1065 {The User shall identify an inappropriate card and flag the card.}
\item 1065 1066 \item
{The User clicks the ``Flag as Inappropriate'' button on the flashcard 1066 1067 {The User clicks the ``Flag as Inappropriate'' button on the flashcard
that he/she wants to report} 1067 1068 that he/she wants to report}
\item 1068 1069 \item
{The Client shall hide the card from the user} 1069 1070 {The Client shall hide the card from the user}
\item 1070 1071 \item
{The server shall create a FlashcardReport object} 1071 1072 {The server shall create a FlashcardReport object}
\end{enumerate} 1072 1073 \end{enumerate}
\end{description} 1073 1074 \end{description}
{} 1074 1075 {}
1075 1076
{} 1076 1077 {}
1077 1078
\newpage 1078 1079 \newpage
1079 1080
{} 1080 1081 {}
1081 1082
\subsection{{{{[}F5{]} Filter 1082 1083 \subsection{{{{[}F5{]} Filter
Flashcards}}{{[}F5{]} Filter Flashcards}} 1083 1084 Flashcards}}{{[}F5{]} Filter Flashcards}}
1084 1085
\begin{description} 1085 1086 \begin{description}
\item[Description]{The user is able to filter for flashcards by date} 1086 1087 \item[Description]{The user is able to filter for flashcards by date}
1087 1088
\item[Desired Outcome]{The user shall see flashcards based on the filter 1088 1089 \item[Desired Outcome]{The user shall see flashcards based on the filter
options} 1089 1090 options}
1090 1091
{User Goals:}{The user can find what he/she is specifically looking 1091 1092 {User Goals:}{The user can find what he/she is specifically looking
for} 1092 1093 for}
1093 1094
\item[Primary Actor]{User (student)} 1094 1095 \item[Primary Actor]{User (student)}
1095 1096
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1096 1097 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull 1097 1098 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull
Flashcard} 1098 1099 Flashcard}
\\ 1099 1100 \\
\item[Priority Level]{''Should''} 1100 1101 \item[Priority Level]{''Should''}
1101 1102
\item[Status]{Not}{}{Implemented } 1102 1103 \item[Status]{Not}{}{Implemented }
1103 1104
\item[Pre-conditions] 1104 1105 \item[Pre-conditions]
1105 1106
\begin{itemize} 1106 1107 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1107 1108 \itemsep1pt\parskip0pt\parsep0pt
\item 1108 1109 \item
{User has registered for the course } 1109 1110 {User has registered for the course }
\item 1110 1111 \item
{Flashcards exist in the course} 1111 1112 {Flashcards exist in the course}
\end{itemize} 1112 1113 \end{itemize}
1113 1114
\item[Post-conditions]{} 1114 1115 \item[Post-conditions]{}
1115 1116
\begin{itemize} 1116 1117 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1117 1118 \itemsep1pt\parskip0pt\parsep0pt
\item 1118 1119 \item
{User only sees specific flashcards} 1119 1120 {User only sees specific flashcards}
\end{itemize} 1120 1121 \end{itemize}
1121 1122
\item[Trigger]{User has selected advanced options from menu} 1122 1123 \item[Trigger]{User has selected advanced options from menu}
1123 1124
\item[Workflow] 1124 1125 \item[Workflow]
1125 1126
\begin{enumerate} 1126 1127 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1127 1128 \itemsep1pt\parskip0pt\parsep0pt
\item 1128 1129 \item
{The User chooses one of their classes.} 1129 1130 {The User chooses one of their classes.}
\item 1130 1131 \item
{The User presses the class they want to view.} 1131 1132 {The User presses the class they want to view.}
\item 1132 1133 \item
{The Client displays the Live Feed.} 1133 1134 {The Client displays the Live Feed.}
\item 1134 1135 \item
{The User is at the Live Feed.} 1135 1136 {The User is at the Live Feed.}
\item 1136 1137 \item
{The User wants to filter the cards on the Live Feed.} 1137 1138 {The User wants to filter the cards on the Live Feed.}
\item 1138 1139 \item
{The User shall select what filter option they want from a drop down 1139 1140 {The User shall select what filter option they want from a drop down
menu.} 1140 1141 menu.}
\item 1141 1142 \item
{The Client shall display only relevant flashcards.} 1142 1143 {The Client shall display only relevant flashcards.}
\end{enumerate} 1143 1144 \end{enumerate}
\end{description} 1144 1145 \end{description}
{} 1145 1146 {}
1146 1147
\newpage 1147 1148 \newpage
1148 1149
{} 1149 1150 {}
1150 1151
\subsection{{{{[}F6{]} Blank Out Words in 1151 1152 \subsection{{{{[}F6{]} Blank Out Words in
Flashcard}}{{[}F6{]} Blank Out Words in Flashcard}} 1152 1153 Flashcard}}{{[}F6{]} Blank Out Words in Flashcard}}
1153 1154
\begin{description} 1154 1155 \begin{description}
\item[Description]{The User shall be able to blank out keywords in any 1155 1156 \item[Description]{The User shall be able to blank out keywords in any
flashcard in his deck. } 1156 1157 flashcard in his deck. }
1157 1158
\item[Desired Outcome]{The blanked out words in the flashcard notify the 1158 1159 \item[Desired Outcome]{The blanked out words in the flashcard notify the
System that they are keywords. } 1159 1160 System that they are keywords. }
\\ 1160 1161 \\
\item[User Goals]{The User shall mark some words as keywords so the System 1161 1162 \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 1162 1163 may later quiz theirself by blanking out the keywords and having the
User guess what they are.} 1163 1164 User guess what they are.}
1164 1165
{Primary Actor: }{User (student)} 1165 1166 {Primary Actor: }{User (student)}
1166 1167
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1167 1168 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1168 1169 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1169 1170 \\
\item[Priority Level]{``Must''} 1170 1171 \item[Priority Level]{``Must''}
1171 1172
\item[Status]{Not implemented.} 1172 1173 \item[Status]{Not implemented.}
1173 1174
\item[Pre-conditions] 1174 1175 \item[Pre-conditions]
1175 1176
\begin{itemize} 1176 1177 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1177 1178 \itemsep1pt\parskip0pt\parsep0pt
\item 1178 1179 \item
{The User has the flashcard he wishes to blank out words from in his 1179 1180 {The User has the flashcard he wishes to blank out words from in his
deck.} 1180 1181 deck.}
\item 1181 1182 \item
{The User shall (be on the class page and) view deck} 1182 1183 {The User shall (be on the class page and) view deck}
\end{itemize} 1183 1184 \end{itemize}
1184 1185
{Post-conditions: } 1185 1186 {Post-conditions: }
1186 1187
\begin{itemize} 1187 1188 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1188 1189 \itemsep1pt\parskip0pt\parsep0pt
\item 1189 1190 \item
{The blanked out words in the flashcard are marked as keywords.} 1190 1191 {The blanked out words in the flashcard are marked as keywords.}
\item 1191 1192 \item
{The System shall blank out the keywords and let the User guess what 1192 1193 {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.} 1193 1194 they are when it presents the flashcard to the User for reviewing.}
\end{itemize} 1194 1195 \end{itemize}
1195 1196
\item[Trigger]{The User clicks on a flashcard.} 1196 1197 \item[Trigger]{The User clicks on a flashcard.}
1197 1198
\item[Workflow] 1198 1199 \item[Workflow]
1199 1200
\begin{enumerate} 1200 1201 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1201 1202 \itemsep1pt\parskip0pt\parsep0pt
\item 1202 1203 \item
{The Client shall a show deck to user} 1203 1204 {The Client shall a show deck to user}
\item 1204 1205 \item
{The User shall click on the flashcard in his deck that he wants to 1205 1206 {The User shall click on the flashcard in his deck that he wants to
blank out words from} 1206 1207 blank out words from}
\item 1207 1208 \item
{The client shall bring user to edit flashcard page/popup} 1208 1209 {The client shall bring user to edit flashcard page/popup}
\item 1209 1210 \item
{The User shall click on the words that he wishes to blank out} 1210 1211 {The User shall click on the words that he wishes to blank out}
\item 1211 1212 \item
{The client shall specify a character range as blank} 1212 1213 {The client shall specify a character range as blank}
\item 1213 1214 \item
{The server shall mark those words by updating the Flashcard Mask for 1214 1215 {The server shall mark those words by updating the Flashcard Mask for
that flashcard. } 1215 1216 that flashcard. }
\item 1216 1217 \item
{The User shall click on `Save' or the equivalent button to save the 1217 1218 {The User shall click on `Save' or the equivalent button to save the
changes} 1218 1219 changes}
\item 1219 1220 \item
{The server will save the blanked out words as keywords to the 1220 1221 {The server will save the blanked out words as keywords to the
Flashcard Mask to review} 1221 1222 Flashcard Mask to review}
\item 1222 1223 \item
{The client shall cover the keywords with whitespace to hide them from 1223 1224 {The client shall cover the keywords with whitespace to hide them from
the User} 1224 1225 the User}
\end{enumerate} 1225 1226 \end{enumerate}
1226 1227
{Alternative Workflows:} 1227 1228 {Alternative Workflows:}
1228 1229
\begin{enumerate} 1229 1230 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1230 1231 \itemsep1pt\parskip0pt\parsep0pt
\item 1231 1232 \item
{The User shall (be on the class page and) click ``Make New 1232 1233 {The User shall (be on the class page and) click ``Make New
Flashcard''} 1233 1234 Flashcard''}
\item 1234 1235 \item
{The client shall present user with a new flashcard to fill in} 1235 1236 {The client shall present user with a new flashcard to fill in}
\item 1236 1237 \item
{The User shall fill in the information} 1237 1238 {The User shall fill in the information}
\item 1238 1239 \item
{The client shall ask if the user wants to specify blanks} 1239 1240 {The client shall ask if the user wants to specify blanks}
\item 1240 1241 \item
{The System will save the blanked out words as keywords to the 1241 1242 {The System will save the blanked out words as keywords to the
Flashcard Mask to review} 1242 1243 Flashcard Mask to review}
\item 1243 1244 \item
{The client shall cover the keywords with whitespace to hide them from 1244 1245 {The client shall cover the keywords with whitespace to hide them from
the User} 1245 1246 the User}
\end{enumerate} 1246 1247 \end{enumerate}
\end{description} 1247 1248 \end{description}
{} 1248 1249 {}
1249 1250
\newpage 1250 1251 \newpage
1251 1252
{} 1252 1253 {}
1253 1254
\subsection{{{{[}F7{]} Fix 1254 1255 \subsection{{{{[}F7{]} Fix
Flashcard}}{{[}F7{]} Fix Flashcard}} 1255 1256 Flashcard}}{{[}F7{]} Fix Flashcard}}
1256 1257
\begin{description} 1257 1258 \begin{description}
\item[Description]{The User shall be able to alter a flashcard he/she made 1258 1259 \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.} 1259 1260 originally and not have to make a new copy of it.}
1260 1261
\item[Desired Outcome]{The User shall alter one flashcard and that 1261 1262 \item[Desired Outcome]{The User shall alter one flashcard and that
alteration will be shown to all users of that flashcard} 1262 1263 alteration will be shown to all users of that flashcard}
\\ 1263 1264 \\
\item[User Goals]{The user shall make the flashcard say something different 1264 1265 \item[User Goals]{The user shall make the flashcard say something different
than it did originally.} 1265 1266 than it did originally.}
1266 1267
\item[Primary Actor]{User (student) } 1267 1268 \item[Primary Actor]{User (student) }
1268 1269
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1269 1270 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1270 1271 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1271 1272 \\
\item[Priority Level]{Must} 1272 1273 \item[Priority Level]{Must}
1273 1274
\item[Status]{Not Implemented} 1274 1275 \item[Status]{Not Implemented}
1275 1276
\item[Pre-conditions] 1276 1277 \item[Pre-conditions]
1277 1278
\begin{itemize} 1278 1279 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1279 1280 \itemsep1pt\parskip0pt\parsep0pt
\item 1280 1281 \item
{User has created the flashcard} 1281 1282 {User has created the flashcard}
\end{itemize} 1282 1283 \end{itemize}
1283 1284
\item[Post-conditions]{} 1284 1285 \item[Post-conditions]{}
1285 1286
\begin{itemize} 1286 1287 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1287 1288 \itemsep1pt\parskip0pt\parsep0pt
\item 1288 1289 \item
{The user shall see their alteration for that flashcard} 1289 1290 {The user shall see their alteration for that flashcard}
\item 1290 1291 \item
{Other users will be notified of the alteration} 1291 1292 {Other users will be notified of the alteration}
\end{itemize} 1292 1293 \end{itemize}
1293 1294
\item[Trigger]{User (creator of original card) has clicked on the button 1294 1295 \item[Trigger]{User (creator of original card) has clicked on the button
``Edit''} 1295 1296 ``Edit''}
1296 1297
\item[Workflow] 1297 1298 \item[Workflow]
1298 1299
\begin{enumerate} 1299 1300 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1300 1301 \itemsep1pt\parskip0pt\parsep0pt
\item 1301 1302 \item
{User shall select one of the Flashcards they authored.} 1302 1303 {User shall select one of the Flashcards they authored.}
\item 1303 1304 \item
{User shall select ``Edit'' button on the flashcard.} 1304 1305 {User shall select ``Edit'' button on the flashcard.}
\item 1305 1306 \item
{Client shall display an ``Edit Flashcard'' view.} 1306 1307 {Client shall display an ``Edit Flashcard'' view.}
\item 1307 1308 \item
{The Flashcard will display editable fields/areas.} 1308 1309 {The Flashcard will display editable fields/areas.}
\item 1309 1310 \item
{The User shall input any changes to the Flashcard.} 1310 1311 {The User shall input any changes to the Flashcard.}
\item 1311 1312 \item
{The User shall select the ``Done Editing'' button.} 1312 1313 {The User shall select the ``Done Editing'' button.}
\item 1313 1314 \item
{The Client shall close the ``Edit Flashcard'' view.} 1314 1315 {The Client shall close the ``Edit Flashcard'' view.}
\item 1315 1316 \item
{The server shall update the Flashcard's content.} 1316 1317 {The server shall update the Flashcard's content.}
\item 1317 1318 \item
{Client shall notify users with the Flashcard that the Flashcard has 1318 1319 {Client shall notify users with the Flashcard that the Flashcard has
been edited, allowing the other users to keep or to discard the 1319 1320 been edited, allowing the other users to keep or to discard the
changes.} 1320 1321 changes.}
\end{enumerate} 1321 1322 \end{enumerate}
\end{description} 1322 1323 \end{description}
{} 1323 1324 {}
1324 1325
{} 1325 1326 {}
1326 1327
{} 1327 1328 {}
1328 1329
\newpage 1329 1330 \newpage
1330 1331
{} 1331 1332 {}
1332 1333
\subsection{{{{[}F8{]} Hide cards from 1333 1334 \subsection{{{{[}F8{]} Hide cards from
feed}}{{[}F8{]} Hide cards from feed}} 1334 1335 feed}}{{[}F8{]} Hide cards from feed}}
1335 1336
\begin{description} 1336 1337 \begin{description}
\item[Description]{The user shall be able to hide cards from feed} 1337 1338 \item[Description]{The user shall be able to hide cards from feed}
1338 1339
\item[Desired Outcome]{The card is no longer visible to the user} 1339 1340 \item[Desired Outcome]{The card is no longer visible to the user}
\\ 1340 1341 \\
\item[User Goals]{The card has been looked at and should be hidden to 1341 1342 \item[User Goals]{The card has been looked at and should be hidden to
reduce screen clutter} 1342 1343 reduce screen clutter}
1343 1344
{Primary Actor: }{User (Student)} 1344 1345 {Primary Actor: }{User (Student)}
1345 1346
\item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User 1346 1347 \item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1347 1348 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1348 1349 \\
\item[Priority Level]{``Should''} 1349 1350 \item[Priority Level]{``Should''}
1350 1351
{Status:}{Not implemented} 1351 1352 {Status:}{Not implemented}
1352 1353
\item[Pre-conditions]{Flashcard is created, flashcard is viewable by user} 1353 1354 \item[Pre-conditions]{Flashcard is created, flashcard is viewable by user}
1354 1355
\item[Post-conditions]{Flashcard is not viewable by user} 1355 1356 \item[Post-conditions]{Flashcard is not viewable by user}
1356 1357
\item[Trigger]{Card is flagged; Card is noted to be hidden} 1357 1358 \item[Trigger]{Card is flagged; Card is noted to be hidden}
1358 1359
\item[Workflow] 1359 1360 \item[Workflow]
1360 1361
\begin{enumerate} 1361 1362 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1362 1363 \itemsep1pt\parskip0pt\parsep0pt
\item 1363 1364 \item
{The User chooses a class from the dashboard.} 1364 1365 {The User chooses a class from the dashboard.}
\item 1365 1366 \item
{The Client shows the Live Feed for the selected class.} 1366 1367 {The Client shows the Live Feed for the selected class.}
\item 1367 1368 \item
{The User sees a card they want to hide from the Live Feed.} 1368 1369 {The User sees a card they want to hide from the Live Feed.}
\item 1369 1370 \item
{The User shall press a ``Hide Flashcard'' button on the card to be 1370 1371 {The User shall press a ``Hide Flashcard'' button on the card to be
hidden.} 1371 1372 hidden.}
\item 1372 1373 \item
{The Client shall hide the card of interest from the Live Feed, for 1373 1374 {The Client shall hide the card of interest from the Live Feed, for
only that User.} 1374 1375 only that User.}
\end{enumerate} 1375 1376 \end{enumerate}
1376 1377
\end{description} 1377 1378 \end{description}
1378 1379
\newpage 1379 1380 \newpage
1380 1381
{} 1381 1382 {}
1382 1383
\subsection{{{{[}F9{]} View a 1383 1384 \subsection{{{{[}F9{]} View a
Feed}}{{[}F9{]} View a Feed}} 1384 1385 Feed}}{{[}F9{]} View a Feed}}
1385 1386
\begin{description} 1386 1387 \begin{description}
\item[Description]{The user shall be able to view Live Feeds for different 1387 1388 \item[Description]{The user shall be able to view Live Feeds for different
classes} 1388 1389 classes}
1389 1390
\item[Desired Outcome]{The system shall only show the user Live Feeds for 1390 1391 \item[Desired Outcome]{The system shall only show the user Live Feeds for
specific classes. } 1391 1392 specific classes. }
\\ 1392 1393 \\
\item[User Goals]{The user will see only one Live Feed at a time. } 1393 1394 \item[User Goals]{The user will see only one Live Feed at a time. }
1394 1395
\item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User 1395 1396 \item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 1396 1397 Login, {[}A3{]} Add a Class}
\\ 1397 1398 \\
\item[Priority Level]{``Must''} 1398 1399 \item[Priority Level]{``Must''}
1399 1400
{Status:}{Not implemented} 1400 1401 {Status:}{Not implemented}
1401 1402
\item[Pre-conditions]{User has added a class} 1402 1403 \item[Pre-conditions]{User has added a class}
1403 1404
\item[Post-conditions]{User shall see the Live Feed for that class} 1404 1405 \item[Post-conditions]{User shall see the Live Feed for that class}
1405 1406
\item[Trigger]{User shall select a class} 1406 1407 \item[Trigger]{User shall select a class}
1407 1408
\item[Workflow] 1408 1409 \item[Workflow]
1409 1410
\begin{enumerate} 1410 1411 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1411 1412 \itemsep1pt\parskip0pt\parsep0pt
\item 1412 1413 \item
{The User logs into their account.} 1413 1414 {The User logs into their account.}
\item 1414 1415 \item
{The System verifies the User's credentials and saves their session.} 1415 1416 {The System verifies the User's credentials and saves their session.}
\item 1416 1417 \item
{The User is at their dashboard.} 1417 1418 {The User is at their dashboard.}
\item 1418 1419 \item
{The Client shows the User's dashboard.} 1419 1420 {The Client shows the User's dashboard.}
\item 1420 1421 \item
{The User selects a class from their dashboard.} 1421 1422 {The User selects a class from their dashboard.}
\item 1422 1423 \item
{The Client displays the Live Feed for the class.} 1423 1424 {The Client displays the Live Feed for the class.}
\end{enumerate} 1424 1425 \end{enumerate}
1425 1426
\end{description} 1426 1427 \end{description}
\newpage 1427 1428 \newpage
1428 1429
{} 1429 1430 {}
\section{Decks} 1430 1431 \section{Decks}
\subsection{{{{[}-D2-{]} Making a 1431 1432 \subsection{{{{[}-D2-{]} Making a
deck}}{{[}-D2-{]} Making a deck}} 1432 1433 deck}}{{[}-D2-{]} Making a deck}}
1433 1434
\begin{description} 1434 1435 \begin{description}
\item[Description]{Upon selecting the right course, the student has the 1435 1436 \item[Description]{Upon selecting the right course, the student has the
power to make a deck by either selecting existing flashcard or adding a 1436 1437 power to make a deck by either selecting existing flashcard or adding a
new flashcard.} 1437 1438 new flashcard.}
1438 1439
\item[Desired Outcome]{The user can keep track of cards that s/he wants.} 1439 1440 \item[Desired Outcome]{The user can keep track of cards that s/he wants.}
\\ 1440 1441 \\
\item[User Goals]{The user has a personal deck ready for review later.} 1441 1442 \item[User Goals]{The user has a personal deck ready for review later.}
1442 1443
\item[Primary Actor]{User (student)} 1443 1444 \item[Primary Actor]{User (student)}
1444 1445
\item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck 1445 1446 \item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck
{[}F1{]}, Make a Flashcard {[}F3{]}} 1446 1447 {[}F1{]}, Make a Flashcard {[}F3{]}}
\\ 1447 1448 \\
\item[Priority Level]{``Must''} 1448 1449 \item[Priority Level]{``Must''}
1449 1450
\item[Status]{In Progress} 1450 1451 \item[Status]{In Progress}
1451 1452
\item[Pre-conditions] 1452 1453 \item[Pre-conditions]
1453 1454
\begin{itemize} 1454 1455 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1455 1456 \itemsep1pt\parskip0pt\parsep0pt
\item 1456 1457 \item
{The user has an account with the application. } 1457 1458 {The user has an account with the application. }
\item 1458 1459 \item
{The user has been added to the desired class.} 1459 1460 {The user has been added to the desired class.}
\end{itemize} 1460 1461 \end{itemize}
1461 1462
\item[Post-conditions] 1462 1463 \item[Post-conditions]
1463 1464
\begin{itemize} 1464 1465 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1465 1466 \itemsep1pt\parskip0pt\parsep0pt
\item 1466 1467 \item
{Desired cards are added to user's deck to the specific class } 1467 1468 {Desired cards are added to user's deck to the specific class }
\item 1468 1469 \item
{User's deck is added to the database.} 1469 1470 {User's deck is added to the database.}
\end{itemize} 1470 1471 \end{itemize}
1471 1472
\item[Trigger]{User has selected a card from the pool. User submitted a 1472 1473 \item[Trigger]{User has selected a card from the pool. User submitted a
new flashcard after ``Make New Flashcard''.} 1473 1474 new flashcard after ``Make New Flashcard''.}
1474 1475
\item[Workflow] 1475 1476 \item[Workflow]
1476 1477
\begin{enumerate} 1477 1478 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1478 1479 \itemsep1pt\parskip0pt\parsep0pt
\item 1479 1480 \item
{User is at their dashboard.} 1480 1481 {User is at their dashboard.}
\item 1481 1482 \item
{User selects the class of interest that they had no activity in yet.} 1482 1483 {User selects the class of interest that they had no activity in yet.}
\item 1483 1484 \item
{Client displays the Live Feed for the class.} 1484 1485 {Client displays the Live Feed for the class.}
\item 1485 1486 \item
{User presses ``Pull Flashcard'' button on a Flashcard that they want 1486 1487 {User presses ``Pull Flashcard'' button on a Flashcard that they want
in their Deck.} 1487 1488 in their Deck.}
\item 1488 1489 \item
{The server creates a Deck for the User for the Class of interest.} 1489 1490 {The server creates a Deck for the User for the Class of interest.}
\item 1490 1491 \item
{The server adds the Flashcard to the User's Deck.} 1491 1492 {The server adds the Flashcard to the User's Deck.}
\item 1492 1493 \item
{The Client makes the Flashcard disappear from the Live Feed.} 1493 1494 {The Client makes the Flashcard disappear from the Live Feed.}
\item 1494 1495 \item
{The Client displays the Flashcard in the User's Deck in the sidebar.} 1495 1496 {The Client displays the Flashcard in the User's Deck in the sidebar.}
\end{enumerate} 1496 1497 \end{enumerate}
1497 1498
{Alternate Workflow:} 1498 1499 {Alternate Workflow:}
1499 1500
\begin{enumerate} 1500 1501 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1501 1502 \itemsep1pt\parskip0pt\parsep0pt
\item 1502 1503 \item
{User is at their dashboard.} 1503 1504 {User is at their dashboard.}
\item 1504 1505 \item
{User selects the class of interest that they had no activity in yet.} 1505 1506 {User selects the class of interest that they had no activity in yet.}
\item 1506 1507 \item
{Client displays the Live Feed for the class.} 1507 1508 {Client displays the Live Feed for the class.}
\item 1508 1509 \item
{The User adds a Flashcard into the Class.} 1509 1510 {The User adds a Flashcard into the Class.}
\item 1510 1511 \item
{The server creates a Deck for the User for the Class of interest.} 1511 1512 {The server creates a Deck for the User for the Class of interest.}
\item 1512 1513 \item
{The server adds the new Flashcard to the User's Deck.} 1513 1514 {The server adds the new Flashcard to the User's Deck.}
\item 1514 1515 \item
{The Client makes the Flashcard disappear from the Live Feed.} 1515 1516 {The Client makes the Flashcard disappear from the Live Feed.}
\item 1516 1517 \item
{The Client displays the Flashcard in the User's Deck in the sidebar.} 1517 1518 {The Client displays the Flashcard in the User's Deck in the sidebar.}
\end{enumerate} 1518 1519 \end{enumerate}
\end{description} 1519 1520 \end{description}
\newpage 1520 1521 \newpage
1521 1522
{} 1522 1523 {}
1523 1524
\subsection{{{{[}D1{]} Remove a card from a 1524 1525 \subsection{{{{[}D1{]} Remove a card from a
deck}}{{[}D1{]} Remove a card from a deck}} 1525 1526 deck}}{{[}D1{]} Remove a card from a deck}}
1526 1527
\begin{description} 1527 1528 \begin{description}
\item[Description]{The user can remove flashcards from their deck.} 1528 1529 \item[Description]{The user can remove flashcards from their deck.}
1529 1530
\item[Desired Outcome]{The user will not be notified about that card. } 1530 1531 \item[Desired Outcome]{The user will not be notified about that card. }
\\ 1531 1532 \\
\item[User Goals]{To only review cards that the user wants to review. } 1532 1533 \item[User Goals]{To only review cards that the user wants to review. }
1533 1534
\item[Primary Actor]{User (student)} 1534 1535 \item[Primary Actor]{User (student)}
1535 1536
\item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck 1536 1537 \item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck
{[}F1{]}, Make a Flashcard {[}F3{]}} 1537 1538 {[}F1{]}, Make a Flashcard {[}F3{]}}
\\ 1538 1539 \\
\item[Priority Level]{``Must''} 1539 1540 \item[Priority Level]{``Must''}
1540 1541
\item[Status]{Unimplemented} 1541 1542 \item[Status]{Unimplemented}
1542 1543
\item[Pre-conditions] 1543 1544 \item[Pre-conditions]
1544 1545
\begin{itemize} 1545 1546 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1546 1547 \itemsep1pt\parskip0pt\parsep0pt
\item 1547 1548 \item
{The User has an account with the application} 1548 1549 {The User has an account with the application}
\item 1549 1550 \item
{The User is logged in} 1550 1551 {The User is logged in}
\end{itemize} 1551 1552 \end{itemize}
1552 1553
\item[Post-conditions] 1553 1554 \item[Post-conditions]
1554 1555
\begin{itemize} 1555 1556 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1556 1557 \itemsep1pt\parskip0pt\parsep0pt
\item 1557 1558 \item
{Desired cards are hidden to the user.} 1558 1559 {Desired cards are hidden to the user.}
\end{itemize} 1559 1560 \end{itemize}
1560 1561
\item[Trigger]{User has selected a card to be hidden.} 1561 1562 \item[Trigger]{User has selected a card to be hidden.}
1562 1563
\item[Workflow] 1563 1564 \item[Workflow]
1564 1565
\begin{enumerate} 1565 1566 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1566 1567 \itemsep1pt\parskip0pt\parsep0pt
\item 1567 1568 \item
{The Client shows the user the dashboard.} 1568 1569 {The Client shows the user the dashboard.}
\item 1569 1570 \item
{The User shall select the appropriate class.} 1570 1571 {The User shall select the appropriate class.}
\item 1571 1572 \item
{The System checks if the class is in session.} 1572 1573 {The System checks if the class is in session.}
\item 1573 1574 \item
{The User shall select deck view.} 1574 1575 {The User shall select deck view.}
\item 1575 1576 \item
{The Client shall route the user to the deck view.} 1576 1577 {The Client shall route the user to the deck view.}
\item 1577 1578 \item
{The User clicks a flashcard's remove button.} 1578 1579 {The User clicks a flashcard's remove button.}
\item 1579 1580 \item
{The Client shall send a DELETE request to the server}{}{at 1580 1581 {The Client shall send a DELETE request to the server}{}{at
/api/flashcard/\textless{}flashcard ID\textgreater{}/remove} 1581 1582 /api/flashcard/\textless{}flashcard ID\textgreater{}/remove}
\item 1582 1583 \item
{The Server removes the flashcard from the User's Deck.} 1583 1584 {The Server removes the flashcard from the User's Deck.}
\item 1584 1585 \item
{The Server updates the flashcard's position in the Live Feed.} 1585 1586 {The Server updates the flashcard's position in the Live Feed.}
\item 1586 1587 \item
{The Client updates the User's Deck.} 1587 1588 {The Client updates the User's Deck.}
\end{enumerate} 1588 1589 \end{enumerate}
1589 1590
{} 1590 1591 {}
1591 1592
{Alternate Workflow:} 1592 1593 {Alternate Workflow:}
1593 1594
\begin{enumerate} 1594 1595 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1595 1596 \itemsep1pt\parskip0pt\parsep0pt
\item 1596 1597 \item
{The Client shows the user the dashboard.} 1597 1598 {The Client shows the user the dashboard.}
\item 1598 1599 \item
{The User shall select the appropriate class.} 1599 1600 {The User shall select the appropriate class.}
\item 1600 1601 \item
{The System checks if the class is }{not}{in session.} 1601 1602 {The System checks if the class is }{not}{in session.}
\item 1602 1603 \item
{The Client shall the user to the deck view.} 1603 1604 {The Client shall the user to the deck view.}
\item 1604 1605 \item
{The User clicks a flashcard's remove button.} 1605 1606 {The User clicks a flashcard's remove button.}
\item 1606 1607 \item
{The Client shall send a DELETE request to the server}{}{at 1607 1608 {The Client shall send a DELETE request to the server}{}{at
/api/flashcard/\textless{}flashcard ID\textgreater{}/remove} 1608 1609 /api/flashcard/\textless{}flashcard ID\textgreater{}/remove}
\item 1609 1610 \item
{The Server removes the flashcard from the User's Deck.} 1610 1611 {The Server removes the flashcard from the User's Deck.}
\item 1611 1612 \item
{The Server updates the flashcard's position in the Live Feed.} 1612 1613 {The Server updates the flashcard's position in the Live Feed.}
\item 1613 1614 \item
{The Client updates the User's Deck.} 1614 1615 {The Client updates the User's Deck.}
\end{enumerate} 1615 1616 \end{enumerate}
\end{description} 1616 1617 \end{description}
1617 1618
\subsection{{{{[}-D2-{]} Shuffling 1618 1619 \subsection{{{{[}-D2-{]} Shuffling
deck}}{{[}-D2-{]} Shuffling deck}} 1619 1620 deck}}{{[}-D2-{]} Shuffling deck}}
1620 1621
\begin{description} 1621 1622 \begin{description}
\item[Description]{User is able to shuffle his/her deck as a way to study 1622 1623 \item[Description]{User is able to shuffle his/her deck as a way to study
the flashcards} 1623 1624 the flashcards}
1624 1625
\item[Desired Outcome]{When taking a quiz, the user will notice that 1625 1626 \item[Desired Outcome]{When taking a quiz, the user will notice that