From 5f6e7a3b7098e6abb925475366fca4976d2fff6e Mon Sep 17 00:00:00 2001 From: miladkdz Date: Sat, 18 Oct 2014 18:15:12 +0330 Subject: [PATCH] Add some output options --- Sevomin.Models/JobMiniExternalViewModel.cs | 78 +++++++++++++++++++ Sevomin.Models/Sevomin.Models.csproj | 1 + .../HelpController.cs | 21 +++++ .../HomeController.cs | 6 +- .../JobController.cs | 56 +++++++++++++ .../Sevomin.WebFrontend.Controllers.csproj | 2 + .../App_Data/export-assets/export.js | 23 ++++++ Sevomin.WebFrontend/App_Start/RouteConfig.cs | 28 +++++++ .../Sevomin.WebFrontend.csproj | 3 + .../Views/Help/ExportRss.cshtml | 18 +++++ .../Views/Help/ExportScript.cshtml | 52 +++++++++++++ Sevomin.WebFrontend/Views/Job/JobList.cshtml | 6 +- .../Views/Shared/_Layout.cshtml | 1 + Sevomin.WebFrontend/Web.config | 2 +- 14 files changed, 292 insertions(+), 5 deletions(-) create mode 100644 Sevomin.Models/JobMiniExternalViewModel.cs create mode 100644 Sevomin.WebFrontend.Controllers/HelpController.cs create mode 100644 Sevomin.WebFrontend/App_Data/export-assets/export.js create mode 100644 Sevomin.WebFrontend/Views/Help/ExportRss.cshtml create mode 100644 Sevomin.WebFrontend/Views/Help/ExportScript.cshtml diff --git a/Sevomin.Models/JobMiniExternalViewModel.cs b/Sevomin.Models/JobMiniExternalViewModel.cs new file mode 100644 index 0000000..410f803 --- /dev/null +++ b/Sevomin.Models/JobMiniExternalViewModel.cs @@ -0,0 +1,78 @@ +using Sevomin.Models.Helpers; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; + +namespace Sevomin.Models +{ + + public class JobMiniExternalViewModel + { + private int MaxNumberOfMiniParams = 6; + [Key] + public long Id { get; set; } + + [DisplayName("آخرین مهلت اعلام آمادگی")] + [DataType(DataType.Date)] + public DateTime ExpireDate { get; set; } + + [DisplayName("آخرین مهلت اعلام آمادگی")] + [DataType(DataType.Date)] + public string JalaliExpireDate + { + get + { + return DateAssist.ToShamsi(this.ExpireDate); + } + set + { + ExpireDate = DateAssist.ValidateAndSetToMiladi(value) ?? DateTime.MinValue; + } + } + + [DisplayName("کار تمام وقت")] + public bool IsFullTime { get; set; } + + public string JobSummary { private set; get; } + + private IList> Parameters; + + public JobMiniExternalViewModel(Job job, int maxNumberOfMiniParams = 6) + { + this.MaxNumberOfMiniParams = maxNumberOfMiniParams; + this.Id = job.Id; + this.ExpireDate = job.ExpireDate == DateTime.MinValue ? DateTime.UtcNow.AddDays(14) : job.ExpireDate; + this.IsFullTime = job.IsFullTime; + + if (job.JobParameters == null) + return; + + Parameters = new List>(); + + var jpz = job.JobParameters.Where(x=>!string.IsNullOrWhiteSpace(x.StringValue)).OrderByDescending(x=>x.Moscow).Take(Math.Min(MaxNumberOfMiniParams * 3, job.JobParameters.Count())) + .OrderBy(x => x.Parameter.GroupName).ThenByDescending(x => x.Moscow).Take((int)(MaxNumberOfMiniParams*1.5)).ToList(); + + for (int i = 0; i < jpz.Count(); i++) + { + string format = jpz[i].Parameter.DisplayFormat; + format = format.Replace("$", jpz[i].Parameter.Name); + + string value = jpz[i].StringValue; + if (jpz[i].Parameter.DisplayMethod == 4) + { + value = jpz[i].Parameter.ParameterValues.ToList().Where(x =>x.NumbericValue == jpz[i].NumericValue).Select(x => x.Value) + .FirstOrDefault(); + } + Parameters.Add(new Tuple(format, value)); + } + + StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه "); + foreach (var param in Parameters) + sb.Append(string.Format(param.Item1 + " ", param.Item2)); + this.JobSummary = sb.ToString(); + } + } +} diff --git a/Sevomin.Models/Sevomin.Models.csproj b/Sevomin.Models/Sevomin.Models.csproj index 5cfaa24..c884363 100644 --- a/Sevomin.Models/Sevomin.Models.csproj +++ b/Sevomin.Models/Sevomin.Models.csproj @@ -89,6 +89,7 @@ + 201409010546480_basepoint.cs diff --git a/Sevomin.WebFrontend.Controllers/HelpController.cs b/Sevomin.WebFrontend.Controllers/HelpController.cs new file mode 100644 index 0000000..69d8ebd --- /dev/null +++ b/Sevomin.WebFrontend.Controllers/HelpController.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNet.Identity.EntityFramework; +using Sevomin.Models; +using Sevomin.Models.Helpers; +using System.Threading.Tasks; +using System.Web.Mvc; + +namespace Sevomin.WebFrontend.Controllers +{ + public class HelpController : BaseController + { + public ActionResult ExportScript() + { + return View(); + } + + public ActionResult ExportRss() + { + return View(); + } + } +} \ No newline at end of file diff --git a/Sevomin.WebFrontend.Controllers/HomeController.cs b/Sevomin.WebFrontend.Controllers/HomeController.cs index 7f6893e..f34d64d 100644 --- a/Sevomin.WebFrontend.Controllers/HomeController.cs +++ b/Sevomin.WebFrontend.Controllers/HomeController.cs @@ -15,11 +15,11 @@ namespace Sevomin.WebFrontend.Controllers public HomeController(SevominUserManager userManager) { - UserManager = userManager; + UserManager = userManager; } - public SevominUserManager UserManager { get; private set; } - + public SevominUserManager UserManager { get; private set; } + public async Task Index() { if (!Request.IsAuthenticated) diff --git a/Sevomin.WebFrontend.Controllers/JobController.cs b/Sevomin.WebFrontend.Controllers/JobController.cs index 6e05300..e5bcba2 100644 --- a/Sevomin.WebFrontend.Controllers/JobController.cs +++ b/Sevomin.WebFrontend.Controllers/JobController.cs @@ -8,10 +8,12 @@ using Sevomin.Models.Repositories; using System; using System.Collections.Generic; using System.Linq; +using System.ServiceModel.Syndication; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; +using System.Xml; namespace Sevomin.WebFrontend.Controllers { @@ -331,6 +333,60 @@ namespace Sevomin.WebFrontend.Controllers return PartialView(applications); } + [AllowAnonymous] + public ActionResult RecentJobsJavascript(int? count) + { + var jobs = _jobRepository.ListAll() + .Where(d => d.ExpireDate >= DateTime.UtcNow) + .OrderByDescending(d => d.CreateDate) + .ToList() + .Select(j => new JobMiniExternalViewModel(j)).ToList(); + + if (count.HasValue) + jobs = jobs.Take(count.Value).ToList(); + + string json = Newtonsoft.Json.JsonConvert.SerializeObject(jobs); + string js = System.IO.File.ReadAllText(System.IO.Path.Combine(AppDomain.CurrentDomain.GetData("DataDirectory").ToString(), @"export-assets\export.js")).Replace("$$jobs", json); + + return Content(js, "application/javascript"); + } + + [AllowAnonymous] + public ActionResult RecentJobsRss() + { + SyndicationFeed feed = new SyndicationFeed("فرصت های شغلی جدید در سومین", "در این فید، فرصت های شغلی جدید سومین را دنبال کنید", new Uri("http://www.sevom.in/jobs")); + feed.Authors.Add(new SyndicationPerson("info@sevom.in")); + + var jobs = _jobRepository.ListAll() + .Where(d => d.ExpireDate >= DateTime.UtcNow) + .OrderByDescending(d => d.CreateDate) + .ToList() + .Select(j => new JobMiniViewModel(j)).ToList(); + + List items = new List(); + + foreach (var job in jobs) + { + SyndicationItem jobRss = new SyndicationItem(job.JobSummary, "", + new Uri(string.Format("http://www.sevom.in{0}", Url.Action("SingleJob", new { jobId = job.Id })))); + + items.Add(jobRss); + } + + feed.Items = items; + var rss2 = new Rss20FeedFormatter(feed); + var outputXml = new StringBuilder(); + + using (var writer = XmlWriter.Create(outputXml, new XmlWriterSettings { Indent = true })) + { + rss2.WriteTo(writer); + writer.Flush(); + } + + return Content(outputXml.ToString(), "application/rss+xml"); + + } + private void PrepareJobApplication(Dovomin user, Job job, bool alreadyApplied = true) { JobMiniViewModel jvm = new JobMiniViewModel(job, 3); diff --git a/Sevomin.WebFrontend.Controllers/Sevomin.WebFrontend.Controllers.csproj b/Sevomin.WebFrontend.Controllers/Sevomin.WebFrontend.Controllers.csproj index 5c89eda..7ac7c74 100644 --- a/Sevomin.WebFrontend.Controllers/Sevomin.WebFrontend.Controllers.csproj +++ b/Sevomin.WebFrontend.Controllers/Sevomin.WebFrontend.Controllers.csproj @@ -79,6 +79,7 @@ + False @@ -95,6 +96,7 @@ + diff --git a/Sevomin.WebFrontend/App_Data/export-assets/export.js b/Sevomin.WebFrontend/App_Data/export-assets/export.js new file mode 100644 index 0000000..00cfa5f --- /dev/null +++ b/Sevomin.WebFrontend/App_Data/export-assets/export.js @@ -0,0 +1,23 @@ +function sevominJobViewer(settings) { + var jobs = $$jobs; + if (settings.container == undefined || settings.container == '') + throw 'You did not specify any container'; + var container = document.querySelector(settings.container); + if (container == undefined) + throw 'You did not specify any container'; + + this.show = function () { + var content = '
    '; + if (settings.linkText == undefined || settings.linkText == '') + settings.linkText = 'مشاهده در سومین'; + for (var i = 0; i < jobs.length; i++) { + content += '
  • '; + content += jobs[i].JobSummary + '' + settings.linkText + '

    '; + content += '
  • '; + } + content = content + '
' + + container.innerHTML = content; + } +} \ No newline at end of file diff --git a/Sevomin.WebFrontend/App_Start/RouteConfig.cs b/Sevomin.WebFrontend/App_Start/RouteConfig.cs index f698f56..b18f61e 100644 --- a/Sevomin.WebFrontend/App_Start/RouteConfig.cs +++ b/Sevomin.WebFrontend/App_Start/RouteConfig.cs @@ -15,6 +15,22 @@ namespace Sevomin.WebFrontend defaults: new { controller = "Base", action = "Error404" } ); + #region For Help + + routes.MapRoute( + name: "ExportScript", + url: "help/export/javascript", + defaults: new { controller = "Help", action = "ExportScript" } + ); + + routes.MapRoute( + name: "ExportRss", + url: "help/export/rss", + defaults: new { controller = "Help", action = "ExportRss" } + ); + + #endregion + #region For Downloads routes.MapRoute( name: "EnglishResumeGrabber", @@ -82,6 +98,18 @@ namespace Sevomin.WebFrontend #endregion #region For Jobs + routes.MapRoute( + name: "RecentJobsRss", + url: "jobs/export/rss", + defaults: new { controller = "Job", action = "RecentJobsRss" } + ); + + routes.MapRoute( + name: "RecentJobsJavascript", + url: "jobs/export/js", + defaults: new { controller = "Job", action = "RecentJobsJavascript" } + ); + routes.MapRoute( name: "NewJob", url: "jobs/new-job", diff --git a/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj b/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj index 305aae9..c910ad1 100644 --- a/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj +++ b/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj @@ -130,6 +130,7 @@ + @@ -335,6 +336,8 @@ + + Web.config diff --git a/Sevomin.WebFrontend/Views/Help/ExportRss.cshtml b/Sevomin.WebFrontend/Views/Help/ExportRss.cshtml new file mode 100644 index 0000000..4395789 --- /dev/null +++ b/Sevomin.WebFrontend/Views/Help/ExportRss.cshtml @@ -0,0 +1,18 @@ +@{ + ViewBag.Title = "راهنما - خروجی rss"; +} +
+
+

خروجی rss راهنمای سومین

+

+ در این بخش به طور خلاصه به بررسی امکان نمایش فرصت های شغلی موجود در سومین در وب سایت های همکار می پردازیم. + سومین این امکان را از دو طریق ممکن می سازد. +

+
    +
  • @Html.ActionLink("جاوااسکریپت", "ExportScript")
  • +
  • خوراک rss
  • +
+

خوراک rss سومین از آدرس زیر قابل دسترسی است.

+
http://www.sevom.in/jobs/export/rss
+
+
\ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Help/ExportScript.cshtml b/Sevomin.WebFrontend/Views/Help/ExportScript.cshtml new file mode 100644 index 0000000..96541c7 --- /dev/null +++ b/Sevomin.WebFrontend/Views/Help/ExportScript.cshtml @@ -0,0 +1,52 @@ +@{ + ViewBag.Title = "راهنما - خروجی جاوااسکریپت"; +} +
+
+

خروجی جاوااسکریپت راهنمای سومین

+

+ در این بخش به طور خلاصه به بررسی امکان نمایش فرصت های شغلی موجود در سومین در وب سایت های همکار می پردازیم. + سومین این امکان را از دو طریق ممکن می سازد. +

+
    +
  • جاوااسکریپت
  • +
  • @Html.ActionLink("خوراک rss", "ExportRss")
  • +
+

+ برای شروع، شما نیاز دارید تا کلاس جاوااسکریپت سومین را در صفحه خود وارد کنید. برای این کار، کد زیر را در سند html خود وارد کنید: +

+
+<script type="text/javascript" src="http://www.sevom.in/jobs/export/js"></script>
+        
+

حال برای نمایش لیست فرصت های شغلی در سند خود، کد زیر را در انتهای سند خود قبل از بسته شدن تگ body وارد نمایید.

+
+<script type="text/javascript">
+    (function(){
+        var viewer = new sevominJobViewer({ container: '#job-list-container', linkText: 'مشاهده' });
+        viewer.show();
+    })();
+</script>
+        
+

در نهایت باید المان job-list را در محل دلخواه خود تعریف کنید. کد زیر ساده ترین تعریف المان موردنظر است. دقت کنید که مقدار پارامتر container می تواند هر selector معتبر css باشد.

+
+<div id="job-list-container"></div>
+        
+

برای زیباتر شدن لیست فرصت های شغلی، می توانید استایل های زیر را در صفحه خود اضافه کنید.

+
+ul.sevomin-jobs{
+    list-style: none;
+}
+ul.sevomin-jobs li.sevomin-job p{
+    direction: rtl;
+}
+        
+

+ برای هرچه بیشتر هماهنگ شدن لیست خروجی با صفحه وب سایت خود، می توانید استایل کلاس های زیر را در صفحه خود تعریف نمایید: +

    +
  • sevomin-jobs لیست(ul) شامل فرصت های شغلی
  • +
  • sevomin-job هر آیتم(li) موجود در لیست
  • +
  • sevomin-job-summary پاراگراف توضیح برای هر فرصت شغلی
  • +
+

+
+
\ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Job/JobList.cshtml b/Sevomin.WebFrontend/Views/Job/JobList.cshtml index 0878df4..549f7dc 100644 --- a/Sevomin.WebFrontend/Views/Job/JobList.cshtml +++ b/Sevomin.WebFrontend/Views/Job/JobList.cshtml @@ -38,4 +38,8 @@ } } - \ No newline at end of file + + +@section Head{ + +} \ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Shared/_Layout.cshtml b/Sevomin.WebFrontend/Views/Shared/_Layout.cshtml index 389ec05..13b318e 100644 --- a/Sevomin.WebFrontend/Views/Shared/_Layout.cshtml +++ b/Sevomin.WebFrontend/Views/Shared/_Layout.cshtml @@ -5,6 +5,7 @@ سومین - @ViewBag.Title @Html.Partial("SocialMetaTags") + @RenderSection("Head", false) diff --git a/Sevomin.WebFrontend/Web.config b/Sevomin.WebFrontend/Web.config index a173c31..47fb18e 100644 --- a/Sevomin.WebFrontend/Web.config +++ b/Sevomin.WebFrontend/Web.config @@ -15,7 +15,7 @@ - +