Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 52dce66598 | |||
| acf10eeef0 | |||
| 759e444624 | |||
| a68f4e284a | |||
| d554417fde | |||
| eedcfc122b | |||
| 8cf3110708 | |||
| dbe489c0f2 | |||
| a7e28a97d9 | |||
| ade3c4ee6c | |||
| 7da7c1e5a1 | |||
| 55098deac0 | |||
| 58c5618d30 | |||
| d0cbeb4a0a | |||
| a8914dcfdb | |||
| 73e219b23c | |||
| 07e0de5824 | |||
| a3c7b1fcfe | |||
| 02785eea42 | |||
| 49f3979d18 | |||
| 32d757b13c | |||
| 86b2dac231 | |||
| 2f67a485aa | |||
| f192f241cf | |||
| ca1f43d048 | |||
| e962a48138 |
@@ -28,17 +28,17 @@
|
||||
<dependency id="MySql.Data" version="[6.9.8, 7.0.0)" />
|
||||
<dependency id="xmlrpcnet" version="[2.5.0, 3.0.0)" />
|
||||
<dependency id="ClientDependency" version="[1.9.2, 2.0.0)" />
|
||||
<dependency id="ClientDependency-Mvc5" version="[1.8.0, 2.0.0)" />
|
||||
<dependency id="ClientDependency-Mvc5" version="[1.8.0.0, 2.0.0)" />
|
||||
<!-- AutoMapper can not be updated due to: https://github.com/AutoMapper/AutoMapper/issues/373#issuecomment-127644405 -->
|
||||
<dependency id="AutoMapper" version="[3.3.1, 4.0.0)" />
|
||||
<dependency id="Newtonsoft.Json" version="[6.0.8, 10.0.0)" />
|
||||
<dependency id="Examine" version="[0.1.80, 1.0.0)" />
|
||||
<dependency id="Examine" version="[0.1.81, 1.0.0)" />
|
||||
<dependency id="ImageProcessor" version="[2.5.2, 3.0.0)" />
|
||||
<dependency id="ImageProcessor.Web" version="[4.8.2, 5.0.0)" />
|
||||
<dependency id="semver" version="[1.1.2, 2.0.0)" />
|
||||
<dependency id="UrlRewritingNet" version="[2.0.7, 3.0.0)" />
|
||||
<!-- Markdown can not be updated due to: https://github.com/hey-red/markdownsharp/issues/71#issuecomment-233585487 -->
|
||||
<dependency id="Markdown" version="[1.14.4, 2.0.0)" />
|
||||
<dependency id="Markdown" version="[1.14.7, 2.0.0)" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
|
||||
7.5.9
|
||||
7.5.10
|
||||
+2
-2
@@ -11,5 +11,5 @@ using System.Resources;
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
[assembly: AssemblyFileVersion("7.5.9")]
|
||||
[assembly: AssemblyInformationalVersion("7.5.9")]
|
||||
[assembly: AssemblyFileVersion("7.5.10")]
|
||||
[assembly: AssemblyInformationalVersion("7.5.10")]
|
||||
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
public class UmbracoVersion
|
||||
{
|
||||
private static readonly Version Version = new Version("7.5.9");
|
||||
private static readonly Version Version = new Version("7.5.10");
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current version of Umbraco.
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Umbraco.Core.Models.Identity
|
||||
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
|
||||
{
|
||||
config.CreateMap<IUser, BackOfficeIdentityUser>()
|
||||
.ForMember(user => user.LastLoginDateUtc, expression => expression.MapFrom(user => user.LastLoginDate.ToUniversalTime()))
|
||||
.ForMember(user => user.Email, expression => expression.MapFrom(user => user.Email))
|
||||
.ForMember(user => user.Id, expression => expression.MapFrom(user => user.Id))
|
||||
.ForMember(user => user.LockoutEndDateUtc, expression => expression.MapFrom(user => user.IsLockedOut ? DateTime.MaxValue.ToUniversalTime() : (DateTime?)null))
|
||||
|
||||
@@ -24,12 +24,17 @@ namespace Umbraco.Core.Models.Identity
|
||||
///
|
||||
/// </summary>
|
||||
public IdentityUser()
|
||||
{
|
||||
{
|
||||
this.Claims = new List<TClaim>();
|
||||
this.Roles = new List<TRole>();
|
||||
this.Logins = new List<TLogin>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Last login date
|
||||
/// </summary>
|
||||
public virtual DateTime? LastLoginDateUtc { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Email
|
||||
///
|
||||
|
||||
@@ -106,12 +106,13 @@ namespace Umbraco.Core.Models.PublishedContent
|
||||
/// <param name="propertyTypeAlias">The property type alias.</param>
|
||||
/// <param name="dataTypeDefinitionId">The datatype definition identifier.</param>
|
||||
/// <param name="propertyEditorAlias">The property editor alias.</param>
|
||||
/// <param name="initConverters">Generally used only for testing, in production this will always be true</param>
|
||||
/// <remarks>
|
||||
/// <para>The new published property type does not belong to a published content type.</para>
|
||||
/// <para>The values of <paramref name="dataTypeDefinitionId"/> and <paramref name="propertyEditorAlias"/> are
|
||||
/// assumed to be valid and consistent.</para>
|
||||
/// </remarks>
|
||||
internal PublishedPropertyType(string propertyTypeAlias, int dataTypeDefinitionId, string propertyEditorAlias)
|
||||
internal PublishedPropertyType(string propertyTypeAlias, int dataTypeDefinitionId, string propertyEditorAlias, bool initConverters = true)
|
||||
{
|
||||
// ContentType
|
||||
// - in unit tests, to be set by PublishedContentType when creating it
|
||||
@@ -122,7 +123,8 @@ namespace Umbraco.Core.Models.PublishedContent
|
||||
DataTypeId = dataTypeDefinitionId;
|
||||
PropertyEditorAlias = propertyEditorAlias;
|
||||
|
||||
InitializeConverters();
|
||||
if (initConverters)
|
||||
InitializeConverters();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -27,7 +27,20 @@ namespace Umbraco.Core.Persistence.Factories
|
||||
|
||||
#region Implementation of IEntityFactory<IContent,DocumentDto>
|
||||
|
||||
public static IContent BuildEntity(DocumentDto dto, IContentType contentType)
|
||||
/// <summary>
|
||||
/// Builds a IContent item from the dto(s) and content type
|
||||
/// </summary>
|
||||
/// <param name="dto">
|
||||
/// This DTO can contain all of the information to build an IContent item, however in cases where multiple entities are being built,
|
||||
/// a separate <see cref="DocumentPublishedReadOnlyDto"/> publishedDto entity will be supplied in place of the <see cref="DocumentDto"/>'s own
|
||||
/// ResultColumn DocumentPublishedReadOnlyDto
|
||||
/// </param>
|
||||
/// <param name="contentType"></param>
|
||||
/// <param name="publishedDto">
|
||||
/// When querying for multiple content items the main DTO will not contain the ResultColumn DocumentPublishedReadOnlyDto and a separate publishedDto instance will be supplied
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public static IContent BuildEntity(DocumentDto dto, IContentType contentType, DocumentPublishedReadOnlyDto publishedDto = null)
|
||||
{
|
||||
var content = new Content(dto.Text, dto.ContentVersionDto.ContentDto.NodeDto.ParentId, contentType);
|
||||
|
||||
@@ -52,8 +65,13 @@ namespace Umbraco.Core.Persistence.Factories
|
||||
content.ExpireDate = dto.ExpiresDate.HasValue ? dto.ExpiresDate.Value : (DateTime?)null;
|
||||
content.ReleaseDate = dto.ReleaseDate.HasValue ? dto.ReleaseDate.Value : (DateTime?)null;
|
||||
content.Version = dto.ContentVersionDto.VersionId;
|
||||
|
||||
content.PublishedState = dto.Published ? PublishedState.Published : PublishedState.Unpublished;
|
||||
content.PublishedVersionGuid = dto.DocumentPublishedReadOnlyDto == null ? default(Guid) : dto.DocumentPublishedReadOnlyDto.VersionId;
|
||||
|
||||
//Check if the publishedDto has been supplied, if not the use the dto's own DocumentPublishedReadOnlyDto value
|
||||
content.PublishedVersionGuid = publishedDto == null
|
||||
? (dto.DocumentPublishedReadOnlyDto == null ? default(Guid) : dto.DocumentPublishedReadOnlyDto.VersionId)
|
||||
: publishedDto.VersionId;
|
||||
|
||||
//on initial construction we don't want to have dirty properties tracked
|
||||
// http://issues.umbraco.org/issue/U4-1946
|
||||
|
||||
@@ -2,8 +2,30 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
internal enum BaseQueryType
|
||||
{
|
||||
Full,
|
||||
/// <summary>
|
||||
/// A query to return all information for a single item
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// In some cases this will be the same as <see cref="FullMultiple"/>
|
||||
/// </remarks>
|
||||
FullSingle,
|
||||
|
||||
/// <summary>
|
||||
/// A query to return all information for multiple items
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// In some cases this will be the same as <see cref="FullSingle"/>
|
||||
/// </remarks>
|
||||
FullMultiple,
|
||||
|
||||
/// <summary>
|
||||
/// A query to return the ids for items
|
||||
/// </summary>
|
||||
Ids,
|
||||
|
||||
/// <summary>
|
||||
/// A query to return the count for items
|
||||
/// </summary>
|
||||
Count
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
@@ -53,7 +54,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
protected override IContent PerformGet(int id)
|
||||
{
|
||||
var sql = GetBaseQuery(false)
|
||||
var sql = GetBaseQuery(BaseQueryType.FullSingle)
|
||||
.Where(GetBaseWhereClause(), new { Id = id })
|
||||
.Where<DocumentDto>(x => x.Newest, SqlSyntax)
|
||||
.OrderByDescending<ContentVersionDto>(x => x.VersionDate, SqlSyntax);
|
||||
@@ -81,15 +82,15 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
return s;
|
||||
};
|
||||
|
||||
var sqlBaseFull = GetBaseQuery(BaseQueryType.Full);
|
||||
var sqlBaseFull = GetBaseQuery(BaseQueryType.FullMultiple);
|
||||
var sqlBaseIds = GetBaseQuery(BaseQueryType.Ids);
|
||||
|
||||
return ProcessQuery(translate(sqlBaseFull), translate(sqlBaseIds));
|
||||
return ProcessQuery(translate(sqlBaseFull), new PagingSqlQuery(translate(sqlBaseIds)));
|
||||
}
|
||||
|
||||
protected override IEnumerable<IContent> PerformGetByQuery(IQuery<IContent> query)
|
||||
{
|
||||
var sqlBaseFull = GetBaseQuery(BaseQueryType.Full);
|
||||
var sqlBaseFull = GetBaseQuery(BaseQueryType.FullMultiple);
|
||||
var sqlBaseIds = GetBaseQuery(BaseQueryType.Ids);
|
||||
|
||||
Func<SqlTranslator<IContent>, Sql> translate = (translator) =>
|
||||
@@ -103,13 +104,25 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var translatorFull = new SqlTranslator<IContent>(sqlBaseFull, query);
|
||||
var translatorIds = new SqlTranslator<IContent>(sqlBaseIds, query);
|
||||
|
||||
return ProcessQuery(translate(translatorFull), translate(translatorIds));
|
||||
return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds)));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Overrides of PetaPocoRepositoryBase<IContent>
|
||||
|
||||
/// <summary>
|
||||
/// Returns the base query to return Content
|
||||
/// </summary>
|
||||
/// <param name="queryType"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// Content queries will differ depending on what needs to be returned:
|
||||
/// * FullSingle: When querying for a single document, this will include the Outer join to fetch the content item's published version info
|
||||
/// * FullMultiple: When querying for multiple documents, this will exclude the Outer join to fetch the content item's published version info - this info would need to be fetched separately
|
||||
/// * Ids: This would essentially be the same as FullMultiple however the columns specified will only return the Ids for the documents
|
||||
/// * Count: A query to return the count for documents
|
||||
/// </remarks>
|
||||
protected override Sql GetBaseQuery(BaseQueryType queryType)
|
||||
{
|
||||
var sql = new Sql();
|
||||
@@ -122,14 +135,14 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
.InnerJoin<NodeDto>(SqlSyntax)
|
||||
.On<ContentDto, NodeDto>(SqlSyntax, left => left.NodeId, right => right.NodeId);
|
||||
|
||||
if (queryType == BaseQueryType.Full)
|
||||
if (queryType == BaseQueryType.FullSingle)
|
||||
{
|
||||
//The only reason we apply this left outer join is to be able to pull back the DocumentPublishedReadOnlyDto
|
||||
//information with the entire data set, so basically this will get both the latest document and also it's published
|
||||
//version if it has one. When performing a count or when just retrieving Ids like in paging, this is unecessary
|
||||
//version if it has one. When performing a count or when retrieving Ids like in paging, this is unecessary
|
||||
//and causes huge performance overhead for the SQL server, especially when sorting the result.
|
||||
//To fix this perf overhead we'd need another index on :
|
||||
// CREATE NON CLUSTERED INDEX ON cmsDocument.node + cmsDocument.published
|
||||
//We also don't include this outer join when querying for multiple entities since it is much faster to fetch this information
|
||||
//in a separate query. For a single entity this is ok.
|
||||
|
||||
var sqlx = string.Format("LEFT OUTER JOIN {0} {1} ON ({1}.{2}={0}.{2} AND {1}.{3}=1)",
|
||||
SqlSyntax.GetQuotedTableName("cmsDocument"),
|
||||
@@ -151,7 +164,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
protected override Sql GetBaseQuery(bool isCount)
|
||||
{
|
||||
return GetBaseQuery(isCount ? BaseQueryType.Count : BaseQueryType.Full);
|
||||
return GetBaseQuery(isCount ? BaseQueryType.Count : BaseQueryType.FullSingle);
|
||||
}
|
||||
|
||||
protected override string GetBaseWhereClause()
|
||||
@@ -222,10 +235,10 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
while (true)
|
||||
{
|
||||
// get the next group of nodes
|
||||
var sqlFull = translate(baseId, GetBaseQuery(BaseQueryType.Full));
|
||||
var sqlFull = translate(baseId, GetBaseQuery(BaseQueryType.FullMultiple));
|
||||
var sqlIds = translate(baseId, GetBaseQuery(BaseQueryType.Ids));
|
||||
|
||||
var xmlItems = ProcessQuery(SqlSyntax.SelectTop(sqlFull, groupSize), SqlSyntax.SelectTop(sqlIds, groupSize))
|
||||
var xmlItems = ProcessQuery(SqlSyntax.SelectTop(sqlFull, groupSize), new PagingSqlQuery(SqlSyntax.SelectTop(sqlIds, groupSize)))
|
||||
.Select(x => new ContentXmlDto { NodeId = x.Id, Xml = serializer(x).ToString() })
|
||||
.ToList();
|
||||
|
||||
@@ -245,7 +258,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
Logger.Error<MediaRepository>("Could not rebuild XML for nodeId=" + xmlItem.NodeId, e);
|
||||
}
|
||||
}
|
||||
baseId = xmlItems.Last().NodeId;
|
||||
baseId = xmlItems[xmlItems.Count - 1].NodeId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,15 +270,15 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
.OrderByDescending<ContentVersionDto>(x => x.VersionDate, SqlSyntax);
|
||||
};
|
||||
|
||||
var sqlFull = translate(GetBaseQuery(BaseQueryType.Full));
|
||||
var sqlFull = translate(GetBaseQuery(BaseQueryType.FullMultiple));
|
||||
var sqlIds = translate(GetBaseQuery(BaseQueryType.Ids));
|
||||
|
||||
return ProcessQuery(sqlFull, sqlIds, true);
|
||||
return ProcessQuery(sqlFull, new PagingSqlQuery(sqlIds), true);
|
||||
}
|
||||
|
||||
public override IContent GetByVersion(Guid versionId)
|
||||
{
|
||||
var sql = GetBaseQuery(false);
|
||||
var sql = GetBaseQuery(BaseQueryType.FullSingle);
|
||||
sql.Where("cmsContentVersion.VersionId = @VersionId", new { VersionId = versionId });
|
||||
sql.OrderByDescending<ContentVersionDto>(x => x.VersionDate, SqlSyntax);
|
||||
|
||||
@@ -674,12 +687,12 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
// ORDER BY substring(path, 1, len(path) - charindex(',', reverse(path))), sortOrder
|
||||
// but that's probably an overkill - sorting by level,sortOrder should be enough
|
||||
|
||||
var sqlFull = GetBaseQuery(BaseQueryType.Full);
|
||||
var sqlFull = GetBaseQuery(BaseQueryType.FullMultiple);
|
||||
var translatorFull = new SqlTranslator<IContent>(sqlFull, query);
|
||||
var sqlIds = GetBaseQuery(BaseQueryType.Ids);
|
||||
var translatorIds = new SqlTranslator<IContent>(sqlIds, query);
|
||||
|
||||
return ProcessQuery(translate(translatorFull), translate(translatorIds), true);
|
||||
return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds)), true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -771,13 +784,8 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
|
||||
public void ClearPublished(IContent content)
|
||||
{
|
||||
// race cond!
|
||||
var documentDtos = Database.Fetch<DocumentDto>("WHERE nodeId=@id AND published=@published", new { id = content.Id, published = true });
|
||||
foreach (var documentDto in documentDtos)
|
||||
{
|
||||
documentDto.Published = false;
|
||||
Database.Update(documentDto);
|
||||
}
|
||||
var sql = "UPDATE cmsDocument SET published=0 WHERE nodeId=@id AND published=1";
|
||||
Database.Execute(sql, new {id = content.Id});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -859,7 +867,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
|
||||
return GetPagedResultsByQuery<DocumentDto>(query, pageIndex, pageSize, out totalRecords,
|
||||
new Tuple<string, string>("cmsDocument", "nodeId"),
|
||||
(sqlFull, sqlIds) => ProcessQuery(sqlFull, sqlIds), orderBy, orderDirection, orderBySystemField,
|
||||
(sqlFull, pagingSqlQuery) => ProcessQuery(sqlFull, pagingSqlQuery), orderBy, orderDirection, orderBySystemField,
|
||||
filterCallback);
|
||||
|
||||
}
|
||||
@@ -889,23 +897,58 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
|
||||
return base.GetDatabaseFieldNameForOrderBy(orderBy);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// This is the underlying method that processes most queries for this repository
|
||||
/// </summary>
|
||||
/// <param name="sqlFull">
|
||||
/// The full SQL with the outer join to return all data required to create an IContent
|
||||
/// The FullMultiple SQL without the outer join to return all data required to create an IContent excluding it's published state data which this will query separately
|
||||
/// </param>
|
||||
/// <param name="sqlIds">
|
||||
/// <param name="pagingSqlQuery">
|
||||
/// The Id SQL without the outer join to just return all document ids - used to process the properties for the content item
|
||||
/// </param>
|
||||
/// <param name="withCache"></param>
|
||||
/// <returns></returns>
|
||||
private IEnumerable<IContent> ProcessQuery(Sql sqlFull, Sql sqlIds, bool withCache = false)
|
||||
private IEnumerable<IContent> ProcessQuery(Sql sqlFull, PagingSqlQuery pagingSqlQuery, bool withCache = false)
|
||||
{
|
||||
// fetch returns a list so it's ok to iterate it in this method
|
||||
var dtos = Database.Fetch<DocumentDto, ContentVersionDto, ContentDto, NodeDto, DocumentPublishedReadOnlyDto>(sqlFull);
|
||||
var dtos = Database.Fetch<DocumentDto, ContentVersionDto, ContentDto, NodeDto>(sqlFull);
|
||||
if (dtos.Count == 0) return Enumerable.Empty<IContent>();
|
||||
|
||||
//Go and get all of the published version data separately for this data, this is because when we are querying
|
||||
//for multiple content items we don't include the outer join to fetch this data in the same query because
|
||||
//it is insanely slow. Instead we just fetch the published version data separately in one query.
|
||||
|
||||
//we need to parse the original SQL statement and reduce the columns to just cmsDocument.nodeId so that we can use
|
||||
// the statement to go get the published data for all of the items by using an inner join
|
||||
var parsedOriginalSql = "SELECT cmsDocument.nodeId " + sqlFull.SQL.Substring(sqlFull.SQL.IndexOf("FROM", StringComparison.Ordinal));
|
||||
//now remove everything from an Orderby clause and beyond
|
||||
if (parsedOriginalSql.InvariantContains("ORDER BY "))
|
||||
{
|
||||
parsedOriginalSql = parsedOriginalSql.Substring(0, parsedOriginalSql.LastIndexOf("ORDER BY ", StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
var publishedSql = new Sql(@"SELECT *
|
||||
FROM cmsDocument AS doc2
|
||||
INNER JOIN
|
||||
(" + parsedOriginalSql + @") as docData
|
||||
ON doc2.nodeId = docData.nodeId
|
||||
WHERE doc2.published = 1
|
||||
ORDER BY doc2.nodeId
|
||||
", sqlFull.Arguments);
|
||||
|
||||
//go and get the published version data, we do a Query here and not a Fetch so we are
|
||||
//not allocating a whole list to memory just to allocate another list in memory since
|
||||
//we are assigning this data to a keyed collection for fast lookup below
|
||||
var publishedData = Database.Query<DocumentPublishedReadOnlyDto>(publishedSql);
|
||||
var publishedDataCollection = new DocumentPublishedReadOnlyDtoCollection();
|
||||
foreach (var publishedDto in publishedData)
|
||||
{
|
||||
//double check that there's no corrupt db data, there should only be a single published item
|
||||
if (publishedDataCollection.Contains(publishedDto.NodeId) == false)
|
||||
publishedDataCollection.Add(publishedDto);
|
||||
}
|
||||
|
||||
|
||||
var content = new IContent[dtos.Count];
|
||||
var defs = new List<DocumentDefinition>();
|
||||
@@ -919,6 +962,8 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
for (var i = 0; i < dtos.Count; i++)
|
||||
{
|
||||
var dto = dtos[i];
|
||||
DocumentPublishedReadOnlyDto publishedDto;
|
||||
publishedDataCollection.TryGetValue(dto.NodeId, out publishedDto);
|
||||
|
||||
// if the cache contains the published version, use it
|
||||
if (withCache)
|
||||
@@ -946,7 +991,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
contentTypes[dto.ContentVersionDto.ContentDto.ContentTypeId] = contentType;
|
||||
}
|
||||
|
||||
content[i] = ContentFactory.BuildEntity(dto, contentType);
|
||||
content[i] = ContentFactory.BuildEntity(dto, contentType, publishedDto);
|
||||
|
||||
// need template
|
||||
if (dto.TemplateId.HasValue && dto.TemplateId.Value > 0)
|
||||
@@ -967,7 +1012,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
.ToDictionary(x => x.Id, x => x);
|
||||
|
||||
// load all properties for all documents from database in 1 query
|
||||
var propertyData = GetPropertyCollection(sqlIds, defs);
|
||||
var propertyData = GetPropertyCollection(pagingSqlQuery, defs);
|
||||
|
||||
// assign
|
||||
var dtoIndex = 0;
|
||||
@@ -1055,7 +1100,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
|
||||
return currentName;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Dispose disposable properties
|
||||
/// </summary>
|
||||
@@ -1070,5 +1115,26 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
_contentPreviewRepository.Dispose();
|
||||
_contentXmlRepository.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A keyed collection for fast lookup when retrieving a separate list of published version data
|
||||
/// </summary>
|
||||
private class DocumentPublishedReadOnlyDtoCollection : KeyedCollection<int, DocumentPublishedReadOnlyDto>
|
||||
{
|
||||
protected override int GetKeyForItem(DocumentPublishedReadOnlyDto item)
|
||||
{
|
||||
return item.NodeId;
|
||||
}
|
||||
|
||||
public bool TryGetValue(int key, out DocumentPublishedReadOnlyDto val)
|
||||
{
|
||||
if (Dictionary == null)
|
||||
{
|
||||
val = null;
|
||||
return false;
|
||||
}
|
||||
return Dictionary.TryGetValue(key, out val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
sql.Where("umbracoNode.id in (@ids)", new { ids = ids });
|
||||
}
|
||||
|
||||
return ProcessQuery(sql);
|
||||
return ProcessQuery(sql, new PagingSqlQuery(sql));
|
||||
}
|
||||
|
||||
protected override IEnumerable<IMedia> PerformGetByQuery(IQuery<IMedia> query)
|
||||
@@ -78,7 +78,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var sql = translator.Translate()
|
||||
.OrderBy<NodeDto>(x => x.SortOrder, SqlSyntax);
|
||||
|
||||
return ProcessQuery(sql);
|
||||
return ProcessQuery(sql, new PagingSqlQuery(sql));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -100,7 +100,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
protected override Sql GetBaseQuery(bool isCount)
|
||||
{
|
||||
return GetBaseQuery(isCount ? BaseQueryType.Count : BaseQueryType.Full);
|
||||
return GetBaseQuery(isCount ? BaseQueryType.Count : BaseQueryType.FullSingle);
|
||||
}
|
||||
|
||||
protected override string GetBaseWhereClause()
|
||||
@@ -143,13 +143,24 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var sql = GetBaseQuery(false)
|
||||
.Where(GetBaseWhereClause(), new { Id = id })
|
||||
.OrderByDescending<ContentVersionDto>(x => x.VersionDate, SqlSyntax);
|
||||
return ProcessQuery(sql, true);
|
||||
return ProcessQuery(sql, new PagingSqlQuery(sql), true);
|
||||
}
|
||||
|
||||
private IEnumerable<IMedia> ProcessQuery(Sql sql, bool withCache = false)
|
||||
/// <summary>
|
||||
/// This is the underlying method that processes most queries for this repository
|
||||
/// </summary>
|
||||
/// <param name="sqlFull">
|
||||
/// The full SQL to select all media data
|
||||
/// </param>
|
||||
/// <param name="pagingSqlQuery">
|
||||
/// The Id SQL to just return all media ids - used to process the properties for the media item
|
||||
/// </param>
|
||||
/// <param name="withCache"></param>
|
||||
/// <returns></returns>
|
||||
private IEnumerable<IMedia> ProcessQuery(Sql sqlFull, PagingSqlQuery pagingSqlQuery, bool withCache = false)
|
||||
{
|
||||
// fetch returns a list so it's ok to iterate it in this method
|
||||
var dtos = Database.Fetch<ContentVersionDto, ContentDto, NodeDto>(sql);
|
||||
var dtos = Database.Fetch<ContentVersionDto, ContentDto, NodeDto>(sqlFull);
|
||||
var content = new IMedia[dtos.Count];
|
||||
var defs = new List<DocumentDefinition>();
|
||||
|
||||
@@ -200,7 +211,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
}
|
||||
|
||||
// load all properties for all documents from database in 1 query
|
||||
var propertyData = GetPropertyCollection(sql, defs);
|
||||
var propertyData = GetPropertyCollection(pagingSqlQuery, defs);
|
||||
|
||||
// assign
|
||||
var dtoIndex = 0;
|
||||
@@ -257,7 +268,8 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
query = query
|
||||
.Where<NodeDto>(x => x.NodeId > baseId, SqlSyntax)
|
||||
.OrderBy<NodeDto>(x => x.NodeId, SqlSyntax);
|
||||
var xmlItems = ProcessQuery(SqlSyntax.SelectTop(query, groupSize))
|
||||
var sql = SqlSyntax.SelectTop(query, groupSize);
|
||||
var xmlItems = ProcessQuery(sql, new PagingSqlQuery(sql))
|
||||
.Select(x => new ContentXmlDto { NodeId = x.Id, Xml = serializer(x).ToString() })
|
||||
.ToList();
|
||||
|
||||
@@ -507,7 +519,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
return GetPagedResultsByQuery<ContentVersionDto>(query, pageIndex, pageSize, out totalRecords,
|
||||
new Tuple<string, string>("cmsContentVersion", "contentId"),
|
||||
(sqlFull, sqlIds) => ProcessQuery(sqlFull), orderBy, orderDirection, orderBySystemField,
|
||||
(sqlFull, pagingSqlQuery) => ProcessQuery(sqlFull, pagingSqlQuery), orderBy, orderDirection, orderBySystemField,
|
||||
filterCallback);
|
||||
|
||||
}
|
||||
@@ -515,7 +527,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
/// <summary>
|
||||
/// Private method to create a media object from a ContentDto
|
||||
/// </summary>
|
||||
/// <param name="d"></param>
|
||||
/// <param name="dto"></param>
|
||||
/// <param name="versionId"></param>
|
||||
/// <param name="docSql"></param>
|
||||
/// <returns></returns>
|
||||
@@ -527,7 +539,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
var docDef = new DocumentDefinition(dto.NodeId, versionId, media.UpdateDate, media.CreateDate, contentType);
|
||||
|
||||
var properties = GetPropertyCollection(docSql, new[] { docDef });
|
||||
var properties = GetPropertyCollection(new PagingSqlQuery(docSql), new[] { docDef });
|
||||
|
||||
media.Properties = properties[dto.NodeId];
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
sql.Where("umbracoNode.id in (@ids)", new { ids = ids });
|
||||
}
|
||||
|
||||
return ProcessQuery(sql);
|
||||
return ProcessQuery(sql, new PagingSqlQuery(sql));
|
||||
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
baseQuery.Append(new Sql("WHERE umbracoNode.id IN (" + sql.SQL + ")", sql.Arguments))
|
||||
.OrderBy<NodeDto>(x => x.SortOrder);
|
||||
|
||||
return ProcessQuery(baseQuery);
|
||||
return ProcessQuery(baseQuery, new PagingSqlQuery(baseQuery));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -98,7 +98,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var sql = translator.Translate()
|
||||
.OrderBy<NodeDto>(x => x.SortOrder);
|
||||
|
||||
return ProcessQuery(sql);
|
||||
return ProcessQuery(sql, new PagingSqlQuery(sql));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -129,7 +129,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
protected override Sql GetBaseQuery(bool isCount)
|
||||
{
|
||||
return GetBaseQuery(isCount ? BaseQueryType.Count : BaseQueryType.Full);
|
||||
return GetBaseQuery(isCount ? BaseQueryType.Count : BaseQueryType.FullSingle);
|
||||
}
|
||||
|
||||
protected override string GetBaseWhereClause()
|
||||
@@ -385,7 +385,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var sql = GetBaseQuery(false)
|
||||
.Where(GetBaseWhereClause(), new { Id = id })
|
||||
.OrderByDescending<ContentVersionDto>(x => x.VersionDate, SqlSyntax);
|
||||
return ProcessQuery(sql, true);
|
||||
return ProcessQuery(sql, new PagingSqlQuery(sql), true);
|
||||
}
|
||||
|
||||
public void RebuildXmlStructures(Func<IMember, XElement> serializer, int groupSize = 200, IEnumerable<int> contentTypeIds = null)
|
||||
@@ -408,7 +408,8 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
query = query
|
||||
.Where<NodeDto>(x => x.NodeId > baseId)
|
||||
.OrderBy<NodeDto>(x => x.NodeId, SqlSyntax);
|
||||
var xmlItems = ProcessQuery(SqlSyntax.SelectTop(query, groupSize))
|
||||
var sql = SqlSyntax.SelectTop(query, groupSize);
|
||||
var xmlItems = ProcessQuery(sql, new PagingSqlQuery(sql))
|
||||
.Select(x => new ContentXmlDto { NodeId = x.Id, Xml = serializer(x).ToString() })
|
||||
.ToList();
|
||||
|
||||
@@ -449,7 +450,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var factory = new MemberFactory(memberType, NodeObjectTypeId, dto.NodeId);
|
||||
var media = factory.BuildEntity(dto);
|
||||
|
||||
var properties = GetPropertyCollection(sql, new[] { new DocumentDefinition(dto.NodeId, dto.ContentVersionDto.VersionId, media.UpdateDate, media.CreateDate, memberType) });
|
||||
var properties = GetPropertyCollection(new PagingSqlQuery(sql), new[] { new DocumentDefinition(dto.NodeId, dto.ContentVersionDto.VersionId, media.UpdateDate, media.CreateDate, memberType) });
|
||||
|
||||
media.Properties = properties[dto.NodeId];
|
||||
|
||||
@@ -540,7 +541,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
.OrderByDescending<ContentVersionDto>(x => x.VersionDate)
|
||||
.OrderBy<NodeDto>(x => x.SortOrder);
|
||||
|
||||
return ProcessQuery(sql);
|
||||
return ProcessQuery(sql, new PagingSqlQuery(sql));
|
||||
|
||||
}
|
||||
|
||||
@@ -624,7 +625,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
return GetPagedResultsByQuery<MemberDto>(query, pageIndex, pageSize, out totalRecords,
|
||||
new Tuple<string, string>("cmsMember", "nodeId"),
|
||||
(sqlFull, sqlIds) => ProcessQuery(sqlFull), orderBy, orderDirection, orderBySystemField,
|
||||
(sqlFull, sqlIds) => ProcessQuery(sqlFull, sqlIds), orderBy, orderDirection, orderBySystemField,
|
||||
filterCallback);
|
||||
}
|
||||
|
||||
@@ -664,10 +665,21 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
return base.GetEntityPropertyNameForOrderBy(orderBy);
|
||||
}
|
||||
|
||||
private IEnumerable<IMember> ProcessQuery(Sql sql, bool withCache = false)
|
||||
/// <summary>
|
||||
/// This is the underlying method that processes most queries for this repository
|
||||
/// </summary>
|
||||
/// <param name="sqlFull">
|
||||
/// The full SQL to select all member data
|
||||
/// </param>
|
||||
/// <param name="pagingSqlQuery">
|
||||
/// The Id SQL to just return all member ids - used to process the properties for the member item
|
||||
/// </param>
|
||||
/// <param name="withCache"></param>
|
||||
/// <returns></returns>
|
||||
private IEnumerable<IMember> ProcessQuery(Sql sqlFull, PagingSqlQuery pagingSqlQuery, bool withCache = false)
|
||||
{
|
||||
// fetch returns a list so it's ok to iterate it in this method
|
||||
var dtos = Database.Fetch<MemberDto, ContentVersionDto, ContentDto, NodeDto>(sql);
|
||||
var dtos = Database.Fetch<MemberDto, ContentVersionDto, ContentDto, NodeDto>(sqlFull);
|
||||
|
||||
var content = new IMember[dtos.Count];
|
||||
var defs = new List<DocumentDefinition>();
|
||||
@@ -704,7 +716,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
}
|
||||
|
||||
// load all properties for all documents from database in 1 query
|
||||
var propertyData = GetPropertyCollection(sql, defs);
|
||||
var propertyData = GetPropertyCollection(pagingSqlQuery, defs);
|
||||
|
||||
// assign
|
||||
var dtoIndex = 0;
|
||||
|
||||
@@ -63,6 +63,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
FormatDeleteStatement("cmsContentVersion", "ContentId"),
|
||||
FormatDeleteStatement("cmsContentXml", "nodeId"),
|
||||
FormatDeleteStatement("cmsContent", "nodeId"),
|
||||
//TODO: Why is this being done? We just delete this exact data in the next line
|
||||
"UPDATE umbracoNode SET parentID = '" + RecycleBinId + "' WHERE trashed = '1' AND nodeObjectType = @NodeObjectType",
|
||||
"DELETE FROM umbracoNode WHERE trashed = '1' AND nodeObjectType = @NodeObjectType"
|
||||
};
|
||||
@@ -91,14 +92,18 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A delete statement that will delete anything in the table specified where its PK (keyName) is found in the
|
||||
/// list of umbracoNode.id that have trashed flag set
|
||||
/// </summary>
|
||||
/// <param name="tableName"></param>
|
||||
/// <param name="keyName"></param>
|
||||
/// <returns></returns>
|
||||
private string FormatDeleteStatement(string tableName, string keyName)
|
||||
{
|
||||
//This query works with sql ce and sql server:
|
||||
//DELETE FROM umbracoUser2NodeNotify WHERE umbracoUser2NodeNotify.nodeId IN
|
||||
//(SELECT nodeId FROM umbracoUser2NodeNotify as TB1 INNER JOIN umbracoNode as TB2 ON TB1.nodeId = TB2.id WHERE TB2.trashed = '1' AND TB2.nodeObjectType = 'C66BA18E-EAF3-4CFF-8A22-41B16D66A972')
|
||||
return
|
||||
string.Format(
|
||||
"DELETE FROM {0} WHERE {0}.{1} IN (SELECT TB1.{1} FROM {0} as TB1 INNER JOIN umbracoNode as TB2 ON TB1.{1} = TB2.id WHERE TB2.trashed = '1' AND TB2.nodeObjectType = @NodeObjectType)",
|
||||
"DELETE FROM {0} WHERE {0}.{1} IN (SELECT id FROM umbracoNode WHERE trashed = '1' AND nodeObjectType = @NodeObjectType)",
|
||||
tableName, keyName);
|
||||
}
|
||||
|
||||
|
||||
@@ -431,7 +431,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
/// <exception cref="System.ArgumentNullException">orderBy</exception>
|
||||
protected IEnumerable<TEntity> GetPagedResultsByQuery<TDto>(IQuery<TEntity> query, long pageIndex, int pageSize, out long totalRecords,
|
||||
Tuple<string, string> nodeIdSelect,
|
||||
Func<Sql, Sql, IEnumerable<TEntity>> processQuery,
|
||||
Func<Sql, PagingSqlQuery<TDto>, IEnumerable<TEntity>> processQuery,
|
||||
string orderBy,
|
||||
Direction orderDirection,
|
||||
bool orderBySystemField,
|
||||
@@ -442,7 +442,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
// Get base query for returning IDs
|
||||
var sqlBaseIds = GetBaseQuery(BaseQueryType.Ids);
|
||||
// Get base query for returning all data
|
||||
var sqlBaseFull = GetBaseQuery(BaseQueryType.Full);
|
||||
var sqlBaseFull = GetBaseQuery(BaseQueryType.FullMultiple);
|
||||
|
||||
if (query == null) query = new Query<TEntity>();
|
||||
var translatorIds = new SqlTranslator<TEntity>(sqlBaseIds, query);
|
||||
@@ -465,7 +465,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
// the pageResult, then the GetAll will actually return ALL records in the db.
|
||||
if (pagedResult.Items.Any())
|
||||
{
|
||||
//Crete the inner paged query that was used above to get the paged result, we'll use that as the inner sub query
|
||||
//Create the inner paged query that was used above to get the paged result, we'll use that as the inner sub query
|
||||
var args = sqlNodeIdsWithSort.Arguments;
|
||||
string sqlStringCount, sqlStringPage;
|
||||
Database.BuildPageQueries<TDto>(pageIndex * pageSize, pageSize, sqlNodeIdsWithSort.SQL, ref args, out sqlStringCount, out sqlStringPage);
|
||||
@@ -485,8 +485,8 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var fullQuery = GetSortedSqlForPagedResults(
|
||||
GetFilteredSqlForPagedResults(fullQueryWithPagedInnerJoin, defaultFilter),
|
||||
orderDirection, orderBy, orderBySystemField, nodeIdSelect);
|
||||
|
||||
return processQuery(fullQuery, sqlNodeIdsWithSort);
|
||||
|
||||
return processQuery(fullQuery, new PagingSqlQuery<TDto>(Database, sqlNodeIdsWithSort, pageIndex, pageSize));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -496,18 +496,47 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the property collection for a non-paged query
|
||||
/// </summary>
|
||||
/// <param name="sql"></param>
|
||||
/// <param name="documentDefs"></param>
|
||||
/// <returns></returns>
|
||||
protected IDictionary<int, PropertyCollection> GetPropertyCollection(
|
||||
Sql docSql,
|
||||
Sql sql,
|
||||
IReadOnlyCollection<DocumentDefinition> documentDefs)
|
||||
{
|
||||
return GetPropertyCollection(new PagingSqlQuery(sql), documentDefs);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the property collection for a query
|
||||
/// </summary>
|
||||
/// <param name="pagingSqlQuery"></param>
|
||||
/// <param name="documentDefs"></param>
|
||||
/// <returns></returns>
|
||||
protected IDictionary<int, PropertyCollection> GetPropertyCollection(
|
||||
PagingSqlQuery pagingSqlQuery,
|
||||
IReadOnlyCollection<DocumentDefinition> documentDefs)
|
||||
{
|
||||
if (documentDefs.Count == 0) return new Dictionary<int, PropertyCollection>();
|
||||
|
||||
//initialize to the query passed in
|
||||
var docSql = pagingSqlQuery.PrePagedSql;
|
||||
|
||||
//we need to parse the original SQL statement and reduce the columns to just cmsContent.nodeId, cmsContentVersion.VersionId so that we can use
|
||||
// the statement to go get the property data for all of the items by using an inner join
|
||||
var parsedOriginalSql = "SELECT {0} " + docSql.SQL.Substring(docSql.SQL.IndexOf("FROM", StringComparison.Ordinal));
|
||||
//now remove everything from an Orderby clause and beyond
|
||||
if (parsedOriginalSql.InvariantContains("ORDER BY "))
|
||||
|
||||
if (pagingSqlQuery.HasPaging)
|
||||
{
|
||||
//if this is a paged query, build the paged query with the custom column substitution, then re-assign
|
||||
docSql = pagingSqlQuery.BuildPagedQuery("{0}");
|
||||
parsedOriginalSql = docSql.SQL;
|
||||
}
|
||||
else if (parsedOriginalSql.InvariantContains("ORDER BY "))
|
||||
{
|
||||
//now remove everything from an Orderby clause and beyond if this is unpaged data
|
||||
parsedOriginalSql = parsedOriginalSql.Substring(0, parsedOriginalSql.LastIndexOf("ORDER BY ", StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
@@ -524,7 +553,7 @@ WHERE EXISTS(
|
||||
INNER JOIN cmsPropertyType
|
||||
ON b.datatypeNodeId = cmsPropertyType.dataTypeId
|
||||
INNER JOIN
|
||||
(" + string.Format(parsedOriginalSql, "DISTINCT cmsContent.contentType") + @") as docData
|
||||
(" + string.Format(parsedOriginalSql, "cmsContent.contentType") + @") as docData
|
||||
ON cmsPropertyType.contentTypeId = docData.contentType
|
||||
WHERE a.id = b.id)", docSql.Arguments);
|
||||
|
||||
@@ -647,28 +676,7 @@ ORDER BY contentNodeId, propertytypeid
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
public class DocumentDefinition
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="T:System.Object"/> class.
|
||||
/// </summary>
|
||||
public DocumentDefinition(int id, Guid version, DateTime versionDate, DateTime createDate, IContentTypeComposition composition)
|
||||
{
|
||||
Id = id;
|
||||
Version = version;
|
||||
VersionDate = versionDate;
|
||||
CreateDate = createDate;
|
||||
Composition = composition;
|
||||
}
|
||||
|
||||
public int Id { get; set; }
|
||||
public Guid Version { get; set; }
|
||||
public DateTime VersionDate { get; set; }
|
||||
public DateTime CreateDate { get; set; }
|
||||
public IContentTypeComposition Composition { get; set; }
|
||||
}
|
||||
|
||||
|
||||
protected virtual string GetDatabaseFieldNameForOrderBy(string orderBy)
|
||||
{
|
||||
// Translate the passed order by field (which were originally defined for in-memory object sorting
|
||||
@@ -764,5 +772,92 @@ ORDER BY contentNodeId, propertytypeid
|
||||
/// <param name="queryType"></param>
|
||||
/// <returns></returns>
|
||||
protected abstract Sql GetBaseQuery(BaseQueryType queryType);
|
||||
|
||||
internal class DocumentDefinition
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="T:System.Object"/> class.
|
||||
/// </summary>
|
||||
public DocumentDefinition(int id, Guid version, DateTime versionDate, DateTime createDate, IContentTypeComposition composition)
|
||||
{
|
||||
Id = id;
|
||||
Version = version;
|
||||
VersionDate = versionDate;
|
||||
CreateDate = createDate;
|
||||
Composition = composition;
|
||||
}
|
||||
|
||||
public int Id { get; set; }
|
||||
public Guid Version { get; set; }
|
||||
public DateTime VersionDate { get; set; }
|
||||
public DateTime CreateDate { get; set; }
|
||||
public IContentTypeComposition Composition { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An object representing a query that may contain paging information
|
||||
/// </summary>
|
||||
internal class PagingSqlQuery
|
||||
{
|
||||
public Sql PrePagedSql { get; private set; }
|
||||
|
||||
public PagingSqlQuery(Sql prePagedSql)
|
||||
{
|
||||
PrePagedSql = prePagedSql;
|
||||
}
|
||||
|
||||
public virtual bool HasPaging
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
public virtual Sql BuildPagedQuery(string selectColumns)
|
||||
{
|
||||
throw new InvalidOperationException("This query has no paging information");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An object representing a query that contains paging information
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
internal class PagingSqlQuery<T> : PagingSqlQuery
|
||||
{
|
||||
private readonly Database _db;
|
||||
private readonly long _pageIndex;
|
||||
private readonly int _pageSize;
|
||||
|
||||
public PagingSqlQuery(Database db, Sql prePagedSql, long pageIndex, int pageSize) : base(prePagedSql)
|
||||
{
|
||||
_db = db;
|
||||
_pageIndex = pageIndex;
|
||||
_pageSize = pageSize;
|
||||
}
|
||||
|
||||
public override bool HasPaging
|
||||
{
|
||||
get { return _pageSize > 0; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a paged query based on the original query and subtitutes the selectColumns specified
|
||||
/// </summary>
|
||||
/// <param name="selectColumns"></param>
|
||||
/// <returns></returns>
|
||||
public override Sql BuildPagedQuery(string selectColumns)
|
||||
{
|
||||
if (HasPaging == false) throw new InvalidOperationException("This query has no paging information");
|
||||
|
||||
var resultSql = string.Format("SELECT {0} {1}", selectColumns, PrePagedSql.SQL.Substring(PrePagedSql.SQL.IndexOf("FROM", StringComparison.Ordinal)));
|
||||
|
||||
//this query is meant to be paged so we need to generate the paging syntax
|
||||
//Create the inner paged query that was used above to get the paged result, we'll use that as the inner sub query
|
||||
var args = PrePagedSql.Arguments;
|
||||
string sqlStringCount, sqlStringPage;
|
||||
_db.BuildPageQueries<T>(_pageIndex * _pageSize, _pageSize, resultSql, ref args, out sqlStringCount, out sqlStringPage);
|
||||
|
||||
return new Sql(sqlStringPage, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -114,7 +114,7 @@ namespace Umbraco.Core.Security
|
||||
AllowRefresh = true,
|
||||
IssuedUtc = nowUtc,
|
||||
ExpiresUtc = nowUtc.AddMinutes(GlobalSettings.TimeOutInMinutes)
|
||||
}, userIdentity, rememberBrowserIdentity);
|
||||
}, userIdentity, rememberBrowserIdentity);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -127,6 +127,10 @@ namespace Umbraco.Core.Security
|
||||
}, userIdentity);
|
||||
}
|
||||
|
||||
//track the last login date
|
||||
user.LastLoginDateUtc = DateTime.UtcNow;
|
||||
await UserManager.UpdateAsync(user);
|
||||
|
||||
_logger.WriteCore(TraceEventType.Information, 0,
|
||||
string.Format(
|
||||
"Login attempt succeeded for username {0} from IP address {1}",
|
||||
|
||||
@@ -625,6 +625,12 @@ namespace Umbraco.Core.Security
|
||||
var anythingChanged = false;
|
||||
//don't assign anything if nothing has changed as this will trigger
|
||||
//the track changes of the model
|
||||
if ((user.LastLoginDate != default(DateTime) && identityUser.LastLoginDateUtc.HasValue == false)
|
||||
|| identityUser.LastLoginDateUtc.HasValue && user.LastLoginDate.ToUniversalTime() != identityUser.LastLoginDateUtc.Value)
|
||||
{
|
||||
anythingChanged = true;
|
||||
user.LastLoginDate = identityUser.LastLoginDateUtc.Value.ToLocalTime();
|
||||
}
|
||||
if (user.Name != identityUser.Name && identityUser.Name.IsNullOrWhiteSpace() == false)
|
||||
{
|
||||
anythingChanged = true;
|
||||
|
||||
@@ -13,7 +13,10 @@ namespace Umbraco.Tests.Benchmarks
|
||||
typeof(BulkInsertBenchmarks),
|
||||
typeof(ModelToSqlExpressionHelperBenchmarks),
|
||||
typeof(XmlBenchmarks),
|
||||
typeof(LinqCastBenchmarks)
|
||||
typeof(LinqCastBenchmarks),
|
||||
//typeof(DeepCloneBenchmarks),
|
||||
typeof(XmlPublishedContentInitBenchmarks),
|
||||
|
||||
});
|
||||
switcher.Run(args);
|
||||
}
|
||||
|
||||
@@ -91,6 +91,7 @@
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="XmlBenchmarks.cs" />
|
||||
<Compile Include="XmlPublishedContentInitBenchmarks.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
@@ -105,6 +106,10 @@
|
||||
<Project>{5d3b8245-ada6-453f-a008-50ed04bfe770}</Project>
|
||||
<Name>Umbraco.Tests</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Umbraco.Web\Umbraco.Web.csproj">
|
||||
<Project>{651e1350-91b6-44b7-bd60-7207006d7003}</Project>
|
||||
<Name>Umbraco.Web</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.1.1.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll" />
|
||||
|
||||
@@ -0,0 +1,315 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
using BenchmarkDotNet.Configs;
|
||||
using BenchmarkDotNet.Diagnostics.Windows;
|
||||
using BenchmarkDotNet.Jobs;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.Web.PublishedCache.XmlPublishedCache;
|
||||
|
||||
namespace Umbraco.Tests.Benchmarks
|
||||
{
|
||||
[Config(typeof(Config))]
|
||||
public class XmlPublishedContentInitBenchmarks
|
||||
{
|
||||
private class Config : ManualConfig
|
||||
{
|
||||
public Config()
|
||||
{
|
||||
Add(new MemoryDiagnoser());
|
||||
|
||||
//The 'quick and dirty' settings, so it runs a little quicker
|
||||
// see benchmarkdotnet FAQ
|
||||
Add(Job.Default
|
||||
.WithLaunchCount(1) // benchmark process will be launched only once
|
||||
.WithIterationTime(100) // 100ms per iteration
|
||||
.WithWarmupCount(3) // 3 warmup iteration
|
||||
.WithTargetCount(3)); // 3 target iteration
|
||||
}
|
||||
}
|
||||
|
||||
public XmlPublishedContentInitBenchmarks()
|
||||
{
|
||||
_xml10 = Build(10);
|
||||
_xml100 = Build(100);
|
||||
_xml1000 = Build(1000);
|
||||
_xml10000 = Build(10000);
|
||||
}
|
||||
|
||||
private readonly string[] _intAttributes = { "id", "parentID", "nodeType", "level", "writerID", "creatorID", "template", "sortOrder", "isDoc", "isDraft" };
|
||||
private readonly string[] _strAttributes = { "nodeName", "urlName", "writerName", "creatorName", "path" };
|
||||
private readonly string[] _dateAttributes = { "createDate", "updateDate" };
|
||||
private readonly string[] _guidAttributes = { "key", "version" };
|
||||
|
||||
private XmlDocument Build(int children)
|
||||
{
|
||||
var xml = new XmlDocument();
|
||||
var root = Build(xml, "Home", 10);
|
||||
for (int i = 0; i < children; i++)
|
||||
{
|
||||
var child = Build(xml, "child" + i, 10);
|
||||
root.AppendChild(child);
|
||||
}
|
||||
xml.AppendChild(root);
|
||||
return xml;
|
||||
}
|
||||
|
||||
private XmlElement Build(XmlDocument xml, string name, int propertyCount)
|
||||
{
|
||||
var random = new Random();
|
||||
var content = xml.CreateElement(name);
|
||||
foreach (var p in _intAttributes)
|
||||
{
|
||||
var a = xml.CreateAttribute(p);
|
||||
a.Value = random.Next(1, 9).ToInvariantString();
|
||||
content.Attributes.Append(a);
|
||||
}
|
||||
foreach (var p in _strAttributes)
|
||||
{
|
||||
var a = xml.CreateAttribute(p);
|
||||
a.Value = Guid.NewGuid().ToString();
|
||||
content.Attributes.Append(a);
|
||||
}
|
||||
foreach (var p in _guidAttributes)
|
||||
{
|
||||
var a = xml.CreateAttribute(p);
|
||||
a.Value = Guid.NewGuid().ToString();
|
||||
content.Attributes.Append(a);
|
||||
}
|
||||
foreach (var p in _dateAttributes)
|
||||
{
|
||||
var a = xml.CreateAttribute(p);
|
||||
a.Value = DateTime.Now.ToString("o");
|
||||
content.Attributes.Append(a);
|
||||
}
|
||||
|
||||
for (int i = 0; i < propertyCount; i++)
|
||||
{
|
||||
var prop = xml.CreateElement("prop" + i);
|
||||
var cdata = xml.CreateCDataSection(string.Join("", Enumerable.Range(0, 10).Select(x => Guid.NewGuid().ToString())));
|
||||
prop.AppendChild(cdata);
|
||||
content.AppendChild(prop);
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
private readonly XmlDocument _xml10;
|
||||
private readonly XmlDocument _xml100;
|
||||
private readonly XmlDocument _xml1000;
|
||||
private readonly XmlDocument _xml10000;
|
||||
|
||||
//out props
|
||||
int id, nodeType, level, writerId, creatorId, template, sortOrder;
|
||||
Guid key, version;
|
||||
string name, urlName, writerName, creatorName, docTypeAlias, path;
|
||||
bool isDraft;
|
||||
DateTime createDate, updateDate;
|
||||
PublishedContentType publishedContentType;
|
||||
Dictionary<string, IPublishedProperty> properties;
|
||||
|
||||
[Benchmark(Baseline = true, OperationsPerInvoke = 10)]
|
||||
public void Original_10_Children()
|
||||
{
|
||||
OriginalInitializeNode(_xml10.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties);
|
||||
}
|
||||
|
||||
[Benchmark(OperationsPerInvoke = 10)]
|
||||
public void Original_100_Children()
|
||||
{
|
||||
OriginalInitializeNode(_xml100.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties);
|
||||
}
|
||||
|
||||
[Benchmark(OperationsPerInvoke = 10)]
|
||||
public void Original_1000_Children()
|
||||
{
|
||||
OriginalInitializeNode(_xml1000.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties);
|
||||
}
|
||||
|
||||
[Benchmark(OperationsPerInvoke = 10)]
|
||||
public void Original_10000_Children()
|
||||
{
|
||||
OriginalInitializeNode(_xml10000.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties);
|
||||
}
|
||||
|
||||
[Benchmark(OperationsPerInvoke = 10)]
|
||||
public void Enhanced_10_Children()
|
||||
{
|
||||
XmlPublishedContent.InitializeNode(_xml10.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties, GetPublishedContentType);
|
||||
}
|
||||
|
||||
[Benchmark(OperationsPerInvoke = 10)]
|
||||
public void Enhanced_100_Children()
|
||||
{
|
||||
XmlPublishedContent.InitializeNode(_xml100.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties, GetPublishedContentType);
|
||||
}
|
||||
|
||||
[Benchmark(OperationsPerInvoke = 10)]
|
||||
public void Enhanced_1000_Children()
|
||||
{
|
||||
XmlPublishedContent.InitializeNode(_xml1000.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties, GetPublishedContentType);
|
||||
}
|
||||
|
||||
[Benchmark(OperationsPerInvoke = 10)]
|
||||
public void Enhanced_10000_Children()
|
||||
{
|
||||
XmlPublishedContent.InitializeNode(_xml10000.DocumentElement, false, false,
|
||||
out id, out key, out template, out sortOrder, out name, out writerName, out urlName,
|
||||
out creatorName, out creatorId, out writerId, out docTypeAlias, out nodeType, out path,
|
||||
out version, out createDate, out updateDate, out level, out isDraft, out publishedContentType,
|
||||
out properties, GetPublishedContentType);
|
||||
}
|
||||
|
||||
|
||||
internal static void OriginalInitializeNode(XmlNode xmlNode, bool legacy, bool isPreviewing,
|
||||
out int id, out Guid key, out int template, out int sortOrder, out string name, out string writerName, out string urlName,
|
||||
out string creatorName, out int creatorId, out int writerId, out string docTypeAlias, out int docTypeId, out string path,
|
||||
out Guid version, out DateTime createDate, out DateTime updateDate, out int level, out bool isDraft,
|
||||
out PublishedContentType contentType, out Dictionary<string, IPublishedProperty> properties)
|
||||
{
|
||||
//initialize the out params with defaults:
|
||||
writerName = null;
|
||||
docTypeAlias = null;
|
||||
id = template = sortOrder = template = creatorId = writerId = docTypeId = level = default(int);
|
||||
key = version = default(Guid);
|
||||
name = writerName = urlName = creatorName = docTypeAlias = path = null;
|
||||
createDate = updateDate = default(DateTime);
|
||||
isDraft = false;
|
||||
contentType = null;
|
||||
properties = null;
|
||||
|
||||
//return if this is null
|
||||
if (xmlNode == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (xmlNode.Attributes != null)
|
||||
{
|
||||
id = int.Parse(xmlNode.Attributes.GetNamedItem("id").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("key") != null) // because, migration
|
||||
key = Guid.Parse(xmlNode.Attributes.GetNamedItem("key").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("template") != null)
|
||||
template = int.Parse(xmlNode.Attributes.GetNamedItem("template").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("sortOrder") != null)
|
||||
sortOrder = int.Parse(xmlNode.Attributes.GetNamedItem("sortOrder").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("nodeName") != null)
|
||||
name = xmlNode.Attributes.GetNamedItem("nodeName").Value;
|
||||
if (xmlNode.Attributes.GetNamedItem("writerName") != null)
|
||||
writerName = xmlNode.Attributes.GetNamedItem("writerName").Value;
|
||||
if (xmlNode.Attributes.GetNamedItem("urlName") != null)
|
||||
urlName = xmlNode.Attributes.GetNamedItem("urlName").Value;
|
||||
// Creatorname is new in 2.1, so published xml might not have it!
|
||||
try
|
||||
{
|
||||
creatorName = xmlNode.Attributes.GetNamedItem("creatorName").Value;
|
||||
}
|
||||
catch
|
||||
{
|
||||
creatorName = writerName;
|
||||
}
|
||||
|
||||
//Added the actual userID, as a user cannot be looked up via full name only...
|
||||
if (xmlNode.Attributes.GetNamedItem("creatorID") != null)
|
||||
creatorId = int.Parse(xmlNode.Attributes.GetNamedItem("creatorID").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("writerID") != null)
|
||||
writerId = int.Parse(xmlNode.Attributes.GetNamedItem("writerID").Value);
|
||||
|
||||
if (legacy)
|
||||
{
|
||||
if (xmlNode.Attributes.GetNamedItem("nodeTypeAlias") != null)
|
||||
docTypeAlias = xmlNode.Attributes.GetNamedItem("nodeTypeAlias").Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
docTypeAlias = xmlNode.Name;
|
||||
}
|
||||
|
||||
if (xmlNode.Attributes.GetNamedItem("nodeType") != null)
|
||||
docTypeId = int.Parse(xmlNode.Attributes.GetNamedItem("nodeType").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("path") != null)
|
||||
path = xmlNode.Attributes.GetNamedItem("path").Value;
|
||||
if (xmlNode.Attributes.GetNamedItem("version") != null)
|
||||
version = new Guid(xmlNode.Attributes.GetNamedItem("version").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("createDate") != null)
|
||||
createDate = DateTime.Parse(xmlNode.Attributes.GetNamedItem("createDate").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("updateDate") != null)
|
||||
updateDate = DateTime.Parse(xmlNode.Attributes.GetNamedItem("updateDate").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("level") != null)
|
||||
level = int.Parse(xmlNode.Attributes.GetNamedItem("level").Value);
|
||||
|
||||
isDraft = (xmlNode.Attributes.GetNamedItem("isDraft") != null);
|
||||
}
|
||||
|
||||
// load data
|
||||
|
||||
var dataXPath = legacy ? "data" : "* [not(@isDoc)]";
|
||||
var nodes = xmlNode.SelectNodes(dataXPath);
|
||||
|
||||
contentType = GetPublishedContentType(PublishedItemType.Content, docTypeAlias);
|
||||
|
||||
var propertyNodes = new Dictionary<string, XmlNode>();
|
||||
if (nodes != null)
|
||||
foreach (XmlNode n in nodes)
|
||||
{
|
||||
var attrs = n.Attributes;
|
||||
if (attrs == null) continue;
|
||||
var alias = legacy
|
||||
? attrs.GetNamedItem("alias").Value
|
||||
: n.Name;
|
||||
propertyNodes[alias.ToLowerInvariant()] = n;
|
||||
}
|
||||
properties = contentType.PropertyTypes.Select(p =>
|
||||
{
|
||||
XmlNode n;
|
||||
return propertyNodes.TryGetValue(p.PropertyTypeAlias.ToLowerInvariant(), out n)
|
||||
? new XmlPublishedProperty(p, isPreviewing, n)
|
||||
: new XmlPublishedProperty(p, isPreviewing);
|
||||
}).Cast<IPublishedProperty>().ToDictionary(
|
||||
x => x.PropertyTypeAlias,
|
||||
x => x,
|
||||
StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private static PublishedContentType GetPublishedContentType(PublishedItemType type, string alias)
|
||||
{
|
||||
return new PublishedContentType(alias, new string[] {},
|
||||
new List<PublishedPropertyType>(Enumerable.Range(0, 10).Select(x => new PublishedPropertyType("prop" + x, 0, "test", initConverters:false))));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml.Serialization;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
|
||||
namespace Umbraco.Tests.Dependencies
|
||||
{
|
||||
[TestFixture]
|
||||
public class NuGet
|
||||
{
|
||||
[Test]
|
||||
public void NuGet_Package_Versions_Are_The_Same_In_All_Package_Config_Files()
|
||||
{
|
||||
var packagesAndVersions = GetNuGetPackagesInSolution();
|
||||
Assert.IsTrue(packagesAndVersions.Any());
|
||||
|
||||
var failTest = false;
|
||||
foreach (var package in packagesAndVersions.OrderBy(x => x.ConfigFilePath))
|
||||
{
|
||||
var matchingPackages = packagesAndVersions.Where(x => string.Equals(x.PackageName, package.PackageName, StringComparison.InvariantCultureIgnoreCase));
|
||||
foreach (var matchingPackage in matchingPackages)
|
||||
{
|
||||
if (package.PackageVersion == matchingPackage.PackageVersion)
|
||||
continue;
|
||||
|
||||
Debug.WriteLine("Package '{0}' with version {1} in {2} doesn't match with version {3} in {4}",
|
||||
package.PackageName, package.PackageVersion, package.ConfigFilePath,
|
||||
matchingPackage.PackageVersion, matchingPackage.ConfigFilePath);
|
||||
failTest = true;
|
||||
}
|
||||
}
|
||||
|
||||
Assert.IsFalse(failTest);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NuSpec_File_Matches_Installed_Dependencies()
|
||||
{
|
||||
var solutionDirectory = GetSolutionDirectory();
|
||||
Assert.NotNull(solutionDirectory);
|
||||
Assert.NotNull(solutionDirectory.Parent);
|
||||
|
||||
var nuSpecPath = solutionDirectory.Parent.FullName + "\\build\\NuSpecs\\";
|
||||
Assert.IsTrue(Directory.Exists(nuSpecPath));
|
||||
|
||||
var packagesAndVersions = GetNuGetPackagesInSolution();
|
||||
var failTest = false;
|
||||
|
||||
var nuSpecFiles = Directory.GetFiles(nuSpecPath);
|
||||
foreach (var fileName in nuSpecFiles.Where(x => x.EndsWith("nuspec")))
|
||||
{
|
||||
var serializer = new XmlSerializer(typeof(NuSpec));
|
||||
using (var reader = new StreamReader(fileName))
|
||||
{
|
||||
var nuspec = (NuSpec)serializer.Deserialize(reader);
|
||||
var dependencies = nuspec.MetaData.dependencies;
|
||||
|
||||
//UmbracoCms.Core has version "[$version$]" - ignore
|
||||
foreach (var dependency in dependencies.Where(x => x.Id != "UmbracoCms.Core"))
|
||||
{
|
||||
var dependencyVersionRange = dependency.Version.Replace("[", string.Empty).Replace("(", string.Empty).Split(',');
|
||||
var dependencyMinimumVersion = dependencyVersionRange.First().Trim();
|
||||
|
||||
var matchingPackages = packagesAndVersions.Where(x => string.Equals(x.PackageName, dependency.Id,
|
||||
StringComparison.InvariantCultureIgnoreCase)).ToList();
|
||||
if (matchingPackages.Any() == false)
|
||||
continue;
|
||||
|
||||
// NuGet_Package_Versions_Are_The_Same_In_All_Package_Config_Files test
|
||||
// guarantees that all packages have one version, solutionwide, so it's okay to take First() here
|
||||
if (dependencyMinimumVersion != matchingPackages.First().PackageVersion)
|
||||
{
|
||||
Debug.WriteLine("NuSpec dependency '{0}' with minimum version {1} in doesn't match with version {2} in the solution",
|
||||
dependency.Id, dependencyMinimumVersion, matchingPackages.First().PackageVersion);
|
||||
failTest = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Assert.IsFalse(failTest);
|
||||
}
|
||||
|
||||
private List<PackageVersionMatcher> GetNuGetPackagesInSolution()
|
||||
{
|
||||
var packagesAndVersions = new List<PackageVersionMatcher>();
|
||||
var solutionDirectory = GetSolutionDirectory();
|
||||
if (solutionDirectory == null)
|
||||
return packagesAndVersions;
|
||||
|
||||
var packageConfigFiles = new List<FileInfo>();
|
||||
var packageDirectories =
|
||||
solutionDirectory.GetDirectories().Where(x =>
|
||||
x.Name.StartsWith("Umbraco.Tests") == false &&
|
||||
x.Name.StartsWith("Umbraco.MSBuild.Tasks") == false).ToArray();
|
||||
|
||||
foreach (var directory in packageDirectories)
|
||||
{
|
||||
var packagesFiles = directory.EnumerateFiles("packages.config");
|
||||
packageConfigFiles.AddRange(packagesFiles);
|
||||
}
|
||||
|
||||
foreach (var file in packageConfigFiles)
|
||||
{
|
||||
//read all and de-duplicate packages
|
||||
var serializer = new XmlSerializer(typeof(PackageConfigEntries));
|
||||
using (var reader = new StreamReader(file.FullName))
|
||||
{
|
||||
var packages = (PackageConfigEntries)serializer.Deserialize(reader);
|
||||
packagesAndVersions.AddRange(packages.Package.Select(package =>
|
||||
new PackageVersionMatcher
|
||||
{
|
||||
PackageName = package.Id,
|
||||
PackageVersion = package.Version,
|
||||
ConfigFilePath = file.FullName
|
||||
}));
|
||||
}
|
||||
}
|
||||
return packagesAndVersions;
|
||||
}
|
||||
|
||||
private DirectoryInfo GetSolutionDirectory()
|
||||
{
|
||||
var testsDirectory = new FileInfo(TestHelper.MapPathForTest("~/"));
|
||||
if (testsDirectory.Directory == null)
|
||||
return null;
|
||||
if (testsDirectory.Directory.Parent == null || testsDirectory.Directory.Parent.Parent == null)
|
||||
return null;
|
||||
var solutionDirectory = testsDirectory.Directory.Parent.Parent.Parent;
|
||||
return solutionDirectory;
|
||||
}
|
||||
}
|
||||
|
||||
public class PackageVersionMatcher
|
||||
{
|
||||
public string ConfigFilePath { get; set; }
|
||||
public string PackageName { get; set; }
|
||||
public string PackageVersion { get; set; }
|
||||
}
|
||||
|
||||
[XmlType(AnonymousType = true)]
|
||||
[XmlRoot(Namespace = "", IsNullable = false, ElementName = "packages")]
|
||||
public class PackageConfigEntries
|
||||
{
|
||||
[XmlElement("package")]
|
||||
public PackagesPackage[] Package { get; set; }
|
||||
}
|
||||
|
||||
[XmlType(AnonymousType = true, TypeName = "package")]
|
||||
public class PackagesPackage
|
||||
{
|
||||
[XmlAttribute(AttributeName = "id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[XmlAttribute(AttributeName = "version")]
|
||||
public string Version { get; set; }
|
||||
}
|
||||
|
||||
|
||||
[XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
|
||||
[XmlRoot(Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", IsNullable = false, ElementName = "package")]
|
||||
public class NuSpec
|
||||
{
|
||||
[XmlElement("metadata")]
|
||||
public Metadata MetaData { get; set; }
|
||||
}
|
||||
|
||||
[XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", TypeName = "metadata")]
|
||||
public class Metadata
|
||||
{
|
||||
[XmlArrayItem("dependency", IsNullable = false)]
|
||||
//TODO: breaks when renamed to capital D
|
||||
public Dependency[] dependencies { get; set; }
|
||||
}
|
||||
|
||||
[XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", TypeName = "dependencies")]
|
||||
public class Dependency
|
||||
{
|
||||
[XmlAttribute(AttributeName = "id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[XmlAttribute(AttributeName = "version")]
|
||||
public string Version { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1339,6 +1339,69 @@ namespace Umbraco.Tests.Services
|
||||
Assert.That(contents.Any(), Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Can_Empty_RecycleBin_With_Content_That_Has_All_Related_Data()
|
||||
{
|
||||
// Arrange
|
||||
//need to:
|
||||
// * add relations
|
||||
// * add permissions
|
||||
// * add notifications
|
||||
// * public access
|
||||
// * tags
|
||||
// * domain
|
||||
// * published & preview data
|
||||
// * multiple versions
|
||||
|
||||
var contentType = MockedContentTypes.CreateAllTypesContentType("test", "test");
|
||||
ServiceContext.ContentTypeService.Save(contentType, 0);
|
||||
|
||||
object obj =
|
||||
new
|
||||
{
|
||||
tags = "Hello,World"
|
||||
};
|
||||
var content1 = MockedContent.CreateBasicContent(contentType);
|
||||
content1.PropertyValues(obj);
|
||||
content1.ResetDirtyProperties(false);
|
||||
ServiceContext.ContentService.Save(content1, 0);
|
||||
Assert.IsTrue(ServiceContext.ContentService.PublishWithStatus(content1, 0).Success);
|
||||
var content2 = MockedContent.CreateBasicContent(contentType);
|
||||
content2.PropertyValues(obj);
|
||||
content2.ResetDirtyProperties(false);
|
||||
ServiceContext.ContentService.Save(content2, 0);
|
||||
Assert.IsTrue(ServiceContext.ContentService.PublishWithStatus(content2, 0).Success);
|
||||
|
||||
ServiceContext.RelationService.Save(new RelationType(Constants.ObjectTypes.DocumentGuid, Constants.ObjectTypes.DocumentGuid, "test"));
|
||||
Assert.IsNotNull(ServiceContext.RelationService.Relate(content1, content2, "test"));
|
||||
|
||||
ServiceContext.PublicAccessService.Save(new PublicAccessEntry(content1, content2, content2, new List<PublicAccessRule>
|
||||
{
|
||||
new PublicAccessRule
|
||||
{
|
||||
RuleType = "test",
|
||||
RuleValue = "test"
|
||||
}
|
||||
}));
|
||||
Assert.IsTrue(ServiceContext.PublicAccessService.AddRule(content1, "test2", "test2").Success);
|
||||
|
||||
Assert.IsNotNull(ServiceContext.NotificationService.CreateNotification(ServiceContext.UserService.GetUserById(0), content1, "test"));
|
||||
|
||||
ServiceContext.ContentService.AssignContentPermission(content1, 'A', new[] {0});
|
||||
|
||||
Assert.IsTrue(ServiceContext.DomainService.Save(new UmbracoDomain("www.test.com", "en-AU")
|
||||
{
|
||||
RootContentId = content1.Id
|
||||
}).Success);
|
||||
|
||||
// Act
|
||||
ServiceContext.ContentService.EmptyRecycleBin();
|
||||
var contents = ServiceContext.ContentService.GetContentInRecycleBin();
|
||||
|
||||
// Assert
|
||||
Assert.That(contents.Any(), Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Can_Move_Content()
|
||||
{
|
||||
|
||||
@@ -154,6 +154,7 @@
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Dependencies\NuGet.cs" />
|
||||
<Compile Include="Migrations\MigrationIssuesTests.cs" />
|
||||
<Compile Include="Persistence\BulkDataReaderTests.cs" />
|
||||
<Compile Include="Persistence\Migrations\MigrationStartupHandlerTests.cs" />
|
||||
|
||||
@@ -2423,9 +2423,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\"
|
||||
<WebProjectProperties>
|
||||
<UseIIS>True</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>7590</DevelopmentServerPort>
|
||||
<DevelopmentServerPort>7510</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>http://localhost:7590</IISUrl>
|
||||
<IISUrl>http://localhost:7510</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
<key alias="unpublish">Depubliceren</key>
|
||||
<key alias="refreshNode">Nodes opnieuw inladen</key>
|
||||
<key alias="republish">Herpubliceer de site</key>
|
||||
<key alias="SetPermissionsForThePage">Stel rechten voor pagina %0% in</key>
|
||||
<key alias="chooseWhereToMove">Waarheen verplaatsen/</key>
|
||||
<key alias="toInTheTreeStructureBelow">Naar de onderstaande boomstructuur</key>
|
||||
<key alias="restore" version="7.3.0">Herstellen</key>
|
||||
<key alias="rights">Rechten</key>
|
||||
<key alias="rollback">Vorige versies</key>
|
||||
<key alias="sendtopublish">Klaar voor publicatie</key>
|
||||
@@ -64,10 +68,10 @@
|
||||
<key alias="atViewingFor">Tonen voor</key>
|
||||
</area>
|
||||
<area alias="buttons">
|
||||
<key alias="clearSelection">Selectie ongedaan maken</key>
|
||||
<key alias="select">Selecteren</key>
|
||||
<key alias="selectCurrentFolder">Selecteer huidige map</key>
|
||||
<key alias="somethingElse">Doe iets anders</key>
|
||||
|
||||
<key alias="bold">Vet</key>
|
||||
<key alias="deindent">Paragraaf uitspringen</key>
|
||||
<key alias="formFieldInsert">Voeg formulierveld in</key>
|
||||
@@ -89,11 +93,14 @@
|
||||
<key alias="save">Opslaan</key>
|
||||
<key alias="saveAndPublish">Opslaan en publiceren</key>
|
||||
<key alias="saveToPublish">Opslaan en verzenden voor goedkeuring</key>
|
||||
<key alias="saveListView">Sla list view op</key>
|
||||
<key alias="showPage">voorbeeld bekijken</key>
|
||||
<key alias="showPageDisabled">Voorbeeld bekijken is uitgeschakeld omdat er geen template is geselecteerd</key>
|
||||
<key alias="styleChoose">Stijl kiezen</key>
|
||||
<key alias="styleShow">Stijlen tonen</key>
|
||||
<key alias="tableInsert">Tabel invoegen</key>
|
||||
<key alias="generateModels">Genereer models</key>
|
||||
<key alias="saveAndGenerateModels">Opslaan en models genereren</key>
|
||||
</area>
|
||||
<area alias="changeDocType">
|
||||
<key alias="changeDocTypeInstruction">Om het documenttype voor de geselecteerde inhoud te wijzigen, selecteert u eerst uit de lijst van geldige types voor deze locatie.</key>
|
||||
@@ -133,7 +140,8 @@
|
||||
<key alias="itemChanged">Dit item is gewijzigd na publicatie</key>
|
||||
<key alias="itemNotPublished">Dit item is niet gepubliceerd</key>
|
||||
<key alias="lastPublished">Laatst gepubliceerd op</key>
|
||||
<key alias="listViewNoItems" version="7.1.5">Nog geen items om weer te geven.</key>
|
||||
<key alias="noItemsToShow">Er zijn geen items om weer te geven</key>
|
||||
<key alias="listViewNoItems" version="7.1.5">Er zijn geen items om weer te geven.</key>
|
||||
<key alias="mediatype">Mediatype</key>
|
||||
<key alias="mediaLinks">Link naar media item(s)</key>
|
||||
<key alias="membergroup">Ledengroep</key>
|
||||
@@ -143,7 +151,9 @@
|
||||
<key alias="nodeName">Pagina Titel</key>
|
||||
<key alias="otherElements">Eigenschappen</key>
|
||||
<key alias="parentNotPublished">Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende node '%0%' niet gepubliceerd is</key>
|
||||
<key alias="parentNotPublishedAnomaly">Oeps: dit document is gepubliceerd, maar het is niet in de cache (interne serverfout)</key>
|
||||
<key alias="parentNotPublishedAnomaly">Dit document is gepubliceerd, maar het is niet in de cache (interne serverfout)</key>
|
||||
<key alias="getUrlException">Kan de Url niet ophalen</key>
|
||||
<key alias="routeError">Dit document is gepubliceerd, maar de Url conflicteert met %0%</key>
|
||||
<key alias="publish">Publiceren</key>
|
||||
<key alias="publishStatus">Publicatiestatus</key>
|
||||
<key alias="releaseDate">Publiceren op</key>
|
||||
@@ -161,23 +171,34 @@
|
||||
<key alias="uploadClear">Bestand(en) verwijderen</key>
|
||||
<key alias="urls">Link naar het document</key>
|
||||
<key alias="memberof">Lid van groep(en)</key>
|
||||
<key alias="notmemberof">Geen lid van groep(en)</key>
|
||||
|
||||
<key alias="notmemberof">Geen lid van groep(en)</key>
|
||||
<key alias="childItems" version="7.0">Kinderen</key>
|
||||
<key alias="target" version="7.0">Doel</key>
|
||||
<key alias="scheduledPublishServerTime">Dit betekend de volgende tijd op de server:</key>
|
||||
<key alias="scheduledPublishDocumentation"><![CDATA[<a href="https://our.umbraco.org/documentation/Getting-Started/Data/Scheduled-Publishing/#timezones" target="_blank">Wat houd dit in?</a>]]></key>
|
||||
</area>
|
||||
<area alias="media">
|
||||
<key alias="clickToUpload">Klik om te uploaden</key>
|
||||
<key alias="dropFilesHere">Plaats je bestanden hier...</key>
|
||||
<key alias="urls">Link naar media</key>
|
||||
<key alias="orClickHereToUpload">Of klik hier om bestanden te kiezen</key>
|
||||
<key alias="onlyAllowedFiles">De toegestane bestandtypen zijn</key>
|
||||
<key alias="disallowedFileType">Dit bestand heeft niet het juiste file-type. Dit bestand kan niet geupload worden.</key>
|
||||
<key alias="maxFileSize">Max file size is</key>
|
||||
</area>
|
||||
<area alias="member">
|
||||
<key alias="createNewMember">Maak nieuwe member aan</key>
|
||||
<key alias="allMembers">Alle Members</key>
|
||||
</area>
|
||||
<area alias="create">
|
||||
<key alias="chooseNode">Waar wil je de nieuwe %0% aanmaken?</key>
|
||||
<key alias="createUnder">Aanmaken onder</key>
|
||||
<key alias="updateData">Kies een type en een titel</key>
|
||||
|
||||
<key alias="noDocumentTypes" version="7.0"><![CDATA[Er zijn geen toegestane documenttypes beschikbaar. Je moet deze inschakelen in de Instellingen sectie onder <strong>"Documenttypes"</ strong>.]]></key>
|
||||
|
||||
<key alias="noMediaTypes" version="7.0"><![CDATA[Er zijn geen toegestande mediatypes beschikbaar. Je moet deze in schakelen in de Instellingen sectie onder <strong>"Mediatypes"</strong>.]]></key>
|
||||
<key alias="documentTypeWithoutTemplate">Document Type zonder template</key>
|
||||
<key alias="newFolder">Nieuwe folder</key>
|
||||
<key alias="newDataType">Nieuw data type</key>
|
||||
</area>
|
||||
<area alias="dashboard">
|
||||
<key alias="browser">Open je website</key>
|
||||
@@ -189,38 +210,38 @@
|
||||
<key alias="welcome">Welkom</key>
|
||||
</area>
|
||||
<area alias="prompt">
|
||||
<key alias="stay">Stay</key>
|
||||
<key alias="discardChanges">Discard changes</key>
|
||||
<key alias="unsavedChanges">You have unsaved changes</key>
|
||||
<key alias="unsavedChangesWarning">Are you sure you want to navigate away from this page? - you have unsaved changes</key>
|
||||
<key alias="stay">Blijf op deze pagina</key>
|
||||
<key alias="discardChanges">Negeer wijzigingen</key>
|
||||
<key alias="unsavedChanges">Wijzigingen niet opgeslagen</key>
|
||||
<key alias="unsavedChangesWarning">Weet je zeker dat deze pagina wilt verlaten? - er zijn onopgeslagen wijzigingen</key>
|
||||
</area>
|
||||
<area alias="bulk">
|
||||
<key alias="done">Done</key>
|
||||
|
||||
<key alias="deletedItem">Deleted %0% item</key>
|
||||
<key alias="deletedItems">Deleted %0% items</key>
|
||||
<key alias="deletedItemOfItem">Deleted %0% out of %1% item</key>
|
||||
<key alias="deletedItemOfItems">Deleted %0% out of %1% items</key>
|
||||
|
||||
<key alias="publishedItem">Published %0% item</key>
|
||||
<key alias="publishedItems">Published %0% items</key>
|
||||
<key alias="publishedItemOfItem">Published %0% out of %1% item</key>
|
||||
<key alias="publishedItemOfItems">Published %0% out of %1% items</key>
|
||||
|
||||
<key alias="unpublishedItem">Unpublished %0% item</key>
|
||||
<key alias="unpublishedItems">Unpublished %0% items</key>
|
||||
<key alias="unpublishedItemOfItem">Unpublished %0% out of %1% item</key>
|
||||
<key alias="unpublishedItemOfItems">Unpublished %0% out of %1% items</key>
|
||||
|
||||
<key alias="movedItem">Moved %0% item</key>
|
||||
<key alias="movedItems">Moved %0% items</key>
|
||||
<key alias="movedItemOfItem">Moved %0% out of %1% item</key>
|
||||
<key alias="movedItemOfItems">Moved %0% out of %1% items</key>
|
||||
|
||||
<key alias="copiedItem">Copied %0% item</key>
|
||||
<key alias="copiedItems">Copied %0% items</key>
|
||||
<key alias="copiedItemOfItem">Copied %0% out of %1% item</key>
|
||||
<key alias="copiedItemOfItems">Copied %0% out of %1% items</key>
|
||||
|
||||
<key alias="deletedItem">%0% item verwijderd</key>
|
||||
<key alias="deletedItems">%0% items verwijderd</key>
|
||||
<key alias="deletedItemOfItem">Item %0% van de %1% verwijderd</key>
|
||||
<key alias="deletedItemOfItems">Items %0% van de %1% verwijderd</key>
|
||||
|
||||
<key alias="publishedItem">%0% item gepubliceerd</key>
|
||||
<key alias="publishedItems">%0% items gepubliceerd</key>
|
||||
<key alias="publishedItemOfItem">Item %0% van de %1% gepubliceerd</key>
|
||||
<key alias="publishedItemOfItems">Items %0% van de %1% gepubliceerd</key>
|
||||
|
||||
<key alias="unpublishedItem">%0% item gedepubliceerd</key>
|
||||
<key alias="unpublishedItems">%0% items gedepubliceerd</key>
|
||||
<key alias="unpublishedItemOfItem">Item %0% van de %1% gedepubliceerd</key>
|
||||
<key alias="unpublishedItemOfItems">Items %0% van de %1% gedepubliceerd</key>
|
||||
|
||||
<key alias="movedItem">%0% item verplaatst</key>
|
||||
<key alias="movedItems">%0% items verplaatst</key>
|
||||
<key alias="movedItemOfItem">item %0% van de %1% verplaatst</key>
|
||||
<key alias="movedItemOfItems">items %0% van de %1% verplaatst</key>
|
||||
|
||||
<key alias="copiedItem">%0% item gekopieerd</key>
|
||||
<key alias="copiedItems">%0% items gekopieerd</key>
|
||||
<key alias="copiedItemOfItem">item %0% van de %1% gekopieerd</key>
|
||||
<key alias="copiedItemOfItems">item %0% van de %1% gekopieerd</key>
|
||||
</area>
|
||||
<area alias="defaultdialogs">
|
||||
<key alias="anchorInsert">Naam</key>
|
||||
@@ -269,21 +290,55 @@
|
||||
<key alias="thumbnailimageclickfororiginal">Klik op de afbeelding voor volledige grootte</key>
|
||||
<key alias="treepicker">Kies een item</key>
|
||||
<key alias="viewCacheItem">Toon cache item</key>
|
||||
<key alias="createFolder">Maak folder aan...</key>
|
||||
<key alias="relateToOriginalLabel">Relateer aan origineel</key>
|
||||
<key alias="includeDescendants">Descendants meenemen</key>
|
||||
<key alias="theFriendliestCommunity">De vriendelijkste community</key>
|
||||
<key alias="linkToPage">Link naar pagina</key>
|
||||
<key alias="openInNewWindow">Opent het gelinkte document in een nieuw venster of tab</key>
|
||||
<key alias="linkToMedia">Link naar media</key>
|
||||
<key alias="selectMedia">Selecteer media</key>
|
||||
<key alias="selectIcon">Selecteer icoon</key>
|
||||
<key alias="selectItem">Selecteer item</key>
|
||||
<key alias="selectLink">Selecteer link</key>
|
||||
<key alias="selectMacro">Selecteer macro</key>
|
||||
<key alias="selectContent">Selecteer content</key>
|
||||
<key alias="selectMember">Selecteer member</key>
|
||||
<key alias="selectMemberGroup">Selecteer member group</key>
|
||||
<key alias="noMacroParams">Er zijn geen parameters voor deze macro</key>
|
||||
<key alias="externalLoginProviders">Externe login providers</key>
|
||||
<key alias="exceptionDetail">Error details</key>
|
||||
<key alias="stacktrace">Stacktrace</key>
|
||||
<key alias="innerException">Inner Exception</key>
|
||||
<key alias="linkYour">Link je</key>
|
||||
<key alias="unLinkYour">De-Link je</key>
|
||||
<key alias="account">account</key>
|
||||
<key alias="selectEditor">Selecteer editor</key>
|
||||
</area>
|
||||
<area alias="dictionaryItem">
|
||||
<key alias="description"><![CDATA[
|
||||
Wijzig de verschillende taalversies voor het woordenboek item '%0%'. Je kunt extra talen toevoegen bij 'talen' in het menu links
|
||||
]]></key>
|
||||
<key alias="displayName">Cultuurnaam</key>
|
||||
<key alias="changeKey">Verander de key van het dictionary item.</key>
|
||||
<key alias="changeKeyError">
|
||||
<![CDATA[
|
||||
De key '%0%' bestaat al.
|
||||
]]>
|
||||
</key>
|
||||
</area>
|
||||
<area alias="placeholders">
|
||||
<key alias="username">Typ je gebruikersnaam</key>
|
||||
<key alias="password">Typ je wachtwoord</key>
|
||||
<key alias="username">Typ jouw gebruikersnaam</key>
|
||||
<key alias="password">Typ jouw wachtwoord</key>
|
||||
<key alias="confirmPassword">Bevestig jouw wachtwoord</key>
|
||||
<key alias="nameentity">Benoem de %0%...</key>
|
||||
<key alias="entername">Typ een naam...</key>
|
||||
<key alias="label">Label...</key>
|
||||
<key alias="enterDescription">Voer een omschrijving in...</key>
|
||||
<key alias="search">Typ om te zoeken...</key>
|
||||
<key alias="filter">Typ om te filteren...</key>
|
||||
<key alias="enterTags">Typ om tags toe te voegen (druk op enter na elke tag)...</key>
|
||||
<key alias="email">Voer jouw email in</key>
|
||||
</area>
|
||||
|
||||
<area alias="editcontenttype">
|
||||
@@ -331,10 +386,17 @@
|
||||
<key alias="errorRegExpWithoutTab">%0% is niet in het correcte formaat</key>
|
||||
</area>
|
||||
<area alias="errors">
|
||||
<key alias="receivedErrorFromServer">Een error ontvangen van de server</key>
|
||||
<key alias="dissallowedMediaType">Het opgegeven bestandstype is niet toegestaan door de beheerder</key>
|
||||
<key alias="codemirroriewarning">OPMERKING! Ondanks dat CodeMiror is ingeschakeld, is het uitgeschakeld in Internet Explorer omdat het niet stabiel genoeg is.</key>
|
||||
<key alias="contentTypeAliasAndNameNotNull">Zowel de alias als de naam van het nieuwe eigenschappen type moeten worden ingevuld!</key>
|
||||
<key alias="filePermissionsError">Er is een probleem met de lees/schrijf rechten op een bestand of map</key>
|
||||
<key alias="macroErrorLoadingPartialView">Error bij het laden van Partial View script (file: %0%)</key>
|
||||
<key alias="macroErrorLoadingUsercontrol">Error bij het laden van userControl '%0%'</key>
|
||||
<key alias="macroErrorLoadingCustomControl">Error bij het laden van customControl (Assembly: %0%, Type: '%1%')</key>
|
||||
<key alias="macroErrorLoadingMacroEngineScript">Error bij het laden van MacroEngine script (file: %0%)</key>
|
||||
<key alias="macroErrorParsingXSLTFile">"Error bij het parsen van XSLT file: %0%</key>
|
||||
<key alias="macroErrorReadingXSLTFile">"Error bij het laden van XSLT file: %0%</key>
|
||||
<key alias="missingTitle">Vul een titel in</key>
|
||||
<key alias="missingType">Selecteer een type</key>
|
||||
<key alias="pictureResizeBiggerThanOrg">U wilt een afbeelding groter maken dan de originele afmetingen. Weet je zeker dat je wilt doorgaan?</key>
|
||||
@@ -355,102 +417,142 @@
|
||||
<key alias="actions">Acties</key>
|
||||
<key alias="add">Toevoegen</key>
|
||||
<key alias="alias">Alias</key>
|
||||
<key alias="all">Alles</key>
|
||||
<key alias="areyousure">Weet je het zeker?</key>
|
||||
<key alias="border">Rand</key>
|
||||
<key alias="by">of</key>
|
||||
<key alias="cancel">Annuleren</key>
|
||||
<key alias="back">Terug</key>
|
||||
<key alias="border">Border</key>
|
||||
<key alias="by">bij</key>
|
||||
<key alias="cancel">Cancel</key>
|
||||
<key alias="cellMargin">Cel marge</key>
|
||||
<key alias="choose">Kiezen</key>
|
||||
<key alias="close">Sluiten</key>
|
||||
<key alias="closewindow">Venster sluiten</key>
|
||||
<key alias="comment">Opmerking</key>
|
||||
<key alias="confirm">Bevestigen</key>
|
||||
<key alias="constrainProportions">Verhouding behouden</key>
|
||||
<key alias="continue">Doorgaan</key>
|
||||
<key alias="copy">Kopiëren</key>
|
||||
<key alias="choose">Kies</key>
|
||||
<key alias="close">Sluit</key>
|
||||
<key alias="closewindow">Sluit venster</key>
|
||||
<key alias="comment">Comment</key>
|
||||
<key alias="confirm">Bevestig</key>
|
||||
<key alias="constrainProportions">Verhoudingen behouden</key>
|
||||
<key alias="continue">Ga verder</key>
|
||||
<key alias="copy">Copy</key>
|
||||
<key alias="create">Aanmaken</key>
|
||||
<key alias="database">Databank</key>
|
||||
<key alias="database">Database</key>
|
||||
<key alias="date">Datum</key>
|
||||
<key alias="default">Standaard</key>
|
||||
<key alias="delete">Verwijderen</key>
|
||||
<key alias="delete">Verwijder</key>
|
||||
<key alias="deleted">Verwijderd</key>
|
||||
<key alias="deleting">Verwijderen...</key>
|
||||
<key alias="deleting">Aan het verwijderen...</key>
|
||||
<key alias="design">Ontwerp</key>
|
||||
<key alias="dimensions">Afmetingen</key>
|
||||
<key alias="down">Beneden</key>
|
||||
<key alias="down">Omlaag</key>
|
||||
<key alias="download">Download</key>
|
||||
<key alias="edit">Aanpassen</key>
|
||||
<key alias="edited">Aangepast</key>
|
||||
<key alias="edit">Bewerk</key>
|
||||
<key alias="edited">Bewerkt</key>
|
||||
<key alias="elements">Elementen</key>
|
||||
<key alias="email">E-mail</key>
|
||||
<key alias="email">Email</key>
|
||||
<key alias="error">Fout</key>
|
||||
<key alias="findDocument">Zoeken</key>
|
||||
<key alias="height">Hoogte</key>
|
||||
<key alias="findDocument">Vind</key>
|
||||
<key alias="height">Hogte</key>
|
||||
<key alias="help">Help</key>
|
||||
<key alias="icon">Icoon</key>
|
||||
<key alias="import">Importeren</key>
|
||||
<key alias="innerMargin">Binnenmarge</key>
|
||||
<key alias="import">Import</key>
|
||||
<key alias="innerMargin">Binnenste marge</key>
|
||||
<key alias="insert">Invoegen</key>
|
||||
<key alias="install">Installeren</key>
|
||||
<key alias="justify">Uitvullen</key>
|
||||
<key alias="invalid">Ongeldig</key>
|
||||
<key alias="justify">Justify</key>
|
||||
<key alias="label">Label</key>
|
||||
<key alias="language">Taal</key>
|
||||
<key alias="layout">Lay-out</key>
|
||||
<key alias="loading">Bezig met laden</key>
|
||||
<key alias="locked">Geblokkeerd</key>
|
||||
<key alias="layout">Layout</key>
|
||||
<key alias="loading">Aan het laden</key>
|
||||
<key alias="locked">Gesloten</key>
|
||||
<key alias="login">Inloggen</key>
|
||||
<key alias="logoff">Afmelden</key>
|
||||
<key alias="logout">Afmelden</key>
|
||||
<key alias="logoff">Uitloggen</key>
|
||||
<key alias="logout">Uitloggen</key>
|
||||
<key alias="macro">Macro</key>
|
||||
<key alias="move">Verplaatsen</key>
|
||||
<key alias="more">Meer</key>
|
||||
<key alias="mandatory">Verplicht</key>
|
||||
<key alias="move">Verplaats</key>
|
||||
<key alias="more">meer</key>
|
||||
<key alias="name">Naam</key>
|
||||
<key alias="new">Nieuw</key>
|
||||
<key alias="next">Volgende</key>
|
||||
<key alias="no">Nee</key>
|
||||
<key alias="of">van</key>
|
||||
<key alias="ok">Ok</key>
|
||||
<key alias="open">Openen</key>
|
||||
<key alias="of">of</key>
|
||||
<key alias="ok">OK</key>
|
||||
<key alias="open">Open</key>
|
||||
<key alias="or">of</key>
|
||||
<key alias="password">Wachtwoord</key>
|
||||
<key alias="path">Pad</key>
|
||||
<key alias="placeHolderID">Placeholder ID</key>
|
||||
<key alias="pleasewait">Een ogenblik geduld a.u.b.</key>
|
||||
<key alias="pleasewait">Een ogenblik geduld aub...</key>
|
||||
<key alias="previous">Vorige</key>
|
||||
<key alias="properties">Eigenschappen</key>
|
||||
<key alias="reciept">E-mail om formulier te ontvangen</key>
|
||||
<key alias="reciept">Email om formulier resultaten te ontvangen</key>
|
||||
<key alias="recycleBin">Prullenbak</key>
|
||||
<key alias="remaining">Overgebleven</key>
|
||||
<key alias="rename">Hernoemen</key>
|
||||
<key alias="recycleBinEmpty">De prullenbak is leeg</key>
|
||||
<key alias="remaining">Overblijvend</key>
|
||||
<key alias="rename">Hernoem</key>
|
||||
<key alias="renew">Vernieuw</key>
|
||||
<key alias="required" version="7.0">Verplicht</key>
|
||||
<key alias="retry">Opnieuw proberen</key>
|
||||
<key alias="rights">Rechten</key>
|
||||
<key alias="search">Zoek</key>
|
||||
<key alias="search">Zoeken</key>
|
||||
<key alias="searchNoResult">We konden helaas niet vinden wat je zocht</key>
|
||||
<key alias="server">Server</key>
|
||||
<key alias="show">Tonen</key>
|
||||
<key alias="showPageOnSend">Toon pagina bij versturen</key>
|
||||
<key alias="size">Formaat</key>
|
||||
<key alias="sort">Sorteren</key>
|
||||
<key alias="submit">Submit</key> <!-- TODO: Translate this -->
|
||||
<key alias="type">Type</key>
|
||||
<key alias="typeToSearch">Type om te zoeken...</key>
|
||||
<key alias="show">Toon</key>
|
||||
<key alias="showPageOnSend">Toon pagina na verzenden</key>
|
||||
<key alias="size">Grootte</key>
|
||||
<key alias="sort">Sorteer</key>
|
||||
<key alias="submit">Verstuur</key>
|
||||
<key alias="type">Typen</key>
|
||||
<key alias="typeToSearch">Typ om te zoeken...</key>
|
||||
<key alias="up">Omhoog</key>
|
||||
<key alias="update">Bijwerken</key>
|
||||
<key alias="update">Update</key>
|
||||
<key alias="upgrade">Upgrade</key>
|
||||
<key alias="upload">Upload</key>
|
||||
<key alias="url">Url</key>
|
||||
<key alias="user">Gebruiker</key>
|
||||
<key alias="username">Gebruikersnaam</key>
|
||||
<key alias="value">Waarde</key>
|
||||
<key alias="view">Toon</key>
|
||||
<key alias="view">Bekijk</key>
|
||||
<key alias="welcome">Welkom...</key>
|
||||
<key alias="width">Breedte</key>
|
||||
<key alias="yes">Ja</key>
|
||||
<key alias="folder">Map</key>
|
||||
<key alias="reorder">Reorder</key>
|
||||
<key alias="reorderDone">I am done reordering</key>
|
||||
|
||||
<key alias="searchResults">Zoekresultaten</key>
|
||||
<key alias="reorder">Herschik</key>
|
||||
<key alias="reorderDone">Ik ben klaar met herschikken</key>
|
||||
<key alias="preview">Voorvertoning</key>
|
||||
<key alias="changePassword">Wachtwoord veranderen</key>
|
||||
<key alias="to">naar</key>
|
||||
<key alias="listView">Lijstweergave</key>
|
||||
<key alias="saving">Aan het opslaan...</key>
|
||||
<key alias="current">huidig</key>
|
||||
<key alias="embed">Embed</key>
|
||||
<key alias="selected">geselecteerd</key>
|
||||
</area>
|
||||
<area alias="colors">
|
||||
<key alias="black">Zwart</key>
|
||||
<key alias="green">Groen</key>
|
||||
<key alias="yellow">Geel</key>
|
||||
<key alias="orange">Oranje</key>
|
||||
<key alias="blue">Blauw</key>
|
||||
<key alias="red">Rood</key>
|
||||
</area>
|
||||
<area alias="shortcuts">
|
||||
<key alias="addTab">Tab toevoegen</key>
|
||||
<key alias="addProperty">Property toevoegen</key>
|
||||
<key alias="addEditor">Editor toevoegen</key>
|
||||
<key alias="addTemplate">Template toevoegen</key>
|
||||
<key alias="addChildNode">Child node toevoegen</key>
|
||||
<key alias="addChild">Child toevoegen</key>
|
||||
|
||||
<key alias="editDataType">Data type bewerken</key>
|
||||
|
||||
<key alias="navigateSections">Secties navigeren</key>
|
||||
|
||||
<key alias="shortcut">Shortcuts</key>
|
||||
<key alias="showShortcuts">Toon shortcuts</key>
|
||||
|
||||
<key alias="toggleListView">Toggle lijstweergave</key>
|
||||
<key alias="toggleAllowAsRoot">Toggle toestaan op root-niveau</key>
|
||||
</area>
|
||||
<area alias="graphicheadline">
|
||||
<key alias="backgroundcolor">Achtergrondkleur</key>
|
||||
@@ -528,6 +630,57 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="watch">Bekijken</key>
|
||||
<key alias="welcomeIntro"><![CDATA[Deze wizard helpt u met het configureren van <strong>Umbraco %0%</strong> voor een nieuwe installatie of een upgrade van versie 3.0. <br /><br /> Druk op <strong>"volgende"</strong> om de wizard te starten.]]></key>
|
||||
</area>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<area alias="language">
|
||||
<key alias="cultureCode">Cultuurcode</key>
|
||||
<key alias="displayName">Cultuurnaam</key>
|
||||
@@ -543,12 +696,22 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="greeting3">Fijne woensdag</key>
|
||||
<key alias="greeting4">Fijne donderdag</key>
|
||||
<key alias="greeting5">Fijne vrijdag</key>
|
||||
<key alias="greeting6">Fijne zaterdag</key>
|
||||
|
||||
<key alias="greeting6">Fijne zaterdag</key>
|
||||
<key alias="instruction">log hieronder in</key>
|
||||
<key alias="signInWith">Inloggen met</key>
|
||||
<key alias="timeout">Sessie is verlopen</key>
|
||||
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">umbraco.com</a></p>]]></key>
|
||||
<key alias="forgottenPassword">Wachtwoord vergeten?</key>
|
||||
<key alias="forgottenPasswordInstruction">Er zal een email worden gestuurd naar het emailadres van jouw account. Hierin staat een link om je wachtwoord te resetten</key>
|
||||
<key alias="requestPasswordResetConfirmation">Een email met daarin de wachtwoord reset uitleg zal worden gestuurd als het emailadres in onze database voorkomt.</key>
|
||||
<key alias="returnToLogin">Terug naar loginformulier</key>
|
||||
<key alias="setPasswordInstruction">Geeft alsjeblieft een nieuw wachtwoord op</key>
|
||||
<key alias="setPasswordConfirmation">Je wachtwoord is aangepast</key>
|
||||
<key alias="resetCodeExpired">De link die je hebt aangeklikt is niet (meer) geldig.</key>
|
||||
<key alias="resetPasswordEmailCopySubject">Umbraco: Wachtwoord Reset</key>
|
||||
<key alias="resetPasswordEmailCopyFormat">
|
||||
<![CDATA[<p>De gebruikersnaam om in te loggen bij jouw Umbraco omgeving is: <strong>%0%</strong></p><p>Klik <a href="%1%"><strong>hier</strong></a> om je wachtwoord te resetten of knip/plak deze URL in je browser:</p><p><em>%1%</em></p>]]>
|
||||
</key>
|
||||
</area>
|
||||
<area alias="main">
|
||||
<key alias="dashboard">Dashboard</key>
|
||||
@@ -646,6 +809,15 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="packageVersion">Package versie</key>
|
||||
<key alias="packageVersionHistory">Package versiehistorie</key>
|
||||
<key alias="viewPackageWebsite">Bekijk de package website</key>
|
||||
<key alias="packageAlreadyInstalled">Package reeds geinstalleerd</key>
|
||||
<key alias="targetVersionMismatch">Deze package kan niet worden geinstalleerd omdat minimaal Umbraco versie %0% benodigd is.</key>
|
||||
<key alias="installStateUninstalling">Aan het deinstalleren...</key>
|
||||
<key alias="installStateDownloading">Aan het downloaden...</key>
|
||||
<key alias="installStateImporting">Aan het importeren...</key>
|
||||
<key alias="installStateInstalling">Aan het installeren...</key>
|
||||
<key alias="installStateRestarting">Aan het herstarten, een ongenblik geduld aub...</key>
|
||||
<key alias="installStateComplete">Geinstalleerd! Je browser zal nu automatisch ververst worden...</key>
|
||||
<key alias="installStateCompleted">Kruk op "finish" om de installate te voltooien en de pagina te verversen.</key>
|
||||
</area>
|
||||
<area alias="paste">
|
||||
<key alias="doNothing">Plakken met alle opmaak (Niet aanbevolen)</key>
|
||||
@@ -677,13 +849,18 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
%0% kan niet worden gepubliceerd omdat het item is gepland voor release.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="contentPublishedFailedExpired"><![CDATA[
|
||||
%0% kon niet gepubliceerd worden omdat het item niet meer geldig is.
|
||||
]]></key>
|
||||
<key alias="contentPublishedFailedInvalid"><![CDATA[
|
||||
%0% kan niet worden gepubliceerd, omdat de eigenschappen:%1% de validatieregels niet hebben doorstaan.
|
||||
]]></key>
|
||||
<key alias="contentPublishedFailedByEvent"><![CDATA[
|
||||
%0% kon niet worden gepubliceerd doordat een 3rd party extensie het heeft geannuleerd.
|
||||
|
||||
%0% kon niet worden gepubliceerd doordat een 3rd party extensie het heeft geannuleerd.
|
||||
]]></key>
|
||||
<key alias="contentPublishedFailedByParent"><![CDATA[
|
||||
%0% kon niet gepubliceerd worden, omdat de parent pagina niet gepubliceerd is.
|
||||
]]></key>
|
||||
<key alias="includeUnpublished">Inclusief ongepubliceerde kinderen</key>
|
||||
<key alias="inProgress">Publicatie in uitvoering - even geduld...</key>
|
||||
<key alias="inProgressCounter">%0% van %1% pagina’s zijn gepubliceerd...</key>
|
||||
@@ -698,16 +875,13 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="noColors">Je hebt geen goedgekeurde kleuren geconfigureerd</key>
|
||||
</area>
|
||||
<area alias="relatedlinks">
|
||||
<key alias="addExternal">Externe link toevoegen</key>
|
||||
<key alias="addInternal">Interne link toevoegen</key>
|
||||
<key alias="addlink">Toevoegen</key>
|
||||
<key alias="caption">Bijschrift</key>
|
||||
<key alias="internalPage">Interne pagina</key>
|
||||
<key alias="linkurl">URL</key>
|
||||
<key alias="modeDown">Verplaats omlaag</key>
|
||||
<key alias="modeUp">Verplaats omhoog</key>
|
||||
<key alias="newWindow">Open in nieuw venster</key>
|
||||
<key alias="removeLink">Verwijder link</key>
|
||||
<key alias="enterExternal">Externe link toevoegen</key>
|
||||
<key alias="chooseInternal">Interne link toevoegen</key>
|
||||
<key alias="caption">Bijschrift</key>
|
||||
<key alias="link">Link</key>
|
||||
<key alias="newWindow">In een nieuw venster openen</key>
|
||||
<key alias="captionPlaceholder">Voer het bijschrijft in</key>
|
||||
<key alias="externalLinkPlaceholder">Voer de link in</key>
|
||||
</area>
|
||||
<area alias="imagecropper">
|
||||
<key alias="reset">Reset</key>
|
||||
@@ -736,13 +910,17 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="settings">Instellingen</key>
|
||||
<key alias="statistics">Statistieken</key>
|
||||
<key alias="translation">Vertaling</key>
|
||||
<key alias="users">Gebruikers</key>
|
||||
<key alias="contour" version="4.0">Umbraco Contour</key>
|
||||
|
||||
<key alias="users">Gebruikers</key>
|
||||
<key alias="help" version="7.0">Help</key>
|
||||
<key alias="forms">Formulieren</key>
|
||||
<key alias="analytics">Analytics</key>
|
||||
</area>
|
||||
<area alias="help">
|
||||
<key alias="goTo">ga naar</key>
|
||||
<key alias="helpTopicsFor">Help onderwerpen voor</key>
|
||||
<key alias="videoChaptersFor">Video's voor</key>
|
||||
<key alias="theBestUmbracoVideoTutorials">De beste Umbraco video tutorials</key>
|
||||
</area>
|
||||
<area alias="settings">
|
||||
<key alias="defaulttemplate">Standaard template</key>
|
||||
<key alias="dictionary editor egenskab">Woordenboek sleutel</key>
|
||||
@@ -762,6 +940,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="noPropertiesDefinedOnTab">Geen eigenschappen gedefinieerd op dit tabblad. Klik op de link "voeg een nieuwe eigenschap" aan de bovenkant om een nieuwe eigenschap te creëren.</key>
|
||||
<key alias="masterDocumentType">Master Document Type</key>
|
||||
<key alias="createMatchingTemplate">Maak een bijbehorend template</key>
|
||||
<key alias="addIcon">Icon toevoegen</key>
|
||||
</area>
|
||||
<area alias="sort">
|
||||
<key alias="sortOrder">Sort order</key>
|
||||
@@ -771,7 +950,13 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="sortPleaseWait"><![CDATA[Een ogenblik geduld. Paginas worden gesorteerd, dit kan even duren.<br/> <br/> Sluit dit venster niet tijdens het sorteren]]></key>
|
||||
</area>
|
||||
<area alias="speechBubbles">
|
||||
<key alias="contentPublishedFailedByEvent">Publicatie werd geannuleerd door een 3rd party plug-in</key>
|
||||
<key alias="validationFailedHeader">Validatie</key>
|
||||
<key alias="validationFailedMessage">Validatiefouten moeten worden opgelost voor dit item kan worden opgeslagen</key>
|
||||
<key alias="operationFailedHeader">Mislukt</key>
|
||||
<key alias="invalidUserPermissionsText">Wegens onvoldoende rechten kon deze handeling kon niet worden uitegevoerd </key>
|
||||
<key alias="operationCancelledHeader">Geannuleerd</key>
|
||||
<key alias="operationCancelledText">Uitvoering is g eannuleerd door de plugin van een 3e partij</key>
|
||||
<key alias="contentPublishedFailedByEvent">Publicatie werd geannuleerd doordeeen plugin van een 3e partij</key>
|
||||
<key alias="contentTypeDublicatePropertyType">Eigenschappen type bestaat al</key>
|
||||
<key alias="contentTypePropertyTypeCreated">Eigenschappen type aangemaakt</key>
|
||||
<key alias="contentTypePropertyTypeCreatedText"><![CDATA[Naam: %0% <br /> Data type: %1%]]></key>
|
||||
@@ -806,6 +991,8 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="fileSavedHeader">Bestand opgeslagen</key>
|
||||
<key alias="fileSavedText">Bestand opgeslagen zonder fouten</key>
|
||||
<key alias="languageSaved">Taal opgeslagen</key>
|
||||
<key alias="mediaTypeSavedHeader">Media Type opgeslagen</key>
|
||||
<key alias="memberTypeSavedHeader">Member Type opgeslagen</key>
|
||||
<key alias="pythonErrorHeader">Python script niet opgeslagen</key>
|
||||
<key alias="pythonErrorText">Python script kon niet worden opgeslagen door een fout</key>
|
||||
<key alias="pythonSavedHeader">Python script opeslagen!</key>
|
||||
@@ -824,6 +1011,11 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="partialViewSavedText">Partial view opgeslagen zonder fouten!</key>
|
||||
<key alias="partialViewErrorHeader">Partial view niet opgeslagen</key>
|
||||
<key alias="partialViewErrorText">Er is een fout opgetreden bij het opslaan van het bestand.</key>
|
||||
<key alias="scriptSavedHeader">Script view opgeslagen</key>
|
||||
<key alias="scriptSavedText">Script view opgeslagen zonder fouten!</key>
|
||||
<key alias="scriptErrorHeader">Script view niet opgeslagen</key>
|
||||
<key alias="scriptErrorText">Er is een fout opgetreden bij het opslaan van dit bestand.</key>
|
||||
<key alias="cssErrorText">Er is een fout opgetreden bij het opslaan van dit bestand.</key>
|
||||
</area>
|
||||
<area alias="stylesheet">
|
||||
<key alias="aliasHelp">Gebruik CSS syntax bijv: h1, .redHeader, .blueTex</key>
|
||||
@@ -846,15 +1038,15 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
</area>
|
||||
<area alias="grid">
|
||||
<key alias="insertControl">Item toevoegen</key>
|
||||
<key alias="chooseLayout">Choose a layout</key>
|
||||
<key alias="addRows">Een rij aan de lay-out toevoegen</key>
|
||||
<key alias="addElement"><![CDATA[Klik om te starten op het <i class="icon icon-add blue"></i> teken onderaan en voeg je eerste item toe]]></key>
|
||||
<key alias="chooseLayout">Kies de indeling</key>
|
||||
<key alias="addRows">Kies een indeling voor deze pagina om content toe te kunnen voegen</key>
|
||||
<key alias="addElement"><![CDATA[<i class="icon icon-add blue"></i> Plaats een (extra) content blok]]></key>
|
||||
<key alias="dropElement">Drop content</key>
|
||||
<key alias="settingsApplied">Settings applied</key>
|
||||
|
||||
<key alias="contentNotAllowed">This content is not allowed here</key>
|
||||
<key alias="contentAllowed">This content is allowed here</key>
|
||||
<key alias="settingsApplied">Instellingen toegepast</key>
|
||||
|
||||
<key alias="contentNotAllowed">Deze content is hier niet toegestaan</key>
|
||||
<key alias="contentAllowed">Deze content is hier toegestaan</key>
|
||||
|
||||
<key alias="clickToEmbed">Klik om een item te embedden</key>
|
||||
<key alias="clickToInsertImage">Klik om een afbeelding in te voegen</key>
|
||||
<key alias="placeholderImageCaption">Afbeelding ondertitel...</key>
|
||||
@@ -883,7 +1075,79 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
|
||||
<key alias="allowAllEditors">Alle editors toelaten</key>
|
||||
<key alias="allowAllRowConfigurations">Alle rijconfiguraties toelaten</key>
|
||||
<key alias="setAsDefault">Instellen als standaard</key>
|
||||
<key alias="chooseExtra">Kies extra</key>
|
||||
<key alias="chooseDefault">Kies standaard</key>
|
||||
<key alias="areAdded">zijn toegevoegd</key>
|
||||
</area>
|
||||
|
||||
<area alias="contentTypeEditor">
|
||||
<key alias="compositions">Composities</key>
|
||||
<key alias="noTabs">Er zijn nog geen tabs toegevoegd</key>
|
||||
<key alias="addNewTab">Voeg een nieuwe tab toe</key>
|
||||
<key alias="addAnotherTab">Voeg nog een tab toe</key>
|
||||
<key alias="inheritedFrom">Inherited van</key>
|
||||
<key alias="addProperty">Voeg property toe</key>
|
||||
<key alias="requiredLabel">Verplicht label</key>
|
||||
|
||||
<key alias="enableListViewHeading">Zet list view aan</key>
|
||||
<key alias="enableListViewDescription">Laat de child nodes van het content item zien als een sorteer- en doorzoekbare lijstweergave zien. Deze child nodes worden dan niet in de boomstructuur getoond.</key>
|
||||
|
||||
<key alias="allowedTemplatesHeading">Toegestane Templates</key>
|
||||
<key alias="allowedTemplatesDescription">Kies welke templates toegestaan zijn om door de editors op dit content-type gebruikt te worden</key>
|
||||
<key alias="allowAsRootHeading">Sta toe op root-niveau</key>
|
||||
<key alias="allowAsRootDescription">Sta editors toe om content van dit type aan te maken op root-niveau</key>
|
||||
<key alias="allowAsRootCheckbox">Ja - sta content van dit type toe op root-niveau</key>
|
||||
|
||||
<key alias="childNodesHeading">Toegestane child node types</key>
|
||||
<key alias="childNodesDescription">Sta contetn van een bepaalde type toe om onder dit type aangemaakt te kunnen worden</key>
|
||||
|
||||
<key alias="chooseChildNode">Kies child node</key>
|
||||
<key alias="compositionsDescription">Overerfde tabs en properties van een bestaand document-type. Nieuwe tabs worden toegevoegd aan het huidige document-type of samengevoegd als een tab met de identieke naam al bestaat.</key>
|
||||
<key alias="compositionInUse">Dit content-type wordt gebruikt in een compositie en kan daarom niet zelf een compositie worden.</key>
|
||||
<key alias="noAvailableCompositions">Er zijn geen content-typen beschikbaar om als compositie te gebruiken.</key>
|
||||
|
||||
<key alias="availableEditors">Beschikbare editors</key>
|
||||
<key alias="reuse">Herbruik</key>
|
||||
<key alias="editorSettings">Editor instellingen</key>
|
||||
|
||||
<key alias="configuration">Configuratie</key>
|
||||
|
||||
<key alias="yesDelete">Ja, verwijder</key>
|
||||
|
||||
<key alias="movedUnderneath">is naar onder geplaatst</key>
|
||||
<key alias="copiedUnderneath">is naar onder gecopierd</key>
|
||||
<key alias="folderToMove">Selecteer de map om te verplaatsen</key>
|
||||
<key alias="folderToCopy">Selecteer de map om te kopieren</key>
|
||||
<key alias="structureBelow">naar de boomstructuur onder</key>
|
||||
|
||||
<key alias="allDocumentTypes">Alle Document types</key>
|
||||
<key alias="allDocuments">Alle documenten</key>
|
||||
<key alias="allMediaItems">Alle media items</key>
|
||||
|
||||
<key alias="usingThisDocument">die gebruik maken van dit document type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen.</key>
|
||||
<key alias="usingThisMedia">die gebruik maken van dit media type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen.</key>
|
||||
<key alias="usingThisMember">die gebruik maken van dit member type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen.</key>
|
||||
|
||||
<key alias="andAllDocuments">en alle documenten van dit type</key>
|
||||
<key alias="andAllMediaItems">en alle media items van dit type</key>
|
||||
<key alias="andAllMembers">en alle leden van dit type</key>
|
||||
|
||||
<key alias="thisEditorUpdateSettings">die gebruik maken van deze editor zullen geupdate worden met deze nieuwe instellingen</key>
|
||||
|
||||
<key alias="memberCanEdit">Lid kan bewerken</key>
|
||||
<key alias="showOnMemberProfile">Toon in het profiel van leden</key>
|
||||
<key alias="tabHasNoSortOrder">tab heeft geen sorteervolgorde</key>
|
||||
</area>
|
||||
|
||||
<area alias="modelsBuilder">
|
||||
<key alias="buildingModels">Models aan het gereneren</key>
|
||||
<key alias="waitingMessage">dit kan enige tijd duren, geduld aub</key>
|
||||
<key alias="modelsGenerated">Models gegenereerd</key>
|
||||
<key alias="modelsGeneratedError">Models konden niet gegenereerd worden</key>
|
||||
<key alias="modelsExceptionInUlog">Models generatie is mislukt, kijk in de Umbraco log voor details</key>
|
||||
</area>
|
||||
|
||||
<area alias="templateEditor">
|
||||
<key alias="alternativeField">Alternatief veld</key>
|
||||
<key alias="alternativeText">Alternatieve tekst</key>
|
||||
@@ -916,7 +1180,8 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
</area>
|
||||
<area alias="translation">
|
||||
<key alias="assignedTasks">Taken aan jou toegewezen</key>
|
||||
<key alias="assignedTasksHelp"><![CDATA[Onderstaande lijst toont vertalingstaken aan jou toegewezen. Om een meer gedetailleerd overzicht te zien, met comments, klik op "Details" of de naam van de pagina. Je kan ook de pagina direct downloaden als XML door te klikken op "Download Xml".
|
||||
<key alias="assignedTasksHelp"><![CDATA[Onderstaande lijst toont vertalingstaken aan jou toegewezen. Om een meer gedetailleerd overzicht te zien, met comments, klik op "Details" of de naam van de pagina.
|
||||
Je kan ook de pagina direct downloaden als XML door te klikken op "Download Xml".
|
||||
Om een vertalingstaak te sluiten, ga aub naar het detailoverzicht en klik op de "Sluit" knop.
|
||||
]]></key>
|
||||
<key alias="closeTask">Sluit taak</key>
|
||||
@@ -932,18 +1197,24 @@ Om een vertalingstaak te sluiten, ga aub naar het detailoverzicht en klik op de
|
||||
Dit is een geautomatiseerde mail om u op de hoogte te brengen dat document '%1%'
|
||||
is aangevraagd voor vertaling naar '%5%' door %2%.
|
||||
|
||||
Ga naar http://%3%/Umbraco/translation/default.aspx?id=%4% om te bewerken.
|
||||
Ga naar http://%3%/translation/details.aspx?id=%4% om te bewerken.
|
||||
Of log in bij Umbraco om een overzicht te krijgen van al jouw vertalingen.
|
||||
|
||||
Een prettige dag!
|
||||
|
||||
Met vriendelijke groet!
|
||||
|
||||
Dit is een bericht van uw Content Management Systeem.
|
||||
|
||||
|
||||
De Umbraco Robot
|
||||
]]></key>
|
||||
<key alias="mailSubject">[%0%] Vertaalopdracht voor %1%</key>
|
||||
<key alias="noTranslators">Geen vertaal-gebruikers gevonden. Maak eerst een vertaal-gebruiker aan voordat je pagina's voor vertaling verstuurd</key>
|
||||
<key alias="ownedTasks">Taken aangemaakt door jou</key>
|
||||
<key alias="ownedTasksHelp"><![CDATA[De lijst hieronder toont pagina's <strong>die je aanmaakte</strong>. Om een detailweergave met opmerkingen te zien, klik op "Detail" of op de paginanaam. Je kan ook de pagina in XML-formaat downloaden door op de "Download XML"-link te klikken. Om een vertalingstaak te sluiten, klik je op de "Sluiten"-knop in detailweergave.]]></key>
|
||||
<key alias="ownedTasksHelp"><![CDATA[De lijst hieronder toont pagina's <strong>die je aanmaakte</strong>.
|
||||
Om een detailweergave met opmerkingen te zien, klik op "Detail" of op de paginanaam.
|
||||
Je kan ook de pagina in XML-formaat downloaden door op de "Download XML"-link te klikken.
|
||||
Om een vertalingstaak te sluiten, klik je op de "Sluiten"-knop in detailweergave.]]></key>
|
||||
<key alias="pageHasBeenSendToTranslation">De pagina '%0%' is verstuurd voor vertaling</key>
|
||||
<key alias="noLanguageSelected">Kies de taal waarin deze contetn vertaald moet worden</key>
|
||||
<key alias="sendToTranslate">Stuur voor vertaling</key>
|
||||
<key alias="taskAssignedBy">Toegewezen door</key>
|
||||
<key alias="taskOpened">Taak geopend</key>
|
||||
@@ -973,7 +1244,8 @@ Om een vertalingstaak te sluiten, ga aub naar het detailoverzicht en klik op de
|
||||
<key alias="memberGroups">Ledengroepen</key>
|
||||
<key alias="memberRoles">Rollen</key>
|
||||
<key alias="memberTypes">Ledentypes</key>
|
||||
<key alias="documentTypes">Documenttypes</key>
|
||||
<key alias="documentTypes">Documenttypen</key>
|
||||
<key alias="relationTypes">RelatieTypen</key>
|
||||
<key alias="packager">Packages</key>
|
||||
<key alias="packages">Packages</key>
|
||||
<key alias="python">Python-bestanden</key>
|
||||
@@ -985,6 +1257,7 @@ Om een vertalingstaak te sluiten, ga aub naar het detailoverzicht en klik op de
|
||||
<key alias="stylesheets">Stylesheets</key>
|
||||
<key alias="templates">Sjablonen</key>
|
||||
<key alias="xslt">XSLT Bestanden</key>
|
||||
<key alias="analytics">Analytics</key>
|
||||
</area>
|
||||
<area alias="update">
|
||||
<key alias="updateAvailable">Nieuwe update beschikbaar</key>
|
||||
@@ -1010,6 +1283,7 @@ Om een vertalingstaak te sluiten, ga aub naar het detailoverzicht en klik op de
|
||||
<key alias="mediastartnode">Startnode in Mediabibliotheek</key>
|
||||
<key alias="modules">Secties</key>
|
||||
<key alias="noConsole">Blokkeer Umbraco toegang</key>
|
||||
<key alias="oldPassword">Oude wachtwoord</key>
|
||||
<key alias="password">Wachtwoord</key>
|
||||
<key alias="resetPassword">Reset wachtwoord</key>
|
||||
<key alias="passwordChanged">Je wachtwoord is veranderd!</key>
|
||||
@@ -1030,10 +1304,138 @@ Om een vertalingstaak te sluiten, ga aub naar het detailoverzicht en klik op de
|
||||
<key alias="usertype">Gebruikerstype</key>
|
||||
<key alias="userTypes">Gebruikerstypes</key>
|
||||
<key alias="writer">Auteur</key>
|
||||
<key alias="translator">Vertaler</key>
|
||||
<key alias="change">Wijzig</key>
|
||||
|
||||
<key alias="yourProfile" version="7.0">Je profiel</key>
|
||||
<key alias="yourHistory" version="7.0">Je recente historie</key>
|
||||
<key alias="sessionExpires" version="7.0">Sessie verloopt over</key>
|
||||
</area>
|
||||
<area alias="validation">
|
||||
<key alias="validation">Validatie</key>
|
||||
<key alias="validateAsEmail">Valideer als email</key>
|
||||
<key alias="validateAsNumber">Valideer als nummer</key>
|
||||
<key alias="validateAsUrl">Valideer als Url</key>
|
||||
<key alias="enterCustomValidation">...of gebruik custom validatie</key>
|
||||
<key alias="fieldIsMandatory">Veld is verplicht</key>
|
||||
</area>
|
||||
<area alias="healthcheck">
|
||||
<!-- The following keys get these tokens passed in:
|
||||
0: Current value
|
||||
1: Recommended value
|
||||
2: XPath
|
||||
3: Configuration file path
|
||||
-->
|
||||
<key alias="checkSuccessMessage">Waarde is insteld naar the aanbevolen waarde: '%0%'.</key>
|
||||
<key alias="rectifySuccessMessage">Waarde was '%1%' voor XPath '%2%' in configuratie bestand '%3%'.</key>
|
||||
<key alias="checkErrorMessageDifferentExpectedValue">De verwachtte waarde voor '%2%' is '%1%' in configuratie bestand '%3%', maar is '%0%'.</key>
|
||||
<key alias="checkErrorMessageUnexpectedValue">Onverwachte waarde '%0%' gevonden voor '%2%' in configuratie bestand '%3%'.</key>
|
||||
|
||||
<!-- The following keys get these tokens passed in:
|
||||
0: Current value
|
||||
1: Recommended value
|
||||
-->
|
||||
<key alias="customErrorsCheckSuccessMessage">Custom foutmeldingen zijn ingesteld op '%0%'.</key>
|
||||
<key alias="customErrorsCheckErrorMessage">Custom foutmeldingen zijn momenteel '%0%'. Wij raden aan deze aan te passen naar '%1%' voor livegang.</key>
|
||||
<key alias="customErrorsCheckRectifySuccessMessage">Custom foutmeldingen aangepast naar '%0%'.</key>
|
||||
|
||||
<key alias="macroErrorModeCheckSuccessMessage">Macro foutmeldingen zijn ingesteld op'%0%'.</key>
|
||||
<key alias="macroErrorModeCheckErrorMessage">Macro foutmeldingen zijn ingesteld op '%0%'. Dit zal er voor zorgen dat bepaalde, of alle, pagina's van de website niet geladen kunnen worden als er errors in een Macro zitten. Corrigeren zal deze waarde aanpassen naar '%1%'.</key>
|
||||
<key alias="macroErrorModeCheckRectifySuccessMessage">Macro foutmeldingen zijn aangepast naar '%0%'.</key>
|
||||
|
||||
<!-- The following keys get these tokens passed in:
|
||||
0: Current value
|
||||
1: Recommended value
|
||||
2: Server version
|
||||
-->
|
||||
<key alias="trySkipIisCustomErrorsCheckSuccessMessage">Try Skip IIS Custom foutmeldingen is ingesteld op '%0%'. IIS versie '%1%' wordt gebruikt.</key>
|
||||
<key alias="trySkipIisCustomErrorsCheckErrorMessage">Try Skip IIS Custom foutmeldingen is ingesteld op '%0%'. Het wordt voor de gebruikte IIS versie (%2%) aangeraden deze in te stellen op '%1%'.</key>
|
||||
<key alias="trySkipIisCustomErrorsCheckRectifySuccessMessage">Try Skip IIS Custom foutmeldingen ingesteld op '%0%'.</key>
|
||||
|
||||
<!-- The following keys get predefined tokens passed in that are not all the same, like above -->
|
||||
<key alias="configurationServiceFileNotFound">Het volgende bestand bestaat niet: '%0%'.</key>
|
||||
<key alias="configurationServiceNodeNotFound"><![CDATA[<strong>'%0%'</strong> kon niet gevonden worden in configuratie bestand <strong>'%1%'</strong>.]]></key>
|
||||
<key alias="configurationServiceError">Er is een fout opgetreden. Bekijk de log file voor de volledige fout: %0%.</key>
|
||||
|
||||
<key alias="xmlDataIntegrityCheckMembers">Members - Totaal XML: %0%, Totaal: %1%, Total incorrect: %2%</key>
|
||||
<key alias="xmlDataIntegrityCheckMedia">Media - Totaal XML: %0%, Totaal: %1%, Total incorrect: %2%</key>
|
||||
<key alias="xmlDataIntegrityCheckContent">Content - Totaal XML: %0%, Totaal gepubliceerd: %1%, Total incorrect: %2%</key>
|
||||
|
||||
<key alias="httpsCheckValidCertificate">Het cerficaat van de website is ongeldig.</key>
|
||||
<key alias="httpsCheckInvalidCertificate">Cerficaat validatie foutmelding: '%0%'</key>
|
||||
<key alias="httpsCheckInvalidUrl">Fout bij pingen van URL %0% - '%1%'</key>
|
||||
<key alias="httpsCheckIsCurrentSchemeHttps">De site wordt momenteel %0% bekeken via HTTPS.</key>
|
||||
<key alias="httpsCheckConfigurationRectifyNotPossible">De appSetting 'umbracoUseSSL' in web.config staat op 'false'. Indien HTTPS gebruikt wordt moet deze op 'true' staan.</key>
|
||||
<key alias="httpsCheckConfigurationCheckResult">De appSetting 'umbracoUseSSL' in web.config is ingesteld op '%0%'. Cookies zijn %1% ingesteld als secure.</key>
|
||||
<key alias="httpsCheckEnableHttpsError">De 'umbracoUseSSL' waarde in web.config kon niet aangepast worden. Foutmelding: %0%</key>
|
||||
|
||||
<!-- The following keys don't get tokens passed in -->
|
||||
<key alias="httpsCheckEnableHttpsButton">HTTPS inschakelen</key>
|
||||
<key alias="httpsCheckEnableHttpsDescription">Zet in de appSettings van de web.config de umbracoSSL instelling op 'true'.</key>
|
||||
<key alias="httpsCheckEnableHttpsSuccess">De appSetting 'umbracoUseSSL' is nu ingesteld op 'true', cookies zullen als 'secure' worden aangemerkt.</key>
|
||||
|
||||
<key alias="rectifyButton">Fix</key>
|
||||
<key alias="cannotRectifyShouldNotEqual">Cannot fix a check with a value comparison type of 'ShouldNotEqual'.</key>
|
||||
<key alias="cannotRectifyShouldEqualWithValue">Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value.</key>
|
||||
<key alias="valueToRectifyNotProvided">Value to fix check not provided.</key>
|
||||
|
||||
<key alias="compilationDebugCheckSuccessMessage">Debug compiliate mode staat uit.</key>
|
||||
<key alias="compilationDebugCheckErrorMessage">Debug compiliate mode staat momenteel aan. Wij raden aan deze instelling uit te zetten voor livegang.</key>
|
||||
<key alias="compilationDebugCheckRectifySuccessMessage">Debug compiliate mode uitgezet.</key>
|
||||
|
||||
<key alias="traceModeCheckSuccessMessage">Trace mode staat uit.</key>
|
||||
<key alias="traceModeCheckErrorMessage">Trace mode staat momenteel aan. Wij raden aan deze instelling uit te zetten voor livegang.</key>
|
||||
<key alias="traceModeCheckRectifySuccessMessage">Trace mode uitgezet.</key>
|
||||
|
||||
<key alias="folderPermissionsCheckMessage">Alle mappen hebben de juiste permissie-instellingen!.</key>
|
||||
<!-- The following keys get these tokens passed in:
|
||||
0: Comma delimitted list of failed folder paths
|
||||
-->
|
||||
<key alias="requiredFolderPermissionFailed"><![CDATA[De volgende bestanden moeten wijzig-rechten krijgen om Umbraco goed te laten werken: <strong>%0%</strong>.]]></key>
|
||||
<key alias="optionalFolderPermissionFailed"><![CDATA[Aangeraden wordt de volgende bestanden wijzig-rechten te geven om Umbraco goed te laten werken: <strong>%0%</strong>. Als deze niet in gebruik zijn voor deze omgeving hoeft er geen actie te worden ondernomen.]]></key>
|
||||
|
||||
<key alias="filePermissionsCheckMessage">All files have the correct permissions set.</key>
|
||||
<!-- The following keys get these tokens passed in:
|
||||
0: Comma delimitted list of failed folder paths
|
||||
-->
|
||||
<key alias="requiredFilePermissionFailed"><![CDATA[De volgende bestanden moeten schrijf-rechten krijgen om Umbraco goed te laten werken: <strong>%0%</strong>.]]></key>
|
||||
<key alias="optionalFilePermissionFailed"><![CDATA[Aangeraden wordt de volgende bestanden schrijf-rechten te geven om Umbraco goed te laten werken: <strong>%0%</strong>. Als deze niet in gebruik zijn voor deze omgeving hoeft er geen actie te worden ondernomen.]]></key>
|
||||
|
||||
<key alias="clickJackingCheckHeaderFound"><![CDATA[De <strong>X-Frame-Options</strong> header of meta-tag om IFRAMEing door andere websites te voorkomen is aanwezig!]]></key>
|
||||
<key alias="clickJackingCheckHeaderNotFound"><![CDATA[De <strong>X-Frame-Options</strong> header of meta-tag om IFRAMEing door andere websites te voorkomen is NIET aanwezig.]]></key>
|
||||
<key alias="clickJackingSetHeaderInConfig">Voorkom IFRAMEing via web.config</key>
|
||||
<key alias="clickJackingSetHeaderInConfigDescription">Voegt de instelling toe aan de httpProtocol/customHeaders section in web.config om IFRAMEing door andere websites te voorkomen.</key>
|
||||
<key alias="clickJackingSetHeaderInConfigSuccess">De instelling om IFRAMEing door andere websites te voorkomen is toegevoegd aan de web.config!</key>
|
||||
<key alias="clickJackingSetHeaderInConfigError">Web.config kon niet aangepast worden door error: %0%</key>
|
||||
|
||||
<!-- The following key get these tokens passed in:
|
||||
0: Comma delimitted list of headers found
|
||||
-->
|
||||
<key alias="excessiveHeadersFound"><![CDATA[De volgende header welke informatie tonen over de gebruikte website technologie zijn aangetroffen: <strong>%0%</strong>.]]></key>
|
||||
<key alias="excessiveHeadersNotFound">Er zijn geen headeres gevonden welke informatie over de gebruikte website technologie prijsgeven!</key>
|
||||
|
||||
<key alias="smtpMailSettingsNotFound">In de Web.config werd system.net/mailsettings niet gevonden</key>
|
||||
<key alias="smtpMailSettingsHostNotConfigured">In de Web.config sectie system.net/mailsettings is de host niet geconfigureerd.</key>
|
||||
<key alias="smtpMailSettingsConnectionSuccess">SMTP instellingen zijn correct ingesteld en werken zoals verwacht.</key>
|
||||
<key alias="smtpMailSettingsConnectionFail">De SMTP server geconfigureerd met host '%0%' en poort '%1%' kon niet gevonden worden. Controleer of de SMTP instellingen in Web.config file system.net/mailsettings correct zijn.</key>
|
||||
|
||||
<key alias="notificationEmailsCheckSuccessMessage"><![CDATA[Notificatie email is verzonden naar <strong>%0%</strong>.]]></key>
|
||||
<key alias="notificationEmailsCheckErrorMessage"><![CDATA[Notificatie email staat nog steeds op de default waarde van <strong>%0%</strong>.]]></key>
|
||||
</area>
|
||||
<area alias="redirectUrls">
|
||||
<key alias="disableUrlTracker">URL tracker uitzetten</key>
|
||||
<key alias="enableUrlTracker">URL tracker aanzetten</key>
|
||||
<key alias="originalUrl">Originele URL</key>
|
||||
<key alias="redirectedTo">Doorgestuurd naar</key>
|
||||
<key alias="noRedirects">Er zijn geen redirects</key>
|
||||
<key alias="noRedirectsDescription">Er wordt automatisch een redirect aangemaakt als een gepubliceerde pagina hernoemd of verplaatst wordt.</key>
|
||||
<key alias="removeButton">Verwijder</key>
|
||||
<key alias="confirmRemove">Weet je zeker dat je de redirect van '%0%' naar '%1%' wilt verwijderen?</key>
|
||||
<key alias="redirectRemoved">Redirect URL verwijderd.</key>
|
||||
<key alias="redirectRemoveError">Fout bij verwijderen redirect URL.</key>
|
||||
<key alias="confirmDisable">Weet je zeker dat je de URL tracker wilt uitzetten?</key>
|
||||
<key alias="disabledConfirm">URL tracker staat nu uit.</key>
|
||||
<key alias="disableError">Fout bij het uitzetten van de URL Tracker. Meer informatie kan gevonden worden in de log file.</key>
|
||||
<key alias="enabledConfirm">URL tracker staat nu aan.</key>
|
||||
<key alias="enableError">Fout bij het aanzetten van de URL tracker. Meer informatie kan gevonden worden in de log file.</key>
|
||||
</area>
|
||||
</language>
|
||||
|
||||
@@ -28,6 +28,7 @@ using System.Security;
|
||||
[assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)]
|
||||
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests.Benchmarks")]
|
||||
[assembly: InternalsVisibleTo("umbraco.MacroEngines")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Web.UI")]
|
||||
[assembly: InternalsVisibleTo("umbraco.webservices")]
|
||||
|
||||
@@ -313,100 +313,151 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
_parentInitialized = true;
|
||||
}
|
||||
|
||||
private void InitializeNode()
|
||||
{
|
||||
if (_xmlNode == null) return;
|
||||
|
||||
if (_xmlNode.Attributes != null)
|
||||
{
|
||||
_id = int.Parse(_xmlNode.Attributes.GetNamedItem("id").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("key") != null) // because, migration
|
||||
_key = Guid.Parse(_xmlNode.Attributes.GetNamedItem("key").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("template") != null)
|
||||
_template = int.Parse(_xmlNode.Attributes.GetNamedItem("template").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("sortOrder") != null)
|
||||
_sortOrder = int.Parse(_xmlNode.Attributes.GetNamedItem("sortOrder").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("nodeName") != null)
|
||||
_name = _xmlNode.Attributes.GetNamedItem("nodeName").Value;
|
||||
if (_xmlNode.Attributes.GetNamedItem("writerName") != null)
|
||||
_writerName = _xmlNode.Attributes.GetNamedItem("writerName").Value;
|
||||
if (_xmlNode.Attributes.GetNamedItem("urlName") != null)
|
||||
_urlName = _xmlNode.Attributes.GetNamedItem("urlName").Value;
|
||||
// Creatorname is new in 2.1, so published xml might not have it!
|
||||
try
|
||||
{
|
||||
_creatorName = _xmlNode.Attributes.GetNamedItem("creatorName").Value;
|
||||
}
|
||||
catch
|
||||
{
|
||||
_creatorName = _writerName;
|
||||
}
|
||||
|
||||
//Added the actual userID, as a user cannot be looked up via full name only...
|
||||
if (_xmlNode.Attributes.GetNamedItem("creatorID") != null)
|
||||
_creatorId = int.Parse(_xmlNode.Attributes.GetNamedItem("creatorID").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("writerID") != null)
|
||||
_writerId = int.Parse(_xmlNode.Attributes.GetNamedItem("writerID").Value);
|
||||
|
||||
if (UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema)
|
||||
{
|
||||
if (_xmlNode.Attributes.GetNamedItem("nodeTypeAlias") != null)
|
||||
_docTypeAlias = _xmlNode.Attributes.GetNamedItem("nodeTypeAlias").Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
_docTypeAlias = _xmlNode.Name;
|
||||
}
|
||||
|
||||
if (_xmlNode.Attributes.GetNamedItem("nodeType") != null)
|
||||
_docTypeId = int.Parse(_xmlNode.Attributes.GetNamedItem("nodeType").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("path") != null)
|
||||
_path = _xmlNode.Attributes.GetNamedItem("path").Value;
|
||||
if (_xmlNode.Attributes.GetNamedItem("version") != null)
|
||||
_version = new Guid(_xmlNode.Attributes.GetNamedItem("version").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("createDate") != null)
|
||||
_createDate = DateTime.Parse(_xmlNode.Attributes.GetNamedItem("createDate").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("updateDate") != null)
|
||||
_updateDate = DateTime.Parse(_xmlNode.Attributes.GetNamedItem("updateDate").Value);
|
||||
if (_xmlNode.Attributes.GetNamedItem("level") != null)
|
||||
_level = int.Parse(_xmlNode.Attributes.GetNamedItem("level").Value);
|
||||
|
||||
_isDraft = (_xmlNode.Attributes.GetNamedItem("isDraft") != null);
|
||||
}
|
||||
|
||||
// load data
|
||||
var dataXPath = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "data" : "* [not(@isDoc)]";
|
||||
var nodes = _xmlNode.SelectNodes(dataXPath);
|
||||
|
||||
_contentType = PublishedContentType.Get(PublishedItemType.Content, _docTypeAlias);
|
||||
|
||||
var propertyNodes = new Dictionary<string, XmlNode>();
|
||||
if (nodes != null)
|
||||
foreach (XmlNode n in nodes)
|
||||
{
|
||||
var attrs = n.Attributes;
|
||||
if (attrs == null) continue;
|
||||
var alias = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema
|
||||
? attrs.GetNamedItem("alias").Value
|
||||
: n.Name;
|
||||
propertyNodes[alias.ToLowerInvariant()] = n;
|
||||
}
|
||||
|
||||
_properties = _contentType.PropertyTypes.Select(p =>
|
||||
{
|
||||
XmlNode n;
|
||||
return propertyNodes.TryGetValue(p.PropertyTypeAlias.ToLowerInvariant(), out n)
|
||||
? new XmlPublishedProperty(p, _isPreviewing, n)
|
||||
: new XmlPublishedProperty(p, _isPreviewing);
|
||||
}).Cast<IPublishedProperty>().ToDictionary(
|
||||
x => x.PropertyTypeAlias,
|
||||
x => x,
|
||||
StringComparer.OrdinalIgnoreCase);
|
||||
private void InitializeNode()
|
||||
{
|
||||
InitializeNode(_xmlNode, UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema, _isPreviewing,
|
||||
out _id, out _key, out _template, out _sortOrder, out _name, out _writerName,
|
||||
out _urlName, out _creatorName, out _creatorId, out _writerId, out _docTypeAlias, out _docTypeId, out _path,
|
||||
out _version, out _createDate, out _updateDate, out _level, out _isDraft, out _contentType, out _properties,
|
||||
PublishedContentType.Get);
|
||||
|
||||
// warn: this is not thread-safe...
|
||||
_nodeInitialized = true;
|
||||
}
|
||||
|
||||
internal static void InitializeNode(XmlNode xmlNode, bool legacy, bool isPreviewing,
|
||||
out int id, out Guid key, out int template, out int sortOrder, out string name, out string writerName, out string urlName,
|
||||
out string creatorName, out int creatorId, out int writerId, out string docTypeAlias, out int docTypeId, out string path,
|
||||
out Guid version, out DateTime createDate, out DateTime updateDate, out int level, out bool isDraft,
|
||||
out PublishedContentType contentType, out Dictionary<string, IPublishedProperty> properties,
|
||||
Func<PublishedItemType, string, PublishedContentType> getPublishedContentType)
|
||||
{
|
||||
//initialize the out params with defaults:
|
||||
writerName = null;
|
||||
docTypeAlias = null;
|
||||
id = template = sortOrder = template = creatorId = writerId = docTypeId = level = default(int);
|
||||
key = version = default(Guid);
|
||||
name = writerName = urlName = creatorName = docTypeAlias = path = null;
|
||||
createDate = updateDate = default(DateTime);
|
||||
isDraft = false;
|
||||
contentType = null;
|
||||
properties = null;
|
||||
|
||||
//return if this is null
|
||||
if (xmlNode == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (xmlNode.Attributes != null)
|
||||
{
|
||||
id = int.Parse(xmlNode.Attributes.GetNamedItem("id").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("key") != null) // because, migration
|
||||
key = Guid.Parse(xmlNode.Attributes.GetNamedItem("key").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("template") != null)
|
||||
template = int.Parse(xmlNode.Attributes.GetNamedItem("template").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("sortOrder") != null)
|
||||
sortOrder = int.Parse(xmlNode.Attributes.GetNamedItem("sortOrder").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("nodeName") != null)
|
||||
name = xmlNode.Attributes.GetNamedItem("nodeName").Value;
|
||||
if (xmlNode.Attributes.GetNamedItem("writerName") != null)
|
||||
writerName = xmlNode.Attributes.GetNamedItem("writerName").Value;
|
||||
if (xmlNode.Attributes.GetNamedItem("urlName") != null)
|
||||
urlName = xmlNode.Attributes.GetNamedItem("urlName").Value;
|
||||
// Creatorname is new in 2.1, so published xml might not have it!
|
||||
try
|
||||
{
|
||||
creatorName = xmlNode.Attributes.GetNamedItem("creatorName").Value;
|
||||
}
|
||||
catch
|
||||
{
|
||||
creatorName = writerName;
|
||||
}
|
||||
|
||||
//Added the actual userID, as a user cannot be looked up via full name only...
|
||||
if (xmlNode.Attributes.GetNamedItem("creatorID") != null)
|
||||
creatorId = int.Parse(xmlNode.Attributes.GetNamedItem("creatorID").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("writerID") != null)
|
||||
writerId = int.Parse(xmlNode.Attributes.GetNamedItem("writerID").Value);
|
||||
|
||||
if (legacy)
|
||||
{
|
||||
if (xmlNode.Attributes.GetNamedItem("nodeTypeAlias") != null)
|
||||
docTypeAlias = xmlNode.Attributes.GetNamedItem("nodeTypeAlias").Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
docTypeAlias = xmlNode.Name;
|
||||
}
|
||||
|
||||
if (xmlNode.Attributes.GetNamedItem("nodeType") != null)
|
||||
docTypeId = int.Parse(xmlNode.Attributes.GetNamedItem("nodeType").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("path") != null)
|
||||
path = xmlNode.Attributes.GetNamedItem("path").Value;
|
||||
if (xmlNode.Attributes.GetNamedItem("version") != null)
|
||||
version = new Guid(xmlNode.Attributes.GetNamedItem("version").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("createDate") != null)
|
||||
createDate = DateTime.Parse(xmlNode.Attributes.GetNamedItem("createDate").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("updateDate") != null)
|
||||
updateDate = DateTime.Parse(xmlNode.Attributes.GetNamedItem("updateDate").Value);
|
||||
if (xmlNode.Attributes.GetNamedItem("level") != null)
|
||||
level = int.Parse(xmlNode.Attributes.GetNamedItem("level").Value);
|
||||
|
||||
isDraft = (xmlNode.Attributes.GetNamedItem("isDraft") != null);
|
||||
}
|
||||
|
||||
//dictionary to store the property node data
|
||||
var propertyNodes = new Dictionary<string, XmlNode>();
|
||||
|
||||
foreach (XmlNode n in xmlNode.ChildNodes)
|
||||
{
|
||||
var e = n as XmlElement;
|
||||
if (e == null) continue;
|
||||
if (legacy)
|
||||
{
|
||||
if (n.Name == "data")
|
||||
{
|
||||
PopulatePropertyNodes(propertyNodes, e, true);
|
||||
}
|
||||
else break; //we are not longer on property elements
|
||||
}
|
||||
else
|
||||
{
|
||||
if (e.HasAttribute("isDoc") == false)
|
||||
{
|
||||
PopulatePropertyNodes(propertyNodes, e, false);
|
||||
}
|
||||
else break; //we are not longer on property elements
|
||||
}
|
||||
}
|
||||
|
||||
//lookup the content type and create the properties collection
|
||||
contentType = getPublishedContentType(PublishedItemType.Content, docTypeAlias);
|
||||
properties = new Dictionary<string, IPublishedProperty>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
//fill in the property collection
|
||||
foreach (var propertyType in contentType.PropertyTypes)
|
||||
{
|
||||
XmlNode n;
|
||||
var val = propertyNodes.TryGetValue(propertyType.PropertyTypeAlias.ToLowerInvariant(), out n)
|
||||
? new XmlPublishedProperty(propertyType, isPreviewing, n)
|
||||
: new XmlPublishedProperty(propertyType, isPreviewing);
|
||||
|
||||
properties[propertyType.PropertyTypeAlias] = val;
|
||||
}
|
||||
}
|
||||
|
||||
private static void PopulatePropertyNodes(IDictionary<string, XmlNode> propertyNodes, XmlNode n, bool legacy)
|
||||
{
|
||||
var attrs = n.Attributes;
|
||||
if (attrs == null) return;
|
||||
|
||||
var alias = legacy
|
||||
? attrs.GetNamedItem("alias").Value
|
||||
: n.Name;
|
||||
propertyNodes[alias.ToLowerInvariant()] = n;
|
||||
}
|
||||
|
||||
private void InitializeChildren()
|
||||
{
|
||||
if (_xmlNode == null) return;
|
||||
|
||||
@@ -72,13 +72,14 @@ namespace umbraco.cms.businesslogic.propertytype
|
||||
_tabId = _propertyTypeGroup;
|
||||
}
|
||||
|
||||
//Fixed issue U4-9493 Case issues
|
||||
_sortOrder = found.sortOrder;
|
||||
_alias = found.alias;
|
||||
_name = found.name;
|
||||
_alias = found.Alias;
|
||||
_name = found.Name;
|
||||
_validationRegExp = found.validationRegExp;
|
||||
_DataTypeId = found.DataTypeId;
|
||||
_DataTypeId = found.dataTypeId;
|
||||
_contenttypeid = found.contentTypeId;
|
||||
_description = found.description;
|
||||
_description = found.Description;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
Reference in New Issue
Block a user