Commit 4a76d38d2051600f2ff4148f1445785dafb3583b

Authored by Kevin Mach
1 parent c13fd88007
Exists in master

updated account design use cases

Showing 1 changed file with 127 additions and 140 deletions Inline Diff

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