1. 29 Oct, 2024 9 commits
    • Jérome Perrin's avatar
    • Jérome Perrin's avatar
      ERP5: workaround Domain.getPrice that cannot lookup price · 5bc23696
      Jérome Perrin authored
      because Domain.getRelativeUrl (and Category.getRelativeUrl) cannot be
      restrictedTraverse'd
      5bc23696
    • Jérome Perrin's avatar
      core,monaco_editor: python language support 🚧 · 8cab6649
      Jérome Perrin authored
      some work in progress changes to improve developer experience
      
      monaco_editor: increase debounce timeout for pylint checks XXX
      
      on very large python files (>1000 lines) sometimes they queue up and we
      have to wait for all requests that were queued by zope.
      
      XXX maybe this does not happen when accessing through haproxy/apache, I
      am observing this when hitting zope directly
      
      jedi: generate stubs WIP
      
      ERP5: "quick and dirty" type annotations XXX
      
      IIRC the only thing needed is that ERP5TypeTestCase.getPortal is an
      ERP5Site
      
      monaco_editor: also enable jedi for codelens ( WIP: ZMI only )
      
      core: pass "language support url" to text editors XXX
      
      For now this is just the portal_url, but I'm thinking it could be a
      proper tool.
      
      monaco_editor: enable pylint in gadget version
      
      because pylint is a bit slow on large components, debounce every 2
      seconds. TODO: this is too slow.
      
      monaco_editor: enable formatting provider for python
      
      This makes "Format Document" / "Format Selection" work.
      
      monaco_editor: enable completion provider for python
      
      this makes completions works when using Ctrl+space
      
      monaco_editor: pass portal_type to checkPythonSourceCode
      
      python_support: new business template to act as a language server for python
      
      checkPythonSourceCode: add a cache
      
      When using checkPythonSourceCode integrated in the source code editor,
      for a scenario where developer edit a component and save we can benefit
      from caching the check message for the source code content, because the
      same check that the one happening in the editor will happen when the
      component is saved.
      
      This cache varies on:
       - "component_packages" cache cookie which is reset every time some
      component code is edited.
       - zope startup time to take into account editions of file system code.
      This assumes that after reseting file system code zope will be
      restarted.
       - portal_type, because the checks performed by this function also
      depend on portal type.
      
      jedi wip
      
      administration: keep using pylint only for now
      
      monaco_editor: jedi WIP
      
      core: use mypy to check python code ( WIP experiment )
      
      Revert "core: use mypy to check python code ( WIP experiment )"
      
      This reverts commit cfa27232.
      
      ERP5TypeTestCase: jedi workarounds
      
      monaco_editor: WIP reference provider for python
      
      monaco_editor: jedi wip (no longer use /tmp/)
      
      yapf: adjust config following up Gabriel feedback
      8cab6649
    • Jérome Perrin's avatar
    • Jérome Perrin's avatar
      ERP5 Page Template 🚧 · a0a45c97
      Jérome Perrin authored
      a0a45c97
    • Jérome Perrin's avatar
      persistent_migration: convert object states with zodbupdate when loading · a7e846c7
      Jérome Perrin authored
      See https://zope.readthedocs.io/en/latest/migrations/zope4/zodb.html
      
      The approach here is to have a ZODB patch to apply zodbupdate on object
      load, decoding with UTF-8 encoding because it will be correct most of
      the time with ERP5
      a7e846c7
    • Arnaud Fontaine's avatar
      WIP: Why? · b4f59359
      Arnaud Fontaine authored
      b4f59359
    • Arnaud Fontaine's avatar
      WIP: py3: ZServer removed. · 8336cc85
      Arnaud Fontaine authored
      8336cc85
    • Jérome Perrin's avatar
      WIP: patches/python: override py3 builtin round to keep py2 behavior. · 4b0d5c13
      Jérome Perrin authored
      And workaround safeimage impacted by this round2 patch.
      4b0d5c13
  2. 28 Oct, 2024 1 commit
    • Jérome Perrin's avatar
      Revert "simulation: introduce Rule.getSimulationMovementSimulationState" · ccadeaa4
      Jérome Perrin authored
      This reverts commit 5e21f77f.
      
      This was done too quickly based on a wrong assumption that simulation
      movements to build would always be in planned state and that we could
      have an efficient way of selecting them by catalog with index on
      portal_type and simulation state, but it does not work this way.
      
      Maybe the change is useful for something else, but since we don't have
      any use case for now, let's just revert.
      ccadeaa4
  3. 25 Oct, 2024 1 commit
  4. 24 Oct, 2024 7 commits
  5. 23 Oct, 2024 4 commits
  6. 16 Oct, 2024 5 commits
    • Jérome Perrin's avatar
      testCRM: use valid email address in the test · 007de00c
      Jérome Perrin authored
      `sender@customer.com <sender@customer.com>` used in the test is not a
      valid email address. We have updated to python3.9.20 which comes with a
      fix for CVE-2023-27043 and no longer allow this kind of broken addresses.
      
      Replace the address with a similar valid address,
      `"sender@customer.com" <sender@customer.com>`, that was probably the
      original intention of this test.
      007de00c
    • Jérome Perrin's avatar
      dms: explicitly cast `path` selected columns to char · ee19f449
      Jérome Perrin authored
      On python3, the type of selected columns depend on the data type from
      mariadb side, VARCHAR will be str, BINARY/BLOB will be bytes, etc
      
      These SQL method select path that is first evaluated from a variable
      that is NULL and in that case, mariadb seems to select LONGBLOB as data
      type:
      
          MariaDB [test]> set @defined_as_null=null; drop table if exists tmp; create table tmp as (select @defined_as_null); show create table tmp;
          +-------+------------------------------------------------------------------------------------------------------------------------------------+
          | Table | Create Table                                                                                                                       |
          +-------+------------------------------------------------------------------------------------------------------------------------------------+
          | tmp   | CREATE TABLE `tmp` (
            `@defined_as_null` longblob DEFAULT NULL
          ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
          +-------+------------------------------------------------------------------------------------------------------------------------------------+
      
      By casting to CHAR in SQL, on the python side we always have the str
      that we expect here, because this is used as path attribute of a SQL
      brain.
      ee19f449
    • Jérome Perrin's avatar
      custom_zodb: fix a ResourceWarning · 5349d8c4
      Jérome Perrin authored
      5349d8c4
    • Jérome Perrin's avatar
      ProcessingNodeTestCase: also setRequest in timerserver loop · 6102ed47
      Jérome Perrin authored
      This is similar to 18deb716 (ProcessingNodeTestCase: also setRequest
      in processing_node, 2023-05-02), as said in that commit message,
      timerserver loop calls setRequest, but before entering the loop, we
      wait for the portal to be created with:
      
       447   │           try:
       448   │             self.portal = self.app[self.app.test_portal_name]
       449   │           except (AttributeError, KeyError):
       450   │             continue
      
      While accessing like this, this will load classes and initialize dynamic
      modules, on python2 this was OK, but on python3 this was raising an
      error because `getRequest` returned None:
      
        File "./parts/erp5/product/ERP5Type/dynamic/component_package.py", line 449, in load_module
          return self.__load_module(fullname)
        File "./parts/erp5/product/ERP5Type/dynamic/component_package.py", line 416, in __load_module
          erp5.component.ref_manager.add_module(module)
        File "./parts/erp5/product/ERP5Type/dynamic/dynamic_module.py", line 86, in add_module
          self.add_request(get_request())
        File "./parts/erp5/product/ERP5Type/dynamic/dynamic_module.py", line 64, in add_request
          self.setdefault(last_sync, (WeakSet(), set()))[0].add(request_obj)
        File "./lib/python3.9/_weakrefset.py", line 89, in add
          self.data.add(ref(item, self._remove))
      TypeError: cannot create weak reference to 'NoneType' object
      
      On python2, this was actually raising as well, but this error is hidden
      by a `hasattr`, because on python2 `hasattr` ignores all exceptions and
      on python3 it only ignores only `AttributeError`.
      
        File "./parts/erp5/product/ERP5Type/Core/PropertySheet.py", line 61, in createAccessorHolder
          self.applyOnAccessorHolder(accessor_holder, expression_context, portal)
        File "./parts/erp5/product/ERP5Type/Core/PropertySheet.py", line 175, in applyOnAccessorHolder
          for property_definition in self.contentValues():
        File "./parts/erp5/product/ERP5Type/Core/Folder.py", line 1570, in contentValues
          portal_type_id_list = self._getTypesTool().listContentTypes()
        File "./parts/erp5/product/ERP5Type/Tool/TypesTool.py", line 173, in listContentTypes
          provider_value = _getOb(provider, None)
        File "./eggs/Zope-4.8.7-py2.7.egg/OFS/ObjectManager.py", line 323, in _getOb
          if id[:1] != '_' and hasattr(aq_base(self), id):
        File "./parts/erp5/product/ERP5Type/dynamic/lazy_class.py", line 120, in __getattribute__
          self.__class__.loadClass()
      6102ed47
    • Nicolas Wavrant's avatar
  7. 15 Oct, 2024 13 commits