1. 17 Sep, 2024 3 commits
    • Titouan Soulard's avatar
      96ca750d
    • Titouan Soulard's avatar
      erp5_trade: rework Inventory workflow · a4ec6924
      Titouan Soulard authored
      In order to have Inventory Offset Lines, we want the user to be able to check
      the generated lines before validating. This commit therefore adds an
      intermediate state `planned`, which will be used to trigger generation of
      Simulation Movements and building of the offset lines.
      
      Some other small changes have been done to make the actions' names more clear
      and adhere to ERP5 standards, but all keep backward compatiblity: previous states
      have been kept, and previously validated inventories are now recorded so that
      no Simulation Movements will be generated that would impact stock values.
      a4ec6924
    • Titouan Soulard's avatar
      33e44511
  2. 02 Aug, 2024 2 commits
  3. 01 Aug, 2024 4 commits
  4. 30 Jul, 2024 1 commit
  5. 29 Jul, 2024 4 commits
  6. 25 Jul, 2024 2 commits
  7. 23 Jul, 2024 2 commits
    • Rafael Monnerat's avatar
      ERP5Type: Include OFSFolder2._cleanup method · 6e6eb5f0
      Rafael Monnerat authored
        This aims to add compatibility with BTreeFolder2 API, even it is not
        required. Since some checkConsistency may call self._cleanup() regardless
        expecting that the folder is a [H]BTreeFolder2 always.
      
        This was detected when a post upgrade constrant was included to
        portal_categories
      6e6eb5f0
    • Jérome Perrin's avatar
      core: handle price 0 or None in Inventory API · 2c525e57
      Jérome Perrin authored
      The methods used in indexing did not make a difference between the case
      where the price is None (ie. price is not set) or where the price is
      set to 0 - in both cases this was saved as NULL in stock.total_price
      column. This is incorrect, we need to keep the distinction between
      these two cases also for inventory calculation.
      We had some places where we select IFNULL(stock.total_price, 0) to work
      around this, we don't plan to change the existing ones for now, but
      while discussing on nexedi/erp5!1974
      we concluded that a newly idenfified case of a problem consequence of
      these NULL should be handled by fixing the indexation. To benefit from
      the fix, impacted instances will have to reindex documents present in
      the stock table with stock.total_price is null.
      2c525e57
  8. 18 Jul, 2024 1 commit
  9. 17 Jul, 2024 2 commits
    • Arnaud Fontaine's avatar
      py2/py3: Fix __import__ fromlist argument. · 73c73960
      Arnaud Fontaine authored
      __import__ `fromlist` argument was wrong. It was working anyway with Python2 but
      not anymore with Python3, raising a `ModuleNotFoundError` exception. According
      to Python `__import__(name, globals, locals, fromlist)` documentation:
      
        When the `name` variable is of the form `package.module`, normally, the
        top-level package (the `name` up till the first dot) is returned, *not* the
        module named by `name`. However, when a non-empty `fromlist` argument is
        given, the module named by `name` is returned.
      
      Thus, the following patterns were wrong:
        * __import__(MODULE_NAME, globals(), locals(), MODULE_NAME)
          => Iterate through each character of MODULE_NAME as fromlist is expected to
             be a list/tuple.
        * __import__(MODULE_NAME, globals(), locals(), [MODULE_NAME])
          => This works but actually tries to import MODULE_NAME object from
             MODULE_NAME module (no error if it cannot).
      
      The goal of such __import__ calls were for __import__ to return the right-end
      module instead of the top-level package. In such case, `fromlist=['']` is the
      way to go as it __import__ does not check if the object exists in the module if
      it's an empty string. However, it is even better and easier to read to use
      importlib.import_module() for that...
      
      Also, add `from __future__ import absolute_import` because python2 tries both
      relative and absolute import (level=-1 __import__ parameter) whereas python3
      does absolute import by default (level=0).
      Co-authored-by: Kazuhiko Shiozaki's avatarKazuhiko SHIOZAKI <kazuhiko@nexedi.com>
      73c73960
    • Nicolas Wavrant's avatar
  10. 15 Jul, 2024 1 commit
    • Jérome Perrin's avatar
      tests: fix DateTime.isPast() under pinDateTime · 78f80ad2
      Jérome Perrin authored
      When under a pinDateTime context, d.isPast() was comparing d with the
      actual current date, not the fake date from the pinned context.
      
      Also, make the methods class methods, so that they can be used as
      external methods in Zelenium tests.
      78f80ad2
  11. 11 Jul, 2024 17 commits
  12. 09 Jul, 2024 1 commit
    • Kazuhiko Shiozaki's avatar
      py2/py3: return None in ZSQLBrain._aq_dynamic() if getObject() because of missing path. · 89725905
      Kazuhiko Shiozaki authored
      in Python 2, _aq_dynamic() returns None without try..except but it raises ValueError in Python 3.
      
      (python 2)
      > /SR/parts/erp5/product/ZSQLCatalog/Extensions/zsqlbrain.py(31)_aq_dynamic()
       31  ->   def _aq_dynamic(self, name):
       32         """Acquire an attribute from a real object.
       33         """
       34         if name.startswith('__') :
       35           return None
       36         return getattr(self.getObject(), name, None)
      ((Pdb)) getattr(self.getObject(), name, None)
      *** ValueError: Unable to getObject from ZSQLBrain if ZSQL Method does not retrieve the `path` column from catalog table.
      ((Pdb)) r
      --Return--
      > /SR/parts/erp5/product/ZSQLCatalog/Extensions/zsqlbrain.py(36)_aq_dynamic()->None # <-- !!!
      Co-authored-by: Jérome Perrin's avatarJérome Perrin <jerome@nexedi.com>
      89725905