Compare View

switch
from
...
to
 
Commits (2)

Diff

Showing 1 changed file Inline Diff

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