@ -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<Tuple<string, string>> 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<Tuple<string,string>>(); | |||
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<string,string>(format, value)); | |||
} | |||
StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه "); | |||
foreach (var param in Parameters) | |||
sb.Append(string.Format(param.Item1 + " ", param.Item2)); | |||
this.JobSummary = sb.ToString(); | |||
} | |||
} | |||
} |
@ -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(); | |||
} | |||
} | |||
} |
@ -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("[email protected]")); | |||
var jobs = _jobRepository.ListAll() | |||
.Where(d => d.ExpireDate >= DateTime.UtcNow) | |||
.OrderByDescending(d => d.CreateDate) | |||
.ToList() | |||
.Select(j => new JobMiniViewModel(j)).ToList(); | |||
List<SyndicationItem> items = new List<SyndicationItem>(); | |||
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); | |||
@ -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 = '<ul class="sevomin-jobs">'; | |||
if (settings.linkText == undefined || settings.linkText == '') | |||
settings.linkText = 'مشاهده در سومین'; | |||
for (var i = 0; i < jobs.length; i++) { | |||
content += '<li class="sevomin-job"><p class="sevomin-job-summary">'; | |||
content += jobs[i].JobSummary + '<a href="http://www.sevom.in/jobs/' | |||
+ jobs[i].Id + '">' + settings.linkText + '</a></p>'; | |||
content += '</li>'; | |||
} | |||
content = content + '</ul>' | |||
container.innerHTML = content; | |||
} | |||
} |
@ -0,0 +1,18 @@ | |||
@{ | |||
ViewBag.Title = "راهنما - خروجی rss"; | |||
} | |||
<div class="row rtl"> | |||
<div class="col-md-12"> | |||
<h1 class="page-header">خروجی rss <small>راهنمای سومین</small></h1> | |||
<p> | |||
در این بخش به طور خلاصه به بررسی امکان نمایش فرصت های شغلی موجود در سومین در وب سایت های همکار می پردازیم. | |||
سومین این امکان را از دو طریق ممکن می سازد. | |||
</p> | |||
<ul> | |||
<li>@Html.ActionLink("جاوااسکریپت", "ExportScript")</li> | |||
<li>خوراک rss</li> | |||
</ul> | |||
<p>خوراک rss سومین از آدرس زیر قابل دسترسی است.</p> | |||
<pre class="ltr">http://www.sevom.in/jobs/export/rss</pre> | |||
</div> | |||
</div> |
@ -0,0 +1,52 @@ | |||
@{ | |||
ViewBag.Title = "راهنما - خروجی جاوااسکریپت"; | |||
} | |||
<div class="row rtl"> | |||
<div class="col-md-12"> | |||
<h1 class="page-header">خروجی جاوااسکریپت <small>راهنمای سومین</small></h1> | |||
<p> | |||
در این بخش به طور خلاصه به بررسی امکان نمایش فرصت های شغلی موجود در سومین در وب سایت های همکار می پردازیم. | |||
سومین این امکان را از دو طریق ممکن می سازد. | |||
</p> | |||
<ul> | |||
<li>جاوااسکریپت</li> | |||
<li>@Html.ActionLink("خوراک rss", "ExportRss")</li> | |||
</ul> | |||
<p> | |||
برای شروع، شما نیاز دارید تا کلاس جاوااسکریپت سومین را در صفحه خود وارد کنید. برای این کار، کد زیر را در سند html خود وارد کنید: | |||
</p> | |||
<pre class="ltr"> | |||
<script type="text/javascript" src="http://www.sevom.in/jobs/export/js"></script> | |||
</pre> | |||
<p>حال برای نمایش لیست فرصت های شغلی در سند خود، کد زیر را در انتهای سند خود قبل از بسته شدن تگ <code>body</code> وارد نمایید.</p> | |||
<pre class="ltr"> | |||
<script type="text/javascript"> | |||
(function(){ | |||
var viewer = new sevominJobViewer({ container: '#job-list-container', linkText: 'مشاهده' }); | |||
viewer.show(); | |||
})(); | |||
</script> | |||
</pre> | |||
<p>در نهایت باید المان <code>job-list</code> را در محل دلخواه خود تعریف کنید. کد زیر ساده ترین تعریف المان موردنظر است. <em>دقت کنید که مقدار پارامتر container می تواند هر selector معتبر css باشد.</em></p> | |||
<pre class="ltr"> | |||
<div id="job-list-container"></div> | |||
</pre> | |||
<p>برای زیباتر شدن لیست فرصت های شغلی، می توانید استایل های زیر را در صفحه خود اضافه کنید.</p> | |||
<pre class="ltr"> | |||
ul.sevomin-jobs{ | |||
list-style: none; | |||
} | |||
ul.sevomin-jobs li.sevomin-job p{ | |||
direction: rtl; | |||
} | |||
</pre> | |||
<p> | |||
برای هرچه بیشتر هماهنگ شدن لیست خروجی با صفحه وب سایت خود، می توانید استایل کلاس های زیر را در صفحه خود تعریف نمایید: | |||
<ul> | |||
<li><code>sevomin-jobs</code> <em>لیست(ul) شامل فرصت های شغلی</em></li> | |||
<li><code>sevomin-job</code> <em>هر آیتم(li) موجود در لیست</em></li> | |||
<li><code>sevomin-job-summary</code> <em>پاراگراف توضیح برای هر فرصت شغلی</em></li> | |||
</ul> | |||
</p> | |||
</div> | |||
</div> |