Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/04/12 14:48:55 (12 years ago)
Author:
jkarder
Message:

#1859:

  • added permission management support
  • extended administartion user interface
  • minor code improvements
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs

    r7259 r7951  
    2121
    2222using System;
     23using System.Collections.Generic;
    2324using System.Drawing;
    2425using System.Linq;
     
    2728using System.Threading.Tasks;
    2829using System.Windows.Forms;
     30using HeuristicLab.Clients.Access;
    2931using HeuristicLab.Clients.Hive.Views;
    3032using HeuristicLab.Core;
     
    4547    private const int slaveImageIndex = 0;
    4648    private const int slaveGroupImageIndex = 1;
     49    private readonly Color ownedResourceColor = Color.LightGreen;
    4750    private TS.Task progressTask;
    4851    private bool stopProgressTask;
     52    private bool currentlyAuthorized;
    4953
    5054
     
    5660      HiveAdminClient.Instance.Refreshing += new EventHandler(Instance_Refreshing);
    5761      HiveAdminClient.Instance.Refreshed += new EventHandler(Instance_Refreshed);
     62
     63      Access.AccessClient.Instance.Refreshing += new EventHandler(Content_Refreshing);
     64      Access.AccessClient.Instance.Refreshed += new EventHandler(Content_Refreshed);
    5865    }
    5966
     
    6168      HiveAdminClient.Instance.Refreshing -= new EventHandler(Instance_Refreshing);
    6269      HiveAdminClient.Instance.Refreshed -= new EventHandler(Instance_Refreshed);
     70
     71      Access.AccessClient.Instance.Refreshing -= new EventHandler(Content_Refreshing);
     72      Access.AccessClient.Instance.Refreshed -= new EventHandler(Content_Refreshed);
    6373    }
    6474
     
    8797      progressTask = new TS.Task(UpdateProgress);
    8898      progressTask.Start();
     99      SetEnabledStateOfControls(false);
    89100    }
    90101
    91102    void Instance_Refreshed(object sender, EventArgs e) {
    92103      stopProgressTask = true;
     104      SetEnabledStateOfControls(true);
     105    }
     106
     107    void Content_Refreshing(object sender, EventArgs e) {
     108      stopProgressTask = false;
     109      progressTask = new TS.Task(UpdateProgress);
     110      progressTask.Start();
     111      SetEnabledStateOfControls(false);
     112    }
     113
     114    void Content_Refreshed(object sender, EventArgs e) {
     115      stopProgressTask = true;
     116      SetEnabledStateOfControls(true);
    93117    }
    94118
     
    110134      if (Content == null) {
    111135        slaveView.Content = null;
     136        scheduleView.Content = null;
     137        permissionView.Content = null;
     138        permissionView.FetchSelectedUsers = null;
    112139        treeSlaveGroup.Nodes.Clear();
    113140      } else {
     141        permissionView.Content = Access.AccessClient.Instance;
    114142        treeSlaveGroup.Nodes.Clear();
    115143
     
    134162              tn.Tag = g;
    135163              tn.Text = g.Name;
     164              if (g.OwnerUserId == Access.UserInformation.Instance.User.Id) tn.BackColor = ownedResourceColor;
    136165
    137166              BuildSlaveGroupTree(g, tn);
     
    144173              stn.SelectedImageIndex = stn.ImageIndex;
    145174              stn.Tag = g;
     175              if (g.OwnerUserId == Access.UserInformation.Instance.User.Id) stn.BackColor = ownedResourceColor;
    146176              ungrp.Nodes.Add(stn);
    147177            }
     
    162192        stn.SelectedImageIndex = stn.ImageIndex;
    163193        stn.Tag = r;
     194        if (r.OwnerUserId == Access.UserInformation.Instance.User.Id) stn.BackColor = ownedResourceColor;
    164195        tn.Nodes.Add(stn);
    165196
     
    174205        btnRemoveGroup.Enabled = false;
    175206        btnSave.Enabled = false;
     207        btnPermissionsSave.Enabled = false;
     208        permissionView.Enabled = false;
    176209      } else {
    177210        btnAddGroup.Enabled = true;
     
    181214    }
    182215
    183     private void treeSlaveGroup_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
    184       if (slaveView.Content != null && slaveView.Content is SlaveGroup) {
    185         slaveView.Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
    186       }
    187 
    188       slaveView.Content = (Resource)e.Node.Tag;
    189       HiveAdminClient.Instance.DowntimeForResourceId = ((Resource)e.Node.Tag).Id;
    190 
    191       if (e.Node.Tag is SlaveGroup) {
    192         slaveView.Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
    193       }
    194 
    195       if (tabSlaveGroup.SelectedIndex == 1) {
    196         UpdateScheduleAsync();
     216    public virtual void SetEnabledStateOfControls(bool state) {
     217      if (InvokeRequired) {
     218        Invoke(new Action(() => SetEnabledStateOfControls(state)));
     219      } else {
     220        if (Content == null) state = false;
     221        btnAddGroup.Enabled = state;
     222        btnRemoveGroup.Enabled = state;
     223        btnSave.Enabled = state;
     224        scheduleView.SetEnabledStateOfControls(state && IsAuthorized(slaveView.Content));
     225        btnPermissionsSave.Enabled = state && permissionView.FetchSelectedUsers != null && Content != null;
     226        permissionView.Enabled = state && permissionView.FetchSelectedUsers != null && Content != null;
     227      }
     228    }
     229
     230    private bool IsAuthorized(Resource resource) {
     231      return resource != null
     232          && resource.Name != UngroupedGroupName
     233          && resource.Id != Guid.Empty
     234          && HiveServiceLocator.Instance.CallHiveService<bool>(service => { return service.AuthorizesForResourceAdministration(resource.Id); });
     235    }
     236
     237    private void treeSlaveGroup_AfterSelect(object sender, TreeViewEventArgs e) {
     238      if (e.Action != TreeViewAction.Unknown) {
     239        Resource selectedResource = ((Resource)e.Node.Tag);
     240        currentlyAuthorized = IsAuthorized(selectedResource);
     241        if (currentlyAuthorized) {
     242          permissionView.FetchSelectedUsers = new Func<List<Guid>>(() => {
     243            return HiveServiceLocator.Instance.CallHiveService<List<ResourcePermission>>(service => {
     244              return service.GetResourcePermissions(selectedResource.Id);
     245            }).Select(x => x.GrantedUserId).ToList();
     246          });
     247          if (!tabSlaveGroup.TabPages.Contains(tabPermissions)) tabSlaveGroup.TabPages.Add(tabPermissions);
     248        } else {
     249          permissionView.FetchSelectedUsers = null;
     250          btnPermissionsSave.Enabled = false;
     251          if (selectedResource.Id == Guid.Empty) {
     252            if (!tabSlaveGroup.TabPages.Contains(tabPermissions)) tabSlaveGroup.TabPages.Add(tabPermissions);
     253          } else tabSlaveGroup.TabPages.Remove(tabPermissions);
     254        }
     255
     256        if (slaveView.Content != null && slaveView.Content is SlaveGroup) {
     257          slaveView.Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
     258        }
     259
     260        slaveView.Content = selectedResource;
     261        HiveAdminClient.Instance.DowntimeForResourceId = selectedResource.Id;
     262
     263        if (selectedResource is SlaveGroup) {
     264          slaveView.Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
     265        }
     266
     267        if (tabSlaveGroup.SelectedIndex == 1) {
     268          UpdateScheduleAsync();
     269        } else if (tabSlaveGroup.SelectedIndex == 2) {
     270          UpdatePermissionsAsync();
     271        }
    197272      }
    198273    }
     
    217292      SlaveGroup newGroup = new SlaveGroup();
    218293      newGroup.Name = "New Group";
     294      newGroup.OwnerUserId = UserInformation.Instance.User.Id;
    219295      Content.Add(newGroup);
    220296    }
     
    269345        if (destNode.TreeView == newNode.TreeView) {
    270346          if (destNode.Text == UngroupedGroupName || (destNode.Parent != null && destNode.Parent.Text == UngroupedGroupName)) {
    271             MessageBox.Show(String.Format("You can't drag items to the {0} group.{1}This group only contains slaves which haven't yet been assigned to a real group.",
     347            MessageBox.Show(string.Format("You can't drag items to the group \"{0}\".{1}This group only contains slaves which haven't yet been assigned to a real group.",
    272348              UngroupedGroupName, Environment.NewLine), "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Information);
    273349            return;
     
    285361
    286362          if (newNode.Tag is SlaveGroup && CheckParentsEqualsMovedNode(parentNode, newNode)) {
     363            return;
     364          }
     365
     366          SlaveGroup parent = (SlaveGroup)parentNode.Tag;
     367
     368          if (parent.OwnerUserId != null && !IsAuthorized(parent)) {
     369            MessageBox.Show(string.Format("You don't have the permissions to drag items to the group \"{0}\".", ((Resource)parentNode.Tag).Name),
     370              "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Error);
    287371            return;
    288372          }
     
    330414    private void treeSlaveGroup_ItemDrag(object sender, ItemDragEventArgs e) {
    331415      TreeNode sourceNode = (TreeNode)e.Item;
    332       DoDragDrop(sourceNode, DragDropEffects.All);
     416      if (IsAuthorized((Resource)sourceNode.Tag))
     417        DoDragDrop(sourceNode, DragDropEffects.All);
    333418    }
    334419
     
    403488    private void UpdateSchedule() {
    404489      HiveAdminClient.Instance.RefreshCalendar();
    405       scheduleView.Invoke(new Action(() => scheduleView.Content = HiveAdminClient.Instance.Downtimes));
     490      scheduleView.Invoke(new Action(() => {
     491        scheduleView.Content = HiveAdminClient.Instance.Downtimes;
     492        SetEnabledStateOfControls(currentlyAuthorized);
     493      }));
    406494    }
    407495
     
    412500    }
    413501
     502    private void UpdatePermissions() {
     503      if (permissionView.Content != null && permissionView.FetchSelectedUsers != null)
     504        permissionView.Invoke(new Action(() => permissionView.ManualRefresh()));
     505    }
     506
     507    private void UpdatePermissionsAsync() {
     508      TS.Task.Factory.StartNew(UpdatePermissions).ContinueWith((t) => {
     509        DisplayError(t.Exception);
     510      }, TaskContinuationOptions.OnlyOnFaulted);
     511    }
     512
     513
    414514    private void DisplayError(Exception ex) {
    415515      MessageBox.Show(string.Format("An error occured while updating: {0} {1}", Environment.NewLine, ex.Message), "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Error);
     
    419519      if (tabSlaveGroup.SelectedIndex == 1) {
    420520        UpdateScheduleAsync();
     521      } else if (tabSlaveGroup.SelectedIndex == 2) {
     522        UpdatePermissionsAsync();
    421523      }
    422524    }
     
    429531      UpdateResourcesAsync();
    430532    }
     533
     534    private void btnPermissionsSave_Click(object sender, EventArgs e) {
     535      SetEnabledStateOfControls(false);
     536      HiveServiceLocator.Instance.CallHiveService(service => {
     537        service.GrantResourcePermissions(((Resource)treeSlaveGroup.SelectedNode.Tag).Id, permissionView.GetAddedUsers().Select(x => x.Id).ToList());
     538        service.RevokeResourcePermissions(((Resource)treeSlaveGroup.SelectedNode.Tag).Id, permissionView.GetDeletedUsers().Select(x => x.Id).ToList());
     539      });
     540      SetEnabledStateOfControls(true);
     541    }
    431542  }
    432543}
Note: See TracChangeset for help on using the changeset viewer.