Esempio n. 1
0
        public IActionResult CreateScheduledReport(
            [FromForm] CreateScheduledReportViewModel createScheduledReportViewModel)
        {
            try
            {
                var tableauReportViewModel = createScheduledReportViewModel.ReportViewModel;
                var createPdfOptions       = new CreatePdfOptions(tableauReportViewModel.WorkbookName, tableauReportViewModel.ViewName, tableauReportViewModel.WorksheetName);
                var cronString             = createScheduledReportViewModel.RecurrenceSettings.ConvertToCronString();
                var recurringJobId         = RecurringJobManager.Add(Hangfire.Common.Job.FromExpression <ITenantJobs>(x => x.ScheduleTableauPdfDownload(createPdfOptions)), cronString);

                var campaignName = "Scheduled Report: " + tableauReportViewModel.ViewName;

                var communication = new Communication
                {
                    CampaignName          = campaignName.ToTitleFriendlyString(),
                    CommunicationTitle    = tableauReportViewModel.ViewName.ToTitleFriendlyString(),
                    CommunicationSettings = new CommunicationSettings
                    {
                        Recurrence     = createScheduledReportViewModel.RecurrenceSettings,
                        RecurringJobId = recurringJobId,
                        ReportId       = createScheduledReportViewModel.ReportViewModel.Id.ToString(),
                        ReportName     = tableauReportViewModel.ViewName
                    }
                };
                Rdb.Communications.Add(communication);
                Rdb.SaveChanges();
                return(RedirectToAction(ActionNames.ScheduledReports));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Esempio n. 2
0
            public async Task WhenGivenJsonObjectDownloadPdf()
            {
                var httpClientOptions = ConfigurationHelpers.CreateOptions(HttpClientOptions);
                var httpClientFactory = new HttpClientFactory(httpClientOptions);

                var trustedTicketGetter = new TrustedTicketGetter(Options, TableauAdminCredentials, TableauTenantFinder, httpClientFactory);
                var testService         = new TableauVisualServices(trustedTicketGetter, Options, Logger, httpClientFactory) as ITableauVisualServices;

                var testGetPdfOptions = new CreatePdfOptions("AverageRiskMap", "AverageRiskDashboard",
                                                             "Average Risk Dashboard");

                var downloadPdfOptions = await testService.CreatePdfAsync(testGetPdfOptions);

                Assert.IsNotNull(downloadPdfOptions);

                var downloadPdfJsonObject = JsonConvert.SerializeObject(downloadPdfOptions);

                var deserializedPdfOptions = JsonConvert.DeserializeObject <DownloadPdfOptions>(downloadPdfJsonObject);

                var pdfBytes = await testService.DownloadPdfAsync(deserializedPdfOptions);

                Assert.IsNotNull(pdfBytes);

                var tempPath = Path.GetTempPath() + @"TableauPDFTestDownload";

                Directory.CreateDirectory(tempPath); //Doesn't create if it already exists

                var dateTime = DateTime.UtcNow.ToString().RemoveSpecialCharacters();

                var tempFilePath = tempPath + $@"\test-{dateTime}.pdf";

                File.WriteAllBytes(tempFilePath, pdfBytes);
            }
        public async Task <IActionResult> Post([FromBody] CreatePdfOptions options)
        {
            try
            {
                Log.Debug("{controller} post", GetType().Name);

                await Task.CompletedTask;

                if (options == null)
                {
                    throw new ArgumentNullException("options");
                }
                if (string.IsNullOrEmpty(options.Html))
                {
                    throw new ArgumentNullException("html");
                }

                var pdfBytes = BuildPdf(options.Html);

                return(File(pdfBytes, "application/pdf"));
            }
            catch (Exception ex)
            {
                ex.Data.Add("html", options?.Html);
                Log.Error(ex, ex.Message);

                return(this.ServerError(ex));
            }
        }
Esempio n. 4
0
            public async Task WhenSignedInCreatePdf()
            {
                var httpClientOptions = ConfigurationHelpers.CreateOptions(HttpClientOptions);
                var httpClientFactory = new HttpClientFactory(httpClientOptions);

                var trustedTicketGetter = new TrustedTicketGetter(Options, TableauAdminCredentials, TableauTenantFinder, httpClientFactory);
                var testService         = new TableauVisualServices(trustedTicketGetter, Options, Logger, httpClientFactory) as ITableauVisualServices;

                var testGetPdfOptions = new CreatePdfOptions("AverageRiskMap", "AverageRiskDashboard",
                                                             "Average Risk Dashboard");

                var downloadPdfOptions = await testService.CreatePdfAsync(testGetPdfOptions);

                Assert.IsNotNull(downloadPdfOptions);
            }
Esempio n. 5
0
        public IActionResult DownloadReport(string id, string anchorName)
        {
            var tableauReportViewModel = GetReportViewModel(id);

            if (tableauReportViewModel == null)
            {
                return(RedirectToAction(ActionNames.Index));
            }

            var createPdfOptions = new CreatePdfOptions(tableauReportViewModel.WorkbookName, tableauReportViewModel.ViewName, tableauReportViewModel.WorksheetName);

            QueueReportDownload(createPdfOptions);

            Logger.Information("{@EventType} {@ReportId}", EventType.LoggingEventTypes.DownloadedReport.ToString(), tableauReportViewModel.Id.ToString());

            return(RedirectToAction(ActionNames.DownloadedReports));
        }
Esempio n. 6
0
        void ITenantJobs.CreateTableauPdf(CreatePdfOptions options)
        {
            var downloadOptions = TableauVisualService.CreatePdfAsync(options).ExecuteSynchronously();

            PostResult(downloadOptions);
        }
Esempio n. 7
0
        void ITenantJobs.ScheduleTableauPdfDownload(CreatePdfOptions options)
        {
            var jobId = InnerBackgroundJobClient.Enqueue <ITenantJobs>(z => z.CreateTableauPdf(options));

            InnerBackgroundJobClient.ContinueWith <ITenantJobs>(jobId, y => y.DownloadTableauPdfContinuationJobAsync());
        }
Esempio n. 8
0
        private void QueueReportDownload(CreatePdfOptions options)
        {
            var jobId = Backgrounder.Enqueue <ITenantJobs>(z => z.CreateTableauPdf(options));

            Backgrounder.ContinueWith <ITenantJobs>(jobId, y => y.DownloadTableauPdfContinuationJobAsync());
        }
Esempio n. 9
0
        async Task <DownloadPdfOptions> ITableauVisualServices.CreatePdfAsync(CreatePdfOptions options)
        {
            Requires.NonNull(options.WorkbookName, nameof(options.WorkbookName));
            Requires.NonNull(options.WorksheetName, nameof(options.WorksheetName));
            Requires.NonNull(options.ViewName, nameof(options.ViewName));

            var token   = (await TrustedTicketGetter.AuthorizeAsync()).Token;
            var handler = new HttpClientHandler
            {
                CookieContainer = new CookieContainer(),
                UseCookies      = true
            };

            using (var embedClient = new HttpClient(handler))
            {
                var uri =
                    new Uri(
                        $"{TableauSignInOptions.Url}/trusted/{token}/views/{options.WorkbookName}/{options.ViewName}?:size=1610,31&:embed=y&:showVizHome=n&:jsdebug=y&:bootstrapWhenNotified=y&:tabs=n&:apiID=host0");
                embedClient.DefaultRequestHeaders.TryAddWithoutValidation("User Agent",
                                                                          "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
                embedClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept",
                                                                          "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
                embedClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, sdch, br");
                embedClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.8");
                var response = await embedClient.GetAsync(uri);

                IEnumerable <string> values;
                if (response.Headers.TryGetValues("X-Session-Id", out values))
                {
                    var sessionId = values.First();
                    var clientEmbedResponseString = await response.Content.ReadAsStringAsync();

                    var currentWorkbookId = CurrentWorkbookIdExpr.GetGroupValue(clientEmbedResponseString);
                    var currentViewId     = CurrentViewIdExpr.GetGroupValue(clientEmbedResponseString);
                    var sheetId           = SheetIdExpr.GetGroupValue(clientEmbedResponseString) ?? options.WorksheetName;
                    var lastUpdatedAt     = LastUpdatedAtExpr.GetGroupValue(clientEmbedResponseString);
                    using (var bootstrapClient = new HttpClient(handler))
                    {
                        bootstrapClient.DefaultRequestHeaders.Referrer = uri;
                        bootstrapClient.DefaultRequestHeaders.TryAddWithoutValidation("X-Tsi-Active-Tab",
                                                                                      options.WorksheetName);
                        var d = new Dictionary <string, string>();

                        var portSize = "{\"w\":{{pixelWidth}},\"h\":{{pixelHeight}}}";
                        portSize = portSize.Replace("{{pixelWidth}}", options.PixelWidth.ToString());
                        portSize = portSize.Replace("{{pixelHeight}}", options.PixelHeight.ToString());

                        d["worksheetPortSize"] = portSize;
                        d["dashboardPortSize"] = portSize;
                        d["clientDimension"]   = portSize;


                        d["isBrowserRendering"]        = "true";
                        d["browserRenderingThreshold"] = "100";
                        d["formatDataValueLocally"]    = "false";
                        d["clientNum"]              = "";
                        d["devicePixelRatio"]       = "2";
                        d["clientRenderPixelLimit"] = "25000000";
                        d["sheet_id"]   = options.WorksheetName;
                        d["showParams"] =
                            "{\"revertType\":null,\"refresh\":false,\"checkpoint\":false,\"sheetName\":\"\",\"unknownParams\":\"\",\"layoutId\":\"\"}";
                        d["stickySessionKey"] =
                            new StickySessionKey
                        {
                            lastUpdatedAt = lastUpdatedAt,
                            viewId        = currentViewId,
                            workbookId    = currentWorkbookId
                        }.ToJson();
                        d["filterTileSize"]         = "200";
                        d["workbookLocale"]         = "";
                        d["locale"]                 = "en_US";
                        d["language"]               = "en";
                        d["verboseMode"]            = "true";
                        d[":session_feature_flags"] = "{}";
                        d["keychain_version"]       = "1";
                        var content = new FormUrlEncodedContent(d);
                        response = await bootstrapClient.PostAsync(new Uri($"{TableauSignInOptions.Url}/vizql/w/{options.WorkbookName}/v/{options.ViewName}/bootstrapSession/sessions/{sessionId}"), content);

                        Stuff.Noop(response);
                        using (var queuePdfClient = new HttpClient(handler))
                        {
                            queuePdfClient.DefaultRequestHeaders.Referrer = uri;
                            queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation("Origin",
                                                                                         uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped));
                            queuePdfClient.DefaultRequestHeaders.Accept.Add(
                                System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/javascript"));
                            queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation(
                                "X-Tsi-Supports-Accepted", "true");
                            queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation(
                                "X-Tsi-Active-Tab", options.WorksheetName);
                            queuePdfClient.DefaultRequestHeaders.TryAddWithoutValidation(
                                "X-Requested-With", "XMLHttpRequest");
                            var pdfFormData = new MultipartContent("form-data");

                            var pdfParams = @"{""currentSheet"":""{{worksheetName}}"",
							""exportLayoutOptions"":{""pageSizeOption"":""letter"",""pageOrientationOption"":""printer"",""pageScaleMode"":""auto"",""pageScalePercent"":100,""pageFitHorizontal"":1,""pageFitVertical"":1,""imageHeight"":0,""imageWidth"":0},
							""sheetOptions"":[{""sheet"":""{{worksheetName}}"",""isDashboard"":true,""isStory"":false,""namesOfSubsheets"":[],""isPublished"":true,""baseViewThumbLink"":""/thumb/views/{{workbookName}}/{{viewName}}"",""isSelected"":true,
							""exportLayoutOptions"":{""pageSizeOption"":""letter"",""pageOrientationOption"":""printer"",""pageScaleMode"":""auto"",""pageScalePercent"":100,""pageFitHorizontal"":1,""pageFitVertical"":1,""imageHeight"":0,""imageWidth"":0}}
                            ]}";

                            pdfParams = pdfParams.Replace(@"{{worksheetName}}", options.WorksheetName);
                            pdfParams = pdfParams.Replace(@"{{workbookName}}", options.WorkbookName);
                            pdfParams = pdfParams.Replace(@"{{viewName}}", options.ViewName);

                            AddStringContent(pdfFormData, "pdfExport", pdfParams);

                            response = await queuePdfClient.PostAsync(new Uri(
                                                                          $"{TableauSignInOptions.Url}/vizql/w/{options.WorkbookName}/v/{options.ViewName}/sessions/{sessionId}/commands/tabsrv/pdf-export-server"), pdfFormData);

                            Stuff.Noop(response);

                            var responseString = await response.Content.ReadAsStringAsync();

                            var tempFileKey = PdfTempFileKeyExpr.GetGroupValue(responseString);

                            var downloadPdfOptions = new DownloadPdfOptions(options.WorkbookName, options.ViewName, sessionId, uri, tempFileKey, handler.CookieContainer.GetCookies(uri));
                            return(downloadPdfOptions);
                        }
                    }
                }
            }

            return(null);
        }