annotate libervia/backend/tools/trigger.py @ 4306:94e0968987cd

plugin XEP-0033: code modernisation, improve delivery, data validation: - Code has been rewritten using Pydantic models and `async` coroutines for data validation and cleaner element parsing/generation. - Delivery has been completely rewritten. It now works even if server doesn't support multicast, and send to local multicast service first. Delivering to local multicast service first is due to bad support of XEP-0033 in server (notably Prosody which has an incomplete implementation), and the current impossibility to detect if a sub-domain service handles fully multicast or only for local domains. This is a workaround to have a good balance between backward compatilibity and use of bandwith, and to make it work with the incoming email gateway implementation (the gateway will only deliver to entities of its own domain). - disco feature checking now uses `async` corountines. `host` implementation still use Deferred return values for compatibility with legacy code. rel 450
author Goffi <goffi@goffi.org>
date Thu, 26 Sep 2024 16:12:01 +0200
parents 0d7bb4df2343
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
4 # SAT: a jabber client
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
7 # This program is free software: you can redistribute it and/or modify
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
10 # (at your option) any later version.
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
11
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
12 # This program is distributed in the hope that it will be useful,
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
15 # GNU Affero General Public License for more details.
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
16
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 590
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
19
590
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
20 """Misc usefull classes"""
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
21
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
22 import inspect
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
23 from typing import Callable
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
24 from libervia.backend.core.i18n import _
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
25 from libervia.backend.core.log import getLogger
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
26 from libervia.backend.core.core_types import SatXMPPEntity
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
27
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 876
diff changeset
28 log = getLogger(__name__)
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
29
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 741
diff changeset
30
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
31 class TriggerException(Exception):
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
32 pass
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
33
590
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
34
525
5431136501ab core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents: 516
diff changeset
35 class SkipOtherTriggers(Exception):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4182
diff changeset
36 """Exception to raise if normal behaviour must be followed instead of following triggers list"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
37
525
5431136501ab core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents: 516
diff changeset
38 pass
5431136501ab core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents: 516
diff changeset
39
590
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
40
588
beaf6bec2fcd Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
41 class TriggerManager(object):
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
42 """This class manage triggers: code which interact to change the behaviour of SàT"""
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
43
1347
ba41a81d14c2 frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents: 993
diff changeset
44 try: # FIXME: to be removed when a better solution is found
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
45 MIN_PRIORITY = float("-inf")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
46 MAX_PRIORITY = float("+inf")
1347
ba41a81d14c2 frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents: 993
diff changeset
47 except: # XXX: Pyjamas will bug if you specify ValueError here
ba41a81d14c2 frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents: 993
diff changeset
48 # Pyjamas uses the JS Float class
ba41a81d14c2 frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents: 993
diff changeset
49 MIN_PRIORITY = Number.NEGATIVE_INFINITY
ba41a81d14c2 frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents: 993
diff changeset
50 MAX_PRIORITY = Number.POSITIVE_INFINITY
741
00318e60a06a core (tools): set min and max priorities for triggers and warn if several triggers have the same not null priority
souliane <souliane@mailoo.org>
parents: 609
diff changeset
51
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
52 def __init__(self):
590
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
53 self.__triggers = {}
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
54
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
55 def is_available(self, args: list):
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
56 """Check if plugin used in a client context, and if it's available"""
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
57 if not args or not isinstance(args[0], SatXMPPEntity):
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
58 # we are not in the context of a client
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
59 return True
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
60 client = args[0]
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
61 if not client.is_component:
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
62 # plugins are always avaialble for normal clients
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
63 return True
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
64
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
65 def add(self, point_name, callback: Callable, priority=0):
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
66 """Add a trigger to a point
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
67
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
68 @param point_name: name of the point when the trigger should be run
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
69 @param callback: method to call at the trigger point
590
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
70 @param priority: callback will be called in priority order, biggest
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
71 first
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
72 """
590
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
73 if point_name not in self.__triggers:
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
74 self.__triggers[point_name] = []
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
75 if priority != 0 and priority in [
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
76 trigger_tuple[0] for trigger_tuple in self.__triggers[point_name]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
77 ]:
876
65bf1bc70f6b tools, plugin XEP-0077: small fixes
souliane <souliane@mailoo.org>
parents: 811
diff changeset
78 if priority in (self.MIN_PRIORITY, self.MAX_PRIORITY):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
79 log.warning(_("There is already a bound priority [%s]") % point_name)
741
00318e60a06a core (tools): set min and max priorities for triggers and warn if several triggers have the same not null priority
souliane <souliane@mailoo.org>
parents: 609
diff changeset
80 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
81 log.debug(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
82 _("There is already a trigger with the same priority [%s]")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
83 % point_name
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
84 )
516
7ee15fbe8c08 core: added priority management in triggers
Goffi <goffi@goffi.org>
parents: 501
diff changeset
85 self.__triggers[point_name].append((priority, callback))
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
86 self.__triggers[point_name].sort(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
87 key=lambda trigger_tuple: trigger_tuple[0], reverse=True
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
88 )
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
89
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
90 def add_with_check(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4182
diff changeset
91 self, point_name: str, plugin, callback: Callable, priority: int = 0
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
92 ) -> None:
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
93 """Like [Add], but check session before running the trigger
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
94
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
95 This method is to be used for triggers which can run in components and are
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
96 expecting a ``client``: as all plugins are not run for component, a check will be
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
97 added before running the trigger, if the plugin is not valid for this component,
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
98 the trigger is ignored. ``client`` must be the first positional argument.
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
99
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
100 @param point_name: name of the trigger point
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
101 @param plugin: instance of the plugin using this trigger. This is necessary to
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
102 check if the plugin is available in the session.
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
103 @param callback: method to call at the trigger point
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
104 @param priority: callback will be called in priority order, biggest first
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
105 """
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
106 if inspect.iscoroutinefunction(callback):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4182
diff changeset
107
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
108 async def async_wrapper(client: SatXMPPEntity, *args, **kwargs):
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
109 if client.is_component and plugin not in client.plugins:
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
110 log.debug(f"Ignoring {callback} as parent plugin is not available")
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
111 return True
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
112 else:
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
113 return await callback(client, *args, **kwargs)
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4182
diff changeset
114
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
115 self.add(point_name, async_wrapper, priority)
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
116 else:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4182
diff changeset
117
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
118 def sync_wrapper(client: SatXMPPEntity, *args, **kwargs):
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
119 if client.is_component and plugin not in client.plugins:
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
120 log.debug(f"Ignoring {callback} as parent plugin is not available")
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
121 return True
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
122 else:
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
123 return callback(client, *args, **kwargs)
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4182
diff changeset
124
4182
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
125 self.add(point_name, sync_wrapper, priority)
4dc00e848961 core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
126
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
127 def remove(self, point_name, callback):
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
128 """Remove a trigger from a point
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
129
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
130 @param point_name: name of the point when the trigger should be run
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
131 @param callback: method to remove, must exists in the trigger point
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
132 """
516
7ee15fbe8c08 core: added priority management in triggers
Goffi <goffi@goffi.org>
parents: 501
diff changeset
133 for trigger_tuple in self.__triggers[point_name]:
7ee15fbe8c08 core: added priority management in triggers
Goffi <goffi@goffi.org>
parents: 501
diff changeset
134 if trigger_tuple[1] == callback:
7ee15fbe8c08 core: added priority management in triggers
Goffi <goffi@goffi.org>
parents: 501
diff changeset
135 self.__triggers[point_name].remove(trigger_tuple)
7ee15fbe8c08 core: added priority management in triggers
Goffi <goffi@goffi.org>
parents: 501
diff changeset
136 return
7ee15fbe8c08 core: added priority management in triggers
Goffi <goffi@goffi.org>
parents: 501
diff changeset
137 raise TriggerException("Trying to remove an unexisting trigger")
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
138
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
139 def point(self, point_name, *args, **kwargs):
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
140 """This put a trigger point
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
141
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
142 All the triggers for that point will be run
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
143 @param point_name: name of the trigger point
2650
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
144 @param *args: args to transmit to trigger
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
145 @param *kwargs: kwargs to transmit to trigger
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
146 if "triggers_no_cancel" is present, it will be popup out
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
147 when set to True, this argument don't let triggers stop
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
148 the workflow
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
149 @return: True if the action must be continued, False else
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
150 """
590
56531f9e9ac7 Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
151 if point_name not in self.__triggers:
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
152 return True
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
153
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4182
diff changeset
154 can_cancel = not kwargs.pop("triggers_no_cancel", False)
2650
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
155
1347
ba41a81d14c2 frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents: 993
diff changeset
156 for priority, trigger in self.__triggers[point_name]:
525
5431136501ab core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents: 516
diff changeset
157 try:
2650
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
158 if not trigger(*args, **kwargs) and can_cancel:
525
5431136501ab core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents: 516
diff changeset
159 return False
5431136501ab core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents: 516
diff changeset
160 except SkipOtherTriggers:
5431136501ab core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents: 516
diff changeset
161 break
250
ad3b820651fa Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
162 return True
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
163
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
164 def return_point(self, point_name, *args, **kwargs):
2499
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
165 """Like point but trigger must return (continue, return_value)
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
166
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
167 All triggers for that point must return a tuple with 2 values:
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
168 - continue, same as for point, if False action must be finished
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
169 - return_value: value to return ONLY IF CONTINUE IS FALSE
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
170 @param point_name: name of the trigger point
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
171 @return: True if the action must be continued, False else
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
172 """
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
173
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
174 if point_name not in self.__triggers:
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
175 return True
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
176
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
177 for priority, trigger in self.__triggers[point_name]:
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
178 try:
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
179 cont, ret_value = trigger(*args, **kwargs)
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
180 if not cont:
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
181 return False, ret_value
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
182 except SkipOtherTriggers:
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
183 break
af4a38ebf52a core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
184 return True, None