{"action":"created","comment":{"url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments/57618746","id":57618746,"diff_hunk":"@@ -153,6 +153,105 @@ def section_text_responses\n     render json: data\n   end\n \n+  def section_assessments\n+    load_section\n+    load_script\n+\n+    level_group_script_levels = @script.script_levels.includes(:level).where('levels.type' => LevelGroup)\n+\n+    data = @section.students.map do |student|\n+      student_hash = {id: student.id, name: student.name}\n+\n+      level_group_script_levels.map do |script_level|\n+        next unless script_level.long_assessment?\n+\n+        last_attempt = student.last_attempt(script_level.level)\n+        response = last_attempt.try(:level_source).try(:data)\n+\n+        next unless response\n+\n+        user_level = UserLevel.where(user_id: student.id, level: script_level.level, script: @script).first\n+        puts user_level.to_json\n+\n+        # Summarize some key data.\n+        multi_count = 0\n+        multi_count_correct = 0\n+\n+        # And construct a listing of all the individual levels and their results.\n+        level_results = []\n+\n+        next unless properties = script_level.level[:properties]\n+\n+        # Go through each page of the long assessment's LevelGroup.\n+        properties[\"pages\"].each do |page|\n+          # Go through each level of the page.\n+          page[\"levels\"].each do |page_level_name|\n+            level = Level.find_by_name(page_level_name)\n+\n+            # And work with the response to the individual level inside the LevelGroup.\n+            response_parsed = JSON.parse(response)\n+            level_response = response_parsed.select{|r| r[\"level_id\"] == level.id}\n+\n+            if level_response\n+              # For each level inside the LevelGroup, we determine the resut,\n+              # both content in :student_result and result value in :correct.\n+              # This array is returned for each LevelGroup, and its order matches\n+              # that of the LevelGroup as it's declared.\n+              level_result = {}\n+\n+              level_class = level.class.to_s.underscore","path":"dashboard/app/controllers/api_controller.rb","position":50,"original_position":50,"commit_id":"cca152adfc51592dd472a9fb8a5ffcb59bff9107","original_commit_id":"cca152adfc51592dd472a9fb8a5ffcb59bff9107","user":{"login":"laurelfan","id":7763,"avatar_url":"https://avatars.githubusercontent.com/u/7763?v=3","gravatar_id":"","url":"https://api.github.com/users/laurelfan","html_url":"https://github.com/laurelfan","followers_url":"https://api.github.com/users/laurelfan/followers","following_url":"https://api.github.com/users/laurelfan/following{/other_user}","gists_url":"https://api.github.com/users/laurelfan/gists{/gist_id}","starred_url":"https://api.github.com/users/laurelfan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/laurelfan/subscriptions","organizations_url":"https://api.github.com/users/laurelfan/orgs","repos_url":"https://api.github.com/users/laurelfan/repos","events_url":"https://api.github.com/users/laurelfan/events{/privacy}","received_events_url":"https://api.github.com/users/laurelfan/received_events","type":"User","site_admin":false},"body":"since you only use this string for comparisons, you might as well compare the class directly, a couple ways to do this: \r\n\r\n* `if level.is_a? TextMatch`\r\n* `if level.instance_of? TextMatch` http://stackoverflow.com/questions/3893278/ruby-kind-of-vs-instance-of-vs-is-a instance_of returns true for the exact class while is_of allows subclasses. May want to use instance_of here because the inheritance is kind of weird (like we have `Multi < Match`)\r\n* `if TextMatch === level` The `===` might read weird to people especially if they are used to using `===` in JS and because it's 'backwards'.\r\n* \r\n````\r\ncase level\r\nwhen TextMatch\r\nwhen Multi\r\n````\r\nactually uses === in the same way as above; I think looks better especially if there may be more than 2 conditions in the future","created_at":"2016-03-28T19:25:14Z","updated_at":"2016-03-28T19:25:14Z","html_url":"https://github.com/code-dot-org/code-dot-org/pull/7523#discussion_r57618746","pull_request_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523","_links":{"self":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments/57618746"},"html":{"href":"https://github.com/code-dot-org/code-dot-org/pull/7523#discussion_r57618746"},"pull_request":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523"}}},"pull_request":{"url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523","id":64256197,"html_url":"https://github.com/code-dot-org/code-dot-org/pull/7523","diff_url":"https://github.com/code-dot-org/code-dot-org/pull/7523.diff","patch_url":"https://github.com/code-dot-org/code-dot-org/pull/7523.patch","issue_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/7523","number":7523,"state":"open","locked":false,"title":"Assessments tab for teachers","user":{"login":"breville","id":2205926,"avatar_url":"https://avatars.githubusercontent.com/u/2205926?v=3","gravatar_id":"","url":"https://api.github.com/users/breville","html_url":"https://github.com/breville","followers_url":"https://api.github.com/users/breville/followers","following_url":"https://api.github.com/users/breville/following{/other_user}","gists_url":"https://api.github.com/users/breville/gists{/gist_id}","starred_url":"https://api.github.com/users/breville/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/breville/subscriptions","organizations_url":"https://api.github.com/users/breville/orgs","repos_url":"https://api.github.com/users/breville/repos","events_url":"https://api.github.com/users/breville/events{/privacy}","received_events_url":"https://api.github.com/users/breville/received_events","type":"User","site_admin":false},"body":"![screenshot 2016-03-28 21 22 42](https://cloud.githubusercontent.com/assets/2205926/14076180/4178de46-f52b-11e5-8322-13b8461c76ac.png)\r\n","created_at":"2016-03-27T03:30:14Z","updated_at":"2016-03-28T19:25:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"de5fd67db63031282e59eb976d3d0c2c2f30cbd7","assignee":{"login":"laurelfan","id":7763,"avatar_url":"https://avatars.githubusercontent.com/u/7763?v=3","gravatar_id":"","url":"https://api.github.com/users/laurelfan","html_url":"https://github.com/laurelfan","followers_url":"https://api.github.com/users/laurelfan/followers","following_url":"https://api.github.com/users/laurelfan/following{/other_user}","gists_url":"https://api.github.com/users/laurelfan/gists{/gist_id}","starred_url":"https://api.github.com/users/laurelfan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/laurelfan/subscriptions","organizations_url":"https://api.github.com/users/laurelfan/orgs","repos_url":"https://api.github.com/users/laurelfan/repos","events_url":"https://api.github.com/users/laurelfan/events{/privacy}","received_events_url":"https://api.github.com/users/laurelfan/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523/commits","review_comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523/comments","review_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments{/number}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/7523/comments","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/cca152adfc51592dd472a9fb8a5ffcb59bff9107","head":{"label":"code-dot-org:assessment-teacher","ref":"assessment-teacher","sha":"cca152adfc51592dd472a9fb8a5ffcb59bff9107","user":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"repo":{"id":24250009,"name":"code-dot-org","full_name":"code-dot-org/code-dot-org","owner":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/code-dot-org/code-dot-org","description":"The code powering code.org and studio.code.org","fork":false,"url":"https://api.github.com/repos/code-dot-org/code-dot-org","forks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/forks","keys_url":"https://api.github.com/repos/code-dot-org/code-dot-org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/code-dot-org/code-dot-org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/code-dot-org/code-dot-org/teams","hooks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/hooks","issue_events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/events{/number}","events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/events","assignees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/assignees{/user}","branches_url":"https://api.github.com/repos/code-dot-org/code-dot-org/branches{/branch}","tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/tags","blobs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/refs{/sha}","trees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/{sha}","languages_url":"https://api.github.com/repos/code-dot-org/code-dot-org/languages","stargazers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/stargazers","contributors_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contributors","subscribers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscribers","subscription_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscription","commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/commits{/sha}","git_commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/commits{/sha}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/comments{/number}","issue_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/comments{/number}","contents_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contents/{+path}","compare_url":"https://api.github.com/repos/code-dot-org/code-dot-org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/code-dot-org/code-dot-org/merges","archive_url":"https://api.github.com/repos/code-dot-org/code-dot-org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/code-dot-org/code-dot-org/downloads","issues_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues{/number}","pulls_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls{/number}","milestones_url":"https://api.github.com/repos/code-dot-org/code-dot-org/milestones{/number}","notifications_url":"https://api.github.com/repos/code-dot-org/code-dot-org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/code-dot-org/code-dot-org/labels{/name}","releases_url":"https://api.github.com/repos/code-dot-org/code-dot-org/releases{/id}","deployments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/deployments","created_at":"2014-09-20T00:46:11Z","updated_at":"2016-03-28T14:05:18Z","pushed_at":"2016-03-28T19:24:26Z","git_url":"git://github.com/code-dot-org/code-dot-org.git","ssh_url":"git@github.com:code-dot-org/code-dot-org.git","clone_url":"https://github.com/code-dot-org/code-dot-org.git","svn_url":"https://github.com/code-dot-org/code-dot-org","homepage":"http://code.org","size":4375954,"stargazers_count":105,"watchers_count":105,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":56,"mirror_url":null,"open_issues_count":64,"forks":56,"open_issues":64,"watchers":105,"default_branch":"staging"}},"base":{"label":"code-dot-org:staging","ref":"staging","sha":"909264654e80e4223f4ca483307c4df3cbfc4509","user":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"repo":{"id":24250009,"name":"code-dot-org","full_name":"code-dot-org/code-dot-org","owner":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/code-dot-org/code-dot-org","description":"The code powering code.org and studio.code.org","fork":false,"url":"https://api.github.com/repos/code-dot-org/code-dot-org","forks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/forks","keys_url":"https://api.github.com/repos/code-dot-org/code-dot-org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/code-dot-org/code-dot-org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/code-dot-org/code-dot-org/teams","hooks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/hooks","issue_events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/events{/number}","events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/events","assignees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/assignees{/user}","branches_url":"https://api.github.com/repos/code-dot-org/code-dot-org/branches{/branch}","tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/tags","blobs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/refs{/sha}","trees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/{sha}","languages_url":"https://api.github.com/repos/code-dot-org/code-dot-org/languages","stargazers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/stargazers","contributors_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contributors","subscribers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscribers","subscription_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscription","commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/commits{/sha}","git_commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/commits{/sha}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/comments{/number}","issue_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/comments{/number}","contents_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contents/{+path}","compare_url":"https://api.github.com/repos/code-dot-org/code-dot-org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/code-dot-org/code-dot-org/merges","archive_url":"https://api.github.com/repos/code-dot-org/code-dot-org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/code-dot-org/code-dot-org/downloads","issues_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues{/number}","pulls_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls{/number}","milestones_url":"https://api.github.com/repos/code-dot-org/code-dot-org/milestones{/number}","notifications_url":"https://api.github.com/repos/code-dot-org/code-dot-org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/code-dot-org/code-dot-org/labels{/name}","releases_url":"https://api.github.com/repos/code-dot-org/code-dot-org/releases{/id}","deployments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/deployments","created_at":"2014-09-20T00:46:11Z","updated_at":"2016-03-28T14:05:18Z","pushed_at":"2016-03-28T19:24:26Z","git_url":"git://github.com/code-dot-org/code-dot-org.git","ssh_url":"git@github.com:code-dot-org/code-dot-org.git","clone_url":"https://github.com/code-dot-org/code-dot-org.git","svn_url":"https://github.com/code-dot-org/code-dot-org","homepage":"http://code.org","size":4375954,"stargazers_count":105,"watchers_count":105,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":56,"mirror_url":null,"open_issues_count":64,"forks":56,"open_issues":64,"watchers":105,"default_branch":"staging"}},"_links":{"self":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523"},"html":{"href":"https://github.com/code-dot-org/code-dot-org/pull/7523"},"issue":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/7523"},"comments":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/7523/comments"},"review_comments":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523/comments"},"review_comment":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/7523/commits"},"statuses":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/cca152adfc51592dd472a9fb8a5ffcb59bff9107"}}}}