From 6c818bd8d8f4514625d8f2930996623339d5b546 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 23 Mar 2011 00:06:22 -0700 Subject: [PATCH] Upcoming shows view added. --- NzbDrone.Core/CentralDispatch.cs | 1 + NzbDrone.Core/Model/UpcomingEpisodesModel.cs | 15 +++ NzbDrone.Core/NzbDrone.Core.csproj | 3 + .../Providers/IUpcomingEpisodesProvider.cs | 17 ++++ .../Providers/UpcomingEpisodesProvider.cs | 50 ++++++++++ .../Controllers/UpcomingController.cs | 77 +++++++++++++++ NzbDrone.Web/Models/UpcomingEpisodeModel.cs | 17 ++++ NzbDrone.Web/NzbDrone.Web.csproj | 3 + NzbDrone.Web/Views/Upcoming/Index.aspx | 99 +++++++++++++++++++ 9 files changed, 282 insertions(+) create mode 100644 NzbDrone.Core/Model/UpcomingEpisodesModel.cs create mode 100644 NzbDrone.Core/Providers/IUpcomingEpisodesProvider.cs create mode 100644 NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs create mode 100644 NzbDrone.Web/Controllers/UpcomingController.cs create mode 100644 NzbDrone.Web/Models/UpcomingEpisodeModel.cs create mode 100644 NzbDrone.Web/Views/Upcoming/Index.aspx diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index b7faf0a59..e88c77a9c 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -57,6 +57,7 @@ namespace NzbDrone.Core _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To(); _kernel.Bind().To(); + _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); diff --git a/NzbDrone.Core/Model/UpcomingEpisodesModel.cs b/NzbDrone.Core/Model/UpcomingEpisodesModel.cs new file mode 100644 index 000000000..e1e6889bf --- /dev/null +++ b/NzbDrone.Core/Model/UpcomingEpisodesModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Model +{ + public class UpcomingEpisodesModel + { + public List Yesterday { get; set; } + public List Today { get; set; } + public List Week { get; set; } + } +} diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 2fdee13df..0a70748e9 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -177,6 +177,7 @@ + @@ -193,6 +194,7 @@ + @@ -202,6 +204,7 @@ + diff --git a/NzbDrone.Core/Providers/IUpcomingEpisodesProvider.cs b/NzbDrone.Core/Providers/IUpcomingEpisodesProvider.cs new file mode 100644 index 000000000..137813105 --- /dev/null +++ b/NzbDrone.Core/Providers/IUpcomingEpisodesProvider.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NzbDrone.Core.Model; +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Providers +{ + public interface IUpcomingEpisodesProvider + { + UpcomingEpisodesModel Upcoming(); + List Yesterday(); + List Today(); + List Week(); + } +} diff --git a/NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs b/NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs new file mode 100644 index 000000000..4fd87711c --- /dev/null +++ b/NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NzbDrone.Core.Model; +using NzbDrone.Core.Repository; +using SubSonic.Repository; + +namespace NzbDrone.Core.Providers +{ + public class UpcomingEpisodesProvider : IUpcomingEpisodesProvider + { + private IRepository _sonicRepo; + + public UpcomingEpisodesProvider(IRepository sonicRepo) + { + _sonicRepo = sonicRepo; + } + + #region IUpcomingEpisodesProvider + + public UpcomingEpisodesModel Upcoming() + { + var allEps = _sonicRepo.All().Where(e => e.AirDate >= DateTime.Today.AddDays(-1) && e.AirDate < DateTime.Today.AddDays(8)); + + var yesterday = allEps.Where(e => e.AirDate == DateTime.Today.AddDays(-1)).ToList(); + var today = allEps.Where(e => e.AirDate == DateTime.Today).ToList(); + var week = allEps.Where(e => e.AirDate > DateTime.Today).ToList(); + + return new UpcomingEpisodesModel {Yesterday = yesterday, Today = today, Week = week}; + } + + public List Yesterday() + { + return _sonicRepo.All().Where(e => e.AirDate == DateTime.Today.AddDays(-1)).ToList(); + } + + public List Today() + { + return _sonicRepo.All().Where(e => e.AirDate == DateTime.Today).ToList(); + } + + public List Week() + { + return _sonicRepo.All().Where(e => e.AirDate > DateTime.Today && e.AirDate < DateTime.Today.AddDays(8)).ToList(); + } + + #endregion + } +} diff --git a/NzbDrone.Web/Controllers/UpcomingController.cs b/NzbDrone.Web/Controllers/UpcomingController.cs new file mode 100644 index 000000000..945597324 --- /dev/null +++ b/NzbDrone.Web/Controllers/UpcomingController.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using NzbDrone.Core.Providers; +using NzbDrone.Web.Models; +using Telerik.Web.Mvc; + +namespace NzbDrone.Web.Controllers +{ + public class UpcomingController : Controller + { + private IUpcomingEpisodesProvider _upcomingEpisodesProvider; + + public UpcomingController(IUpcomingEpisodesProvider upcomingEpisodesProvider) + { + _upcomingEpisodesProvider = upcomingEpisodesProvider; + } + + // + // GET: /Upcoming/ + + public ActionResult Index() + { + return View(); + } + + [GridAction] + public ActionResult _AjaxBindingYesterday() + { + var upcoming = _upcomingEpisodesProvider.Yesterday().Select(e => new UpcomingEpisodeModel + { + SeriesName = e.Series.Title, + SeasonNumber = e.SeasonNumber, + EpisodeNumber = e.EpisodeNumber, + Title = e.Title, + Overview = e.Overview, + AirDate = e.AirDate + }); + + return View(new GridModel(upcoming)); + } + + [GridAction] + public ActionResult _AjaxBindingToday() + { + var upcoming = _upcomingEpisodesProvider.Today().Select(e => new UpcomingEpisodeModel + { + SeriesName = e.Series.Title, + SeasonNumber = e.SeasonNumber, + EpisodeNumber = e.EpisodeNumber, + Title = e.Title, + Overview = e.Overview, + AirDate = e.AirDate + }); + + return View(new GridModel(upcoming)); + } + + [GridAction] + public ActionResult _AjaxBindingWeek() + { + var upcoming = _upcomingEpisodesProvider.Week().Select(e => new UpcomingEpisodeModel + { + SeriesName = e.Series.Title, + SeasonNumber = e.SeasonNumber, + EpisodeNumber = e.EpisodeNumber, + Title = e.Title, + Overview = e.Overview, + AirDate = e.AirDate + }); + + return View(new GridModel(upcoming)); + } + } +} diff --git a/NzbDrone.Web/Models/UpcomingEpisodeModel.cs b/NzbDrone.Web/Models/UpcomingEpisodeModel.cs new file mode 100644 index 000000000..84365496c --- /dev/null +++ b/NzbDrone.Web/Models/UpcomingEpisodeModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace NzbDrone.Web.Models +{ + public class UpcomingEpisodeModel + { + public string SeriesName { get; set; } + public int SeasonNumber { get; set; } + public int EpisodeNumber { get; set; } + public string Title { get; set; } + public string Overview { get; set; } + public DateTime AirDate { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index 69ef31b36..16745310b 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -85,6 +85,7 @@ + Global.asax @@ -105,6 +106,7 @@ + @@ -303,6 +305,7 @@ + Designer diff --git a/NzbDrone.Web/Views/Upcoming/Index.aspx b/NzbDrone.Web/Views/Upcoming/Index.aspx new file mode 100644 index 000000000..28fce7606 --- /dev/null +++ b/NzbDrone.Web/Views/Upcoming/Index.aspx @@ -0,0 +1,99 @@ +<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage>" %> + +<%@ Import Namespace="Telerik.Web.Mvc.UI" %> +<%@ Import Namespace="NzbDrone.Web.Models" %> +<%@ Import Namespace="NzbDrone.Core.Repository" %> + + + + + + Upcoming + + + <% + Html.Telerik().Menu().Name("historyMenu").Items(items => + { + items.Add().Text("Trim History").Action("Trim", "History"); + items.Add().Text("Purge History").Action("Purge", "History"); + }).Render(); + %> + + + <%Html.Telerik().Grid().Name("Yesterday").NoRecordsTemplate("No watched shows aired yesterday") + .Columns(columns => + { + columns.Bound(c => c.SeriesName).Title("Series Name").Width(110); + columns.Bound(c => c.SeasonNumber).Title("Season #").Width(40); + columns.Bound(c => c.EpisodeNumber).Title("Episode #").Width(40); + columns.Bound(c => c.Title).Title("Episode Title").Width(120); + columns.Bound(c => c.AirDate).Title("Air Date").Width(0); + }) + .DetailView(detailView => detailView.ClientTemplate( + "
Overview: <#= Overview #>
" + )) + .DataBinding(data => data.Ajax().Select("_AjaxBindingYesterday", "Upcoming")) + .Sortable(rows => rows.OrderBy(epSort => epSort.Add(c => c.AirDate).Ascending()).Enabled(true)) + //.Pageable(c => c.PageSize(20).Position(GridPagerPosition.Both).Style(GridPagerStyles.PageInput | GridPagerStyles.NextPreviousAndNumeric)) + //.Filterable() + //.ClientEvents(c => c.OnRowDataBound("onRowDataBound")) + .Render(); + %> + + <%Html.Telerik().Grid().Name("Today").NoRecordsTemplate("No watched shows airing today.") + .Columns(columns => + { + columns.Bound(c => c.SeriesName).Title("Series Name").Width(110); + columns.Bound(c => c.SeasonNumber).Title("Season #").Width(40); + columns.Bound(c => c.EpisodeNumber).Title("Episode #").Width(40); + columns.Bound(c => c.Title).Title("Episode Title").Width(120); + columns.Bound(c => c.AirDate).Title("Air Date").Width(0); + }) + .DetailView(detailView => detailView.ClientTemplate( + "
Overview: <#= Overview #>
" + )) + .DataBinding(data => data.Ajax().Select("_AjaxBindingToday", "Upcoming")) + .Sortable(rows => rows.OrderBy(epSort => epSort.Add(c => c.AirDate).Ascending()).Enabled(true)) + //.Pageable(c => c.PageSize(20).Position(GridPagerPosition.Both).Style(GridPagerStyles.PageInput | GridPagerStyles.NextPreviousAndNumeric)) + //.Filterable() + //.ClientEvents(c => c.OnRowDataBound("onRowDataBound")) + .Render(); + %> + + <%Html.Telerik().Grid().Name("Week").NoRecordsTemplate("No watched shows airing in the next week...") + .Columns(columns => + { + columns.Bound(c => c.SeriesName).Title("Series Name").Width(110); + columns.Bound(c => c.SeasonNumber).Title("Season #").Width(40); + columns.Bound(c => c.EpisodeNumber).Title("Episode #").Width(40); + columns.Bound(c => c.Title).Title("Episode Title").Width(120); + columns.Bound(c => c.AirDate).Title("Air Date").Width(0); + }) + .DetailView(detailView => detailView.ClientTemplate( + "
Overview: <#= Overview #>
" + )) + .DataBinding(data => data.Ajax().Select("_AjaxBindingWeek", "Upcoming")) + .Sortable(rows => rows.OrderBy(epSort => epSort.Add(c => c.AirDate).Ascending()).Enabled(true)) + //.Pageable(c => c.PageSize(20).Position(GridPagerPosition.Both).Style(GridPagerStyles.PageInput | GridPagerStyles.NextPreviousAndNumeric)) + //.Filterable() + //.ClientEvents(c => c.OnRowDataBound("onRowDataBound")) + .Render(); + %> +