{"action":"created","issue":{"url":"https://api.github.com/repos/CSSE1001/MyPyTutor/issues/111","labels_url":"https://api.github.com/repos/CSSE1001/MyPyTutor/issues/111/labels{/name}","comments_url":"https://api.github.com/repos/CSSE1001/MyPyTutor/issues/111/comments","events_url":"https://api.github.com/repos/CSSE1001/MyPyTutor/issues/111/events","html_url":"https://github.com/CSSE1001/MyPyTutor/pull/111","id":58448822,"number":111,"title":"Admin interface","user":{"login":"jgat","id":1027236,"avatar_url":"https://avatars.githubusercontent.com/u/1027236?v=3","gravatar_id":"","url":"https://api.github.com/users/jgat","html_url":"https://github.com/jgat","followers_url":"https://api.github.com/users/jgat/followers","following_url":"https://api.github.com/users/jgat/following{/other_user}","gists_url":"https://api.github.com/users/jgat/gists{/gist_id}","starred_url":"https://api.github.com/users/jgat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgat/subscriptions","organizations_url":"https://api.github.com/users/jgat/orgs","repos_url":"https://api.github.com/users/jgat/repos","events_url":"https://api.github.com/users/jgat/events{/privacy}","received_events_url":"https://api.github.com/users/jgat/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/CSSE1001/MyPyTutor/labels/enhancement","name":"enhancement","color":"84b6eb"}],"state":"open","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/CSSE1001/MyPyTutor/milestones/2","html_url":"https://github.com/CSSE1001/MyPyTutor/milestones/MyPyTutor%203.1","labels_url":"https://api.github.com/repos/CSSE1001/MyPyTutor/milestones/2/labels","id":901394,"number":2,"title":"MyPyTutor 3.1","description":"Work which must be completed for the next stable release of MyPyTutor.","creator":{"login":"sapi","id":1009826,"avatar_url":"https://avatars.githubusercontent.com/u/1009826?v=3","gravatar_id":"","url":"https://api.github.com/users/sapi","html_url":"https://github.com/sapi","followers_url":"https://api.github.com/users/sapi/followers","following_url":"https://api.github.com/users/sapi/following{/other_user}","gists_url":"https://api.github.com/users/sapi/gists{/gist_id}","starred_url":"https://api.github.com/users/sapi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sapi/subscriptions","organizations_url":"https://api.github.com/users/sapi/orgs","repos_url":"https://api.github.com/users/sapi/repos","events_url":"https://api.github.com/users/sapi/events{/privacy}","received_events_url":"https://api.github.com/users/sapi/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":10,"state":"open","created_at":"2014-12-12T04:56:31Z","updated_at":"2015-02-23T04:11:33Z","due_on":null,"closed_at":null},"comments":17,"created_at":"2015-02-21T07:49:34Z","updated_at":"2015-02-26T11:47:53Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/CSSE1001/MyPyTutor/pulls/111","html_url":"https://github.com/CSSE1001/MyPyTutor/pull/111","diff_url":"https://github.com/CSSE1001/MyPyTutor/pull/111.diff","patch_url":"https://github.com/CSSE1001/MyPyTutor/pull/111.patch"},"body":"This branch (when work is complete) will close #105 by introducing a web-based admin interface. Current progress/plan:\r\n* [x] Save the names/emails of all users who access the system on the server.\r\n* [x] Create a webpage which lists all users and their name/email.\r\n* [x] Admins can see the progress page of any user (cf. #87).\r\n  * [x] Breadcrumbs link back to the admin dashboard.\r\n* [x] Admins can allow/disallow late submissions for a question via the progress page (extends #90).\r\n  * [x] Multiple selection of allow/disallow late (see comment thread below).\r\n* [x] Filtering of users in the admin panel (search by name, userid, email).\r\n* [x] Keep records of users who are enrolled in the current semester (to easily allow filtering out of non-students):\r\n  * [x] Storage/view of a user's enrolment status\r\n  * [x] Filtering students who are enrolled/unenrolled\r\n  * [x] Enrol/unenrol students via the web interface\r\n* [x] Show users' progress summary in a column (number of problems completed).\r\n* [x] Sort columns on each field (id, name, email, enrolment, progress).\r\n* [ ] Mass-upload CSV file of all students enrolled in the course.\r\n* [ ] Export marks to CSV via the web interface.\r\n\r\nLess-important work, and possible future work:\r\n* Admin view of progress per problem (instead of progress per user)\r\n* Statistical reporting (graphs of # submissions / # students, # submissions per question, submission times per question)\r\n* Restricted access for certain users (e.g. tutors can view some data, possibly anonymised, but can't edit)\r\n* [x] Ability to remove the \"enrolled\" bit on all users and/or remove all users from the system (convenience for beginning of future semesters).\r\n* [x] Display progress bars on the progress.py webpage.\r\n\r\nCurrent demo: http://csse1001.uqcloud.net/cgi-bin/_tests/admin.py?enrol_filter=all (Only users in [`admin.ADMINS`](https://github.com/CSSE1001/MyPyTutor/blob/admin_interface/cgi-bin/admin.py#L12) can view)"},"comment":{"url":"https://api.github.com/repos/CSSE1001/MyPyTutor/issues/comments/76165063","html_url":"https://github.com/CSSE1001/MyPyTutor/pull/111#issuecomment-76165063","issue_url":"https://api.github.com/repos/CSSE1001/MyPyTutor/issues/111","id":76165063,"user":{"login":"sapi","id":1009826,"avatar_url":"https://avatars.githubusercontent.com/u/1009826?v=3","gravatar_id":"","url":"https://api.github.com/users/sapi","html_url":"https://github.com/sapi","followers_url":"https://api.github.com/users/sapi/followers","following_url":"https://api.github.com/users/sapi/following{/other_user}","gists_url":"https://api.github.com/users/sapi/gists{/gist_id}","starred_url":"https://api.github.com/users/sapi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sapi/subscriptions","organizations_url":"https://api.github.com/users/sapi/orgs","repos_url":"https://api.github.com/users/sapi/repos","events_url":"https://api.github.com/users/sapi/events{/privacy}","received_events_url":"https://api.github.com/users/sapi/received_events","type":"User","site_admin":false},"created_at":"2015-02-26T11:47:53Z","updated_at":"2015-02-26T11:47:53Z","body":"Downloading marks is probably the least urgent of the lot, because of\nget_submissions.py\n\nI might have a look at the rest soon; I'm stuck in Brisbane for a few weeks\nand don't have much to do. No promises though.\n\nOn Thursday, February 26, 2015, Jackson Gatenby <notifications@github.com>\nwrote:\n\n> A brief note, I probably won't get a chance to polish this off myself\n> (unless it goes untouched for more than 3 weeks, or unless there's\n> something that needs my attention tomorrow for at most an hour or two).\n>\n> Still to do here:\n>\n>    - fix #116 <https://github.com/CSSE1001/MyPyTutor/issues/116>,\n>    including shifting get_submissions_for_user back into mpt_cgi.py.\n>    - resolve merge conflicts\n>    - resolve TODOs, e.g. make only pjr able to access admin features. (In\n>    any case, the only explicit action that can be taken is marking/unmarking\n>    late submissions, and the current setup logs the username and timestamp of\n>    anyone who takes those actions - it just doesn't display the logs anywhere).\n>\n> At that point, this pull request can be safely merged.\n>\n> Less priority:\n>\n>    - some sort of \"upload a list of known users\" feature - the role of\n>    this would be simply to enable tracking of any students who have never\n>    logged into the system.\n>       - This can be tied in with the \"show only enrolled users\" filter to\n>       avoid showing non-students who log into the system (e.g. course staff,\n>       private tutors, curious people).\n>       - There are only three necessary fields the import should require:\n>       login name (i.e. sXXXXX), name (don't care about separating given\n>       and family names), and email.\n>     - adding reporting of the number of times students have attempted\n>    tutorials (e.g. per student per tutorial, or aggregated per tutorial).\n>    - downloading marks summary in CSV\n>       - examples of nice formats are userid,score (e.g. uqjgaten,44 to\n>       indicate a mark of 44 out of N) or maybe userid,q1,q2,... with\n>       columns corresponding to each question (e.g. uqjgaten,1,1,0,1 with\n>       0/1 indicating a valid submission or not).\n>\n> —\n> Reply to this email directly or view it on GitHub\n> <https://github.com/CSSE1001/MyPyTutor/pull/111#issuecomment-76164259>.\n>\n"}}