hi,
oh, I forgot to tell, that I was testing with the current stable release
(0.72.3).
I had a short look at the code. For that case, recursive software is
just ignored.
I created a patch to correct this (for 0.72.3).
(ok, it got bigger than I thought ;) I only wanted to reach all possible
cases)
Can some one test it?
greetings,
Bernhard
On Thu, 2009-12-10 at 09:04 +0100, Bernhard Denner wrote:
> Hi,
>
> I have a small problem with the sync process of OCS -> GLPI.
>
> We have our inventory split in several entities (different sites). If I
> import some software packages from OCS, for example "7-Zip 0.47", GLPI
> creates a software "7-Zip 0.47" in every entity.
> So I tried to first create an software package with that name in the
> parent entity and set the "recursive" flag (-> so the software is
> visible for all child entities too).
> But if I sync with OCS again it recreates software packages in every
> entity. It seems, that GLPI does not recognize, that there is already a
> software package visible with that name.
>
> As the license management is done in our site (corresponding to the
> parent entity), I don't want to have different software entries for the
> different sites/entities.
>
> Is GLPI behaving in this case a designed, or is it just a bug?
>
> greetings
> Bernhard
>
>
>
> _______________________________________________
> Glpi-dev mailing list
> [email protected]
> https://mail.gna.org/listinfo/glpi-dev
diff -Bru /tmp/glpi/inc/ocsng.function.php glpi/inc/ocsng.function.php
--- /tmp/glpi/inc/ocsng.function.php 2009-10-27 18:18:21.000000000 +0100
+++ glpi/inc/ocsng.function.php 2009-12-10 18:45:21.000000000 +0100
@@ -3035,7 +3035,7 @@
//---- The software doesn't exists in this version for this computer -----//
//----------------------------------------------------------------------------------------------------------------//
- $isNewSoft= addSoftwareOrRestoreFromTrash($modified_name,$manufacturer,$entity);
+ $isNewSoft= addSoftwareOrRestoreFromTrash($modified_name,$manufacturer,$entity, '', 1);
//Import version for this software
$versionID = ocsImportVersion($isNewSoft,$modified_version);
diff -Bru /tmp/glpi/inc/software.function.php glpi/inc/software.function.php
--- /tmp/glpi/inc/software.function.php 2009-10-27 18:18:21.000000000 +0100
+++ glpi/inc/software.function.php 2009-12-10 18:42:57.000000000 +0100
@@ -1369,22 +1369,70 @@
* @param manufacturer the software's manufacturer
* @param entity the entity in which the software must be added
* @param comments comments
+ * @param recursive also check for recursive software before adding
*/
-function addSoftwareOrRestoreFromTrash($name,$manufacturer,$entity,$comments='') {
+function addSoftwareOrRestoreFromTrash($name,$manufacturer,$entity,$comments='',$recursive=0) {
global $DB;
//Look for the software by his name in GLPI for a specific entity
- $query_search = "SELECT glpi_software.ID as ID, glpi_software.deleted as deleted
+ $query_search = "SELECT glpi_software.ID as ID,
+ glpi_software.deleted as deleted,
+ glpi_software.FK_entities as FK_entities,
+ glpi_software.recursive as recursive
FROM glpi_software
- WHERE name = '".$name."' AND is_template='0' AND FK_entities='".$entity."'";
+ WHERE name = '".$name."' AND
+ is_template='0' AND ";
+
+ if ($recursive) {
+ $query_search .= "(FK_entities='".$entity."' OR recursive = '1')
+ ORDER BY recursive";
+ } else {
+ $query_search .= "FK_entities='".$entity."'";
+ }
+
$result_search = $DB->query($query_search);
if ($DB->numrows($result_search) > 0) {
- //Software already exists for this entity, get his ID
- $data = $DB->fetch_array($result_search);
- $ID = $data["ID"];
-
- // restore software
- if ($data['deleted'])
- removeSoftwareFromTrash($ID);
+ $anchestor_levels = NULL;
+ $best = NULL;
+ $best_level = -1;
+ while ($data = $DB->fetch_array($result_search)) {
+ // if we find a non recursive software, it is in the specified entity
+ // or the software in this entity is a recursive one
+ // -> we prefer this one
+ if ($data['recursive'] == 0 || $data['FK_entities'] == $entity) {
+ $best = $data;
+ break;
+ }
+
+ // if we are looking for a recursive software, we calculate the levels of
+ // the anchestors of this entity (needed to choose the software with the closesed anchestor entity)
+ if (is_null($anchestor_levels)) {
+ $a = getEntityAncestors($entity);
+ $a[$entity] = $entity;
+ foreach ($a as $e) {
+ $anchestor_levels[$e] = count(getEntityAncestors($e));
+ }
+ }
+
+ // if this software is in an anchestor entity and it is closer as the current best one
+ // we make this software the best one
+ if (in_array($data['FK_entities'], getEntityAncestors($entity)) &&
+ $anchestor_levels[$data['FK_entities']] > $best_level)
+ {
+ $best_level = $anchestor_levels[$data['FK_entities']];
+ $best = $data;
+ }
+ }
+ if (!is_null($best)) {
+ $data = $best;
+ //Software already exists for this entity, get his ID
+ $ID = $data["ID"];
+
+ // restore software
+ if ($data['deleted'])
+ removeSoftwareFromTrash($ID);
+ } else {
+ $ID = 0;
+ }
} else {
$ID = 0;
}
_______________________________________________
Glpi-dev mailing list
[email protected]
https://mail.gna.org/listinfo/glpi-dev