Commit 0e8c33d9bba5e3b9fb724ea1ffa24e3ce0d46e72

Authored by mjeng
Exists in master

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

Showing 11 changed files Inline Diff

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