Example #1
0
        /// <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));
        }
Example #5
0
        /// <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));
        }