예제 #1
0
        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);
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
            }
        }
예제 #5
0
        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));
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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;
            }
        }
예제 #8
0
 public AssetWorkflowRejectedEventArgs(AssetWorkflow assetWorkflow, AssetWorkflowUser rejectingUser)
 {
     AssetWorkflow = assetWorkflow;
     RejectingUser = rejectingUser;
 }
예제 #9
0
 public AssetWorkflowUserEventArgs(AssetWorkflowUser assetWorkflowUser)
 {
     AssetWorkflowUser = assetWorkflowUser;
 }
예제 #10
0
        /// <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);
        }
예제 #11
0
        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;
            }
        }