Thank you so much for the thorough testing Arrigo.

What happens there is:
- KeyError gets thrown from removeModuleByUrl() because the "del
self.modules[ url ]" is trying to delete a key that isn't in the
dictionary, causes saving to fail after the file is written but before the
".orig" file is deleted.
- The exception is swallowed in actionPerformed() and logged, but the
logging is invisible unless you run AOO with the Python debugging
environment variables.
- Future saves then fail because an earlier statement
"self.provCtx.sfa.move( self.uri(), copyUrl )" throws an exception, because
copyUrl is the ".orig" file, and it already exists from the first save
because of that KeyError, so the move() refuses to overwrite it.

>From what I see, no other ScriptProvider uses that technique of renaming
the intended file to a ".orig" file, then saving to the intended file, then
deleting the ".orig" file. I've now removed that from the Python script
provider as well. Also I've started using "self.modules.pop( url, None )"
instead of "del self.modules[ url ]", so the KeyError isn't thrown on keys
that don't exist in the dictionary.

It now always saves successfully and always runs the latest code.

Regards
Damjan


On Wed, Apr 29, 2026 at 10:33 PM Arrigo Marchiori <[email protected]> wrote:

> Hello Damjan, All,
>
> On Wed, Apr 29, 2026 at 05:39:56AM +0200, Damjan Jovanovic wrote:
>
> > On Mon, Apr 27, 2026 at 9:39 PM Arrigo Marchiori <[email protected]>
> wrote:
> [...]
> > > I've played a bit with Python macros and I think I found a small bug.
> > >
> > > On Sun, Apr 26, 2026 at 08:36:07PM +0200, Damjan Jovanovic wrote:
> > >
> > > [...]
> > >
> > > > Most of all, Python scripts can now be edited :-), in a custom little
> > > > dialog window with "Run", "Save" and "Close" buttons. It all works,
> they
> > > > run, they are successfully saved into the document, and can be
> re-opened.
> > > > The editing could still be improved a lot, with line numbers,
> debugging,
> > > a
> > > > resizable window and fixed width font, etc., but I don't have time
> for
> > > that
> > > > now, and to be fair, the BeanShell editor isn't much better.
> > >
> > > When we click button "Save" of the new Python editing dialog, the code
> > > is saved, but apparently is not ``active'' yet.
> > >
> > > In other words, the ``old'' Python source code is still executed
> > > whenever we ask to ``run'' a macro.
> > >
> > > In order to run the new code, we have to close and reopen the
> > > _document_.
> > >
> >
> > Thank you for testing. You're right, there was a bug there. I think it's
> > fixed now:
> >
> >     Forget Python modules from the cache after they are saved, so they
> >     get reloaded in the future. This is necessary as getModuleByUrl()'s
> >     self.sfa.getDateTimeModified() returns timestamps with all zeroes
> >     for documents (== ZIP files), breaking the test for whether the
> >     embedded Python file has been changed. Also even if it worked, the
> >     minimum granularity for timestamps in ZIP files is 2 seconds, which
> >     isn't good enough.
>
> Now, the "Save" button does not seem to have any effect.
>
> If I make some edits to the Python macros, then "Close" the macro
> editing window, and then I open it again (Tools -> Macros -> Organize
> macros -> Python -> file.odt -> Library1 -> Macro1, Edit) I find the
> previous contents, with my changes lost.
>
> I hope this helps.
>
> Best regards,
> --
> Arrigo
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to