Example #1
0
        public async Task <PowerBICalendarView> GetScheduleInGroup(string mode)
        {
            var model = (PowerBICalendarView)CachingProvider.Instance().GetItem($"PBI_{Settings.PortalId}_{Settings.SettingsId}_{Thread.CurrentThread.CurrentUICulture.Name}_CalendarDataSet_{mode}");

            if (model != null)
            {
                return(model);
            }

            model = new PowerBICalendarView();
            // Get token credentials for user
            var getCredentialsResult = await GetTokenCredentials();

            if (!getCredentialsResult)
            {
                // The error message set in GetTokenCredentials
                return(null);
            }

            var random  = new Random();
            var colours = new List <string>();

            // Create a Power BI Client object. It will be used to call Power BI APIs.
            using (var client = new PowerBIClient(new Uri(Settings.ApiUrl), tokenCredentials))
            {
                if (mode == "-1")
                {
                    //Mode = 0 schedule for all workspaces
                    var pbiSettings = SharedSettingsRepository.Instance.GetSettings(Settings.PortalId);
                    foreach (var s in pbiSettings)
                    {
                        model.Workspaces.Add(s.WorkspaceId);
                    }
                }
                else
                {
                    //Schedule for currect workspace
                    model.Workspaces = new List <string> {
                        Settings.WorkspaceId
                    };
                }

                var groups     = client.Groups.GetGroupsAsync().GetAwaiter().GetResult().Value;
                var capacities = client.Capacities.GetCapacitiesAsync().GetAwaiter().GetResult().Value;


                foreach (var workspace in model.Workspaces)
                {
                    IList <Dataset> datasets;
                    //Get Schedule datasets
                    try
                    {
                        datasets = client.Datasets.GetDatasetsInGroupAsync(Guid.Parse(workspace)).GetAwaiter().GetResult().Value;
                        datasets = CleanUsageDatasets(datasets.ToList());
                    }
                    catch (Exception ex)
                    {
                        Logger.Warn($"Error getting datasets in workspace {workspace}", ex);
                        continue;
                    }


                    var group    = groups.FirstOrDefault(g => g.Id.ToString() == workspace.ToLowerInvariant());
                    var capacity = capacities.FirstOrDefault(c => c.Id == group.CapacityId);


                    for (var x = 0; x < datasets.Count; x++)
                    {
                        var dataset = datasets[x];
                        var color   = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9"
                        colours.Add(color);

                        try
                        {
                            //Get refreshes history
                            var history = client.Datasets.GetRefreshHistoryAsync(Guid.Parse(Settings.WorkspaceId), dataset.Id, 100).GetAwaiter().GetResult().Value.ToList();

                            foreach (var refresh in history)
                            {
                                model.History.Add(new RefreshedDataset
                                {
                                    Dataset              = dataset.Name,
                                    WorkSpaceName        = group.Name,
                                    CapacityName         = capacity.DisplayName,
                                    StartTime            = refresh.StartTime,
                                    EndTime              = refresh.EndTime,
                                    RefreshType          = refresh.RefreshType,
                                    RequestId            = refresh.RequestId,
                                    ServiceExceptionJson = refresh.ServiceExceptionJson,
                                    Status = refresh.Status
                                });
                            }
                        }
                        catch (Exception ex)
                        {
                            // TODO: Getting "UnsupportedMediaType"
                        }
                        try
                        {
                            //Get refresh Schedule by dataset and Workspace
                            var schedule = client.Datasets.GetRefreshScheduleInGroupAsync(Guid.Parse(Settings.WorkspaceId), dataset.Id)
                                           .GetAwaiter().GetResult();
                            var    timeRange = new List <Schedule>();
                            string startHour = schedule.Times[0];
                            string endHour   = schedule.Times[0];

                            //Grouping of consecutive hours
                            for (int i = 0; i < schedule.Times.Count; i++)
                            {
                                if (schedule.Times[i] != schedule.Times.Last())
                                {
                                    DateTime hour = DateTime.ParseExact(schedule.Times[i], "HH:mm",
                                                                        CultureInfo.InvariantCulture);
                                    DateTime nextHour = DateTime.ParseExact(schedule.Times[i + 1], "HH:mm",
                                                                            CultureInfo.InvariantCulture);
                                    if (nextHour.Hour == hour.Hour + 1)
                                    {
                                        continue;
                                    }
                                    else
                                    {
                                        endHour = hour.AddHours(1).ToString("HH:mm");
                                        timeRange.Add(new Schedule
                                        {
                                            start = startHour,
                                            end   = endHour
                                        });
                                        startHour = schedule.Times[i + 1];
                                        endHour   = schedule.Times[i + 1];
                                    }
                                }
                                else
                                {
                                    endHour = DateTime.ParseExact(schedule.Times[i], "HH:mm",
                                                                  CultureInfo.InvariantCulture).AddHours(1).ToString("HH:mm");
                                    timeRange.Add(new Schedule
                                    {
                                        start = startHour,
                                        end   = endHour
                                    });
                                }
                            }
                            //Create calendar event by each date and hour group
                            for (var index = 0; index < schedule.Days.Count; index++)
                            {
                                var day       = schedule.Days[index];
                                var dayOfWeek = day.GetValueOrDefault().ToInteger();
                                for (var i = 0; i < timeRange.Count; i++)
                                {
                                    var time = timeRange[i];
                                    var id   = Guid.NewGuid().ToString("N");
                                    var item = new CalendarItem
                                    {
                                        id    = id,
                                        color = colours[x < datasets.Count ? x : 0],
                                        start = getCalendarDateTime(dayOfWeek, time.start),
                                        end   = getCalendarDateTime(dayOfWeek, time.end),
                                        title = dataset.Name,
                                    };
                                    item.description = $"Workspace: {group.Name}; Capacity: {capacity.DisplayName}; Dataset: {dataset.Name}; Start: {time.start}";
                                    model.RefreshSchedules.Add(item);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Logger.Warn("Error getting refresh schedule by dataset and workspace", e);
                            continue;
                        }
                    }
                }
                //Order history
                model.History = model.History.OrderByDescending(dataset => dataset.StartTime).ToList();

                CachingProvider.Instance().Insert($"PBI_{Settings.PortalId}_{Settings.SettingsId}_{Thread.CurrentThread.CurrentUICulture.Name}_CalendarDataSet_{mode}", model, null, DateTime.Now.AddMinutes(15), TimeSpan.Zero);
            }
            return(model);
        }
Example #2
0
        public ActionResult Index()
        {
            List <SelectListItem> lst = new List <SelectListItem>();

            var pbiSettings = SharedSettingsRepository.Instance.GetSettings(ModuleContext.PortalId);

            foreach (var s in pbiSettings)
            {
                lst.Add(new SelectListItem {
                    Text = s.SettingsGroupName, Value = s.WorkspaceId
                });
            }

            var cid = Request.QueryString["cid"];

            lst.Add(new SelectListItem()
            {
                Text = "All Workspaces", Value = "-1"
            });
            ViewBag.Options = new SelectList(lst, "Value", "Text", cid ?? "-1");


            var settingsGroupId = Request.QueryString["cid"];

            if (string.IsNullOrEmpty(settingsGroupId) || settingsGroupId == "-1")
            {
                var defaultPbiSettingsGroupId = (string)ModuleContext.Settings["PowerBIEmbedded_SettingsGroupId"];
                //var pbiSettings = SharedSettingsRepository.Instance.GetSettings(ModuleContext.PortalId).RemoveUnauthorizedItems(User);
                if (!string.IsNullOrEmpty(defaultPbiSettingsGroupId) && pbiSettings.Any(x => x.SettingsGroupId == defaultPbiSettingsGroupId))
                {
                    settingsGroupId = defaultPbiSettingsGroupId;
                }
                else
                {
                    settingsGroupId = pbiSettings.FirstOrDefault(x => !string.IsNullOrEmpty(x.SettingsGroupId))?.SettingsGroupId;
                }
            }
            var embedService = new EmbedService(ModuleContext.PortalId, ModuleContext.TabModuleId, settingsGroupId);

            try
            {
                PowerBICalendarView model;

                if (string.IsNullOrEmpty(cid) || cid == "-1")
                {
                    model = embedService.GetScheduleInGroup("-1").Result;
                }
                else
                {
                    model = embedService.GetScheduleInGroup(cid).Result;
                }



                //pagination
                model.CurrentPage = Convert.ToInt32(Request.QueryString["page"]) != 0 ? Convert.ToInt32(Request.QueryString["page"]) : 0;

                model.Count = model.History.Count;
                var skip = (model.CurrentPage - 1) * model.PageSize;
                var take = model.PageSize;

                var pagedHistory = model.History.Skip(skip).Take(take).ToList();

                ViewBag.History = pagedHistory;
                if (model != null)
                {
                    return(View(model));
                }
                return(View());
            }
            catch (Exception ex)
            {
                var model = new PowerBICalendarView();
                Logger.Error(ex);
                model.ErrorMessage = LocalizeString("Error");
                return(View(model));
            }
        }