Add data_product_uri parameter option to user_storage functions
diff --git a/airavata_django_portal_sdk/user_storage.py b/airavata_django_portal_sdk/user_storage.py
index de94264..27ddc8c 100644
--- a/airavata_django_portal_sdk/user_storage.py
+++ b/airavata_django_portal_sdk/user_storage.py
@@ -98,7 +98,9 @@
         return data_product
 
 
-def copy_input_file(request, data_product):
+def copy_input_file(request, data_product=None, data_product_uri=None):
+    if data_product is None:
+        data_product = _get_data_product(request, data_product_uri)
     path = _get_replica_filepath(data_product)
     name = data_product.productName
     full_path = _Datastore().copy(
@@ -111,7 +113,9 @@
     return _save_copy_of_data_product(request, full_path, data_product)
 
 
-def is_input_file(request, data_product):
+def is_input_file(request, data_product=None, data_product_uri=None):
+    if data_product is None:
+        data_product = _get_data_product(request, data_product_uri)
     if _is_remote_api():
         resp = _call_remote_api(
             request,
@@ -128,7 +132,9 @@
         return False
 
 
-def move_input_file(request, data_product, path):
+def move_input_file(request, data_product=None, path=None, data_product_uri=None):
+    if data_product is None:
+        data_product = _get_data_product(request, data_product_uri)
     source_path = _get_replica_filepath(data_product)
     file_name = data_product.productName
     full_path = _Datastore().move(
@@ -157,8 +163,13 @@
     return data_product
 
 
-def open_file(request, data_product):
-    "Return file object for replica if it exists in user storage."
+def open_file(request, data_product=None, data_product_uri=None):
+    """
+    Return file object for replica if it exists in user storage. One of
+    `data_product` or `data_product_uri` is required.
+    """
+    if data_product is None:
+        data_product = _get_data_product(request, data_product_uri)
     if _is_remote_api():
         resp = _call_remote_api(
             request,
@@ -175,8 +186,13 @@
         return _Datastore().open(data_product.ownerName, path)
 
 
-def exists(request, data_product):
-    "Return True if replica for data_product exists in user storage."
+def exists(request, data_product=None, data_product_uri=None):
+    """
+    Return True if replica for data_product exists in user storage. One of
+    `data_product` or `data_product_uri` is required.
+    """
+    if data_product is None:
+        data_product = _get_data_product(request, data_product_uri)
     if _is_remote_api():
         resp = _call_remote_api(
             request,
@@ -267,7 +283,9 @@
             myfile.write(fileContentText)
 
 
-def update_data_product_content(request, data_product, fileContentText):
+def update_data_product_content(request, data_product=None, fileContentText="", data_product_uri=None):
+    if data_product is None:
+        data_product = _get_data_product(request, data_product_uri)
     # TODO: implement remote api support (DataProductView.put())
     path = _get_replica_filepath(data_product)
     full_path = _Datastore().path(request.user.username, path)
@@ -320,8 +338,13 @@
         raise ObjectDoesNotExist("User storage file path does not exist")
 
 
-def delete(request, data_product):
-    "Delete replica for data product in this data store."
+def delete(request, data_product=None, data_product_uri=None):
+    """
+    Delete replica for data product in this data store. One of `data_product`
+    or `data_product_uri` is required.
+    """
+    if data_product is None:
+        data_product = _get_data_product(request, data_product_uri)
     if _is_remote_api():
         _call_remote_api(
             request,
@@ -562,6 +585,11 @@
     return product_uri
 
 
+def _get_data_product(request, data_product_uri):
+    return request.airavata_client.getDataProduct(
+        request.authz_token, data_product_uri)
+
+
 def _save_data_product(request, full_path, name=None, content_type=None, owner=None):
     "Create, register and record in DB a data product for full_path."
     if owner is None: