Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/23/18 14:00:03 (6 years ago)
Author:
jzenisek
Message:

#2839

  • adapted handling of cascading revocations of project-user permissions and project-resource assignments: from deleting all AssignedJobResource (formerly) to deleting only entries which are effected by the previously mentioned revocations (now)
  • implemented job update (client side)
  • corrected & improved stateful project/resource selection dialog
  • corrected resource statistic calculation in project/resource selection dialog
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs

    r15627 r15642  
    7272    private string currentSearchString;
    7373
     74    private void resetHiveResourceSelector() {
     75      lastSelectedProject = null;
     76      selectedProject = null;
     77      projectId = null;
     78    }
     79
    7480    private Guid jobId;
    7581    public Guid JobId {
     
    7884        if (jobId == value) return;
    7985        jobId = value;
     86        resetHiveResourceSelector();
    8087      }
    8188    }
     
    99106    }
    100107
    101     public bool ChangedProject {
    102       get {
    103         return (selectedProject == null || selectedProject.Id == projectId) ? false : true;
     108    private IEnumerable<Guid> selectedResourceIds;
     109    public IEnumerable<Guid> SelectedResourceIds {
     110      get { return selectedResourceIds; }
     111      set {
     112        if (selectedResourceIds == value) return;
     113        selectedResourceIds = value;
    104114      }
    105115    }
     
    128138        selectedProject = value;
    129139        UpdateResourceTree();
     140        ExtractStatistics();
    130141        OnSelectedProjectChanged();
    131142      }
    132143    }
     144
    133145    public IEnumerable<Resource> AssignedResources {
    134146      get { return newAssignedResources; }
     
    142154    }
    143155
     156
    144157    public new IItemList<Project> Content {
    145158      get { return (IItemList<Project>)base.Content; }
     
    164177        UpdateResourceGenealogy();
    165178       
    166         if (SelectedProjectId.HasValue) {
     179        if (SelectedProjectId.HasValue && SelectedProjectId.Value != Guid.Empty) {
    167180          SelectedProject = GetSelectedProjectById(SelectedProjectId.Value);
    168181        } else {
    169182          SelectedProject = null;
    170183        }
     184        //ExtractStatistics();
    171185        UpdateProjectTree();
    172186
    173187      } else {
     188        lastSelectedProject = null;
     189        selectedProject = null;
     190        selectedProjectId = null;
    174191        projectsTreeView.Nodes.Clear();
    175192        resourcesTreeView.Nodes.Clear();
     
    183200      projectsTreeView.Nodes.Clear();
    184201      resourcesTreeView.Nodes.Clear();
    185       //SelectedProject = null;
    186202    }
    187203
     
    213229        }
    214230
    215         SelectedProject = node;
    216       }
    217 
    218       ExtractStatistics();
     231       
     232      }
     233      SelectedProject = node;
     234      //ExtractStatistics();
    219235    }
    220236
     
    243259
    244260      UpdateNewResourceTree();
     261      ExtractStatistics();
    245262      //ExtractStatistics((Resource)resourcesTreeView.SelectedNode?.Tag);
    246263      OnAssignedResourcesChanged();
     
    483500        }
    484501      }
    485       ExtractStatistics();
     502      //ExtractStatistics();
    486503      //OnAssignedResourcesChanged();
    487504    }
    488505
    489506    private void UpdateAssignedResources() {
    490 
    491       if (JobId == Guid.Empty && ChangedProjectSelection) { // new, unchanged jobs get all avaialable resources
     507      assignedResources.Clear();
     508      newAssignedResources.Clear();
     509
     510      if (JobId == Guid.Empty || JobId == null) { // new, unchanged jobs get all avaialable resources
    492511        // update new assigned resources
    493         assignedResources.Clear();
    494         newAssignedResources.Clear();
    495         foreach (var resource in availableResources
    496           .Where(x => !x.ParentResourceId.HasValue
    497           || !availableResources.Select(y => y.Id).Contains(x.ParentResourceId.Value))) {
    498           newAssignedResources.Add(resource);
    499         }
    500 
    501       } else if(JobId != Guid.Empty) { // existent, unchanged jobs get all assigned resources
     512        if(selectedResourceIds == null) {
     513          foreach (var resource in availableResources
     514            .Where(x => !x.ParentResourceId.HasValue
     515            || !availableResources.Select(y => y.Id).Contains(x.ParentResourceId.Value))) {
     516            newAssignedResources.Add(resource);
     517          }
     518        } else {
     519          foreach(var resource in availableResources.Where(x => selectedResourceIds.Contains(x.Id))) {
     520            newAssignedResources.Add(resource);
     521          }
     522        }
     523      } else { // existent, unchanged jobs get all assigned resources
    502524        // update assigned resources
    503525        var assignedJobResources = GetAssignedResourcesForJob(JobId);
    504526        foreach (var resource in assignedJobResources) {
    505527          assignedResources.Add(resource);
    506         }
    507 
    508         if(ChangedProjectSelection) {
    509           newAssignedResources.Clear();
    510           foreach (var resource in assignedJobResources) {
     528          if (selectedResourceIds == null) {
    511529            newAssignedResources.Add(resource);
    512530          }
    513531        }
    514       } else {
    515         var newAssignedResourceIds = newAssignedResources.Select(x => x.Id).ToList();
    516         newAssignedResources.Clear();
    517         foreach(var r in availableResources.Where(x => newAssignedResourceIds.Contains(x.Id))) {
    518           newAssignedResources.Add(r);
    519         }
    520       }
    521 
    522       ExtractStatistics();
     532
     533        if(selectedResourceIds != null) {
     534          foreach (var resource in availableResources.Where(x => selectedResourceIds.Contains(x.Id))) {
     535            newAssignedResources.Add(resource);
     536          }
     537        }
     538      }
     539
     540      //ExtractStatistics();
    523541      OnAssignedResourcesChanged();
    524542    }
     
    535553      includedResources.Clear();
    536554      newIncludedResources.Clear();
     555
    537556      if (JobId != Guid.Empty) {
    538557        foreach (var item in assignedResources) {
    539558          foreach (var descendant in resourceDescendants[item.Id]) {
    540559            includedResources.Add(descendant);
    541             newIncludedResources.Add(descendant);
    542           }
    543         }
    544       } else {
    545         foreach (var item in newAssignedResources) {
    546           foreach (var descendant in resourceDescendants[item.Id]) {
    547             newIncludedResources.Add(descendant);
    548           }
     560          }
     561        }
     562      }
     563
     564      foreach (var item in newAssignedResources) {
     565        foreach (var descendant in resourceDescendants[item.Id]) {
     566          newIncludedResources.Add(descendant);
    549567        }
    550568      }
     
    722740    }
    723741
    724     private void ExtractStatistics(Resource resource = null) {
    725       ISet<Slave> selectedSlaves = null;
     742    private void ExtractStatistics(Resource resource = null) {
     743      HashSet<Slave> newAssignedSlaves = new HashSet<Slave>(newAssignedResources.OfType<Slave>());
     744      foreach (var slaveGroup in newAssignedResources.OfType<SlaveGroup>()) {
     745        foreach(var slave in resourceDescendants[slaveGroup.Id].OfType<Slave>()) {
     746          newAssignedSlaves.Add(slave);
     747        }
     748      }
     749
     750      HashSet<Slave> selectedSlaves = null;
    726751
    727752      if (resource != null) {
    728 
    729 
    730753        var slaveGroup = resource as SlaveGroup;
    731754        if (slaveGroup != null) {
    732755          selectedSlaves = new HashSet<Slave>(resourceDescendants[slaveGroup.Id].OfType<Slave>());
    733           selectedSlaves.IntersectWith(newAssignedResources.OfType<Slave>());
     756          //selectedSlaves.IntersectWith(newAssignedSlaves);
    734757        } else {
    735758          selectedSlaves = new HashSet<Slave>(new[] { resource as Slave });
    736759        }
    737760      } else {
    738         selectedSlaves = new HashSet<Slave>(newAssignedResources.OfType<Slave>());
    739       }
    740 
    741       int sumCores = selectedSlaves.OfType<Slave>().Sum(x => x.Cores.GetValueOrDefault());
    742       int sumFreeCores = selectedSlaves.OfType<Slave>().Sum(x => x.FreeCores.GetValueOrDefault());
    743       double sumMemory = selectedSlaves.OfType<Slave>().Sum(x => x.Memory.GetValueOrDefault()) / 1024.0;
    744       double sumFreeMemory = selectedSlaves.OfType<Slave>().Sum(x => x.FreeMemory.GetValueOrDefault()) / 1024.0;
     761        selectedSlaves = newAssignedSlaves;
     762      }
     763
     764      int sumCores = selectedSlaves.Sum(x => x.Cores.GetValueOrDefault());
     765      int sumFreeCores = selectedSlaves.Sum(x => x.FreeCores.GetValueOrDefault());
     766      double sumMemory = selectedSlaves.Sum(x => x.Memory.GetValueOrDefault()) / 1024.0;
     767      double sumFreeMemory = selectedSlaves.Sum(x => x.FreeMemory.GetValueOrDefault()) / 1024.0;
    745768
    746769      coresSummaryLabel.Text = $"{sumCores} Total ({sumFreeCores} Free / {sumCores - sumFreeCores} Used)";
     
    760783    }
    761784
    762     private void ExtractStatistics_Old(Resource resource = null) {
    763       ISet<Slave> selectedSlaves = null;
    764 
    765       if (resource != null) {
    766         var slaveGroup = resource as SlaveGroup;
    767         if (slaveGroup != null) {
    768           var children = new HashSet<Resource>(availableResources.Where(x => x.ParentResourceId == slaveGroup.Id));
    769           int nrOfChildren = children.Count;
    770           do {
    771             var newChildren = availableResources.Where(x => children.Any(y => y.Id == x.ParentResourceId));
    772             foreach (var newChild in newChildren)
    773               children.Add(newChild);
    774           } while (children.Count > nrOfChildren);
    775           selectedSlaves = new HashSet<Slave>(children.OfType<Slave>());
    776           selectedSlaves.IntersectWith(assignedResources.OfType<Slave>());
    777         } else {
    778           selectedSlaves = new HashSet<Slave>(new[] { resource as Slave });
    779         }
    780       } else {
    781         selectedSlaves = new HashSet<Slave>(assignedResources.OfType<Slave>());
    782       }
    783 
    784       int sumCores = selectedSlaves.OfType<Slave>().Sum(x => x.Cores.GetValueOrDefault());
    785       int sumFreeCores = selectedSlaves.OfType<Slave>().Sum(x => x.FreeCores.GetValueOrDefault());
    786       double sumMemory = selectedSlaves.OfType<Slave>().Sum(x => x.Memory.GetValueOrDefault()) / 1024.0;
    787       double sumFreeMemory = selectedSlaves.OfType<Slave>().Sum(x => x.FreeMemory.GetValueOrDefault()) / 1024.0;
    788 
    789       coresSummaryLabel.Text = $"{sumCores} Total ({sumFreeCores} Free / {sumCores - sumFreeCores} Used)";
    790       memorySummaryLabel.Text = $"{sumMemory:0.00} GB Total ({sumFreeMemory:0.00} GB Free / {(sumMemory - sumFreeMemory):0.00} GB Used)";
    791     }
    792 
    793     private Resource BuildResourceTree_Old(IEnumerable<Resource> resources) {
    794       resourcesTreeView.Nodes.Clear();
    795       if (!resources.Any()) return null;
    796 
    797       var mainResources = new HashSet<Resource>(resources.Where(x => x.ParentResourceId == null));
    798       var subResources = new HashSet<Resource>(resources.Except(mainResources));
    799 
    800       var stack = new Stack<Resource>(mainResources.OrderByDescending(x => x.Name));
    801       var top = stack.Peek();
    802 
    803       TreeNode currentNode = null;
    804       Resource currentResource = null;
    805 
    806       while (stack.Any()) {
    807         var newResource = stack.Pop();
    808         var newNode = new TreeNode(newResource.Name) {
    809           Checked = true,
    810           ImageIndex = newResource is Slave ? slaveImageIndex : slaveGroupImageIndex,
    811           Tag = newResource
    812         };
    813 
    814         while (currentNode != null && newResource.ParentResourceId != currentResource.Id) {
    815           currentNode = currentNode.Parent;
    816           currentResource = currentNode == null ? null : (Resource)currentNode.Tag;
    817         }
    818 
    819         if (currentNode == null) {
    820           resourcesTreeView.Nodes.Add(newNode);
    821         } else {
    822           currentNode.Nodes.Add(newNode);
    823         }
    824 
    825         newNode.SelectedImageIndex = newNode.ImageIndex;
    826 
    827         var childResources = subResources.Where(x => x.ParentResourceId == newResource.Id);
    828         if (childResources.Any()) {
    829           foreach (var resource in childResources.OrderByDescending(x => x.Name)) {
    830             subResources.Remove(resource);
    831             stack.Push(resource);
    832           }
    833           currentNode = newNode;
    834           currentResource = newResource;
    835         }
    836       }
    837 
    838       resourcesTreeView.ExpandAll();
    839 
    840       return top;
    841     }
    842 
    843785    #endregion
    844786
Note: See TracChangeset for help on using the changeset viewer.