diff --git a/doc/family/simple.md b/doc/family/simple.md index c0ce2d330..ac3e9cdc7 100644 --- a/doc/family/simple.md +++ b/doc/family/simple.md @@ -44,7 +44,7 @@ En plus de la description, il est possible de préciser une aide complémentaire ## Mode de la famille -Le [mode](../mode.md) par défaut d'une famille correspond au [mode](../mode.md) le plus petite des variables ou des familles qui sont contenu dans cette famille. +Le [mode](../mode.md) par défaut d'une famille correspond au [mode](../mode.md) du mode le plus petit entre la famille parente, les variables enfants ou des familles enfants qui sont contenu dans cette famille. Changer le [mode](../mode.md) d'une famille permet de définir le [mode](../mode.md) par défaut des variables ou des familles inclusent dans cette famille. diff --git a/doc/variable/leadership.md b/doc/variable/leadership.md index 90033c679..1e4ca5cd7 100644 --- a/doc/variable/leadership.md +++ b/doc/variable/leadership.md @@ -8,6 +8,8 @@ Une variable meneuse est une [variable](simple.md) qui est obligatoirement de ty Une variable meneuse peut être obligatoire. +Le [mode](../mode.md) par défaut correspond au plus petit mode définit par l'utilisateur des variables suiveuses. + ## Variable suiveuse Une variable suiveuse est une variable donc la longueur n'est pas déterminé par elle-même, mais est identique à celle de la variable meneuse dont elle dépend. diff --git a/doc/variable/simple.md b/doc/variable/simple.md index c539e422b..b481d51d8 100644 --- a/doc/variable/simple.md +++ b/doc/variable/simple.md @@ -74,18 +74,6 @@ Pour définir une variable à valeur multiple : ``` -## Mode de la variable - -Le [mode](../mode.md) par défaut d'une variable correspond au [mode](../mode.md) de la [famille](../family/README.md). - -Si la variable n'est pas dans une famille, la variable aura le mode "normal" par défaut. - -Pour définir le [mode](../mode.md) : - -``` - -``` - ## Variable invisible Il est possible de cacher une variable. @@ -236,3 +224,19 @@ Il est possible de préciser plusieurs valeurs avec le séparateur "|" : ``` ``` + +## Mode de la variable + +Le [mode](../mode.md) par défaut d'une variable correspond au [mode](../mode.md) de la [famille](../family/README.md). + +Cas particuliers : + +- une variable à valeur automatiquement modifiée ou une variable en lecture seule automatique est par défaut en mode "basic". +- si la variable n'est pas dans une famille, la variable aura le mode "normal" par défaut. +- une variable obligatoire sans valeur par défaut (calculer ou non) aura le mode "basic". + +Pour définir le [mode](../mode.md) : + +``` + +``` diff --git a/src/rougail/annotator/family.py b/src/rougail/annotator/family.py index 856d7a1e8..eec0c4ffc 100644 --- a/src/rougail/annotator/family.py +++ b/src/rougail/annotator/family.py @@ -145,7 +145,8 @@ class FamilyAnnotator(Walk): (variable.auto_save is True or variable.auto_freeze is True): self._set_auto_mode(variable, modes_level[0]) # mandatory variable without value is a basic variable - elif variable.mandatory is True and \ + elif not self._has_mode(variable) and \ + variable.mandatory is True and \ not hasattr(variable, 'default') and \ not hasattr(variable, 'default_multi'): self._set_auto_mode(variable, modes_level[0]) @@ -170,11 +171,12 @@ class FamilyAnnotator(Walk): msg = f'leader/followers "{follower.name}" could not be auto_freeze' raise DictConsistencyError(_(msg), 30, leadership.xmlfiles) if leader_mode is not None: - # leader's mode is minimum level if modes[leader_mode] > modes[follower.mode]: if self._has_mode(follower) and not self._has_mode(leadership.variable[0]): + # if follower has mode but not the leader self._set_auto_mode(leadership.variable[0], follower.mode) else: + # leader's mode is minimum level if self._has_mode(follower): msg = _(f'the follower "{follower.name}" is in "{follower.mode}" mode ' f'but leader have the higher mode "{leader_mode}"') @@ -219,7 +221,6 @@ class FamilyAnnotator(Walk): def _change_variable_mode(self, variable, family_mode: str, - is_follower=False, ) -> None: # none basic variable in high level family has to be in high level if modes[variable.mode] < modes[family_mode]: @@ -233,13 +234,10 @@ class FamilyAnnotator(Walk): leadership, family_mode: str, ) -> None: - is_follower = False for follower in leadership.variable: self._change_variable_mode(follower, family_mode, - is_follower, ) - is_follower = True leadership.variable[0].mode = None def dynamic_families(self):