public static void AssetWorkflowRejected(AssetWorkflow assetWorkflow, AssetWorkflowUser rejectingUser) { // Get the message template and set the subject Email email = NotifyEngine.GetEmailTemplate("Admin.AssetWorkflowRejected"); email.Subject = NotifyEngine.GetSubject("An asset has been rejected"); // Add the upload user email.Recipients.Add(assetWorkflow.Asset.UploadedByUser.Email); // Add all of the users in the workflow foreach (AssetWorkflowUser awfu in assetWorkflow.AssetWorkflowUserList) { email.Recipients.Add(awfu.User.Email); } // Add message parameters email.AddBodyParameter("asset-id", assetWorkflow.Asset.AssetId); email.AddBodyParameter("asset-type", assetWorkflow.Asset.AssetType.Name); email.AddBodyParameter("upload-user-name", assetWorkflow.Asset.UploadedByUser.FullName); email.AddBodyParameter("rejector-name", rejectingUser.User.FullName); email.AddBodyParameter("rejector-comments", rejectingUser.Comments); // RAD = Review Asset Details string url = SiteUtils.GetWebsiteUrl(string.Format("~/Go.ashx/RAD/AID{0}/", assetWorkflow.AssetId)); email.AddBodyParameter("url", url); // Send it NotifyEngine.SendMessage(email); }
private static void RejectAndCompleteWorkflow(AssetWorkflow assetWorkflow, AssetWorkflowUser rejectingUser) { assetWorkflow.IsComplete = true; AssetWorkflow.Update(assetWorkflow); assetWorkflow.Asset.AssetPublishStatus = AssetPublishStatus.NotApproved; Asset.Update(assetWorkflow.Asset); if (AssetWorkflowRejected != null) { AssetWorkflowRejected(null, new AssetWorkflowRejectedEventArgs(assetWorkflow, rejectingUser)); } }
public static void SaveWorkflowUserAndAdvance(AssetWorkflowUser awu) { // If rejecting, comments are mandatory if (awu.AssetWorkflowUserStatus == AssetWorkflowUserStatus.Rejected && StringUtils.IsBlank(awu.Comments)) { throw new AssetWorkflowUserException("Comments are required if rejecting an asset", awu); } // Update modification date awu.LastUpdate = DateTime.Now; // Now save it AssetWorkflowUser.Update(awu); // If workflow item is still pending, our work is done here if (awu.AssetWorkflowUserStatus == AssetWorkflowUserStatus.Pending) { return; } // If workflow item was rejected, don't continue if (awu.AssetWorkflowUserStatus == AssetWorkflowUserStatus.Rejected) { RejectAndCompleteWorkflow(awu.AssetWorkflow, awu); return; } // Get a list of all users in the same asset workflow AssetWorkflowUserFinder finder = new AssetWorkflowUserFinder { AssetWorkflowId = awu.AssetWorkflowId }; finder.SortExpressions.Add(new AscendingSort(AssetWorkflowUser.Columns.Position)); List <AssetWorkflowUser> assetWorkflowUserList = AssetWorkflowUser.FindMany(finder); // Now we need to figure out who's next, or whether we're all done, so get list of all users after the current one who are still waiting List <AssetWorkflowUser> remainingUsers = assetWorkflowUserList.FindAll(o => (o.AssetWorkflowUserStatus == AssetWorkflowUserStatus.Waiting) && (o.Position > awu.Position)); if (remainingUsers.Count == 0) { // No users left, so we can complete this workflow CompleteWorkflow(awu.AssetWorkflow); return; } // Otherwise, get the next user in the workflow AssetWorkflowUser nextUserInWorkflow = remainingUsers[0]; // and notify them NotifyUser(nextUserInWorkflow); }
public static void InviteUserToWorkflow(AssetWorkflowUser assetWorkflowUser, string inviteeEmail, string message) { // Ensure message is specified if (StringUtils.IsBlank(message)) { throw new ValidationException("Message is required (this will be sent to the user being invited to comment)"); } // Ensure email address is specified if (StringUtils.IsBlank(inviteeEmail)) { throw new ValidationException("Email address is required"); } // Get the user by email address User invitedUser = User.GetByEmail(inviteeEmail); // Ensure email address belongs to a registered user if (invitedUser.IsNull) { throw new ValidationException("Email does not belong to a registered user"); } // Ensure invited user has upload privileges if (invitedUser.UserRoleId < Convert.ToInt32(UserRole.UploadUser)) { throw new ValidationException("Email does not belong to a user with upload privileges"); } // Create the commenter record AssetWorkflowCommenter awfc = AssetWorkflowCommenter.New(); awfc.AssetWorkflowId = assetWorkflowUser.AssetWorkflowId; awfc.InvitingAssetWorkflowUserId = assetWorkflowUser.AssetWorkflowUserId.GetValueOrDefault(); awfc.InvitingUserId = assetWorkflowUser.UserId; awfc.InvitingUserMessage = message; awfc.UserId = invitedUser.UserId.GetValueOrDefault(); awfc.CreateDate = DateTime.Now; awfc.LastUpdate = DateTime.Now; AssetWorkflowCommenter.Update(awfc); // Refresh from DB // awfc = AssetWorkflowCommenter.Get(awfc.AssetWorkflowCommenterId); // Now we need to notify them if (AssetWorkflowCommenterInvited != null) { AssetWorkflowCommenterInvited(null, new AssetWorkflowCommenterEventArgs(awfc)); } }
private static void NotifyUser(AssetWorkflowUser assetWorkflowUser) { // First set this user to pending assetWorkflowUser.AssetWorkflowUserStatus = AssetWorkflowUserStatus.Pending; // Save them AssetWorkflowUser.Update(assetWorkflowUser); // Now trigger event to send nofication if (AssetWorkflowUserSelected != null) { AssetWorkflowUserSelected(null, new AssetWorkflowUserEventArgs(assetWorkflowUser)); } }
public static void AssetWorkflowUserSelected(AssetWorkflowUser assetWorkflowUser) { Email email = NotifyEngine.GetEmailTemplate("Admin.AssetWorkflowUserSelected"); email.Recipients.Add(assetWorkflowUser.User.Email); email.Subject = NotifyEngine.GetSubject("An asset requires your approval"); // Add body parameters email.AddBodyParameter("asset-id", assetWorkflowUser.AssetWorkflow.Asset.AssetId); email.AddBodyParameter("asset-type", assetWorkflowUser.AssetWorkflow.Asset.AssetType.Name); email.AddBodyParameter("upload-user-name", assetWorkflowUser.AssetWorkflow.Asset.UploadedByUser.FullName); // AAW = Approve Asset Workflow string url = SiteUtils.GetWebsiteUrl(string.Format("~/Go.ashx/AAW/AWFID{0}/", assetWorkflowUser.AssetWorkflowId)); email.AddBodyParameter("url", url); // Send it NotifyEngine.SendMessage(email); }
protected void WorkflowRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { switch (e.Item.ItemType) { case (ListItemType.Item): case (ListItemType.AlternatingItem): AssetWorkflowUser awfu = (AssetWorkflowUser)e.Item.DataItem; EmailHyperLink EmailHyperLink = (EmailHyperLink)e.Item.FindControl("EmailHyperLink"); EmailHyperLink.SetNameEmail(awfu.User.FullName, awfu.User.Email); if (awfu.UserId == CurrentUser.UserId.GetValueOrDefault()) { EmailHyperLink.NavigateUrl = string.Empty; EmailHyperLink.Text = "You"; } break; } }
public AssetWorkflowRejectedEventArgs(AssetWorkflow assetWorkflow, AssetWorkflowUser rejectingUser) { AssetWorkflow = assetWorkflow; RejectingUser = rejectingUser; }
public AssetWorkflowUserEventArgs(AssetWorkflowUser assetWorkflowUser) { AssetWorkflowUser = assetWorkflowUser; }
/// <summary> /// Submits an asset to a workflow, and starts the approval process /// </summary> public static void SubmitAssetToWorkflow(Asset asset, User submittedByUser) { m_Logger.DebugFormat("Asset: {0} submitted to workflow", asset.AssetId); // First ensure we have a workflow if (asset.WorkflowId.GetValueOrDefault() == 0) { throw new SystemException("Asset submitted to workflow, but workflow is not specified"); } // First get all of the users in the workflow WorkflowUserFinder finder = new WorkflowUserFinder { WorkflowId = asset.WorkflowId.GetValueOrDefault() }; finder.SortExpressions.Add(new AscendingSort(WorkflowUser.Columns.Position)); List <WorkflowUser> workflowUserList = WorkflowUser.FindMany(finder); // Ensure workflow has users if (workflowUserList.Count == 0) { throw new SystemException("Asset submitted to workflow, but workflow does not have any users"); } // Create a new asset workflow AssetWorkflow aw = AssetWorkflow.New(); aw.AssetId = asset.AssetId.GetValueOrDefault(); aw.IsComplete = false; aw.SubmittedByUserId = submittedByUser.UserId.GetValueOrDefault(); aw.CreateDate = DateTime.Now; AssetWorkflow.Update(aw); // Now add all the users to it for (int position = 0; position < workflowUserList.Count; position++) { // Get the current workflow user WorkflowUser wfu = workflowUserList[position]; // Ensure it's not a duplicate if (aw.AssetWorkflowUserList.Any(awfu => awfu.UserId == wfu.UserId)) { continue; } // Set-up the asset workflow user AssetWorkflowUser awu = AssetWorkflowUser.New(); awu.AssetWorkflowId = aw.AssetWorkflowId.GetValueOrDefault(); awu.UserId = wfu.UserId; awu.Position = position + 1; awu.AssetWorkflowUserStatus = AssetWorkflowUserStatus.Waiting; awu.CreateDate = DateTime.Now; awu.LastUpdate = DateTime.Now; // Save the workflow user to the DB AssetWorkflowUser.Update(awu); // Add the user to the workflow aw.AssetWorkflowUserList.Add(awu); } if (AssetSubmittedToWorkflow != null) { AssetSubmittedToWorkflow(null, new AssetEventArgs(asset)); } // Now notify the next user. First get them AssetWorkflowUser nextUserInWorkflow = aw.AssetWorkflowUserList[0]; // The send notification NotifyUser(nextUserInWorkflow); }
protected void AssetsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) { switch (e.Item.ItemType) { case ListItemType.Header: HtmlTableCell CheckBoxHeaderCell = (HtmlTableCell)e.Item.FindControl("CheckBoxHeaderCell"); CheckBoxHeaderCell.Visible = ShowCheckBoxes; HtmlTableCell ThumbnailHeaderCell = (HtmlTableCell)e.Item.FindControl("ThumbnailHeaderCell"); ThumbnailHeaderCell.Visible = ShowThumbnails; break; case (ListItemType.Item): case (ListItemType.AlternatingItem): Asset asset = (Asset)e.Item.DataItem; HtmlTableCell CheckBoxCell = (HtmlTableCell)e.Item.FindControl("CheckBoxCell"); CheckBoxCell.Visible = ShowCheckBoxes; HtmlTableCell ThumbnailCell = (HtmlTableCell)e.Item.FindControl("ThumbnailCell"); ThumbnailCell.Visible = ShowThumbnails; if (ThumbnailCell.Visible) { AssetThumbnail assetThumbnail = (AssetThumbnail)e.Item.FindControl("AssetThumbnail"); assetThumbnail.Initialise(asset); } HiddenField AssetIdHiddenField = (HiddenField)e.Item.FindControl("AssetIdHiddenField"); AssetIdHiddenField.Value = asset.AssetId.ToString(); HyperLink AssetIdHyperLink = (HyperLink)e.Item.FindControl("AssetIdHyperLink"); AssetIdHyperLink.Text = asset.AssetId.ToString(); AssetIdHyperLink.NavigateUrl = string.Format("~/Admin/Assets/AssetForm.aspx?assetId={0}&source=assetlist", asset.AssetId); Label AssetTypeLabel = (Label)e.Item.FindControl("AssetTypeLabel"); AssetTypeLabel.Text = asset.AssetType.Name; Label UploadedByUserNameLabel = (Label)e.Item.FindControl("UploadedByUserNameLabel"); UploadedByUserNameLabel.Text = asset.UploadedByUser.FullName; Label TitleLabel = (Label)e.Item.FindControl("TitleLabel"); TitleLabel.Text = asset.Title; SiteUtils.PopulateBlankControl(TitleLabel); Label FileSizeLabel = (Label)e.Item.FindControl("FileSizeLabel"); FileSizeLabel.Text = FileUtils.FriendlyFileSize(asset.FileSize); Label ProductionDateLabel = (Label)e.Item.FindControl("ProductionDateLabel"); ProductionDateLabel.Text = asset.GetProductionDate(); SiteUtils.PopulateBlankControl(ProductionDateLabel); Label IsExpiredLabel = (Label)e.Item.FindControl("IsExpiredLabel"); IsExpiredLabel.Text = (asset.ExpiryDate < DateTime.Now) ? "Y" : "N"; if (IsExpiredLabel.Text == "Y") { IsExpiredLabel.CssClass = "bold"; } Label ExpiryDateLabel = (Label)e.Item.FindControl("ExpiryDateLabel"); ExpiryDateLabel.Text = asset.ExpiryDate.ToString(Global.DateFormat); HyperLink IsPublishedHyperLink = (HyperLink)e.Item.FindControl("IsPublishedHyperLink"); IsPublishedHyperLink.Text = asset.AssetPublishStatusName; PromptLinkButton DeleteLinkButton = (PromptLinkButton)e.Item.FindControl("DeleteLinkButton"); DeleteLinkButton.CommandArgument = asset.AssetId.ToString(); EnhancedHyperLink AuditLogHyperLink = (EnhancedHyperLink)e.Item.FindControl("AuditLogHyperLink"); SiteUtils.SetHyperLink("Reports.AssetAuditTrail", string.Format("?AssetId={0}&Source=AssetList", asset.AssetId), AuditLogHyperLink); switch (asset.AssetPublishStatus) { case (AssetPublishStatus.Published): IsPublishedHyperLink.CssClass += " Bold"; break; case (AssetPublishStatus.PendingApproval): IsPublishedHyperLink.CssClass += " Bold"; if (asset.AssetWorkflowList.Count > 0) { AssetWorkflow aw = asset.AssetWorkflowList[0]; // Only link the pending text to the approval screen if the current user is in the workflow AssetWorkflowUser cawfu = aw.AssetWorkflowUserList.Find(awfu => awfu.UserId == CurrentUser.UserId.GetValueOrDefault()); if (cawfu != null) { SiteUtils.SetHyperLink("Workflow.Approve", string.Format("?AssetWorkflowId={0}", aw.AssetWorkflowId), IsPublishedHyperLink); } else { AssetWorkflowCommenter awc = aw.AssetWorkflowCommenterList.Find(awfc => awfc.UserId == CurrentUser.UserId.GetValueOrDefault()); if (awc != null) { SiteUtils.SetHyperLink("Workflow.Comment", string.Format("?AssetWorkflowId={0}", aw.AssetWorkflowId), IsPublishedHyperLink); } } } break; } break; } }