Files
Disco/Disco.Web/Models/Job/CreateModel.cs
T
Gary Sharp 27c21175d7 Certificate/wireless plugins; major refactoring
Migrate much of BI to Services.
Added Wireless Profile Provider plugin feature.
Added Certificate Authority Provider plugin feature.
Modified Certificate Provider plugin feature.
Database migration v17, for Device Profiles.
Enrolment Client Updated to support CA Certificates, Wireless Profiles
and Hardware Info.
New Client Enrolment Protocol to support new features.
Plugin Manifest Generator added to main solution.
Improved AD search performance.
2016-09-28 20:17:55 +10:00

179 lines
7.2 KiB
C#

using Disco.Data.Repository;
using Disco.Models.UI.Job;
using Disco.Services;
using Disco.Services.Authorization;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace Disco.Web.Models.Job
{
[CustomValidation(typeof(CreateModel), "ValidateCreateModel")]
public class CreateModel : JobCreateModel
{
public string DeviceSerialNumber { get; set; }
public string UserId { get; set; }
[Required]
public string Type { get; set; }
[Required]
public List<string> SubTypes { get; set; }
[DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)]
public string Comments { get; set; }
[Required(ErrorMessage = "Please specify whether the device is held or not")]
public bool? DeviceHeld { get; set; }
public string SourceUrl { get; set; }
[Display(Description = "Automatically close this job")]
public bool? QuickLog { get; set; }
public int? QuickLogTaskTimeMinutes { get; set; }
public int? QuickLogTaskTimeMinutesOther { get; set; }
#region Helpers & Model Logic
// View Required Data
public Disco.Models.Repository.Device Device { get; set; }
public Disco.Models.Repository.User User { get; set; }
public List<Disco.Models.Repository.JobType> JobTypes { get; set; }
public void UpdateModel(DiscoDataContext Database, AuthorizationToken Authorization)
{
if (this.JobTypes == null)
this.JobTypes = Database.JobTypes.Include("JobSubTypes.JobQueues").FilterCreatableTypePermissions(Authorization).ToList();
if (!string.IsNullOrEmpty(DeviceSerialNumber))
{
this.Device = Database.Devices.Include("DeviceModel").Where(d => d.SerialNumber == DeviceSerialNumber).FirstOrDefault();
if (this.Device == null)
{
throw new ArgumentException("Invalid Device Serial Number Specified", "DeviceSerialNumber");
}
if (string.IsNullOrEmpty(this.UserId) && !string.IsNullOrEmpty(this.Device.AssignedUserId))
{
this.UserId = this.Device.AssignedUserId;
}
if (string.IsNullOrEmpty(this.Type))
this.Type = this.JobTypes.Any(jt => jt.Id == Disco.Models.Repository.JobType.JobTypeIds.HWar) ? Disco.Models.Repository.JobType.JobTypeIds.HWar : this.JobTypes.First().Id;
if (string.IsNullOrEmpty(this.UserId))
{
// No User - Remove User Types
foreach (var jobType in JobTypes.ToArray())
{
switch (jobType.Id)
{
case Disco.Models.Repository.JobType.JobTypeIds.UMgmt:
JobTypes.Remove(jobType);
break;
default:
break;
}
}
}
}
else
{
// No Device - Remove Hardware Types
foreach (var jobType in JobTypes.ToArray())
{
switch (jobType.Id)
{
case Disco.Models.Repository.JobType.JobTypeIds.HMisc:
case Disco.Models.Repository.JobType.JobTypeIds.HNWar:
case Disco.Models.Repository.JobType.JobTypeIds.HWar:
case Disco.Models.Repository.JobType.JobTypeIds.SImg:
JobTypes.Remove(jobType);
break;
default:
break;
}
}
// Set Default Job Type for Users
if (string.IsNullOrEmpty(this.Type))
this.Type = this.JobTypes.Any(jt => jt.Id == Disco.Models.Repository.JobType.JobTypeIds.SApp) ? Disco.Models.Repository.JobType.JobTypeIds.SApp : this.JobTypes.First().Id;
}
if (!string.IsNullOrEmpty(UserId))
{
this.User = Database.Users.Find(UserId);
if (this.User == null)
{
throw new ArgumentException("Invalid User Id Specified", "UserId");
}
if (string.IsNullOrEmpty(this.Type))
this.Type = Disco.Models.Repository.JobType.JobTypeIds.SApp;
}
if (this.User == null && this.Device == null)
{
throw new InvalidOperationException("A Job must reference a Device and/or a User");
}
}
// Job Type Helpers
public Disco.Models.Repository.JobType GetJobType
{
get
{
if (!string.IsNullOrEmpty(this.Type))
{
return this.JobTypes.FirstOrDefault(m => m.Id == this.Type);
}
return null;
}
}
public List<Disco.Models.Repository.JobSubType> GetJobSubTypes
{
get
{
if (SubTypes != null)
{
var subTypes = this.SubTypes;
return this.JobTypes.SelectMany(jt => jt.JobSubTypes).Where(m => subTypes.Contains(String.Format("{0}_{1}", m.JobTypeId, m.Id))).ToList();
}
return null;
}
}
public static ValidationResult ValidateCreateModel(CreateModel model)
{
// Device && User both can't be null
if (string.IsNullOrEmpty(model.DeviceSerialNumber) && string.IsNullOrEmpty(model.UserId))
return new ValidationResult("A Job must reference a Device and/or a User");
if (!string.IsNullOrEmpty(model.Type) && model.SubTypes != null)
{
var typeId = string.Format("{0}_", model.Type);
model.SubTypes = model.SubTypes.Where(m => m.StartsWith(typeId)).ToList();
if (model.SubTypes.Count == 0)
{
model.SubTypes = null;
return new ValidationResult("At least one Sub Type is required", new string[] { "SubTypes" });
}
}
// Enforce Behaviour
if (model.DeviceHeld.HasValue && model.DeviceHeld.Value)
{
model.QuickLog = false;
}
else
{
if (model.QuickLog.HasValue && model.QuickLog.Value)
{
if (!model.QuickLogTaskTimeMinutes.HasValue || model.QuickLogTaskTimeMinutes.Value <= 0)
if (model.QuickLogTaskTimeMinutesOther.HasValue && model.QuickLogTaskTimeMinutesOther.Value > 0)
model.QuickLogTaskTimeMinutes = model.QuickLogTaskTimeMinutesOther.Value;
else
model.QuickLogTaskTimeMinutes = 10; // Default to 10 Minutes
}
}
return ValidationResult.Success;
}
#endregion
}
}