Browse Source

Add some output options

master
miladkdz 10 years ago
parent
commit
5f6e7a3b70
14 changed files with 292 additions and 5 deletions
  1. +78
    -0
      Sevomin.Models/JobMiniExternalViewModel.cs
  2. +1
    -0
      Sevomin.Models/Sevomin.Models.csproj
  3. +21
    -0
      Sevomin.WebFrontend.Controllers/HelpController.cs
  4. +3
    -3
      Sevomin.WebFrontend.Controllers/HomeController.cs
  5. +56
    -0
      Sevomin.WebFrontend.Controllers/JobController.cs
  6. +2
    -0
      Sevomin.WebFrontend.Controllers/Sevomin.WebFrontend.Controllers.csproj
  7. +23
    -0
      Sevomin.WebFrontend/App_Data/export-assets/export.js
  8. +28
    -0
      Sevomin.WebFrontend/App_Start/RouteConfig.cs
  9. +3
    -0
      Sevomin.WebFrontend/Sevomin.WebFrontend.csproj
  10. +18
    -0
      Sevomin.WebFrontend/Views/Help/ExportRss.cshtml
  11. +52
    -0
      Sevomin.WebFrontend/Views/Help/ExportScript.cshtml
  12. +5
    -1
      Sevomin.WebFrontend/Views/Job/JobList.cshtml
  13. +1
    -0
      Sevomin.WebFrontend/Views/Shared/_Layout.cshtml
  14. +1
    -1
      Sevomin.WebFrontend/Web.config

+ 78
- 0
Sevomin.Models/JobMiniExternalViewModel.cs View File

@ -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();
}
}
}

+ 1
- 0
Sevomin.Models/Sevomin.Models.csproj View File

@ -89,6 +89,7 @@
<Compile Include="Helpers\ScheduledTasks\ExpiringJob.cs" />
<Compile Include="Helpers\ScheduledTasks\NewJob.cs" />
<Compile Include="Helpers\ScheduledTasks\NewApplication.cs" />
<Compile Include="JobMiniExternalViewModel.cs" />
<Compile Include="Migrations\201409010546480_basepoint.cs" />
<Compile Include="Migrations\201409010546480_basepoint.Designer.cs">
<DependentUpon>201409010546480_basepoint.cs</DependentUpon>


+ 21
- 0
Sevomin.WebFrontend.Controllers/HelpController.cs View File

@ -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();
}
}
}

+ 3
- 3
Sevomin.WebFrontend.Controllers/HomeController.cs View File

@ -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<ActionResult> Index()
{
if (!Request.IsAuthenticated)


+ 56
- 0
Sevomin.WebFrontend.Controllers/JobController.cs View File

@ -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);


+ 2
- 0
Sevomin.WebFrontend.Controllers/Sevomin.WebFrontend.Controllers.csproj View File

@ -79,6 +79,7 @@
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
@ -95,6 +96,7 @@
<Compile Include="AuthorizedController.cs" />
<Compile Include="BaseController.cs" />
<Compile Include="GodController.cs" />
<Compile Include="HelpController.cs" />
<Compile Include="HomeController.cs" />
<Compile Include="JobController.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />


+ 23
- 0
Sevomin.WebFrontend/App_Data/export-assets/export.js View File

@ -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;
}
}

+ 28
- 0
Sevomin.WebFrontend/App_Start/RouteConfig.cs View File

@ -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",


+ 3
- 0
Sevomin.WebFrontend/Sevomin.WebFrontend.csproj View File

@ -130,6 +130,7 @@
<Content Include="App_Data\emails\new-application.html" />
<Content Include="App_Data\emails\new-job.html" />
<Content Include="App_Data\emails\password-reset.html" />
<Content Include="App_Data\export-assets\export.js" />
<Content Include="app_offline-.htm" />
<Content Include="Content\bootstrap-theme.css" />
<Content Include="Content\bootstrap-theme.min.css" />
@ -335,6 +336,8 @@
<Content Include="Views\Account\ChangePassword.cshtml" />
<Content Include="Views\Shared\SocialMetaTags.cshtml" />
<Content Include="Views\God\Index.cshtml" />
<Content Include="Views\Help\ExportScript.cshtml" />
<Content Include="Views\Help\ExportRss.cshtml" />
<None Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</None>


+ 18
- 0
Sevomin.WebFrontend/Views/Help/ExportRss.cshtml View File

@ -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>

+ 52
- 0
Sevomin.WebFrontend/Views/Help/ExportScript.cshtml View File

@ -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">
&lt;script type="text/javascript" src="http://www.sevom.in/jobs/export/js"&gt;&lt;/script&gt;
</pre>
<p>حال برای نمایش لیست فرصت های شغلی در سند خود، کد زیر را در انتهای سند خود قبل از بسته شدن تگ <code>body</code> وارد نمایید.</p>
<pre class="ltr">
&lt;script type="text/javascript"&gt;
(function(){
var viewer = new sevominJobViewer({ container: '#job-list-container', linkText: 'مشاهده' });
viewer.show();
})();
&lt;/script&gt;
</pre>
<p>در نهایت باید المان <code>job-list</code> را در محل دلخواه خود تعریف کنید. کد زیر ساده ترین تعریف المان موردنظر است. <em>دقت کنید که مقدار پارامتر container می تواند هر selector معتبر css باشد.</em></p>
<pre class="ltr">
&lt;div id="job-list-container"&gt;&lt;/div&gt;
</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>

+ 5
- 1
Sevomin.WebFrontend/Views/Job/JobList.cshtml View File

@ -38,4 +38,8 @@
</div>
}
}
</section>
</section>
@section Head{
<link rel="alternate" type="application/rss+xml" href="@Html.Action("RecentJobsRss")" title="فرصت های شغلی جدید در سومین">
}

+ 1
- 0
Sevomin.WebFrontend/Views/Shared/_Layout.cshtml View File

@ -5,6 +5,7 @@
<title>سومین - @ViewBag.Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
@Html.Partial("SocialMetaTags")
@RenderSection("Head", false)
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/bootstrap.min.css")" />
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/bootstrap-theme.css")" />
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/themes/base/minified/jquery-ui.min.css")" />


+ 1
- 1
Sevomin.WebFrontend/Web.config View File

@ -15,7 +15,7 @@
</configSections>
<connectionStrings>
<clear />
<add name="SevominConnectionString" connectionString="Data Source=192.168.1.214;Initial Catalog=Sevomin;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient" />
<add name="SevominConnectionString" connectionString="Data Source=dc;Initial Catalog=Sevomin;Persist Security Info=True;User ID=sa;Password=123qwe;Pooling=False" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />


Loading…
Cancel
Save