Merge remote-tracking branch 'origin/master' into dynamic-jobs

Conflicts:
	NzbDrone.Web/Scripts/NzbDrone/series.js
This commit is contained in:
Mark McDowall 2012-09-22 22:37:51 -07:00
commit b21bf01bf0
40 changed files with 700 additions and 262 deletions

View File

@ -34,6 +34,24 @@
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="FizzWare.NBuilder, Version=3.0.1.0, Culture=neutral, PublicKeyToken=5651b03e12e42c12, processorArchitecture=MSIL">
<HintPath>..\packages\NBuilder.3.0.1.1\lib\FizzWare.NBuilder.dll</HintPath>

View File

@ -34,6 +34,24 @@
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentAssertions, Version=1.7.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>

View File

@ -34,6 +34,24 @@
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="Exceptioneer.WindowsFormsClient">
<HintPath>..\Libraries\Exceptioneer.WindowsFormsClient.dll</HintPath>

View File

@ -34,6 +34,24 @@
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="Accessibility">
<EmbedInteropTypes>True</EmbedInteropTypes>
@ -129,6 +147,7 @@
<Compile Include="ProviderTests\ConfigProviderTests\ConfigCachingFixture.cs" />
<Compile Include="ProviderTests\BannerProviderTest.cs" />
<Compile Include="ProviderTests\DecisionEngineTests\AllowedReleaseGroupSpecificationFixture.cs" />
<Compile Include="ProviderTests\DecisionEngineTests\CustomStartDateSpecificationFixture.cs" />
<Compile Include="ProviderTests\DiskScanProviderTests\CleanUpFixture.cs" />
<Compile Include="ProviderTests\DiskScanProviderTests\CleanUpDropFolderFixture.cs" />
<Compile Include="ProviderTests\DiskScanProviderTests\GetVideoFilesFixture.cs" />

View File

@ -52,6 +52,10 @@ namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests
Mocker.GetMock<AllowedReleaseGroupSpecification>()
.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>()))
.Returns(true);
Mocker.GetMock<CustomStartDateSpecification>()
.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>()))
.Returns(true);
}
private void WithProfileNotAllowed()
@ -89,6 +93,13 @@ namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests
.Returns(false);
}
private void WithAiredBeforeCustomStartDateCutoff()
{
Mocker.GetMock<CustomStartDateSpecification>()
.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>()))
.Returns(false);
}
[Test]
public void should_be_allowed_if_all_conditions_are_met()
{
@ -130,6 +141,13 @@ namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests
spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.Retention);
}
[Test]
public void should_not_be_allowed_if_episode_aired_before_cutoff()
{
WithAiredBeforeCustomStartDateCutoff();
spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.AiredAfterCustomStartDate);
}
[Test]
public void should_not_be_allowed_if_none_of_conditions_are_met()
{

View File

@ -0,0 +1,145 @@
// ReSharper disable RedundantUsingDirective
using System.Linq;
using System;
using System.Collections.Generic;
using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.DecisionEngine;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests
{
[TestFixture]
// ReSharper disable InconsistentNaming
public class CustomStartDateSpecificationFixture : CoreTest
{
private CustomStartDateSpecification _customStartDateSpecification;
private EpisodeParseResult parseResultMulti;
private EpisodeParseResult parseResultSingle;
private Series fakeSeries;
private Episode firstEpisode;
private Episode secondEpisode;
[SetUp]
public void Setup()
{
_customStartDateSpecification = Mocker.Resolve<CustomStartDateSpecification>();
fakeSeries = Builder<Series>.CreateNew()
.With(c => c.Monitored = true)
.With(c => c.CustomStartDate = null)
.Build();
parseResultMulti = new EpisodeParseResult
{
SeriesTitle = "Title",
Series = fakeSeries,
EpisodeNumbers = new List<int> { 3, 4 },
SeasonNumber = 12,
};
parseResultSingle = new EpisodeParseResult
{
SeriesTitle = "Title",
Series = fakeSeries,
EpisodeNumbers = new List<int> { 3 },
SeasonNumber = 12,
};
firstEpisode = new Episode { AirDate = DateTime.Today };
secondEpisode = new Episode { AirDate = DateTime.Today };
var singleEpisodeList = new List<Episode> { firstEpisode };
var doubleEpisodeList = new List<Episode> { firstEpisode, secondEpisode };
Mocker.GetMock<EpisodeProvider>().Setup(c => c.GetEpisodesByParseResult(parseResultSingle)).Returns(singleEpisodeList);
Mocker.GetMock<EpisodeProvider>().Setup(c => c.GetEpisodesByParseResult(parseResultMulti)).Returns(doubleEpisodeList);
}
private void WithFirstEpisodeLastYear()
{
firstEpisode.AirDate = DateTime.Today.AddYears(-1);
}
private void WithSecondEpisodeYear()
{
secondEpisode.AirDate = DateTime.Today.AddYears(-1);
}
private void WithAiredAfterYesterday()
{
fakeSeries.CustomStartDate = DateTime.Today.AddDays(-1);
}
private void WithAiredAfterLastWeek()
{
fakeSeries.CustomStartDate = DateTime.Today.AddDays(-7);
}
[Test]
public void should_return_true_when_downloadEpisodesAiredAfter_is_null_for_single_episode()
{
_customStartDateSpecification.IsSatisfiedBy(parseResultSingle).Should().BeTrue();
}
[Test]
public void should_return_true_when_downloadEpisodesAiredAfter_is_null_for_multiple_episodes()
{
_customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue();
}
[Test]
public void should_return_true_if_both_episodes_air_after_cutoff()
{
WithAiredAfterLastWeek();
_customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue();
}
[Test]
public void should_return_true_if_episode_airs_after_cutoff()
{
WithAiredAfterLastWeek();
_customStartDateSpecification.IsSatisfiedBy(parseResultSingle).Should().BeTrue();
}
[Test]
public void should_return_true_if_first_episode_aired_after_cutoff()
{
WithAiredAfterLastWeek();
WithSecondEpisodeYear();
_customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue();
}
[Test]
public void should_return_true_if_second_episode_aired_after_cutoff()
{
WithAiredAfterLastWeek();
WithFirstEpisodeLastYear();
_customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue();
}
[Test]
public void should_return_false_if_both_episodes_aired_before_cutoff()
{
WithAiredAfterLastWeek();
WithFirstEpisodeLastYear();
WithSecondEpisodeYear();
_customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeFalse();
}
[Test]
public void should_return_false_if_episode_aired_before_cutoff()
{
WithAiredAfterLastWeek();
WithFirstEpisodeLastYear();
_customStartDateSpecification.IsSatisfiedBy(parseResultSingle).Should().BeFalse();
}
}
}

View File

@ -729,7 +729,7 @@ namespace NzbDrone.Core.Test.ProviderTests
//act
var seriesProvider = Mocker.Resolve<SeriesProvider>();
seriesProvider.AddSeries("Test Series","c:\\test\\", tvDbSeriesId, 1);
seriesProvider.AddSeries("Test Series","c:\\test\\", tvDbSeriesId, 1, null);
var episodeProvider = Mocker.Resolve<EpisodeProvider>();
episodeProvider.RefreshEpisodeInfo(seriesProvider.GetSeries(tvDbSeriesId));

View File

@ -36,7 +36,7 @@ namespace NzbDrone.Core.Test.ProviderTests
//Act
var seriesProvider = Mocker.Resolve<SeriesProvider>();
seriesProvider.AddSeries(title, path, tvDbId, qualityProfileId);
seriesProvider.AddSeries(title, path, tvDbId, qualityProfileId, null);
//Assert
var series = seriesProvider.GetAllSeries();
@ -54,7 +54,7 @@ namespace NzbDrone.Core.Test.ProviderTests
public void add_series_should_fail_if_series_is_less_than_zero(int seriesId)
{
WithRealDb();
Assert.Throws<ArgumentOutOfRangeException>(() => Mocker.Resolve<SeriesProvider>().AddSeries("Title", "C:\\Test", seriesId, 1));
Assert.Throws<ArgumentOutOfRangeException>(() => Mocker.Resolve<SeriesProvider>().AddSeries("Title", "C:\\Test", seriesId, 1, null));
}
[Test]

View File

@ -0,0 +1,17 @@
using System;
using System.Data;
using Migrator.Framework;
using NzbDrone.Common;
namespace NzbDrone.Core.Datastore.Migrations
{
[Migration(20120918)]
public class Migration20120918 : NzbDroneMigration
{
protected override void MainDbUpgrade()
{
Database.AddColumn("Series", new Column("DownloadEpisodesAiredAfter", DbType.DateTime, ColumnProperty.Null));
}
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Data;
using Migrator.Framework;
using NzbDrone.Common;
namespace NzbDrone.Core.Datastore.Migrations
{
[Migration(20120919)]
public class Migration20120919 : NzbDroneMigration
{
protected override void MainDbUpgrade()
{
Database.AddColumn("Series", new Column("CustomStartDate", DbType.DateTime, ColumnProperty.Null));
Database.ExecuteNonQuery("UPDATE Series SET CustomStartDate = DownloadEpisodesAiredAfter");
Database.RemoveColumn("Series", "DownloadEpisodesAiredAfter");
}
}
}

View File

@ -17,6 +17,7 @@ namespace NzbDrone.Core.Model
DownloadClientFailure = 10,
Skipped = 11,
Failure = 12,
ReleaseGroupNotWanted = 13
ReleaseGroupNotWanted = 13,
AiredAfterCustomStartDate = 14
}
}

View File

@ -227,6 +227,8 @@
<Compile Include="Datastore\MigrationLogger.cs" />
<Compile Include="Datastore\MigrationsHelper.cs" />
<Compile Include="Datastore\CustomeMapper.cs" />
<Compile Include="Datastore\Migrations\Migration20120919.cs" />
<Compile Include="Datastore\Migrations\Migration20120918.cs" />
<Compile Include="Datastore\Migrations\Migration20120802.cs" />
<Compile Include="Datastore\Migrations\Migration20120727.cs" />
<Compile Include="Datastore\Migrations\Migration20120504.cs" />
@ -291,6 +293,7 @@
<Compile Include="Model\Xbmc\IconType.cs" />
<Compile Include="Providers\BannerProvider.cs" />
<Compile Include="Providers\DecisionEngine\AllowedReleaseGroupSpecification.cs" />
<Compile Include="Providers\DecisionEngine\CustomStartDateSpecification.cs" />
<Compile Include="Providers\DownloadClients\PneumaticProvider.cs" />
<Compile Include="Providers\Indexer\NzbClub.cs" />
<Compile Include="Providers\Indexer\NzbIndex.cs" />

View File

@ -14,13 +14,14 @@ namespace NzbDrone.Core.Providers.DecisionEngine
private readonly AlreadyInQueueSpecification _alreadyInQueueSpecification;
private readonly RetentionSpecification _retentionSpecification;
private readonly AllowedReleaseGroupSpecification _allowedReleaseGroupSpecification;
private readonly CustomStartDateSpecification _customStartDateSpecification;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
[Inject]
public AllowedDownloadSpecification(QualityAllowedByProfileSpecification qualityAllowedByProfileSpecification,
UpgradeDiskSpecification upgradeDiskSpecification, AcceptableSizeSpecification acceptableSizeSpecification,
AlreadyInQueueSpecification alreadyInQueueSpecification, RetentionSpecification retentionSpecification,
AllowedReleaseGroupSpecification allowedReleaseGroupSpecification)
AllowedReleaseGroupSpecification allowedReleaseGroupSpecification, CustomStartDateSpecification customStartDateSpecification)
{
_qualityAllowedByProfileSpecification = qualityAllowedByProfileSpecification;
_upgradeDiskSpecification = upgradeDiskSpecification;
@ -28,6 +29,7 @@ namespace NzbDrone.Core.Providers.DecisionEngine
_alreadyInQueueSpecification = alreadyInQueueSpecification;
_retentionSpecification = retentionSpecification;
_allowedReleaseGroupSpecification = allowedReleaseGroupSpecification;
_customStartDateSpecification = customStartDateSpecification;
}
public AllowedDownloadSpecification()
@ -37,6 +39,7 @@ namespace NzbDrone.Core.Providers.DecisionEngine
public virtual ReportRejectionType IsSatisfiedBy(EpisodeParseResult subject)
{
if (!_qualityAllowedByProfileSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.QualityNotWanted;
if (!_customStartDateSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.AiredAfterCustomStartDate;
if (!_upgradeDiskSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.ExistingQualityIsEqualOrBetter;
if (!_retentionSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.Retention;
if (!_acceptableSizeSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.Size;

View File

@ -0,0 +1,44 @@
using System.Linq;
using NLog;
using Ninject;
using NzbDrone.Core.Model;
namespace NzbDrone.Core.Providers.DecisionEngine
{
public class CustomStartDateSpecification
{
private readonly EpisodeProvider _episodeProvider;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
[Inject]
public CustomStartDateSpecification(EpisodeProvider episodeProvider)
{
_episodeProvider = episodeProvider;
}
public CustomStartDateSpecification()
{
}
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
{
if (!subject.Series.CustomStartDate.HasValue)
{
logger.Debug("{0} does not restrict downloads before date.", subject.Series.Title);
return true;
}
var episodes = _episodeProvider.GetEpisodesByParseResult(subject);
if (episodes.Any(episode => episode.AirDate > subject.Series.CustomStartDate.Value))
{
logger.Debug("One or more episodes aired after cutoff, downloading.");
return true;
}
logger.Debug("Episodes aired before cutoff date: {0}", subject.Series.CustomStartDate);
return false;
}
}
}

View File

@ -110,7 +110,7 @@ namespace NzbDrone.Core.Providers
return series;
}
public virtual void AddSeries(string title, string path, int tvDbSeriesId, int qualityProfileId)
public virtual void AddSeries(string title, string path, int tvDbSeriesId, int qualityProfileId, DateTime? airedAfter)
{
Logger.Info("Adding Series [{0}] Path: [{1}]", tvDbSeriesId, path);
@ -131,6 +131,9 @@ namespace NzbDrone.Core.Providers
repoSeries.SeasonFolder = _configProvider.UseSeasonFolder;
repoSeries.BacklogSetting = BacklogSettingType.Inherit;
if (airedAfter.HasValue)
repoSeries.CustomStartDate = airedAfter;
_database.Insert(repoSeries);
}
@ -229,6 +232,7 @@ namespace NzbDrone.Core.Providers
series.SeasonFolder = edited.SeasonFolder;
series.BacklogSetting = edited.BacklogSetting;
series.Path = edited.Path;
series.CustomStartDate = edited.CustomStartDate;
}
_database.UpdateMany(allSeries);

View File

@ -48,6 +48,8 @@ namespace NzbDrone.Core.Repository
public string Network { get; set; }
public DateTime? CustomStartDate { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="Series"/> is hidden.
/// </summary>

View File

@ -335,6 +335,24 @@
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />

View File

@ -33,6 +33,24 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="FizzWare.NBuilder">
<HintPath>..\..\packages\NBuilder.3.0.1.1\lib\FizzWare.NBuilder.dll</HintPath>

View File

@ -34,6 +34,24 @@
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Practices.ServiceLocation">
<HintPath>..\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll</HintPath>

View File

@ -34,6 +34,24 @@
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentAssertions">
<HintPath>..\packages\FluentAssertions.1.7.0\Lib\net40\FluentAssertions.dll</HintPath>

View File

@ -68,10 +68,7 @@
opacity: 0.7;
}
.episodeMissing
{
.episodeMissing, table.dataTable tr.series-ended {
background-color: #f5d6d6;
}

View File

@ -115,7 +115,7 @@ hr
}
input[type=text], select
input[type=text], input[type=date], select
{
font-size: small;
padding: 2px 2px;
@ -181,28 +181,18 @@ button span, input[type="button"] span, input[type="submit"] span, input[type="r
height: 25px;
}
.dialog
{
margin-left: auto;
margin-right: auto;
}
.qualitySelector
{
min-width: 60px;
width: auto;
}
#quickAdd
{
position: fixed;
top: 30px;
right: 15px;
}
#localSeriesLookup
{
width: 220px;

View File

@ -4,7 +4,7 @@
}
.checkboxColumn {
width: 110px;
width: 50px;
text-align: center;
}
@ -13,12 +13,12 @@
text-align: center;
}
table input[type="text"], table select {
table input[type="text"], table input[type="date"], table select {
margin: 2px 2px;
}
td .path {
width: 300px;
width: 290px;
}
td .backlogSetting {
@ -37,6 +37,19 @@ th .footer-control-quality {
width: 120px;
}
td .start-date {
width: 80px;
}
th .footer-control-boolean {
width: 90px;
}
th .footer-control-start-date {
width: 80px;
}
#stylized, .settingsForm {
overflow: hidden;
}

View File

@ -1,5 +1,4 @@
p, h1, form, button
{
p, h1, form, button {
border: 0;
margin: 0;
padding: 0;
@ -9,21 +8,18 @@
display: none;
}
.spacer
{
.spacer {
clear: both;
height: 1px;
}
.settingsForm
{
.settingsForm {
width: 620px;
padding: 14px;
}
#stylized p
{
#stylized p {
font-size: 11px;
color: #666666;
margin-bottom: 20px;
@ -31,8 +27,7 @@
padding-bottom: 10px;
}
#stylized .labelClass
{
#stylized .labelClass {
display: block;
font-weight: bold;
text-align: right;
@ -41,8 +36,7 @@
margin-bottom: -10px;
}
#stylized .small
{
#stylized .small {
color: #666666;
display: block;
font-size: 11px;
@ -51,8 +45,7 @@
width: 340px;
}
#stylized .inputClass
{
#stylized .inputClass {
float: left;
padding: 2px 2px;
border: solid 1px #aacfe4;
@ -60,19 +53,16 @@
margin: 4px 0 20px 10px;
}
#stylized .selectClass
{
#stylized .selectClass {
width: 206px;
}
#stylized .checkClass
{
#stylized .checkClass {
margin: 12px 0px 20px 10px;
border: none;
}
#stylized button
{
#stylized button {
clear: both;
margin-left: 220px;
margin-bottom: 10px;
@ -85,8 +75,7 @@
}
#saveAjax
{
#saveAjax {
padding-left: 6px;
margin-bottom: -7px;
width: 20px;
@ -94,24 +83,21 @@
display: none;
}
#save_button[disabled="disabled"]
{
#save_button[disabled="disabled"] {
padding: 0px 6px 0px 6px;
border: 2px outset ButtonFace;
color: lightgrey;
cursor: progress;
}
.ui-dialog-buttonset .ui-delete-button
{
.ui-dialog-buttonset .ui-delete-button {
background: url("jQueryUI/images/ui-bg_flat_30_b40404_40x100.png") repeat-x scroll 50% 50% #B40404;
border: 1px solid #FFFFFF;
color: #FFFFFF;
font-weight: normal;
}
.ui-dialog-buttonset .ui-delete-button:active
{
.ui-dialog-buttonset .ui-delete-button:active {
background: url("jQueryUI/images/ui-bg_flat_30_616161_40x100.png") repeat-x scroll 50% 50% #616161;
border: 1px solid #FFFFFF;
color: #FFFFFF;

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web.Mvc;
@ -43,11 +44,9 @@ namespace NzbDrone.Web.Controllers
_diskProvider = diskProvider;
}
[HttpPost]
public EmptyResult ScanNewSeries()
public ActionResult Index()
{
_jobProvider.QueueJob(typeof(ImportNewSeriesJob));
return new EmptyResult();
return View();
}
public ActionResult AddNew()
@ -66,11 +65,6 @@ namespace NzbDrone.Web.Controllers
return View();
}
public ActionResult Index()
{
return View();
}
public ActionResult ExistingSeries()
{
var result = new ExistingSeriesModel();
@ -116,7 +110,7 @@ namespace NzbDrone.Web.Controllers
}
[HttpPost]
public JsonResult AddNewSeries(string path, string seriesName, int seriesId, int qualityProfileId)
public JsonResult AddNewSeries(string path, string seriesName, int seriesId, int qualityProfileId, string startDate)
{
if (string.IsNullOrWhiteSpace(path) || String.Equals(path,"null",StringComparison.InvariantCultureIgnoreCase))
return JsonNotificationResult.Error("Couldn't add " + seriesName, "You need a valid root folder");
@ -127,63 +121,27 @@ namespace NzbDrone.Web.Controllers
//Use the created folder name when adding the series
path = _diskProvider.CreateDirectory(path);
return AddExistingSeries(path, seriesName, seriesId, qualityProfileId);
return AddExistingSeries(path, seriesName, seriesId, qualityProfileId, startDate);
}
[HttpPost]
[JsonErrorFilter]
public JsonResult AddExistingSeries(string path, string seriesName, int seriesId, int qualityProfileId)
public JsonResult AddExistingSeries(string path, string seriesName, int seriesId, int qualityProfileId, string startDate)
{
if (seriesId == 0 || String.IsNullOrWhiteSpace(seriesName))
return JsonNotificationResult.Error("Add Existing series failed.", "Invalid Series information");
_seriesProvider.AddSeries(seriesName,path, seriesId, qualityProfileId);
ScanNewSeries();
DateTime? date = null;
if (!String.IsNullOrWhiteSpace(startDate))
date = DateTime.Parse(startDate, null, DateTimeStyles.RoundtripKind);
_seriesProvider.AddSeries(seriesName,path, seriesId, qualityProfileId, date);
_jobProvider.QueueJob(typeof(ImportNewSeriesJob));
return JsonNotificationResult.Info(seriesName, "Was added successfully");
}
[HttpPost]
public JsonResult QuickAddNewSeries(string seriesName, int seriesId, int qualityProfileId)
{
var path = _rootFolderProvider.GetMostFreeRootDir();
path = Path.Combine(path, MediaFileProvider.CleanFilename(seriesName));
//Create the folder for the new series
//Use the created folder name when adding the series
path = _diskProvider.CreateDirectory(path);
return AddExistingSeries(path, seriesName, seriesId, qualityProfileId);
}
[ChildActionOnly]
public ActionResult QuickAdd()
{
var defaultQuality = _configProvider.DefaultQualityProfile;
var qualityProfiles = _qualityProvider.All();
ViewData["qualityProfiles"] = new SelectList(
qualityProfiles,
"QualityProfileId",
"Name",
defaultQuality);
return PartialView();
}
[HttpPost]
[JsonErrorFilter]
public JsonResult SaveRootDir(string path)
{
if (String.IsNullOrWhiteSpace(path))
JsonNotificationResult.Error("Can't add root folder", "Path can not be empty");
_rootFolderProvider.Add(new RootDir { Path = path });
return JsonNotificationResult.Info("Root Folder saved", "Root folder saved successfully.");
}
[HttpGet]
public JsonResult LookupSeries(string term)
{
@ -228,6 +186,18 @@ namespace NzbDrone.Web.Controllers
return PartialView("RootDir");
}
[HttpPost]
[JsonErrorFilter]
public JsonResult SaveRootDir(string path)
{
if (String.IsNullOrWhiteSpace(path))
JsonNotificationResult.Error("Can't add root folder", "Path can not be empty");
_rootFolderProvider.Add(new RootDir { Path = path });
return JsonNotificationResult.Info("Root Folder saved", "Root folder saved successfully.");
}
[JsonErrorFilter]
public JsonResult DeleteRootDir(string path)
{

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web.Mvc;
@ -44,7 +45,7 @@ namespace NzbDrone.Web.Controllers
return View((object)serialized);
}
public ActionResult SingleSeriesEditor(int seriesId)
public ActionResult Edit(int seriesId)
{
var profiles = _qualityProvider.All();
ViewData["SelectList"] = new SelectList(profiles, "QualityProfileId", "Name");
@ -63,7 +64,7 @@ namespace NzbDrone.Web.Controllers
}
[HttpPost]
public EmptyResult SaveSingleSeriesEditor(SeriesModel seriesModel)
public EmptyResult Edit(SeriesModel seriesModel)
{
var series = _seriesProvider.GetSeries(seriesModel.SeriesId);
series.Monitored = seriesModel.Monitored;
@ -72,6 +73,9 @@ namespace NzbDrone.Web.Controllers
series.Path = seriesModel.Path;
series.BacklogSetting = (BacklogSettingType)seriesModel.BacklogSetting;
if (!String.IsNullOrWhiteSpace(seriesModel.CustomStartDate))
series.CustomStartDate = DateTime.Parse(seriesModel.CustomStartDate, null, DateTimeStyles.RoundtripKind);
_seriesProvider.UpdateSeries(series);
return new EmptyResult();
@ -166,19 +170,30 @@ namespace NzbDrone.Web.Controllers
masterBacklogList.Insert(0, new KeyValuePair<int, string>(-10, "Select..."));
ViewData["MasterBacklogSettingSelectList"] = new SelectList(masterBacklogList, "Key", "Value");
var series = _seriesProvider.GetAllSeries().OrderBy(o => SortHelper.SkipArticles(o.Title));
var series = GetSeriesModels(_seriesProvider.GetAllSeries()).OrderBy(o => SortHelper.SkipArticles(o.Title));
return View(series);
}
[HttpPost]
public JsonResult SaveEditor(List<Series> series)
public JsonResult Editor(List<SeriesModel> series)
{
//Save edits
if (series == null || series.Count == 0)
return JsonNotificationResult.Oops("Invalid post data");
_seriesProvider.UpdateFromSeriesEditor(series);
_seriesProvider.UpdateFromSeriesEditor(series.Select(s => new Series
{
SeriesId = s.SeriesId,
QualityProfileId = s.QualityProfileId,
Monitored = s.Monitored,
SeasonFolder = s.SeasonFolder,
BacklogSetting = (BacklogSettingType)s.BacklogSetting,
Path = s.Path,
CustomStartDate = String.IsNullOrWhiteSpace(s.CustomStartDate) ? (DateTime?)null
: DateTime.Parse(s.CustomStartDate, null, DateTimeStyles.RoundtripKind)
}
).ToList());
return JsonNotificationResult.Info("Series Mass Edit Saved");
}
@ -204,7 +219,8 @@ namespace NzbDrone.Web.Controllers
EpisodeFileCount = s.EpisodeFileCount,
NextAiring = s.NextAiring == null ? String.Empty : s.NextAiring.Value.ToBestDateString(),
NextAiringSorter = s.NextAiring == null ? "12/31/9999" : s.NextAiring.Value.ToString("MM/dd/yyyy"),
AirTime = s.AirTimes
AirTime = s.AirTimes,
CustomStartDate = s.CustomStartDate.HasValue ? s.CustomStartDate.Value.ToString("yyyy-MM-dd") : String.Empty
}).ToList();
return series;

View File

@ -28,7 +28,7 @@ namespace NzbDrone.Web.Models
public string Details { get; set; }
public string Network { get; set; }
public string AirTime { get; set; }
public IList<int> Seasons { get; set; }
//View & Edit
@ -52,5 +52,9 @@ namespace NzbDrone.Web.Models
[DisplayName("Backlog Setting")]
[Description("Should NzbDrone search for missing episodes every 30 days?")]
public int BacklogSetting { get; set; }
[DisplayName("Custom Start Date")]
[Description("Should NzbDrone only download episodes after your preferred start date?")]
public string CustomStartDate { get; set; }
}
}

View File

@ -476,9 +476,6 @@
<ItemGroup>
<Content Include="Views\Settings\System.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Shared\QuickAdd.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Settings\Xbmc.cshtml" />
</ItemGroup>
@ -534,7 +531,7 @@
<Content Include="Views\Series\Details.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Series\SingleSeriesEditor.cshtml" />
<Content Include="Views\Series\Edit.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Upcoming\UpcomingEpisode.cshtml" />
@ -559,9 +556,6 @@
<ItemGroup>
<Content Include="Views\Settings\MetadataPartial.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Shared\_MINIPROFILER UPDATED Layout.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Settings\Pneumatic.cshtml" />
</ItemGroup>
@ -569,6 +563,24 @@
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>BasicCorrectnessRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />

View File

@ -44,4 +44,10 @@
}
});
});
$('.jQuery-datepicker').livequery(function () {
$(this).datepicker({
dateFormat: "yy-mm-dd"
});
});
});

View File

@ -1,7 +1,6 @@
//URLs
var addSeriesUrl = '../AddSeries/AddExistingSeries';
var addNewSeriesUrl = '../AddSeries/AddNewSeries';
var quickAddNewSeriesUrl = '../AddSeries/QuickAddNewSeries';
var existingSeriesUrl = '../AddSeries/ExistingSeries';
var addNewUrl = '../AddSeries/AddNew';
@ -19,11 +18,14 @@ $(".masterQualitySelector").live('change', function () {
});
});
$(".addExistingButton").live('click', function() {
$(".addExistingButton").live('click', function () {
var button = $(this);
$(button).attr('disabled', 'disabled');
var root = $(this).parents(".existingSeries");
var title = $(this).siblings(".seriesLookup").val();
var seriesId = $(this).siblings(".seriesId").val();
var qualityId = $(this).siblings(".qualitySelector").val();
var date = $(this).siblings('.start-date').val();
var path = root.find(".seriesPathValue Label").text();
@ -41,8 +43,9 @@ $(".addExistingButton").live('click', function() {
$.ajax({
type: "POST",
url: addSeriesUrl,
data: jQuery.param({ path: path, seriesName: title, seriesId: seriesId, qualityProfileId: qualityId }),
error: function(req, status, error) {
data: jQuery.param({ path: path, seriesName: title, seriesId: seriesId, qualityProfileId: qualityId, startDate: date }),
error: function (req, status, error) {
$(button).removeAttr('disabled');
alert("Sorry! We could not add " + path + " at this time. " + error);
},
success: function() {
@ -64,6 +67,14 @@ function reloadExistingSeries() {
});
}
$(".start-date-master").live('change', function () {
var date = $(this).val();
$("#existingSeries").find(".start-date").each(function () {
$(this).val(date);
});
});
//RootDir
//Delete RootDir
$('#rootDirs .actionButton img').live('click', function (image) {
@ -112,20 +123,26 @@ function refreshRoot() {
//AddNew
$('#saveNewSeries').live('click', function () {
$('#saveNewSeries').attr('disabled', 'disabled');
var seriesTitle = $("#newSeriesLookup").val();
var seriesId = $("#newSeriesId").val();
var qualityId = $("#qualityList").val();
var path = $('#newSeriesPath').val();
var date = $('#newStartDate').val();
$.ajax({
type: "POST",
url: addNewSeriesUrl,
data: jQuery.param({ path: path, seriesName: seriesTitle, seriesId: seriesId, qualityProfileId: qualityId }),
data: jQuery.param({ path: path, seriesName: seriesTitle, seriesId: seriesId, qualityProfileId: qualityId, startDate: date }),
error: function (req, status, error) {
$('#saveNewSeries').removeAttr('disabled');
alert("Sorry! We could not add " + path + " at this time. " + error);
},
success: function () {
$("#newSeriesLookup").val("");
$('#saveNewSeries').removeAttr('disabled');
$("#newSeriesLookup").val('');
$('#newStartDate').val('');
}
});
});
@ -140,27 +157,6 @@ function reloadAddNew() {
}
//QuickAddNew
$('#quickAddNew').live('click', function () {
var seriesTitle = $("#newSeriesLookup").val();
var seriesId = $("#newSeriesId").val();
var qualityId = $("#qualityList").val();
$.ajax({
type: "POST",
url: quickAddNewSeriesUrl,
data: jQuery.param({ seriesName: seriesTitle, seriesId: seriesId, qualityProfileId: qualityId }),
error: function (req, status, error) {
alert("Sorry! We could not add " + path + " at this time. " + error);
},
success: function () {
$("#newSeriesLookup").val("");
$('#newSeriesPath').val("");
}
});
});
//Watermark
$('#rootDirInput').livequery(function () {
$(this).watermark('Enter your new root folder path...');

View File

@ -1,5 +1,5 @@
var seriesEditorUrl = '../Series/SingleSeriesEditor';
var saveSeriesEditorUrl = '../Series/SaveSingleSeriesEditor';
var seriesEditorUrl = '../Series/Edit';
var saveSeriesEditorUrl = '../Series/Edit';
var seriesDeleteUrl = '../Series/Delete';
$("#seriesEditor").dialog({

View File

@ -7,6 +7,7 @@
</div>
@Html.DropDownList("newSeriesPath", new SelectList((IList)ViewData["RootDirs"]), new { style = "width: 406px; margin-left: 0px;" })
@Html.DropDownList("qualityList", (SelectList)ViewData["QualityProfiles"], new { @class = "qualitySelector" })
@Html.TextBox("newStartDate", "", new { type = "date", @class = "jQuery-datepicker start-date", placeholder = "Custom Start Date", title = "Only download episodes that aired after the specified date" })
<button id="saveNewSeries">
Add</button>
</div>

View File

@ -23,6 +23,8 @@ else
{
@Html.DropDownList(Guid.NewGuid().ToString(), Model.Quality, new { @class = "qualitySelector masterQualitySelector" })
@Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-datepicker start-date-master", placeholder = "Custom Start Date", title = "Only download episodes that aired after the specified date" })
foreach (var series in Model.ExistingSeries)
{
<div class="existingSeries">
@ -30,9 +32,10 @@ else
<label>@series.Item1</label>
</span>
<div class="existingSeriesContainer">
<input class="seriesLookup" type="text" style="width: 400px;" value="@series.Item2" />
<input class="seriesLookup" type="text" style="width: 400px;" value="@series.Item2" placeholder="Series Title" />
@Html.Hidden("seriesId", series.Item3, new { @class = "seriesId" })
@Html.DropDownList(Guid.NewGuid().ToString(), Model.Quality, new { @class = "qualitySelector" })
@Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-datepicker start-date", placeholder = "Custom Start Date", title = "Only download episodes that aired after the specified date" })
<button class="addExistingButton">
Add</button>
</div>

View File

@ -19,6 +19,11 @@
left: 415px;
position: relative;
}
.start-date-master {
left: 430px;
position: relative;
}
.seriesPathValue
{
@ -45,6 +50,10 @@
cursor: pointer;
text-decoration: underline;
}
input[type=date].start-date {
margin-left: 10px;
}
</style>
}

View File

@ -12,7 +12,7 @@
</style>
<div id="stylized" style="border-color: transparent;">
@using (Html.BeginForm("SaveSingleSeriesEditor", "Series", FormMethod.Post, new { id = "SeriesEditorForm", name = "SeriesEditorForm", @class = "settingsForm" }))
@using (Html.BeginForm("Edit", "Series", FormMethod.Post, new { id = "SeriesEditorForm", name = "SeriesEditorForm", @class = "settingsForm" }))
{
@Html.HiddenFor(m => m.SeriesId)
@Html.HiddenFor(m => m.Status)
@ -36,5 +36,10 @@
<span class="small">@Html.DescriptionFor(m => m.BacklogSetting)</span>
</label>
@Html.DropDownListFor(m => m.BacklogSetting, (SelectList)ViewData["BacklogSettingSelectList"], new { @class = "inputClass" })
<label class="labelClass">@Html.LabelFor(m => m.CustomStartDate)
<span class="small">@Html.DescriptionFor(m => m.CustomStartDate)</span>
</label>
@Html.TextBoxFor(m => m.CustomStartDate, new { type = "date", @class = "inputClass jQuery-datepicker" })
}
</div>

View File

@ -1,5 +1,5 @@
@using NzbDrone.Web.Helpers
@model IEnumerable<NzbDrone.Core.Repository.Series>
@model IEnumerable<NzbDrone.Web.Models.SeriesModel>
@{ViewBag.Title = "Series Editor";}
@section HeaderContent
@ -16,7 +16,7 @@
</ul>
}
@using (Html.BeginForm("SaveEditor", "Series", FormMethod.Post, new { id = "SeriesEditor", name = "SeriesEditor" }))
@using (Html.BeginForm("Editor", "Series", FormMethod.Post, new { id = "SeriesEditor", name = "SeriesEditor" }))
{
<table id="seriesEditorGrid" class="dataTable dataTablesGrid no-details">
<thead>
@ -24,10 +24,12 @@
<th width="14px">@Html.CheckBox("editToggleMaster", false, new { @class = "editToggleMaster" })</th>
<th>Title</th>
<th width="125px;">Quality</th>
<th class="checkboxColumn">Monitored</th>
<th class="checkboxColumn">Season Folder</th>
<th width="100px">Backlog Status</th>
<th width="310px">Path</th>
<th width="90px">Monitored</th>
<th width="110px">Season Folder</th>
<th width="110px">Backlog Status</th>
<th width="80px" title="Custom Start Date">Start Date</th>
<th width="300px">Path</th>
<th style="width: 10px"></th>
</tr>
</thead>
@ -46,22 +48,30 @@
@Html.DropDownList("masterQualitySelector", (SelectList)ViewData["MasterProfileSelectList"], new { @class = "footer-control-quality masterSelector master-quality", disabled = true })
</th>
<th>
@Html.DropDownList("masterMonitored", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control masterSelector master-monitored", disabled = true })
@Html.DropDownList("masterMonitored", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control-boolean masterSelector master-monitored", disabled = true })
</th>
<th>
@Html.DropDownList("masterSeasonFolder", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control masterSelector master-season-folder", disabled = true })
@Html.DropDownList("masterSeasonFolder", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control-boolean masterSelector master-season-folder", disabled = true })
</th>
<th>
@Html.DropDownList("masterBacklogSetting", (SelectList)ViewData["MasterBacklogSettingSelectList"], new { @class = "footer-control masterSelector master-backlog-setting", disabled = true })
</th>
<th>
@Html.TextBox("masterStartDate", "" , new { type = "date", @class = "footer-control-start-date masterSelector master-start-date jQuery-datepicker", disabled = true })
</th>
<th>
<button id="series-editor-save" type="submit" class="save_button" disabled="disabled" title="Commit the settings from your series above to the database">
Save Changes
</button>
</th>
</tr>
</tfoot>
</table>
</table>
@Html.CheckBox("highlightEnded", true)
<label for="highlightEnded">Highlight Ended</label>
}
@section Scripts
@ -75,19 +85,70 @@
"bPaginate": false,
"bLengthChange": false,
"bFilter": false,
"bSort": false,
"bSort": true,
"bInfo": false,
"bAutoWidth": false
"bAutoWidth": false,
"aaSorting": [[1, 'asc']],
"aoColumns": [
{ "bSortable": false },
{ "bSortable": true },
{ "bSortable": false },
{ "bSortable": false },
{ "bSortable": false },
{ "bSortable": false },
{ "bSortable": false },
{ "bSortable": false },
{ "bSortable": true }
]
});
new FixedHeader(oTable, { "top": true, "left": false, "right": false, "bottom": true });
$('.editToggle').enableCheckboxRangeSelection();
//$('.master-quality option[value=-10]').text('Quality...');
//$('.master-monitored option[value=-10]').text('Monitored...');
//$('.master-season-folder option[value=-10]').text('Season Folder...');
//$('.master-backlog-setting option[value=-10]').text('Backlog Setting...');
$(document).ready(function () {
var cookieValue = $.cookie("highlightEnded");
if (cookieValue == "true") {
$('#highlightEnded').attr('checked', true);
toggleHighlightEnded(true);
}
else {
$('#highlightEnded').attr('checked', false);
toggleHighlightEnded(false);
}
$('#highlightEnded').button();
});
$('#highlightEnded').on('change', function () {
var checked = $(this).attr('checked');
toggleHighlightEnded(checked);
toggleHighlightEndedCookie(checked);
});
function toggleHighlightEnded(highlight) {
var ended = $('tr[data-status="Ended"]');
ended.each(function () {
if (highlight) {
$(this).addClass('series-ended');
}
else {
$(this).removeClass('series-ended');
}
});
}
function toggleHighlightEndedCookie(highlight) {
if (highlight)
$.cookie("highlightEnded", true, { expires: 365 });
else
$.cookie("highlightEnded", false, { expires: 365 });
}
});
$(document).on('change', '.editToggleMaster', function () {
@ -180,6 +241,16 @@
});
});
$(document).on('change', '#masterStartDate', function () {
var startDate = $(this).val();
var selected = $('.editToggle:checked');
selected.each(function () {
$(this).parent('td').parent('.seriesEditRow').find('.start-date').val(startDate);
});
});
$(document).on('click', '#series-editor-save', function () {
$('#SeriesEditor').submit();
});

View File

@ -1,4 +1,4 @@
@model NzbDrone.Core.Repository.Series
@model NzbDrone.Web.Models.SeriesModel
@using NzbDrone.Core.Model
@using NzbDrone.Core.Repository.Quality
@using NzbDrone.Web.Helpers
@ -9,7 +9,7 @@
@*SeriesId, Title, Quality, Monitored, Use Season Folder, Root Directory/Path*, Backlog Toggle*@
<tr class="seriesEditRow">
<tr class="seriesEditRow" data-status="@Model.Status">
@using (Html.BeginCollectionItem("series"))
{
var idClean = ViewData.TemplateInfo.HtmlFieldPrefix.Replace('[', '_').Replace(']', '_');
@ -21,6 +21,18 @@
<td class="checkboxColumn">@Html.CheckBoxFor(m => m.Monitored, new {@class = "seriesCheckbox monitored"})</td>
<td class="checkboxColumn">@Html.CheckBoxFor(m => m.SeasonFolder, new {@class = "seriesCheckbox seasonFolder"})</td>
<td>@Html.DropDownListFor(m => m.BacklogSetting, new SelectList((List<KeyValuePair<int, string>>)ViewData["BacklogSettingTypes"], "Key", "Value", (int)Model.BacklogSetting), new { @class = "backlogSetting" })</td>
<td>@Html.TextBoxFor(m => m.CustomStartDate, new { type = "date", @class = "start-date jQuery-datepicker" })</td>
<td>@Html.TextBoxFor(m => m.Path, new { @class = "path" })</td>
<td>
@if (Model.Status == "Ended")
{
<img src="../../Content/Images/stop.png" width="24" height="24" alt="Ended" title="Ended" />
}
else
{
<img src="../../Content/Images/play.png" width="24" height="24" alt="Active" title="Continuing" />
}
</td>
}
</tr>

View File

@ -1,15 +0,0 @@
@using System.Collections
@using NzbDrone.Core
<div id="quickAdd">
<input id="quickSeriesLookup" class="seriesLookup" type="text" style="width: 400px" />
@Html.Hidden("newSeriesId", 0, new { @class = "seriesId" })
@Html.DropDownList("qualityList", (SelectList)ViewData["QualityProfiles"], new { @class = "qualitySelector" })
<button id="quickAddNew">Add</button>
</div>
<script type="text/javascript">
jQuery(document).ready(function () {
//AddNew
$('#quickSeriesLookup').watermark('Title of the series you want to add...');
});
</script>

View File

@ -1,45 +0,0 @@
@* Required so you have extention methods for client timings *@
@using StackExchange.Profiling;
<!DOCTYPE html>
<html>
<head>
@* optional (enable client timing framework) *@
@this.InitClientTimings()
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
@* optional time scripts in the header *@
@this.TimeScript("Content Site.css",
@<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />)
@this.TimeScript("jQuery 1.5.1",
@<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>)
@this.TimeScript("modernizr",
@<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>)
</head>
<body>
<div class="page">
<header>
<div id="title">
<h1>My MVC Application</h1>
</div>
<div id="logindisplay">
@Html.Partial("_LogOnPartial")
</div>
<nav>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
</ul>
</nav>
</header>
<section id="main">
@RenderBody()
</section>
<footer>
</footer>
</div>
@* Make sure you've added this one line to your LAYOUT or MASTER PAGE *@
@MiniProfiler.RenderIncludes()
</body>
</html>

View File

@ -9,6 +9,10 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{5853FEE1-D6C1-49AB-B1E3-12216491DA69}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone", "NzbDrone\NzbDrone.csproj", "{D12F7F2F-8A3C-415F-88FA-6DD061A84869}"
ProjectSection(ProjectDependencies) = postProject
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205} = {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD} = {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.Core", "NzbDrone.Core\NzbDrone.Core.csproj", "{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}"
EndProject
@ -103,7 +107,7 @@ Global
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|x64.ActiveCfg = Release|Any CPU
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|x86.ActiveCfg = Release|Any CPU
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|x86.ActiveCfg = Release|x86
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Any CPU.Build.0 = Release|Any CPU
{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Mixed Platforms.ActiveCfg = Release|x86
@ -125,14 +129,14 @@ Global
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x64.ActiveCfg = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.ActiveCfg = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.Build.0 = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.ActiveCfg = Debug|x86
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.Build.0 = Debug|x86
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Any CPU.Build.0 = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.ActiveCfg = Release|x86
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.Build.0 = Release|x86
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|x64.ActiveCfg = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|x86.ActiveCfg = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|x86.ActiveCfg = Release|x86
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Release|Any CPU.Build.0 = Release|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -150,14 +154,14 @@ Global
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x64.ActiveCfg = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.ActiveCfg = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.Build.0 = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.ActiveCfg = Debug|x86
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.Build.0 = Debug|x86
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Any CPU.Build.0 = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|x64.ActiveCfg = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|x86.ActiveCfg = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|x86.ActiveCfg = Release|x86
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Any CPU.Build.0 = Release|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -175,14 +179,14 @@ Global
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x64.ActiveCfg = Debug|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.ActiveCfg = Debug|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.Build.0 = Debug|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.ActiveCfg = Debug|x86
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.Build.0 = Debug|x86
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Any CPU.Build.0 = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.ActiveCfg = Release|x86
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.Build.0 = Release|x86
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|x64.ActiveCfg = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|x86.ActiveCfg = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|x86.ActiveCfg = Release|x86
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Any CPU.Build.0 = Release|Any CPU
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -272,14 +276,14 @@ Global
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x64.ActiveCfg = Debug|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.ActiveCfg = Debug|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.Build.0 = Debug|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.ActiveCfg = Debug|x86
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.Build.0 = Debug|x86
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Any CPU.Build.0 = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.ActiveCfg = Release|x86
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.Build.0 = Release|x86
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|x64.ActiveCfg = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|x86.ActiveCfg = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|x86.ActiveCfg = Release|x86
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Any CPU.Build.0 = Release|Any CPU
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -297,14 +301,14 @@ Global
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x64.ActiveCfg = Debug|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.ActiveCfg = Debug|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.Build.0 = Debug|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.ActiveCfg = Debug|x86
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.Build.0 = Debug|x86
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Any CPU.Build.0 = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|x64.ActiveCfg = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|x86.ActiveCfg = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|x86.ActiveCfg = Release|x86
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Any CPU.Build.0 = Release|Any CPU
{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -322,14 +326,14 @@ Global
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x64.ActiveCfg = Debug|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.ActiveCfg = Debug|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.Build.0 = Debug|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.ActiveCfg = Debug|x86
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.Build.0 = Debug|x86
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Any CPU.Build.0 = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|x64.ActiveCfg = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|x86.ActiveCfg = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|x86.ActiveCfg = Release|x86
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Any CPU.Build.0 = Release|Any CPU
{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -347,13 +351,13 @@ Global
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|x64.ActiveCfg = Debug|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|x86.ActiveCfg = Debug|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|x86.ActiveCfg = Debug|x86
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Any CPU.Build.0 = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|x64.ActiveCfg = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|x86.ActiveCfg = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|x86.ActiveCfg = Release|x86
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Release|Any CPU.Build.0 = Release|Any CPU
{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -419,14 +423,14 @@ Global
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x64.ActiveCfg = Debug|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.ActiveCfg = Debug|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.Build.0 = Debug|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.ActiveCfg = Debug|x86
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.Build.0 = Debug|x86
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Any CPU.Build.0 = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|x64.ActiveCfg = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|x86.ActiveCfg = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|x86.ActiveCfg = Release|x86
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Release|Any CPU.Build.0 = Release|Any CPU
{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@ -444,14 +448,14 @@ Global
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x64.ActiveCfg = Debug|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.ActiveCfg = Debug|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.Build.0 = Debug|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.ActiveCfg = Debug|x86
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.Build.0 = Debug|x86
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Any CPU.ActiveCfg = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Any CPU.Build.0 = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|x64.ActiveCfg = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|x86.ActiveCfg = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|x86.ActiveCfg = Release|x86
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Release|Any CPU.ActiveCfg = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Release|Any CPU.Build.0 = Release|Any CPU
{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU