{"action":"created","comment":{"url":"https://api.github.com/repos/artefactual/archivematica/pulls/comments/72661921","id":72661921,"diff_hunk":"@@ -0,0 +1,248 @@\n+#!/usr/bin/env python2\n+\n+from __future__ import print_function\n+\n+from argparse import ArgumentParser\n+import logging\n+from smtplib import SMTPException\n+import sys\n+import time\n+\n+import django\n+django.setup()\n+from django.contrib.auth.models import User\n+from django.core.mail import send_mail\n+from django.db import connection\n+from django.template import Context, Template\n+\n+from main.models import Report\n+\n+from custom_handlers import get_script_logger\n+\n+\n+logger = get_script_logger('archivematica.mcp.client.normalizeReport')\n+\n+# Based on http://leemunroe.github.io/responsive-html-email-template/email.html\n+EMAIL_TEMPLATE = \"\"\"\n+    <!doctype html>\n+    <html>\n+        <head>\n+            <meta name=\"viewport\" content=\"width=device-width\">\n+            <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n+            <title>Normalization failure report: {{ failed_count }} failures found</title>\n+        </head>\n+        <body>\n+            <table cellpadding=\"10\" width=\"100%\">\n+                <tr>\n+                    <td></td>\n+                    <td>\n+                        <h1>Archivematica</h1>\n+                        <hr />\n+                        <h3>\n+                            {{ name }}<br />\n+                            Normalization failure report: {{ failed_count }} failures found.\n+                        </h3>\n+                        <table cellpadding=\"10\" border=\"1\" width=\"100%\">\n+                            <thead>\n+                                <tr>\n+                                    <th>File</th>\n+                                    <th>Type</th>\n+                                    <th>Exit code</th>\n+                                </tr>\n+                            </thead>\n+                            <tbody>\n+                                {% for item in failures %}\n+                                    <tr>\n+                                        <td><abbr title=\"{{ item.file_uuid }}\">{{ item.location }}</abbr></td>\n+                                        {% if item.access_failed %}\n+                                            <td>Access</td>\n+                                            <td>{{ item.access_task_exit_code }}</td>\n+                                        {% endif %}\n+                                        {% if item.preservation_failed %}\n+                                            <td>Preservation</td>\n+                                            <td>{{ item.preservation_task_exit_code }}</td>\n+                                        {% endif %}\n+                                    </tr>\n+                                {% endfor %}\n+                            </tbody>\n+                        </table>\n+                    </td>\n+                    <td></td>\n+                </tr>\n+            </table>\n+            <table class=\"footer-wrap\">\n+                <tr>\n+                    <td></td>\n+                    <td class=\"container\">\n+                        <div class=\"content\">\n+                            <table>\n+                                <tr>\n+                                    <td align=\"center\">\n+                                        <p>Archivematica</p>\n+                                    </td>\n+                                </tr>\n+                            </table>\n+                        </div>\n+                    </td>\n+                    <td></td>\n+                </tr>\n+            </table>\n+        </body>\n+    </html>\n+\"\"\"\n+\n+\n+def query_normalization_results(cursor, uuid):\n+    \"\"\"\n+    Execute SQL query on given cursor. Based on https://git.io/vK1Km.\n+    \"\"\"\n+    sql = \"\"\"\n+        SELECT\n+            SUBSTRING(SUBSTRING(a.currentPath, 33), 1, CHAR_LENGTH(SUBSTRING(a.currentPath, 33)) - 38) AS sip_name,\n+            a.sipUUID AS sip_uuid,\n+            a.fileUUID AS file_uuid,\n+            a.fileID AS fpr_format_version_id,\n+            SUBSTRING(a.location, 27) AS location,\n+            SUBSTRING(a.currentLocation, 23) AS file_name,\n+            CASE WHEN c.exitCode <= 255 AND a.fileID IS NOT NULL THEN 1 ELSE 0 END AS access_normalization_attempted,\n+            CASE WHEN a.fileID IS NOT NULL AND c.exitCode > 0 THEN 1 ELSE 0 END AS access_normalization_failed,\n+            CASE WHEN b.exitCode <= 255 AND a.fileID IS NOT NULL THEN 1 ELSE 0 END AS preservation_normalization_attempted,\n+            CASE WHEN a.fileID IS NOT NULL AND b.exitCode > 0 THEN 1 ELSE 0 END AS preservation_normalization_failed,\n+            c.taskUUID AS access_normalization_task_uuid,\n+            b.taskUUID AS preservation_normalization_task_uuid,\n+            c.exitCode AS access_task_exit_code,\n+            b.exitCode AS preservation_task_exit_code\n+        FROM (\n+            -- Relation of files and their format versions\n+            SELECT sip.currentPath, f.fileUUID, f.sipUUID, f.originalLocation as location, f.currentLocation, fid.uuid AS 'fileID', f.fileGrpUse\n+            FROM Files f\n+            LEFT JOIN SIPs sip ON (f.sipUUID = sip.sipUUID)\n+            LEFT JOIN FilesIdentifiedIDs fii ON (f.fileUUID = fii.fileUUID)\n+            LEFT JOIN fpr_formatversion fid ON (fii.fileID = fid.uuid)\n+            WHERE f.fileGrpUse IN ('original', 'service') AND f.sipUUID = %s AND fid.uuid IS NOT NULL\n+        ) a\n+        LEFT JOIN (\n+            -- Relation of tasks of normalization for preservation of each file\n+            SELECT j.sipUUID, t.fileUUID, t.taskUUID, t.exitcode\n+            FROM Jobs j JOIN Tasks t ON (t.jobUUID = j.jobUUID)\n+            WHERE j.jobType = 'Normalize for preservation'\n+        ) b ON (a.fileUUID = b.fileUUID AND a.sipUUID = b.sipUUID)\n+        LEFT JOIN (\n+            -- Relation of tasks of normalization for access of each file\n+            SELECT j.sipUUID, t.fileUUID, t.taskUUID, t.exitcode\n+            FROM Jobs j JOIN Tasks t ON (t.jobUUID = j.jobUUID)\n+            WHERE j.jobType = 'Normalize for access'\n+        ) c ON (a.fileUUID = c.fileUUID AND a.sipUUID = c.sipUUID)\n+        WHERE\n+            a.sipUUID = %s\n+            AND (\n+                -- Access normalization attempted and failed or,\n+                -- preservation normalization attempted and failed.\n+                -- Aliases N/A (SELECT clauses evaluated later).\n+                (CASE WHEN c.exitCode <= 255 AND a.fileID IS NOT NULL THEN TRUE ELSE FALSE END AND CASE WHEN a.fileID IS NOT NULL AND c.exitCode > 0 THEN TRUE ELSE FALSE END)\n+                OR (CASE WHEN b.exitCode <= 255 AND a.fileID IS NOT NULL THEN TRUE ELSE FALSE END AND CASE WHEN a.fileID IS NOT NULL AND b.exitCode > 0 THEN TRUE ELSE FALSE END)\n+            );\n+    \"\"\"\n+\n+    logger.info('Extracting normalization results from the database.')\n+    logger.debug('Raw SQL query: %s.', sql)\n+\n+    start = time.time()\n+    cursor.execute(sql, (uuid, uuid))\n+    logger.info('Time spent in SQL query: %0.2f seconds.', (time.time() - start) * 1000.0)\n+\n+    return cursor.rowcount\n+\n+\n+def report(uuid):\n+    \"\"\"\n+    Generate normalization report using Django's template module and send it to\n+    every active user.\n+    \"\"\"\n+    recipient_list = User.objects.filter(is_active=True).values_list('email', flat=True).exclude(email__in=['demo@example.com', ''])\n+    if not recipient_list:\n+        logger.error('Normalization report is not being sent because the recipient list is empty.')\n+        return 0\n+\n+    logger.debug('Sending report to %s.', ', '.join(recipient_list))","path":"src/MCPClient/lib/clientScripts/normalizeReport.py","position":167,"original_position":167,"commit_id":"c43b06bad7f956419052ed287af3f13cc7815b86","original_commit_id":"b33fc1a5237d1a3bde3d21245b8d029301ff680f","user":{"login":"sevein","id":606459,"avatar_url":"https://avatars.githubusercontent.com/u/606459?v=3","gravatar_id":"","url":"https://api.github.com/users/sevein","html_url":"https://github.com/sevein","followers_url":"https://api.github.com/users/sevein/followers","following_url":"https://api.github.com/users/sevein/following{/other_user}","gists_url":"https://api.github.com/users/sevein/gists{/gist_id}","starred_url":"https://api.github.com/users/sevein/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sevein/subscriptions","organizations_url":"https://api.github.com/users/sevein/orgs","repos_url":"https://api.github.com/users/sevein/repos","events_url":"https://api.github.com/users/sevein/events{/privacy}","received_events_url":"https://api.github.com/users/sevein/received_events","type":"User","site_admin":false},"body":"Ok! I'll fix.","created_at":"2016-07-28T17:08:38Z","updated_at":"2016-07-28T17:08:38Z","html_url":"https://github.com/artefactual/archivematica/pull/476#discussion_r72661921","pull_request_url":"https://api.github.com/repos/artefactual/archivematica/pulls/476","_links":{"self":{"href":"https://api.github.com/repos/artefactual/archivematica/pulls/comments/72661921"},"html":{"href":"https://github.com/artefactual/archivematica/pull/476#discussion_r72661921"},"pull_request":{"href":"https://api.github.com/repos/artefactual/archivematica/pulls/476"}}},"pull_request":{"url":"https://api.github.com/repos/artefactual/archivematica/pulls/476","id":78240069,"html_url":"https://github.com/artefactual/archivematica/pull/476","diff_url":"https://github.com/artefactual/archivematica/pull/476.diff","patch_url":"https://github.com/artefactual/archivematica/pull/476.patch","issue_url":"https://api.github.com/repos/artefactual/archivematica/issues/476","number":476,"state":"open","locked":false,"title":"Normalization report, refs #10146","user":{"login":"sevein","id":606459,"avatar_url":"https://avatars.githubusercontent.com/u/606459?v=3","gravatar_id":"","url":"https://api.github.com/users/sevein","html_url":"https://github.com/sevein","followers_url":"https://api.github.com/users/sevein/followers","following_url":"https://api.github.com/users/sevein/following{/other_user}","gists_url":"https://api.github.com/users/sevein/gists{/gist_id}","starred_url":"https://api.github.com/users/sevein/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sevein/subscriptions","organizations_url":"https://api.github.com/users/sevein/orgs","repos_url":"https://api.github.com/users/sevein/repos","events_url":"https://api.github.com/users/sevein/events{/privacy}","received_events_url":"https://api.github.com/users/sevein/received_events","type":"User","site_admin":false},"body":"Redmine: https://projects.artefactual.com/issues/10146\r\n\r\n---\r\nNormalization report sent by email to active users.","created_at":"2016-07-21T00:12:57Z","updated_at":"2016-07-28T17:08:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8fe1efc5d93726dac7fed9b341138b1a6b97c977","assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/artefactual/archivematica/milestones/4","html_url":"https://github.com/artefactual/archivematica/milestones/1.6.0","labels_url":"https://api.github.com/repos/artefactual/archivematica/milestones/4/labels","id":1317264,"number":4,"title":"1.6.0","description":"","creator":{"login":"Hwesta","id":3166226,"avatar_url":"https://avatars.githubusercontent.com/u/3166226?v=3","gravatar_id":"","url":"https://api.github.com/users/Hwesta","html_url":"https://github.com/Hwesta","followers_url":"https://api.github.com/users/Hwesta/followers","following_url":"https://api.github.com/users/Hwesta/following{/other_user}","gists_url":"https://api.github.com/users/Hwesta/gists{/gist_id}","starred_url":"https://api.github.com/users/Hwesta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hwesta/subscriptions","organizations_url":"https://api.github.com/users/Hwesta/orgs","repos_url":"https://api.github.com/users/Hwesta/repos","events_url":"https://api.github.com/users/Hwesta/events{/privacy}","received_events_url":"https://api.github.com/users/Hwesta/received_events","type":"User","site_admin":false},"open_issues":14,"closed_issues":92,"state":"open","created_at":"2015-09-21T20:50:42Z","updated_at":"2016-07-27T23:49:17Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/artefactual/archivematica/pulls/476/commits","review_comments_url":"https://api.github.com/repos/artefactual/archivematica/pulls/476/comments","review_comment_url":"https://api.github.com/repos/artefactual/archivematica/pulls/comments{/number}","comments_url":"https://api.github.com/repos/artefactual/archivematica/issues/476/comments","statuses_url":"https://api.github.com/repos/artefactual/archivematica/statuses/c43b06bad7f956419052ed287af3f13cc7815b86","head":{"label":"artefactual:dev/issue-10146-normalization-email","ref":"dev/issue-10146-normalization-email","sha":"c43b06bad7f956419052ed287af3f13cc7815b86","user":{"login":"artefactual","id":1163545,"avatar_url":"https://avatars.githubusercontent.com/u/1163545?v=3","gravatar_id":"","url":"https://api.github.com/users/artefactual","html_url":"https://github.com/artefactual","followers_url":"https://api.github.com/users/artefactual/followers","following_url":"https://api.github.com/users/artefactual/following{/other_user}","gists_url":"https://api.github.com/users/artefactual/gists{/gist_id}","starred_url":"https://api.github.com/users/artefactual/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artefactual/subscriptions","organizations_url":"https://api.github.com/users/artefactual/orgs","repos_url":"https://api.github.com/users/artefactual/repos","events_url":"https://api.github.com/users/artefactual/events{/privacy}","received_events_url":"https://api.github.com/users/artefactual/received_events","type":"Organization","site_admin":false},"repo":{"id":5811958,"name":"archivematica","full_name":"artefactual/archivematica","owner":{"login":"artefactual","id":1163545,"avatar_url":"https://avatars.githubusercontent.com/u/1163545?v=3","gravatar_id":"","url":"https://api.github.com/users/artefactual","html_url":"https://github.com/artefactual","followers_url":"https://api.github.com/users/artefactual/followers","following_url":"https://api.github.com/users/artefactual/following{/other_user}","gists_url":"https://api.github.com/users/artefactual/gists{/gist_id}","starred_url":"https://api.github.com/users/artefactual/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artefactual/subscriptions","organizations_url":"https://api.github.com/users/artefactual/orgs","repos_url":"https://api.github.com/users/artefactual/repos","events_url":"https://api.github.com/users/artefactual/events{/privacy}","received_events_url":"https://api.github.com/users/artefactual/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/artefactual/archivematica","description":"Free and open-source digital preservation system designed to maintain standards-based, long-term access to collections of digital objects.","fork":false,"url":"https://api.github.com/repos/artefactual/archivematica","forks_url":"https://api.github.com/repos/artefactual/archivematica/forks","keys_url":"https://api.github.com/repos/artefactual/archivematica/keys{/key_id}","collaborators_url":"https://api.github.com/repos/artefactual/archivematica/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/artefactual/archivematica/teams","hooks_url":"https://api.github.com/repos/artefactual/archivematica/hooks","issue_events_url":"https://api.github.com/repos/artefactual/archivematica/issues/events{/number}","events_url":"https://api.github.com/repos/artefactual/archivematica/events","assignees_url":"https://api.github.com/repos/artefactual/archivematica/assignees{/user}","branches_url":"https://api.github.com/repos/artefactual/archivematica/branches{/branch}","tags_url":"https://api.github.com/repos/artefactual/archivematica/tags","blobs_url":"https://api.github.com/repos/artefactual/archivematica/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/artefactual/archivematica/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/artefactual/archivematica/git/refs{/sha}","trees_url":"https://api.github.com/repos/artefactual/archivematica/git/trees{/sha}","statuses_url":"https://api.github.com/repos/artefactual/archivematica/statuses/{sha}","languages_url":"https://api.github.com/repos/artefactual/archivematica/languages","stargazers_url":"https://api.github.com/repos/artefactual/archivematica/stargazers","contributors_url":"https://api.github.com/repos/artefactual/archivematica/contributors","subscribers_url":"https://api.github.com/repos/artefactual/archivematica/subscribers","subscription_url":"https://api.github.com/repos/artefactual/archivematica/subscription","commits_url":"https://api.github.com/repos/artefactual/archivematica/commits{/sha}","git_commits_url":"https://api.github.com/repos/artefactual/archivematica/git/commits{/sha}","comments_url":"https://api.github.com/repos/artefactual/archivematica/comments{/number}","issue_comment_url":"https://api.github.com/repos/artefactual/archivematica/issues/comments{/number}","contents_url":"https://api.github.com/repos/artefactual/archivematica/contents/{+path}","compare_url":"https://api.github.com/repos/artefactual/archivematica/compare/{base}...{head}","merges_url":"https://api.github.com/repos/artefactual/archivematica/merges","archive_url":"https://api.github.com/repos/artefactual/archivematica/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/artefactual/archivematica/downloads","issues_url":"https://api.github.com/repos/artefactual/archivematica/issues{/number}","pulls_url":"https://api.github.com/repos/artefactual/archivematica/pulls{/number}","milestones_url":"https://api.github.com/repos/artefactual/archivematica/milestones{/number}","notifications_url":"https://api.github.com/repos/artefactual/archivematica/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/artefactual/archivematica/labels{/name}","releases_url":"https://api.github.com/repos/artefactual/archivematica/releases{/id}","deployments_url":"https://api.github.com/repos/artefactual/archivematica/deployments","created_at":"2012-09-14T16:43:38Z","updated_at":"2016-05-04T22:11:04Z","pushed_at":"2016-07-28T15:38:12Z","git_url":"git://github.com/artefactual/archivematica.git","ssh_url":"git@github.com:artefactual/archivematica.git","clone_url":"https://github.com/artefactual/archivematica.git","svn_url":"https://github.com/artefactual/archivematica","homepage":"http://www.archivematica.org","size":30599,"stargazers_count":90,"watchers_count":90,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":27,"mirror_url":null,"open_issues_count":24,"forks":27,"open_issues":24,"watchers":90,"default_branch":"stable/1.5.x"}},"base":{"label":"artefactual:qa/1.x","ref":"qa/1.x","sha":"a20406e99dbc0f2271c6ac27792b480aa69493cc","user":{"login":"artefactual","id":1163545,"avatar_url":"https://avatars.githubusercontent.com/u/1163545?v=3","gravatar_id":"","url":"https://api.github.com/users/artefactual","html_url":"https://github.com/artefactual","followers_url":"https://api.github.com/users/artefactual/followers","following_url":"https://api.github.com/users/artefactual/following{/other_user}","gists_url":"https://api.github.com/users/artefactual/gists{/gist_id}","starred_url":"https://api.github.com/users/artefactual/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artefactual/subscriptions","organizations_url":"https://api.github.com/users/artefactual/orgs","repos_url":"https://api.github.com/users/artefactual/repos","events_url":"https://api.github.com/users/artefactual/events{/privacy}","received_events_url":"https://api.github.com/users/artefactual/received_events","type":"Organization","site_admin":false},"repo":{"id":5811958,"name":"archivematica","full_name":"artefactual/archivematica","owner":{"login":"artefactual","id":1163545,"avatar_url":"https://avatars.githubusercontent.com/u/1163545?v=3","gravatar_id":"","url":"https://api.github.com/users/artefactual","html_url":"https://github.com/artefactual","followers_url":"https://api.github.com/users/artefactual/followers","following_url":"https://api.github.com/users/artefactual/following{/other_user}","gists_url":"https://api.github.com/users/artefactual/gists{/gist_id}","starred_url":"https://api.github.com/users/artefactual/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artefactual/subscriptions","organizations_url":"https://api.github.com/users/artefactual/orgs","repos_url":"https://api.github.com/users/artefactual/repos","events_url":"https://api.github.com/users/artefactual/events{/privacy}","received_events_url":"https://api.github.com/users/artefactual/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/artefactual/archivematica","description":"Free and open-source digital preservation system designed to maintain standards-based, long-term access to collections of digital objects.","fork":false,"url":"https://api.github.com/repos/artefactual/archivematica","forks_url":"https://api.github.com/repos/artefactual/archivematica/forks","keys_url":"https://api.github.com/repos/artefactual/archivematica/keys{/key_id}","collaborators_url":"https://api.github.com/repos/artefactual/archivematica/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/artefactual/archivematica/teams","hooks_url":"https://api.github.com/repos/artefactual/archivematica/hooks","issue_events_url":"https://api.github.com/repos/artefactual/archivematica/issues/events{/number}","events_url":"https://api.github.com/repos/artefactual/archivematica/events","assignees_url":"https://api.github.com/repos/artefactual/archivematica/assignees{/user}","branches_url":"https://api.github.com/repos/artefactual/archivematica/branches{/branch}","tags_url":"https://api.github.com/repos/artefactual/archivematica/tags","blobs_url":"https://api.github.com/repos/artefactual/archivematica/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/artefactual/archivematica/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/artefactual/archivematica/git/refs{/sha}","trees_url":"https://api.github.com/repos/artefactual/archivematica/git/trees{/sha}","statuses_url":"https://api.github.com/repos/artefactual/archivematica/statuses/{sha}","languages_url":"https://api.github.com/repos/artefactual/archivematica/languages","stargazers_url":"https://api.github.com/repos/artefactual/archivematica/stargazers","contributors_url":"https://api.github.com/repos/artefactual/archivematica/contributors","subscribers_url":"https://api.github.com/repos/artefactual/archivematica/subscribers","subscription_url":"https://api.github.com/repos/artefactual/archivematica/subscription","commits_url":"https://api.github.com/repos/artefactual/archivematica/commits{/sha}","git_commits_url":"https://api.github.com/repos/artefactual/archivematica/git/commits{/sha}","comments_url":"https://api.github.com/repos/artefactual/archivematica/comments{/number}","issue_comment_url":"https://api.github.com/repos/artefactual/archivematica/issues/comments{/number}","contents_url":"https://api.github.com/repos/artefactual/archivematica/contents/{+path}","compare_url":"https://api.github.com/repos/artefactual/archivematica/compare/{base}...{head}","merges_url":"https://api.github.com/repos/artefactual/archivematica/merges","archive_url":"https://api.github.com/repos/artefactual/archivematica/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/artefactual/archivematica/downloads","issues_url":"https://api.github.com/repos/artefactual/archivematica/issues{/number}","pulls_url":"https://api.github.com/repos/artefactual/archivematica/pulls{/number}","milestones_url":"https://api.github.com/repos/artefactual/archivematica/milestones{/number}","notifications_url":"https://api.github.com/repos/artefactual/archivematica/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/artefactual/archivematica/labels{/name}","releases_url":"https://api.github.com/repos/artefactual/archivematica/releases{/id}","deployments_url":"https://api.github.com/repos/artefactual/archivematica/deployments","created_at":"2012-09-14T16:43:38Z","updated_at":"2016-05-04T22:11:04Z","pushed_at":"2016-07-28T15:38:12Z","git_url":"git://github.com/artefactual/archivematica.git","ssh_url":"git@github.com:artefactual/archivematica.git","clone_url":"https://github.com/artefactual/archivematica.git","svn_url":"https://github.com/artefactual/archivematica","homepage":"http://www.archivematica.org","size":30599,"stargazers_count":90,"watchers_count":90,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":27,"mirror_url":null,"open_issues_count":24,"forks":27,"open_issues":24,"watchers":90,"default_branch":"stable/1.5.x"}},"_links":{"self":{"href":"https://api.github.com/repos/artefactual/archivematica/pulls/476"},"html":{"href":"https://github.com/artefactual/archivematica/pull/476"},"issue":{"href":"https://api.github.com/repos/artefactual/archivematica/issues/476"},"comments":{"href":"https://api.github.com/repos/artefactual/archivematica/issues/476/comments"},"review_comments":{"href":"https://api.github.com/repos/artefactual/archivematica/pulls/476/comments"},"review_comment":{"href":"https://api.github.com/repos/artefactual/archivematica/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/artefactual/archivematica/pulls/476/commits"},"statuses":{"href":"https://api.github.com/repos/artefactual/archivematica/statuses/c43b06bad7f956419052ed287af3f13cc7815b86"}}}}
{"actor":{"display_login":"sevein"}}