Commit d8905e066831ee73c0408e1b3afc1dae8fb6d5a6

Authored by Chung Wang
Exists in master

Merge branch 'master' of https://git.ucsd.edu/110swag/docs

Showing 4 changed files Inline Diff

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