misc: allow setting a custom id template on cards (#44604) #49
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/44604-card-id"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
5359f62e76
to3e40486683
3e40486683
tofe3102479a
fe3102479a
toba705d74a6
ba705d74a6
toc078037ac2
c078037ac2
tobc3b175428
bc3b175428
tod2ca678d60
d2ca678d60
todc5c647da2
dc5c647da2
toc0d865fa0a
c0d865fa0a
tofbcc3b929b
fbcc3b929b
tob221e34c8b
b221e34c8b
to15728f9581
@ -46,1 +47,4 @@
def get_templates_form(self):
form = super().get_templates_form()
if not get_publisher().has_site_option('enable-card-identifier-template'):
Tout ça se passe derrière un feature flag.
@ -47,0 +56,4 @@
kwargs = {}
if self.formdef.data_class().exists(criterias):
kwargs['readonly'] = True
kwargs['hint'] = _('Identifier cannot be modified if there are existing cards.')
S'il y a déjà des données on ne permet pas la modification de ce qui constitue l'identifiant.
@ -47,0 +60,4 @@
form.add(
StringWidget,
'id_template',
title=_('Unique identifier template'),
Nouvel attribut, id_template, qui contiendra de quoi générer un identifiant.
@ -408,3 +408,3 @@
form_page_class = CardFillPage
sidebar_recorded_message = _('The card has been recorded on %(date)s with the number %(number)s.')
sidebar_recorded_message = _('The card has been recorded on %(date)s with the identifier %(identifier)s.')
À la marge, ajustement des messages.
@ -1812,3 +1812,3 @@
def get_formdef_fields(self, include_block_items_fields=False):
yield FakeField('id', 'id', _('Number'))
yield FakeField('id', 'id', _('Identifier') if self.formdef.id_template else _('Number'))
Et pour les colonnes, quand il y a un identifiant custom on appelle plus ça "numéro".
@ -3266,3 +3266,3 @@
form_page_class = FormBackofficeEditPage
sidebar_recorded_message = _('The form has been recorded on %(date)s with the number %(number)s.')
sidebar_recorded_message = _('The form has been recorded on %(date)s with the number %(identifier)s.')
Pour les demandes, pas d'identifiant personnalisé, on peut continuer à dire "numéro" dans les messages.
@ -42,0 +42,4 @@
@classmethod
def get_by_id(cls, value):
try:
return cls.select([cls._formdef.get_by_id_criteria(value)], limit=1)[0]
Sur un carddata, pour aller chercher selon l'id, on va passer par un critère qui sera déterminé au niveau du carddef.
En passant, on n'a pas de contrôle sur l'unicité, si ça se révèle un problème, on ajoutera quelque chose, mais je pense qu'on peut démarrer sans.
@ -145,1 +145,4 @@
def get_by_id_criteria(self, value):
if self.id_template:
return Equal('id_display', value)
S'il y a un gabarit pour l'id, on prend selon la colonne id_display.
@ -146,0 +153,4 @@
except ValueError:
# value not an integer, it could be id_display
return Equal('id_display', value)
return Equal('id', value)
Sinon sur l'id. C'est du code qui existait plus bas, qui est déplacé.
@ -248,3 +254,1 @@
criterias.append(Equal('id_display', get_by_id))
else:
criterias.append(Equal('id', get_by_id))
criterias.append(carddef.get_by_id_criteria(get_by_id))
Voilà, le code était ici, il est maintenant plus haut.
@ -385,3 +385,3 @@
return value
try:
carddata = carddef.data_class().get(value_id)
carddata = carddef.data_class().get_by_id(value_id)
Pour les champs liste, on récupère selon l'identifiant qui peut être custom.
@ -491,1 +494,4 @@
# unless a specific template is defined, only set id_display once
# as it may have been set automatically by interpreting a webservice
# response.
fields['id_display'] = self.formdef.get_display_id_format().strip()
Ce truc de poser le id_display en fonction d'un retour de webservice, c'est quelque chose de très particulier et normalement plus utilisé (à part à Montpellier, peut-être), bref on ne le fait plus non plus s'il y a un gabarit particulier.
@ -1807,2 +1805,2 @@
carddef_table_alias,
)
if field.carddef.id_template:
carddef_table_decl = 'LEFT JOIN %s AS %s ON (%s.%s = %s.id_display)' % (
S'il y a un gabarit personnalisé, on fait la jointure ainsi.
@ -1809,0 +1811,4 @@
carddef_table_alias,
)
else:
carddef_table_decl = 'LEFT JOIN %s AS %s ON (CAST(%s.%s AS INTEGER) = %s.id)' % (
Et sinon on continue à CASTer en entier, pour le match sur l'id natif.
15728f9581
to3169775deb
WIP: misc: allow setting a custom id template on cards (#44604)to misc: allow setting a custom id template on cards (#44604)3169775deb
to632afd546c
@ -761,1 +761,3 @@
for attr in ('receipt_time', 'anonymised', 'user_id', 'status'):
attrs = ['receipt_time', 'anonymised', 'user_id', 'status']
if isinstance(formdef, CardDef):
attrs.append('id_display')
On ajoute un index sur la colonne id_display, pour aider.
@ -47,0 +51,4 @@
return form
criterias = [
StrictNotEqual('status', 'draft'),
Null('anonymised'),
pourquoi ce critère ? On nettoie l'id custom lors de l'anonymisation ?
En vrai sur le genre de modèle de fiches concerné ici on n'aura sans doute jamais d'anonymisation, je pense que mon idée là était que ce qui était anonymisé n'était plus utilisé, qu'on pouvait alors permettre de modifier le gabarit.
Je viens d'hésiter à mettre du code spécifique pour l'anonymisation, vider le id_display, mais ça complique de manière moche le .store() général, autant juste ici retirer ce critère. (j'ai mis un commit supplémentaire pour faire ça).
ok pour moi, top !
9bcc25cc67
to7d1e092c0f
@ -5219,6 +5231,7 @@ def migrate():
# 45 & 46: add index on formdata(status)
# 56: add GIN indexes to concerned_roles_array and actions_roles_array
# 74: (late migration) change evolution index to be on (fomdata_id, id)
# 97: add index on carddata/id_display
Petit "post mortem" : cette migration n'a jamais été exécutée à cause du if sql_level < 74 au dessus :/
→ https://dev.entrouvert.org/issues/85348