From 44185f23886932fc5d95e5a5b50b4e40635949e7 Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Wed, 17 Jul 2019 14:31:02 -0500
Subject: [PATCH] core: rework VersionedFile

Previously, core.vfile.VersionedFile inherited from file,
which is problematic for several reasons, but primarily because
file doesn't exist in Python 3. So we rework it to just be a
normal class with a file attribute, and add/change certain
methods accordingly.
---
 gracedb/api/v1/events/views.py      |  2 +-
 gracedb/api/v1/superevents/views.py |  2 +-
 gracedb/core/vfile.py               | 21 ++++++++++++++-------
 gracedb/events/serialize.py         |  2 +-
 4 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/gracedb/api/v1/events/views.py b/gracedb/api/v1/events/views.py
index b6c6b8a39..f2fab2b52 100644
--- a/gracedb/api/v1/events/views.py
+++ b/gracedb/api/v1/events/views.py
@@ -617,7 +617,7 @@ class EventDetail(InheritPermissionsAPIView):
         #for chunk in f.chunks():
         #    fdest.write(chunk)
         #fdest.close()
-        shutil.copyfileobj(f, fdest)
+        shutil.copyfileobj(f, fdest.file)
         fdest.close()
 
         # Extract Info from uploaded data
diff --git a/gracedb/api/v1/superevents/views.py b/gracedb/api/v1/superevents/views.py
index 2575d53af..be85aa3ad 100644
--- a/gracedb/api/v1/superevents/views.py
+++ b/gracedb/api/v1/superevents/views.py
@@ -15,7 +15,7 @@ from rest_framework.views import APIView
 
 from core.file_utils import get_file_list
 from core.http import check_and_serve_file
-from core.vfile import VersionedFile, FileVersionError, FileVersionNameError
+from core.vfile import FileVersionError, FileVersionNameError
 from events.models import Event, Label
 from events.view_utils import reverse as gracedb_reverse
 from ligoauth.utils import is_internal
diff --git a/gracedb/core/vfile.py b/gracedb/core/vfile.py
index c451e6b7f..5a8786722 100644
--- a/gracedb/core/vfile.py
+++ b/gracedb/core/vfile.py
@@ -24,7 +24,7 @@ class FileVersionNameError(Exception):
     pass
 
 
-class VersionedFile(file):
+class VersionedFile(object):
     """
     Open a versioned file.
 
@@ -74,7 +74,7 @@ class VersionedFile(file):
             # one scoped inside of this __init__). But I'm reluctant to mess with
             # Brian's code too much.
             self.version = version
-            file.__init__(self, actual_name, *args, **kwargs)
+            self.file = open(actual_name, *args, **kwargs)
 
         # Otherwise...
 
@@ -124,7 +124,7 @@ class VersionedFile(file):
                         os.O_WRONLY | os.O_CREAT | os.O_EXCL,
                         0o644)
                 # re-open
-                file.__init__(self, actual_name, *args, **kwargs)
+                self.file = open(actual_name, *args, **kwargs)
                 # lose fd we used to ensure file creation.
                 os.close(fd)
                 break
@@ -208,6 +208,13 @@ class VersionedFile(file):
         return [int(f.split(',')[1])
                 for f in os.listdir(d) if f.startswith(name + ',')]
 
+    def write(self, s):
+        self.file.write(s)
+
+    @property
+    def closed(self):
+        return self.file.closed
+
     def close(self):
         if self.writing:
             # no need to update symlink if we were only reading.
@@ -215,13 +222,13 @@ class VersionedFile(file):
             # file -- trying to discover the lastest version fails
             # painfully. (max(known_versions()) => max([]))
             self._repoint_symlink()
-        if not self.closed:
-            file.close(self)
+        if not self.file.closed:
+            self.file.close()
 
     def __del__(self):
         # XXX file does not have a __del__ method.  Should we?
-        if not self.closed:
-            self.close()
+        if not self.file.closed:
+            self.file.close()
 
     @staticmethod
     def guess_mimetype(filename):
diff --git a/gracedb/events/serialize.py b/gracedb/events/serialize.py
index 56831a079..9551517ce 100644
--- a/gracedb/events/serialize.py
+++ b/gracedb/events/serialize.py
@@ -89,7 +89,7 @@ def write_output_files(root_dir, xmldoc, log_content, \
   """
 
   f = VersionedFile(root_dir+'/'+xml_fname,'w')
-  xmldoc.write(f)
+  xmldoc.write(f.file)
   f.close()
 
   f = VersionedFile(root_dir+'/'+log_fname,'w')
-- 
GitLab