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); }
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)); } }