--- a
+++ b/qiita_pet/handlers/util.py
@@ -0,0 +1,137 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2014--, The Qiita Development Team.
+#
+# Distributed under the terms of the BSD 3-clause License.
+#
+# The full license is in the file LICENSE, distributed with this software.
+# -----------------------------------------------------------------------------
+from functools import partial
+from contextlib import contextmanager
+
+from tornado.web import HTTPError
+
+from qiita_pet.util import linkify
+from qiita_pet.exceptions import QiitaHTTPError
+from qiita_core.util import execute_as_transaction
+
+
+@contextmanager
+def safe_execution():
+    try:
+        yield
+    except HTTPError:
+        # The HTTPError is already handled nicely by tornado, just re-raise
+        raise
+    except Exception as e:
+        # Any other error we need to catch and re-raise as a QiitaHTTPError
+        # so we can make sure that tornado will handle it gracefully and send
+        # a useful error message to the user
+        raise QiitaHTTPError(500, str(e))
+
+
+@execute_as_transaction
+def check_access(user, study, no_public=False, raise_error=False):
+    """make sure user has access to the study requested"""
+    if not study.has_access(user, no_public):
+        if raise_error:
+            raise HTTPError(403, reason="User %s does not have access to "
+                            "study %d" % (user.id, study.id))
+        else:
+            return False
+    return True
+
+
+def download_link_or_path(is_local_request, filepath, fp_id, label):
+    """Generates a download link or shows the path based on is_local_request
+
+    Parameters
+    ----------
+    is_local_request : bool
+        Whether the request is local or not
+    filepath : str
+        The local filepath
+    fp_id : int
+        The filepath id
+    label : str
+        The label to show in the button
+
+    Returns
+    -------
+    str
+        If is a local request, a string with the filepath. Otherwise a string
+        with the html code to create a download link
+    """
+    if is_local_request:
+        resp = "<b>%s:</b> %s" % (label, filepath)
+    else:
+        resp = ('<a class="btn btn-default glyphicon glyphicon-download-alt" '
+                'href="/download/%s" style="word-spacing: -10px;"> %s</a>'
+                % (fp_id, label))
+    return resp
+
+
+study_person_linkifier = partial(
+    linkify, "<a target=\"_blank\" href=\"mailto:{0}\">{1}</a>")
+
+pubmed_linkifier = partial(
+    linkify, "<a target=\"_blank\" href=\"http://www.ncbi.nlm.nih.gov/"
+    "pubmed/{0}\">{0}</a>")
+
+doi_linkifier = partial(
+    linkify, "<a target=\"_blank\" href=\"http://dx.doi.org/{0}\">{0}</a>")
+
+
+def to_int(value, reason=None):
+    """Transforms `value` to an integer
+
+    Parameters
+    ----------
+    value : str or int
+        The value to transform
+
+    Returns
+    -------
+    int
+        `value` as an integer
+
+    Raises
+    ------
+    HTTPError
+        If `value` cannot be transformed to an integer
+    """
+    try:
+        res = int(value)
+    except ValueError:
+        msg = f"{value} cannot be converted to an integer" if reason is None \
+              else reason
+        raise HTTPError(400, reason=msg)
+    return res
+
+
+@execute_as_transaction
+def get_shared_links(obj):
+    """Creates email links for the users obj is shared with
+
+    Parameters
+    ----------
+    obj : QiitaObject
+        A qiita object with a 'shared_with' property that returns a list of
+        User objects
+
+    Returns
+    -------
+    str
+        Email links for each person obj is shared with
+    """
+    shared = []
+    for person in obj.shared_with:
+        name = person.info['name']
+        email = person.email
+        # Name is optional, so default to email if non existant
+        if name:
+            shared.append(study_person_linkifier(
+                (email, name)))
+        else:
+            shared.append(study_person_linkifier(
+                (email, email)))
+    return ", ".join(shared)