Esempio n. 1
0
 private string GetAlignedToMetricFromDetails(PlannerTaskDetails details)
 {
     return(Regex.Match(
                details.Description,
                "(?<=Aligned to Metric\r\n).*",
                RegexOptions.Compiled | RegexOptions.Multiline).Value);
 }
Esempio n. 2
0
    public static async Task <PlannerTaskDetails> AddPlannerTaskDetails(PlannerTaskDetails plannerTaskDetails, string taskId, string clientId = null)
    {
        var graphClient = GetAuthenticatedClient();

        if (!string.IsNullOrEmpty(clientId))
        {
            var hubContext = GlobalHost.ConnectionManager.GetHubContext <MwHub>();
            hubContext.Clients.Client(clientId).addMessage("GET: " + graphClient.Planner.Tasks[taskId].Details.Request().RequestUrl);
        }

        var originalTaskDescription = await graphClient
                                      .Planner
                                      .Tasks[taskId]
                                      .Details
                                      .Request()
                                      .GetAsync();

        if (!string.IsNullOrEmpty(clientId))
        {
            var hubContext = GlobalHost.ConnectionManager.GetHubContext <MwHub>();
            hubContext.Clients.Client(clientId).addMessage("PATCH: " + graphClient.Planner.Tasks[taskId].Details.Request().RequestUrl);
        }

        var response = await graphClient
                       .Planner
                       .Tasks[taskId]
                       .Details
                       .Request()
                       .Header("If-Match", originalTaskDescription.GetEtag())
                       .UpdateAsync(plannerTaskDetails);

        return(response);
    }
Esempio n. 3
0
 private string GetNextStepsFromDetails(PlannerTaskDetails details)
 {
     return(Regex.Match(
                details.Description,
                "(?<=Next Steps(\r\n)+).*(?=(\r\n)+Aligned to Metric)",
                RegexOptions.Compiled | RegexOptions.Multiline).Value);
 }
Esempio n. 4
0
        public async Task <PlannerTask> CreateAsync(string planId, string title, DateTimeOffset?startDate, string ownerId, string description)
        {
            var newIdearBucket = await plannerService.GetNewIdeaBucketAsync(planId);

            if (newIdearBucket == null)
            {
                throw new ApplicationException("Could not found New Idea bucket.");
            }

            var plannerTask = new PlannerTask
            {
                PlanId        = planId,
                BucketId      = newIdearBucket.Id,
                Title         = title,
                StartDateTime = startDate,
                Assignments   = new PlannerAssignments()
            };

            plannerTask.Assignments.AddAssignee(ownerId);
            plannerTask = await graphServiceClient.Planner.Tasks.Request().AddAsync(plannerTask);

            //await Task.Delay(3000);

            var planerTaskDetails = new PlannerTaskDetails {
                Description = description
            };
            var plannerTaskRequestBuilder = graphServiceClient.Planner.Tasks[plannerTask.Id];

            PlannerTaskDetails details = null;

            int count = 1;

            while (true)
            {
                try
                {
                    details = await plannerTaskRequestBuilder.Details.Request().GetAsync();

                    break;
                }
                catch (Exception ex)
                {
                    if (count < 6)
                    {
                        await Task.Delay(1000);
                    }
                    else
                    {
                        throw new Exception("Task created. But failed to create its details. ", ex);
                    }
                }
                count++;
            }

            details = await plannerTaskRequestBuilder.Details
                      .Request(new[] { new HeaderOption("If-Match", details.GetEtag()) })
                      .UpdateAsync(planerTaskDetails);

            return(plannerTask);
        }
Esempio n. 5
0
        public async Task <PlannerTaskDetails> AddPlannerTaskDetailsAsync(PlannerTaskDetails plannerTaskDetails, string taskId)
        {
            signalRMessage.sendMessage($"GET: {graphServiceClient.Planner.Tasks[taskId].Details.Request().RequestUrl}");
            var originalTaskDescription = await graphServiceClient.Planner.Tasks[taskId].Details.Request().GetAsync();

            signalRMessage.sendMessage($"PATCH: {graphServiceClient.Planner.Tasks[taskId].Details.Request().Header("If-Match", originalTaskDescription.GetEtag()).RequestUrl}");
            var response = await graphServiceClient.Planner.Tasks[taskId].Details.Request().Header("If-Match", originalTaskDescription.GetEtag()).UpdateAsync(plannerTaskDetails);

            return(response);
        }
Esempio n. 6
0
        private static async Task UpdateTaskDetailsV2(GraphServiceClient graphClient, string groupId, PlannerTask task, string newFileName, DriveItem attachFile, string myEtag)
        {
            PlannerTaskDetails taskDetails = new PlannerTaskDetails();

            taskDetails = await GetPlannerTaskDetailsAsync(graphClient, task);


            taskDetails.AdditionalData =
                new Dictionary <string, object>()
            {
                { newFileName, attachFile.Name }
            };

            await graphClient.Planner.Tasks[task.Id].Details
            .Request()
            .Header("If-Match", myEtag)
            .UpdateAsync(taskDetails);
        }
Esempio n. 7
0
        private static async Task UpdateTaskDetails(GraphServiceClient graphClient, string groupId, PlannerTask task, DriveItem attachFile)
        {
            PlannerTaskDetails taskDetails = await GetPlannerTaskDetailsAsync(graphClient, task);

            taskDetails.References = new PlannerExternalReferences();
            taskDetails.References.AddReference(attachFile.WebUrl, attachFile.Name);

            taskDetails.Checklist = new PlannerChecklistItems();
            taskDetails.Checklist.AddChecklistItem("Meet Visitor in Lobby");

            //not useing anymore
            //                .Header("Prefer", "return=represendation")

            PlannerTaskDetails updatedTask = await graphClient.Planner.Tasks[task.Id].Details.Request()
                                             .Header("If-Match", taskDetails.GetEtag())
                                             .Header("Prefer", "return=represendation")
                                             .UpdateAsync(taskDetails);
        }
        /// <summary>
        /// Update the navigation property details in planner
        /// <param name="body"></param>
        /// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
        /// </summary>
        public RequestInformation CreatePatchRequestInformation(PlannerTaskDetails body, Action <DetailsRequestBuilderPatchRequestConfiguration> requestConfiguration = default)
        {
            _ = body ?? throw new ArgumentNullException(nameof(body));
            var requestInfo = new RequestInformation {
                HttpMethod     = Method.PATCH,
                UrlTemplate    = UrlTemplate,
                PathParameters = PathParameters,
            };

            requestInfo.SetContentFromParsable(RequestAdapter, "application/json", body);
            if (requestConfiguration != null)
            {
                var requestConfig = new DetailsRequestBuilderPatchRequestConfiguration();
                requestConfiguration.Invoke(requestConfig);
                requestInfo.AddRequestOptions(requestConfig.Options);
                requestInfo.AddHeaders(requestConfig.Headers);
            }
            return(requestInfo);
        }
Esempio n. 9
0
        private static async Task <PlannerTaskDetails> GetPlannerTaskDetailsAsync(GraphServiceClient graphClient, PlannerTask task)
        {
            int cnt = 0;
            PlannerTaskDetails taskDetails = null;

            while (taskDetails == null)
            {
                //Sometimes takes a little time to create the task, so wait until the item is created
                cnt++;
                try
                {
                    taskDetails = await graphClient.Planner.Tasks[task.Id].Details.Request().GetAsync();
                }
                catch (ServiceException se)
                {
                }
            }

            return(taskDetails);
        }
        private void ChangeIssue()
        {
            HochladenAsync(Attachments, _selectedBucket.Name, _selectedCategory.Description, _selectedGroup.Id);
            PlannerAppliedCategories appliedCategories = CreateAppliedCategories(_selectedCategory);
            Conversation             conversation      = CreateConversation(UploadPath, _selectedTask.Title);
            var         taskDetailsETag             = _graphClient.Planner.Tasks[_selectedTask.Id].Details.Request().GetAsync().Result.GetEtag();
            var         currentConversationthreadId = _graphClient.Planner.Tasks[_selectedTask.Id].Request().GetAsync().Result.ConversationThreadId;
            PlannerTask plannerTask = new PlannerTask()
            {
                PercentComplete   = SelectedPercentComplete.Value,
                DueDateTime       = _selectedDueDate,
                AppliedCategories = appliedCategories
            };

            if (currentConversationthreadId != null)
            {
                _graphClient.Groups[_selectedGroup.Id].Threads[currentConversationthreadId].Reply(conversation.Threads[0].Posts[0]).Request().PostAsync();
            }
            else
            {
                var neuConversationThreadId = _graphClient.Groups[_selectedGroup.Id].Conversations.Request().AddAsync(conversation).Result.Id;
                plannerTask.ConversationThreadId = neuConversationThreadId;//neue Thread zugewiesen
            }

            _graphClient.Planner.Tasks[_selectedTask.Id].Request()
            .Header("If-Match", _selectedTask.GetEtag())
            .Header("Prefer", "return=representation")
            .UpdateAsync(plannerTask);
            var currentTaskDetailsEtag            = _graphClient.Planner.Tasks[_selectedTask.Id].Details.Request().GetAsync().Result.GetEtag();
            PlannerTaskDetails plannerTaskDetails = new PlannerTaskDetails()
            {
                Description = _description
            };

            _graphClient.Planner.Tasks[_selectedTask.Id].Details.
            Request()
            .Header("If-Match", currentTaskDetailsEtag)
            .UpdateAsync(plannerTaskDetails);
            System.Windows.MessageBox.Show(string.Format("task {0} changed.", _selectedTask.Title));
        }
        private void CreateIssue()
        {
            HochladenAsync(Attachments, SelectedBucket.Name, SelectedCategory.Description, _selectedGroup.Id);

            PlannerAppliedCategories appliedCategories = CreateAppliedCategories(_selectedCategory);
            Conversation             conversation      = CreateConversation(UploadPath, _selectedTask.Title);
            var         newConversationId = _graphClient.Groups[_selectedGroup.Id].Conversations.Request().AddAsync(conversation).Result.Id;
            PlannerTask plannerTask       = new PlannerTask()
            {
                PlanId               = _selectedPlan.Id,
                BucketId             = _selectedBucket.Id,
                Title                = _taskTitle,
                ConversationThreadId = newConversationId,
                PercentComplete      = SelectedPercentComplete.Value,
                DueDateTime          = _selectedDueDate,
                AppliedCategories    = appliedCategories
            };
            var    createdTask            = _graphClient.Planner.Tasks.Request().AddAsync(plannerTask).Result;
            string createdTaskDetailsEtag = "";

            while (createdTask != null && createdTaskDetailsEtag.Equals(""))
            {
                try
                { createdTaskDetailsEtag = _graphClient.Planner.Tasks[createdTask.Id].Details.Request().GetAsync().Result.GetEtag(); }
                catch (Exception e)
                {
                    Thread.Sleep(500);
                }
            }

            PlannerTaskDetails plannerTaskDetails = new PlannerTaskDetails()
            {
                Description = _description
            };

            _graphClient.Planner.Tasks[createdTask.Id].Details.Request()
            .Header("If-Match", createdTaskDetailsEtag)
            .UpdateAsync(plannerTaskDetails);
            System.Windows.MessageBox.Show(string.Format("task {0} created.", createdTask.Title));
        }
        public async Async.Task PlannerTaskDetailsUpdate()
        {
            var group = await CreateGroup();

            this.testGroup = group;
            var plannerPlan = await CreatePlan(group); // You may need to add a Delay in this since there is some latency.

            PlannerTask taskToCreate = new PlannerTask();

            taskToCreate.PlanId = plannerPlan.Id;
            taskToCreate.Title  = "New task title";

            PlannerTask createdTask = await graphClient.Planner.Tasks.Request().AddAsync(taskToCreate);

            PlannerTaskDetails taskDetails = await graphClient.Planner.Tasks[createdTask.Id].Details.Request().GetAsync();

            PlannerTaskDetails taskDetailsToUpdate = new PlannerTaskDetails();

            taskDetailsToUpdate.Checklist = new PlannerChecklistItems();
            string checklistItemId1 = taskDetailsToUpdate.Checklist.AddChecklistItem("Do something");
            string checklistItemId2 = taskDetailsToUpdate.Checklist.AddChecklistItem("Do something else");

            taskDetailsToUpdate.References = new PlannerExternalReferences();
            taskDetailsToUpdate.References.AddReference("http://developer.microsoft.com", "Developer resources");

            taskDetailsToUpdate.PreviewType = PlannerPreviewType.Checklist;
            taskDetailsToUpdate.Description = "Description of the task";

            string             etag = taskDetails.GetEtag();
            PlannerTaskDetails updatedTaskDetails = await graphClient.Planner.Tasks[createdTask.Id].Details.Request().Header("If-Match", etag).Header("Prefer", "return=representation").UpdateAsync(taskDetailsToUpdate);

            Assert.AreEqual("Description of the task", updatedTaskDetails.Description);
            Assert.AreEqual(PlannerPreviewType.Checklist, updatedTaskDetails.PreviewType);
            Assert.AreEqual(2, updatedTaskDetails.Checklist.Count());
            Assert.AreEqual("Do something", updatedTaskDetails.Checklist[checklistItemId1]?.Title);
            Assert.AreEqual("Do something else", updatedTaskDetails.Checklist[checklistItemId2]?.Title);
            Assert.AreEqual(1, updatedTaskDetails.References.Count());
            Assert.AreEqual("Developer resources", updatedTaskDetails.References["http://developer.microsoft.com"]?.Alias);
        }
Esempio n. 13
0
        public async System.Threading.Tasks.Task <ActionResult> Import(HttpPostedFileBase file, string PlannerPlan, string clientId)
        {
            SignalRMessage signalR      = new SignalRMessage(clientId);
            GraphPlanner   graphPlanner = new GraphPlanner(clientId);

            try
            {
                // Get current planner object
                var planner = await graphPlanner.GetplannerPlanAsync(PlannerPlan);

                // Count imported tasks
                int importedTasksCounter = 0;

                // Get uploaded json
                BinaryReader b       = new BinaryReader(file.InputStream);
                byte[]       binData = b.ReadBytes(file.ContentLength);
                string       result  = Encoding.UTF8.GetString(binData);

                JsonReader reader = new JsonTextReader(new StringReader(result));
                // Do not parse datetime values
                reader.DateParseHandling    = DateParseHandling.None;
                reader.DateTimeZoneHandling = DateTimeZoneHandling.Unspecified;
                JObject trelloBoard = JObject.Load(reader);

                // Get trello lists
                ArrayList bucketsToCreate = new ArrayList();

                foreach (JToken list in trelloBoard.SelectToken("lists"))
                {
                    string bucketName = (string)list["name"];
                    // check if list was archived
                    bool isOpen = !(bool)list["closed"];

                    if (!bucketsToCreate.Contains(bucketName) && isOpen)
                    {
                        bucketsToCreate.Add(bucketName);
                    }
                }

                // Get existing planner buckets
                IEnumerable <PlannerBucket> plannerBuckets = await graphPlanner.GetPlannerBucketsAsync(PlannerPlan);

                // Create planner bucket if not exists
                foreach (string bucket in bucketsToCreate)
                {
                    try
                    {
                        if (!plannerBuckets.ToList().Where(p => p.Name == bucket).Any())
                        {
                            PlannerBucket plannerBucket = new PlannerBucket
                            {
                                Name   = bucket,
                                PlanId = PlannerPlan
                            };

                            var reponse = await graphPlanner.AddPlannerBucketAsync(plannerBucket);
                        }
                    }
                    catch
                    {
                    }
                }

                // Get available planner buckets
                plannerBuckets = await graphPlanner.GetPlannerBucketsAsync(PlannerPlan);

                // create tasks
                foreach (JToken task in trelloBoard.SelectToken("cards"))
                {
                    try
                    {
                        // Get name of the trello list which will become a planner bucket
                        string trelloId = (string)task["idList"];
                        string name     = (string)trelloBoard.SelectToken($"$.lists[?(@.id == '{trelloId}')]")["name"];
                        // Check if task is in an archived list --> won't be imported
                        bool isInArchivedList = (bool)trelloBoard.SelectToken($"$.lists[?(@.id == '{trelloId}')]")["closed"];

                        PlannerTask plannerTask = new PlannerTask
                        {
                            PlanId = PlannerPlan,
                            Title  = (string)task["name"],
                        };

                        if (isInArchivedList)
                        {
                            signalR.sendMessage("Discarding task because stored in an archived list: '" + plannerTask.Title + "'");
                        }
                        else
                        {
                            try
                            {
                                // Get bucketId to store tasks
                                string bucketId = plannerBuckets.Where(p => p.Name.Equals(name)).First().Id;
                                plannerTask.BucketId = bucketId;
                            }
                            catch
                            {
                            }

                            // Get completed
                            bool isClosed = bool.Parse((string)task["closed"]);

                            if (isClosed)
                            {
                                plannerTask.PercentComplete = 100;
                            }

                            // Get due
                            string dueDateTime = (string)task["due"];

                            if (!string.IsNullOrEmpty(dueDateTime))
                            {
                                plannerTask.DueDateTime = DateTimeOffset.Parse(dueDateTime);
                            }

                            // Get assigned user
                            try
                            {
                                JToken[] assignedToId = task.SelectTokens("idMembers[*]").ToArray();

                                plannerTask.Assignments = new PlannerAssignments();

                                // workaround: https://github.com/nicolonsky/ModernWorkplaceConcierge/issues/75#issuecomment-821622465
                                plannerTask.Assignments.ODataType = null;

                                foreach (JToken currentUser in assignedToId)
                                {
                                    if (!string.IsNullOrEmpty((string)currentUser))
                                    {
                                        string assignedToname = (string)trelloBoard.SelectToken($"$.members[?(@.id == '{(string)currentUser}')]")["fullName"];

                                        User user = await GraphHelper.GetUser(assignedToname);

                                        plannerTask.Assignments.AddAssignee(user.Id);
                                    }
                                }
                            }
                            catch
                            {
                            }

                            // Add the task
                            var request = await graphPlanner.AddPlannerTaskAsync(plannerTask);

                            signalR.sendMessage("Successfully imported task '" + request.Title + "'");

                            importedTasksCounter++;

                            // Add task details like description and attachments

                            JToken[] attachments     = task.SelectTokens("attachments[*]").ToArray();
                            string   taskDescription = (string)task["desc"];

                            if (!string.IsNullOrEmpty(taskDescription) || attachments.Count() > 0)
                            {
                                PlannerTaskDetails plannerTaskDetails = new PlannerTaskDetails();

                                if (!string.IsNullOrEmpty(taskDescription))
                                {
                                    plannerTaskDetails.Description = taskDescription;
                                }

                                plannerTaskDetails.References = new PlannerExternalReferences();

                                foreach (JToken attachment in attachments)
                                {
                                    string attachmentUrl  = attachment.Value <string>("url");
                                    string attachmentName = attachment.Value <string>("name");

                                    if (!string.IsNullOrEmpty(attachmentUrl))
                                    {
                                        try
                                        {
                                            plannerTaskDetails.References.AddReference(attachmentUrl, attachmentName);
                                        }
                                        catch
                                        {
                                        }
                                    }
                                }

                                try
                                {
                                    plannerTaskDetails.Checklist = new PlannerChecklistItems();

                                    JToken[] checklists = task.SelectTokens("idChecklists[*]").ToArray();

                                    foreach (JToken checklist in checklists)
                                    {
                                        JToken[] checklistItems = trelloBoard.SelectTokens($"$.checklists[?(@.id == '{(string)checklist}')].checkItems[*].name").ToArray();

                                        int checklistCount = 0;

                                        foreach (JToken checklistItem in checklistItems)
                                        {
                                            string checklistItemName = (string)checklistItem;

                                            // truncate string because checklist items are limited to 100 characters
                                            if (checklistItemName.Length >= 100)
                                            {
                                                signalR.sendMessage("Truncating checklist item: '" + checklistItemName + "' on task: '" + plannerTask.Title + "'. The maximum length in Planner is 100 characters!");
                                                checklistItemName = checklistItemName.Substring(0, 100);
                                            }

                                            if (!(checklistCount >= 20))
                                            {
                                                plannerTaskDetails.Checklist.AddChecklistItem(checklistItemName);
                                            }
                                            else
                                            {
                                                signalR.sendMessage("Discarding checklist item: '" + checklistItemName + "' on task: '" + plannerTask.Title + "' because Planner limit's each card to 20 checklist items!");
                                            }

                                            checklistCount++;
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                    signalR.sendMessage("Error: " + e.Message);
                                }

                                var response = await graphPlanner.AddPlannerTaskDetailsAsync(plannerTaskDetails, request.Id);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        signalR.sendMessage("Error: " + e.Message);
                    }
                }

                signalR.sendMessage("Success imported: " + importedTasksCounter + " tasks to planner: " + planner.Title);
            }
            catch (Exception e)
            {
                signalR.sendMessage("Error: " + e.Message);
            }

            signalR.sendMessage("Done#!");
            return(new HttpStatusCodeResult(204));
        }