@ -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; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | using System.Linq; | ||||
using System.ServiceModel.Syndication; | |||||
using System.Text; | using System.Text; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using System.Web; | using System.Web; | ||||
using System.Web.Mvc; | using System.Web.Mvc; | ||||
using System.Xml; | |||||
namespace Sevomin.WebFrontend.Controllers | namespace Sevomin.WebFrontend.Controllers | ||||
{ | { | ||||
@ -331,6 +333,60 @@ namespace Sevomin.WebFrontend.Controllers | |||||
return PartialView(applications); | 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) | private void PrepareJobApplication(Dovomin user, Job job, bool alreadyApplied = true) | ||||
{ | { | ||||
JobMiniViewModel jvm = new JobMiniViewModel(job, 3); | 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> |