protected override void OnInit(EventArgs e) { base.OnInit(e); this.AddResourceToClientDependency("Moriyama.Workflow.Umbraco6.Web.Workflow.Js.Util.js", ClientDependencyType.Javascript); this.AddResourceToClientDependency("Moriyama.Workflow.Umbraco6.Web.Workflow.Js.Config.js", ClientDependencyType.Javascript); var id = Convert.ToInt32(Request["id"]); _workflowInstance = TheTransitionService.GetWorkflowInstance(id); CannotTransitionLiteral.Text = TheGlobalisationService.GetString("this_workflow_cannot_be_transitioned"); TransitionButton.Text = TheGlobalisationService.GetString("transition"); if (!TheTransitionService.CanTransition(_workflowInstance)) { CannotTransitionLiteral.Visible = true; TransitionPanel.Visible = false; return; } TransitionDropDownList.DataSource = TheTransitionService.GetTransitions(_workflowInstance); TransitionDropDownList.DataTextField = "Value"; TransitionDropDownList.DataValueField = "Key"; TransitionDropDownList.DataBind(); }
public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { base.Run(workflowInstance, runtime); var body = Helper.Instance.RenderTemplate(RenderTemplate); IList<string> files = new List<string>(); foreach(var nodeId in ((UmbracoWorkflowInstance) workflowInstance).CmsNodes) { var node = new CMSNode(nodeId); if(node.IsMedia()) { files.Add(IOHelper.MapPath((string) new Media(nodeId).getProperty("umbracoFile").Value)); } } var f = new User(From).Email; foreach(var r in GetRecipients()) { var mail = new MailMessage(f, r) {Subject = Subject, IsBodyHtml = true, Body = body}; foreach(var file in files) { var attach = new Attachment(file); mail.Attachments.Add(attach); } var smtpClient = new SmtpClient(); smtpClient.Send(mail); } runtime.Transition(workflowInstance, this, "done"); }
protected override void AddInstantiatingObjectsToInstance(object sender, IWorkflowInstance inst) { if(TheHelper.HasProperty(sender, "Id")) { ((UmbracoWorkflowInstance) inst).CmsNodes.Add(TheHelper.GetProperty<int>(sender, "Id")); } }
public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { // Cast to Umbraco worklow instance. var umbracoWorkflowInstance = (UmbracoWorkflowInstance) workflowInstance; var count = 0; var newCmsNodes = new List<int>(); foreach(var nodeId in umbracoWorkflowInstance.CmsNodes) { var n = new CMSNode(nodeId); if(!n.IsDocument()) continue; var d = new Document(nodeId); if (!DocumentTypes.Contains(d.ContentType.Id)) continue; newCmsNodes.Add(nodeId); count++; } umbracoWorkflowInstance.CmsNodes = newCmsNodes; var transition = (count > 0) ? "contains_docs" : "does_not_contain_docs"; runtime.Transition(workflowInstance, this, transition); }
// Implement the Run method of IRunnableWorkflowTask public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { // In Umbraco the workflowInstance should always be castable to an UmbracoWorkflowInstance var wf = (UmbracoWorkflowInstance) workflowInstance; // UmbracoWorkflowInstance has a list of node Ids that are associated with the workflow in the CmsNodes property foreach(var nodeId in wf.CmsNodes) { // We'll assume that only documents are attached to this workflow var doc = new Document(nodeId); var property = doc.getProperty(DocumentTypeProperty); if (!String.IsNullOrEmpty((string) property.Value)) continue; var host = HttpContext.Current.Request.Url.Host; var pageUrl = "http://" + host + umbraco.library.NiceUrl(nodeId); var shortUrl = API.Bit(BitLyLogin, BitLyApiKey, pageUrl, "Shorten"); property.Value = shortUrl; } // The run method of a workflow task is responsible for informing the runtime of the outcome. // The outcome should be one of the items in the AvailableTransitions list. runtime.Transition(workflowInstance, this, "done"); }
public void Start(IWorkflowInstance workflowInstance) { if (workflowInstance.Started) { LogAndThrow(new WorkflowInstanceAlreadyStartedException(string.Format("Workflow instance '{0}' has already been started", workflowInstance.Id))); } workflowInstance.Started = true; var startTasks = workflowInstance.Tasks.Where(task => task.IsStartTask).ToList(); if(startTasks.Count == 0) { LogAndThrow(new WorkflowInstanceHasNoStartTaskException(string.Format("Workflow instance '{0}' does not have a start task", workflowInstance.Id))); } if(startTasks.Count > 1) { LogAndThrow(new WorkflowInstanceHasTooManyStartTasksException(string.Format("Workflow instance '{0}' has more than one start task", workflowInstance.Id))); } workflowInstance.StartTime = DateTime.Now; workflowInstance.CurrentTask = startTasks[0]; if (workflowInstance.CurrentTask is IDelayWorkflowTask) { ((IDelayWorkflowTask)workflowInstance.CurrentTask).StartTime = DateTime.Now; } TheWorkflowInstanceRepository.Update(workflowInstance); }
public virtual void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { Instantiator = ((UmbracoWorkflowInstance)workflowInstance).Instantiator; CmsNodes = ((UmbracoWorkflowInstance)workflowInstance).CmsNodes; Comment = workflowInstance.Comment; Flags = workflowInstance.Flags; TransitionHistory = workflowInstance.TransitionHistory; }
public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { base.Run(workflowInstance, runtime); var nodes = ((UmbracoWorkflowInstance) workflowInstance).CmsNodes; SendMail(Body + Environment.NewLine + GetAttachmentLinks(nodes)); runtime.Transition(workflowInstance, this, "done"); }
private void EndWorkflow(IWorkflowInstance workflowInstance) { Log.Info(string.Format("The workflow runtime is ending workflow '{0}' - '{1}'", workflowInstance.Id, workflowInstance.Name)); Log.Info(string.Join(Environment.NewLine, workflowInstance.TransitionHistory)); workflowInstance.Ended = true; workflowInstance.EndTime = DateTime.Now; workflowInstance.CurrentTask = null; }
public IDictionary<string, string> GetTransitions(IWorkflowInstance workflowInstance) { var ui = (IWorkflowTaskEntityUi)TheWorkflowEntityUiResolver.Resolve(workflowInstance.CurrentTask); var transitons = new Dictionary<string, string>(); foreach (var transition in workflowInstance.CurrentTask.Transitions) { transitons.Add(transition.Key, ui.TransitionDescriptions[transition.Key]); } return transitons; }
public bool CanTransition(IWorkflowInstance workflowInstance) { if (workflowInstance.CurrentTask == null) { return false; } var task = workflowInstance.CurrentTask; return typeof(IDecisionWorkflowTask).IsAssignableFrom(task.GetType()); }
public bool CanTransition(IWorkflowInstance workflowInstance) { if (workflowInstance.CurrentTask == null) { return(false); } var task = workflowInstance.CurrentTask; return(typeof(IDecisionWorkflowTask).IsAssignableFrom(task.GetType())); }
public IDictionary <string, string> GetTransitions(IWorkflowInstance workflowInstance) { var ui = (IWorkflowTaskEntityUi)TheWorkflowEntityUiResolver.Resolve(workflowInstance.CurrentTask); var transitons = new Dictionary <string, string>(); foreach (var transition in workflowInstance.CurrentTask.Transitions) { transitons.Add(transition.Key, ui.TransitionDescriptions[transition.Key]); } return(transitons); }
public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { base.Run(workflowInstance, runtime); var nodes = ((UmbracoWorkflowInstance) workflowInstance).CmsNodes; var body = Helper.Instance.RenderTemplate(RenderTemplate) + GetAttachmentLinks(nodes); SendMail(body); runtime.Transition(workflowInstance, this, "done"); }
public void onWorkflowIdle(ref IWorkflowInstance e) { if (!PluginConfig.enabled) { return; } if (PluginConfig.stoponidle) { stopRecording(e); } }
public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { base.Run(workflowInstance, runtime); var nodes = ((UmbracoWorkflowInstance)workflowInstance).CmsNodes; var body = Helper.Instance.RenderTemplate(RenderTemplate) + GetAttachmentLinks(nodes); SendMail(body); runtime.Transition(workflowInstance, this, "done"); }
private async Task UnlockWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken) { ((WorkflowInstanceLock)workflowInstance.Lock).LockedUntil = workflowInstance.Lock.LockedAt; var success = await WorkflowEngineBuilder.WorkflowStore .TryUnlockWorkflowInstance(Id, workflowInstance.RootWorkflowInstanceId, workflowInstance.Lock.LockedAt, cancellationToken) .ConfigureAwait(false); if (!success) { Log.Warning("Failed to unlock workflow instance [{workflowInstanceId}] by a [{rootWorkflowInstanceId}]", workflowInstance.Id, workflowInstance.RootWorkflowInstanceId); } }
private async Task PopulateWorkflowInstanceWithInternalState(IWorkflowInstance workflowInstance, CancellationToken cancellationToken) { var workflowInstanceInternal = (IWorkflowInstanceInternal)workflowInstance; var workflowInstanceStateLogs = await WorkflowEngineBuilder.WorkflowStore.GetWorkflowInstanceStateLog(workflowInstance.Id, cancellationToken).ConfigureAwait(false); if (null != workflowInstanceStateLogs && workflowInstanceStateLogs.Count > 0) { foreach (var workflowInstanceStateLog in workflowInstanceStateLogs.OrderBy(s => s.Started)) { workflowInstanceInternal.VisitedStatesInternal.Add(workflowInstanceStateLog.StateCode); } } }
public void StartWorkflow(string appCode, string procName, string dataLocator, int impoLevel = 0, int secret = 0) { CurrentWorkflow = Build(appCode); FlowInstance = GetNewInstance(appCode, procName, dataLocator, impoLevel, secret); using (TransactionScope tran = new TransactionScope()) { CurrentWorkflow.AddInstance(FlowInstance); CurrentItem = GetNewWorkItem(CurrentWorkflow.Root, CurrentUser, appCode, FlowInstance.Id); FlowInstance.InsertWorkItem(CurrentItem); CurrentActivity = CurrentWorkflow.Root; tran.Complete(); } }
private async Task <WorkflowState> CreateGraphAndExecute(WorkflowContext context, IWorkflowLoader loader, IWorkflowContextPersistor instancePersistor, bool isResume = false) { IWorkflowInstance workflowInstance = loader.LoadWorkflow(context.WorkflowId, context.WorkflowVersion, context , new Controller(instancePersistor, context)); await workflowInstance.Initialize(); var state = isResume ? await workflowInstance.Resume() : await workflowInstance.Execute(); instancePersistor.Save(context); return(new WorkflowState() { Context = context.ToJson(), Id = workflowInstance.Id, State = state }); }
public ParentToNestedEntityEvent(string code, WorkflowHierarchyEventType hierarchyEventType, Guid rootWorkflowInstanceId, Guid parentWorkflowInstanceId, IWorkflowInstance workflowInstance, IEntity nestedEntity) { Guard.ArgumentNotNull(code, nameof(code)); Guard.ArgumentNotNull(workflowInstance, nameof(workflowInstance)); Code = code; Entity = nestedEntity; HierarchyEventType = hierarchyEventType; ParentWorkflowInstanceId = parentWorkflowInstanceId; RootWorkflowInstanceId = rootWorkflowInstanceId; TargetWorkflowInstance = workflowInstance; WorkflowInstanceId = workflowInstance.Id; }
public void Transition(IWorkflowInstance workflowInstance, string transiton, string comment) { var task = workflowInstance.CurrentTask; if (!task.Transitions.ContainsKey(transiton)) { Log.Warn(string.Format("Transition '{0}' not found for task '{1}' - '{2}'", transiton, task.Name, task.Id)); return; } Log.Info(string.Format("Performing transition '{0}' for task '{1}' - '{2}'", transiton, task.Name, task.Id)); TheWorkflowRuntime.Transition(workflowInstance, task, transiton, comment); TheWorkflowRuntime.RunWorkflows(); }
private void stopRecording(IWorkflowInstance e) { Record r; if (!Records.ContainsKey(e._id)) { return; } r = Records[e._id]; if (r.IsRecording) { r.StopRecording(); } }
public Record stopRecording(IWorkflowInstance e) { Record r = null; if (!Records.ContainsKey(e._id)) { return(r); } r = Records[e._id]; if (r.IsRecording) { r.StopRecording(); } return(r); }
public void IdleOrComplete(IWorkflowInstance instance, EventArgs e) { if (string.IsNullOrEmpty(instance.caller)) { return; } if (!RunWorkflowInstances.ContainsKey(instance.caller)) { return; } if (instance.isCompleted || instance.Exception != null) { var _instance = RunWorkflowInstances[instance.caller]; if (instance.Parameters != null) { _instance.Result = instance.Parameters; } else { _instance.Result = new Dictionary <string, object>(); } RunWorkflowInstances.Remove(instance.caller); if (!string.IsNullOrEmpty(instance.errormessage)) { _instance.Error = new Exception(instance.errormessage); } if (instance.Exception != null) { _instance.Error = instance.Exception; } _instance.Pending.Set(); GenericTools.RunUI(() => { // if ran in designer, call IdleOrComplete to break out of debugging and make designer not readonly var designer = global.OpenRPAClient.GetWorkflowDesignerByIDOrRelativeFilename(_instance.IDOrRelativeFilename); try { if (designer != null) { designer.IdleOrComplete(instance, e); } } catch (Exception) { } }); } }
public async Task SaveWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken = default) { Guard.ArgumentNotNull(workflowInstance, nameof(workflowInstance)); var workflowInstanceIdString = workflowInstance.Id.ToIdString(); var mongoCollection = MongoDatabase.GetCollection <WorkflowInstanceDto>(Constants.WorkflowInstanceCollectionName); var workflowInstanceDto = mongoCollection.Find(x => x.Id == workflowInstanceIdString).FirstOrDefault(); if (null == workflowInstanceDto) { workflowInstanceDto = new WorkflowInstanceDto { Id = workflowInstance.Id.ToIdString(), Created = new BsonDateTime(workflowInstance.Created), CurrentStateCode = workflowInstance.CurrentStateCode, CurrentStateProgress = workflowInstance.CurrentStateProgress, EntityId = workflowInstance.EntityId, EntityType = workflowInstance.EntityType, ParentWorkflowInstanceId = workflowInstance.ParentWorkflowInstanceId.ToIdString(), RootWorkflowInstanceId = workflowInstance.RootWorkflowInstanceId.ToIdString(), WorkflowId = workflowInstance.WorkflowId.ToIdString(), Lock = new WorkflowInstanceLockDto { LockOwner = workflowInstance.Lock.LockOwner.ToIdString(), LockMode = workflowInstance.Lock.LockMode, LockedAt = workflowInstance.Lock.LockedAt, LockedUntil = workflowInstance.Lock.LockedUntil } }; await InsertAsync(mongoCollection, workflowInstanceDto, cancellationToken).ConfigureAwait(false); } else { // make sure not to update the whole entity to avoid conflicting updates on [Lock] sub-object var updateDefinition = Builders <WorkflowInstanceDto> .Update .Set(wi => wi.CurrentStateCode, workflowInstance.CurrentStateCode) .Set(wi => wi.CurrentStateProgress, workflowInstance.CurrentStateProgress) .Set(wi => wi.EntityId, workflowInstance.EntityId) .Set(wi => wi.EntityType, workflowInstance.EntityType) .Set(wi => wi.ParentWorkflowInstanceId, workflowInstance.ParentWorkflowInstanceId.ToIdString()) .Set(wi => wi.RootWorkflowInstanceId, workflowInstance.RootWorkflowInstanceId.ToIdString()) .Set(wi => wi.WorkflowId, workflowInstance.WorkflowId.ToIdString()); await mongoCollection.UpdateOneAsync(wi => wi.Id == workflowInstanceIdString, updateDefinition, null, cancellationToken).ConfigureAwait(false); } }
private WorkflowState CreateGraphAndExecute(WorkflowContext context, IWorkflowLoader loader, IWorkflowContextPersistor instancePersistor, bool isResume = false) { IWorkflowInstance workflowInstance = loader.LoadWorkflow(context.WorkflowId, context.WorkflowVersion, context , new Controller(instancePersistor, context)); workflowInstance.Initialize().Wait(); var state = isResume ? workflowInstance.Resume().Result :workflowInstance.Execute().Result; var persistentState = instancePersistor.Save(context); return(new WorkflowState() { Context = persistentState.Context, Id = persistentState.InstanceId, State = state, RequiredParameters = context.RequiredParameters.ToArray() }); }
public static void RaiseWorkItemEvent(EventStep step, ItemActionType type, IWorkflowInstance instance, IWorkflowItem item) { string key = KeyTemplate.FormatTo(step.ToString(), type.ToString()); if (WorkItemEventList.ContainsKey(key)) { try { Logger.GetLogger("Workflow").Info("{0}:Raise WorkflowItemEvent:{1}".FormatTo(instance.Id, key)); WorkItemEventList[key](instance, item); } catch (Exception ex) { Logger.GetLogger("Workflow").Info("{0}:Raise WorkflowEvent:{1} Error:{2},{3}".FormatTo(instance.Id, key, ex.Message, ex.StackTrace)); } } }
protected void SetWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken) { for (var i = WorkflowInstances.Count - 1; i >= 0; i--) { if (null == workflowInstance.Entity) { break; } if (WorkflowInstances[i].Entity.EntityType == workflowInstance.Entity.EntityType && WorkflowInstances[i].Entity.EntityId == workflowInstance.Entity.EntityId) { WorkflowInstances.RemoveAt(i); } } WorkflowInstances.Add(workflowInstance); }
public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { // Cast to Umbraco worklow instance. var umbracoWorkflowInstance = (UmbracoWorkflowInstance) workflowInstance; foreach(var nodeId in umbracoWorkflowInstance.CmsNodes) { var n = new CMSNode(nodeId); if(!n.IsDocument()) continue; var d = new Document(nodeId); d.Publish(User.GetUser(0)); umbraco.library.UpdateDocumentCache(d.Id); } runtime.Transition(workflowInstance, this, "done"); }
protected override bool OtherInstancesRunning(IWorkflowInstance workflowInstance, object sender) { var senderId = (int)TheHelper.GetPropertyValue(sender, "Id"); var typeName = workflowInstance.GetType().FullName; var umbracoWorkflowInstance = (UmbracoWorkflowInstance) workflowInstance; // var tenSecondsAgo = DateTime.Now.Subtract(TimeSpan.FromSeconds(10)); var otherInstances = TheWorkflowInstanceService.ListInstances().Where( i => (i.GetType().FullName == typeName) && (((UmbracoWorkflowInstance)i).Instantiator == umbracoWorkflowInstance.Instantiator) && (i.Id != workflowInstance.Id) && (((UmbracoWorkflowInstance)i).CmsNodes.Contains(senderId)) // && (i.InstantiationTime > tenSecondsAgo) ); return otherInstances.Count() > 0; }
public string TransitionInfo(IWorkflowInstance i) { if (i.CurrentTask == null) { return(""); } if (!typeof(IDecisionWorkflowTask).IsAssignableFrom(i.CurrentTask.GetType())) { return(""); } if (!CanTransition(i.CurrentTask) && !_isAdmin) { return(""); } var decision = (IDecisionWorkflowTask)i.CurrentTask; return("<a href='#' class='wfTransition' rel='" + string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) + "'>" + TheGlobalisationService.GetString("transtion") + "</a>"); }
protected override bool OtherInstancesRunning(IWorkflowInstance workflowInstance, object sender) { var senderId = (int)TheHelper.GetPropertyValue(sender, "Id"); var typeName = workflowInstance.GetType().FullName; var umbracoWorkflowInstance = (UmbracoWorkflowInstance)workflowInstance; // var tenSecondsAgo = DateTime.Now.Subtract(TimeSpan.FromSeconds(10)); var otherInstances = TheWorkflowInstanceService.ListInstances().Where( i => (i.GetType().FullName == typeName) && (((UmbracoWorkflowInstance)i).Instantiator == umbracoWorkflowInstance.Instantiator) && (i.Id != workflowInstance.Id) && (((UmbracoWorkflowInstance)i).CmsNodes.Contains(senderId)) // && (i.InstantiationTime > tenSecondsAgo) ); return(otherInstances.Count() > 0); }
public void Initialize(IOpenRPAClient client, IWorkflow workflow, IWorkflowInstance instance) { automation = AutomationUtil.getAutomation(); //cache = new CacheRequest(); //cache.TreeScope = FlaUI.Core.Definitions.TreeScope.Element | FlaUI.Core.Definitions.TreeScope.Subtree | FlaUI.Core.Definitions.TreeScope.Parent; ////cacheRequest.TreeScope = FlaUI.Core.Definitions.TreeScope.Element; //cache.AutomationElementMode = FlaUI.Core.Definitions.AutomationElementMode.None; //cache.Add(automation.PropertyLibrary.Element.AutomationId); //cache.Add(automation.PropertyLibrary.Element.ProcessId); //cache.Add(automation.PropertyLibrary.Element.Name); //cache.Add(automation.PropertyLibrary.Element.ClassName); //cache.Add(automation.PropertyLibrary.Element.ControlType); //cache.Add(automation.PropertyLibrary.Element.LocalizedControlType); //cache.Add(automation.PropertyLibrary.Element.FrameworkId); //cache.Add(automation.PropertyLibrary.Element.BoundingRectangle); //cache.Add(automation.PropertyLibrary.Element.IsPassword); //// cache.Add(automation.PropertyLibrary.Element.Parent); //cacheObject = cache.Activate(); }
// TODO handle timeout? TimeoutException on this task, and finish preparation in the background and set idle at the end, problem: it shouldn't know about idle! // Can be called only after a successful WaitIdleAsync()! private async Task PrepareInstanceAsync() { if (instance != null && instance.WorkflowInstanceState == WorkflowInstanceState.Aborted) { // We try to restart or reload it from the previous persisted state. await grain.LoadWorkflowStateAsync(); instance = null; } if (instance == null) { IWorkflowState workflowState = grain.WorkflowState; if (workflowState.InstanceValues == null) { // Start, there is no previous persisted state. instance = new WorkflowInstance(this, workflowDefinitionFactory(workflowDefinitionIdentity), workflowDefinitionIdentity); instance.Start(await grain.OnStartAsync(), GetExtensions()); } else { // Load previous persisted state. instance = new WorkflowInstance(this, workflowDefinitionFactory(workflowState.WorkflowDefinitionIdentity), workflowState.WorkflowDefinitionIdentity); // TODO If workflowState.WorkflowDefinitionIdentity differs from workflowDefinitionIdentity, we should create a DynamicUpdateMap and update the loaded instance. // Currently we downgrade the workflowDefinitionIdentity to the loaded value. // NOTE The workflowDefinitionFactory usually yields the same singleton workflow definition (ie. activity) for the same WorkflowDefinitionIdentity, // what happens with these activity trees during update??? // await instance.LoadAsync(workflowState.InstanceValues, GetExtensions(), >>>DynamicUpdateMap: workflowState.WorkflowDefinitionIdentity -> workflowDefinitionIdentity<<<); await instance.LoadAsync(workflowState.InstanceValues, GetExtensions()); workflowDefinitionIdentity = workflowState.WorkflowDefinitionIdentity; } } if (instance.WorkflowInstanceState == WorkflowInstanceState.Runnable) { TaskCompletionSource <object> taskCompletionSource = new TaskCompletionSource <object>(); await RunInstanceWithActiveTaskCompletionSourceProtectionAsync(taskCompletionSource, ActiveTaskCompletionSource.ProtectionLevel.UnhandledExceptionAndNormalCompletion); await taskCompletionSource.Task; } }
public static string TransitionInfo(this HtmlHelper helper, IWorkflowInstance i) { if (i.CurrentTask == null) { return(""); } if (!typeof(IDecisionWorkflowTask).IsAssignableFrom(i.CurrentTask.GetType())) { return(""); } if (!CanTransition(i.CurrentTask)) { return(""); } var decision = (IDecisionWorkflowTask)i.CurrentTask; return("<a href='" + string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) + "'>Transition</a>"); }
public void CleanUp(ref IWorkflowInstance e) { if (!PluginConfig.auto_close) { return; } foreach (var sesion in Sessions) { if (sesion.WorkflowInstanceId == e.InstanceId) { try { GenericTools.RunUI(sesion.Close); } catch (Exception) { } } } }
protected string AttachmentInfo(IWorkflowInstance i) { var umbracoWorkflowInstance = (UmbracoWorkflowInstance)i; var result = ""; foreach (var n in umbracoWorkflowInstance.CmsNodes) { var node = new CMSNode(n); if (node.nodeObjectType == Document._objectType) { result += "<a href=\"editContent.aspx?id=" + node.Id + "\">" + node.Text + " (" + node.Id + ")</a><br/>"; } else { result += node.Text + " (" + node.Id + ")<br/>"; } } return(result); }
// Implement the Run method of IRunnableWorkflowTask public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { // In Umbraco the workflowInstance should always be castable to an UmbracoWorkflowInstance var wf = (UmbracoWorkflowInstance)workflowInstance; var accessToken = new OAuthTokens { AccessToken = AccessToken, AccessTokenSecret = AccessTokenSecret, ConsumerKey = ConsumerKey, ConsumerSecret = ConsumerSecret }; foreach (var nodeId in wf.CmsNodes) { // We'll assume that only documents are attached to this workflow var doc = new Document(nodeId); string pageUrl; if (string.IsNullOrEmpty(ShortUrlProperty)) { // The user hasn't specified a property for a Short URL. var host = HttpContext.Current.Request.Url.Host; pageUrl = "http://" + host + umbraco.library.NiceUrl(nodeId); } else { pageUrl = (string)doc.getProperty(ShortUrlProperty).Value; } var tweet = string.Format(TweetText, doc.Text, pageUrl); // We could do some error checking with the result here.... var result = TwitterStatus.Update(accessToken, tweet); } // The run method of a workflow task is responsible for informing the runtime of the outcome. // The outcome should be one of the items in the AvailableTransitions list. runtime.Transition(workflowInstance, this, "done"); }
public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { // Cast to Umbraco worklow instance. var umbracoWorkflowInstance = (UmbracoWorkflowInstance)workflowInstance; foreach (var nodeId in umbracoWorkflowInstance.CmsNodes) { var n = new CMSNode(nodeId); if (!n.IsDocument()) { continue; } var d = new Document(nodeId); d.Publish(User.GetUser(0)); umbraco.library.UpdateDocumentCache(d.Id); } runtime.Transition(workflowInstance, this, "done"); }
private WorkflowBookmarkEntity CreateBookMark(IWorkflowInstance workflowInstance) { var allowedActions = string.Join(",", workflowInstance.Current.ActivityTemplate.AllowedActions.Select(p => p.OperationCode.ToString()) .ToList()); var bookmark = new WorkflowBookmarkEntity() { BOOKMARK_ID = Guid.NewGuid().ToString(), CREATED_ON = DateTime.Now, LAST_UPDATED_ON = DateTime.Now, CURRENT_ACTIVITY_NAME = workflowInstance.Current.ActivityTemplate.Name, NEXT_ACTIVITY_NAME = FindNextActivityTemplate(workflowInstance.Current.ActivityTemplate).Name, ALLOWED_OPERATIONS = allowedActions, FORM_TYPE = workflowInstance.Form.FormType, FORM_ID = workflowInstance.Form.FormId, WORKFLOW_INSTANCE_ID = workflowInstance.WorkflowInstanceId, USER_ID = workflowInstance.Owner.ApproverId }; return(bookmark); }
// Implement the Run method of IRunnableWorkflowTask public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { // In Umbraco the workflowInstance should always be castable to an UmbracoWorkflowInstance var wf = (UmbracoWorkflowInstance)workflowInstance; var accessToken = new OAuthTokens { AccessToken = AccessToken, AccessTokenSecret = AccessTokenSecret, ConsumerKey = ConsumerKey, ConsumerSecret = ConsumerSecret }; foreach (var nodeId in wf.CmsNodes) { // We'll assume that only documents are attached to this workflow var doc = new Document(nodeId); string pageUrl; if(string.IsNullOrEmpty(ShortUrlProperty)) { // The user hasn't specified a property for a Short URL. var host = HttpContext.Current.Request.Url.Host; pageUrl = "http://" + host + umbraco.library.NiceUrl(nodeId); } else { pageUrl = (string)doc.getProperty(ShortUrlProperty).Value; } var tweet = string.Format(TweetText, doc.Text, pageUrl); // We could do some error checking with the result here.... var result = TwitterStatus.Update(accessToken, tweet); } // The run method of a workflow task is responsible for informing the runtime of the outcome. // The outcome should be one of the items in the AvailableTransitions list. runtime.Transition(workflowInstance, this, "done"); }
public void OnNotifyIdle() { bool isTrySetCompleted = activeTaskCompletionSources.TrySetCompleted(); if (completionState != null) { if (instance.WorkflowInstanceState == WorkflowInstanceState.Complete) { // Completed as expected. instance = null; } else { // Typically aborted after completion due to a persistence failure. completionState = null; } } if (!isTrySetCompleted) { idle.Set(); } }
public string TransitionInfo(IWorkflowInstance i) { if (i.CurrentTask == null) { return(""); } if (!(i.CurrentTask is IDecisionWorkflowTask)) { return(""); } var instantiator = ((UmbracoWorkflowInstance)i).Instantiator; if (!CanTransition(i.CurrentTask, instantiator) && !_isAdmin) { return(""); } if (i.CurrentTask is UrlGroupDecisionWorkflowTask) { var urlTask = (UrlGroupDecisionWorkflowTask)i.CurrentTask; var url = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url; return("<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("transtion") + "</a>"); } if (i.CurrentTask is UrlInstantiatorRestartWorkflowTask) { var urlTask = (UrlInstantiatorRestartWorkflowTask)i.CurrentTask; var url = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url; return("<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("restart_workflow") + "</a>"); } var decision = (IDecisionWorkflowTask)i.CurrentTask; return("<a href='#' class='wfTransition' rel='" + string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) + "'>" + TheGlobalisationService.GetString("transtion") + "</a>"); }
public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime) { base.Run(workflowInstance, runtime); var body = Helper.Instance.RenderTemplate(RenderTemplate); IList <string> files = new List <string>(); foreach (var nodeId in ((UmbracoWorkflowInstance)workflowInstance).CmsNodes) { var node = new CMSNode(nodeId); if (node.IsMedia()) { files.Add(IOHelper.MapPath((string)new Media(nodeId).getProperty("umbracoFile").Value)); } } var f = new User(From).Email; foreach (var r in GetRecipients()) { var mail = new MailMessage(f, r) { Subject = Subject, IsBodyHtml = true, Body = body }; foreach (var file in files) { var attach = new Attachment(file); mail.Attachments.Add(attach); } var smtpClient = new SmtpClient(); smtpClient.Send(mail); } runtime.Transition(workflowInstance, this, "done"); }
protected override void OnInit(EventArgs e) { base.OnInit(e); this.AddResourceToClientDependency("FergusonMoriyam.Workflow.Umbraco.Web.Ui.Js.Util.js", ClientDependencyType.Javascript); this.AddResourceToClientDependency("FergusonMoriyam.Workflow.Umbraco.Web.Ui.Js.Config.js", ClientDependencyType.Javascript); // Get a reference to the application spring context and use it to get a reference // to the workflow transition service. If you know spring.net you could // Just add your aspx to the config in ~/config/fmworkflow var ctx = ContextRegistry.GetContext(); TheTransitionService = (IWorkflowTaskTransitionService)ctx.GetObject("TransitionService"); // Get a workflow instance - id is passed on the request. var id = Convert.ToInt32(Request["id"]); WorkflowInstance = TheTransitionService.GetWorkflowInstance(id); // Check that the workflow is able to be transitioned still - someone may have progressed it in the // meantime. CannotTransitionLiteral.Text = "This workflow cannot be transitioned"; if (!TheTransitionService.CanTransition(WorkflowInstance)) { CannotTransitionLiteral.Visible = true; return; } // Bind a list of possible transitions for current workflow task to the dropdown // Transitions are just a dictionary of Key = transition ID, Value = Description TransitonDropDownList.DataSource = TheTransitionService.GetTransitions(WorkflowInstance); TransitonDropDownList.DataTextField = "Value"; TransitonDropDownList.DataValueField = "Key"; TransitonDropDownList.DataBind(); }
public void Transition(IWorkflowInstance workflowInstance, IWorkflowTask workflowTask, string transitionName) { Log.Info(string.Format("The workflow runtime is transitioning {0} - {1} '{2}' - '{3}'", workflowTask.Name, transitionName, workflowInstance.Id, workflowInstance.Name)); Transition(workflowInstance, workflowTask, transitionName, ""); }
public string TransitionInfo(IWorkflowInstance i) { if (i.CurrentTask == null) return ""; if (!(i.CurrentTask is IDecisionWorkflowTask)) return ""; var instantiator = ((UmbracoWorkflowInstance) i).Instantiator; if (!CanTransition(i.CurrentTask, instantiator) && !_isAdmin) { return ""; } if (i.CurrentTask is UrlGroupDecisionWorkflowTask) { var urlTask = (UrlGroupDecisionWorkflowTask)i.CurrentTask; var url = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url; return "<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("transtion") + "</a>"; } if (i.CurrentTask is UrlInstantiatorRestartWorkflowTask) { var urlTask = (UrlInstantiatorRestartWorkflowTask)i.CurrentTask; var url = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url; return "<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("restart_workflow") + "</a>"; } var decision = (IDecisionWorkflowTask) i.CurrentTask; return "<a href='#' class='wfTransition' rel='"+string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) +"'>"+ TheGlobalisationService.GetString("transtion") + "</a>"; }
public void Update(IWorkflowInstance workflowInstance) { TheWorkflowInstanceRepository.Update(workflowInstance); }
public void Transition(IWorkflowInstance workflowInstance, IWorkflowTask workflowTask, string transitionName, string comment) { if (workflowTask.Transitions.Values.Count == 0) { Log.Warn(string.Format("Ending workflow '{0}' as it has no transitions.", workflowInstance.Id)); EndWorkflow(workflowInstance); TheWorkflowInstanceRepository.Update(workflowInstance); return; } if(!workflowTask.Transitions.ContainsKey(transitionName)) { LogAndThrow(new WorkflowTaskInvalidTransitionException(string.Format("Inavlid transition '{0}' for task '{1}'", transitionName, workflowTask.Name))); } var transitionGuid = workflowTask.Transitions[transitionName]; var transitionTask = workflowInstance.Tasks.SingleOrDefault(task => task.Id == transitionGuid); if(transitionTask == null) { LogAndThrow(new WorkflowTaskInvalidTransitionException(string.Format("Can't transition to task '{0}' in workflow '{1}' as it is not found", transitionGuid.ToString(), workflowInstance.Id))); } Log.Info(string.Format("Transitioning workflow '{0}' - '{1}' from '{2}' to '{3}' using transition '{4}'", workflowInstance.Name, workflowInstance.Id, workflowInstance.CurrentTask.Name, transitionTask.Name, transitionName)); workflowInstance.TransitionHistory.Add(string.Format("{0} - Transition '{1}' - '{2}' -> '{3}' {4}", DateTime.Now, transitionName, workflowInstance.CurrentTask.Name, transitionTask.Name, comment)); workflowInstance.CurrentTask = transitionTask; if (workflowInstance.CurrentTask is IDelayWorkflowTask) { ((IDelayWorkflowTask)workflowInstance.CurrentTask).StartTime = DateTime.Now; } TheWorkflowInstanceRepository.Update(workflowInstance); }
protected abstract void AddInstantiatingObjectsToInstance(object sender, IWorkflowInstance inst);
protected void Page_Load(object sender, EventArgs e) { var moduleNodeTypeAliases = ConfigurationManager.AppSettings["ModuleNodeTypeAliases"].Split(',') .ToList() .ConvertAll(x => x.ToLower()); var id = Convert.ToInt32(Request["id"]); _workflowInstance = TheWorkflowInstanceService.GetInstance(id); var nodes = ((UmbracoWorkflowInstance)_workflowInstance).CmsNodes; if (!Page.IsPostBack) { var nodeDetails = new List<NodeInfo>(); foreach (var nodeId in nodes) { var node = new Content(nodeId); if (!moduleNodeTypeAliases.Contains(node.ContentType.Alias.ToLower())) { var url = umbraco.library.NiceUrl(nodeId); nodeDetails.Add(new NodeInfo { Id = nodeId, PreviewNodeId = nodeId, Name = node.Text, Url = umbraco.library.NiceUrl(nodeId), Approved = true, Comment = string.Empty }); } else { var ids = FindReferencesToModule(nodeId, 1050).Distinct(); var url = ids.Any() ? umbraco.library.NiceUrl(ids.First()) : "#"; nodeDetails.Add(new NodeInfo { Id = nodeId, PreviewNodeId = ids.Any() ? ids.First() : nodeId, Name = "Module " + node.Text, Url = url, Approved = true, Comment = string.Empty, References = string.Join(",", ids) }); } } var json = JsonConvert.SerializeObject(nodeDetails, Formatting.Indented); JsonLiteral.Text = json; NodeRepeater.DataSource = nodeDetails; NodeRepeater.DataBind(); } }
public void Transition(IWorkflowInstance workflowInstance, string transiton) { Transition(workflowInstance, transiton, ""); }
protected virtual void NotifyInstantiation(IWorkflowInstance inst) { }
protected string AttachmentInfo(IWorkflowInstance i) { var umbracoWorkflowInstance = (UmbracoWorkflowInstance)i; var result = ""; foreach(var n in umbracoWorkflowInstance.CmsNodes) { var node = new CMSNode(n); if (node.nodeObjectType == Document._objectType) { result += "<a href=\"editContent.aspx?id="+ node.Id+"\">" + node.Text + " (" + node.Id + ")</a><br/>"; } else { result += node.Text + " (" + node.Id + ")<br/>"; } } return result; }
protected override void NotifyInstantiation(IWorkflowInstance inst) { BasePage.Current.ClientTools.ShowSpeechBubble(BasePage.speechBubbleIcon.info, TheGlobalisationService.GetString("workflow_started"), TheGlobalisationService.GetString("workflow") + string.Format(" '{0}'<br/>(Id -> {1}) {2}.", inst.Name, inst.Id, TheGlobalisationService.GetString("was_started"))); }
protected abstract bool OtherInstancesRunning(IWorkflowInstance inst, object sender);