feature: device model/profile decommissioning

This commit is contained in:
Gary Sharp
2025-07-05 13:55:44 +10:00
parent 583552ffdd
commit 6e99b4503b
17 changed files with 714 additions and 23 deletions
@@ -48,12 +48,5 @@ namespace Disco.Services
return true;
}
public static void Decommission(this DeviceBatch db, DiscoDataContext database, DecommissionReasons Reason, bool unassignUsers)
{
if (!db.CanDecommission(database))
throw new InvalidOperationException("Decommission of Device Batch is Denied");
}
}
}
@@ -48,6 +48,17 @@ namespace Disco.Services
Database.DeviceModels.Remove(dm);
}
public static bool CanDecommission(this DeviceModel dm, DiscoDataContext database)
{
if (!UserService.CurrentAuthorization.Has(Claims.Device.Actions.Import))
return false;
if (!database.Devices.Any(d => d.DeviceModelId == dm.Id && d.DecommissionedDate == null))
return false;
return true;
}
public static Tuple<DeviceModel, bool> GetOrCreateDeviceModel(this DbSet<DeviceModel> DeviceModelsSet, string Manufacturer, string Model, string ModelType)
{
if (string.IsNullOrWhiteSpace(Manufacturer))
@@ -70,7 +70,18 @@ namespace Disco.Services
// Delete Profile
Database.DeviceProfiles.Remove(dp);
}
public static bool CanDecommission(this DeviceProfile dp, DiscoDataContext database)
{
if (!UserService.CurrentAuthorization.Has(Claims.Device.Actions.Import))
return false;
if (!database.Devices.Any(d => d.DeviceProfileId == dp.Id && d.DecommissionedDate == null))
return false;
return true;
}
public static IEnumerable<PluginFeatureManifest> GetCertificateProviders(this DeviceProfile dp)
{
if (!string.IsNullOrEmpty(dp.CertificateProviders))
@@ -93,6 +93,26 @@ namespace Disco.Services.Devices.Importing
return new DeviceDecommissionImportContext($"Batch: {deviceBatch.Name} ({deviceBatch.Id})", devices, decommissionReason, unassignUsers);
}
public static DeviceDecommissionImportContext Create(DiscoDataContext database, DeviceProfile deviceProfile, DecommissionReasons decommissionReason, bool unassignUsers)
{
var devices = database.Devices
.Include(d => d.Jobs)
.Include(d => d.AssignedUser)
.Where(d => d.DeviceProfileId == deviceProfile.Id && d.DecommissionedDate == null)
.ToList();
return new DeviceDecommissionImportContext($"Profile: {deviceProfile.Name} ({deviceProfile.Id})", devices, decommissionReason, unassignUsers);
}
public static DeviceDecommissionImportContext Create(DiscoDataContext database, DeviceModel deviceModel, DecommissionReasons decommissionReason, bool unassignUsers)
{
var devices = database.Devices
.Include(d => d.Jobs)
.Include(d => d.AssignedUser)
.Where(d => d.DeviceModelId == deviceModel.Id && d.DecommissionedDate == null)
.ToList();
return new DeviceDecommissionImportContext($"Model: {deviceModel.Description} ({deviceModel.Id})", devices, decommissionReason, unassignUsers);
}
public IDeviceImportColumn GetColumn(int Index)
=> throw new NotImplementedException();
@@ -43,6 +43,12 @@ namespace Disco.Services.Devices.Importing
public static IDeviceImportContext BeginDecommissionImport(DiscoDataContext database, DeviceBatch deviceBatch, DecommissionReasons decommissionReason, bool unassignUsers)
=> DeviceDecommissionImportContext.Create(database, deviceBatch, decommissionReason, unassignUsers);
public static IDeviceImportContext BeginDecommissionImport(DiscoDataContext database, DeviceProfile deviceProfile, DecommissionReasons decommissionReason, bool unassignUsers)
=> DeviceDecommissionImportContext.Create(database, deviceProfile, decommissionReason, unassignUsers);
public static IDeviceImportContext BeginDecommissionImport(DiscoDataContext database, DeviceModel deviceModel, DecommissionReasons decommissionReason, bool unassignUsers)
=> DeviceDecommissionImportContext.Create(database, deviceModel, decommissionReason, unassignUsers);
private static void GuessHeaderTypes(this IDeviceImportContext Context, DiscoDataContext Database)
{
using (var dataReader = Context.GetDataReader())