Overview
Comment:Make date_inscription a normal dynamic field
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA3-256: 7e4bceb84e1f31f0f995badfe8fd164cb745de17d687f33de97edf7c39cf3e8b
User & Date: bohwaz on 2022-08-05 03:14:14
Other Links: branch diff | manifest | tags
Context
2022-08-06
01:47
Improve rendering of user permissions icons check-in: e09b69879e user: bohwaz tags: dev
2022-08-05
03:14
Make date_inscription a normal dynamic field check-in: 7e4bceb84e user: bohwaz tags: dev
2022-07-31
03:21
Implement generated columns as dynamic user fields check-in: 3b12525b6e user: bohwaz tags: dev
Changes

Modified src/include/data/users_fields_presets.ini from [420ae8bd60] to [be9acc7ed5].

122
123
124
125
126
127
128
















[age]
type = generated
label = "Âge"
depends[] = date_naissance
default = false
sql = "CAST(strftime('%Y.%m%d', date()) - strftime('%Y.%m%d', date_naissance) as int)"






















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

[age]
type = generated
label = "Âge"
depends[] = date_naissance
default = false
sql = "CAST(strftime('%Y.%m%d', date()) - strftime('%Y.%m%d', date_naissance) as int)"

[date_inscription]
type = date
label = "Date d'inscription"
help = "Date à laquelle le membre a été inscrit à l'association pour la première fois"
default = true
default_value = '=NOW'

[anciennete]
type = generated
label = "Ancienneté"
help = "Nombre d'années depui"
depends[] = date_inscription
default = false
sql = "CAST(strftime('%Y.%m%d', date()) - strftime('%Y.%m%d', date_inscription) as int)"

Modified src/include/lib/Garradin/Entities/Users/DynamicField.php from [fea81bfd05] to [9f15fe5ba6].

140
141
142
143
144
145
146
147
148
149
150
151
152
153
154

	const SYSTEM_FIELDS = [
		'id'           => '?int',
		'id_category'  => 'int',
		'pgp_key'      => '?string',
		'otp_secret'   => '?string',
		'date_login'   => '?DateTime',
		'date_created' => '?date',
	];

	public function delete(): bool
	{
		if (!$this->canDelete()) {
			throw new ValidationException('Ce champ est utilisé en interne, il n\'est pas possible de le supprimer');
		}







<







140
141
142
143
144
145
146

147
148
149
150
151
152
153

	const SYSTEM_FIELDS = [
		'id'           => '?int',
		'id_category'  => 'int',
		'pgp_key'      => '?string',
		'otp_secret'   => '?string',
		'date_login'   => '?DateTime',

	];

	public function delete(): bool
	{
		if (!$this->canDelete()) {
			throw new ValidationException('Ce champ est utilisé en interne, il n\'est pas possible de le supprimer');
		}

Modified src/include/lib/Garradin/Template.php from [718990ebdc] to [69ecefeb35].

826
827
828
829
830
831
832




833
834
835
836
837
838
839
		elseif ($field->system & $field::NUMBER && $context == 'new') {
			$params['default'] = DB::getInstance()->firstColumn(sprintf('SELECT MAX(%s) + 1 FROM %s;', $key, User::TABLE));
			$params['required'] = false;
		}
		elseif ($type == 'number') {
			$params['step'] = 'any';
		}





		$out = self::formInput($params);

		if ($context != 'edit' && $field->system & $field::LOGIN) {
			$out .= '<dd class="help"><small>(Sera utilisé comme identifiant de connexion si le membre a le droit de se connecter.)</small></dd>';
		}








>
>
>
>







826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
		elseif ($field->system & $field::NUMBER && $context == 'new') {
			$params['default'] = DB::getInstance()->firstColumn(sprintf('SELECT MAX(%s) + 1 FROM %s;', $key, User::TABLE));
			$params['required'] = false;
		}
		elseif ($type == 'number') {
			$params['step'] = 'any';
		}

		if ($field->default_value == '=NOW') {
			$params['default'] = new \DateTime;
		}

		$out = self::formInput($params);

		if ($context != 'edit' && $field->system & $field::LOGIN) {
			$out .= '<dd class="help"><small>(Sera utilisé comme identifiant de connexion si le membre a le droit de se connecter.)</small></dd>';
		}

Modified src/include/lib/Garradin/Users/DynamicFields.php from [a6c147d5c6] to [44b3bafce3].

349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
		$presets = parse_ini_file(self::PRESETS_FILE, true);

		$i = 0;

		$self = new self(false);
		$fields = [
			'date_connexion'   => 'date_login',
			'date_inscription' => 'date_created',
			'clef_pgp'         => 'pgp_key',
			'secret_otp'       => 'otp_secret',
			'id_category'      => 'id_category',
		];

		$defaults = [
			'help'      => null,







|







349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
		$presets = parse_ini_file(self::PRESETS_FILE, true);

		$i = 0;

		$self = new self(false);
		$fields = [
			'date_connexion'   => 'date_login',
			'date_inscription' => 'date_inscription',
			'clef_pgp'         => 'pgp_key',
			'secret_otp'       => 'otp_secret',
			'id_category'      => 'id_category',
		];

		$defaults = [
			'help'      => null,
416
417
418
419
420
421
422




423
424
425
426
427
428
429
			$field->set('read_access', $data['private'] ? $field::ACCESS_ADMIN : $field::ACCESS_USER);
			$field->set('write_access', $data['editable'] ? $field::ACCESS_ADMIN : $field::ACCESS_USER);
			$field->set('required', (bool) $data['mandatory']);
			$field->set('list_table', (bool) $data['list_row']);
			$field->set('sort_order', $i++);
			$self->add($field);
		}





		self::$_instance = $self;

		$self->createTable();
		$self->createIndexes();
		$self->copy('membres', User::TABLE, $fields);








>
>
>
>







416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
			$field->set('read_access', $data['private'] ? $field::ACCESS_ADMIN : $field::ACCESS_USER);
			$field->set('write_access', $data['editable'] ? $field::ACCESS_ADMIN : $field::ACCESS_USER);
			$field->set('required', (bool) $data['mandatory']);
			$field->set('list_table', (bool) $data['list_row']);
			$field->set('sort_order', $i++);
			$self->add($field);
		}

		// Create date_inscription
		$field = $self->addFieldFromPreset('date_inscription');
		$self->add($field);

		self::$_instance = $self;

		$self->createTable();
		$self->createIndexes();
		$self->copy('membres', User::TABLE, $fields);

507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
		$db = DB::getInstance();

		// Champs à créer
		$create = [
			'id INTEGER PRIMARY KEY, -- Numéro attribué automatiquement',
			'id_category INTEGER NOT NULL REFERENCES users_categories(id),',
			'date_login TEXT NULL CHECK (date_login IS NULL OR datetime(date_login) = date_login), -- Date de dernière connexion',
			'date_created TEXT NOT NULL DEFAULT CURRENT_DATE CHECK (date(date_created) = date_created), -- Date d\'inscription',
			'otp_secret TEXT NULL, -- Code secret pour TOTP',
			'pgp_key TEXT NULL, -- Clé publique PGP'
		];

		end($this->_fields);
		$last_one = key($this->_fields);








<







511
512
513
514
515
516
517

518
519
520
521
522
523
524
		$db = DB::getInstance();

		// Champs à créer
		$create = [
			'id INTEGER PRIMARY KEY, -- Numéro attribué automatiquement',
			'id_category INTEGER NOT NULL REFERENCES users_categories(id),',
			'date_login TEXT NULL CHECK (date_login IS NULL OR datetime(date_login) = date_login), -- Date de dernière connexion',

			'otp_secret TEXT NULL, -- Code secret pour TOTP',
			'pgp_key TEXT NULL, -- Clé publique PGP'
		];

		end($this->_fields);
		$last_one = key($this->_fields);

Modified src/templates/users/details.tpl from [67897bfc54] to [69de06f64e].

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
	{/if}
</dl>

<aside class="describe">
	<dl class="describe">
		<dt>Catégorie</dt>
		<dd>{$category.name} <span class="permissions">{display_permissions permissions=$category}</span></dd>
		<dt>Création de la fiche</dt>
		<dd>{$user.date_created|date_short}</dd>
		<dt>Dernière connexion</dt>
		<dd>{if empty($user.date_login)}Jamais{else}{$user.date_login|date_short:true}{/if}</dd>
		<dt>Mot de passe</dt>
		<dd>
			{if empty($user.password)}
				Pas de mot de passe configuré
			{else}







<
<







51
52
53
54
55
56
57


58
59
60
61
62
63
64
	{/if}
</dl>

<aside class="describe">
	<dl class="describe">
		<dt>Catégorie</dt>
		<dd>{$category.name} <span class="permissions">{display_permissions permissions=$category}</span></dd>


		<dt>Dernière connexion</dt>
		<dd>{if empty($user.date_login)}Jamais{else}{$user.date_login|date_short:true}{/if}</dd>
		<dt>Mot de passe</dt>
		<dd>
			{if empty($user.password)}
				Pas de mot de passe configuré
			{else}