private DocumentTemplateDevicesManagedGroup(string Key, ADManagedGroupConfiguration Configuration, DocumentTemplate DocumentTemplate) : base(Key, Configuration) { this.DocumentTemplateId = DocumentTemplate.Id; this.DocumentTemplateDescription = DocumentTemplate.Description; this.DocumentTemplateScope = DocumentTemplate.Scope; }
public static string GetKey(DocumentTemplate DocumentTemplate) { return string.Format(KeyFormat, DocumentTemplate.Id); }
public static DocumentTemplateDevicesManagedGroup Initialize(DocumentTemplate Template) { var key = GetKey(Template); if (!string.IsNullOrEmpty(Template.DevicesLinkedGroup)) { var config = ADManagedGroup.ConfigurationFromJson(Template.DevicesLinkedGroup); if (config != null && !string.IsNullOrWhiteSpace(config.GroupId)) { var group = new DocumentTemplateDevicesManagedGroup( key, config, Template); // Add to AD Context ActiveDirectory.Context.ManagedGroups.AddOrUpdate(group); return group; } } // Remove from AD Context ActiveDirectory.Context.ManagedGroups.Remove(key); return null; }
private void UpdateDescription(DocumentTemplate documentTemplate, string Description) { if (!string.IsNullOrWhiteSpace(Description)) { documentTemplate.Description = Description.Trim(); Database.SaveChanges(); return; } throw new Exception("Invalid Description"); }
public static bool TryGetManagedGroup(DocumentTemplate DocumentTemplate, out DocumentTemplateDevicesManagedGroup ManagedGroup) { ADManagedGroup managedGroup; string key = GetKey(DocumentTemplate); if (ActiveDirectory.Context.ManagedGroups.TryGetValue(key, out managedGroup)) { ManagedGroup = (DocumentTemplateDevicesManagedGroup)managedGroup; return true; } else { ManagedGroup = null; return false; } }
public static Stream GenerateFromTemplate(DocumentTemplate dt, DiscoDataContext Database, IAttachmentTarget Data, User CreatorUser, DateTime TimeStamp, DocumentState State, bool FlattenFields = false) { // Validate Data switch (dt.Scope) { case DocumentTemplate.DocumentTemplateScopes.Device: if (!(Data is Device)) throw new ArgumentException("This AttachmentType is configured for Devices only", "Data"); break; case DocumentTemplate.DocumentTemplateScopes.Job: if (!(Data is Job)) throw new ArgumentException("This AttachmentType is configured for Jobs only", "Data"); break; case DocumentTemplate.DocumentTemplateScopes.User: if (!(Data is User)) throw new ArgumentException("This AttachmentType is configured for Users only", "Data"); break; default: throw new InvalidOperationException("Invalid AttachmentType Scope"); } Database.Configuration.LazyLoadingEnabled = true; // Override FlattenFields if Document Template instructs. if (dt.FlattenForm) FlattenFields = true; ConcurrentDictionary<string, Expression> expressionCache = dt.PdfExpressionsFromCache(Database); string templateFilename = dt.RepositoryFilename(Database); PdfReader pdfReader = new PdfReader(templateFilename); MemoryStream pdfGeneratedStream = new MemoryStream(); PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfGeneratedStream); pdfStamper.FormFlattening = FlattenFields; pdfStamper.Writer.CloseStream = false; IDictionary expressionVariables = Expression.StandardVariables(dt, Database, CreatorUser, TimeStamp, State); foreach (string pdfFieldKey in pdfStamper.AcroFields.Fields.Keys) { if (pdfFieldKey.Equals("DiscoAttachmentId", StringComparison.OrdinalIgnoreCase)) { AcroFields.Item fields = pdfStamper.AcroFields.Fields[pdfFieldKey]; string fieldValue = dt.CreateUniqueIdentifier(Database, Data, CreatorUser, TimeStamp, 0).ToJson(); if (FlattenFields) pdfStamper.AcroFields.SetField(pdfFieldKey, String.Empty); else pdfStamper.AcroFields.SetField(pdfFieldKey, fieldValue); IList<AcroFields.FieldPosition> pdfFieldPositions = pdfStamper.AcroFields.GetFieldPositions(pdfFieldKey); for (int pdfFieldOrdinal = 0; pdfFieldOrdinal < fields.Size; pdfFieldOrdinal++) { AcroFields.FieldPosition pdfFieldPosition = pdfFieldPositions[pdfFieldOrdinal]; // Create Binary Unique Identifier var pageUniqueId = dt.CreateUniqueIdentifier(Database, Data, CreatorUser, TimeStamp, pdfFieldPosition.page); var pageUniqueIdBytes = pageUniqueId.ToQRCodeBytes(); // Encode to QRCode byte array var pageUniqueIdWidth = (int)pdfFieldPosition.position.Width; var pageUniqueIdHeight = (int)pdfFieldPosition.position.Height; var pageUniqueIdEncoded = QRCodeBinaryEncoder.Encode(pageUniqueIdBytes, pageUniqueIdWidth, pageUniqueIdHeight); // Encode byte array to Image var pageUniqueIdImageData = CCITTG4Encoder.Compress(pageUniqueIdEncoded, pageUniqueIdWidth, pageUniqueIdHeight); var pageUniqueIdImage = iTextSharp.text.Image.GetInstance(pageUniqueIdWidth, pageUniqueIdHeight, false, 256, 1, pageUniqueIdImageData, null); // Add to the pdf page pageUniqueIdImage.SetAbsolutePosition(pdfFieldPosition.position.Left, pdfFieldPosition.position.Bottom); pdfStamper.GetOverContent(pdfFieldPosition.page).AddImage(pageUniqueIdImage); } // Hide Fields PdfDictionary field = fields.GetValue(0); if ((PdfName)field.Get(PdfName.TYPE) == PdfName.ANNOT) { field.Put(PdfName.F, new PdfNumber(6)); } else { PdfArray fieldKids = (PdfArray)field.Get(PdfName.KIDS); foreach (PdfIndirectReference fieldKidRef in fieldKids) { ((PdfDictionary)pdfReader.GetPdfObject(fieldKidRef.Number)).Put(PdfName.F, new PdfNumber(6)); } } } else { Expression fieldExpression = null; if (expressionCache.TryGetValue(pdfFieldKey, out fieldExpression)) { if (fieldExpression.IsDynamic) { Tuple<string, bool, object> fieldExpressionResult = fieldExpression.Evaluate(Data, expressionVariables); if (fieldExpressionResult.Item3 != null) { IImageExpressionResult imageResult = (fieldExpressionResult.Item3 as IImageExpressionResult); if (imageResult != null) { // Output Image AcroFields.Item fields = pdfStamper.AcroFields.Fields[pdfFieldKey]; IList<AcroFields.FieldPosition> pdfFieldPositions = pdfStamper.AcroFields.GetFieldPositions(pdfFieldKey); for (int pdfFieldOrdinal = 0; pdfFieldOrdinal < fields.Size; pdfFieldOrdinal++) { AcroFields.FieldPosition pdfFieldPosition = pdfFieldPositions[pdfFieldOrdinal]; iTextSharp.text.Image pdfImage = iTextSharp.text.Image.GetInstance(imageResult.GetImage((int)pdfFieldPosition.position.Width, (int)pdfFieldPosition.position.Height)); pdfImage.SetAbsolutePosition(pdfFieldPosition.position.Left, pdfFieldPosition.position.Bottom); pdfStamper.GetOverContent(pdfFieldPosition.page).AddImage(pdfImage); } if (!fieldExpressionResult.Item2 && !imageResult.ShowField) { // Hide Fields PdfDictionary field = fields.GetValue(0); if ((PdfName)field.Get(PdfName.TYPE) == PdfName.ANNOT) { field.Put(PdfName.F, new PdfNumber(6)); } else { PdfArray fieldKids = (PdfArray)field.Get(PdfName.KIDS); foreach (PdfIndirectReference fieldKidRef in fieldKids) { ((PdfDictionary)pdfReader.GetPdfObject(fieldKidRef.Number)).Put(PdfName.F, new PdfNumber(6)); } } } } } pdfStamper.AcroFields.SetField(pdfFieldKey, fieldExpressionResult.Item1); if (fieldExpressionResult.Item2) // Expression Error { AcroFields.Item fields = pdfStamper.AcroFields.Fields[pdfFieldKey]; for (int pdfFieldOrdinal = 0; pdfFieldOrdinal < fields.Size; pdfFieldOrdinal++) { PdfDictionary field = fields.GetValue(pdfFieldOrdinal); PdfDictionary fieldMK; if (field.Contains(PdfName.MK)) fieldMK = field.GetAsDict(PdfName.MK); else { fieldMK = new PdfDictionary(PdfName.MK); field.Put(PdfName.MK, fieldMK); } fieldMK.Put(PdfName.BC, new PdfArray(new float[] { 1, 0, 0 })); } } } } else { throw new InvalidOperationException("Pdf template field expressions are out of sync with the expression cache"); } } State.FlushFieldCache(); } pdfStamper.Close(); pdfReader.Close(); if (dt.Scope == DocumentTemplate.DocumentTemplateScopes.Job) { // Write Job Log Job j = (Job)Data; JobLog jl = new JobLog() { JobId = j.Id, TechUserId = CreatorUser.UserId, Timestamp = DateTime.Now }; jl.Comments = string.Format("# Document Generated\r\n**{0}** [{1}]", dt.Description, dt.Id); Database.JobLogs.Add(jl); } pdfGeneratedStream.Position = 0; return pdfGeneratedStream; }
public static void LogDocumentGenerated(DocumentTemplate Template, IAttachmentTarget Data, User Author, string ExpressionResult) { Log(EventTypeIds.DocumentGeneratedWithExpression, new object[] { Template.Id, Data.AttachmentReferenceId, Author.UserId, ExpressionResult }); }
private void UpdateJobSubTypes(DocumentTemplate documentTemplate, List<string> JobSubTypes) { Database.Configuration.LazyLoadingEnabled = true; // Remove All Existing if (documentTemplate.JobSubTypes != null) { foreach (var st in documentTemplate.JobSubTypes.ToArray()) documentTemplate.JobSubTypes.Remove(st); } // Add New if (JobSubTypes != null && JobSubTypes.Count > 0) { var subTypes = new List<JobSubType>(); foreach (var stId in JobSubTypes) { var typeId = stId.Substring(0, stId.IndexOf("_")); var subTypeId = stId.Substring(stId.IndexOf("_") + 1); var subType = Database.JobSubTypes.FirstOrDefault(jst => jst.JobTypeId == typeId && jst.Id == subTypeId); subTypes.Add(subType); } documentTemplate.JobSubTypes = subTypes; } Database.SaveChanges(); }
private ScheduledTaskStatus UpdateUsersLinkedGroup(DocumentTemplate DocumentTemplate, string UsersLinkedGroup, DateTime? FilterBeginDate) { var configJson = ADManagedGroup.ValidConfigurationToJson(DocumentTemplateUsersManagedGroup.GetKey(DocumentTemplate), UsersLinkedGroup, FilterBeginDate); if (DocumentTemplate.UsersLinkedGroup != configJson) { DocumentTemplate.UsersLinkedGroup = configJson; Database.SaveChanges(); var managedGroup = DocumentTemplateUsersManagedGroup.Initialize(DocumentTemplate); if (managedGroup != null) // Sync Group return ADManagedGroupsSyncTask.ScheduleSync(managedGroup); } return null; }
private void UpdateFlattenForm(DocumentTemplate documentTemplate, string FlattenForm) { if (string.IsNullOrWhiteSpace(FlattenForm)) { documentTemplate.FlattenForm = false; } else { bool ff = default(bool); if (bool.TryParse(FlattenForm, out ff)) documentTemplate.FlattenForm = ff; else throw new Exception("Invalid Boolean Format"); } Database.SaveChanges(); }
private void UpdateIsHidden(DocumentTemplate documentTemplate, string IsHidden) { if (string.IsNullOrWhiteSpace(IsHidden)) { documentTemplate.IsHidden = false; } else { bool value = default(bool); if (bool.TryParse(IsHidden, out value)) documentTemplate.IsHidden = value; else throw new Exception("Invalid Boolean Format"); } Database.SaveChanges(); }
private void UpdateOnImportAttachmentExpression(DocumentTemplate documentTemplate, string OnImportAttachmentExpression) { if (string.IsNullOrWhiteSpace(OnImportAttachmentExpression)) { documentTemplate.OnImportAttachmentExpression = null; } else { documentTemplate.OnImportAttachmentExpression = OnImportAttachmentExpression.Trim(); } // Invalidate Cache documentTemplate.OnImportAttachmentExpressionInvalidateCache(); Database.SaveChanges(); }
private void UpdateFilterExpression(DocumentTemplate documentTemplate, string FilterExpression) { if (string.IsNullOrWhiteSpace(FilterExpression)) { documentTemplate.FilterExpression = null; } else { documentTemplate.FilterExpression = FilterExpression.Trim(); } // Invalidate Cache documentTemplate.FilterExpressionInvalidateCache(); Database.SaveChanges(); }
private ScheduledTaskStatus UpdateScope(DocumentTemplate documentTemplate, string Scope) { if (string.IsNullOrWhiteSpace(Scope) || !DocumentTemplate.DocumentTemplateScopes.ToList().Contains(Scope)) throw new ArgumentException("Invalid Scope", "Scope"); Database.Configuration.LazyLoadingEnabled = true; if (documentTemplate.Scope != Scope) { documentTemplate.Scope = Scope; if (documentTemplate.Scope != DocumentTemplate.DocumentTemplateScopes.Job && documentTemplate.JobSubTypes != null) { foreach (var st in documentTemplate.JobSubTypes.ToArray()) documentTemplate.JobSubTypes.Remove(st); } Database.SaveChanges(); // Trigger Managed Group Sync var managedGroups = new ADManagedGroup[] { DocumentTemplateDevicesManagedGroup.Initialize(documentTemplate), DocumentTemplateUsersManagedGroup.Initialize(documentTemplate) }; if (managedGroups.Any(mg => mg != null)) // Sync Group return ADManagedGroupsSyncTask.ScheduleSync(managedGroups.Where(mg => mg != null)); } return null; }
public static Stream GenerateBulkFromTemplate(DocumentTemplate dt, DiscoDataContext Database, User CreatorUser, DateTime Timestamp, bool InsertBlankPages, params IAttachmentTarget[] DataObjects) { if (DataObjects.Length > 0) { List<Stream> generatedPdfs = new List<Stream>(DataObjects.Length); using (var state = DocumentState.DefaultState()) { foreach (var d in DataObjects) { generatedPdfs.Add(dt.GeneratePdf(Database, d, CreatorUser, Timestamp, state, true)); state.SequenceNumber++; state.FlushScopeCache(); } } if (generatedPdfs.Count == 1) { return generatedPdfs[0]; } else { Stream bulkPdf = Utilities.JoinPdfs(InsertBlankPages, generatedPdfs); foreach (Stream singlePdf in generatedPdfs) singlePdf.Dispose(); return bulkPdf; } } return null; }
public static DeviceAttachment CreateAttachment(this Device Device, DiscoDataContext Database, User CreatorUser, string Filename, string MimeType, string Comments, Stream Content, DocumentTemplate DocumentTemplate = null, Image PdfThumbnail = null) { if (string.IsNullOrEmpty(MimeType) || MimeType.Equals("unknown/unknown", StringComparison.OrdinalIgnoreCase)) MimeType = Interop.MimeTypes.ResolveMimeType(Filename); DeviceAttachment da = new DeviceAttachment() { DeviceSerialNumber = Device.SerialNumber, TechUserId = CreatorUser.UserId, Filename = Filename, MimeType = MimeType, Timestamp = DateTime.Now, Comments = Comments }; if (DocumentTemplate != null) da.DocumentTemplateId = DocumentTemplate.Id; Database.DeviceAttachments.Add(da); Database.SaveChanges(); da.SaveAttachment(Database, Content); Content.Position = 0; if (PdfThumbnail == null) da.GenerateThumbnail(Database, Content); else da.SaveThumbnailAttachment(Database, PdfThumbnail); return da; }
public static Stream GenerateBulkFromTemplate(DocumentTemplate dt, DiscoDataContext Database, User CreatorUser, DateTime Timestamp, bool InsertBlankPages, params string[] DataObjectsIds) { IAttachmentTarget[] DataObjects; switch (dt.Scope) { case DocumentTemplate.DocumentTemplateScopes.Device: DataObjects = Database.Devices.Where(d => DataObjectsIds.Contains(d.SerialNumber)).ToArray(); break; case DocumentTemplate.DocumentTemplateScopes.Job: int[] intDataObjectsIds = DataObjectsIds.Select(i => int.Parse(i)).ToArray(); DataObjects = Database.Jobs.Where(j => intDataObjectsIds.Contains(j.Id)).ToArray(); break; case DocumentTemplate.DocumentTemplateScopes.User: DataObjects = new IAttachmentTarget[DataObjectsIds.Length]; for (int idIndex = 0; idIndex < DataObjectsIds.Length; idIndex++) { string dataObjectId = DataObjectsIds[idIndex]; DataObjects[idIndex] = UserService.GetUser(ActiveDirectory.ParseDomainAccountId(dataObjectId), Database, true); if (DataObjects[idIndex] == null) throw new Exception($"Unknown Username specified: {dataObjectId}"); } break; default: throw new InvalidOperationException("Invalid DocumentType Scope"); } return GenerateBulkFromTemplate(dt, Database, CreatorUser, Timestamp, InsertBlankPages, DataObjects); }
public static string GetDescription(DocumentTemplate DocumentTemplate) { return GetDescription(DocumentTemplate.Scope, DocumentTemplate.Description); }
public static void LogImportAttachmentExpressionEvaluated(DocumentTemplate template, IAttachmentTarget target, IAttachment attachment, string Result) { DocumentsLog.Log(DocumentsLog.EventTypeIds.ImportAttachmentExpressionEvaluated, new object[] { template.Id, target.AttachmentReferenceId, attachment.Id, Result }); }
public static string GetCategoryDescription(DocumentTemplate DocumentTemplate) { return CategoryDescriptionFormat; }
public static void LogDocumentGenerated(DocumentTemplate Template, IAttachmentTarget Data, User Author) { Log(EventTypeIds.DocumentGenerated, new object[] { Template.Id, Data.AttachmentReferenceId, Author.UserId }); }
public static DocumentUniqueIdentifier Create(DiscoDataContext Database, DocumentTemplate DocumentTemplate, IAttachmentTarget Target, User Creator, DateTime TimeStamp, int PageIndex) { var deploymentChecksum = Database.DiscoConfiguration.DeploymentChecksum; var documentTemplateId = DocumentTemplate.Id; var targetId = Target.AttachmentReferenceId; var creatorId = Creator.UserId; var attachmentType = DocumentTemplate.AttachmentType; var identifier = new DocumentUniqueIdentifier(Database, CurrentVersion, deploymentChecksum, documentTemplateId, targetId, creatorId, TimeStamp, PageIndex, attachmentType); identifier.documentTemplate = DocumentTemplate; identifier.target = Target; identifier.creator = Creator; return identifier; }