Removed AccountModel.

Download Settings updated to use Descriptions.
pull/4/head
Mark McDowall 13 years ago
parent ff0e0597b4
commit 72d3f5cef2

@ -0,0 +1,87 @@
<Configuration>
<CodeStyleSettings>
<ExternalPath IsNull="False">
</ExternalPath>
<Sharing>SOLUTION</Sharing>
<CSS>
<FormatSettings />
<Naming2 />
</CSS>
<CSharp>
<FormatSettings>
<MODIFIERS_ORDER IsNull="False">
<Item>public</Item>
<Item>protected</Item>
<Item>internal</Item>
<Item>private</Item>
<Item>new</Item>
<Item>abstract</Item>
<Item>virtual</Item>
<Item>override</Item>
<Item>sealed</Item>
<Item>static</Item>
<Item>readonly</Item>
<Item>extern</Item>
<Item>unsafe</Item>
<Item>volatile</Item>
</MODIFIERS_ORDER>
</FormatSettings>
<UsingsSettings />
<Naming2>
<EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
<EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
</Naming2>
</CSharp>
<JavaScript>
<FormatSettings />
<Naming2>
<UserRule Name="JS_LOCAL_VARIABLE" Inspect="True" Prefix="" Suffix="" Style="aaBb" />
<UserRule Name="JS_FUNCTION" Inspect="True" Prefix="" Suffix="" Style="aaBb" />
<UserRule Name="JS_PARAMETER" Inspect="True" Prefix="" Suffix="" Style="aaBb" />
<UserRule Name="JS_LABEL" Inspect="True" Prefix="" Suffix="" Style="aaBb" />
<UserRule Name="JS_GLOBAL_VARIABLE" Inspect="True" Prefix="" Suffix="" Style="AaBb" />
<UserRule Name="JS_OBJECT_PROPERTY_OF_FUNCTION" Inspect="True" Prefix="" Suffix="" Style="aaBb" />
<UserRule Name="JS_CONSTRUCTOR" Inspect="True" Prefix="" Suffix="" Style="AaBb" />
</Naming2>
</JavaScript>
<VB>
<FormatSettings />
<ImportsSettings />
<Naming2>
<EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
<EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
</Naming2>
</VB>
<Web>
<Naming2 />
</Web>
<XML>
<FormatSettings />
</XML>
<Xaml>
<Naming2 />
</Xaml>
<GenerateMemberBody />
<Naming2>
<EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
<EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
<PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
<PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
<PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PublicFields" />
<PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
<PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
<PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
<Abbreviation Text="IIS" />
</Naming2>
</CodeStyleSettings>
</Configuration>

@ -190,9 +190,9 @@ hr
/* Config Pages */
.config-section
{
width: 550px;
width: 650px;
height: 45px;
display: block;
padding-bottom: 25px;
}
.config-group
@ -200,6 +200,15 @@ hr
width: 300px;
display: block;
float: left;
height: 20px;
}
.config-group2
{
width: 300px;
display: block;
float: right;
height: 20px;
}
.config-title
@ -217,7 +226,11 @@ hr
.config-validation
{
color: Red;
float: right;
}
.config-description
{
}
.sub-field
@ -227,7 +240,15 @@ hr
margin-bottom: 10px;
}
.config-value
{
float: right;
}
.config-checkbox
{
margin-right: 135px;
}
button, input[type="button"], input[type="submit"], input[type="reset"]
{

@ -1,299 +0,0 @@
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Web.Security;
namespace NzbDrone.Web.Models
{
#region Models
[PropertiesMustMatch("NewPassword", "ConfirmPassword",
ErrorMessage = "The new password and confirmation password do not match.")]
public class ChangePasswordModel
{
[Required]
[DataType(DataType.Password)]
[DisplayName("Current password")]
public string OldPassword { get; set; }
[Required]
[ValidatePasswordLength]
[DataType(DataType.Password)]
[DisplayName("New password")]
public string NewPassword { get; set; }
[Required]
[DataType(DataType.Password)]
[DisplayName("Confirm new password")]
public string ConfirmPassword { get; set; }
}
public class LogOnModel
{
[Required]
[DisplayName("User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[DisplayName("Password")]
public string Password { get; set; }
[DisplayName("Remember me?")]
public bool RememberMe { get; set; }
}
[PropertiesMustMatch("Password", "ConfirmPassword",
ErrorMessage = "The password and confirmation password do not match.")]
public class RegisterModel
{
[Required]
[DisplayName("User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[DisplayName("Email address")]
public string Email { get; set; }
[Required]
[ValidatePasswordLength]
[DataType(DataType.Password)]
[DisplayName("Password")]
public string Password { get; set; }
[Required]
[DataType(DataType.Password)]
[DisplayName("Confirm password")]
public string ConfirmPassword { get; set; }
}
#endregion
#region Services
// The FormsAuthentication type is sealed and contains static members, so it is difficult to
// unit test code that calls its members. The interface and helper class below demonstrate
// how to create an abstract wrapper around such a type in order to make the AccountController
// code unit testable.
public interface IMembershipService
{
int MinPasswordLength { get; }
bool ValidateUser(string userName, string password);
MembershipCreateStatus CreateUser(string userName, string password, string email);
bool ChangePassword(string userName, string oldPassword, string newPassword);
}
public class AccountMembershipService : IMembershipService
{
private readonly MembershipProvider _provider;
public AccountMembershipService()
: this(null)
{
}
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}
#region IMembershipService Members
public int MinPasswordLength
{
get { return _provider.MinRequiredPasswordLength; }
}
public bool ValidateUser(string userName, string password)
{
if (String.IsNullOrEmpty(userName))
throw new ArgumentException("Value cannot be null or empty.", "userName");
if (String.IsNullOrEmpty(password))
throw new ArgumentException("Value cannot be null or empty.", "password");
return _provider.ValidateUser(userName, password);
}
public MembershipCreateStatus CreateUser(string userName, string password, string email)
{
if (String.IsNullOrEmpty(userName))
throw new ArgumentException("Value cannot be null or empty.", "userName");
if (String.IsNullOrEmpty(password))
throw new ArgumentException("Value cannot be null or empty.", "password");
if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");
MembershipCreateStatus status;
_provider.CreateUser(userName, password, email, null, null, true, null, out status);
return status;
}
public bool ChangePassword(string userName, string oldPassword, string newPassword)
{
if (String.IsNullOrEmpty(userName))
throw new ArgumentException("Value cannot be null or empty.", "userName");
if (String.IsNullOrEmpty(oldPassword))
throw new ArgumentException("Value cannot be null or empty.", "oldPassword");
if (String.IsNullOrEmpty(newPassword))
throw new ArgumentException("Value cannot be null or empty.", "newPassword");
// The underlying ChangePassword() will throw an exception rather
// than return false in certain failure scenarios.
try
{
MembershipUser currentUser = _provider.GetUser(userName, true /* userIsOnline */);
return currentUser.ChangePassword(oldPassword, newPassword);
}
catch (ArgumentException)
{
return false;
}
catch (MembershipPasswordException)
{
return false;
}
}
#endregion
}
public interface IFormsAuthenticationService
{
void SignIn(string userName, bool createPersistentCookie);
void SignOut();
}
public class FormsAuthenticationService : IFormsAuthenticationService
{
#region IFormsAuthenticationService Members
public void SignIn(string userName, bool createPersistentCookie)
{
if (String.IsNullOrEmpty(userName))
throw new ArgumentException("Value cannot be null or empty.", "userName");
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
}
public void SignOut()
{
FormsAuthentication.SignOut();
}
#endregion
}
#endregion
#region Validation
public static class AccountValidation
{
public static string ErrorCodeToString(MembershipCreateStatus createStatus)
{
// See http://go.microsoft.com/fwlink/?LinkID=177550 for
// a full list of status codes.
switch (createStatus)
{
case MembershipCreateStatus.DuplicateUserName:
return "Username already exists. Please enter a different user name.";
case MembershipCreateStatus.DuplicateEmail:
return "A username for that e-mail address already exists. Please enter a different e-mail address.";
case MembershipCreateStatus.InvalidPassword:
return "The password provided is invalid. Please enter a valid password value.";
case MembershipCreateStatus.InvalidEmail:
return "The e-mail address provided is invalid. Please check the value and try again.";
case MembershipCreateStatus.InvalidAnswer:
return "The password retrieval answer provided is invalid. Please check the value and try again.";
case MembershipCreateStatus.InvalidQuestion:
return "The password retrieval question provided is invalid. Please check the value and try again.";
case MembershipCreateStatus.InvalidUserName:
return "The user name provided is invalid. Please check the value and try again.";
case MembershipCreateStatus.ProviderError:
return
"The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator.";
case MembershipCreateStatus.UserRejected:
return
"The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator.";
default:
return
"An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator.";
}
}
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class PropertiesMustMatchAttribute : ValidationAttribute
{
private const string _defaultErrorMessage = "'{0}' and '{1}' do not match.";
private readonly object _typeId = new object();
public PropertiesMustMatchAttribute(string originalProperty, string confirmProperty)
: base(_defaultErrorMessage)
{
OriginalProperty = originalProperty;
ConfirmProperty = confirmProperty;
}
public string ConfirmProperty { get; private set; }
public string OriginalProperty { get; private set; }
public override object TypeId
{
get { return _typeId; }
}
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
OriginalProperty, ConfirmProperty);
}
public override bool IsValid(object value)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value);
object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value);
return Equals(originalValue, confirmValue);
}
}
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class ValidatePasswordLengthAttribute : ValidationAttribute
{
private const string _defaultErrorMessage = "'{0}' must be at least {1} characters long.";
private readonly int _minCharacters = Membership.Provider.MinRequiredPasswordLength;
public ValidatePasswordLengthAttribute()
: base(_defaultErrorMessage)
{
}
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
name, _minCharacters);
}
public override bool IsValid(object value)
{
string valueAsString = value as string;
return (valueAsString != null && valueAsString.Length >= _minCharacters);
}
}
#endregion
}

@ -15,56 +15,68 @@ namespace NzbDrone.Web.Models
[Range(15, 120, ErrorMessage = "Must be between 15 and 120 minutes")]
[DataType(DataType.Text)]
[DisplayName("Sync Frequency")]
[Description("Specifies how often NzbDrone should check RSS Feeds (Minutes)")]
public int SyncFrequency { get; set; }
[DisplayName("Download Propers")]
[Description("Should NzbDrone download proper releases (to replace non-proper files)?")]
public bool DownloadPropers { get; set; }
[Required(ErrorMessage = "Please enter a valid number")]
[DataType(DataType.Text)]
[DisplayName("Retention")]
[Description("Your newsgroup provider retention (Days)")]
public int Retention { get; set; }
[Required(ErrorMessage = "Please enter a valid host")]
[DataType(DataType.Text)]
[DisplayName("SABnzbd Host")]
[Description("Hostname or IP Address running SABnzbd")]
public String SabHost { get; set; }
[Required(ErrorMessage = "Please enter a valid port")]
[DataType(DataType.Text)]
[DisplayName("SABnzbd Port")]
[Description("Port for SABnzbd web interface")]
public int SabPort { get; set; }
[DataType(DataType.Text)]
[DisplayName("SABnzbd API Key")]
[Description("API Key for SABNzbd, Found in Config: General")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public String SabApiKey { get; set; }
[DataType(DataType.Text)]
[DisplayName("SABnzbd Username")]
[Description("Username for SABnzbd WebUI (Not Required when using APIKey)")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public String SabUsername { get; set; }
[DataType(DataType.Text)]
[DisplayName("SABnzbd Password")]
[Description("Password for SABnzbd WebUI (Not required when using APIKey)")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public String SabPassword { get; set; }
[DataType(DataType.Text)]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[DisplayName("SABnzbd TV Category")]
[Description("Category to use when sending NZBs to SABnzbd")]
public String SabTvCategory { get; set; }
[Required(ErrorMessage = "Please select a valid priority")]
[DisplayName("SABnzbd Priority")]
[Description("Priority to use when sending NZBs to SABnzbd")]
public SabnzbdPriorityType SabTvPriority { get; set; }
[DisplayName("Use Blackhole")]
[Description("Whether to use the blackhole directory instead of sending NZB to SABnzbd")]
public bool UseBlackHole { get; set; }
[DataType(DataType.Text)]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[DisplayName("Blackhole Directory")]
[Description("Path to the blackhole directory")]
public String BlackholeDirectory { get; set; }
}
}

@ -227,7 +227,6 @@
<Compile Include="Helpers\DescriptionExtension.cs" />
<Compile Include="Helpers\HtmlPrefixScopeExtensions.cs" />
<Compile Include="Helpers\IsCurrentActionHelper.cs" />
<Compile Include="Models\AccountModels.cs" />
<Compile Include="Models\AddExistingManualModel.cs" />
<Compile Include="Models\AddExistingSeriesModel.cs" />
<Compile Include="Models\AddNewSeriesModel.cs" />

@ -1,4 +1,5 @@
@model NzbDrone.Web.Models.DownloadSettingsModel
@using NzbDrone.Web.Helpers;
@model NzbDrone.Web.Models.DownloadSettingsModel
<script type="text/javascript">
$(document).ready(function () {
@ -54,7 +55,6 @@
@using (Html.BeginForm("SaveDownloads", "Settings", FormMethod.Post, new { id = "form", name = "form" }))
{
<fieldset>
<legend>Download Settings</legend>
@ -66,16 +66,21 @@
<div class="config-title">@Html.LabelFor(m => m.SyncFrequency)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SyncFrequency)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SyncFrequency)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SyncFrequency)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SyncFrequency)</div>
</div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title">@Html.LabelFor(m => m.DownloadPropers)</div>
<div class="config-value">@Html.CheckBoxFor(m => m.DownloadPropers)</div>
<div class="config-value">@Html.CheckBoxFor(m => m.DownloadPropers, new { @class = "config-checkbox" })</div>
</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.DownloadPropers)</div>
<div class="config-description">@Html.DescriptionFor(m => m.DownloadPropers)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.DownloadPropers)</div>
</div>
<div class="config-section">
@ -83,8 +88,12 @@
<div class="config-title">@Html.LabelFor(m => m.Retention)</div>
<div class="config-value">@Html.TextBoxFor(m => m.Retention)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.Retention)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.Retention)</div>
<div class="config-description">@Html.DescriptionFor(m => m.Retention)</div>
</div>
</div>
</fieldset>
<div>
@ -104,14 +113,17 @@
<fieldset class="sub-field">
<legend>SABnzbd</legend>
<button type="button" onclick="autoConfigureSab()">Auto-Configure</button>
@*<button type="button" onclick="autoConfigureSab()">Auto-Configure</button>*@
<div class="config-section">
<div class="config-group">
<div class="config-title">@Html.LabelFor(m => m.SabHost)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SabHost)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabHost)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabHost)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SabHost)</div>
</div>
</div>
<div class="config-section">
@ -119,7 +131,10 @@
<div class="config-title">@Html.LabelFor(m => m.SabPort)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SabPort)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabPort)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabPort)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SabPort)</div>
</div>
</div>
<div class="config-section">
@ -127,7 +142,10 @@
<div class="config-title">@Html.LabelFor(m => m.SabApiKey)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SabApiKey)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabApiKey)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabApiKey)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SabApiKey)</div>
</div>
</div>
<div class="config-section">
@ -135,7 +153,10 @@
<div class="config-title">@Html.LabelFor(m => m.SabUsername)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SabUsername)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabUsername)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabUsername)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SabUsername)</div>
</div>
</div>
<div class="config-section">
@ -143,15 +164,21 @@
<div class="config-title">@Html.LabelFor(m => m.SabPassword)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SabPassword)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabPassword)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabPassword)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SabPassword)</div>
</div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title">@Html.LabelFor(m => m.SabTvCategory)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SabTvCategory)</div>
<div class="config-value">@Html.TextBoxFor(m => m.SabTvPriority)</div>
</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabTvPriority)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SabTvPriority)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabTvCategory)</div>
</div>
<div class="config-section">
@ -159,7 +186,10 @@
<div class="config-title">@Html.LabelFor(m => m.SabTvPriority)</div>
<div class="config-value">@Html.DropDownListFor(m => m.SabTvPriority, Model.PrioritySelectList)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabTvPriority)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabTvPriority)</div>
<div class="config-description">@Html.DescriptionFor(m => m.SabTvPriority)</div>
</div>
</div>
</fieldset>
</div>
@ -172,14 +202,17 @@
<div class="config-title">@Html.LabelFor(m => m.BlackholeDirectory)</div>
<div class="config-value">@Html.TextBoxFor(m => m.BlackholeDirectory)</div>
</div>
<div class="config-validation">@Html.ValidationMessageFor(m => m.BlackholeDirectory)</div>
<div class="config-group2">
<div class="config-validation">@Html.ValidationMessageFor(m => m.BlackholeDirectory)</div>
<div class="config-description">@Html.DescriptionFor(m => m.BlackholeDirectory)</div>
</div>
</div>
</fieldset>
</div>
<input type="submit" id="save_button" value="Save" disabled="disabled" />
</fieldset>
}

Loading…
Cancel
Save