================================================================================ Notes System ================================================================================ What is the notes system? ================================================================================ The notes system allows instructors and TAs to add notes on various objects during marking or otherwise during the course of the term. Currently, this functionality is only available for groupings. Why do we want this feature? ================================================================================ If a student is sick or has other extenuating circumstances, then we would like for the instructor and TAs to have a way of communicating about these issues from within the MarkUs environment, while being able to see the context where these problems matter, rather than having separate e-mail threads about them. This way, all TAs and instructors for the course can also see the notes. How do notes work? ================================================================================ An instructor or a TA can create a note on a grouping while marking the assignment. An instructor can also create a note on a grouping in the "Groups & Graders" screen on the "Assignments" tab. All TAs and instructors can also see these notes in a summary view on the Notes tab and create additional notes via a screen there. All instructors can edit and delete all notes. A TA can edit and delete notes created by him/herself. Notes are set up in their associated noteable objects to be deleted on destroy of the associated object. User interface ================================================================================ Notes tab -------------------------------------------------------------------------------- For TAs and instructors, a new tab for Notes was added to the end of the row of tabs. Summary view ******************************************************************************** Clicking on the Notes tab presents you with a link to add a new note, as well as a summary view of all the existing notes. For each note, there are three columns: * The first column shows the author's username, the noteable's "display_for_note" and the creation time of the note. (See the Noteable section below for information on this method.) * The second column shows the note's message. * The third column shows Edit and Delete links, if the current user has the ability to perform these actions on the note. Editing a note ******************************************************************************** The Edit a note screen displays the pertinent information on the note: * Author * Noteable object (type and display_for_note) * Creation time and offers a textarea to edit the note message. This is the only field that is editable. Create a note ******************************************************************************** The Create a note screen allows the user to create a note on a specific grouping. Currently this is done by first selecting the assignment from a dropdown and then a dropdown is populated with all of the groupings on that assignment. The user then selects the correct grouping, enters a message and clicks "Save". Groups & Graders -------------------------------------------------------------------------------- Submissions -------------------------------------------------------------------------------- Implementation details ================================================================================ ### Database The database for the Notes system is quite simple. It only requires one table, notes: * notes_message: string The message that the author wanted to express in this note * creator_id: integer The user ID of the author of this note * noteable_id: integer The ID of the object associated with this note * noteable_type: string The type of the object associated with this note Each row in this table represents a single note. A Polymorphic association is used to link the note to its associated object, which is represented in the database by the columns noteable_id and noteable_type. This object can be accessed via @note.noteable, regardless of its type. Noteable -------------------------------------------------------------------------------- Each object that is noteable has a "display_for_note" method that specifies how to show it as an object for the Notes summary. Grouping displays itself as as "A#: Group_000#" or "A#: Group_000#: userid1, userid2" Controller code -------------------------------------------------------------------------------- There is one controller for the notes system - NoteController. This controller contains actions for both the modal dialogs as well as for the Notes tab. Prior to all actions, we ensure that the current user is a TA or an admin and for the edit and delete actions that the current user is allowed to modify the requested note. Modal dialogs ******************************************************************************** Actions: * notes_dialog - FILL IN * add_note - FILL IN Notes tab ******************************************************************************** Actions: * **index** - Retrieves all notes, in descending order by creation time. * **new** - Retrieves all assignments and the groupings for the first assignment to display the new note form. * **create** - Processes the new note form; redirects to the index page after successful completion. * **new_update_groupings** - Retrieves groupings on a change in assignment in the new note form * **edit** - Retrieves the note information to display the edit a note form. * **update** - Processes the edit note form; redirects to the index page after successful completion. * **delete** - Deletes the given note and sets the flash accordingly. Views -------------------------------------------------------------------------------- Modal dialogs ******************************************************************************** These are located in the "modal_dialogs" folder in the note controller's views. FILL IN Notes tab ******************************************************************************** * **delete** - Redirects to the index action upon deletion, regardless of success or failure, since either message will be shown in the flash. * **edit** - Displays the edit form, as described above in the user interface section. * **index** - Shows all the notes, as described above for the "Summary view" in the user interface section. Above the notes, shows any error and success messages. * **new_update_groupings** - Replaces the groupings dropdown with a new one with the new @groupings values. * **new** - Displays the new form, as described above in the user interface section. Tests -------------------------------------------------------------------------------- Unit tests ******************************************************************************** The unit tests test the associations in the Note model and the validate_presence_of macros. Functional tests ******************************************************************************** The functional tests assert the following: * An authenticated student can make no GET, POST, or DELETE requests against the NoteController actions. * An authenticated TA or admin can make GET requests against the notes_dialog, index, new, new_update_groupings, edit; POST requests against the add_note, create, update; DELETE request against delete. * An authenticated TA can edit and delete only his/her notes and not anyone else's, but an admin can edit and delete anyone's. Current state and potential additions --------------------------------------------------------------------------------