From cc5441eb267280ccb79586db030255e76190c9b1 Mon Sep 17 00:00:00 2001
From: Kazuhiko SHIOZAKI <kazuhiko@nexedi.com>
Date: Thu, 13 Oct 2022 10:38:05 +0200
Subject: [PATCH] py2/py3: str.decode('base64') and bytes.encode('base64')
 don't exist in Python 3.

---
 .../portal_components/module.erp5.ImageUtil.py               | 4 +++-
 .../RequirementDocument_viewDetailedReportAsOdt.oot          | 2 +-
 .../portal_components/test.erp5.testRunMyDoc.py              | 3 ++-
 .../portal_skins/erp5_hr_record/ERP5Site_migrateData.py      | 3 ++-
 .../erp5_hr_record/ExpenseRecord_updateRelatedTicket.py      | 3 ++-
 .../portal_skins/erp5_ui_test_core/Zuite_uploadScreenshot.py | 3 ++-
 product/ERP5/tests/testBusinessTemplateTwoFileExport.py      | 5 +++--
 product/ERP5Form/GadgetField.py                              | 3 ++-
 8 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/bt5/erp5_base/ModuleComponentTemplateItem/portal_components/module.erp5.ImageUtil.py b/bt5/erp5_base/ModuleComponentTemplateItem/portal_components/module.erp5.ImageUtil.py
index 59a2916c25..4959af846e 100644
--- a/bt5/erp5_base/ModuleComponentTemplateItem/portal_components/module.erp5.ImageUtil.py
+++ b/bt5/erp5_base/ModuleComponentTemplateItem/portal_components/module.erp5.ImageUtil.py
@@ -29,6 +29,8 @@
 import urllib2
 from lxml import etree
 from erp5.component.document.Document import ConversionError
+import base64
+from Products.ERP5Type.Utils import bytes2str
 
 SVG_DEFAULT_NAMESPACE = "http://www.w3.org/2000/svg"
 
@@ -38,7 +40,7 @@ def getDataURI(url):
   except Exception as e:
     raise ConversionError("Error to transform url (%s) into data uri. ERROR = %s" % (url, Exception(e)))
   return 'data:%s;base64,%s' % (data.info()["content-type"],
-                                data.read().encode("base64").replace('\n', ""))
+                                bytes2str(base64.b64encode(data.read())).replace('\n', ""))
 
 def transformUrlToDataURI(content):
   if content is None or len(content) == 0:
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/RequirementDocument_viewDetailedReportAsOdt.oot b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/RequirementDocument_viewDetailedReportAsOdt.oot
index b0364182ee..8b0998488d 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/RequirementDocument_viewDetailedReportAsOdt.oot
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/RequirementDocument_viewDetailedReportAsOdt.oot
@@ -104,7 +104,7 @@
                   <draw:frame draw:style-name="fr1" draw:name="Image1" text:anchor-type="as-char" svg:width="3in" draw:z-index="0"
                               tal:attributes="draw:name python:'embedded_erp5_image_%s' % image.getId();
                                               svg:height python: '%1.1fin' % (3.0 * image.getHeight() / (image.getWidth() or 1.0))">
-                    <draw:image><office:binary-data tal:content="python:str(image.convert(format='png')[1]).encode('base64')" /></draw:image>
+                    <draw:image><office:binary-data tal:content="python:modules['base64'].b64encode(image.convert(format='png')[1])" /></draw:image>
                   </draw:frame>
                 </text:p>
               </tal:block>
diff --git a/bt5/erp5_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDoc.py b/bt5/erp5_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDoc.py
index 3a5bb3cc57..bafda3c200 100644
--- a/bt5/erp5_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDoc.py
+++ b/bt5/erp5_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDoc.py
@@ -29,6 +29,7 @@
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
 from erp5.component.test.testDms import makeFileUpload
 from time import time
+import base64
 
 class TestRunMyDoc(ERP5TypeTestCase):
   """
@@ -132,7 +133,7 @@ class TestRunMyDoc(ERP5TypeTestCase):
     self.tic()
     # The right image were updated.
     image_upload.seek(0)
-    self.assertEqual(image_page_2.getData(), image_upload.read().decode("base64"))
+    self.assertEqual(image_page_2.getData(), base64.b64decode(image_upload.read()))
     self.assertEqual(image_page_2.getFilename(), image_reference + '.png')
     self.assertEqual(image_page.getData(), '')
 
diff --git a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ERP5Site_migrateData.py b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ERP5Site_migrateData.py
index ab067168a4..22773ccda2 100644
--- a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ERP5Site_migrateData.py
+++ b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ERP5Site_migrateData.py
@@ -1,3 +1,4 @@
+import base64
 portal = context.getPortalObject()
 
 # Update Photos
@@ -9,7 +10,7 @@ for record in portal.expense_record_module.objectValues(portal_type="Expense Rec
       if ticket.getReference():
         photo_data = photo_data.split(",")[1]
         image = portal.portal_contributions.newContent(
-          data = photo_data.decode('base64'),
+          data = base64.b64decode(photo_data),
           reference=ticket.getReference()+ "-justificatif",
           title = ticket.getReference() + " Justificatif",
           description = ticket.getDescription(),
diff --git a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_updateRelatedTicket.py b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_updateRelatedTicket.py
index c915034b0f..3b07ab5f6d 100644
--- a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_updateRelatedTicket.py
+++ b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_updateRelatedTicket.py
@@ -1,3 +1,4 @@
+import base64
 import json
 portal = context.getPortalObject()
 record = context
@@ -80,7 +81,7 @@ if photo_data:
     if "application/pdf" in photo_type:
       filename="tmp.pdf"
     image = portal.portal_contributions.newContent(
-      data = photo_data.decode('base64'),
+      data = base64.b64decode(photo_data),
       reference=ticket.getReference()+ "-justificatif",
       title = ticket.getReference() + " Justificatif",
       description = ticket.getDescription(),
diff --git a/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_uploadScreenshot.py b/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_uploadScreenshot.py
index 63a0d64ab3..9e5146c40f 100644
--- a/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_uploadScreenshot.py
+++ b/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_uploadScreenshot.py
@@ -1,6 +1,7 @@
 """
   Upload a screenshot taken by the test to ERP5
 """
+import base64
 data_uri = context.REQUEST.form.get('data_uri', 'default')
 
 image_module = getattr(context, "image_module", None)
@@ -16,7 +17,7 @@ if image is None or image.getPortalType() != "Image":
 
 image.setContentType('image/png')
 data_text = data_uri.read()
-data = data_text.decode('base64')
+data = base64.b64decode(data_text)
 
 image.edit(data=data,
            filename=str(image_reference) + '.png',
diff --git a/product/ERP5/tests/testBusinessTemplateTwoFileExport.py b/product/ERP5/tests/testBusinessTemplateTwoFileExport.py
index c82d02068c..063a4fc5bb 100644
--- a/product/ERP5/tests/testBusinessTemplateTwoFileExport.py
+++ b/product/ERP5/tests/testBusinessTemplateTwoFileExport.py
@@ -30,6 +30,7 @@ from Products.ERP5Type.tests.ERP5TypeTestCase import \
   ERP5TypeTestCase, immediateCompilation
 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
 from runUnitTest import tests_home
+import base64
 import glob
 import shutil
 import os
@@ -280,9 +281,9 @@ class TestBusinessTemplateTwoFileExport(ERP5TypeTestCase):
       self.assertEqual(image_page.getProperty(property_id), property_value)
 
 
-  png_data = """iVBORw0KGgoAAAANSUhEUgAAAAUA
+  png_data = base64.b64decode(b"""iVBORw0KGgoAAAANSUhEUgAAAAUA
 AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
-9TXL0Y4OHwAAAABJRU5ErkJggg==""".decode("base64")
+9TXL0Y4OHwAAAABJRU5ErkJggg==""")
 
   def test_twoFileImportExportForImageIdentifyingTypeByContent(self):
     """
diff --git a/product/ERP5Form/GadgetField.py b/product/ERP5Form/GadgetField.py
index 1ea9856872..f2d5285a4f 100644
--- a/product/ERP5Form/GadgetField.py
+++ b/product/ERP5Form/GadgetField.py
@@ -7,6 +7,7 @@ from six.moves import cStringIO as StringIO
 from json import dumps
 from Acquisition import aq_base
 from six.moves.urllib.parse import urljoin
+import base64
 
 class GadgetWidget(Widget.Widget):
   """
@@ -150,7 +151,7 @@ class GadgetFieldValidator(Validator.Validator):
         if value is not None:
           if field.get_value('data_url'):
             value=value.split(",")[1]
-            return StringIO(value.decode('base64'))
+            return StringIO(base64.b64decode(value))
           return value
 
 
-- 
2.30.9