/// <summary> /// The default action to render the front-end view /// </summary> /// <param name="model"/> /// <returns/> public async new Task <ActionResult> Index(RenderModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var viewModel = new JobsRssViewModelFromUmbraco(model.Content).BuildModel(); // Add common properties to the model var modelBuilder = new BaseViewModelBuilder(); modelBuilder.PopulateBaseViewModel(viewModel, model.Content, new ContentExperimentSettingsService(), UmbracoContext.Current.InPreviewMode); var jobsProvider = new JobsDataFromExamine(ExamineManager.Instance.SearchProviderCollection[viewModel.ExamineSearcher], new QueryBuilder(new LuceneTokenisedQueryBuilder(), new KeywordsTokeniser(), new LuceneStopWordsRemover(), new WildcardSuffixFilter()), new RelativeJobUrlGenerator(viewModel.JobAdvertPage.Url)); var jobs = await jobsProvider.ReadProblemJobs(); foreach (var job in jobs) { viewModel.Items.Add(job); } // Jobs close at midnight, so don't cache beyond then var untilMidnightTonight = DateTime.Today.ToUkDateTime().AddDays(1) - DateTime.Now.ToUkDateTime(); new HttpCachingService().SetHttpCacheHeadersFromUmbracoContent(model.Content, UmbracoContext.Current.InPreviewMode, Response.Cache, null, (int)untilMidnightTonight.TotalSeconds); return(CurrentTemplate(viewModel)); }
/// <summary> /// Reads full details of an individual job from the specified jobs set. /// </summary> /// <param name="jobsSet">The jobs set.</param> /// <param name="jobId">The job identifier.</param> /// <param name="baseUrl">The base URL.</param> /// <returns></returns> protected async Task <Job> Job(JobsSet jobsSet, string jobId, Uri baseUrl) { var jobsProvider = new JobsDataFromExamine(ExamineManager.Instance.SearchProviderCollection[jobsSet + "Searcher"], new QueryBuilder(new LuceneTokenisedQueryBuilder(), new KeywordsTokeniser(), new LuceneStopWordsRemover(), new WildcardSuffixFilter()), null, new RelativeJobUrlGenerator(baseUrl)); return(await jobsProvider.ReadJob(jobId)); }
/// <summary> /// Reads jobs matching the specified search query /// </summary> /// <param name="jobsSet">The jobs set.</param> /// <param name="query">The query.</param> /// <param name="baseUrl">The base URL.</param> /// <returns></returns> protected async Task <JobSearchResult> Jobs(JobsSet jobsSet, JobSearchQuery query, Uri baseUrl) { var jobsProvider = new JobsDataFromExamine(ExamineManager.Instance.SearchProviderCollection[jobsSet + "Searcher"], new QueryBuilder(new LuceneTokenisedQueryBuilder(), new KeywordsTokeniser(), new LuceneStopWordsRemover(), new WildcardSuffixFilter()), new SalaryRangeLuceneQueryBuilder(), new RelativeJobUrlGenerator(baseUrl)); var jobs = await jobsProvider.ReadJobs(query); foreach (var job in jobs.Jobs) { // Remove these unnecessary and large fields to significantly reduce the amount that's serialised and sent to the client job.AdvertHtml = null; job.AdditionalInformationHtml = null; job.EqualOpportunitiesHtml = null; } return(jobs); }
/// <summary> /// The default action to render the front-end view /// </summary> /// <param name="model"/> /// <returns/> public override ActionResult Index(RenderModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var viewModel = new SearchResultsViewModelFromUmbraco(model.Content).BuildModel(); // Add common properties to the model var modelBuilder = new BaseViewModelBuilder(); modelBuilder.PopulateBaseViewModel(viewModel, model.Content, new ContentExperimentSettingsService(), UmbracoContext.Current.InPreviewMode); modelBuilder.PopulateBaseViewModelWithInheritedContent(viewModel, new UmbracoLatestService(model.Content), new UmbracoSocialMediaService(model.Content), null, new UmbracoWebChatSettingsService(model.Content, new UrlListReader()), null); if (String.IsNullOrEmpty(Request.QueryString["altTemplate"])) { viewModel.Query = new JobSearchQueryFactory().CreateFromQueryString(Request.QueryString); viewModel.Query.ClosingDateFrom = DateTime.Today; var jobsProvider = new JobsDataFromExamine(ExamineManager.Instance.SearchProviderCollection[viewModel.ExamineSearcher], new QueryBuilder(new LuceneTokenisedQueryBuilder(), new KeywordsTokeniser(), new LuceneStopWordsRemover(), new WildcardSuffixFilter()), viewModel.JobAdvertPage != null ? new RelativeJobUrlGenerator(viewModel.JobAdvertPage.Url) : null); var jobs = Task.Run(async() => await jobsProvider.ReadJobs(viewModel.Query)).Result; if (String.IsNullOrWhiteSpace(Request.QueryString["page"])) { viewModel.Jobs = jobs.ToPagedList(1, 10); } else if (Request.QueryString["page"].ToUpperInvariant() == "ALL") { viewModel.Jobs = jobs.ToPagedList(1, 10000); } else { int page; Int32.TryParse(Request.QueryString["page"], out page); if (page < 1) { page = 1; } viewModel.Jobs = jobs.ToPagedList(page, 10); } if (!String.IsNullOrEmpty(viewModel.Metadata.RssFeedUrl)) { var queryString = HttpUtility.ParseQueryString(Request.Url.Query); queryString.Remove("page"); if (queryString.HasKeys()) { viewModel.Metadata.RssFeedUrl = viewModel.Metadata.RssFeedUrl + "?" + queryString; } } var lookupsProvider = new JobsLookupValuesFromExamine(ExamineManager.Instance.SearchProviderCollection[viewModel.ExamineLookupValuesSearcher]); viewModel.JobTypeLookupValues = Task.Run(async() => await lookupsProvider.ReadJobTypes()).Result; viewModel.OrganisationLookupValues = Task.Run(async() => await lookupsProvider.ReadOrganisations()).Result; viewModel.SalaryRangeLookupValues = Task.Run(async() => await lookupsProvider.ReadSalaryRanges()).Result; viewModel.WorkPatternLookupValues = Task.Run(async() => await lookupsProvider.ReadWorkPatterns()).Result; viewModel.LocationLookupValues = Task.Run(async() => await lookupsProvider.ReadLocations()).Result; } // Jobs close at midnight, so don't cache beyond then var untilMidnightTonight = DateTime.Today.ToUkDateTime().AddDays(1) - DateTime.Now.ToUkDateTime(); new HttpCachingService().SetHttpCacheHeadersFromUmbracoContent(model.Content, UmbracoContext.Current.InPreviewMode, Response.Cache, new List <string>() { "latestUnpublishDate_Latest" }, (int)untilMidnightTonight.TotalSeconds); return(CurrentTemplate(viewModel)); }
/// <summary> /// The default action to render the front-end view /// </summary> /// <param name="model"/> /// <returns/> public override ActionResult Index(RenderModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var viewModel = new AdvertViewModelFromUmbraco(model.Content).BuildModel(); // Add common properties to the model var modelBuilder = new BaseViewModelBuilder(); modelBuilder.PopulateBaseViewModel(viewModel, model.Content, new ContentExperimentSettingsService(), UmbracoContext.Current.InPreviewMode); modelBuilder.PopulateBaseViewModelWithInheritedContent(viewModel, new UmbracoLatestService(model.Content), new UmbracoSocialMediaService(model.Content), null, new UmbracoWebChatSettingsService(model.Content, new UrlListReader()), null); // Redirect non-preferred URL - these are sent out in job alerts, and linked from the TalentLink back office if (!String.IsNullOrEmpty(Request.QueryString["nPostingTargetID"])) { var jobsProvider = new JobsDataFromExamine(ExamineManager.Instance.SearchProviderCollection[viewModel.ExamineSearcher], null, new RelativeJobUrlGenerator(new Uri(model.Content.UrlAbsolute()))); viewModel.Job = Task.Run(async() => await jobsProvider.ReadJob(Request.QueryString["nPostingTargetID"])).Result; if (!String.IsNullOrEmpty(viewModel.Job.Id)) { return(new RedirectResult(viewModel.Job.Url.ToString(), true)); } } // Show page for preferred URL var jobUrlSegment = Regex.Match(Request.Url.AbsolutePath, "/([0-9]+)/"); if (jobUrlSegment.Success) { var jobsProvider = new JobsDataFromExamine(ExamineManager.Instance.SearchProviderCollection[viewModel.ExamineSearcher], new QueryBuilder(new LuceneTokenisedQueryBuilder(), new KeywordsTokeniser(), new LuceneStopWordsRemover(), new WildcardSuffixFilter()), new RelativeJobUrlGenerator(new Uri(model.Content.UrlAbsolute()))); viewModel.Job = Task.Run(async() => await jobsProvider.ReadJob(jobUrlSegment.Groups[1].Value)).Result; if (String.IsNullOrEmpty(viewModel.Job.Id) || viewModel.Job.ClosingDate < DateTime.Today) { // The job URL looks valid but the job isn't in the index, so it's probably closed. // Find some similar jobs to suggest the user may want to apply for instead. FindSimilarJobs(jobsProvider, viewModel); } } else { // The page was accessed by its default Umbraco URL with no parameters. Returning HttpNotFoundResult() ends up with a generic browser 404, // so to get our custom one we need to look it up and transfer control to it. var notFoundUrl = new HttpStatusFromConfiguration().GetCustomUrlForStatusCode(404); if (notFoundUrl != null && Server != null) { Server.TransferRequest(notFoundUrl + "?404;" + HttpUtility.UrlEncode(Request.Url.ToString())); } } // The page should expire when the job closes var expirySeconds = 86400; // one day if (viewModel.Job != null && viewModel.Job.ClosingDate != null) { var secondsToClosingDate = (int)(viewModel.Job.ClosingDate.Value.AddDays(1).Date.ToUkDateTime() - DateTime.Now.ToUkDateTime()).TotalSeconds; if (secondsToClosingDate >= 0) { expirySeconds = secondsToClosingDate; } } new HttpCachingService().SetHttpCacheHeadersFromUmbracoContent(model.Content, UmbracoContext.Current.InPreviewMode, Response.Cache, new List <string>() { "latestUnpublishDate_Latest" }, expirySeconds); return(CurrentTemplate(viewModel)); }