From 881cc3469c3f9017edcf7041361aad2ab4c4992e Mon Sep 17 00:00:00 2001 From: hugues de keyzer Date: Thu, 6 Jul 2023 23:12:52 +0200 Subject: [PATCH] [MIG] base_dav: migration to 12.0 --- base_dav/__manifest__.py | 2 +- base_dav/demo/dav_collection.xml | 10 ++++---- base_dav/models/dav_collection.py | 9 ++----- .../models/dav_collection_field_mapping.py | 24 +++++++++--------- base_dav/radicale/collection.py | 6 +---- base_dav/security/ir.model.access.csv | 2 ++ base_dav/tests/test_collection.py | 25 +++++++++++-------- 7 files changed, 38 insertions(+), 40 deletions(-) diff --git a/base_dav/__manifest__.py b/base_dav/__manifest__.py index 3307c764f..69dfc626f 100644 --- a/base_dav/__manifest__.py +++ b/base_dav/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { "name": "Caldav and Carddav support", - "version": "11.0.1.0.0", + "version": "12.0.1.0.0", "author": "initOS GmbH, Therp BV, Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Extra Tools", diff --git a/base_dav/demo/dav_collection.xml b/base_dav/demo/dav_collection.xml index 3eb7e8adb..0ddf25be9 100644 --- a/base_dav/demo/dav_collection.xml +++ b/base_dav/demo/dav_collection.xml @@ -8,27 +8,27 @@ N - + FN - + photo - + email - + tel - + diff --git a/base_dav/models/dav_collection.py b/base_dav/models/dav_collection.py index d58e22f55..d8daa26eb 100644 --- a/base_dav/models/dav_collection.py +++ b/base_dav/models/dav_collection.py @@ -3,7 +3,6 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import os -import time from operator import itemgetter from urllib.parse import quote_plus @@ -156,17 +155,13 @@ def to_vobject(self, record): vobj.add("uid").value = "%s,%s" % (record._name, record.id) if "rev" not in vobj.contents and "write_date" in record._fields: vobj.add("rev").value = ( - record.write_date.replace(":", "").replace(" ", "T").replace(".", "") - + "Z" + record.write_date.isoformat().replace(":", "").replace(".", "") + "Z" ) return result @api.model def _odoo_to_http_datetime(self, value): - return time.strftime( - "%a, %d %b %Y %H:%M:%S GMT", - time.strptime(value, "%Y-%m-%d %H:%M:%S"), - ) + return value.strftime("%a, %d %b %Y %H:%M:%S GMT") @api.model def _split_path(self, path): diff --git a/base_dav/models/dav_collection_field_mapping.py b/base_dav/models/dav_collection_field_mapping.py index c373d5862..f28055171 100644 --- a/base_dav/models/dav_collection_field_mapping.py +++ b/base_dav/models/dav_collection_field_mapping.py @@ -9,6 +9,7 @@ from dateutil import tz from odoo import api, fields, models, tools +from odoo.tools.safe_eval import safe_eval class DavCollectionFieldMapping(models.Model): @@ -69,7 +70,7 @@ def _from_vobject_code(self, child): "tz": tz, "vobject": vobject, } - tools.safe_eval(self.import_code, context, mode="exec", nocopy=True) + safe_eval(self.import_code, context, mode="exec", nocopy=True) return context.get("result", {}) @api.multi @@ -92,19 +93,18 @@ def _from_vobject_simple(self, child): @api.model def _from_vobject_datetime(self, item): if isinstance(item.value, datetime.datetime): - value = item.value.astimezone(dateutil.tz.UTC) - return value.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT) - elif isinstance(item.value, datetime.date): - return item.value.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT) + return item.value.astimezone(tz.UTC) + if isinstance(item.value, datetime.date): + return datetime.datetime.combine(item.value, datetime.time()) return None @api.model def _from_vobject_date(self, item): if isinstance(item.value, datetime.datetime): - value = item.value.astimezone(dateutil.tz.UTC) - return value.strftime(tools.DEFAULT_SERVER_DATE_FORMAT) - elif isinstance(item.value, datetime.date): - return item.value.strftime(tools.DEFAULT_SERVER_DATE_FORMAT) + value = item.value.astimezone(tz.UTC) + return value.date() + if isinstance(item.value, datetime.date): + return item.value return None @api.model @@ -139,7 +139,7 @@ def _to_vobject_code(self, record): "tz": tz, "vobject": vobject, } - tools.safe_eval(self.export_code, context, mode="exec", nocopy=True) + safe_eval(self.export_code, context, mode="exec", nocopy=True) return context.get("result", None) @api.multi @@ -157,7 +157,7 @@ def _to_vobject_simple(self, record): @api.model def _to_vobject_datetime(self, value): - result = fields.Datetime.from_string(value) + result = fields.Datetime.to_datetime(value) return result.replace(tzinfo=tz.UTC) @api.model @@ -166,7 +166,7 @@ def _to_vobject_datetime_rev(self, value): @api.model def _to_vobject_date(self, value): - return fields.Date.from_string(value) + return fields.Date.to_date(value) @api.model def _to_vobject_binary(self, value): diff --git a/base_dav/radicale/collection.py b/base_dav/radicale/collection.py index e7b37385f..4bdcda01d 100644 --- a/base_dav/radicale/collection.py +++ b/base_dav/radicale/collection.py @@ -3,7 +3,6 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import base64 import os -import time from contextlib import contextmanager from odoo.http import request @@ -93,10 +92,7 @@ def __init__(self, path): ) def _odoo_to_http_datetime(self, value): - return time.strftime( - "%a, %d %b %Y %H:%M:%S GMT", - time.strptime(value, "%Y-%m-%d %H:%M:%S"), - ) + return value.strftime("%a, %d %b %Y %H:%M:%S GMT") def get_meta(self, key=None): if key is None: diff --git a/base_dav/security/ir.model.access.csv b/base_dav/security/ir.model.access.csv index 3d2d4d57b..8bdaf40c5 100644 --- a/base_dav/security/ir.model.access.csv +++ b/base_dav/security/ir.model.access.csv @@ -1,3 +1,5 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" access_dav_collection,access_dav_collection,model_dav_collection,base.group_user,1,0,0,0 +write_dav_collection,write_dav_collection,model_dav_collection,base.group_system,1,1,1,1 access_dav_collection_field_mapping,access_dav_collection_field_mapping,model_dav_collection_field_mapping,base.group_user,1,0,0,0 +write_dav_collection_field_mapping,write_dav_collection_field_mapping,model_dav_collection_field_mapping,base.group_system,1,1,1,1 diff --git a/base_dav/tests/test_collection.py b/base_dav/tests/test_collection.py index 1ce406984..bc4bd9277 100644 --- a/base_dav/tests/test_collection.py +++ b/base_dav/tests/test_collection.py @@ -3,8 +3,9 @@ from datetime import datetime, timedelta from unittest import mock +from dateutil import tz + from odoo.tests.common import TransactionCase -from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT from ..radicale.collection import Collection @@ -24,21 +25,21 @@ def setUp(self): self.create_field_mapping( "login", - "base.field_res_users_login", + "base.field_res_users__login", excode="result = record.login", imcode="result = item.value", ) self.create_field_mapping( "name", - "base.field_res_users_name", + "base.field_res_users__name", ) self.create_field_mapping( "dtstart", - "base.field_res_users_create_date", + "base.field_res_users__create_date", ) self.create_field_mapping( "dtend", - "base.field_res_users_write_date", + "base.field_res_users__write_date", ) start = datetime.now() @@ -47,8 +48,8 @@ def setUp(self): { "login": "tester", "name": "Test User", - "create_date": start.strftime(DEFAULT_SERVER_DATETIME_FORMAT), - "write_date": stop.strftime(DEFAULT_SERVER_DATETIME_FORMAT), + "create_date": start, + "write_date": stop, } ) @@ -69,8 +70,12 @@ def compare_record(self, vobj, rec=None): self.assertEqual((rec or self.record).login, tmp["login"]) self.assertEqual((rec or self.record).name, tmp["name"]) - self.assertEqual((rec or self.record).create_date, tmp["create_date"]) - self.assertEqual((rec or self.record).write_date, tmp["write_date"]) + self.assertEqual( + (rec or self.record).create_date.astimezone(tz.UTC), tmp["create_date"] + ) + self.assertEqual( + (rec or self.record).write_date.astimezone(tz.UTC), tmp["write_date"] + ) def test_import_export(self): # Exporting and importing should result in the same record @@ -82,7 +87,7 @@ def test_get_record(self): self.assertEqual(rec, self.record) self.collection.field_uuid = self.env.ref( - "base.field_res_users_login", + "base.field_res_users__login", ).id rec = self.collection.get_record([self.record.login]) self.assertEqual(rec, self.record)