public static Stream GenerateBulkFromPackage(DocumentTemplatePackage package, DiscoDataContext Database, User CreatorUser, DateTime Timestamp, bool InsertBlankPages, List<IAttachmentTarget> DataObjects) { if (DataObjects.Count > 0) { List<Stream> generatedPdfs = new List<Stream>(DataObjects.Count); using (var state = DocumentState.DefaultState()) { foreach (var d in DataObjects) { generatedPdfs.Add(package.GeneratePdfPackage(Database, d, CreatorUser, Timestamp, state)); state.SequenceNumber++; state.FlushScopeCache(); } } if (generatedPdfs.Count == 1) { return generatedPdfs[0]; } else { Stream bulkPdf = Utilities.JoinPdfs(package.InsertBlankPages || InsertBlankPages, generatedPdfs); foreach (Stream singlePdf in generatedPdfs) singlePdf.Dispose(); return bulkPdf; } } return null; }
public static void OnRemove(this UserFlagAssignment fa, DiscoDataContext Database, User RemovingUser) { if (!fa.CanRemove()) throw new InvalidOperationException("Removing user flags is denied"); fa.OnRemoveUnsafe(Database, RemovingUser); }
public static List<DocumentTemplate> AvailableDocumentTemplates(this Device d, DiscoDataContext Database, User User, DateTime TimeStamp) { List<DocumentTemplate> ats = Database.DocumentTemplates .Where(at => !at.IsHidden && at.Scope == DocumentTemplate.DocumentTemplateScopes.Device).ToList(); return ats.Where(at => at.FilterExpressionMatches(d, Database, User, TimeStamp, DocumentState.DefaultState())).ToList(); }
public static List<DocumentTemplatePackage> AvailablePackages(this Job job, DiscoDataContext Database, User TechnicianUser) { var packages = new List<DocumentTemplatePackage>(); foreach (var package in AvailablePackages(Database, AttachmentTypes.Job)) { bool subTypeMatch = true; // default match if (package.JobSubTypes != null && package.JobSubTypes.Count > 0) { subTypeMatch = false; // enforce match foreach (var subType in job.JobSubTypes) { if (package.JobSubTypes.Contains($"{subType.JobTypeId}_{subType.Id}", StringComparer.OrdinalIgnoreCase)) { subTypeMatch = true; break; } } } if (subTypeMatch) { if (package.FilterExpressionMatches(job, Database, TechnicianUser, DateTime.Now, DocumentState.DefaultState())) { packages.Add(package); } } } return packages; }
public static bool FilterExpressionMatches(this DocumentTemplate dt, object Data, DiscoDataContext Database, User User, System.DateTime TimeStamp, DocumentState State) { if (!string.IsNullOrEmpty(dt.FilterExpression)) { var compiledExpression = dt.FilterExpressionFromCache(); var evaluatorVariables = Expression.StandardVariables(dt, Database, User, TimeStamp, State); try { var er = compiledExpression.EvaluateFirst<object>(Data, evaluatorVariables); if (er is bool) { return (bool)er; } bool erBool; if (bool.TryParse(er.ToString(), out erBool)) { return erBool; } } catch { return false; } } return true; }
public static Stream GenerateBulkFromPackage(DocumentTemplatePackage package, DiscoDataContext Database, User CreatorUser, DateTime Timestamp, bool InsertBlankPages, List<string> DataObjectsIds) { List<IAttachmentTarget> DataObjects; switch (package.Scope) { case AttachmentTypes.Device: DataObjects = Database.Devices.Where(d => DataObjectsIds.Contains(d.SerialNumber)).ToList<IAttachmentTarget>(); break; case AttachmentTypes.Job: int[] intDataObjectsIds = DataObjectsIds.Select(i => int.Parse(i)).ToArray(); DataObjects = Database.Jobs.Where(j => intDataObjectsIds.Contains(j.Id)).ToList<IAttachmentTarget>(); break; case AttachmentTypes.User: DataObjects = new List<IAttachmentTarget>(DataObjectsIds.Count); for (int idIndex = 0; idIndex < DataObjectsIds.Count; idIndex++) { string dataObjectId = DataObjectsIds[idIndex]; var user = UserService.GetUser(ActiveDirectory.ParseDomainAccountId(dataObjectId), Database, true); if (user == null) throw new Exception($"Unknown Username specified: {dataObjectId}"); DataObjects.Add(user); } break; default: throw new InvalidOperationException("Invalid DocumentType Scope"); } return GenerateBulkFromPackage(package, Database, CreatorUser, Timestamp, InsertBlankPages, DataObjects); }
public static string GetActiveDirectoryStringValue(User User, string PropertyName, int Index = 0) { var objectValue = GetActiveDirectoryObjectValue(User, PropertyName, Index); string stringValue = objectValue as string; if (stringValue == null && objectValue != null) stringValue = objectValue.ToString(); return stringValue; }
public static object GetActiveDirectoryObjectValue(User User, string PropertyName, int Index = 0) { var adUserAccount = User.ActiveDirectoryAccount(PropertyName); if (adUserAccount != null) return adUserAccount.GetPropertyValues<object>(PropertyName).Skip(Index).FirstOrDefault(); else return null; }
public static void OnDeviceReturned(this Job j, User Technician) { if (!j.CanDeviceReturned()) throw new InvalidOperationException("Device Return was Denied"); j.DeviceReturnedDate = DateTime.Now; j.DeviceReturnedTechUserId = Technician.UserId; }
public static PublishJobResult Publish(DiscoDataContext Database, Job Job, User TechUser, string Recipient, string RecipientReference, string Comments, List<JobAttachment> Attachments, Func<JobAttachment, DiscoDataContext, string> AttachmentFilenameRetriever) { var url = ServiceUrl("Publish"); using (var httpClient = new HttpClient()) { using (var formData = new MultipartFormDataContent()) { formData.Add(new StringContent(Database.DiscoConfiguration.DeploymentId), "DeploymentId"); formData.Add(new StringContent(Job.Id.ToString()), "JobId"); formData.Add(new StringContent(TechUser.UserId), "TechnicianId"); formData.Add(new StringContent(TechUser.DisplayName ?? TechUser.UserId), "TechnicianName"); if (!string.IsNullOrWhiteSpace(TechUser.PhoneNumber)) formData.Add(new StringContent(TechUser.PhoneNumber), "TechnicianPhone"); if (!string.IsNullOrWhiteSpace(TechUser.EmailAddress)) formData.Add(new StringContent(TechUser.EmailAddress), "TechnicianEmail"); formData.Add(new StringContent(Recipient), "Recipient"); if (!string.IsNullOrWhiteSpace(RecipientReference)) formData.Add(new StringContent(RecipientReference), "RecipientReference"); if (!string.IsNullOrWhiteSpace(Comments)) formData.Add(new StringContent(Comments), "PublishedComments"); if (Attachments != null && Attachments.Count > 0) { Attachments .Select(a => new { Attachment = a, Filename = AttachmentFilenameRetriever(a, Database) }) .Where(a => System.IO.File.Exists(a.Filename)) .Select((a, i) => new { Attachment = a.Attachment, Filename = a.Filename, Index = i }) .ToList() .ForEach(a => { formData.Add(new StringContent(a.Attachment.Filename), string.Format("Attachments[{0}].Filename", a.Index)); formData.Add(new StringContent(a.Attachment.MimeType), string.Format("Attachments[{0}].MimeType", a.Index)); formData.Add(new StringContent(a.Attachment.Timestamp.ToISO8601()), string.Format("Attachments[{0}].CreatedDate", a.Index)); if (a.Attachment.DocumentTemplateId != null) formData.Add(new StringContent(a.Attachment.DocumentTemplateId), string.Format("Attachments[{0}].DocumentTemplateId", a.Index)); if (a.Attachment.Comments != null) formData.Add(new StringContent(a.Attachment.Comments), string.Format("Attachments[{0}].Comments", a.Index)); formData.Add(new ByteArrayContent(File.ReadAllBytes(a.Filename)), string.Format("Attachments[{0}].File", a.Index), a.Attachment.Filename); }); } var response = httpClient.PostAsync(url, formData).Result; response.EnsureSuccessStatusCode(); var resultJson = response.Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject<PublishJobResult>(resultJson); return result; } } }
public static AuthorizationToken BuildToken(User User, IEnumerable<string> GroupMembership) { return new AuthorizationToken() { User = User, GroupMembership = GroupMembership.ToList(), RoleTokens = RoleCache.GetRoleTokens(GroupMembership, User) }; }
public static List<DocumentTemplate> AvailableDocumentTemplates(this User u, DiscoDataContext Database, User User, DateTime TimeStamp) { var dts = Database.DocumentTemplates.Include("JobSubTypes") .Where(dt => !dt.IsHidden && dt.Scope == DocumentTemplate.DocumentTemplateScopes.User) .ToArray() .Where(dt => dt.FilterExpressionMatches(u, Database, User, TimeStamp, DocumentState.DefaultState())).ToList(); return dts; }
public static AuthorizationToken BuildComputerAccountToken(User User) { return new AuthorizationToken() { User = User, GroupMembership = new List<string>(), RoleTokens = new List<IRoleToken>() { (IRoleToken)RoleCache.GetRoleToken(RoleCache.ComputerAccountTokenId) } }; }
public static void OnDeviceHeld(this Job j, User Technician) { if (!j.CanDeviceHeld()) throw new InvalidOperationException("Holding Device was Denied"); j.DeviceHeld = DateTime.Now; j.DeviceHeldTechUserId = Technician.UserId; j.DeviceReadyForReturn = null; j.DeviceReadyForReturnTechUserId = null; j.DeviceReturnedDate = null; j.DeviceReturnedTechUserId = null; }
public static List<DocumentTemplatePackage> AvailablePackages(this Device device, DiscoDataContext Database, User TechnicianUser) { var packages = new List<DocumentTemplatePackage>(); foreach (var package in AvailablePackages(Database, AttachmentTypes.Device)) { if (package.FilterExpressionMatches(device, Database, TechnicianUser, DateTime.Now, DocumentState.DefaultState())) { packages.Add(package); } } return packages; }
public static string EvaluateOnAttachmentImportExpression(this DocumentTemplate dt, IAttachment Data, DiscoDataContext Database, User User, DateTime TimeStamp, List<DocumentUniqueIdentifier> PageIdentifiers) { if (!string.IsNullOrEmpty(dt.OnImportAttachmentExpression)) { var compiledExpression = dt.OnImportAttachmentExpressionFromCache(); var evaluatorVariables = Expression.StandardVariables(dt, Database, User, TimeStamp, null); evaluatorVariables.Add("PageIdentifiers", PageIdentifiers); var result = compiledExpression.EvaluateFirst<object>(Data, evaluatorVariables); if (result == null) return null; else return result.ToString(); } return null; }
public void UpdateSelf(User u) { if (!this.UserId.Equals(u.UserId, StringComparison.OrdinalIgnoreCase)) throw new ArgumentException("User Id's do not match", "u"); if (this.Surname != u.Surname) this.Surname = u.Surname; if (this.GivenName != u.GivenName) this.GivenName = u.GivenName; if (this.DisplayName != u.DisplayName) this.DisplayName = u.DisplayName; if (this.EmailAddress != u.EmailAddress) this.EmailAddress = u.EmailAddress; if (this.PhoneNumber != u.PhoneNumber) this.PhoneNumber = u.PhoneNumber; }
public static Stream GeneratePdf(this DocumentTemplate dt, DiscoDataContext Database, IAttachmentTarget Target, User CreatorUser, DateTime TimeStamp, DocumentState State, bool FlattenFields = false) { bool generateExpression = !string.IsNullOrEmpty(dt.OnGenerateExpression); string generateExpressionResult = null; if (generateExpression) generateExpressionResult = dt.EvaluateOnGenerateExpression(Target, Database, CreatorUser, TimeStamp, State); var pdfStream = Interop.Pdf.PdfGenerator.GenerateFromTemplate(dt, Database, Target, CreatorUser, TimeStamp, State, FlattenFields); if (generateExpression) DocumentsLog.LogDocumentGenerated(dt, Target, CreatorUser, generateExpressionResult); else DocumentsLog.LogDocumentGenerated(dt, Target, CreatorUser); return pdfStream; }
public static int GetActiveDirectoryIntegerValue(User User, string PropertyName, int Index = 0) { var objectValue = GetActiveDirectoryObjectValue(User, PropertyName, Index); if (objectValue == null) return default(int); else { int intValue; try { intValue = (int)Convert.ChangeType(objectValue, typeof(int)); } catch (Exception) { throw; } return intValue; } }
public static Stream GenerateFromPackage(DocumentTemplatePackage package, DiscoDataContext Database, IAttachmentTarget Data, User CreatorUser, DateTime Timestamp, DocumentState State) { var templates = package.GetDocumentTemplates(Database); if (templates.Count == 0) return null; bool generateExpression = !string.IsNullOrEmpty(package.OnGenerateExpression); string generateExpressionResult = null; if (generateExpression) generateExpressionResult = package.EvaluateOnGenerateExpression(Data, Database, CreatorUser, Timestamp, State); List<Stream> generatedPdfs = new List<Stream>(templates.Count); foreach (var template in templates) { generatedPdfs.Add(template.GeneratePdf(Database, Data, CreatorUser, Timestamp, State, true)); State.SequenceNumber++; State.FlushScopeCache(); } if (generateExpression) DocumentsLog.LogDocumentPackageGenerated(package, Data, CreatorUser, generateExpressionResult); else DocumentsLog.LogDocumentPackageGenerated(package, Data, CreatorUser); if (generatedPdfs.Count == 1) { return generatedPdfs[0]; } else { Stream bulkPdf = Utilities.JoinPdfs(package.InsertBlankPages, generatedPdfs); foreach (Stream singlePdf in generatedPdfs) singlePdf.Dispose(); return bulkPdf; } }
public static void OnRemoveUnsafe(this UserFlagAssignment fa, DiscoDataContext Database, User RemovingUser) { fa.RemovedDate = DateTime.Now; fa.RemovedUserId = RemovingUser.UserId; if (!string.IsNullOrWhiteSpace(fa.UserFlag.OnUnassignmentExpression)) { try { Database.SaveChanges(); var expressionResult = fa.EvaluateOnUnassignmentExpression(Database, RemovingUser, fa.AddedDate); if (!string.IsNullOrWhiteSpace(expressionResult)) { fa.OnUnassignmentExpressionResult = expressionResult; Database.SaveChanges(); } } catch (Exception ex) { SystemLog.LogException("User Flag Expression - OnUnassignmentExpression", ex); } } }
private void SubmitJobValidateEnvironment(DiscoDataContext dbContext, Controller controller, User TechUser, Job Job, ViewModels.NNOptionsViewModel OptionsModel) { // Validate TechUser Email Address if (OptionsModel == null || (OptionsModel.NTPDevice.HasValue && !OptionsModel.NTPDevice.Value)) { // Non-NTP Device (or Unknown) // Check for Technicians Details if (string.IsNullOrEmpty(TechUser.EmailAddress)) controller.ModelState.AddModelError(string.Empty, "NN Requires a Technician Email Address (Update your Email Address in Active Directory)"); if (string.IsNullOrEmpty(TechUser.PhoneNumber)) controller.ModelState.AddModelError(string.Empty, "NN Requires a Technician Phone Number (Update your Telephone Number in Active Directory)"); } else { if (!NNSuspectedIssues.ContainsKey(OptionsModel.Issue)) controller.ModelState.AddModelError("Issue", "Unknown Suspected Issue Id"); if (OptionsModel.NTPDevice.HasValue && OptionsModel.NTPDevice.Value) { // NTP Device (Use Users Details) if (string.IsNullOrEmpty(Job.User.EmailAddress)) controller.ModelState.AddModelError(string.Empty, "NN NTP Device requires the User's Email Address (Update the Email Address in Active Directory)"); if (string.IsNullOrEmpty(Job.User.PhoneNumber)) controller.ModelState.AddModelError(string.Empty, "NN NTP Device requires the User's Phone Number (Update the Phone Number in Active Directory)"); } else { // Non-NTP Device (or Unknown) // Check for Technicians Details if (string.IsNullOrEmpty(TechUser.EmailAddress)) controller.ModelState.AddModelError(string.Empty, "NN Requires a Technician Email Address (Update your Email Address in Active Directory)"); if (string.IsNullOrEmpty(TechUser.PhoneNumber)) controller.ModelState.AddModelError(string.Empty, "NN Requires a Technician Phone Number (Update your Telephone Number in Active Directory)"); } } }
public static UserFlagAssignment OnAddUserFlagUnsafe(this User u, DiscoDataContext Database, UserFlag flag, User AddingUser, string Comments) { var fa = new UserFlagAssignment() { UserFlag = flag, User = u, AddedDate = DateTime.Now, AddedUser = AddingUser, Comments = string.IsNullOrWhiteSpace(Comments) ? null : Comments.Trim() }; Database.UserFlagAssignments.Add(fa); if (!string.IsNullOrWhiteSpace(flag.OnAssignmentExpression)) { try { Database.SaveChanges(); var expressionResult = fa.EvaluateOnAssignmentExpression(Database, AddingUser, fa.AddedDate); if (!string.IsNullOrWhiteSpace(expressionResult)) { fa.OnAssignmentExpressionResult = expressionResult; Database.SaveChanges(); } } catch (Exception ex) { SystemLog.LogException("User Flag Expression - OnAssignmentExpression", ex); } } return fa; }
public static void UpdateSubTypes(this Job j, DiscoDataContext Database, List<JobSubType> SubTypes, bool AddComponents, User TechUser) { if (SubTypes == null || SubTypes.Count == 0) throw new ArgumentException("The Job must contain at least one Sub Type"); List<JobSubType> addedSubTypes = new List<JobSubType>(); List<JobSubType> removedSubTypes = new List<JobSubType>(); // Removed Sub Types foreach (var t in j.JobSubTypes.ToArray()) if (!SubTypes.Contains(t)) { removedSubTypes.Add(t); j.JobSubTypes.Remove(t); } // Added Sub Types foreach (var t in SubTypes) if (!j.JobSubTypes.Contains(t)) { addedSubTypes.Add(t); j.JobSubTypes.Add(t); } // Write Log if (addedSubTypes.Count > 0 || removedSubTypes.Count > 0) { StringBuilder logBuilder = new StringBuilder(); logBuilder.AppendLine("# Updated Job Sub Types"); if (removedSubTypes.Count > 0) { logBuilder.AppendLine().AppendLine("Removed:"); foreach (var t in removedSubTypes) logBuilder.Append("- **").Append(t.ToString()).AppendLine("**"); } if (addedSubTypes.Count > 0) { logBuilder.AppendLine().AppendLine("Added:"); foreach (var t in addedSubTypes) logBuilder.Append("- **").Append(t.ToString()).AppendLine("**"); } Database.JobLogs.Add(new JobLog() { JobId = j.Id, TechUserId = TechUser.UserId, Timestamp = DateTime.Now, Comments = logBuilder.ToString() }); } // Add Components if (AddComponents && addedSubTypes.Count > 0 && j.DeviceSerialNumber != null) { var components = Database.DeviceComponents.Include("JobSubTypes").Where(c => !c.DeviceModelId.HasValue || c.DeviceModelId == j.Device.DeviceModelId); var addedComponents = new List<DeviceComponent>(); foreach (var c in components) { foreach (var st in c.JobSubTypes) { foreach (var jst in addedSubTypes) { if (st.JobTypeId == jst.JobTypeId && st.Id == jst.Id) { addedComponents.Add(c); break; } } if (addedComponents.Contains(c)) break; } } foreach (var c in addedComponents) { if (!j.JobComponents.Any(jc => jc.Description.Equals(c.Description, StringComparison.OrdinalIgnoreCase))) { // Job Component with matching Description doesn't exist. Database.JobComponents.Add(new JobComponent() { Job = j, TechUserId = TechUser.UserId, Cost = c.Cost, Description = c.Description }); } } } }
public static UserFlagAssignment OnAddUserFlag(this User u, DiscoDataContext Database, UserFlag flag, User AddingUser, string Comments) { if (!u.CanAddUserFlag(flag)) throw new InvalidOperationException("Adding user flag is denied"); return u.OnAddUserFlagUnsafe(Database, flag, AddingUser, Comments); }
public static string EvaluateOnGenerateExpression(this DocumentTemplate dt, object Data, DiscoDataContext Database, User User, DateTime TimeStamp, DocumentState State) { if (!string.IsNullOrEmpty(dt.OnGenerateExpression)) { var compiledExpression = dt.OnGenerateExpressionFromCache(); var evaluatorVariables = Expression.StandardVariables(dt, Database, User, TimeStamp, State); var result = compiledExpression.EvaluateFirst<object>(Data, evaluatorVariables); return result.ToString(); } return null; }
public static string EvaluateOnUnassignmentExpression(this UserFlagAssignment ufa, DiscoDataContext Database, User RemovingUser, DateTime TimeStamp) { if (!string.IsNullOrEmpty(ufa.UserFlag.OnUnassignmentExpression)) { Expression compiledExpression = ufa.UserFlag.OnUnassignmentExpressionFromCache(); IDictionary evaluatorVariables = Expression.StandardVariables(null, Database, RemovingUser, TimeStamp, null); object result = compiledExpression.EvaluateFirst<object>(ufa, evaluatorVariables); if (result == null) return null; else return result.ToString(); } return null; }
public static List<DocumentTemplatePackage> AvailableDocumentTemplatePackages(this User u, DiscoDataContext Database, User TechnicianUser) { return DocumentTemplatePackages.AvailablePackages(u, Database, TechnicianUser); }
internal static List<IRoleToken> GetRoleTokens(IEnumerable<string> SecurityGroup, User User) { var subjectIds = SecurityGroup.Concat(new string[] { User.UserId }); return _Cache.Where(t => subjectIds.Any(sg => t.SubjectIdHashes.Contains(sg))).Cast<IRoleToken>().ToList(); }
public static Job Create(DiscoDataContext Database, Device device, User user, JobType type, List<JobSubType> subTypes, User initialTech, bool addAutoQueues = true) { Job j = new Job() { JobType = type, OpenedTechUserId = initialTech.UserId, OpenedTechUser = initialTech, OpenedDate = DateTime.Now }; // Device if (device != null) { j.Device = device; j.DeviceSerialNumber = device.SerialNumber; } // User if (user != null) { j.User = user; j.UserId = user.UserId; } // Sub Types List<JobSubType> jobSubTypes = subTypes.ToList(); j.JobSubTypes = jobSubTypes; Database.Jobs.Add(j); // Job Queues if (addAutoQueues) { var queues = from st in subTypes from jq in st.JobQueues group st by jq into g select new { queue = g.Key, subTypes = g }; foreach (var queue in queues) { var commentBuilder = new StringBuilder("Automatically added by:").AppendLine(); foreach (var subType in queue.subTypes) { commentBuilder.AppendLine().Append("* ").Append(subType.Description); } var jqj = new JobQueueJob() { JobQueueId = queue.queue.Id, Job = j, AddedDate = DateTime.Now, AddedUserId = initialTech.UserId, AddedComment = commentBuilder.ToString(), SLAExpiresDate = queue.queue.DefaultSLAExpiry.HasValue ? (DateTime?)DateTime.Now.AddMinutes(queue.queue.DefaultSLAExpiry.Value) : null, Priority = JobQueuePriority.Normal }; Database.JobQueueJobs.Add(jqj); } } switch (type.Id) { case JobType.JobTypeIds.HWar: Database.JobMetaWarranties.Add(new JobMetaWarranty() { Job = j }); break; case JobType.JobTypeIds.HNWar: Database.JobMetaNonWarranties.Add(new JobMetaNonWarranty() { Job = j }); if (device != null) { // Add Job Components var components = Database.DeviceComponents.Include("JobSubTypes").Where(c => !c.DeviceModelId.HasValue || c.DeviceModelId == j.Device.DeviceModelId); var addedComponents = new List<DeviceComponent>(); foreach (var c in components) { if (c.JobSubTypes.Count == 0) { // No Filter addedComponents.Add(c); } else { foreach (var st in c.JobSubTypes) { foreach (var jst in jobSubTypes) { if (st.JobTypeId == jst.JobTypeId && st.Id == jst.Id) { addedComponents.Add(c); break; } } if (addedComponents.Contains(c)) break; } } } foreach (var c in addedComponents) Database.JobComponents.Add(new JobComponent() { Job = j, TechUserId = initialTech.UserId, Cost = c.Cost, Description = c.Description }); } break; } return j; }