Merge remote-tracking branch 'origin/7.0.0' into 7.0.0-pubcontent

Conflicts:
	src/Umbraco.Tests/TestHelpers/BaseWebTest.cs
	src/Umbraco.Web.UI/Umbraco/create/PartialView.ascx
	src/Umbraco.Web.UI/Umbraco/create/PartialView.ascx.designer.cs
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web.UI/umbraco/config/create/UI.xml
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/UmbracoHelper.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/create/DLRScripting.ascx
	src/Umbraco.Web/umbraco.presentation/umbraco/create/PartialViewTasks.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/create/xslt.ascx
This commit is contained in:
Stephan
2013-10-10 16:15:23 +02:00
255 changed files with 4350 additions and 1587 deletions

View File

@@ -21,7 +21,10 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "createDate")]
public DateTime CreateDate { get; set; }
[DataMember(Name = "published")]
public bool Published { get; set; }
[DataMember(Name = "owner")]
public UserBasic Owner { get; set; }

View File

@@ -23,6 +23,9 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "icon")]
public string Icon { get; set; }
[DataMember(Name = "key")]
public Guid Key { get; set; }
[DataMember(Name = "parentId", IsRequired = true)]
[Required]
public int ParentId { get; set; }

View File

@@ -1,4 +1,5 @@
using System.Runtime.Serialization;
using System;
using System.Runtime.Serialization;
using Umbraco.Core.Models;
namespace Umbraco.Web.Models.ContentEditing
@@ -16,5 +17,11 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "email")]
public string Email { get; set; }
/// <summary>
/// This is the unique Id stored in the database - but could also be the unique id for a custom membership provider
/// </summary>
[DataMember(Name = "key")]
public Guid Key { get; set; }
}
}

View File

@@ -0,0 +1,37 @@
using System.Runtime.Serialization;
namespace Umbraco.Web.Models.ContentEditing
{
/// <summary>
/// A model representing the data required to set a member/user password depending on the provider installed.
/// </summary>
public class MemberPassword
{
/// <summary>
/// The password value
/// </summary>
/// <remarks>
/// This
/// </remarks>
[DataMember(Name = "newPassword")]
public string NewPassword { get; set; }
/// <summary>
/// The old password - used to change a password when: EnablePasswordRetrieval = false
/// </summary>
[DataMember(Name = "oldPassword")]
public string OldPassword { get; set; }
/// <summary>
/// Set to true if the password is to be reset - only valid when: EnablePasswordReset = true
/// </summary>
[DataMember(Name = "reset")]
public bool? Reset { get; set; }
/// <summary>
/// The password answer - required for reset when: RequiresQuestionAndAnswer = true
/// </summary>
[DataMember(Name = "answer")]
public string Answer { get; set; }
}
}

View File

@@ -1,4 +1,5 @@
using System.Runtime.Serialization;
using Newtonsoft.Json.Linq;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Validation;
@@ -9,6 +10,11 @@ namespace Umbraco.Web.Models.ContentEditing
/// </summary>
public class MemberSave : ContentBaseItemSave<IMember>
{
public MemberSave()
{
Password = new MemberPassword();
}
[DataMember(Name = "username", IsRequired = true)]
[RequiredForPersistence(AllowEmptyStrings = false, ErrorMessage = "Required")]
public string Username { get; set; }
@@ -16,8 +22,8 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "email", IsRequired = true)]
[RequiredForPersistence(AllowEmptyStrings = false, ErrorMessage = "Required")]
public string Email { get; set; }
[DataMember(Name = "password")]
public string Password { get; set; }
[DataMember(Name = "password")]
public MemberPassword Password { get; set; }
}
}

View File

@@ -28,6 +28,7 @@ namespace Umbraco.Web.Models.Mapping
display.Alias = originalProp.Alias;
display.Description = originalProp.PropertyType.Description;
display.Label = originalProp.PropertyType.Name;
display.HideLabel = display.PropertyEditor.ValueEditor.HideLabel;
var dataTypeService = _dataTypeService.Value;

View File

@@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Mapping
{
var propertyDto = base.ConvertCore(originalProperty);
var dataTypeService = (DataTypeService)_dataTypeService.Value;
var dataTypeService = _dataTypeService.Value;
propertyDto.IsRequired = originalProperty.PropertyType.Mandatory;
propertyDto.ValidationRegExp = originalProperty.PropertyType.ValidationRegExp;

View File

@@ -1,4 +1,6 @@
using AutoMapper;
using System.Collections.Generic;
using System.Web.Security;
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
@@ -53,7 +55,9 @@ namespace Umbraco.Web.Models.Mapping
config.CreateMap<IMember, ContentItemDto<IMember>>()
.ForMember(
dto => dto.Owner,
expression => expression.ResolveUsing<OwnerResolver<IMember>>());
expression => expression.ResolveUsing<OwnerResolver<IMember>>())
//do no map the custom member properties (currently anyways, they were never there in 6.x)
.ForMember(dto => dto.Properties, expression => expression.ResolveUsing<MemberDtoPropertiesValueResolver>());
}
/// <summary>
@@ -63,6 +67,8 @@ namespace Umbraco.Web.Models.Mapping
/// <param name="display"></param>
private static void MapGenericCustomProperties(IMember member, MemberDisplay display)
{
var membershipProvider = Membership.Provider;
TabsAndPropertiesResolver.MapGenericProperties(
member, display,
new ContentPropertyDisplay
@@ -70,24 +76,53 @@ namespace Umbraco.Web.Models.Mapping
Alias = string.Format("{0}login", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
Label = ui.Text("login"),
Value = display.Username,
View = "textbox"
View = "textbox",
Config = new Dictionary<string, object> { { "IsRequired", true } }
},
new ContentPropertyDisplay
{
Alias = string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
Label = ui.Text("password"),
Value = "",
View = "changepassword" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
View = "changepassword",//TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
Config = new Dictionary<string, object>
{
//the password change toggle will only be displayed if there is already a password assigned.
{ "hasPassword", member.Password.IsNullOrWhiteSpace() == false },
{ "minPasswordLength", membershipProvider.MinRequiredPasswordLength },
{ "enableReset", membershipProvider.EnablePasswordReset },
{ "enablePasswordRetrieval" , membershipProvider.EnablePasswordRetrieval },
{ "requiresQuestionAnswer", membershipProvider.RequiresQuestionAndAnswer }
//TODO: Inject the other parameters in here to change the behavior of this control - based on the membership provider settings.
}
},
new ContentPropertyDisplay
{
Alias = string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
Label = ui.Text("general", "email"),
Value = display.Email,
View = "textbox"
View = "email",
Config = new Dictionary<string, object> {{"IsRequired", true}}
});
}
/// <summary>
/// This ensures that the custom membership provider properties are not mapped (currently since they weren't there in v6)
/// </summary>
/// <remarks>
/// Because these properties don't exist on the form, if we don't remove them for this map we'll get validation errors when posting data
/// </remarks>
internal class MemberDtoPropertiesValueResolver : ValueResolver<IMember, IEnumerable<ContentPropertyDto>>
{
protected override IEnumerable<ContentPropertyDto> ResolveCore(IMember source)
{
var exclude = Constants.Conventions.Member.StandardPropertyTypeStubs.Select(x => x.Value.Alias).ToArray();
return source.Properties
.Where(x => exclude.Contains(x.Alias) == false)
.Select(Mapper.Map<Property, ContentPropertyDto>);
}
}
}
}

View File

@@ -2,6 +2,7 @@
using Umbraco.Core;
using Umbraco.Core.Models.Mapping;
using Umbraco.Web.Models.ContentEditing;
using umbraco;
namespace Umbraco.Web.Models.Mapping
{
@@ -10,6 +11,9 @@ namespace Umbraco.Web.Models.Mapping
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
config.CreateMap<Section, Core.Models.Section>()
.ForMember(
dto => dto.Name,
expression => expression.MapFrom(section => ui.Text("sections", section.Alias)))
.ReverseMap(); //backwards too!
}
}

View File

@@ -41,9 +41,9 @@ namespace Umbraco.Web.Models.Mapping
/// setting up the properties such as Created date, udpated date, template selected, etc...
/// </remarks>
public static void MapGenericProperties<TPersisted>(
TPersisted content,
TPersisted content,
ContentItemDisplayBase<ContentPropertyDisplay, TPersisted> display,
params ContentPropertyDisplay[] customProperties)
params ContentPropertyDisplay[] customProperties)
where TPersisted : IContentBase
{
@@ -105,6 +105,7 @@ namespace Umbraco.Web.Models.Mapping
//re-assign
genericProps.Properties = contentProps;
}
protected override IEnumerable<Tab<ContentPropertyDisplay>> ResolveCore(IContentBase content)
@@ -141,7 +142,7 @@ namespace Umbraco.Web.Models.Mapping
{
Id = rootGroup.Id,
Alias = rootGroup.Name,
Label = rootGroup.Name,
Label = TranslateTab(rootGroup.Name),
Properties = aggregateProperties,
IsActive = false
});
@@ -155,16 +156,45 @@ namespace Umbraco.Web.Models.Mapping
aggregateTabs.Add(new Tab<ContentPropertyDisplay>
{
Id = 0,
Label = "Generic properties",
Label = ui.Text("general", "properties"),
Alias = "Generic properties",
Properties = Mapper.Map<IEnumerable<Property>, IEnumerable<ContentPropertyDisplay>>(orphanProperties)
});
//set the first tab to active
aggregateTabs.First().IsActive = true;
return aggregateTabs;
}
private string TranslateTab(string tabName)
{
if (!tabName.StartsWith("#"))
return tabName;
return tabName.Substring(1);
/*
* The below currently doesnt work on my machine, since the dictonary always creates an entry with lang id = 0, but I dont have a lang id zero
* so the query always fails, which is odd
*
var local = ApplicationContext.Current.Services.LocalizationService;
var dic = local.GetDictionaryItemByKey(tabName);
if (dic == null || !dic.Translations.Any())
return tabName;
var lang = local.GetLanguageByCultureCode(UmbracoContext.Current.Security.CurrentUser.Language);
if (lang == null)
return tabName;
var translation = dic.Translations.Where(x => x.Language == lang).FirstOrDefault();
if (translation == null)
return tabName;
return translation.Value;*/
}
}
}

View File

@@ -1,63 +0,0 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Umbraco.Web.Models
{
/// <summary>
/// Represents a paged result for a model collection
/// </summary>
/// <typeparam name="T"></typeparam>
[DataContract(Name = "pagedCollection", Namespace = "")]
public class PagedResult<T>
{
public PagedResult(long totalItems, long pageNumber, long pageSize)
{
TotalItems = totalItems;
PageNumber = pageNumber;
PageSize = pageSize;
if (pageSize > 0)
{
TotalPages = (long) Math.Ceiling(totalItems/(Decimal) pageSize);
}
else
{
TotalPages = 1;
}
}
[DataMember(Name = "pageNumber")]
public long PageNumber { get; private set; }
[DataMember(Name = "pageSize")]
public long PageSize { get; private set; }
[DataMember(Name = "totalPages")]
public long TotalPages { get; private set; }
[DataMember(Name = "totalItems")]
public long TotalItems { get; private set; }
[DataMember(Name = "items")]
public IEnumerable<T> Items { get; set; }
/// <summary>
/// Calculates the skip size based on the paged parameters specified
/// </summary>
/// <remarks>
/// Returns 0 if the page number or page size is zero
/// </remarks>
internal int SkipSize
{
get
{
if (PageNumber > 0 && PageSize > 0)
{
return Convert.ToInt32((PageNumber - 1)*PageSize);
}
return 0;
}
}
}
}