Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

States "genericity" #16198

Merged
merged 38 commits into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
c019983
States genericity
trasher Dec 8, 2023
3d411f9
Fix SO on computer
trasher Dec 8, 2023
51953e0
Try to replace SO (does not work, as usual)
trasher Dec 14, 2023
4bcceb1
Fix rebase
trasher Jan 10, 2024
adece9f
CS
trasher Jan 10, 2024
20bd277
Fix empty schema
trasher Jan 10, 2024
e7edc6e
fix table name
orthagh Jan 11, 2024
89f5778
almost ok SO for computer
orthagh Jan 12, 2024
dd83aaa
Fix CS
trasher Jan 10, 2024
4a9c477
Fix headers
trasher Jan 12, 2024
f6ef4ea
Fix query error
trasher Jan 12, 2024
41d3053
Fix CS
trasher Feb 22, 2024
44dd0ae
fix SO
orthagh Feb 22, 2024
2a690bf
Rename method
trasher Feb 22, 2024
4ae196c
Revert useless change
trasher Feb 22, 2024
fd19797
Fix condition \\o//
trasher Feb 22, 2024
7d7e7b1
"Improve" FKEY condition detection
trasher Feb 22, 2024
a6fe8c7
Fix test
trasher Feb 22, 2024
770ef3b
update hlapi schema for state
cconard96 Feb 22, 2024
26788c8
Cleanup, use cfg_glpi
trasher Feb 23, 2024
9472233
Replace is_visible_* on all objects
trasher Feb 23, 2024
b7f17c1
Fix test
trasher Feb 23, 2024
f492e33
is_visible_* no longer exists
trasher Feb 23, 2024
48156cd
Fix typo
trasher Feb 23, 2024
b9e7aef
is_visible_* ahs been removed; try with new version
trasher Feb 23, 2024
aa72852
Make search work in State (thanks to Curtis!)
trasher Feb 23, 2024
2d7bf49
Revert ""Improve" FKEY condition detection"
trasher Feb 26, 2024
df8746c
Revert "Fix condition \\o//"
trasher Feb 26, 2024
145225d
Test a better solution for FKEY condition detection
trasher Feb 26, 2024
5fb960b
small fixes
cedric-anne Feb 27, 2024
eeae7f9
ensure all visibility fields are defined
cedric-anne Feb 27, 2024
2f7a69d
More resilient test
cedric-anne Feb 27, 2024
fdbe74f
lint
cedric-anne Feb 27, 2024
19c4a05
All items with `states_id` field must be registered in `$CFG_GLPI['st…
cedric-anne Feb 29, 2024
8338b00
Fix field name
cedric-anne Feb 29, 2024
94b7569
Apply new logic to generic assets
cedric-anne Feb 29, 2024
ad00a68
fixes
cedric-anne Mar 4, 2024
2df8271
fix tests
cedric-anne Mar 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions inc/define.php
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@
$CFG_GLPI['itemdevices'] = [];
foreach ($CFG_GLPI['device_types'] as $dtype) {
$CFG_GLPI['location_types'][] = 'Item_' . $dtype;
$CFG_GLPI['state_types'][] = 'Item_' . $dtype;
$CFG_GLPI["itemdevices"][] = 'Item_' . $dtype;
}

Expand Down
1 change: 1 addition & 0 deletions inc/relation.constant.php
Original file line number Diff line number Diff line change
Expand Up @@ -1404,6 +1404,7 @@
'glpi_devicesensors' => 'states_id',
'glpi_enclosures' => 'states_id',
'glpi_items_devicebatteries' => 'states_id',
'glpi_items_devicecameras' => 'states_id',
'glpi_items_devicecases' => 'states_id',
'glpi_items_devicecontrols' => 'states_id',
'glpi_items_devicedrives' => 'states_id',
Expand Down
113 changes: 113 additions & 0 deletions install/migrations/update_10.0.x_to_11.0.0/states.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<?php

/**
* ---------------------------------------------------------------------
*
* GLPI - Gestionnaire Libre de Parc Informatique
*
* http://glpi-project.org
*
* @copyright 2015-2024 Teclib' and contributors.
* @copyright 2003-2014 by the INDEPNET Development Team.
* @licence https://www.gnu.org/licenses/gpl-3.0.html
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* ---------------------------------------------------------------------
*/

/**
* @var \DBmysql $DB
* @var \Migration $migration
*/

$default_charset = DBConnection::getDefaultCharset();
$default_collation = DBConnection::getDefaultCollation();
$default_key_sign = DBConnection::getDefaultPrimaryKeySignOption();

if (!$DB->tableExists('glpi_dropdownvisibilities')) {
$known_visibilities = [
'computer',
'monitor',
'networkequipment',
'peripheral',
'phone',
'printer',
'softwareversion',
'softwarelicense',
'line',
'certificate',
'rack',
'passivedcequipment',
'enclosure',
'pdu',
'cluster',
'contract',
'appliance',
'databaseinstance',
'cable',
'unmanaged'
];

$query = "CREATE TABLE `glpi_dropdownvisibilities` (
`id` int {$default_key_sign} NOT NULL AUTO_INCREMENT,
`itemtype` varchar(100) NOT NULL DEFAULT '',
`items_id` int {$default_key_sign} NOT NULL DEFAULT '0',
`visible_itemtype` varchar(100) NOT NULL DEFAULT '',
`is_visible` tinyint NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `visible_itemtype` (`visible_itemtype`),
KEY `item` (`itemtype`,`items_id`)
) ENGINE=InnoDB DEFAULT CHARSET={$default_charset} COLLATE={$default_collation} ROW_FORMAT=DYNAMIC;";
$DB->doQueryOrDie($query, "10.1.0 add table glpi_dropdownvisibilities");

$states = $DB->request('glpi_states');
foreach ($states as $state) {
$insert_data = [
'itemtype' => 'State',
'items_id' => $state['id'],
];

foreach ($known_visibilities as $known_visibility) {
if (isset($state['is_visible_' . $known_visibility])) {
$insert_data['visible_itemtype'] = $known_visibility;
$insert_data['is_visible'] = $state['is_visible_' . $known_visibility];
$DB->doQueryOrDie($DB->buildInsert('glpi_dropdownvisibilities', $insert_data));
}
}
}

foreach ($known_visibilities as $known_visibility) {
if ($DB->fieldExists('glpi_states', 'is_visible_' . $known_visibility)) {
$migration->dropField('glpi_states', 'is_visible_' . $known_visibility);
}
}
}
$migration->displayWarning(
'States dropdown in devices items forms are now filtered, and, by default, existing states are not visible.'
);

// Add missing field
$migration->addField('glpi_items_devicecameras', 'states_id', 'fkey');
$migration->addKey('glpi_items_devicecameras', 'states_id');

// Drop unexpected fields
$migration->dropField('glpi_devicegenerics', 'states_id');
$migration->dropField('glpi_devicesensors', 'states_id');
57 changes: 13 additions & 44 deletions install/mysql/glpi-empty.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1842,7 +1842,6 @@ CREATE TABLE `glpi_devicegenerics` (
`entities_id` int unsigned NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
`locations_id` int unsigned NOT NULL DEFAULT '0',
`states_id` int unsigned NOT NULL DEFAULT '0',
`devicegenericmodels_id` int unsigned DEFAULT NULL,
`date_mod` timestamp NULL DEFAULT NULL,
`date_creation` timestamp NULL DEFAULT NULL,
Expand All @@ -1853,7 +1852,6 @@ CREATE TABLE `glpi_devicegenerics` (
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `locations_id` (`locations_id`),
KEY `states_id` (`states_id`),
KEY `date_mod` (`date_mod`),
KEY `date_creation` (`date_creation`),
KEY `devicegenericmodels_id` (`devicegenericmodels_id`)
Expand Down Expand Up @@ -2011,6 +2009,7 @@ CREATE TABLE `glpi_items_devicecameras` (
`entities_id` int unsigned NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
`locations_id` int unsigned NOT NULL DEFAULT '0',
`states_id` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `items_id` (`items_id`),
KEY `devicecameras_id` (`devicecameras_id`),
Expand All @@ -2019,6 +2018,7 @@ CREATE TABLE `glpi_items_devicecameras` (
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `locations_id` (`locations_id`),
KEY `states_id` (`states_id`),
KEY `item` (`itemtype`,`items_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

Expand Down Expand Up @@ -2376,7 +2376,6 @@ CREATE TABLE `glpi_devicesensors` (
`entities_id` int unsigned NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
`locations_id` int unsigned NOT NULL DEFAULT '0',
`states_id` int unsigned NOT NULL DEFAULT '0',
`date_mod` timestamp NULL DEFAULT NULL,
`date_creation` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
Expand All @@ -2386,7 +2385,6 @@ CREATE TABLE `glpi_devicesensors` (
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `locations_id` (`locations_id`),
KEY `states_id` (`states_id`),
KEY `date_mod` (`date_mod`),
KEY `date_creation` (`date_creation`),
KEY `devicesensormodels_id` (`devicesensormodels_id`)
Expand Down Expand Up @@ -6990,26 +6988,6 @@ CREATE TABLE `glpi_states` (
`level` int NOT NULL DEFAULT '0',
`ancestors_cache` longtext,
`sons_cache` longtext,
`is_visible_computer` tinyint NOT NULL DEFAULT '1',
`is_visible_monitor` tinyint NOT NULL DEFAULT '1',
`is_visible_networkequipment` tinyint NOT NULL DEFAULT '1',
`is_visible_peripheral` tinyint NOT NULL DEFAULT '1',
`is_visible_phone` tinyint NOT NULL DEFAULT '1',
`is_visible_printer` tinyint NOT NULL DEFAULT '1',
`is_visible_softwareversion` tinyint NOT NULL DEFAULT '1',
`is_visible_softwarelicense` tinyint NOT NULL DEFAULT '1',
`is_visible_line` tinyint NOT NULL DEFAULT '1',
`is_visible_certificate` tinyint NOT NULL DEFAULT '1',
`is_visible_rack` tinyint NOT NULL DEFAULT '1',
`is_visible_passivedcequipment` tinyint NOT NULL DEFAULT '1',
`is_visible_enclosure` tinyint NOT NULL DEFAULT '1',
`is_visible_pdu` tinyint NOT NULL DEFAULT '1',
`is_visible_cluster` tinyint NOT NULL DEFAULT '1',
`is_visible_contract` tinyint NOT NULL DEFAULT '1',
`is_visible_appliance` tinyint NOT NULL DEFAULT '1',
`is_visible_databaseinstance` tinyint NOT NULL DEFAULT '1',
`is_visible_cable` tinyint NOT NULL DEFAULT '1',
`is_visible_unmanaged` tinyint NOT NULL DEFAULT '1',
`is_helpdesk_visible` tinyint NOT NULL DEFAULT '1',
`date_mod` timestamp NULL DEFAULT NULL,
`date_creation` timestamp NULL DEFAULT NULL,
Expand All @@ -7018,32 +6996,23 @@ CREATE TABLE `glpi_states` (
KEY `name` (`name`),
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `is_visible_computer` (`is_visible_computer`),
KEY `is_visible_monitor` (`is_visible_monitor`),
KEY `is_visible_networkequipment` (`is_visible_networkequipment`),
KEY `is_visible_peripheral` (`is_visible_peripheral`),
KEY `is_visible_phone` (`is_visible_phone`),
KEY `is_visible_printer` (`is_visible_printer`),
KEY `is_visible_softwareversion` (`is_visible_softwareversion`),
KEY `is_visible_softwarelicense` (`is_visible_softwarelicense`),
KEY `is_visible_line` (`is_visible_line`),
KEY `is_visible_certificate` (`is_visible_certificate`),
KEY `is_visible_rack` (`is_visible_rack`),
KEY `is_visible_passivedcequipment` (`is_visible_passivedcequipment`),
KEY `is_visible_enclosure` (`is_visible_enclosure`),
KEY `is_visible_pdu` (`is_visible_pdu`),
KEY `is_visible_cluster` (`is_visible_cluster`),
KEY `is_visible_contract` (`is_visible_contract`),
KEY `is_visible_appliance` (`is_visible_appliance`),
KEY `is_visible_databaseinstance` (`is_visible_databaseinstance`),
KEY `is_visible_cable` (`is_visible_cable`),
KEY `is_visible_unmanaged` (`is_visible_unmanaged`),
KEY `is_helpdesk_visible` (`is_helpdesk_visible`),
KEY `date_mod` (`date_mod`),
KEY `date_creation` (`date_creation`),
KEY `level` (`level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

DROP TABLE IF EXISTS glpi_dropdownvisibilities;
CREATE TABLE `glpi_dropdownvisibilities` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`itemtype` varchar(100) NOT NULL DEFAULT '',
`items_id` int unsigned NOT NULL DEFAULT '0',
`visible_itemtype` varchar(100) NOT NULL DEFAULT '',
`is_visible` tinyint NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `visible_itemtype` (`visible_itemtype`),
KEY `item` (`itemtype`,`items_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

### Dump table glpi_suppliers

Expand Down
50 changes: 31 additions & 19 deletions src/Api/HL/Controller/DropdownController.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ final class DropdownController extends AbstractController

protected static function getRawKnownSchemas(): array
{
/** @var array $CFG_GLPI */
global $CFG_GLPI;

$schemas = [];

$schemas['Location'] = [
Expand Down Expand Up @@ -129,30 +132,39 @@ protected static function getRawKnownSchemas(): array
'is_recursive' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'parent' => self::getDropdownTypeSchema(class: State::class, full_schema: 'State'),
'level' => ['type' => Doc\Schema::TYPE_INTEGER],
'is_visible_computer' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_monitor' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_network_equipment' => ['x-field' => 'is_visible_networkequipment','type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_peripheral' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_phone' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_printer' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_software_version' => ['x-field' => 'is_visible_softwareversion','type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_software_license' => ['x-field' => 'is_visible_softwarelicense','type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_line' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_certificate' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_rack' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_passive_dcequipment' => ['x-field' => 'is_visible_passivedcequipment', 'type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_enclosure' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_pdu' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_cluster' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_contract' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_appliance' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_cable' => ['type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_database_instance' => ['x-field' => 'is_visible_databaseinstance', 'type' => Doc\Schema::TYPE_BOOLEAN],
'is_visible_helpdesk' => ['x-field' => 'is_helpdesk_visible', 'type' => Doc\Schema::TYPE_BOOLEAN],
'date_creation' => ['type' => Doc\Schema::TYPE_STRING, 'format' => Doc\Schema::FORMAT_STRING_DATE_TIME],
'date_mod' => ['type' => Doc\Schema::TYPE_STRING, 'format' => Doc\Schema::FORMAT_STRING_DATE_TIME],
]
];
$visiblities = array_map('strtolower', $CFG_GLPI['state_types']);

$schemas['State_Visibilities'] = [
'type' => Doc\Schema::TYPE_OBJECT,
'properties' => []
];
$schemas['State']['properties']['visibilities'] = [
'type' => Doc\Schema::TYPE_OBJECT,
'x-full-schema' => 'State_Visibilities',
];

foreach ($visiblities as $visiblity) {
$schemas['State_Visibilities']['properties'][$visiblity] = [
'type' => Doc\Schema::TYPE_BOOLEAN,
'x-field' => 'is_visible',
'x-readonly' => true,
'x-join' => [
'table' => \DropdownVisibility::getTable(),
'fkey' => 'id',
'field' => 'items_id',
'condition' => [
'itemtype' => 'State',
'visible_itemtype' => $visiblity
]
]
];
}
$schemas['State']['properties']['visibilities']['properties'] = $schemas['State_Visibilities']['properties'];

$schemas['Manufacturer'] = [
'type' => Doc\Schema::TYPE_OBJECT,
Expand Down
12 changes: 1 addition & 11 deletions src/Api/HL/Controller/ReportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -241,18 +241,8 @@ protected static function getRawKnownSchemas(): array
'name' => [
'type' => Doc\Schema::TYPE_STRING,
],
'entity' => [
'type' => Doc\Schema::TYPE_OBJECT,
'entity' => self::getDropdownTypeSchema(class: \Entity::class, full_schema: 'Entity') + [
'description' => 'The entity the item belongs to',
'properties' => [
'id' => [
'type' => Doc\Schema::TYPE_INTEGER,
'format' => Doc\Schema::FORMAT_INTEGER_INT64,
],
'name' => [
'type' => Doc\Schema::TYPE_STRING,
],
]
],
'is_deleted' => [
'type' => Doc\Schema::TYPE_BOOLEAN,
Expand Down
18 changes: 18 additions & 0 deletions src/Api/HL/Doc/Schema.php
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,24 @@ public static function getJoins(array $props, string $prefix = '', ?array $paren
}
}
}
if ($prefix === '') {
// Fix parent_join for all joins
foreach ($joins as $join_name => $join) {
if (isset($join['join_parent'])) {
// This join is supposed to have a parent
// The set parent may not be correct currently. The join's parent may in fact be an ancestor of the one set
// We need to check if the current parent exists in the list of joins. If not, we need to find the correct parent by walking up the tree
$parent = $join['join_parent'];
while ($parent !== '') {
if (isset($joins[$parent])) {
$joins[$join_name]['join_parent'] = $parent;
break;
}
$parent = substr($parent, 0, strrpos($parent, chr(0x1F)));
}
}
}
}
return $joins;
}

Expand Down
1 change: 1 addition & 0 deletions src/Api/HL/GraphQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ public static function processRequest(Request $request): array
}
);
} catch (\Throwable $e) {
trigger_error("Error processing GraphQL request: {$e->getMessage()}", E_USER_WARNING);
return [];
}
return $result->toArray();
Expand Down
3 changes: 0 additions & 3 deletions src/Api/HL/GraphQLGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,6 @@ private function loadTypes()
{
$component_schemas = OpenAPIGenerator::getComponentSchemas();
foreach ($component_schemas as $schema_name => $schema) {
if (!isset($schema['x-itemtype'])) {
continue;
}
$new_types = $this->getTypesForSchema($schema_name, $schema);
foreach ($new_types as $type_name => $type) {
$this->types[$type_name] = $type;
Expand Down
Loading
Loading