GitHub PullRequestReviewCommentEvent at 2014-06-12 15:13:37
Repository: qiita
Actor: squirrelo
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/biocore/qiita/pulls/comments/13706423","id":13706423,"diff_hunk":"@@ -19,105 +95,525 @@\n # The full license is in the file LICENSE, distributed with this software.\n # -----------------------------------------------------------------------------\n \n-from .base import QiitaStatusObject\n-from .exceptions import QiitaDBNotImplementedError\n+from __future__ import division\n+from future.builtins import zip\n+from datetime import date\n+from copy import deepcopy\n+\n+from qiita_core.exceptions import IncompetentQiitaDeveloperError\n+from .base import QiitaStatusObject, QiitaObject\n+from .exceptions import (QiitaDBDuplicateError, QiitaDBStatusError,\n+                         QiitaDBColumnError)\n+from .util import check_required_columns, check_table_cols\n+from .sql_connection import SQLConnectionHandler\n \n \n class Study(QiitaStatusObject):\n-    \"\"\"\n-    Study object to access to the Qiita Study information\n+    r\"\"\"Study object to access to the Qiita Study information\n \n     Attributes\n     ----------\n     name\n-    sample_ids\n     info\n+    status\n+    efo\n+    shared_with\n+    pmids\n+    investigation\n+    sample_template\n+    raw_data\n+    preprocessed_data\n+    processed_data\n \n     Methods\n     -------\n-    add_samples(samples)\n-        Adds the samples listed in `samples` to the study\n+    add_pmid\n \n-    remove_samples(samples)\n-        Removes the samples listed in `samples` from the study\n+    Notes\n+    -----\n+    All setters raise QiitaDBStatusError if trying to change a public study.\n+    You should not be doing that.\n     \"\"\"\n     _table = \"study\"\n+    # The following columns are considered not part of the study info\n+    _non_info = {\"email\", \"study_id\", \"study_status_id\", \"study_title\"}\n+\n+    def _lock_public(self, conn_handler):\n+        \"\"\"Raises QiitaDBStatusError if study is public\"\"\"\n+        if self.check_status((\"public\", )):\n+            raise QiitaDBStatusError(\"Can't change status of public study!\")\n \n-    @staticmethod\n-    def create(owner):\n+    def _status_setter_checks(self, conn_handler):\n+        r\"\"\"Perform any extra checks that needed to be done before setting the\n+        object status on the database. Should be overwritten by the subclasses\n+        \"\"\"\n+        self._lock_public(conn_handler)\n+\n+    @classmethod\n+    def create(cls, owner, title, efo, info, investigation=None):\n         \"\"\"Creates a new study on the database\n \n         Parameters\n         ----------\n-        owner : str\n-            the user id of the study' owner\n+        owner : User object\n+            the study' owner\n+        title: str\n+            Title of the study\n+        efo: int or list\n+            Experimental Factor Ontology or -ies for the study\n+        info: dict\n+            the information attached to the study. All \"*_id\" keys must pass\n+            the objects associated with them.\n+        investigation: Investigation object\n+            if the study is part of an investigation, the id to associate with\n+\n+        Raises\n+        ------\n+        QiitaDBColumnError\n+            Non-db columns in info dictionary\n+            All required keys not passed\n+        IncompetentQiitaDeveloperError\n+            email, study_id, study_status_id, or study_title passed as a key\n+\n+        Notes\n+        -----\n+        All keys in info, except the efo, must be equal to columns in\n+        qiita.study table in the database.\n+        \"\"\"\n+        # make sure not passing non-info columns in the info dict\n+        if cls._non_info.intersection(info):\n+                raise QiitaDBColumnError(\"non info keys passed: %s\" %\n+                                         cls._non_info.intersection(info))\n+\n+        # add default values to info\n+        insertdict = deepcopy(info)\n+        if \"first_contact\" not in insertdict:\n+            insertdict['first_contact'] = date.today().strftime(\"%B %d, %Y\")\n+        insertdict['email'] = owner.id\n+        insertdict['study_title'] = title\n+        if \"reprocess\" not in insertdict:\n+            insertdict['reprocess'] = False\n+        # default to waiting_approval status\n+        insertdict['study_status_id'] = 1\n+\n+        conn_handler = SQLConnectionHandler()\n+        # make sure dictionary only has keys for available columns in db\n+        check_table_cols(conn_handler, insertdict, cls._table)\n+        # make sure reqired columns in dictionary\n+        check_required_columns(conn_handler, insertdict, cls._table)\n+\n+        # Insert study into database\n+        keys = insertdict.keys()\n+        sql = (\"INSERT INTO qiita.{0} ({1}) VALUES ({2}) RETURNING \"\n+               \"study_id\".format(cls._table, ','.join(keys),\n+                                 ','.join(['%s'] * len(insertdict))))\n+        # make sure data in same order as sql column names, and ids are used\n+        data = []\n+        for col in keys:\n+            if isinstance(insertdict[col], QiitaObject):\n+                data.append(insertdict[col].id)\n+            else:\n+                data.append(insertdict[col])\n+        study_id = conn_handler.execute_fetchone(sql, data)[0]\n+\n+        # insert efo information into database\n+        if isinstance(efo, int):\n+                efo = [efo]\n+        sql = (\"INSERT INTO qiita.{0}_experimental_factor (study_id, \"\n+               \"efo_id) VALUES (%s, %s)\".format(cls._table))\n+        conn_handler.executemany(sql, list(zip([study_id] * len(efo), efo)))\n+\n+        # add study to investigation if necessary\n+        if investigation:\n+            sql = (\"INSERT INTO qiita.investigation_study (investigation_id, \"\n+                   \"study_id) VALUES (%s, %s)\")\n+            conn_handler.execute(sql, (investigation.id, study_id))\n+\n+        return cls(study_id)\n+\n+# --- Attributes ---\n+    @property\n+    def title(self):\n+        \"\"\"Returns the title of the study\n+\n+        Returns\n+        -------\n+        str\n+            Title of study\n+        \"\"\"\n+        conn_handler = SQLConnectionHandler()\n+        sql = (\"SELECT study_title FROM qiita.{0} WHERE \"\n+               \"study_id = %s\".format(self._table))\n+        return conn_handler.execute_fetchone(sql, (self._id, ))[0]\n+\n+    @title.setter\n+    def title(self, title):\n+        \"\"\"Sets the title of the study\n+\n+        Parameters\n+        ----------\n+        title : str\n+            The new study title\n         \"\"\"\n-        raise QiitaDBNotImplementedError()\n+        conn_handler = SQLConnectionHandler()\n+        self._lock_public(conn_handler)\n+        sql = (\"UPDATE qiita.{0} SET study_title = %s WHERE \"\n+               \"study_id = %s\".format(self._table))\n+        return conn_handler.execute(sql, (title, self._id))\n \n-    @staticmethod\n-    def delete(id_):\n-        \"\"\"Deletes the study `id_` from the database\n+    @property\n+    def info(self):\n+        \"\"\"Dict with all information attached to the study\n+\n+        Returns\n+        -------\n+        dict\n+            info of study keyed to column names\n+        \"\"\"\n+        conn_handler = SQLConnectionHandler()\n+        sql = \"SELECT * FROM qiita.{0} WHERE study_id = %s\".format(self._table)\n+        info = dict(conn_handler.execute_fetchone(sql, (self._id, )))\n+        # remove non-info items from info\n+        for item in self._non_info:\n+            info.pop(item)\n+        return info\n+\n+    @info.setter\n+    def info(self, info):\n+        \"\"\"Updates the information attached to the study\n \n         Parameters\n         ----------\n-        id_ :\n-            The object identifier\n+        info : dict\n+            information to change/update for the study, keyed to column name\n+\n+        Raises\n+        ------\n+        IncompetentQiitaDeveloperError\n+            Empty dict passed\n+        QiitaDBColumnError\n+            Unknown column names passed\n         \"\"\"\n-        raise QiitaDBNotImplementedError()\n+        if not info:\n+            raise IncompetentQiitaDeveloperError(\"Need entries in info dict!\")\n+\n+        if self._non_info.intersection(info):\n+            raise QiitaDBColumnError(\"non info keys passed: %s\" %\n+                                     self._non_info.intersection(info))\n+\n+        conn_handler = SQLConnectionHandler()\n+        self._lock_public(conn_handler)\n+\n+        # make sure dictionary only has keys for available columns in db\n+        check_table_cols(conn_handler, info, self._table)\n+\n+        sql_vals = []\n+        data = []\n+        # items() used for py3 compatability","path":"qiita_db/study.py","position":337,"original_position":337,"commit_id":"18c2edf71c0a3152757f1deec8c632dc201e19e8","original_commit_id":"18c2edf71c0a3152757f1deec8c632dc201e19e8","user":{"login":"squirrelo","id":3079066,"avatar_url":"https://avatars.githubusercontent.com/u/3079066?","gravatar_id":"362a74e36cdec089dbb6c8e2d1f6e014","url":"https://api.github.com/users/squirrelo","html_url":"https://github.com/squirrelo","followers_url":"https://api.github.com/users/squirrelo/followers","following_url":"https://api.github.com/users/squirrelo/following{/other_user}","gists_url":"https://api.github.com/users/squirrelo/gists{/gist_id}","starred_url":"https://api.github.com/users/squirrelo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/squirrelo/subscriptions","organizations_url":"https://api.github.com/users/squirrelo/orgs","repos_url":"https://api.github.com/users/squirrelo/repos","events_url":"https://api.github.com/users/squirrelo/events{/privacy}","received_events_url":"https://api.github.com/users/squirrelo/received_events","type":"User","site_admin":false},"body":"That is awesome!","created_at":"2014-06-12T15:13:37Z","updated_at":"2014-06-12T15:13:37Z","html_url":"https://github.com/biocore/qiita/pull/70#discussion_r13706423","pull_request_url":"https://api.github.com/repos/biocore/qiita/pulls/70","_links":{"self":{"href":"https://api.github.com/repos/biocore/qiita/pulls/comments/13706423"},"html":{"href":"https://github.com/biocore/qiita/pull/70#discussion_r13706423"},"pull_request":{"href":"https://api.github.com/repos/biocore/qiita/pulls/70"}}},"pull_request":{"url":"https://api.github.com/repos/biocore/qiita/pulls/70","id":16628666,"html_url":"https://github.com/biocore/qiita/pull/70","diff_url":"https://github.com/biocore/qiita/pull/70.diff","patch_url":"https://github.com/biocore/qiita/pull/70.patch","issue_url":"https://api.github.com/repos/biocore/qiita/issues/70","number":70,"state":"open","title":"Study and StudyPerson object","user":{"login":"squirrelo","id":3079066,"avatar_url":"https://avatars.githubusercontent.com/u/3079066?","gravatar_id":"362a74e36cdec089dbb6c8e2d1f6e014","url":"https://api.github.com/users/squirrelo","html_url":"https://github.com/squirrelo","followers_url":"https://api.github.com/users/squirrelo/followers","following_url":"https://api.github.com/users/squirrelo/following{/other_user}","gists_url":"https://api.github.com/users/squirrelo/gists{/gist_id}","starred_url":"https://api.github.com/users/squirrelo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/squirrelo/subscriptions","organizations_url":"https://api.github.com/users/squirrelo/orgs","repos_url":"https://api.github.com/users/squirrelo/repos","events_url":"https://api.github.com/users/squirrelo/events{/privacy}","received_events_url":"https://api.github.com/users/squirrelo/received_events","type":"User","site_admin":false},"body":"Closes #41 #55\r\nTake two: Finally the big thing that all the tiny pull requests were for.\r\n\r\nThis is the study object itself, as well as the study person object that holds info on the people involved in a study. Please check this over and let me know if I missed any wanted functionality as well as the usual code stuff.\r\n\r\nAlso, the delete functionality is purposely not implemented currently. It will be hairy to do and not worth the time right now as the other objects need development an we aren't really deleting anything right now.","created_at":"2014-06-02T23:38:57Z","updated_at":"2014-06-12T15:13:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"52b1b182fef8a90e1c260425faa8c94eefaa7030","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/biocore/qiita/pulls/70/commits","review_comments_url":"https://api.github.com/repos/biocore/qiita/pulls/70/comments","review_comment_url":"https://api.github.com/repos/biocore/qiita/pulls/comments/{number}","comments_url":"https://api.github.com/repos/biocore/qiita/issues/70/comments","statuses_url":"https://api.github.com/repos/biocore/qiita/statuses/18c2edf71c0a3152757f1deec8c632dc201e19e8","head":{"label":"squirrelo:addstudy","ref":"addstudy","sha":"18c2edf71c0a3152757f1deec8c632dc201e19e8","user":{"login":"squirrelo","id":3079066,"avatar_url":"https://avatars.githubusercontent.com/u/3079066?","gravatar_id":"362a74e36cdec089dbb6c8e2d1f6e014","url":"https://api.github.com/users/squirrelo","html_url":"https://github.com/squirrelo","followers_url":"https://api.github.com/users/squirrelo/followers","following_url":"https://api.github.com/users/squirrelo/following{/other_user}","gists_url":"https://api.github.com/users/squirrelo/gists{/gist_id}","starred_url":"https://api.github.com/users/squirrelo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/squirrelo/subscriptions","organizations_url":"https://api.github.com/users/squirrelo/orgs","repos_url":"https://api.github.com/users/squirrelo/repos","events_url":"https://api.github.com/users/squirrelo/events{/privacy}","received_events_url":"https://api.github.com/users/squirrelo/received_events","type":"User","site_admin":false},"repo":{"id":16964694,"name":"qiita","full_name":"squirrelo/qiita","owner":{"login":"squirrelo","id":3079066,"avatar_url":"https://avatars.githubusercontent.com/u/3079066?","gravatar_id":"362a74e36cdec089dbb6c8e2d1f6e014","url":"https://api.github.com/users/squirrelo","html_url":"https://github.com/squirrelo","followers_url":"https://api.github.com/users/squirrelo/followers","following_url":"https://api.github.com/users/squirrelo/following{/other_user}","gists_url":"https://api.github.com/users/squirrelo/gists{/gist_id}","starred_url":"https://api.github.com/users/squirrelo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/squirrelo/subscriptions","organizations_url":"https://api.github.com/users/squirrelo/orgs","repos_url":"https://api.github.com/users/squirrelo/repos","events_url":"https://api.github.com/users/squirrelo/events{/privacy}","received_events_url":"https://api.github.com/users/squirrelo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/squirrelo/qiita","description":"Qiita - A QIIME databasing effort","fork":true,"url":"https://api.github.com/repos/squirrelo/qiita","forks_url":"https://api.github.com/repos/squirrelo/qiita/forks","keys_url":"https://api.github.com/repos/squirrelo/qiita/keys{/key_id}","collaborators_url":"https://api.github.com/repos/squirrelo/qiita/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/squirrelo/qiita/teams","hooks_url":"https://api.github.com/repos/squirrelo/qiita/hooks","issue_events_url":"https://api.github.com/repos/squirrelo/qiita/issues/events{/number}","events_url":"https://api.github.com/repos/squirrelo/qiita/events","assignees_url":"https://api.github.com/repos/squirrelo/qiita/assignees{/user}","branches_url":"https://api.github.com/repos/squirrelo/qiita/branches{/branch}","tags_url":"https://api.github.com/repos/squirrelo/qiita/tags","blobs_url":"https://api.github.com/repos/squirrelo/qiita/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/squirrelo/qiita/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/squirrelo/qiita/git/refs{/sha}","trees_url":"https://api.github.com/repos/squirrelo/qiita/git/trees{/sha}","statuses_url":"https://api.github.com/repos/squirrelo/qiita/statuses/{sha}","languages_url":"https://api.github.com/repos/squirrelo/qiita/languages","stargazers_url":"https://api.github.com/repos/squirrelo/qiita/stargazers","contributors_url":"https://api.github.com/repos/squirrelo/qiita/contributors","subscribers_url":"https://api.github.com/repos/squirrelo/qiita/subscribers","subscription_url":"https://api.github.com/repos/squirrelo/qiita/subscription","commits_url":"https://api.github.com/repos/squirrelo/qiita/commits{/sha}","git_commits_url":"https://api.github.com/repos/squirrelo/qiita/git/commits{/sha}","comments_url":"https://api.github.com/repos/squirrelo/qiita/comments{/number}","issue_comment_url":"https://api.github.com/repos/squirrelo/qiita/issues/comments/{number}","contents_url":"https://api.github.com/repos/squirrelo/qiita/contents/{+path}","compare_url":"https://api.github.com/repos/squirrelo/qiita/compare/{base}...{head}","merges_url":"https://api.github.com/repos/squirrelo/qiita/merges","archive_url":"https://api.github.com/repos/squirrelo/qiita/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/squirrelo/qiita/downloads","issues_url":"https://api.github.com/repos/squirrelo/qiita/issues{/number}","pulls_url":"https://api.github.com/repos/squirrelo/qiita/pulls{/number}","milestones_url":"https://api.github.com/repos/squirrelo/qiita/milestones{/number}","notifications_url":"https://api.github.com/repos/squirrelo/qiita/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/squirrelo/qiita/labels{/name}","releases_url":"https://api.github.com/repos/squirrelo/qiita/releases{/id}","created_at":"2014-02-18T21:40:27Z","updated_at":"2014-06-12T02:09:12Z","pushed_at":"2014-06-12T02:09:12Z","git_url":"git://github.com/squirrelo/qiita.git","ssh_url":"git@github.com:squirrelo/qiita.git","clone_url":"https://github.com/squirrelo/qiita.git","svn_url":"https://github.com/squirrelo/qiita","homepage":"","size":106768,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":false,"has_downloads":true,"has_wiki":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"biocore:master","ref":"master","sha":"3d16e6a997d7ead32f389a8728f610aef7b9394a","user":{"login":"biocore","id":6241857,"avatar_url":"https://avatars.githubusercontent.com/u/6241857?","gravatar_id":null,"url":"https://api.github.com/users/biocore","html_url":"https://github.com/biocore","followers_url":"https://api.github.com/users/biocore/followers","following_url":"https://api.github.com/users/biocore/following{/other_user}","gists_url":"https://api.github.com/users/biocore/gists{/gist_id}","starred_url":"https://api.github.com/users/biocore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/biocore/subscriptions","organizations_url":"https://api.github.com/users/biocore/orgs","repos_url":"https://api.github.com/users/biocore/repos","events_url":"https://api.github.com/users/biocore/events{/privacy}","received_events_url":"https://api.github.com/users/biocore/received_events","type":"Organization","site_admin":false},"repo":{"id":13131245,"name":"qiita","full_name":"biocore/qiita","owner":{"login":"biocore","id":6241857,"avatar_url":"https://avatars.githubusercontent.com/u/6241857?","gravatar_id":null,"url":"https://api.github.com/users/biocore","html_url":"https://github.com/biocore","followers_url":"https://api.github.com/users/biocore/followers","following_url":"https://api.github.com/users/biocore/following{/other_user}","gists_url":"https://api.github.com/users/biocore/gists{/gist_id}","starred_url":"https://api.github.com/users/biocore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/biocore/subscriptions","organizations_url":"https://api.github.com/users/biocore/orgs","repos_url":"https://api.github.com/users/biocore/repos","events_url":"https://api.github.com/users/biocore/events{/privacy}","received_events_url":"https://api.github.com/users/biocore/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/biocore/qiita","description":"Qiita - A QIIME databasing effort","fork":false,"url":"https://api.github.com/repos/biocore/qiita","forks_url":"https://api.github.com/repos/biocore/qiita/forks","keys_url":"https://api.github.com/repos/biocore/qiita/keys{/key_id}","collaborators_url":"https://api.github.com/repos/biocore/qiita/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/biocore/qiita/teams","hooks_url":"https://api.github.com/repos/biocore/qiita/hooks","issue_events_url":"https://api.github.com/repos/biocore/qiita/issues/events{/number}","events_url":"https://api.github.com/repos/biocore/qiita/events","assignees_url":"https://api.github.com/repos/biocore/qiita/assignees{/user}","branches_url":"https://api.github.com/repos/biocore/qiita/branches{/branch}","tags_url":"https://api.github.com/repos/biocore/qiita/tags","blobs_url":"https://api.github.com/repos/biocore/qiita/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/biocore/qiita/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/biocore/qiita/git/refs{/sha}","trees_url":"https://api.github.com/repos/biocore/qiita/git/trees{/sha}","statuses_url":"https://api.github.com/repos/biocore/qiita/statuses/{sha}","languages_url":"https://api.github.com/repos/biocore/qiita/languages","stargazers_url":"https://api.github.com/repos/biocore/qiita/stargazers","contributors_url":"https://api.github.com/repos/biocore/qiita/contributors","subscribers_url":"https://api.github.com/repos/biocore/qiita/subscribers","subscription_url":"https://api.github.com/repos/biocore/qiita/subscription","commits_url":"https://api.github.com/repos/biocore/qiita/commits{/sha}","git_commits_url":"https://api.github.com/repos/biocore/qiita/git/commits{/sha}","comments_url":"https://api.github.com/repos/biocore/qiita/comments{/number}","issue_comment_url":"https://api.github.com/repos/biocore/qiita/issues/comments/{number}","contents_url":"https://api.github.com/repos/biocore/qiita/contents/{+path}","compare_url":"https://api.github.com/repos/biocore/qiita/compare/{base}...{head}","merges_url":"https://api.github.com/repos/biocore/qiita/merges","archive_url":"https://api.github.com/repos/biocore/qiita/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/biocore/qiita/downloads","issues_url":"https://api.github.com/repos/biocore/qiita/issues{/number}","pulls_url":"https://api.github.com/repos/biocore/qiita/pulls{/number}","milestones_url":"https://api.github.com/repos/biocore/qiita/milestones{/number}","notifications_url":"https://api.github.com/repos/biocore/qiita/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/biocore/qiita/labels{/name}","releases_url":"https://api.github.com/repos/biocore/qiita/releases{/id}","created_at":"2013-09-26T18:50:43Z","updated_at":"2014-06-12T01:39:34Z","pushed_at":"2014-06-12T01:02:12Z","git_url":"git://github.com/biocore/qiita.git","ssh_url":"git@github.com:biocore/qiita.git","clone_url":"https://github.com/biocore/qiita.git","svn_url":"https://github.com/biocore/qiita","homepage":"","size":106994,"stargazers_count":4,"watchers_count":4,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":8,"mirror_url":null,"open_issues_count":26,"forks":8,"open_issues":26,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/biocore/qiita/pulls/70"},"html":{"href":"https://github.com/biocore/qiita/pull/70"},"issue":{"href":"https://api.github.com/repos/biocore/qiita/issues/70"},"comments":{"href":"https://api.github.com/repos/biocore/qiita/issues/70/comments"},"review_comments":{"href":"https://api.github.com/repos/biocore/qiita/pulls/70/comments"},"review_comment":{"href":"https://api.github.com/repos/biocore/qiita/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/biocore/qiita/pulls/70/commits"},"statuses":{"href":"https://api.github.com/repos/biocore/qiita/statuses/18c2edf71c0a3152757f1deec8c632dc201e19e8"}}}}