Compare View

switch
from
...
to
 
Commits (2)

Diff

Showing 1 changed file Inline Diff

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