Feature: Job Queues

Also UI style, theme and element changes
This commit is contained in:
Gary Sharp
2014-02-03 14:50:08 +11:00
parent bdb3e1e6b4
commit 3f63281dc4
212 changed files with 17334 additions and 5441 deletions
@@ -1,4 +1,4 @@
using Disco.Models.Authorization;
using Disco.Models.Services.Authorization;
using Disco.Models.Repository;
using Disco.Services.Authorization.Roles;
using System;
@@ -1,4 +1,4 @@
using Disco.Models.Authorization;
using Disco.Models.Services.Authorization;
using Disco.Services.Authorization.Roles;
using System;
using System.Collections.Generic;
+244 -82
View File
@@ -5,7 +5,7 @@
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten. Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.
using Disco.Models.Authorization;
using Disco.Models.Services.Authorization;
using Disco.Models.Repository;
using Disco.Services.Authorization.Roles;
using System;
@@ -68,6 +68,10 @@ namespace Disco.Services.Authorization
{ "Config.Organisation.Show", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.Organisation.Show, (c, v) => c.Config.Organisation.Show = v, "Show Organisation Details", "Can show the organisation details", false) },
{ "Config.JobPreferences.Configure", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.JobPreferences.Configure, (c, v) => c.Config.JobPreferences.Configure = v, "Configure Job Preferences", "Can configure job preferences", false) },
{ "Config.JobPreferences.Show", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.JobPreferences.Show, (c, v) => c.Config.JobPreferences.Show = v, "Show Job Preferences", "Can show job preferences", false) },
{ "Config.JobQueue.Configure", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.JobQueue.Configure, (c, v) => c.Config.JobQueue.Configure = v, "Configure Job Queues", "Can configure job queues", false) },
{ "Config.JobQueue.Create", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.JobQueue.Create, (c, v) => c.Config.JobQueue.Create = v, "Create Job Queues", "Can create job queues", false) },
{ "Config.JobQueue.Delete", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.JobQueue.Delete, (c, v) => c.Config.JobQueue.Delete = v, "Delete Job Queues", "Can delete job queues", false) },
{ "Config.JobQueue.Show", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.JobQueue.Show, (c, v) => c.Config.JobQueue.Show = v, "Show Job Queues", "Can show job queues", false) },
{ "Config.Show", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Config.Show, (c, v) => c.Config.Show = v, "Show Configuration", "Can show the configuration menu", false) },
{ "Job.Lists.AllOpen", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.AllOpen, (c, v) => c.Job.Lists.AllOpen = v, "All Open List", "Can show list", false) },
{ "Job.Lists.AwaitingFinanceAgreementBreach", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.AwaitingFinanceAgreementBreach, (c, v) => c.Job.Lists.AwaitingFinanceAgreementBreach = v, "Awaiting Finance Agreement Breach List", "Can show list (NOTE: Requires Awaiting Finance List)", false) },
@@ -79,11 +83,16 @@ namespace Disco.Services.Authorization
{ "Job.Lists.AwaitingUserAction", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.AwaitingUserAction, (c, v) => c.Job.Lists.AwaitingUserAction = v, "Awaiting User Action List", "Can show list", false) },
{ "Job.Lists.DevicesAwaitingRepair", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.DevicesAwaitingRepair, (c, v) => c.Job.Lists.DevicesAwaitingRepair = v, "Devices Awaiting Repair List", "Can show list", false) },
{ "Job.Lists.DevicesReadyForReturn", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.DevicesReadyForReturn, (c, v) => c.Job.Lists.DevicesReadyForReturn = v, "Devices Ready For Return List", "Can show list", false) },
{ "Job.Lists.JobQueueLists", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.JobQueueLists, (c, v) => c.Job.Lists.JobQueueLists = v, "Job Queue Lists", "Can show job queue lists", false) },
{ "Job.Lists.Locations", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.Locations, (c, v) => c.Job.Lists.Locations = v, "Locations List", "Can show list", false) },
{ "Job.Lists.LongRunningJobs", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.LongRunningJobs, (c, v) => c.Job.Lists.LongRunningJobs = v, "Long Running Jobs List", "Can show list", false) },
{ "Job.Lists.MyJobs", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.MyJobs, (c, v) => c.Job.Lists.MyJobs = v, "My Jobs List", "Can show list", false) },
{ "Job.Lists.MyJobsOrphaned", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.MyJobsOrphaned, (c, v) => c.Job.Lists.MyJobsOrphaned = v, "My Jobs List (Includes No Queue)", "Can show list", false) },
{ "Job.Lists.RecentlyClosed", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Lists.RecentlyClosed, (c, v) => c.Job.Lists.RecentlyClosed = v, "Recently Closed List", "Can show list", false) },
{ "Job.Actions.AddAttachments", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.AddAttachments, (c, v) => c.Job.Actions.AddAttachments = v, "Add Attachments", "Can add attachments to jobs", false) },
{ "Job.Actions.AddLogs", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.AddLogs, (c, v) => c.Job.Actions.AddLogs = v, "Add Logs", "Can add job logs", false) },
{ "Job.Actions.AddAnyQueues", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.AddAnyQueues, (c, v) => c.Job.Actions.AddAnyQueues = v, "Add to Any Queues", "Can add to any job queues", false) },
{ "Job.Actions.AddOwnQueues", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.AddOwnQueues, (c, v) => c.Job.Actions.AddOwnQueues = v, "Add to Own Queues", "Can add to own job queues", false) },
{ "Job.Actions.Close", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.Close, (c, v) => c.Job.Actions.Close = v, "Close Jobs", "Can close jobs", false) },
{ "Job.Actions.ConvertHWarToHNWar", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.ConvertHWarToHNWar, (c, v) => c.Job.Actions.ConvertHWarToHNWar = v, "Convert HWar Jobs To HNWar", "Can convert warranty jobs to non-warranty jobs", false) },
{ "Job.Actions.Create", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.Create, (c, v) => c.Job.Actions.Create = v, "Create Jobs", "Can create jobs", false) },
@@ -94,6 +103,8 @@ namespace Disco.Services.Authorization
{ "Job.Actions.LogWarranty", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.LogWarranty, (c, v) => c.Job.Actions.LogWarranty = v, "Log Warranty", "Can log warranty for jobs", false) },
{ "Job.Actions.RemoveAnyAttachments", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.RemoveAnyAttachments, (c, v) => c.Job.Actions.RemoveAnyAttachments = v, "Remove Any Attachments", "Can remove any attachments from jobs", false) },
{ "Job.Actions.RemoveAnyLogs", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.RemoveAnyLogs, (c, v) => c.Job.Actions.RemoveAnyLogs = v, "Remove Any Logs", "Can remove any job logs", false) },
{ "Job.Actions.RemoveAnyQueues", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.RemoveAnyQueues, (c, v) => c.Job.Actions.RemoveAnyQueues = v, "Remove from Any Queues", "Can remove from any job queues", false) },
{ "Job.Actions.RemoveOwnQueues", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.RemoveOwnQueues, (c, v) => c.Job.Actions.RemoveOwnQueues = v, "Remove from Own Queues", "Can remove from own job queues", false) },
{ "Job.Actions.RemoveOwnAttachments", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.RemoveOwnAttachments, (c, v) => c.Job.Actions.RemoveOwnAttachments = v, "Remove Own Attachments", "Can remove own attachments from jobs", false) },
{ "Job.Actions.RemoveOwnLogs", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.RemoveOwnLogs, (c, v) => c.Job.Actions.RemoveOwnLogs = v, "Remove Own Logs", "Can remove own job logs", false) },
{ "Job.Actions.Reopen", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Actions.Reopen, (c, v) => c.Job.Actions.Reopen = v, "Reopen Jobs", "Can reopen jobs", false) },
@@ -120,6 +131,12 @@ namespace Disco.Services.Authorization
{ "Job.Properties.NonWarrantyProperties.RepairerLoggedDate", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.NonWarrantyProperties.RepairerLoggedDate, (c, v) => c.Job.Properties.NonWarrantyProperties.RepairerLoggedDate = v, "Repairer Logged Date Property", "Can update property", false) },
{ "Job.Properties.NonWarrantyProperties.RepairerName", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.NonWarrantyProperties.RepairerName, (c, v) => c.Job.Properties.NonWarrantyProperties.RepairerName = v, "Repairer Name Property", "Can update property", false) },
{ "Job.Properties.NonWarrantyProperties.RepairerReference", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.NonWarrantyProperties.RepairerReference, (c, v) => c.Job.Properties.NonWarrantyProperties.RepairerReference = v, "Repairer Reference Property", "Can update property", false) },
{ "Job.Properties.JobQueueProperties.EditAnyComments", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.JobQueueProperties.EditAnyComments, (c, v) => c.Job.Properties.JobQueueProperties.EditAnyComments = v, "Edit Any Comments", "Can edit any job queue comments", false) },
{ "Job.Properties.JobQueueProperties.EditAnyPriority", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.JobQueueProperties.EditAnyPriority, (c, v) => c.Job.Properties.JobQueueProperties.EditAnyPriority = v, "Edit Any Priority", "Can edit any job queue Priority", false) },
{ "Job.Properties.JobQueueProperties.EditAnySLA", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.JobQueueProperties.EditAnySLA, (c, v) => c.Job.Properties.JobQueueProperties.EditAnySLA = v, "Edit Any SLA", "Can edit any job queue SLA", false) },
{ "Job.Properties.JobQueueProperties.EditOwnComments", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.JobQueueProperties.EditOwnComments, (c, v) => c.Job.Properties.JobQueueProperties.EditOwnComments = v, "Edit Own Comments", "Can edit own job queue comments", false) },
{ "Job.Properties.JobQueueProperties.EditOwnPriority", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.JobQueueProperties.EditOwnPriority, (c, v) => c.Job.Properties.JobQueueProperties.EditOwnPriority = v, "Edit Own Priority", "Can edit own job queue Priority", false) },
{ "Job.Properties.JobQueueProperties.EditOwnSLA", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.JobQueueProperties.EditOwnSLA, (c, v) => c.Job.Properties.JobQueueProperties.EditOwnSLA = v, "Edit Own SLA", "Can edit own job queue SLA", false) },
{ "Job.Properties.DeviceHeldLocation", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.DeviceHeldLocation, (c, v) => c.Job.Properties.DeviceHeldLocation = v, "Device Held Location Property", "Can update property", false) },
{ "Job.Properties.DeviceHeld", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.DeviceHeld, (c, v) => c.Job.Properties.DeviceHeld = v, "Device Held Property", "Can update property", false) },
{ "Job.Properties.DeviceReadyForReturn", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Properties.DeviceReadyForReturn, (c, v) => c.Job.Properties.DeviceReadyForReturn = v, "Device Ready For Return Property", "Can update property", false) },
@@ -140,6 +157,7 @@ namespace Disco.Services.Authorization
{ "Job.ShowDailyChart", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.ShowDailyChart, (c, v) => c.Job.ShowDailyChart = v, "Show Daily Opened & Closed", "Can show daily opened & closed chart", false) },
{ "Job.ShowFlags", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.ShowFlags, (c, v) => c.Job.ShowFlags = v, "Show Flags", "Can show job flags", false) },
{ "Job.Show", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.Show, (c, v) => c.Job.Show = v, "Show Jobs", "Can show jobs", false) },
{ "Job.ShowJobsQueues", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.ShowJobsQueues, (c, v) => c.Job.ShowJobsQueues = v, "Show Jobs Queues", "Can show jobs queues", false) },
{ "Job.ShowLogs", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.ShowLogs, (c, v) => c.Job.ShowLogs = v, "Show Logs", "Can show job logs", false) },
{ "Job.ShowNonWarrantyComponents", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.ShowNonWarrantyComponents, (c, v) => c.Job.ShowNonWarrantyComponents = v, "Show Non-Warranty Components", "Can show non-warranty job components", false) },
{ "Job.ShowNonWarrantyFinance", new Tuple<Func<RoleClaims, bool>, Action<RoleClaims, bool>, string, string, bool>(c => c.Job.ShowNonWarrantyFinance, (c, v) => c.Job.ShowNonWarrantyFinance = v, "Show Non-Warranty Finance", "Can show non-warranty job finance", false) },
@@ -189,29 +207,23 @@ namespace Disco.Services.Authorization
_claimNavigator =
new ClaimNavigatorItem("Claims", "Permissions", "Top-level node for all permissions", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config", "Configuration", "Permissions related to Disco Configuration", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceCertificate", "Device Certificate", "Permissions related to Device Certificates", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceCertificate.DownloadCertificates", false)
}),
new ClaimNavigatorItem("Config.Enrolment", "Enrolment", "Permissions related to Device Enrolment", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.Enrolment.Configure", false),
new ClaimNavigatorItem("Config.Enrolment.DownloadBootstrapper", false),
new ClaimNavigatorItem("Config.Enrolment.Show", false),
new ClaimNavigatorItem("Config.Enrolment.ShowStatus", false)
}),
new ClaimNavigatorItem("Config.DeviceBatch", "Device Batch", "Permissions related to Device Batches", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceBatch", "Device Batches", "Permissions related to Device Batches", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceBatch.Configure", false),
new ClaimNavigatorItem("Config.DeviceBatch.Create", false),
new ClaimNavigatorItem("Config.DeviceBatch.Delete", false),
new ClaimNavigatorItem("Config.DeviceBatch.Show", false),
new ClaimNavigatorItem("Config.DeviceBatch.ShowTimeline", false)
}),
new ClaimNavigatorItem("Config.DeviceModel", "Device Model", "Permissions related to Device Models", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceCertificate", "Device Certificates", "Permissions related to Device Certificates", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceCertificate.DownloadCertificates", false)
}),
new ClaimNavigatorItem("Config.DeviceModel", "Device Models", "Permissions related to Device Models", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceModel.ConfigureComponents", false),
new ClaimNavigatorItem("Config.DeviceModel.Configure", false),
new ClaimNavigatorItem("Config.DeviceModel.Delete", false),
new ClaimNavigatorItem("Config.DeviceModel.Show", false)
}),
new ClaimNavigatorItem("Config.DeviceProfile", "Device Profile", "Permissions related to Device Profiles", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceProfile", "Device Profiles", "Permissions related to Device Profiles", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DeviceProfile.ConfigureComputerNameTemplate", false),
new ClaimNavigatorItem("Config.DeviceProfile.ConfigureDefaults", false),
new ClaimNavigatorItem("Config.DeviceProfile.Configure", false),
@@ -219,7 +231,7 @@ namespace Disco.Services.Authorization
new ClaimNavigatorItem("Config.DeviceProfile.Delete", false),
new ClaimNavigatorItem("Config.DeviceProfile.Show", false)
}),
new ClaimNavigatorItem("Config.DocumentTemplate", "Document Template", "Permissions related to Document Templates", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DocumentTemplate", "Document Templates", "Permissions related to Document Templates", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.DocumentTemplate.BulkGenerate", false),
new ClaimNavigatorItem("Config.DocumentTemplate.Configure", false),
new ClaimNavigatorItem("Config.DocumentTemplate.ConfigureFilterExpression", false),
@@ -230,20 +242,25 @@ namespace Disco.Services.Authorization
new ClaimNavigatorItem("Config.DocumentTemplate.UndetectedPages", false),
new ClaimNavigatorItem("Config.DocumentTemplate.Upload", false)
}),
new ClaimNavigatorItem("Config.Enrolment", "Enrolment", "Permissions related to Device Enrolment", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.Enrolment.Configure", false),
new ClaimNavigatorItem("Config.Enrolment.DownloadBootstrapper", false),
new ClaimNavigatorItem("Config.Enrolment.Show", false),
new ClaimNavigatorItem("Config.Enrolment.ShowStatus", false)
}),
new ClaimNavigatorItem("Config.JobPreferences", "Job Preferences", "Permissions related to Job Preferences", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.JobPreferences.Configure", false),
new ClaimNavigatorItem("Config.JobPreferences.Show", false)
}),
new ClaimNavigatorItem("Config.JobQueue", "Job Queues", "Permissions related to Job Queues", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.JobQueue.Configure", false),
new ClaimNavigatorItem("Config.JobQueue.Create", false),
new ClaimNavigatorItem("Config.JobQueue.Delete", false),
new ClaimNavigatorItem("Config.JobQueue.Show", false)
}),
new ClaimNavigatorItem("Config.Logging", "Logging", "Permissions related to Logging", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.Logging.Show", false)
}),
new ClaimNavigatorItem("Config.Plugin", "Plugin", "Permissions related to Plugins", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.Plugin.Configure", false),
new ClaimNavigatorItem("Config.Plugin.InstallLocal", false),
new ClaimNavigatorItem("Config.Plugin.Install", false),
new ClaimNavigatorItem("Config.Plugin.Show", false),
new ClaimNavigatorItem("Config.Plugin.Uninstall", false)
}),
new ClaimNavigatorItem("Config.System", "System", "Permissions related to System Configuration", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.System.ConfigureProxy", false),
new ClaimNavigatorItem("Config.System.Show", false)
}),
new ClaimNavigatorItem("Config.Organisation", "Organisation Details", "Permissions related to the Organisation Details", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.Organisation.ConfigureAddresses", false),
new ClaimNavigatorItem("Config.Organisation.ConfigureLogo", false),
@@ -251,31 +268,25 @@ namespace Disco.Services.Authorization
new ClaimNavigatorItem("Config.Organisation.ConfigureName", false),
new ClaimNavigatorItem("Config.Organisation.Show", false)
}),
new ClaimNavigatorItem("Config.JobPreferences", "Job Preferences", "Permissions related to Job Preferences", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.JobPreferences.Configure", false),
new ClaimNavigatorItem("Config.JobPreferences.Show", false)
new ClaimNavigatorItem("Config.Plugin", "Plugin", "Permissions related to Plugins", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.Plugin.Configure", false),
new ClaimNavigatorItem("Config.Plugin.InstallLocal", false),
new ClaimNavigatorItem("Config.Plugin.Install", false),
new ClaimNavigatorItem("Config.Plugin.Show", false),
new ClaimNavigatorItem("Config.Plugin.Uninstall", false)
}),
new ClaimNavigatorItem("Config.Show", false)
new ClaimNavigatorItem("Config.Show", false),
new ClaimNavigatorItem("Config.System", "System", "Permissions related to System Configuration", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Config.System.ConfigureProxy", false),
new ClaimNavigatorItem("Config.System.Show", false)
})
}),
new ClaimNavigatorItem("Job", "Job", "Permissions related to Jobs", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Lists", "Lists", "Permissions related to Job Lists", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Lists.AllOpen", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinanceAgreementBreach", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinanceCharge", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinanceInsuranceProcessing", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinance", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinancePayment", false),
new ClaimNavigatorItem("Job.Lists.AwaitingTechnicianAction", false),
new ClaimNavigatorItem("Job.Lists.AwaitingUserAction", false),
new ClaimNavigatorItem("Job.Lists.DevicesAwaitingRepair", false),
new ClaimNavigatorItem("Job.Lists.DevicesReadyForReturn", false),
new ClaimNavigatorItem("Job.Lists.Locations", false),
new ClaimNavigatorItem("Job.Lists.LongRunningJobs", false),
new ClaimNavigatorItem("Job.Lists.RecentlyClosed", false)
}),
new ClaimNavigatorItem("Job.Actions", "Actions", "Permissions related to Job Actions", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Actions.AddAttachments", false),
new ClaimNavigatorItem("Job.Actions.AddLogs", false),
new ClaimNavigatorItem("Job.Actions.AddAnyQueues", false),
new ClaimNavigatorItem("Job.Actions.AddOwnQueues", false),
new ClaimNavigatorItem("Job.Actions.Close", false),
new ClaimNavigatorItem("Job.Actions.ConvertHWarToHNWar", false),
new ClaimNavigatorItem("Job.Actions.Create", false),
@@ -286,19 +297,27 @@ namespace Disco.Services.Authorization
new ClaimNavigatorItem("Job.Actions.LogWarranty", false),
new ClaimNavigatorItem("Job.Actions.RemoveAnyAttachments", false),
new ClaimNavigatorItem("Job.Actions.RemoveAnyLogs", false),
new ClaimNavigatorItem("Job.Actions.RemoveAnyQueues", false),
new ClaimNavigatorItem("Job.Actions.RemoveOwnQueues", false),
new ClaimNavigatorItem("Job.Actions.RemoveOwnAttachments", false),
new ClaimNavigatorItem("Job.Actions.RemoveOwnLogs", false),
new ClaimNavigatorItem("Job.Actions.Reopen", false),
new ClaimNavigatorItem("Job.Actions.UpdateSubTypes", false)
}),
new ClaimNavigatorItem("Job.Properties", "Job Properties", "Permissions related to Job Properties", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Properties.WarrantyProperties", "Warranty Properties", "Permissions related to Warranty Job Properties", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalCompletedDate", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalLoggedDate", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalName", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalReference", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ProviderDetails", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.WarrantyCompleted", false)
new ClaimNavigatorItem("Job.Properties.DeviceHeldLocation", false),
new ClaimNavigatorItem("Job.Properties.DeviceHeld", false),
new ClaimNavigatorItem("Job.Properties.DeviceReadyForReturn", false),
new ClaimNavigatorItem("Job.Properties.DeviceReturned", false),
new ClaimNavigatorItem("Job.Properties.ExpectedClosedDate", false),
new ClaimNavigatorItem("Job.Properties.Flags", false),
new ClaimNavigatorItem("Job.Properties.JobQueueProperties", "Job Queue Properties", "Permissions related to Job Queue Job Properties", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Properties.JobQueueProperties.EditAnyComments", false),
new ClaimNavigatorItem("Job.Properties.JobQueueProperties.EditAnyPriority", false),
new ClaimNavigatorItem("Job.Properties.JobQueueProperties.EditAnySLA", false),
new ClaimNavigatorItem("Job.Properties.JobQueueProperties.EditOwnComments", false),
new ClaimNavigatorItem("Job.Properties.JobQueueProperties.EditOwnPriority", false),
new ClaimNavigatorItem("Job.Properties.JobQueueProperties.EditOwnSLA", false)
}),
new ClaimNavigatorItem("Job.Properties.NonWarrantyProperties", "Non Warranty Properties", "Permissions related to Non-Warranty Job Properties", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Properties.NonWarrantyProperties.AccountingChargeAdded", false),
@@ -318,15 +337,47 @@ namespace Disco.Services.Authorization
new ClaimNavigatorItem("Job.Properties.NonWarrantyProperties.RepairerName", false),
new ClaimNavigatorItem("Job.Properties.NonWarrantyProperties.RepairerReference", false)
}),
new ClaimNavigatorItem("Job.Properties.DeviceHeldLocation", false),
new ClaimNavigatorItem("Job.Properties.DeviceHeld", false),
new ClaimNavigatorItem("Job.Properties.DeviceReadyForReturn", false),
new ClaimNavigatorItem("Job.Properties.DeviceReturned", false),
new ClaimNavigatorItem("Job.Properties.ExpectedClosedDate", false),
new ClaimNavigatorItem("Job.Properties.Flags", false),
new ClaimNavigatorItem("Job.Properties.NotWaitingForUserAction", false),
new ClaimNavigatorItem("Job.Properties.WaitingForUserAction", false)
new ClaimNavigatorItem("Job.Properties.WaitingForUserAction", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties", "Warranty Properties", "Permissions related to Warranty Job Properties", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalCompletedDate", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalLoggedDate", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalName", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ExternalReference", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.ProviderDetails", false),
new ClaimNavigatorItem("Job.Properties.WarrantyProperties.WarrantyCompleted", false)
})
}),
new ClaimNavigatorItem("Job.Lists", "Lists", "Permissions related to Job Lists", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Lists.AllOpen", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinanceAgreementBreach", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinanceCharge", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinanceInsuranceProcessing", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinance", false),
new ClaimNavigatorItem("Job.Lists.AwaitingFinancePayment", false),
new ClaimNavigatorItem("Job.Lists.AwaitingTechnicianAction", false),
new ClaimNavigatorItem("Job.Lists.AwaitingUserAction", false),
new ClaimNavigatorItem("Job.Lists.DevicesAwaitingRepair", false),
new ClaimNavigatorItem("Job.Lists.DevicesReadyForReturn", false),
new ClaimNavigatorItem("Job.Lists.JobQueueLists", false),
new ClaimNavigatorItem("Job.Lists.Locations", false),
new ClaimNavigatorItem("Job.Lists.LongRunningJobs", false),
new ClaimNavigatorItem("Job.Lists.MyJobs", false),
new ClaimNavigatorItem("Job.Lists.MyJobsOrphaned", false),
new ClaimNavigatorItem("Job.Lists.RecentlyClosed", false)
}),
new ClaimNavigatorItem("Job.Search", false),
new ClaimNavigatorItem("Job.ShowAttachments", false),
new ClaimNavigatorItem("Job.ShowDailyChart", false),
new ClaimNavigatorItem("Job.ShowFlags", false),
new ClaimNavigatorItem("Job.Show", false),
new ClaimNavigatorItem("Job.ShowJobsQueues", false),
new ClaimNavigatorItem("Job.ShowLogs", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyComponents", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyFinance", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyInsurance", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyRepairs", false),
new ClaimNavigatorItem("Job.ShowWarranty", false),
new ClaimNavigatorItem("Job.Types", "Types", "Permissions related to Job Types", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Job.Types.ShowHMisc", false),
new ClaimNavigatorItem("Job.Types.ShowHNWar", false),
@@ -335,27 +386,9 @@ namespace Disco.Services.Authorization
new ClaimNavigatorItem("Job.Types.ShowSOS", false),
new ClaimNavigatorItem("Job.Types.ShowSImg", false),
new ClaimNavigatorItem("Job.Types.ShowUMgmt", false)
}),
new ClaimNavigatorItem("Job.Search", false),
new ClaimNavigatorItem("Job.ShowAttachments", false),
new ClaimNavigatorItem("Job.ShowDailyChart", false),
new ClaimNavigatorItem("Job.ShowFlags", false),
new ClaimNavigatorItem("Job.Show", false),
new ClaimNavigatorItem("Job.ShowLogs", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyComponents", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyFinance", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyInsurance", false),
new ClaimNavigatorItem("Job.ShowNonWarrantyRepairs", false),
new ClaimNavigatorItem("Job.ShowWarranty", false)
})
}),
new ClaimNavigatorItem("Device", "Device", "Permissions related to Devices", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Device.Properties", "Device Properties", "Permissions related to Device Properties", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Device.Properties.AssetNumber", false),
new ClaimNavigatorItem("Device.Properties.Details", false),
new ClaimNavigatorItem("Device.Properties.DeviceBatch", false),
new ClaimNavigatorItem("Device.Properties.DeviceProfile", false),
new ClaimNavigatorItem("Device.Properties.Location", false)
}),
new ClaimNavigatorItem("Device.Actions", "Actions", "Permissions related to Device Actions", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Device.Actions.AddAttachments", false),
new ClaimNavigatorItem("Device.Actions.AllowUnauthenticatedEnrol", false),
@@ -370,6 +403,13 @@ namespace Disco.Services.Authorization
new ClaimNavigatorItem("Device.Actions.RemoveAnyAttachments", false),
new ClaimNavigatorItem("Device.Actions.RemoveOwnAttachments", false)
}),
new ClaimNavigatorItem("Device.Properties", "Device Properties", "Permissions related to Device Properties", false, new List<IClaimNavigatorItem>() {
new ClaimNavigatorItem("Device.Properties.AssetNumber", false),
new ClaimNavigatorItem("Device.Properties.Details", false),
new ClaimNavigatorItem("Device.Properties.DeviceBatch", false),
new ClaimNavigatorItem("Device.Properties.DeviceProfile", false),
new ClaimNavigatorItem("Device.Properties.Location", false)
}),
new ClaimNavigatorItem("Device.Search", false),
new ClaimNavigatorItem("Device.ShowAssignmentHistory", false),
new ClaimNavigatorItem("Device.ShowAttachments", false),
@@ -500,6 +540,10 @@ namespace Disco.Services.Authorization
c.Config.Organisation.Show = true;
c.Config.JobPreferences.Configure = true;
c.Config.JobPreferences.Show = true;
c.Config.JobQueue.Configure = true;
c.Config.JobQueue.Create = true;
c.Config.JobQueue.Delete = true;
c.Config.JobQueue.Show = true;
c.Config.Show = true;
c.Job.Lists.AllOpen = true;
c.Job.Lists.AwaitingFinanceAgreementBreach = true;
@@ -511,11 +555,16 @@ namespace Disco.Services.Authorization
c.Job.Lists.AwaitingUserAction = true;
c.Job.Lists.DevicesAwaitingRepair = true;
c.Job.Lists.DevicesReadyForReturn = true;
c.Job.Lists.JobQueueLists = true;
c.Job.Lists.Locations = true;
c.Job.Lists.LongRunningJobs = true;
c.Job.Lists.MyJobs = true;
c.Job.Lists.MyJobsOrphaned = true;
c.Job.Lists.RecentlyClosed = true;
c.Job.Actions.AddAttachments = true;
c.Job.Actions.AddLogs = true;
c.Job.Actions.AddAnyQueues = true;
c.Job.Actions.AddOwnQueues = true;
c.Job.Actions.Close = true;
c.Job.Actions.ConvertHWarToHNWar = true;
c.Job.Actions.Create = true;
@@ -526,6 +575,8 @@ namespace Disco.Services.Authorization
c.Job.Actions.LogWarranty = true;
c.Job.Actions.RemoveAnyAttachments = true;
c.Job.Actions.RemoveAnyLogs = true;
c.Job.Actions.RemoveAnyQueues = true;
c.Job.Actions.RemoveOwnQueues = true;
c.Job.Actions.RemoveOwnAttachments = true;
c.Job.Actions.RemoveOwnLogs = true;
c.Job.Actions.Reopen = true;
@@ -552,6 +603,12 @@ namespace Disco.Services.Authorization
c.Job.Properties.NonWarrantyProperties.RepairerLoggedDate = true;
c.Job.Properties.NonWarrantyProperties.RepairerName = true;
c.Job.Properties.NonWarrantyProperties.RepairerReference = true;
c.Job.Properties.JobQueueProperties.EditAnyComments = true;
c.Job.Properties.JobQueueProperties.EditAnyPriority = true;
c.Job.Properties.JobQueueProperties.EditAnySLA = true;
c.Job.Properties.JobQueueProperties.EditOwnComments = true;
c.Job.Properties.JobQueueProperties.EditOwnPriority = true;
c.Job.Properties.JobQueueProperties.EditOwnSLA = true;
c.Job.Properties.DeviceHeldLocation = true;
c.Job.Properties.DeviceHeld = true;
c.Job.Properties.DeviceReadyForReturn = true;
@@ -572,6 +629,7 @@ namespace Disco.Services.Authorization
c.Job.ShowDailyChart = true;
c.Job.ShowFlags = true;
c.Job.Show = true;
c.Job.ShowJobsQueues = true;
c.Job.ShowLogs = true;
c.Job.ShowNonWarrantyComponents = true;
c.Job.ShowNonWarrantyFinance = true;
@@ -631,7 +689,7 @@ namespace Disco.Services.Authorization
public static class Config
{
/// <summary>Device Certificate
/// <summary>Device Certificates
/// <para>Permissions related to Device Certificates</para>
/// </summary>
public static class DeviceCertificate
@@ -670,7 +728,7 @@ namespace Disco.Services.Authorization
public const string ShowStatus = "Config.Enrolment.ShowStatus";
}
/// <summary>Device Batch
/// <summary>Device Batches
/// <para>Permissions related to Device Batches</para>
/// </summary>
public static class DeviceBatch
@@ -702,7 +760,7 @@ namespace Disco.Services.Authorization
public const string ShowTimeline = "Config.DeviceBatch.ShowTimeline";
}
/// <summary>Device Model
/// <summary>Device Models
/// <para>Permissions related to Device Models</para>
/// </summary>
public static class DeviceModel
@@ -729,7 +787,7 @@ namespace Disco.Services.Authorization
public const string Show = "Config.DeviceModel.Show";
}
/// <summary>Device Profile
/// <summary>Device Profiles
/// <para>Permissions related to Device Profiles</para>
/// </summary>
public static class DeviceProfile
@@ -766,7 +824,7 @@ namespace Disco.Services.Authorization
public const string Show = "Config.DeviceProfile.Show";
}
/// <summary>Document Template
/// <summary>Document Templates
/// <para>Permissions related to Document Templates</para>
/// </summary>
public static class DocumentTemplate
@@ -928,6 +986,33 @@ namespace Disco.Services.Authorization
public const string Show = "Config.JobPreferences.Show";
}
/// <summary>Job Queues
/// <para>Permissions related to Job Queues</para>
/// </summary>
public static class JobQueue
{
/// <summary>Configure Job Queues
/// <para>Can configure job queues</para>
/// </summary>
public const string Configure = "Config.JobQueue.Configure";
/// <summary>Create Job Queues
/// <para>Can create job queues</para>
/// </summary>
public const string Create = "Config.JobQueue.Create";
/// <summary>Delete Job Queues
/// <para>Can delete job queues</para>
/// </summary>
public const string Delete = "Config.JobQueue.Delete";
/// <summary>Show Job Queues
/// <para>Can show job queues</para>
/// </summary>
public const string Show = "Config.JobQueue.Show";
}
/// <summary>Show Configuration
/// <para>Can show the configuration menu</para>
/// </summary>
@@ -996,6 +1081,11 @@ namespace Disco.Services.Authorization
/// </summary>
public const string DevicesReadyForReturn = "Job.Lists.DevicesReadyForReturn";
/// <summary>Job Queue Lists
/// <para>Can show job queue lists</para>
/// </summary>
public const string JobQueueLists = "Job.Lists.JobQueueLists";
/// <summary>Locations List
/// <para>Can show list</para>
/// </summary>
@@ -1006,6 +1096,16 @@ namespace Disco.Services.Authorization
/// </summary>
public const string LongRunningJobs = "Job.Lists.LongRunningJobs";
/// <summary>My Jobs List
/// <para>Can show list</para>
/// </summary>
public const string MyJobs = "Job.Lists.MyJobs";
/// <summary>My Jobs List (Includes No Queue)
/// <para>Can show list</para>
/// </summary>
public const string MyJobsOrphaned = "Job.Lists.MyJobsOrphaned";
/// <summary>Recently Closed List
/// <para>Can show list</para>
/// </summary>
@@ -1028,6 +1128,16 @@ namespace Disco.Services.Authorization
/// </summary>
public const string AddLogs = "Job.Actions.AddLogs";
/// <summary>Add to Any Queues
/// <para>Can add to any job queues</para>
/// </summary>
public const string AddAnyQueues = "Job.Actions.AddAnyQueues";
/// <summary>Add to Own Queues
/// <para>Can add to own job queues</para>
/// </summary>
public const string AddOwnQueues = "Job.Actions.AddOwnQueues";
/// <summary>Close Jobs
/// <para>Can close jobs</para>
/// </summary>
@@ -1078,6 +1188,16 @@ namespace Disco.Services.Authorization
/// </summary>
public const string RemoveAnyLogs = "Job.Actions.RemoveAnyLogs";
/// <summary>Remove from Any Queues
/// <para>Can remove from any job queues</para>
/// </summary>
public const string RemoveAnyQueues = "Job.Actions.RemoveAnyQueues";
/// <summary>Remove from Own Queues
/// <para>Can remove from own job queues</para>
/// </summary>
public const string RemoveOwnQueues = "Job.Actions.RemoveOwnQueues";
/// <summary>Remove Own Attachments
/// <para>Can remove own attachments from jobs</para>
/// </summary>
@@ -1229,6 +1349,43 @@ namespace Disco.Services.Authorization
public const string RepairerReference = "Job.Properties.NonWarrantyProperties.RepairerReference";
}
/// <summary>Job Queue Properties
/// <para>Permissions related to Job Queue Job Properties</para>
/// </summary>
public static class JobQueueProperties
{
/// <summary>Edit Any Comments
/// <para>Can edit any job queue comments</para>
/// </summary>
public const string EditAnyComments = "Job.Properties.JobQueueProperties.EditAnyComments";
/// <summary>Edit Any Priority
/// <para>Can edit any job queue Priority</para>
/// </summary>
public const string EditAnyPriority = "Job.Properties.JobQueueProperties.EditAnyPriority";
/// <summary>Edit Any SLA
/// <para>Can edit any job queue SLA</para>
/// </summary>
public const string EditAnySLA = "Job.Properties.JobQueueProperties.EditAnySLA";
/// <summary>Edit Own Comments
/// <para>Can edit own job queue comments</para>
/// </summary>
public const string EditOwnComments = "Job.Properties.JobQueueProperties.EditOwnComments";
/// <summary>Edit Own Priority
/// <para>Can edit own job queue Priority</para>
/// </summary>
public const string EditOwnPriority = "Job.Properties.JobQueueProperties.EditOwnPriority";
/// <summary>Edit Own SLA
/// <para>Can edit own job queue SLA</para>
/// </summary>
public const string EditOwnSLA = "Job.Properties.JobQueueProperties.EditOwnSLA";
}
/// <summary>Device Held Location Property
/// <para>Can update property</para>
/// </summary>
@@ -1337,6 +1494,11 @@ namespace Disco.Services.Authorization
/// </summary>
public const string Show = "Job.Show";
/// <summary>Show Jobs Queues
/// <para>Can show jobs queues</para>
/// </summary>
public const string ShowJobsQueues = "Job.ShowJobsQueues";
/// <summary>Show Logs
/// <para>Can show job logs</para>
/// </summary>
+5 -4
View File
@@ -53,7 +53,7 @@
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten. Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.
using Disco.Models.Authorization;
using Disco.Models.Services.Authorization;
using Disco.Models.Repository;
using Disco.Services.Authorization.Roles;
using System;
@@ -213,10 +213,11 @@ void WriteNavigator_Recurse(Permission p, string Prefix){
var groupPrefix = string.Concat(key, ".");
WriteLine("new ClaimNavigatorItem(\"{0}{1}\", \"{2}\", \"{3}\", {4}, new List<IClaimNavigatorItem>() {{", Prefix, p.Name, p.FriendlyName, p.Description, p.Hidden ? "true" : "false");
PushIndent(" ");
for (int childIndex = 0; childIndex < p.Children.Count; childIndex++)
var children = p.Children.OrderBy(c => c.FriendlyName).ToList();
for (int childIndex = 0; childIndex < children.Count; childIndex++)
{
WriteNavigator_Recurse(p.Children[childIndex], groupPrefix);
if (childIndex < p.Children.Count -1)
WriteNavigator_Recurse(children[childIndex], groupPrefix);
if (childIndex < children.Count -1)
WriteLine(",");
else
WriteLine(string.Empty);
@@ -5,6 +5,7 @@ using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.DeviceProfile
using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.DocumentTemplate;
using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.Enrolment;
using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.JobPreferences;
using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.JobQueue;
using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.Logging;
using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.Origanisation;
using Disco.Services.Authorization.Roles.ClaimGroups.Configuration.Plugin;
@@ -28,6 +29,7 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration
this.System = new SystemClaims();
this.Organisation = new OrganisationClaims();
this.JobPreferences = new JobPreferencesClaims();
this.JobQueue = new JobQueueClaims();
}
[ClaimDetails("Show Configuration", "Can show the configuration menu")]
@@ -54,5 +56,7 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration
public OrganisationClaims Organisation { get; set; }
public JobPreferencesClaims JobPreferences { get; set; }
public JobQueueClaims JobQueue { get; set; }
}
}
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration.DeviceBatch
{
[ClaimDetails("Device Batch", "Permissions related to Device Batches")]
[ClaimDetails("Device Batches", "Permissions related to Device Batches")]
public class DeviceBatchClaims : BaseRoleClaimGroup
{
[ClaimDetails("Configure Device Batches", "Can configure device batches")]
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration.DeviceCertificate
{
[ClaimDetails("Device Certificate", "Permissions related to Device Certificates")]
[ClaimDetails("Device Certificates", "Permissions related to Device Certificates")]
public class DeviceCertificateClaims : BaseRoleClaimGroup
{
[ClaimDetails("Download Certificates", "Can download certificates")]
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration.DeviceModel
{
[ClaimDetails("Device Model", "Permissions related to Device Models")]
[ClaimDetails("Device Models", "Permissions related to Device Models")]
public class DeviceModelClaims : BaseRoleClaimGroup
{
[ClaimDetails("Configure Device Models", "Can configure device models")]
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration.DeviceProfile
{
[ClaimDetails("Device Profile", "Permissions related to Device Profiles")]
[ClaimDetails("Device Profiles", "Permissions related to Device Profiles")]
public class DeviceProfileClaims : BaseRoleClaimGroup
{
[ClaimDetails("Configure Device Profiles", "Can configure device profiles")]
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration.DocumentTemplate
{
[ClaimDetails("Document Template", "Permissions related to Document Templates")]
[ClaimDetails("Document Templates", "Permissions related to Document Templates")]
public class DocumentTemplateClaims : BaseRoleClaimGroup
{
[ClaimDetails("Configure Document Templates", "Can configure document templates")]
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration.JobQueue
{
[ClaimDetails("Job Queues", "Permissions related to Job Queues")]
public class JobQueueClaims : BaseRoleClaimGroup
{
[ClaimDetails("Configure Job Queues", "Can configure job queues")]
public bool Configure { get; set; }
[ClaimDetails("Create Job Queues", "Can create job queues")]
public bool Create { get; set; }
[ClaimDetails("Delete Job Queues", "Can delete job queues")]
public bool Delete { get; set; }
[ClaimDetails("Show Job Queues", "Can show job queues")]
public bool Show { get; set; }
}
}
@@ -20,6 +20,15 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Job
[ClaimDetails("Delete Jobs", "Can delete jobs")]
public bool Delete { get; set; }
[ClaimDetails("Add to Own Queues", "Can add to own job queues")]
public bool AddOwnQueues { get; set; }
[ClaimDetails("Add to Any Queues", "Can add to any job queues")]
public bool AddAnyQueues { get; set; }
[ClaimDetails("Remove from Own Queues", "Can remove from own job queues")]
public bool RemoveOwnQueues { get; set; }
[ClaimDetails("Remove from Any Queues", "Can remove from any job queues")]
public bool RemoveAnyQueues { get; set; }
[ClaimDetails("Log Warranty", "Can log warranty for jobs")]
public bool LogWarranty { get; set; }
[ClaimDetails("Log Repair", "Can log repair for non-warranty jobs")]
@@ -31,6 +31,9 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Job
[ClaimDetails("Show Attachments", "Can show job attachments")]
public bool ShowAttachments { get; set; }
[ClaimDetails("Show Jobs Queues", "Can show jobs queues")]
public bool ShowJobsQueues { get; set; }
[ClaimDetails("Show Non-Warranty Components", "Can show non-warranty job components")]
public bool ShowNonWarrantyComponents { get; set; }
[ClaimDetails("Show Non-Warranty Finance", "Can show non-warranty job finance")]
@@ -9,6 +9,14 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Job
[ClaimDetails("Lists", "Permissions related to Job Lists")]
public class JobListsClaims : BaseRoleClaimGroup
{
[ClaimDetails("Job Queue Lists", "Can show job queue lists")]
public bool JobQueueLists { get; set; }
[ClaimDetails("My Jobs List", "Can show list")]
public bool MyJobs { get; set; }
[ClaimDetails("My Jobs List (Includes No Queue)", "Can show list")]
public bool MyJobsOrphaned { get; set; }
[ClaimDetails("Awaiting Technician Action List", "Can show list")]
public bool AwaitingTechnicianAction { get; set; }
[ClaimDetails("Long Running Jobs List", "Can show list")]
@@ -13,10 +13,12 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Job
{
this.WarrantyProperties = new JobWarrantyPropertiesClaims();
this.NonWarrantyProperties = new JobNonWarrantyPropertiesClaims();
this.JobQueueProperties = new JobQueuePropertiesClaims();
}
public JobWarrantyPropertiesClaims WarrantyProperties { get; set; }
public JobNonWarrantyPropertiesClaims NonWarrantyProperties { get; set; }
public JobQueuePropertiesClaims JobQueueProperties { get; set; }
[ClaimDetails("Device Held Property", "Can update property")]
public bool DeviceHeld { get; set; }
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services.Authorization.Roles.ClaimGroups.Job
{
[ClaimDetails("Job Queue Properties", "Permissions related to Job Queue Job Properties")]
public class JobQueuePropertiesClaims : BaseRoleClaimGroup
{
[ClaimDetails("Edit Any Comments", "Can edit any job queue comments")]
public bool EditAnyComments { get; set; }
[ClaimDetails("Edit Own Comments", "Can edit own job queue comments")]
public bool EditOwnComments { get; set; }
[ClaimDetails("Edit Any SLA", "Can edit any job queue SLA")]
public bool EditAnySLA { get; set; }
[ClaimDetails("Edit Own SLA", "Can edit own job queue SLA")]
public bool EditOwnSLA { get; set; }
[ClaimDetails("Edit Any Priority", "Can edit any job queue Priority")]
public bool EditAnyPriority { get; set; }
[ClaimDetails("Edit Own Priority", "Can edit own job queue Priority")]
public bool EditOwnPriority { get; set; }
}
}
@@ -1,5 +1,5 @@
using Disco.Data.Repository;
using Disco.Models.Authorization;
using Disco.Models.Services.Authorization;
using Disco.Models.Repository;
using System;
using System.Collections.Concurrent;
@@ -1,4 +1,4 @@
using Disco.Models.Authorization;
using Disco.Models.Services.Authorization;
using Disco.Models.Repository;
using Newtonsoft.Json;
using System;
+24
View File
@@ -75,6 +75,21 @@
</Reference>
<Reference Include="System.DirectoryServices" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Reactive.Core, Version=2.1.30214.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Rx-Core.2.1.30214.0\lib\Net45\System.Reactive.Core.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.Interfaces, Version=2.1.30214.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Rx-Interfaces.2.1.30214.0\lib\Net45\System.Reactive.Interfaces.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.Linq, Version=2.1.30214.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Rx-Linq.2.1.30214.0\lib\Net45\System.Reactive.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\packages\Rx-PlatformServices.2.1.30214.0\lib\Net45\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
@@ -130,6 +145,7 @@
<Compile Include="Authorization\Roles\ClaimGroups\Configuration\DocumentTemplate\DocumentTemplateClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Configuration\Enrolment\EnrolmentClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Configuration\JobPreferences\JobPreferencesClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Configuration\JobQueue\JobQueueClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Configuration\Logging\LoggingClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Configuration\Origanisation\OrganisationClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Configuration\Plugin\PluginClaims.cs" />
@@ -142,6 +158,7 @@
<Compile Include="Authorization\Roles\ClaimGroups\Job\JobNonWarrantyPropertiesClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Job\JobClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Job\JobPropertiesClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Job\JobQueuePropertiesClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Job\JobTypesClaims.cs" />
<Compile Include="Authorization\Roles\ClaimGroups\Job\JobWarrantyPropertiesClaims.cs" />
<Compile Include="Authorization\Claims.cs">
@@ -156,6 +173,13 @@
<Compile Include="Authorization\Roles\RoleClaims.cs" />
<Compile Include="Authorization\Roles\RoleToken.cs" />
<Compile Include="Extensions\DateTimeExtensions.cs" />
<Compile Include="Jobs\JobExtensions.cs" />
<Compile Include="Jobs\JobLists\JobTableExtensions.cs" />
<Compile Include="Jobs\JobQueues\Cache.cs" />
<Compile Include="Jobs\JobQueues\JobQueueDeleteTask.cs" />
<Compile Include="Jobs\JobQueues\JobQueueService.cs" />
<Compile Include="Jobs\JobQueues\JobQueueToken.cs" />
<Compile Include="Jobs\JobLists\ManagedJobList.cs" />
<Compile Include="Logging\LogBase.cs" />
<Compile Include="Logging\LogContext.cs" />
<Compile Include="Logging\LogReInitalizeJob.cs" />
+195
View File
@@ -0,0 +1,195 @@
using Disco.Models.Repository;
using Disco.Models.Services.Jobs.JobLists;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services
{
public static class JobExtensions
{
public static JobTableStatusItemModel ToJobTableStatusItemModel(this Job j)
{
var i = new JobTableStatusItemModel()
{
Id = j.Id,
OpenedDate = j.OpenedDate,
ClosedDate = j.ClosedDate,
JobTypeId = j.JobTypeId,
JobTypeDescription = j.JobType.Description,
DeviceHeldLocation = j.DeviceHeldLocation,
Flags = j.Flags,
WaitingForUserAction = j.WaitingForUserAction,
DeviceReadyForReturn = j.DeviceReadyForReturn,
DeviceHeld = j.DeviceHeld,
DeviceReturnedDate = j.DeviceReturnedDate
};
if (j.Device != null)
{
i.DeviceSerialNumber = j.DeviceSerialNumber;
i.DeviceModelDescription = j.Device.DeviceModel.Description;
i.DeviceAddressId = j.Device.DeviceProfile.DefaultOrganisationAddress;
if (j.JobMetaWarranty != null)
{
i.JobMetaWarranty_ExternalReference = j.JobMetaWarranty.ExternalReference;
i.JobMetaWarranty_ExternalLoggedDate = j.JobMetaWarranty.ExternalLoggedDate;
i.JobMetaWarranty_ExternalCompletedDate = j.JobMetaWarranty.ExternalCompletedDate;
i.JobMetaWarranty_ExternalName = j.JobMetaWarranty.ExternalName;
}
if (j.JobMetaNonWarranty != null)
{
i.JobMetaNonWarranty_RepairerLoggedDate = j.JobMetaNonWarranty.RepairerLoggedDate;
i.JobMetaNonWarranty_RepairerCompletedDate = j.JobMetaNonWarranty.RepairerCompletedDate;
i.JobMetaNonWarranty_AccountingChargeAddedDate = j.JobMetaNonWarranty.AccountingChargeAddedDate;
i.JobMetaNonWarranty_AccountingChargePaidDate = j.JobMetaNonWarranty.AccountingChargePaidDate;
i.JobMetaNonWarranty_AccountingChargeRequiredDate = j.JobMetaNonWarranty.AccountingChargeRequiredDate;
i.JobMetaNonWarranty_IsInsuranceClaim = j.JobMetaNonWarranty.IsInsuranceClaim;
i.JobMetaNonWarranty_RepairerName = j.JobMetaNonWarranty.RepairerName;
if (j.JobMetaInsurance != null)
{
i.JobMetaInsurance_ClaimFormSentDate = j.JobMetaInsurance.ClaimFormSentDate;
}
}
}
if (j.User != null)
{
i.UserId = j.UserId;
i.UserDisplayName = j.User.DisplayName;
}
if (j.OpenedTechUser != null)
{
i.OpenedTechUserId = j.OpenedTechUserId;
i.OpenedTechUserDisplayName = j.OpenedTechUser.DisplayName;
}
return i;
}
public static string JobStatusDescription(string StatusId, Job j = null)
{
switch (StatusId)
{
case Job.JobStatusIds.Open:
return "Open";
case Job.JobStatusIds.Closed:
return "Closed";
case Job.JobStatusIds.AwaitingWarrantyRepair:
if (j == null)
return "Awaiting Warranty Repair";
else
if (j.DeviceHeld.HasValue)
return string.Format("Awaiting Warranty Repair ({0})", j.JobMetaWarranty.ExternalName);
else
return string.Format("Awaiting Warranty Repair - Not Held ({0})", j.JobMetaWarranty.ExternalName);
case Job.JobStatusIds.AwaitingRepairs:
if (j == null)
return "Awaiting Repairs";
else
if (j.DeviceHeld.HasValue)
return string.Format("Awaiting Repairs ({0})", j.JobMetaNonWarranty.RepairerName);
else
return string.Format("Awaiting Repairs - Not Held ({0})", j.JobMetaNonWarranty.RepairerName);
case Job.JobStatusIds.AwaitingDeviceReturn:
return "Awaiting Device Return";
case Job.JobStatusIds.AwaitingUserAction:
return "Awaiting User Action";
case Job.JobStatusIds.AwaitingAccountingPayment:
return "Awaiting Accounting Payment";
case Job.JobStatusIds.AwaitingAccountingCharge:
return "Awaiting Accounting Charge";
case Job.JobStatusIds.AwaitingInsuranceProcessing:
return "Awaiting Insurance Processing";
default:
return "Unknown";
}
}
public static string JobStatusDescription(string StatusId, JobTableStatusItemModel j = null)
{
switch (StatusId)
{
case Job.JobStatusIds.Open:
return "Open";
case Job.JobStatusIds.Closed:
return "Closed";
case Job.JobStatusIds.AwaitingWarrantyRepair:
if (j == null)
return "Awaiting Warranty Repair";
else
if (j.DeviceHeld.HasValue)
return string.Format("Awaiting Warranty Repair ({0})", j.JobMetaWarranty_ExternalName);
else
return string.Format("Awaiting Warranty Repair - Not Held ({0})", j.JobMetaWarranty_ExternalName);
case Job.JobStatusIds.AwaitingRepairs:
if (j == null)
return "Awaiting Repairs";
else
if (j.DeviceHeld.HasValue)
return string.Format("Awaiting Repairs ({0})", j.JobMetaNonWarranty_RepairerName);
else
return string.Format("Awaiting Repairs - Not Held ({0})", j.JobMetaNonWarranty_RepairerName);
case Job.JobStatusIds.AwaitingDeviceReturn:
return "Awaiting Device Return";
case Job.JobStatusIds.AwaitingUserAction:
return "Awaiting User Action";
case Job.JobStatusIds.AwaitingAccountingPayment:
return "Awaiting Accounting Payment";
case Job.JobStatusIds.AwaitingAccountingCharge:
return "Awaiting Accounting Charge";
case Job.JobStatusIds.AwaitingInsuranceProcessing:
return "Awaiting Insurance Processing";
default:
return "Unknown";
}
}
public static string CalculateStatusId(this Job j)
{
return j.ToJobTableStatusItemModel().CalculateStatusId();
}
public static string CalculateStatusId(this JobTableStatusItemModel j)
{
if (j.ClosedDate.HasValue)
return Job.JobStatusIds.Closed;
if (j.JobTypeId == JobType.JobTypeIds.HWar)
{
if (!string.IsNullOrEmpty(j.JobMetaWarranty_ExternalReference) && !j.JobMetaWarranty_ExternalCompletedDate.HasValue)
return Job.JobStatusIds.AwaitingWarrantyRepair; // Job Logged - but not marked as completed
}
if (j.JobTypeId == JobType.JobTypeIds.HNWar)
{
if (j.JobMetaNonWarranty_RepairerLoggedDate.HasValue && !j.JobMetaNonWarranty_RepairerCompletedDate.HasValue)
return Job.JobStatusIds.AwaitingRepairs; // Repairs logged - but not complete
if (j.JobMetaNonWarranty_AccountingChargeAddedDate.HasValue && !j.JobMetaNonWarranty_AccountingChargePaidDate.HasValue)
return Job.JobStatusIds.AwaitingAccountingPayment; // Accounting Charge Added, but not paid
if (j.JobMetaNonWarranty_AccountingChargeRequiredDate.HasValue && (!j.JobMetaNonWarranty_AccountingChargePaidDate.HasValue || !j.JobMetaNonWarranty_AccountingChargeAddedDate.HasValue))
return Job.JobStatusIds.AwaitingAccountingCharge; // Accounting Charge Required, but not added or paid
if (j.JobMetaNonWarranty_RepairerLoggedDate.HasValue && j.JobMetaNonWarranty_IsInsuranceClaim.Value && !j.JobMetaInsurance_ClaimFormSentDate.HasValue)
return Job.JobStatusIds.AwaitingInsuranceProcessing; // Is insurance claim, but no Claim Form Sent
}
if (j.WaitingForUserAction.HasValue)
return Job.JobStatusIds.AwaitingUserAction; // Awaiting for User
if (j.DeviceReadyForReturn.HasValue && !j.DeviceReturnedDate.HasValue)
return Job.JobStatusIds.AwaitingDeviceReturn; // Device not returned to User
return Job.JobStatusIds.Open;
}
public static Tuple<string, string> Status(this Job j)
{
var statusId = j.CalculateStatusId();
return new Tuple<string, string>(statusId, JobStatusDescription(statusId, j));
}
}
}
@@ -0,0 +1,250 @@
using Disco.Data.Repository;
using Disco.Models.Repository;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Services.Authorization;
using Disco.Services.Users;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services
{
public static class JobTableExtensions
{
private static JobTableModel CloneEmptyJobTableModel(JobTableModel Model)
{
return new JobTableModel()
{
ShowId = Model.ShowId,
ShowDeviceAddress = Model.ShowDeviceAddress,
ShowDates = Model.ShowDates,
ShowType = Model.ShowType,
ShowDevice = Model.ShowDevice,
ShowUser = Model.ShowUser,
ShowTechnician = Model.ShowTechnician,
ShowLocation = Model.ShowLocation,
ShowStatus = Model.ShowStatus,
IsSmallTable = Model.IsSmallTable,
HideClosedJobs = Model.HideClosedJobs,
EnablePaging = Model.EnablePaging,
EnableFilter = Model.EnableFilter
};
}
public static IDictionary<string, JobTableModel> MultiCampusModels(this JobTableModel Model)
{
var items = Model.Items;
if (items == null || items.Count() > 0)
{
return items.OrderBy(i => i.DeviceAddress).GroupBy(i => i.DeviceAddress).ToDictionary(
ig => ig.Key ?? string.Empty,
ig =>
{
var jtm = CloneEmptyJobTableModel(Model);
jtm.Items = ig.ToList();
return jtm;
}
);
}
else
{
return null;
}
}
private static List<string> FilterAllowedTypes(AuthorizationToken Authorization)
{
if (!Authorization.HasAll(Claims.Job.Types.ShowHMisc, Claims.Job.Types.ShowHNWar, Claims.Job.Types.ShowHWar, Claims.Job.Types.ShowSApp, Claims.Job.Types.ShowSImg, Claims.Job.Types.ShowSOS, Claims.Job.Types.ShowUMgmt))
{
// Must Filter
List<string> allowedTypes = new List<string>(6);
if (Authorization.Has(Claims.Job.Types.ShowHMisc))
allowedTypes.Add(JobType.JobTypeIds.HMisc);
if (Authorization.Has(Claims.Job.Types.ShowHNWar))
allowedTypes.Add(JobType.JobTypeIds.HNWar);
if (Authorization.Has(Claims.Job.Types.ShowHWar))
allowedTypes.Add(JobType.JobTypeIds.HWar);
if (Authorization.Has(Claims.Job.Types.ShowSApp))
allowedTypes.Add(JobType.JobTypeIds.SApp);
if (Authorization.Has(Claims.Job.Types.ShowSImg))
allowedTypes.Add(JobType.JobTypeIds.SImg);
if (Authorization.Has(Claims.Job.Types.ShowSOS))
allowedTypes.Add(JobType.JobTypeIds.SOS);
if (Authorization.Has(Claims.Job.Types.ShowUMgmt))
allowedTypes.Add(JobType.JobTypeIds.UMgmt);
return allowedTypes;
}
return null;
}
public static IQueryable<Job> FilterPermissions(this JobTableModel model, IQueryable<Job> Jobs, AuthorizationToken Authorization)
{
var allowedTypes = FilterAllowedTypes(Authorization);
if (allowedTypes != null)
{
return Jobs.Where(j => allowedTypes.Contains(j.JobTypeId));
}
return Jobs;
}
public static IEnumerable<JobTableItemModel> PermissionsFiltered(this IEnumerable<JobTableItemModel> Items, AuthorizationToken Authorization)
{
if (Items != null && Items.Count() > 0)
{
var allowedTypes = FilterAllowedTypes(Authorization);
if (allowedTypes != null)
{
return Items.Where(j => allowedTypes.Contains(j.JobTypeId)).ToList();
}
}
return Items;
}
public static IEnumerable<JobTableItemModel> DetermineItems(this JobTableModel model, DiscoDataContext Database, IQueryable<Job> Jobs)
{
List<JobTableItemModel> items;
// Permissions
var auth = UserService.CurrentAuthorization;
if (!auth.HasAll(Claims.Job.Types.ShowHMisc, Claims.Job.Types.ShowHNWar, Claims.Job.Types.ShowHWar, Claims.Job.Types.ShowSApp, Claims.Job.Types.ShowSImg, Claims.Job.Types.ShowSOS, Claims.Job.Types.ShowUMgmt))
{
// Must Filter
List<string> allowedTypes = new List<string>(6);
if (auth.Has(Claims.Job.Types.ShowHMisc))
allowedTypes.Add(JobType.JobTypeIds.HMisc);
if (auth.Has(Claims.Job.Types.ShowHNWar))
allowedTypes.Add(JobType.JobTypeIds.HNWar);
if (auth.Has(Claims.Job.Types.ShowHWar))
allowedTypes.Add(JobType.JobTypeIds.HWar);
if (auth.Has(Claims.Job.Types.ShowSApp))
allowedTypes.Add(JobType.JobTypeIds.SApp);
if (auth.Has(Claims.Job.Types.ShowSImg))
allowedTypes.Add(JobType.JobTypeIds.SImg);
if (auth.Has(Claims.Job.Types.ShowSOS))
allowedTypes.Add(JobType.JobTypeIds.SOS);
if (auth.Has(Claims.Job.Types.ShowUMgmt))
allowedTypes.Add(JobType.JobTypeIds.UMgmt);
Jobs = Jobs.Where(j => allowedTypes.Contains(j.JobTypeId));
}
if (model.ShowStatus)
{
var jobItems = Jobs.Select(j => new JobTableStatusItemModel()
{
Id = j.Id,
OpenedDate = j.OpenedDate,
ClosedDate = j.ClosedDate,
JobTypeId = j.JobTypeId,
JobTypeDescription = j.JobType.Description,
DeviceSerialNumber = j.Device.SerialNumber,
DeviceProfileId = j.Device.DeviceProfileId,
DeviceModelId = j.Device.DeviceModelId,
DeviceModelDescription = j.Device.DeviceModel.Description,
DeviceAddressId = j.Device.DeviceProfile.DefaultOrganisationAddress,
UserId = j.UserId,
UserDisplayName = j.User.DisplayName,
OpenedTechUserId = j.OpenedTechUserId,
OpenedTechUserDisplayName = j.OpenedTechUser.DisplayName,
DeviceHeldLocation = j.DeviceHeldLocation,
Flags = j.Flags,
JobMetaWarranty_ExternalReference = j.JobMetaWarranty.ExternalReference,
JobMetaWarranty_ExternalLoggedDate = j.JobMetaWarranty.ExternalLoggedDate,
JobMetaWarranty_ExternalCompletedDate = j.JobMetaWarranty.ExternalCompletedDate,
JobMetaNonWarranty_RepairerLoggedDate = j.JobMetaNonWarranty.RepairerLoggedDate,
JobMetaNonWarranty_RepairerCompletedDate = j.JobMetaNonWarranty.RepairerCompletedDate,
JobMetaNonWarranty_AccountingChargeAddedDate = j.JobMetaNonWarranty.AccountingChargeAddedDate,
JobMetaNonWarranty_AccountingChargePaidDate = j.JobMetaNonWarranty.AccountingChargePaidDate,
JobMetaNonWarranty_AccountingChargeRequiredDate = j.JobMetaNonWarranty.AccountingChargeRequiredDate,
JobMetaNonWarranty_IsInsuranceClaim = j.JobMetaNonWarranty.IsInsuranceClaim,
JobMetaInsurance_ClaimFormSentDate = j.JobMetaInsurance.ClaimFormSentDate,
WaitingForUserAction = j.WaitingForUserAction,
DeviceReadyForReturn = j.DeviceReadyForReturn,
DeviceHeld = j.DeviceHeld,
DeviceReturnedDate = j.DeviceReturnedDate,
JobMetaWarranty_ExternalName = j.JobMetaWarranty.ExternalName,
JobMetaNonWarranty_RepairerName = j.JobMetaNonWarranty.RepairerName,
ActiveJobQueues = j.JobQueues.Where(jq => !jq.RemovedDate.HasValue).Select(jq => new JobTableStatusQueueItemModel()
{
Id = jq.Id,
QueueId = jq.JobQueueId,
AddedDate = jq.AddedDate,
SLAExpiresDate = jq.SLAExpiresDate,
Priority = jq.Priority
})
});
items = new List<JobTableItemModel>();
foreach (var j in jobItems)
{
j.StatusId = j.CalculateStatusId();
j.StatusDescription = JobExtensions.JobStatusDescription(j.StatusId, j);
items.Add(j);
}
}
else
{
items = Jobs.Select(j => new JobTableItemModel()
{
Id = j.Id,
OpenedDate = j.OpenedDate,
ClosedDate = j.ClosedDate,
JobTypeId = j.JobTypeId,
JobTypeDescription = j.JobType.Description,
DeviceSerialNumber = j.Device.SerialNumber,
DeviceProfileId = j.Device.DeviceProfileId,
DeviceModelId = j.Device.DeviceModelId,
DeviceModelDescription = j.Device.DeviceModel.Description,
DeviceAddressId = j.Device.DeviceProfile.DefaultOrganisationAddress,
UserId = j.UserId,
UserDisplayName = j.User.DisplayName,
OpenedTechUserId = j.OpenedTechUserId,
OpenedTechUserDisplayName = j.OpenedTechUser.DisplayName,
DeviceHeldLocation = j.DeviceHeldLocation,
Flags = j.Flags
}).ToList();
}
if (!model.ShowDeviceAddress.HasValue)
model.ShowDeviceAddress = Database.DiscoConfiguration.MultiSiteMode;
foreach (var j in items)
if (j.DeviceAddressId.HasValue)
j.DeviceAddress = Database.DiscoConfiguration.OrganisationAddresses.GetAddress(j.DeviceAddressId.Value).Name;
return items;
}
public static void Fill(this JobTableModel model, DiscoDataContext Database, IQueryable<Job> Jobs)
{
model.Items = model.DetermineItems(Database, Jobs);
}
public static double? SlaPrecentageRemaining(this IEnumerable<JobTableStatusQueueItemModel> queueItems)
{
return queueItems.Where(i => i.SLAExpiresDate.HasValue).Min<JobTableStatusQueueItemModel, double?>(i =>
{
var total = (i.SLAExpiresDate.Value - i.AddedDate).Ticks;
var remaining = (i.SLAExpiresDate.Value - DateTime.Now).Ticks;
return ((double)remaining / total);
});
}
public static IEnumerable<JobTableStatusQueueItemModel> UsersQueueItems(this IEnumerable<JobTableStatusQueueItemModel> queueItems, AuthorizationToken Authorization)
{
var usersQueues = Jobs.JobQueues.JobQueueService.UsersQueues(Authorization).ToDictionary(q => q.JobQueue.Id);
return queueItems.Where(qi => usersQueues.ContainsKey(qi.QueueId));
}
}
}
@@ -0,0 +1,265 @@
using Disco.Data.Repository;
using Disco.Data.Repository.Monitor;
using Disco.Models.Repository;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Services.Logging;
using Disco.Services.Users;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
namespace Disco.Services.Jobs.JobLists
{
using FilterFunc = Func<IQueryable<Job>, IQueryable<Job>>;
using SortFunc = Func<IEnumerable<JobTableItemModel>, IEnumerable<JobTableItemModel>>;
using OpenFilterFunc = Func<IEnumerable<JobTableStatusItemModel>, IEnumerable<JobTableStatusItemModel>>;
using Disco.Services.Authorization;
using Disco.Services.Jobs.JobQueues;
public class ManagedJobList : JobTableModel, IDisposable
{
private static ManagedJobList openJobs;
private IDisposable unsubscribeToken;
private object updateLock = new object();
public string Name { get; private set; }
public FilterFunc FilterFunction { get; private set; }
public SortFunc SortFunction { get; private set; }
public static OpenFilterFunc AwaitingTechnicianActionFilter = q => q.Where(j => j.ClosedDate == null && !j.WaitingForUserAction.HasValue
&& !(j.JobTypeId == JobType.JobTypeIds.HNWar && (j.JobMetaNonWarranty_RepairerLoggedDate.HasValue && j.JobMetaNonWarranty_IsInsuranceClaim.Value && !j.JobMetaInsurance_ClaimFormSentDate.HasValue))
&& !(j.JobTypeId == JobType.JobTypeIds.HNWar && (j.JobMetaNonWarranty_RepairerLoggedDate.HasValue && !j.JobMetaNonWarranty_RepairerCompletedDate.HasValue))
&& !(j.JobTypeId == JobType.JobTypeIds.HNWar && (j.JobMetaNonWarranty_RepairerLoggedDate.HasValue && j.JobMetaNonWarranty_AccountingChargeAddedDate.HasValue && !j.JobMetaNonWarranty_AccountingChargePaidDate.HasValue))
&& !(j.JobTypeId == JobType.JobTypeIds.HWar && (j.JobMetaWarranty_ExternalLoggedDate.HasValue && !j.JobMetaWarranty_ExternalCompletedDate.HasValue))
&& (j.DeviceHeld == null || j.DeviceReturnedDate != null || j.DeviceReadyForReturn == null));
static ManagedJobList()
{
using (var Database = new DiscoDataContext())
{
openJobs = new ManagedJobList(
Name: "Open Jobs",
FilterFunction: q => q.Where(j => !j.ClosedDate.HasValue),
SortFunction: q => q)
{
ShowDeviceAddress = true,
ShowLocation = true,
ShowStatus = true
}.Initialize(Database);
}
}
public static JobTableModel OpenJobsTable(OpenFilterFunc FilterFunction)
{
return new JobTableModel()
{
ShowStatus = true,
Items = FilterFunction(openJobs.Items.Cast<JobTableStatusItemModel>())
};
}
public static JobTableModel MyJobsTable(AuthorizationToken AuthToken)
{
IEnumerable<Tuple<JobTableStatusItemModel, byte, byte, DateTime?>> allJobs = null;
if (AuthToken.Has(Claims.Job.Lists.MyJobsOrphaned))
{
allJobs = AwaitingTechnicianActionFilter(
openJobs.Items.Cast<JobTableStatusItemModel>()
.Where(i => i.ActiveJobQueues == null || i.ActiveJobQueues.Count() == 0)
).Select(i => new Tuple<JobTableStatusItemModel, byte, byte, DateTime?>(i, (byte)JobQueuePriority.Normal, (byte)JobQueuePriority.Normal, null));
}
var usersQueues = JobQueueService.UsersQueues(AuthToken).ToDictionary(q => q.JobQueue.Id);
var queueJobs = openJobs.Items.Cast<JobTableStatusItemModel>()
.Where(i => i.ActiveJobQueues != null && i.ActiveJobQueues.Any(jqj => usersQueues.ContainsKey(jqj.QueueId)))
.Select(i => new Tuple<JobTableStatusItemModel, byte, byte, DateTime?>(
i,
(byte)i.ActiveJobQueues.Where(q => usersQueues.ContainsKey(q.QueueId)).Max(q => (int)usersQueues[q.QueueId].JobQueue.Priority),
(byte)i.ActiveJobQueues.Where(q => usersQueues.ContainsKey(q.QueueId)).Max(q => (int)q.Priority),
i.ActiveJobQueues.Where(q => usersQueues.ContainsKey(q.QueueId) && q.SLAExpiresDate.HasValue).Min(q => q.SLAExpiresDate)
));
if (allJobs != null)
allJobs = allJobs.Concat(queueJobs).ToList();
else
allJobs = queueJobs.ToList();
var allJobsSorted = allJobs
.OrderByDescending(i => i.Item2).ThenByDescending(i => i.Item3).ThenBy(i => i.Item4).ThenBy(i => i.Item1.OpenedDate).Select(q => q.Item1);
return new JobTableModel()
{
ShowStatus = true,
Items = allJobsSorted.ToList()
};
}
public override IEnumerable<JobTableItemModel> Items
{
get
{
return base.Items.PermissionsFiltered(UserService.CurrentAuthorization);
}
set
{
throw new InvalidOperationException("Items cannot be manually set in a Managed Job List");
}
}
public ManagedJobList(string Name, FilterFunc FilterFunction, SortFunc SortFunction)
{
this.Name = Name;
this.FilterFunction = FilterFunction;
this.SortFunction = SortFunction;
}
public ManagedJobList Initialize(DiscoDataContext Database)
{
// Can only Initialize once
if (base.Items != null)
return ReInitialize(Database);
lock (updateLock)
{
// Subscribe for Changes
// - Job (or Job Meta) Changes
// - Device Profile Address Changes (for multi-campus Schools)
// - Device Model Description Changes
// - Device's Profile or Model Changes
unsubscribeToken = RepositoryMonitor.StreamAfterCommit
.Where(n => n.EntityType == typeof(Job) ||
n.EntityType == typeof(JobQueueJob) ||
n.EntityType == typeof(JobMetaWarranty) ||
n.EntityType == typeof(JobMetaNonWarranty) ||
n.EntityType == typeof(JobMetaInsurance) ||
(n.EventType == RepositoryMonitorEventType.Modified && (
(n.EntityType == typeof(DeviceProfile) && n.ModifiedProperties.Contains("DefaultOrganisationAddress")) ||
(n.EntityType == typeof(DeviceModel) && n.ModifiedProperties.Contains("Description")) ||
(n.EntityType == typeof(Device) && n.ModifiedProperties.Contains("DeviceProfileId") || n.ModifiedProperties.Contains("DeviceModelId"))
)))
.Subscribe(JobNotification, NotificationError);
// Initially fill table
base.Items = this.SortFunction(this.DetermineItems(Database, this.FilterFunction(Database.Jobs))).ToList();
}
return this;
}
public ManagedJobList ReInitialize(DiscoDataContext Database)
{
return ReInitialize(Database, null, null);
}
public ManagedJobList ReInitialize(DiscoDataContext Database, FilterFunc FilterFunction)
{
return ReInitialize(Database, FilterFunction, null);
}
public ManagedJobList ReInitialize(DiscoDataContext Database, FilterFunc FilterFunction, SortFunc SortFunction)
{
if (Database == null)
throw new ArgumentNullException("Database");
lock (updateLock)
{
if (FilterFunction != null)
this.FilterFunction = FilterFunction;
if (SortFunction != null)
this.SortFunction = SortFunction;
base.Items = this.SortFunction(this.DetermineItems(Database, this.FilterFunction(Database.Jobs))).ToList();
}
return this;
}
private void NotificationError(Exception ex)
{
SystemLog.LogException(string.Format("Disco.Services.Jobs.JobLists.ManagedJobList: [{0}]", this.Name), ex);
}
private void JobNotification(RepositoryMonitorEvent e)
{
List<int> jobIds = null;
JobTableItemModel[] existingItems = null;
if (e.EntityType == typeof(Job))
jobIds = new List<int>() { ((Job)e.Entity).Id };
else if (e.EntityType == typeof(JobQueueJob))
jobIds = new List<int>() { ((JobQueueJob)e.Entity).JobId };
else if (e.EntityType == typeof(JobMetaWarranty))
jobIds = new List<int>() { ((JobMetaWarranty)e.Entity).JobId };
else if (e.EntityType == typeof(JobMetaNonWarranty))
jobIds = new List<int>() { ((JobMetaNonWarranty)e.Entity).JobId };
else if (e.EntityType == typeof(JobMetaInsurance))
jobIds = new List<int>() { ((JobMetaInsurance)e.Entity).JobId };
else if (e.EntityType == typeof(DeviceProfile))
{
int deviceProfileId = ((DeviceProfile)e.Entity).Id;
existingItems = base.Items.Where(i => i.DeviceProfileId == deviceProfileId).ToArray();
}
else if (e.EntityType == typeof(DeviceModel))
{
int deviceModelId = ((DeviceModel)e.Entity).Id;
existingItems = base.Items.Where(i => i.DeviceModelId == deviceModelId).ToArray();
}
else if (e.EntityType == typeof(Device))
{
string deviceSerialNumber = ((Device)e.Entity).SerialNumber;
existingItems = base.Items.Where(i => i.DeviceSerialNumber == deviceSerialNumber).ToArray();
}
else
return; // Subscription should never reach
if (jobIds == null)
{
if (existingItems == null)
throw new InvalidOperationException("Notification algorithm didn't indicate any Jobs for update");
else
jobIds = existingItems.Select(i => i.Id).ToList();
}
if (jobIds.Count == 0)
return;
else
UpdateJobs(e.Database, jobIds, existingItems);
}
private void UpdateJobs(DiscoDataContext Database, List<int> jobIds, JobTableItemModel[] existingItems = null)
{
lock (updateLock)
{
// Check for existing items, if not handed them
if (existingItems == null)
existingItems = base.Items.Where(i => jobIds.Contains(i.Id)).ToArray();
var updatedItems = this.DetermineItems(Database, this.FilterFunction(Database.Jobs.Where(j => jobIds.Contains(j.Id))));
var refreshedList = base.Items.ToList();
// Remove Existing
if (existingItems.Length > 0)
foreach (var existingItem in existingItems)
refreshedList.Remove(existingItem);
// Add Updated Items
if (updatedItems.Count() > 0)
foreach (var updatedItem in updatedItems)
refreshedList.Add(updatedItem);
// Reorder
base.Items = this.SortFunction(refreshedList).ToList();
}
}
public void Dispose()
{
if (unsubscribeToken != null)
{
unsubscribeToken.Dispose();
unsubscribeToken = null;
}
}
}
}
+313
View File
@@ -0,0 +1,313 @@
using Disco.Data.Repository;
using Disco.Models.Repository;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services.Jobs.JobQueues
{
internal class Cache
{
private ConcurrentDictionary<int, JobQueueToken> _Cache;
private Dictionary<string, List<JobQueueToken>> _SubjectCache;
private ReadOnlyCollection<KeyValuePair<string, string>> _Icons;
private ReadOnlyCollection<KeyValuePair<string, string>> _IconColourCache;
private ReadOnlyCollection<KeyValuePair<int, string>> _SlaOptions;
public Cache(DiscoDataContext Database)
{
Initialize(Database);
}
private void Initialize(DiscoDataContext Database)
{
// Queues from Database
var queues = Database.JobQueues.ToList();
// Default System Queue
//var defaultQueue = new JobQueue()
//{
// Id = 0,
// Name = "Default Queue",
// Description = "Default system queue for orphaned jobs",
// Icon = "question-circle",
// IconColour = "F0A30A",
// DefaultSLAExpiry = null,
// Priority = JobQueuePriority.Normal,
// SubjectIds = null
//};
//queues.Add(defaultQueue);
// Add Queues to In-Memory Cache
this._Cache = new ConcurrentDictionary<int, JobQueueToken>(queues.Select(q => new KeyValuePair<int, JobQueueToken>(q.Id, JobQueueToken.FromJobQueue(q))));
// Calculate Queue Subject Cache
CalculateSubjectCache();
#region Predefined Options
// Icons
if (this._Icons == null)
{
this._Icons = new List<KeyValuePair<string, string>>(){
new KeyValuePair<string, string>("ambulance" , "Ambulance"),
new KeyValuePair<string, string>("anchor" , "Anchor"),
new KeyValuePair<string, string>("android" , "Android"),
new KeyValuePair<string, string>("apple" , "Apple"),
new KeyValuePair<string, string>("archive" , "Archive"),
new KeyValuePair<string, string>("arrow-circle-down" , "Arrow Circle Down"),
new KeyValuePair<string, string>("arrow-circle-left" , "Arrow Circle Left"),
new KeyValuePair<string, string>("arrow-circle-right" , "Arrow Circle Right"),
new KeyValuePair<string, string>("arrow-circle-up" , "Arrow Circle Up"),
new KeyValuePair<string, string>("asterisk" , "Asterisk"),
new KeyValuePair<string, string>("ban" , "Ban"),
new KeyValuePair<string, string>("beer" , "Beer"),
new KeyValuePair<string, string>("bell" , "Bell"),
new KeyValuePair<string, string>("bolt" , "Bolt"),
new KeyValuePair<string, string>("book" , "Book"),
new KeyValuePair<string, string>("bookmark" , "Bookmark"),
new KeyValuePair<string, string>("briefcase" , "Briefcase"),
new KeyValuePair<string, string>("bug" , "Bug"),
new KeyValuePair<string, string>("building-o" , "Building"),
new KeyValuePair<string, string>("bullhorn" , "Bullhorn"),
new KeyValuePair<string, string>("bullseye" , "Bullseye"),
new KeyValuePair<string, string>("calendar" , "Calendar"),
new KeyValuePair<string, string>("calendar-o" , "Calendar"),
new KeyValuePair<string, string>("check-circle" , "Check Circle"),
new KeyValuePair<string, string>("clock-o" , "Clock"),
new KeyValuePair<string, string>("cloud" , "Cloud"),
new KeyValuePair<string, string>("coffee" , "Coffee"),
new KeyValuePair<string, string>("comments" , "Comments"),
new KeyValuePair<string, string>("compass" , "Compass"),
new KeyValuePair<string, string>("credit-card" , "Credit Card"),
new KeyValuePair<string, string>("crosshairs" , "Crosshairs"),
new KeyValuePair<string, string>("desktop" , "Desktop"),
new KeyValuePair<string, string>("dollar" , "Dollar"),
new KeyValuePair<string, string>("dot-circle-o" , "Dot Circle"),
new KeyValuePair<string, string>("envelope" , "Envelope"),
new KeyValuePair<string, string>("exclamation" , "Exclamation"),
new KeyValuePair<string, string>("eye" , "Eye"),
new KeyValuePair<string, string>("female" , "Female"),
new KeyValuePair<string, string>("fighter-jet" , "Fighter Jet"),
new KeyValuePair<string, string>("film" , "Film"),
new KeyValuePair<string, string>("filter" , "Filter"),
new KeyValuePair<string, string>("fire" , "Fire"),
new KeyValuePair<string, string>("fire-extinguisher" , "Fire Extinguisher"),
new KeyValuePair<string, string>("flask" , "Flask"),
new KeyValuePair<string, string>("frown-o" , "Frown"),
new KeyValuePair<string, string>("gamepad" , "Gamepad"),
new KeyValuePair<string, string>("gift" , "Gift"),
new KeyValuePair<string, string>("glass" , "Glass"),
new KeyValuePair<string, string>("globe" , "Globe"),
new KeyValuePair<string, string>("hand-o-down" , "Hand Down"),
new KeyValuePair<string, string>("hand-o-left" , "Hand Left"),
new KeyValuePair<string, string>("hand-o-right" , "Hand Right"),
new KeyValuePair<string, string>("hand-o-up" , "Hand Up"),
new KeyValuePair<string, string>("hdd-o" , "Hdd"),
new KeyValuePair<string, string>("heart" , "Heart"),
new KeyValuePair<string, string>("home" , "Home"),
new KeyValuePair<string, string>("info" , "Info"),
new KeyValuePair<string, string>("key" , "Key"),
new KeyValuePair<string, string>("keyboard-o" , "Keyboard"),
new KeyValuePair<string, string>("laptop" , "Laptop"),
new KeyValuePair<string, string>("leaf" , "Leaf"),
new KeyValuePair<string, string>("legal" , "Legal"),
new KeyValuePair<string, string>("lightbulb-o" , "Lightbulb"),
new KeyValuePair<string, string>("linux" , "Linux"),
new KeyValuePair<string, string>("location-arrow" , "Location Arrow"),
new KeyValuePair<string, string>("magnet" , "Magnet"),
new KeyValuePair<string, string>("male" , "Male"),
new KeyValuePair<string, string>("map-marker" , "Map Marker"),
new KeyValuePair<string, string>("medkit" , "Medkit"),
new KeyValuePair<string, string>("meh-o" , "Meh"),
new KeyValuePair<string, string>("microphone" , "Microphone"),
new KeyValuePair<string, string>("microphone-slash" , "Microphone Slash"),
new KeyValuePair<string, string>("minus-circle" , "Minus Circle"),
new KeyValuePair<string, string>("mobile" , "Mobile"),
new KeyValuePair<string, string>("money" , "Money"),
new KeyValuePair<string, string>("moon-o" , "Moon"),
new KeyValuePair<string, string>("music" , "Music"),
new KeyValuePair<string, string>("paperclip" , "Paperclip"),
new KeyValuePair<string, string>("pencil" , "Pencil"),
new KeyValuePair<string, string>("phone" , "Phone"),
new KeyValuePair<string, string>("picture-o" , "Picture"),
new KeyValuePair<string, string>("plane" , "Plane"),
new KeyValuePair<string, string>("power-off" , "Power Off"),
new KeyValuePair<string, string>("print" , "Print"),
new KeyValuePair<string, string>("puzzle-piece" , "Puzzle Piece"),
new KeyValuePair<string, string>("question" , "Question"),
new KeyValuePair<string, string>("question-circle" , "Question Circle"),
new KeyValuePair<string, string>("random" , "Random"),
new KeyValuePair<string, string>("retweet" , "Retweet"),
new KeyValuePair<string, string>("road" , "Road"),
new KeyValuePair<string, string>("rocket" , "Rocket"),
new KeyValuePair<string, string>("shield" , "Shield"),
new KeyValuePair<string, string>("shopping-cart" , "Shopping Cart"),
new KeyValuePair<string, string>("smile-o" , "Smile"),
new KeyValuePair<string, string>("star" , "Star"),
new KeyValuePair<string, string>("suitcase" , "Suitcase"),
new KeyValuePair<string, string>("sun-o" , "Sun"),
new KeyValuePair<string, string>("tablet" , "Tablet"),
new KeyValuePair<string, string>("tachometer" , "Tachometer"),
new KeyValuePair<string, string>("tasks" , "Tasks"),
new KeyValuePair<string, string>("thumbs-down" , "Thumbs Down"),
new KeyValuePair<string, string>("thumbs-o-down" , "Thumbs Down"),
new KeyValuePair<string, string>("thumbs-o-up" , "Thumbs Up"),
new KeyValuePair<string, string>("thumbs-up" , "Thumbs Up"),
new KeyValuePair<string, string>("thumb-tack" , "Thumb Tack"),
new KeyValuePair<string, string>("trash-o" , "Trash"),
new KeyValuePair<string, string>("trophy" , "Trophy"),
new KeyValuePair<string, string>("truck" , "Truck"),
new KeyValuePair<string, string>("umbrella" , "Umbrella"),
new KeyValuePair<string, string>("wheelchair" , "Wheelchair"),
new KeyValuePair<string, string>("windows" , "Windows"),
new KeyValuePair<string, string>("wrench" , "Wrench")
}.AsReadOnly();
}
// Icon Colours
if (this._IconColourCache == null)
{
this._IconColourCache = new List<KeyValuePair<string, string>>(){
new KeyValuePair<string, string>("lime" , "Lime"),
new KeyValuePair<string, string>("green" , "Green"),
new KeyValuePair<string, string>("emerald" , "Emerald"),
new KeyValuePair<string, string>("teal" , "Teal"),
new KeyValuePair<string, string>("cyan" , "Cyan"),
new KeyValuePair<string, string>("cobalt" , "Cobalt"),
new KeyValuePair<string, string>("indigo" , "Indigo"),
new KeyValuePair<string, string>("violet" , "Violet"),
new KeyValuePair<string, string>("pink" , "Pink"),
new KeyValuePair<string, string>("magenta" , "Magenta"),
new KeyValuePair<string, string>("crimson" , "Crimson"),
new KeyValuePair<string, string>("red" , "Red"),
new KeyValuePair<string, string>("orange" , "Orange"),
new KeyValuePair<string, string>("amber" , "Amber"),
new KeyValuePair<string, string>("yellow" , "Yellow"),
new KeyValuePair<string, string>("brown" , "Brown"),
new KeyValuePair<string, string>("olive" , "Olive"),
new KeyValuePair<string, string>("steel" , "Steel"),
new KeyValuePair<string, string>("mauve" , "Mauve"),
new KeyValuePair<string, string>("sienna" , "Sienna")
}.AsReadOnly();
}
// SLA Options
if (this._SlaOptions == null)
{
this._SlaOptions = new List<KeyValuePair<int, string>>()
{
new KeyValuePair<int, string>(0, "<None>"),
new KeyValuePair<int, string>(15, "15 minutes"),
new KeyValuePair<int, string>(30, "30 minutes"),
new KeyValuePair<int, string>(60, "1 hour"),
new KeyValuePair<int, string>(60 * 2, "2 hours"),
new KeyValuePair<int, string>(60 * 4, "4 hours"),
new KeyValuePair<int, string>(60 * 8, "8 hours"),
new KeyValuePair<int, string>(60 * 24, "1 day"),
new KeyValuePair<int, string>(60 * 24 * 2, "2 days"),
new KeyValuePair<int, string>(60 * 24 * 3, "3 days"),
new KeyValuePair<int, string>(60 * 24 * 4, "4 days"),
new KeyValuePair<int, string>(60 * 24 * 5, "5 days"),
new KeyValuePair<int, string>(60 * 24 * 6, "6 days"),
new KeyValuePair<int, string>(60 * 24 * 7, "1 week"),
new KeyValuePair<int, string>(60 * 24 * 7 * 2, "2 weeks"),
new KeyValuePair<int, string>(60 * 24 * 7 * 3, "3 weeks"),
new KeyValuePair<int, string>(60 * 24 * 7 * 4, "4 weeks"),
new KeyValuePair<int, string>(60 * 24 * 7 * 4 * 2, "2 months"),
new KeyValuePair<int, string>(60 * 24 * 7 * 4 * 3, "3 months"),
new KeyValuePair<int, string>(60 * 24 * 7 * 4 * 4, "4 months"),
new KeyValuePair<int, string>(60 * 24 * 7 * 4 * 5, "5 months"),
new KeyValuePair<int, string>(60 * 24 * 7 * 4 * 6, "6 months")
}.AsReadOnly();
}
#endregion
}
private void CalculateSubjectCache()
{
_SubjectCache = (from c in _Cache.Values.ToList()
from s in c.SubjectIds
group c by s into subjectId
select subjectId).ToDictionary(g => g.Key.ToLower(), g => g.ToList());
}
public ReadOnlyCollection<KeyValuePair<string, string>> Icons { get { return this._Icons; } }
public ReadOnlyCollection<KeyValuePair<string, string>> IconColours { get { return this._IconColourCache; } }
public ReadOnlyCollection<KeyValuePair<int, string>> SlaOptions { get { return this._SlaOptions; } }
public JobQueueToken UpdateQueue(JobQueue JobQueue)
{
var token = JobQueueToken.FromJobQueue(JobQueue);
JobQueueToken existingToken;
if (_Cache.TryGetValue(JobQueue.Id, out existingToken))
{
if (_Cache.TryUpdate(JobQueue.Id, token, existingToken))
{
if (existingToken.JobQueue.SubjectIds != token.JobQueue.SubjectIds)
CalculateSubjectCache();
return token;
}
else
return null;
}
else
{
if (_Cache.TryAdd(JobQueue.Id, token))
{
CalculateSubjectCache();
return token;
}
else
return null;
}
}
public bool RemoveQueue(int JobQueueId)
{
JobQueueToken token;
if (_Cache.TryRemove(JobQueueId, out token))
{
CalculateSubjectCache();
return true;
}
else
{
return false;
}
}
public JobQueueToken GetQueue(int JobQueueId)
{
JobQueueToken token;
if (_Cache.TryGetValue(JobQueueId, out token))
return token;
else
return null;
}
public ReadOnlyCollection<JobQueueToken> GetQueues()
{
return _Cache.Values.ToList().AsReadOnly();
}
private IEnumerable<JobQueueToken> GetQueuesForSubject(string SubjectId)
{
List<JobQueueToken> tokens;
if (_SubjectCache.TryGetValue(SubjectId.ToLower(), out tokens))
return tokens;
else
return Enumerable.Empty<JobQueueToken>();
}
public ReadOnlyCollection<JobQueueToken> GetQueuesForSubject(IEnumerable<string> SubjectIds)
{
return SubjectIds.SelectMany(sid => GetQueuesForSubject(sid)).Distinct().ToList().AsReadOnly();
}
public void ReInitializeCache(DiscoDataContext Database)
{
Initialize(Database);
}
}
}
@@ -0,0 +1,39 @@
using Disco.Data.Repository;
using Disco.Services.Tasks;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services.Jobs.JobQueues
{
public class JobQueueDeleteTask : ScheduledTask
{
public override string TaskName { get { return "Job Queues - Delete Queue"; } }
public override bool SingleInstanceTask { get { return false; }}
public override bool CancelInitiallySupported { get { return false; } }
public override bool LogExceptionsOnly { get { return true; } }
protected override void ExecuteTask()
{
int jobQueueId = (int)this.ExecutionContext.JobDetail.JobDataMap["JobQueueId"];
using (DiscoDataContext Database = new DiscoDataContext())
{
JobQueueService.DeleteJobQueue(Database, jobQueueId, this.Status);
}
}
public static ScheduledTaskStatus ScheduleNow(int JobQueueId)
{
JobDataMap taskData = new JobDataMap() { { "JobQueueId", JobQueueId } };
var instance = new JobQueueDeleteTask();
return instance.ScheduleTask(taskData);
}
}
}
@@ -0,0 +1,187 @@
using Disco.Data.Repository;
using Disco.Models.Repository;
using Disco.Services.Authorization;
using Disco.Services.Tasks;
using Disco.Services.Users;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace Disco.Services.Jobs.JobQueues
{
public static class JobQueueService
{
private const string _cacheHttpRequestKey = "Disco_UserQueuesToken_{0}";
private static Cache _cache;
public static void Initialize(DiscoDataContext Database)
{
_cache = new Cache(Database);
}
public static ReadOnlyCollection<KeyValuePair<string, string>> IconColours { get { return _cache.IconColours; } }
public static ReadOnlyCollection<KeyValuePair<string, string>> Icons { get { return _cache.Icons; } }
public static ReadOnlyCollection<KeyValuePair<int, string>> SlaOptions { get { return _cache.SlaOptions; } }
public static ReadOnlyCollection<JobQueueToken> GetQueues() { return _cache.GetQueues(); }
public static JobQueueToken GetQueue(int JobQueueId) { return _cache.GetQueue(JobQueueId); }
#region Job Queues Maintenance
public static JobQueueToken CreateJobQueue(DiscoDataContext Database, JobQueue JobQueue)
{
// Verify
if (string.IsNullOrWhiteSpace(JobQueue.Name))
throw new ArgumentException("The Job Queue Name is required");
if (string.IsNullOrWhiteSpace(JobQueue.Description))
throw new ArgumentException("The Job Queue Description is required");
// Name Unique
if (_cache.GetQueues().Count(q => q.JobQueue.Name == JobQueue.Name) > 0)
throw new ArgumentException("Another Job Queue already exists with that name", "JobQueue");
// Clone to break reference
var queue = new JobQueue()
{
Name = JobQueue.Name,
Description = JobQueue.Description,
Icon = JobQueue.Icon,
IconColour = JobQueue.IconColour,
DefaultSLAExpiry = JobQueue.DefaultSLAExpiry,
Priority = JobQueue.Priority,
SubjectIds = JobQueue.SubjectIds
};
Database.JobQueues.Add(queue);
Database.SaveChanges();
return _cache.UpdateQueue(queue);
}
public static JobQueueToken UpdateJobQueue(DiscoDataContext Database, JobQueue JobQueue)
{
// Verify
if (string.IsNullOrWhiteSpace(JobQueue.Name))
throw new ArgumentException("The Job Queue Name is required");
if (string.IsNullOrWhiteSpace(JobQueue.Description))
throw new ArgumentException("The Job Queue Description is required");
// Name Unique
if (_cache.GetQueues().Count(q => q.JobQueue.Id != JobQueue.Id && q.JobQueue.Name == JobQueue.Name) > 0)
throw new ArgumentException("Another Job Queue already exists with that name", "JobQueue");
Database.SaveChanges();
return _cache.UpdateQueue(JobQueue);
}
public static void DeleteJobQueue(DiscoDataContext Database, int JobQueueId, ScheduledTaskStatus Status)
{
JobQueue queue = Database.JobQueues.Find(JobQueueId);
// Validate: Current Jobs?
int currentJobCount = Database.JobQueueJobs.Count(jqj => jqj.JobQueueId == queue.Id && jqj.RemovedDate.HasValue);
if (currentJobCount > 0)
throw new InvalidOperationException("The Job Queue cannot be deleted because it contains jobs");
// Delete History
Status.UpdateStatus(0, string.Format("Removing '{0}' [{1}] Job Queue", queue.Name, queue.Id), "Starting");
var jobQueueJobs = Database.JobQueueJobs.Include("Job").Where(jsj => jsj.JobQueueId == queue.Id).ToList();
if (jobQueueJobs.Count > 0)
{
double progressInterval = 90 / jobQueueJobs.Count;
for (int jqjIndex = 0; jqjIndex < jobQueueJobs.Count; jqjIndex++)
{
var jqj = jobQueueJobs[jqjIndex];
Status.UpdateStatus(jqjIndex * progressInterval, string.Format("Merging history into job #{0} logs", jqj.JobId));
// Write Logs
Database.JobLogs.Add(new JobLog()
{
JobId = jqj.JobId,
TechUserId = jqj.AddedUserId,
Timestamp = jqj.AddedDate,
Comments = string.Format("Added to Job Queue: {1}{0}Priority: {2}{0}Comment: {3}", Environment.NewLine, queue.Name, jqj.Priority.ToString(), string.IsNullOrWhiteSpace(jqj.AddedComment) ? "<none>" : jqj.AddedComment)
});
Database.JobLogs.Add(new JobLog()
{
JobId = jqj.JobId,
TechUserId = jqj.RemovedUserId,
Timestamp = jqj.RemovedDate.Value,
Comments = string.Format("Removed from Job Queue: {1}{0}Comment: {2}", Environment.NewLine, queue.Name, string.IsNullOrWhiteSpace(jqj.RemovedComment) ? "<none>" : jqj.RemovedComment)
});
// Delete JQJ
Database.JobQueueJobs.Remove(jqj);
// Save Changes
Database.SaveChanges();
}
}
// Delete Queue
Status.UpdateStatus(90, "Deleting Queue");
Database.JobQueues.Remove(queue);
Database.SaveChanges();
// Remove from Cache
_cache.RemoveQueue(JobQueueId);
Status.Finished(string.Format("Successfully Deleted Job Queue: '{0}' [{1}]", queue.Name, queue.Id));
}
#endregion
public static ReadOnlyCollection<JobQueueToken> UsersQueues(User User)
{
return UsersQueues(User.Id);
}
public static ReadOnlyCollection<JobQueueToken> UsersQueues(string UserId)
{
var userAuth = UserService.GetAuthorization(UserId);
return UsersQueues(userAuth);
}
public static ReadOnlyCollection<JobQueueToken> UsersQueues(AuthorizationToken UserAuthorization)
{
string cacheKey = string.Format(_cacheHttpRequestKey, UserAuthorization.User.Id);
ReadOnlyCollection<JobQueueToken> tokens = null;
// Check for ASP.NET
if (HttpContext.Current != null)
{
tokens = (ReadOnlyCollection<JobQueueToken>)HttpContext.Current.Items[_cacheHttpRequestKey];
}
if (tokens == null)
{
var subjectIds = (new string[] { UserAuthorization.User.Id }).Concat(UserAuthorization.GroupMembership);
tokens = _cache.GetQueuesForSubject(subjectIds);
HttpContext.Current.Items[_cacheHttpRequestKey] = tokens;
}
return tokens;
}
public static string RandomIcon()
{
var rnd = new Random();
var unusedIcons = _cache.Icons.Select(i => i.Key).Except(_cache.GetQueues().Select(q => q.JobQueue.Icon)).ToList();
if (unusedIcons.Count > 0)
return unusedIcons[rnd.Next(unusedIcons.Count - 1)];
else
return _cache.Icons[rnd.Next(_cache.Icons.Count - 1)].Key;
}
public static string RandomIconColour()
{
var rnd = new Random();
var unusedColours = _cache.IconColours.Select(i => i.Key).Except(_cache.GetQueues().Select(q => q.JobQueue.IconColour)).ToList();
if (unusedColours.Count > 0)
return unusedColours[rnd.Next(unusedColours.Count - 1)];
else
return _cache.IconColours[rnd.Next(_cache.IconColours.Count - 1)].Key;
}
}
}
@@ -0,0 +1,27 @@
using Disco.Models.Repository;
using Disco.Models.Services.Jobs.JobQueues;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
namespace Disco.Services.Jobs.JobQueues
{
public class JobQueueToken : IJobQueueToken
{
public JobQueue JobQueue { get; private set; }
internal HashSet<string> SubjectIdHashes { get; private set; }
public ReadOnlyCollection<string> SubjectIds { get; private set; }
public static JobQueueToken FromJobQueue(JobQueue JobQueue)
{
string[] sg = (JobQueue.SubjectIds == null ? new string[0] : JobQueue.SubjectIds.Split(',').ToArray());
return new JobQueueToken()
{
JobQueue = JobQueue,
SubjectIdHashes = new HashSet<string>(sg.Select(i => i.ToLower())),
SubjectIds = sg.ToList().AsReadOnly()
};
}
}
}
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.1128.1503")]
[assembly: AssemblyFileVersion("1.2.1128.1503")]
[assembly: AssemblyVersion("1.2.1229.1537")]
[assembly: AssemblyFileVersion("1.2.1229.1537")]
@@ -264,6 +264,10 @@ namespace Disco.Services.Tasks
{
Finished(this._finishedMessage, this._finishedUrl);
}
public void Finished(string FinishedMessage)
{
Finished(FinishedMessage, this._finishedUrl);
}
public void Finished(string FinishedMessage, string FinishedUrl)
{
List<string> changedProperties = new List<string>() { "IsRunning", "FinishedTimestamp" };
+5
View File
@@ -11,6 +11,11 @@
<package id="Newtonsoft.Json" version="5.0.8" targetFramework="net45" />
<package id="Owin" version="1.0" targetFramework="net45" />
<package id="RazorGenerator.Mvc" version="2.1.2" targetFramework="net45" />
<package id="Rx-Core" version="2.1.30214.0" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.1.30214.0" targetFramework="net45" />
<package id="Rx-Linq" version="2.1.30214.0" targetFramework="net45" />
<package id="Rx-Main" version="2.1.30214.0" targetFramework="net45" />
<package id="Rx-PlatformServices" version="2.1.30214.0" targetFramework="net45" />
<package id="SqlServerCompact" version="4.0.8854.1" targetFramework="net40" />
<package id="WebActivatorEx" version="2.0.3" targetFramework="net45" />
</packages>