From 9bdef2907fdc3f37fc2f21885d045f520680b0e2 Mon Sep 17 00:00:00 2001 From: Andrew Buss Date: Wed, 6 May 2015 16:55:19 -0700 Subject: [PATCH] Converted design use cases to tex.. in progress --- DesignUseCases.tex | 2013 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 8 +- 2 files changed, 2019 insertions(+), 2 deletions(-) create mode 100644 DesignUseCases.tex diff --git a/DesignUseCases.tex b/DesignUseCases.tex new file mode 100644 index 0000000..647e3d2 --- /dev/null +++ b/DesignUseCases.tex @@ -0,0 +1,2013 @@ +\documentclass[letterpaper]{scrartcl} % or whatever +\usepackage{tgpagella} +\setkomafont{disposition}{\normalfont\bfseries} +%\usepackage[markuppercase]{scrpage2} +\title{\huge Design Use Cases} +\date{\today} +\author{\Large Students With A Goal (S.W.A.G.)} +\usepackage[pass]{geometry} +\usepackage{hyperref} +\usepackage{enumitem} +\setlist[description]{style=multiline,leftmargin=3cm,font=\normalfont\textbf} +\setlistdepth{9} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\bullet$} +\setlist[itemize,3]{label=$\bullet$} +\setlist[itemize,4]{label=$\bullet$} +\setlist[itemize,5]{label=$\bullet$} +\setlist[itemize,6]{label=$\bullet$} +\setlist[itemize,7]{label=$\bullet$} +\setlist[itemize,8]{label=$\bullet$} +\setlist[itemize,9]{label=$\bullet$} +\renewlist{itemize}{itemize}{9} +\begin{document} +\maketitle +\begin{center} +\begin{tabular}{l r} +Melody Jeng & System Architect \\ +Arno Gau & Senior System Analyst \\ +Rachel Lee & Software Development Lead \\ +Laura Hawkins & Project Manager \\ +Rohan Rangray & Algorithms Specialist\\ +Andrew Buss & Database Specialist \\ +Phuong Tran & Quality Assurance Lead \\ +Chung Kang Wang & Business Analyst\\ +Masud Rahman & User Interface Specialist\\ +Kevin Mach & User Interface Specialist\\ +\end{tabular} +\end{center} +\begin{center}\rule{0.5\linewidth}{\linethickness}\end{center} +\tableofcontents +\newpage +\section{Accounts} +\subsection{[A1] User Registration} +\begin{description}[style=multiline,leftmargin=3cm] +\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 +through registering.} +\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 +the aforementioned account.} + +\item[User Goals]{The user shall have an account to participate in the +website's activities.} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~None} + +\item[Priority Level]{~``Must''} + +\item[Status]{Not Implemented} + +\item[Pre-conditions] + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user has an account registered with the system.} +\end{itemize} + +\item[Trigger]{The user wants to create an account.} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall click the sign up button.} +\item + {The client renders a registration form and displays it to the user} +\item + {The user fills the form} +\item + {The client checks that the provided email is not invalid, and that + the password is not valid. If anything is not valid, it displays an + error and returns this to the user. } +\item + {If the form is valid, the client POSTs the form in JSON format to the + server API at /api/users/me.} +\item + {The server deserializes and validates the data. If it's not valid, it + returns an error to the client.} +\item + {The server creates a new User object from the provided data, filling + in the appropriate fields} +\item + {The server saves the user object} +\item + {The server marks the user's email as unverified} +\item + {The server sends an email to the user's address with a link to + validate the user's email address.} +\item + {The server responds with success and logs the user in on a new + session for the user. } +\item + {The client reports success to the user and stores the sessionid for + future requests.} +\end{enumerate} + +{} +{Verification Workflow:} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user receives an email with a link to verify their email. The + user clicks the link} +\item + {The client submits the verification code to the server} +\item + {The server validates the code. If the code is not valid, it returns + an error to the client.} +\item + {The server marks the user's email as valid and saves the User object + again. The user's account is now active} +\item + {The client reports success. } +\end{enumerate} + +\end{description} + +\newpage +\subsection{\texorpdfstring{{{[}A2{]} User +Login}}{{[}A2{]} User Login}} + +\begin{description} +\item[Description]{User is able to login to personal account.} + +{Desired Outcome:}{~The user shall be able to provide their username and +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 +the flash cards they have added to their decks.} + +\item[User Goals]{The user wants to resume use of the site on another +device, or use the site after logging out.} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration} + +\item[Priority Level]{~``Must''} + +\item[Status]{Not Implemented} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user has created an account before.} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user can navigate the site and see their data.} +\end{itemize} + +\item[Trigger]{The User shall enter their email and password into the Login +form. The user then submits this information by clicking the ``Login'' +button or pressing the return key.} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {api.py verifies that the User has submitted an email and password} +\item + {api.py authenticates the User's email and password and checks if the + User is active} +\item + {api.py logs the User in using the Django login feature} +\item + {Front-end displays the home page for the User} +\end{enumerate} + +\newpage + +\subsection{\texorpdfstring{{{[}A3{]} Add a +Class}}{{[}A3{]} Add a Class}} + +{Description:}{~The user shall be able to add a class and access the +flashcards associated with that class.} + +{Desired Outcome: }{The class shall be linked with the student's account +and the student shall have the ability to read and publish flashcards +for this class.} + +\item[User Goals]{The user wants to publish flashcards for this class, and +reads the flashcards for this class that are published by other users.} + +{Primary Actor}{: User (student)} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login} + +{Priority Level: }{``Must''} + +\item[Status]{Not implemented} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user has created an account.} +\item + {The user is logged in to his/her account} +\item + {The user has been whitelisted by the instructor of the class, if + required.} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user can read the flashcards being published for the class and + add them to his/her deck.} +\item + {The user can publish flashcards to be viewed and added by other users + in the same class.} +\end{itemize} + +\item[Trigger]{The user clicks an ``Add Class'' button to add a class to +his/her list of ``Enrolled Classes''} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The client shall show a dialog to search for classes.} +\item + {The user begins to type their class name or number} +\item + {The text box will show suggestions as a user types~~~~~~~~} +\end{enumerate} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Implementation unspecified at present; need to do further research + (django-autocomplete-lite?)} +\end{itemize} + +\begin{enumerate} +\setcounter{enumi}{3} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall select a class by clicking an ``Add Class'' button + associated with a specific class} +\item + {The client shall submit a POST request to /api/users/me/sections with + the course ID that they would like to add. } +\item + {The server shall check if there is a whitelist for the class that the + user is trying to add} +\item + {If there is a whitelist, the server shall check if the user is on the + whitelist} +\item + {If the class does not have a whitelist or if the user is in the + whitelist for that class, the system shall add the section to the + user's list of classes. } +\end{enumerate} +\end{description} +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}A4{]} }{Drop a +Class}}{{[}A4{]} Drop a Class}} + +\begin{description} +\item[Description]{The user can remove themselves from a course he/she is +registered to} + +{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 +see the flashcards associated to the class that they dropped } + +\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 +listed in their list of ``Enrolled Classes''} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class} + +\item[Priority Level]{~ ``Should''} + +\item[Status]{Not Implemented } + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User has a valid account.} +\item + {User is logged in.} +\item + {User has enrolled in classes.} +\end{itemize} + +\item[Post-conditions]{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User shall no longer have access to dropped class, or associated + flashcards} +\end{itemize} + +{Trigger:}{~User clicked button to drop class.} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall click ``Drop'' (or equivalent) button.} +\item + {The client shall ~display a dialogue box which will say ``Are you + sure you want to drop this class?''} +\item + {The user shall click ``Yes'' to confirm that they want to drop the + class} +\item + {The client shall submit a DELETE request to + /api/users/me/sections/\textless{}section ID number\textgreater{}.} +\item + {If the user is not already enrolled in the section, the server will + return a 404 Not Found error, which the client shall handle. (The + client should not show an error to the user)} +\item + {The server shall remove the selected class from a user's list of + classes. } +\item + {The server shall return success to the client} +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}A5{]} Password +change}}{{[}A5{]} Password change}} + +\begin{description} +\item[Description]{The user shall be able to change the password for their +account in the account settings. This requires that they are logged in. +} + +{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} + +\item[User Goals]{The user wants to use a different password in the future} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login} + +{Details: }{The user provides their current password and a new password +in a form. If the current password is correct, the system updates their +password to the requested new password.} + +\item[Priority Level]{~``Must''} + +\item[Status]{Not }{implemented} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user has created an account} +\item + {The user has logged in } +\item + {The user knows their current password} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user's password is changed} +\item + {The user can log in with the new password} +\end{itemize} + +\item[Trigger]{User clicks ``Change Password'' button in Accounts page} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall press the ``Change Password'' button} +\item + {The client shall render a form that requires the user to enter their + old password and new password} +\item + {The user shall enter their current password and the desired new + password} +\item + {The client shall verify that no fields are blank} +\item + {The client shall submit the data to the server by sending a PATCH + request to /api/users/me containing ``old\_password'' and + ``new\_password'' values.} +\item + {The server shall validate the pre-existing password} +\item + {If server cannot validate the pre-existing password, the client will + render the same form with a message informing the user that the + pre-existing password that they have provided is incorrect} +\item + {If the server successfully validates the pre-existing password, the + system shall change the user's password} +\item + {The client shall return a success to the user} +\end{enumerate} +\end{description} +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}A6{]} Password reset +}}{{[}A6{]} Password reset }} + +\begin{description} +\item[Description]{The user shall be able to reset their password without +being logged in } + +{Desired Outcome:}{~The user's password shall be changed to one that +they remember} + +\item[User Goals]{The user does not know their current password but wants +to log into the site} + +\item[Primary Actor]{~User (student)} + +{Dependency Use Cases: }{{[}A1{]} User Registration} + +{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 +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 +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 +password in a form. When they submit the form, their password is updated +if the token is correct. } + +\item[Priority Level]{~``Must''} + +\item[Status]{Not i}{mplemented} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user has created an account before} +\item + {The user knows the email address attached to their account} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user's password is changed} +\item + {The user can log in with the new password} +\end{itemize} + +\item[Trigger]{User clicks ``Forgot Password'' button on the login page} + +\item[Workflow, requesting password reset] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall click ``Forgot Password'' (or equivalent) button} +\item + {The client shall prompt the user for their current email} +\item + {The user shall submit their email address} +\item + {The client shall validate that the email address is formatted + correctly} +\item + {The client shall submit the email address to the server in a POST + request to /api/reset\_password with an ``email'' value} +\item + {The server shall check if an account exists with the email entered by + the user} +\item + {If no such account exists, the server shall return an error to the + frontend, which will display it to the user} +\item + {If the account does exist, the server will:} +\end{enumerate} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Create a new password reset token for the user} +\item + {Send an email to the user with a link containing the token and the + user's ID} +\end{enumerate} + +\item[Workflow, resetting password] + +\begin{enumerate} +\setcounter{enumi}{8} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall click the link in the email and visit + /app/password\_reset} +\item + {The client shall render a form that will prompt the user for a new + password} +\item + {The user shall provide a new password in the form} +\item + {The client shall submit the password to the server} +\item + {If the user tries to submit without a password in the text field, the + client shall display a message saying ``Password cannot be blank.''} +\item + {The server first verifies that the token is valid for the user} +\item + {The server then verifies that the user's new password is non-blank} +\item + {If neither of the above verifications fail, the server shall change + the password associated with the user's email. } +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}A7{]} Limit Student Access to Courses +}}{{[}A7{]} Limit Student Access to Courses }} + +\begin{description} +\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 +are actually in the class.} + +{Desired Outcome:}{~The class will have limited access and only those +users who are whitelisted may enroll in the class.} + +\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 +else.} + +{Primary Actor: }{User (instructor)} + +{Dependency Use Cases: }{{[}A1{]} User Registration, {[}A2{]} User +Login} + +{Priority Level: }{``Should''} + +\item[Status]{Not Implemented} + +{Pre-condition:} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User has valid instructor's account} +\end{itemize} + +{Post-condition: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Only those users who were whitelisted may add the class.} +\end{itemize} + +\item[Trigger]{The instructor emails the administrator and requests to +limit access to his class.} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The instructor emails the administrators from his UCSD email address + and requests to limit access to his course. He provides a list of + emails of the students that are to be whitelisted.} +\item + {The administrators visit a custom admin page, select the course, and + paste the list of emails. They submit the page directly (no separate + frontend here) to the server.} +\item + {The server shall create a WhitelistedAddress for each provided email, + attaching it to the section taught by the instructor.} +\item + {The server shall add any existing users whose email addresses appear + in the whitelist to the class. } +\end{enumerate} +\end{description} +\newpage + + + +\subsection{\texorpdfstring{{{[}A8{]} User +Logout}}{{[}A8{]} User Logout}} + +\begin{description} +\item[Description]{The user shall be able to log out of his/her account on +the site.} + +{Desired Outcome:}{~The user's information and data will no longer be +accessible after logging out. } + +\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 +account.} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases] + +\item[Priority Level]{~``Must''} + +\item[Status]{Implemented} + +{Pre-conditions: }{The user is logged into their account} + +\item[Post-conditions]{~}{The user's data can no longer be accessed.} + +{Trigger:}{~User clicks ``Logout'' button} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {api.py logs the User out using the Django logout feature} +\item + {Front-end displays application login page} +\end{enumerate} + + + +\newpage + + + +\subsection{\texorpdfstring{{{[}A9{]} Contact +Admin}}{{[}A9{]} Contact Admin}} + +\begin{description} +\item[Description]{The user shall be able to contact the admin.} + +{Desired Outcome:}{~The user shall send a message to the admin; the +admin shall receive the message.} + +{User Goals:}{~The user sends a message to the admin.} + +\item[Primary Actor]{~User} + +\item[Dependency Use Cases]{~None} + +{Priority Level: }{``Must''} + +\item[Status]{Not implemented} + +\item[Pre-conditions]{~None.} + +\item[Post-conditions]{~The admin receives the user's message.} + +{Trigger:}{~User has navigated to our website. } + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The frontend displays the admin email address on every page in the + application.} +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F1{]} Push Flashcard +}}{{[}F1{]} Push Flashcard }} + +\begin{description} +\item[Description]{The user shall be able to create a flashcard with their +input. } + +{Desired Outcome:}{~The user shall have the flashcard added to their own +deck and the Live Feed. } + +\item[User Goals]{The user will see their flashcard in their deck and the +flashcard will be shared with others. } + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class} + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User has an account } +\item + {The User has added at least one class} +\item + {The User is on the class' page} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User has flashcard added to their deck} +\item + {The Flashcard is shown in the Live Feed} +\item + {Other users can add this flashcard to their decks} +\end{itemize} + +{Trigger:}{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User has clicked on the button ``Make New Flashcard''.} +\item + {The Server receives a POST request containing the flashcard data.} +\end{itemize} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User is at the live feed for the class.} +\item + {The User shall click on the button}{Push + Flashcard} +\item + {The + }{Client}{shall + present a dialog box for inputting the flashcard text to the User.} +\item + {The User shall input the flashcard text.} +\item + {Optionally, the User shall mark keywords in the flashcard text.} +\item + {If the User creates this flashcard outside of the lecture time, he + will get the option to change the material date.} +\item + {The User shall click on the `Submit' button to submit the flashcard + text, blanks, and material date, in JSON form as a POST request.} +\item + {The Server shall obtain the flashcard information by deserializing + the JSON in the POST request.} +\item + {The Server shall create a new record for this flashcard in the + Flashcards table in the database.} +\item + {The Server shall publish the newly created card to the live feed of + the class.} +\end{enumerate} +\end{description} +{Alternative Workflow:} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User shall view a flashcard that he/she did not create} +\item + {The User shall click ``Edit''} +\item + {The client shall present a dialog box for editing the existing + flashcard text} +\item + {The User shall make edits} +\item + {The User shall click ``save''} +\item + {The client shall send a POST request} +\item + {The server shall remove the original card from user's deck} +\item + {The Server shall obtain the flashcard information by deserializing + the JSON in the POST request.} +\item + {The Server shall create a new record for this flashcard in the + Flashcards table in the database.} +\item + {The Server shall publish the newly created card to the live feed of + the class.} +\end{enumerate} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F2{]} Edit +Flashcard}}{{[}F2{]} Edit Flashcard}} + +\begin{description} +\item[Description]{The user shall be able to edit the text on their own +flashcard } + +{Desired Outcome:}{~Flashcard is edited and saved appropriately} + +\item[User Goals]{To be able to change text on a flashcard} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull +Flashcard} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Flashcard is created} +\item + {Flashcard in user's deck} +\item + {Flashcard is viewable} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Flashcard is edited} +\end{itemize} + +{Trigger:}{~User has clicked ``Edit'' button when viewing a specific +flashcard} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall view their deck} +\item + {The client shall present user with a grid view of cards in + chronological creation order} +\item + {The user shall select a flashcard and click `Edit'} +\item + {The client shall produce an editable dialog box containing flashcard + text} +\item + {The user shall make desired changes} +\item + {The user shall click `Save'} +\item + {The client shall generate a POST request for a new flashcard and send + it to the server} +\item + {If the user changed only the blanks of the cards, the server shall + create a new FlashcardMask object and update the appropriate + UserFlashcard object with a reference to it.} +\item + {If the user changed the text of the card, the server will instead:} +\end{enumerate} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {create a new flashcard for the section} +\item + {push it to the feed} +\item + {add it to the user's deck} +\item + {hide the old card from the user} +\item + {and return the new card to the user} +\end{enumerate} +\end{description} +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F3{]} Pull +Flashcard}}{{[}F3{]} Pull Flashcard}} + +{Description:}{~The User shall be able to add flash cards to their own +deck from the Live Feed. } + +{Desired Outcome:}{~The User shall have the flashcard added to their own +deck } + +\item[User Goals]{The user will be able to review that flashcard. } + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login, ~{[}A3{]} Add a Class, {[}F1{]} Push Flashard} + +\item[Priority Level]{~``Must'' } + +\item[Status]{Not Implemented} + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Flashcard has been created } +\item + {That flashcard is in the Live Feed} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User shall have that flashcard added to their deck} +\item + {User can review this flashcard later} +\end{itemize} + +{Trigger:}{~User has clicked on the flashcard in the Live Feed.} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User is in the Live Feed.} +\item + {User shall click on the ``Pull Flashcard'' button on a Flashcard in + the Feed.} +\item + {The Client shall make the pulled Flashcard disappear from the Live + Feed} +\item + {The Client shall make the pulled Flashcard appear in the User's Deck + on the sidebar.} +\item + {The Client shall submit a POST request to + /api/flashcards/\textless{}flashcard id\textgreater{}/pull} +\item + {The server shall create a UserFlashcard object to represent that the + user's deck contains the card.} +\item + {The server shall notify connected clients about the new card rating, + if any} +\item + {Connected clients will take the new rating into account when next + rearranging the feed.} +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F4{]} Flag Inappropriate +Cards}}{{[}F4{]} Flag Inappropriate Cards}} + +\begin{description} +\item[Description]{Cards may be flagged indicating inappropriate content} + +{Desired Outcome:}{~The flashcard's inappropriateness variable is +adjusted} + +\item[User Goals]{To note if a card should not belong in the class and +should not be displayed in the feed} + +\item[Primary Actor]{~~User (Student)} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} + +\item[Priority Level]{~``Should''} + +\item[Status]{Unimplemented} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User is enrolled in a class} +\end{itemize} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Flashcard is created} +\item + {Flashcard is viewable in feed} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Flashcard is hidden from user} +\item + {Flashcard internal variable is adjusted} +\end{itemize} + +{Trigger:}{~User clicks flag on a specific flashcard} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User is at a page of their classes.} +\item + {The User selects one of their classes to enter the Live Feed.} +\item + {The User is on the Live Feed for his/her class.} +\item + {The User shall identify an inappropriate card and flag the card.} +\item + {The User clicks the ``Flag as Inappropriate'' button on the flashcard + that he/she wants to report} +\item + {The Client shall hide the card from the user} +\item + {The server shall create a FlashcardReport object} +\end{enumerate} +\end{description} +{} + +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F5{]} Filter +Flashcards}}{{[}F5{]} Filter Flashcards}} + +\begin{description} +\item[Description]{The user is able to filter for flashcards by date} + +{Desired Outcome:}{~The user shall see flashcards based on the filter +options} + +{User Goals:}{~The user can find what he/she is specifically looking +for} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull +Flashcard} + +\item[Priority Level]{~~''Should''} + +\item[Status]{Not}{~}{Implemented } + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User has registered for the course } +\item + {Flashcards exist in the course} +\end{itemize} + +\item[Post-conditions]{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User only sees specific flashcards} +\end{itemize} + +{Trigger:}{~User has selected advanced options from menu} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User chooses one of their classes.} +\item + {The User presses the class they want to view.} +\item + {The Client displays the Live Feed.} +\item + {The User is at the Live Feed.} +\item + {The User wants to filter the cards on the Live Feed.} +\item + {The User shall select what filter option they want from a drop down + menu.} +\item + {The Client shall display only relevant flashcards.} +\end{enumerate} +\end{description} +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F6{]} Blank Out Words in +Flashcard}}{{[}F6{]} Blank Out Words in Flashcard}} + +\begin{description} +\item[Description]{The User shall be able to blank out keywords in any +flashcard in his deck. } + +{Desired Outcome: }{The blanked out words in the flashcard notify the +System that they are keywords. } + +\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 +User guess what they are.} + +{Primary Actor: }{User (student)} + +{Dependency Use Cases: }{{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} + +{Priority Level: }{``Must''} + +\item[Status]{Not implemented.} + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User has the flashcard he wishes to blank out words from in his + deck.} +\item + {The User shall (be on the class page and) view deck} +\end{itemize} + +{Post-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The blanked out words in the flashcard are marked as keywords.} +\item + {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.} +\end{itemize} + +\item[Trigger]{The User clicks on a flashcard.} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The Client shall a show deck to user} +\item + {The User shall click on the flashcard in his deck that he wants to + blank out words from} +\item + {The client shall bring user to edit flashcard page/popup} +\item + {The User shall click on the words that he wishes to blank out} +\item + {The client shall specify a character range as blank} +\item + {The server shall mark those words by updating the Flashcard Mask for + that flashcard. } +\item + {The User shall click on `Save' or the equivalent button to save the + changes} +\item + {The server will save the blanked out words as keywords to the + Flashcard Mask to review} +\item + {The client shall cover the keywords with whitespace to hide them from + the User} +\end{enumerate} + +{Alternative Workflows:} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User shall (be on the class page and) click ``Make New + Flashcard''} +\item + {The client shall present user with a new flashcard to fill in} +\item + {The User shall fill in the information} +\item + {The client shall ask if the user wants to specify blanks} +\item + {The System will save the blanked out words as keywords to the + Flashcard Mask to review} +\item + {The client shall cover the keywords with whitespace to hide them from + the User} +\end{enumerate} +\end{description} +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F7{]} Fix +Flashcard}}{{[}F7{]} Fix Flashcard}} + +\begin{description} +\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.} + +{Desired Outcome:}{~The User shall alter one flashcard and that +alteration will be shown to all users of that flashcard} + +\item[User Goals]{The user shall make the flashcard say something different +than it did originally.} + +\item[Primary Actor]{~User (student) } + +\item[Dependency Use Cases]{~{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} + +\item[Priority Level]{Must} + +\item[Status]{Not Implemented} + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User has created the flashcard} +\end{itemize} + +\item[Post-conditions]{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user shall see their alteration for that flashcard} +\item + {Other users will be notified of the alteration} +\end{itemize} + +{Trigger:}{~User (creator of original card) has clicked on the button +``Edit''} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User shall select one of the Flashcards they authored.} +\item + {User shall select ``Edit'' button on the flashcard.} +\item + {Client shall display an ``Edit Flashcard'' view.} +\item + {The Flashcard will display editable fields/areas.} +\item + {The User shall input any changes to the Flashcard.} +\item + {The User shall select the ``Done Editing'' button.} +\item + {The Client shall close the ``Edit Flashcard'' view.} +\item + {The server shall update the Flashcard's content.} +\item + {Client shall notify users with the Flashcard that the Flashcard has + been edited, allowing the other users to keep or to discard the + changes.} +\end{enumerate} +\end{description} +{} + +{} + +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F8{]} Hide cards from +feed}}{{[}F8{]} Hide cards from feed}} + +\begin{description} +\item[Description]{The user shall be able to hide cards from feed} + +{Desired Outcome:}{~The card is no longer visible to the user} + +\item[User Goals]{The card has been looked at and should be hidden to +reduce screen clutter} + +{Primary Actor: }{User (Student)} + +\item[Dependency Use Cases]{~}{~}{{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} + +\item[Priority Level]{~``Should''} + +{Status:}{~Not implemented} + +\item[Pre-conditions]{~Flashcard is created, flashcard is viewable by user} + +\item[Post-conditions]{~Flashcard is not viewable by user} + +{Trigger:}{~Card is flagged; Card is noted to be hidden} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User chooses a class from the dashboard.} +\item + {The Client shows the Live Feed for the selected class.} +\item + {The User sees a card they want to hide from the Live Feed.} +\item + {The User shall press a ``Hide Flashcard'' button on the card to be + hidden.} +\item + {The Client shall hide the card of interest from the Live Feed, for + only that User.} +\end{enumerate} + +\end{description} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}F9{]} View a +Feed}}{{[}F9{]} View a Feed}} + +\begin{description} +\item[Description]{The user shall be able to view Live Feeds for different +classes} + +{Desired Outcome:}{~The system shall only show the user Live Feeds for +specific classes. } + +\item[User Goals]{The user will see only one Live Feed at a time. } + +\item[Dependency Use Cases]{~}{~}{{[}A1{]} User Registration, {[}A2{]} User +Login, {[}A3{]} Add a Class} + +\item[Priority Level]{~``Must''} + +{Status:}{~Not implemented} + +\item[Pre-conditions]{~User has added a class} + +\item[Post-conditions]{~User shall see the Live Feed for that class} + +{Trigger:}{~User shall select a class} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User logs into their account.} +\item + {The System verifies the User's credentials and saves their session.} +\item + {The User is at their dashboard.} +\item + {The Client shows the User's dashboard.} +\item + {The User selects a class from their dashboard.} +\item + {The Client displays the Live Feed for the class.} +\end{enumerate} + +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}-D2-{]} Making a +deck}}{{[}-D2-{]} Making a deck}} + +\begin{description} +\item[Description]{Upon selecting the right course, the student has the +power to make a deck by either selecting existing flashcard or adding a +new flashcard.} + +{Desired Outcome:}{~The user can keep track of cards that s/he wants.} + +\item[User Goals]{The user has a personal deck ready for review later.} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~Add a class {[}A3{]}, Add Flashcards to Deck +{[}F1{]}, Make a Flashcard {[}F3{]}} + +\item[Priority Level]{~``Must''} + +\item[Status]{In Progress} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The user has an account with the application. } +\item + {The user has been added to the desired class.} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Desired cards are added to user's deck to the specific class } +\item + {User's deck is added to the database.} +\end{itemize} + +{Trigger:}{~User has selected a card from the pool. ~User submitted a +new flashcard after ``Make New Flashcard''.} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User is at their dashboard.} +\item + {User selects the class of interest that they had no activity in yet.} +\item + {Client displays the Live Feed for the class.} +\item + {User presses ``Pull Flashcard'' button on a Flashcard that they want + in their Deck.} +\item + {The server creates a Deck for the User for the Class of interest.} +\item + {The server adds the Flashcard to the User's Deck.} +\item + {The Client makes the Flashcard disappear from the Live Feed.} +\item + {The Client displays the Flashcard in the User's Deck in the sidebar.} +\end{enumerate} + +{Alternate Workflow:} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User is at their dashboard.} +\item + {User selects the class of interest that they had no activity in yet.} +\item + {Client displays the Live Feed for the class.} +\item + {The User adds a Flashcard into the Class.} +\item + {The server creates a Deck for the User for the Class of interest.} +\item + {The server adds the new Flashcard to the User's Deck.} +\item + {The Client makes the Flashcard disappear from the Live Feed.} +\item + {The Client displays the Flashcard in the User's Deck in the sidebar.} +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}D1{]} Remove a card from a +deck}}{{[}D1{]} Remove a card from a deck}} + +\begin{description} +\item[Description]{The user can remove flashcards from their deck.} + +{Desired Outcome:}{~The user will not be notified about that card. } + +\item[User Goals]{To only review cards that the user wants to review. } + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~Add a class {[}A3{]}, Add Flashcards to Deck +{[}F1{]}, Make a Flashcard {[}F3{]}} + +\item[Priority Level]{~``Must''} + +\item[Status]{Unimplemented} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The User has an account with the application} +\item + {The User is logged in} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Desired cards are hidden to the user.} +\end{itemize} + +{Trigger:}{~User has selected a card to be hidden.} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The Client shows the user the dashboard.} +\item + {The User shall select the appropriate class.} +\item + {The System checks if the class is in session.} +\item + {The User shall select deck view.} +\item + {The Client shall route the user to the deck view.} +\item + {The User clicks a flashcard's remove button.} +\item + {The Client shall send a DELETE request to the server}{~}{at + /api/flashcard/\textless{}flashcard ID\textgreater{}/remove} +\item + {The Server removes the flashcard from the User's Deck.} +\item + {The Server updates the flashcard's position in the Live Feed.} +\item + {The Client updates the User's Deck.} +\end{enumerate} + +{} + +{Alternate Workflow:} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The Client shows the user the dashboard.} +\item + {The User shall select the appropriate class.} +\item + {The System checks if the class is }{not}{~in session.} +\item + {The Client shall the user to the deck view.} +\item + {The User clicks a flashcard's remove button.} +\item + {The Client shall send a DELETE request to the server}{~}{at + /api/flashcard/\textless{}flashcard ID\textgreater{}/remove} +\item + {The Server removes the flashcard from the User's Deck.} +\item + {The Server updates the flashcard's position in the Live Feed.} +\item + {The Client updates the User's Deck.} +\end{enumerate} +\end{description} +{} + +{} + +{} + +{} + +{} + +{} + +{} + +{} + +\subsection{\texorpdfstring{{{[}-D2-{]} Shuffling +deck}}{{[}-D2-{]} Shuffling deck}} + +\begin{description} +\item[Description]{User is able to shuffle his/her deck as a way to study +the flashcards} + +{Desired Outcome:}{~When taking a quiz, the user will notice that +flashcards appear in random order} + +{User Goals:}{~Improve quiz taking skills and knowledge consumption} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~Deck has been created {[}D2{]}} + +\item[Priority Level]{~~}{''Won't''} + +\item[Status]{Implemented } + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User must have registered for course } +\end{itemize} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User must have added cards to deck} +\end{itemize} + +\item[Post-conditions]{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User takes a quiz and notice the deck has been shuffled} +\end{itemize} + +{Trigger:}{~User has clicked on the button ``SHUFFLE DECK''} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User is on the homepage.} +\item + {User selects the ``Study'' button for the Class they want to view or + shuffle cards for.} +\item + {The Client displays their Deck for the Class of interest.} +\item + {User clicks on ``shuffle deck'' button to shuffle the deck, + randomizing the order in which it will be displayed.} +\item + {The Client displays a change in card ordering.} +\item + {System reorders cards' study order.} +\end{enumerate} + +{Alternate Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User is on the homepage.} +\item + {User selects Class of interest.} +\item + {The Client displays the Live Feed for the Class.} +\item + {User clicks on ``shuffle deck'' button to shuffle the deck, + randomizing the order in which it will be displayed.} +\item + {The Client displays a change in card ordering.} +\item + {System reorders cards' study order.} +\end{enumerate} +\end{description} +{} + +\newpage + +{} + +\subsection{\texorpdfstring{{{[}D2{]} Viewing cards in deck by pull +time}}{{[}D2{]} Viewing cards in deck by pull time}} + +\begin{description} +\item[Description]{The user is able to organize the deck by Flashcards' +pull timestamps.} + +{Desired Outcome:}{~The user views the deck in time ascending/descending +order.} + +\item[User Goals]{To organize the card for easier editing purpose.} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~View by pull timestamp.} + +\item[Priority Level]{~``Must''} + +\item[Status]{In Progress} + +\item[Pre-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User has an account with the application.} +\item + {User is logged in.} +\item + {User has a deck with at least 1 flashcard.} +\item + {User is at the deck view for a class.} +\end{itemize} + +\item[Post-conditions] + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {Cards in the deck are in time order.} +\end{itemize} + +{Trigger:}{~User selects organize by add time.} + +\item[Workflow] + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The Client shows the user the Deck View.} +\item + {The User shall select the option to sort the deck by ascending time.} +\item + {The Client shall submit a form POST request to the server at + /api/deck/ about the order} +\item + {The Server shall return the ordered view of the deck.} +\item + {The Client displays the cards in the ascending view of the pull + time.} +\end{enumerate} + +{} + +{Alternate WorkFlow:} + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The Client shows the user the Deck View.} +\item + {The User shall select the option to sort the deck by descending + time.} +\item + {The Client shall submit a form POST request to the server at + /api/deck/ about the order} +\item + {The Server shall return the descending view of the deck.} +\item + {The Client displays the cards in the descending view of the pull + time.} +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}R1{]} Study +Deck}}{{[}R1{]} Study Deck}} + +\begin{description} +\item[Description]{The User shall be able to look at the cards in his/her +deck in order to study them} + +{Desired Outcome:}{~The User shall be presented with individual +flashcards in an optimized order. Blanks will be empty and the user will +have a text boxes to fill in.} + +\item[User Goals]{The user shall be able to study all flashcards in his/her +deck from the appropriate class.} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~{[}F1{]}} + +\item[Priority Level]{~``Must''} + +\item[Status]{Not Implemented} + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User is logged in} +\item + {User has added cards to his/her deck} +\item + {User at Deck View} +\end{itemize} + +\item[Post-conditions]{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User shall see a single card with blanks.} +\end{itemize} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User shall be presented with text boxes to fill in} +\end{itemize} + +{Trigger:}{~User has clicked on the button to ``Study My Deck''} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The Client displays the Deck View to the User.} +\item + {The User clicks on the button ``Study Deck''.} +\item + {The Client sends request to the Server for flashcards and ordering + based on a hidden algorithm.} +\item + {The Client displays the Study View to the User which shows flashcards + based on the order.} +\item + {The User has the ability to fill in the blanks and study the Deck's + Flashcards.} +\item + {The Client sends the User's response back to the Server.} +\item + {The Server saves the response and updates statistics about the + flashcard.} +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}R2{]} Review +Notification}}{{[}R2{]} Review Notification}} + +\begin{description} +\item[Description]{The User shall be notified when to review each specific +card} + +{Desired Outcome:}{~The User shall receive a notification when it is +time to review a specific card using a spaced repetition formula} + +\item[User Goals]{The user shall see the notification and which card needs +to be reviewed} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~{[}A1{]}, {[}A2{]}} + +\item[Priority Level]{~``Must''} + +\item[Status]{Not Implemented} + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User has an account with the system. } +\item + {User is logged in.} +\item + {User has cards in his/her deck.} +\end{itemize} + +\item[Post-conditions]{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {System shall calculate when to next present the card based on a + memory decay formula.} +\item + {User shall be notified.} +\end{itemize} + +{Trigger:}{~The delay time for a card to be shown has passed} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {The Server analyzes a User's flashcard's statistics and when they + last reviewed the card to determine when to send the flashcard + notification.} +\item + {The Server shall send a notification to the User at the specified + review time.} +\item + {The Client receives a ``Review Flashcard'' notification.} +\item + {The Client displays a notification that allows the User to study the + specified flashcards in the queue.} +\end{enumerate} +\end{description} +\newpage + +{} + +\subsection{\texorpdfstring{{{[}R3{]} Configure Account +Notifications}}{{[}R3{]} Configure Account Notifications}} +\begin{description} +\item[Description]{The User shall be able to turn notifications on or off +at will} + +{Desired Outcome:}{~The User shall only receive notifications at the +times that were specified} + +\item[User Goals]{The User shall not be bothered needlessly or at +inconvenient times} + +\item[Primary Actor]{~User (student)} + +\item[Dependency Use Cases]{~\ldots{}} + +\item[Priority Level]{~``Must''} + +\item[Status]{Not Implemented} + +{Pre-conditions: } + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User has a verified account} +\item + {User is at application's home screen} +\end{itemize} + +\item[Post-conditions]{~} + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User only receive notifications at specified times} +\end{itemize} + +{Trigger:}{~User indicates that they want to change their notification +settings} + +{Workflow: } + +\begin{enumerate} +\itemsep1pt\parskip0pt\parsep0pt +\item + {User selects ``Account Settings'' button from a header.} +\item + {The Client displays a settings screen.} +\item + {User shall modify notifications and settings as seen fit.} +\item + {User shall click ``Save Settings'' button.} +\item + {Client shall display a message confirming the settings are saved.} +\item + {System shall save notification settings to the user's attributes.} +\end{enumerate} +\end{description} +\end{document} \ No newline at end of file diff --git a/Makefile b/Makefile index 04aebd8..4412cd2 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ PNGS = built/use_cases_diagram.png built/schema_diagram.png built/schema_graph.png +PDFS = built/DesignUseCases.pdf -all: built/ $(PNGS) +all: built/ $(PNGS) $(PDFS) built/: mkdir -p built @@ -12,7 +13,10 @@ built/schema_graph.png: sqlt-graph -o built/schema_graph.png --from PostgreSQL db_schema.sql built/%.png: %.dot - dot -Tpng -o $@ $< + dot -Tpng -o $@ $< + +built/%.pdf: %.tex + cd built/; pdflatex ../$< clean: rm -rf built/ -- 1.9.1