Merge with temp8
This commit is contained in:
@@ -15,31 +15,35 @@
|
||||
<language>en-US</language>
|
||||
<tags>umbraco</tags>
|
||||
<dependencies>
|
||||
<!--
|
||||
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
|
||||
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
|
||||
not want this to happen as the alpha of the next major is, really, the next major already.
|
||||
-->
|
||||
<dependency id="AutoMapper" version="[7.0.1,7.999999)" />
|
||||
<dependency id="LightInject" version="[5.1.2,5.999999)" />
|
||||
<dependency id="LightInject.Annotation" version="[1.1.0,1.999999)" />
|
||||
<dependency id="LightInject.Web" version="[2.0.0,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.Identity.Core" version="[2.2.2,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.WebApi.Client" version="[5.2.6,5.999999)" />
|
||||
<dependency id="Microsoft.Owin" version="[4.0.0,4.999999)" />
|
||||
<dependency id="MiniProfiler" version="[3.2.0.157,3.999999)" />
|
||||
<dependency id="Newtonsoft.Json" version="[11.0.2,11.999999)" />
|
||||
<dependency id="Semver" version="[2.0.4,2.999999)" />
|
||||
<dependency id="Serilog" version="[2.7.1,2.999999)" />
|
||||
<dependency id="Serilog.Enrichers.Process" version="[2.0.1,2.999999)" />
|
||||
<dependency id="Serilog.Enrichers.Thread" version="[3.0.0,3.999999)" />
|
||||
<dependency id="Serilog.Filters.Expressions" version="[2.0.0,2.999999)" />
|
||||
<dependency id="Serilog.Formatting.Compact" version="[1.0.0,1.999999)" />
|
||||
<dependency id="Serilog.Formatting.Compact.Reader" version="[1.0.2,1.999999)" />
|
||||
<dependency id="Serilog.Settings.AppSettings" version="[2.2.2,2.999999)" />
|
||||
<dependency id="Serilog.Sinks.File" version="[4.0.0,4.999999)" />
|
||||
<dependency id="Umbraco.SqlServerCE" version="[4.0.0.1,4.999999)" />
|
||||
<dependency id="NPoco" version="[3.9.4,3.999999)" />
|
||||
|
||||
<group targetFramework="net472">
|
||||
<!--
|
||||
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
|
||||
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
|
||||
not want this to happen as the alpha of the next major is, really, the next major already.
|
||||
-->
|
||||
<dependency id="AutoMapper" version="[8.0.0,8.999999)" />
|
||||
<dependency id="LightInject" version="[5.4.0,5.999999)" />
|
||||
<dependency id="LightInject.Annotation" version="[1.1.0,1.999999)" />
|
||||
<dependency id="LightInject.Web" version="[2.0.0,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.Identity.Core" version="[2.2.2,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.WebApi.Client" version="[5.2.7,5.999999)" />
|
||||
<dependency id="Microsoft.Owin" version="[4.0.1,4.999999)" />
|
||||
<dependency id="MiniProfiler" version="[4.0.138,4.999999)" />
|
||||
<dependency id="Newtonsoft.Json" version="[12.0.1,12.999999)" />
|
||||
<dependency id="Semver" version="[2.0.4,2.999999)" />
|
||||
<dependency id="Serilog" version="[2.8.0,2.999999)" />
|
||||
<dependency id="Serilog.Enrichers.Process" version="[2.0.1,2.999999)" />
|
||||
<dependency id="Serilog.Enrichers.Thread" version="[3.0.0,3.999999)" />
|
||||
<dependency id="Serilog.Filters.Expressions" version="[2.0.0,2.999999)" />
|
||||
<dependency id="Serilog.Formatting.Compact" version="[1.0.0,1.999999)" />
|
||||
<dependency id="Serilog.Formatting.Compact.Reader" version="[1.0.3,1.999999)" />
|
||||
<dependency id="Serilog.Settings.AppSettings" version="[2.2.2,2.999999)" />
|
||||
<dependency id="Serilog.Sinks.File" version="[4.0.0,4.999999)" />
|
||||
<dependency id="Umbraco.SqlServerCE" version="[4.0.0.1,4.999999)" />
|
||||
<dependency id="NPoco" version="[3.9.4,3.999999)" />
|
||||
</group>
|
||||
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
||||
@@ -15,30 +15,35 @@
|
||||
<language>en-US</language>
|
||||
<tags>umbraco</tags>
|
||||
<dependencies>
|
||||
<!--
|
||||
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
|
||||
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
|
||||
not want this to happen as the alpha of the next major is, really, the next major already.
|
||||
-->
|
||||
<dependency id="UmbracoCms.Core" version="[$version$]" />
|
||||
<dependency id="AutoMapper" version="[7.0.1,7.999999)" />
|
||||
<dependency id="ClientDependency" version="[1.9.7,1.999999)" />
|
||||
<dependency id="ClientDependency-Mvc5" version="[1.8.0,1.999999)" />
|
||||
<dependency id="CSharpTest.Net.Collections" version="[14.906.1403.1082,14.999999)" />
|
||||
<dependency id="Examine" version="[1.0.0-beta078,1.999999)" />
|
||||
<dependency id="HtmlAgilityPack" version="[1.8.9,1.999999)" />
|
||||
<dependency id="ImageProcessor" version="[2.6.2.25,2.999999)" />
|
||||
<dependency id="LightInject.Mvc" version="[2.0.0,2.999999)" />
|
||||
<dependency id="LightInject.WebApi" version="[2.0.0,2.999999)" />
|
||||
<dependency id="Markdown" version="[2.2.1,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.2,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.Mvc" version="[5.2.6,5.999999)" />
|
||||
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.3,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.WebApi" version="[5.2.6,5.999999)" />
|
||||
<dependency id="Microsoft.Owin.Host.SystemWeb" version="[4.0.0,4.999999)" />
|
||||
<dependency id="Microsoft.Owin.Security.Cookies" version="[4.0.0,4.999999)" />
|
||||
<dependency id="Microsoft.Owin.Security.OAuth" version="[4.0.0,4.999999)" />
|
||||
<dependency id="System.Threading.Tasks.Dataflow" version="[4.8.0,4.999999)" />
|
||||
|
||||
<group targetFramework="net472">
|
||||
|
||||
<!--
|
||||
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
|
||||
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
|
||||
not want this to happen as the alpha of the next major is, really, the next major already.
|
||||
-->
|
||||
<dependency id="UmbracoCms.Core" version="[$version$]" />
|
||||
<dependency id="ClientDependency" version="[1.9.7,1.999999)" />
|
||||
<dependency id="ClientDependency-Mvc5" version="[1.8.0,1.999999)" />
|
||||
<dependency id="CSharpTest.Net.Collections" version="[14.906.1403.1082,14.999999)" />
|
||||
<dependency id="Examine" version="[1.0.0-beta078,1.999999)" />
|
||||
<dependency id="HtmlAgilityPack" version="[1.8.14,1.999999)" />
|
||||
<dependency id="ImageProcessor" version="[2.6.2.25,2.999999)" />
|
||||
<dependency id="LightInject.Mvc" version="[2.0.0,2.999999)" />
|
||||
<dependency id="LightInject.WebApi" version="[2.0.0,2.999999)" />
|
||||
<dependency id="Markdown" version="[2.2.1,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.2,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.Mvc" version="[5.2.7,5.999999)" />
|
||||
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.4.0,2.999999)" />
|
||||
<dependency id="Microsoft.AspNet.WebApi" version="[5.2.7,5.999999)" />
|
||||
<dependency id="Microsoft.Owin.Host.SystemWeb" version="[4.0.1,4.999999)" />
|
||||
<dependency id="Microsoft.Owin.Security.Cookies" version="[4.0.1,4.999999)" />
|
||||
<dependency id="Microsoft.Owin.Security.OAuth" version="[4.0.1,4.999999)" />
|
||||
<dependency id="System.Threading.Tasks.Dataflow" version="[4.9.0,4.999999)" />
|
||||
|
||||
</group>
|
||||
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
||||
@@ -15,18 +15,25 @@
|
||||
<language>en-US</language>
|
||||
<tags>umbraco</tags>
|
||||
<dependencies>
|
||||
<dependency id="UmbracoCms.Web" version="[$version$]" />
|
||||
<!--
|
||||
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
|
||||
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
|
||||
not want this to happen as the alpha of the next major is, really, the next major already.
|
||||
-->
|
||||
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.2.3, 2.999999)" />
|
||||
<dependency id="Umbraco.ModelsBuilder.Ui" version="[8.0.0-alpha.36]" />
|
||||
<dependency id="ImageProcessor.Web" version="[4.9.3.25,4.999999)" />
|
||||
<dependency id="ImageProcessor.Web.Config" version="[2.4.1.19,2.999999)" />
|
||||
<dependency id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="[2.0.1,2.999999)" />
|
||||
<dependency id="Microsoft.Net.Compilers" version="[2.10.0,2.999999)" />
|
||||
|
||||
<group targetFramework="net472">
|
||||
|
||||
<dependency id="UmbracoCms.Web" version="[$version$]" />
|
||||
<!--
|
||||
note: dependencies are specified as [x.y.z,x.999999) eg [2.1.0,2.999999) and NOT [2.1.0,3.0.0) because
|
||||
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
|
||||
not want this to happen as the alpha of the next major is, really, the next major already.
|
||||
-->
|
||||
<dependency id="Microsoft.AspNet.SignalR.Core" version="[2.4.0, 2.999999)" />
|
||||
<dependency id="Umbraco.ModelsBuilder.Ui" version="[8.0.0-alpha.37]" />
|
||||
<dependency id="ImageProcessor.Web" version="[4.9.3.25,4.999999)" />
|
||||
<dependency id="ImageProcessor.Web.Config" version="[2.4.1.19,2.999999)" />
|
||||
<dependency id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="[2.0.1,2.999999)" />
|
||||
<dependency id="Microsoft.Net.Compilers" version="[2.10.0,2.999999)" />
|
||||
|
||||
</group>
|
||||
|
||||
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace Umbraco.Core.Configuration
|
||||
private static string _reservedPaths;
|
||||
private static string _reservedUrls;
|
||||
//ensure the built on (non-changeable) reserved paths are there at all times
|
||||
internal const string StaticReservedPaths = "~/app_plugins/,~/install/,"; //must end with a comma!
|
||||
internal const string StaticReservedPaths = "~/app_plugins/,~/install/,~/mini-profiler-resources/,"; //must end with a comma!
|
||||
internal const string StaticReservedUrls = "~/config/splashes/noNodes.aspx,~/.well-known,"; //must end with a comma!
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -109,10 +109,9 @@ namespace Umbraco.Core
|
||||
/// <returns></returns>
|
||||
public static IEnumerable<Property> GetNonGroupedProperties(this IContentBase content)
|
||||
{
|
||||
var propertyIdsInTabs = content.PropertyGroups.SelectMany(pg => pg.PropertyTypes);
|
||||
return content.Properties
|
||||
.Where(property => propertyIdsInTabs.Contains(property.PropertyType) == false)
|
||||
.OrderBy(x => x.PropertyType.SortOrder);
|
||||
.Where(x => x.PropertyType.PropertyGroupId == null)
|
||||
.OrderBy(x => x.PropertyType.SortOrder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -178,8 +177,7 @@ namespace Umbraco.Core
|
||||
var property = content.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias));
|
||||
if (property != null) return property;
|
||||
|
||||
var contentTypeService = contentTypeBaseServiceProvider.For(content);
|
||||
var contentType = contentTypeService.Get(content.ContentTypeId);
|
||||
var contentType = contentTypeBaseServiceProvider.GetContentTypeOf(content);
|
||||
var propertyType = contentType.CompositionPropertyTypes
|
||||
.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias));
|
||||
if (propertyType == null)
|
||||
@@ -208,8 +206,7 @@ namespace Umbraco.Core
|
||||
/// </remarks>
|
||||
public static string StoreFile(this IContentBase content, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias, string filename, Stream filestream, string filepath)
|
||||
{
|
||||
var contentTypeService = contentTypeBaseServiceProvider.For(content);
|
||||
var contentType = contentTypeService.Get(content.ContentTypeId);
|
||||
var contentType = contentTypeBaseServiceProvider.GetContentTypeOf(content);
|
||||
var propertyType = contentType
|
||||
.CompositionPropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias));
|
||||
if (propertyType == null) throw new ArgumentException("Invalid property type alias " + propertyTypeAlias + ".");
|
||||
|
||||
@@ -1,34 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Permissions;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
[HostProtection(SecurityAction.LinkDemand, SharedState = true)]
|
||||
public class CancellableEnumerableObjectEventArgs<T> : CancellableObjectEventArgs<IEnumerable<T>>, IEquatable<CancellableEnumerableObjectEventArgs<T>>
|
||||
/// <summary>
|
||||
/// Represents event data, for events that support cancellation, and expose impacted objects.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEventObject">The type of the exposed, impacted objects.</typeparam>
|
||||
public class CancellableEnumerableObjectEventArgs<TEventObject> : CancellableObjectEventArgs<IEnumerable<TEventObject>>, IEquatable<CancellableEnumerableObjectEventArgs<TEventObject>>
|
||||
{
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<T> eventObject, bool canCancel, EventMessages messages, IDictionary<string, object> additionalData)
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<TEventObject> eventObject, bool canCancel, EventMessages messages, IDictionary<string, object> additionalData)
|
||||
: base(eventObject, canCancel, messages, additionalData)
|
||||
{ }
|
||||
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<T> eventObject, bool canCancel, EventMessages eventMessages)
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<TEventObject> eventObject, bool canCancel, EventMessages eventMessages)
|
||||
: base(eventObject, canCancel, eventMessages)
|
||||
{ }
|
||||
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<T> eventObject, EventMessages eventMessages)
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<TEventObject> eventObject, EventMessages eventMessages)
|
||||
: base(eventObject, eventMessages)
|
||||
{ }
|
||||
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<T> eventObject, bool canCancel)
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<TEventObject> eventObject, bool canCancel)
|
||||
: base(eventObject, canCancel)
|
||||
{ }
|
||||
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<T> eventObject)
|
||||
public CancellableEnumerableObjectEventArgs(IEnumerable<TEventObject> eventObject)
|
||||
: base(eventObject)
|
||||
{ }
|
||||
|
||||
public bool Equals(CancellableEnumerableObjectEventArgs<T> other)
|
||||
public bool Equals(CancellableEnumerableObjectEventArgs<TEventObject> other)
|
||||
{
|
||||
if (other is null) return false;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
@@ -41,7 +43,7 @@ namespace Umbraco.Core.Events
|
||||
if (obj is null) return false;
|
||||
if (ReferenceEquals(this, obj)) return true;
|
||||
if (obj.GetType() != this.GetType()) return false;
|
||||
return Equals((CancellableEnumerableObjectEventArgs<T>)obj);
|
||||
return Equals((CancellableEnumerableObjectEventArgs<TEventObject>)obj);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
@@ -49,4 +51,4 @@ namespace Umbraco.Core.Events
|
||||
return HashCodeHelper.GetHashCode(EventObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Security.Permissions;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Event args for that can support cancellation
|
||||
/// Represents event data for events that support cancellation.
|
||||
/// </summary>
|
||||
[HostProtection(SecurityAction.LinkDemand, SharedState = true)]
|
||||
public class CancellableEventArgs : EventArgs, IEquatable<CancellableEventArgs>
|
||||
{
|
||||
private bool _cancel;
|
||||
|
||||
@@ -1,15 +1,10 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Permissions;
|
||||
using Umbraco.Core.Models;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Used as a base class for the generic type CancellableObjectEventArgs{T} so that we can get direct 'object' access to the underlying EventObject
|
||||
/// Provides a base class for classes representing event data, for events that support cancellation, and expose an impacted object.
|
||||
/// </summary>
|
||||
[HostProtection(SecurityAction.LinkDemand, SharedState = true)]
|
||||
public abstract class CancellableObjectEventArgs : CancellableEventArgs
|
||||
{
|
||||
protected CancellableObjectEventArgs(object eventObject, bool canCancel, EventMessages messages, IDictionary<string, object> additionalData)
|
||||
@@ -41,90 +36,11 @@ namespace Umbraco.Core.Events
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the object relating to the event
|
||||
/// Gets or sets the impacted object.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This is protected so that inheritors can expose it with their own name
|
||||
/// </remarks>
|
||||
internal object EventObject { get; set; }
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Event args for a strongly typed object that can support cancellation
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
[HostProtection(SecurityAction.LinkDemand, SharedState = true)]
|
||||
public class CancellableObjectEventArgs<T> : CancellableObjectEventArgs, IEquatable<CancellableObjectEventArgs<T>>
|
||||
{
|
||||
public CancellableObjectEventArgs(T eventObject, bool canCancel, EventMessages messages, IDictionary<string, object> additionalData)
|
||||
: base(eventObject, canCancel, messages, additionalData)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(T eventObject, bool canCancel, EventMessages eventMessages)
|
||||
: base(eventObject, canCancel, eventMessages)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(T eventObject, EventMessages eventMessages)
|
||||
: base(eventObject, eventMessages)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(T eventObject, bool canCancel)
|
||||
: base(eventObject, canCancel)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(T eventObject)
|
||||
: base(eventObject)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the object relating to the event
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This is protected so that inheritors can expose it with their own name
|
||||
/// </remarks>
|
||||
protected new T EventObject
|
||||
{
|
||||
get { return (T) base.EventObject; }
|
||||
set { base.EventObject = value; }
|
||||
}
|
||||
|
||||
public bool Equals(CancellableObjectEventArgs<T> other)
|
||||
{
|
||||
if (other is null) return false;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
return base.Equals(other) && EqualityComparer<T>.Default.Equals(EventObject, other.EventObject);
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj is null) return false;
|
||||
if (ReferenceEquals(this, obj)) return true;
|
||||
if (obj.GetType() != this.GetType()) return false;
|
||||
return Equals((CancellableObjectEventArgs<T>)obj);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
unchecked
|
||||
{
|
||||
return (base.GetHashCode() * 397) ^ EqualityComparer<T>.Default.GetHashCode(EventObject);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool operator ==(CancellableObjectEventArgs<T> left, CancellableObjectEventArgs<T> right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
public static bool operator !=(CancellableObjectEventArgs<T> left, CancellableObjectEventArgs<T> right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Represent event data, for events that support cancellation, and expose an impacted object.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEventObject">The type of the exposed, impacted object.</typeparam>
|
||||
public class CancellableObjectEventArgs<TEventObject> : CancellableObjectEventArgs, IEquatable<CancellableObjectEventArgs<TEventObject>>
|
||||
{
|
||||
public CancellableObjectEventArgs(TEventObject eventObject, bool canCancel, EventMessages messages, IDictionary<string, object> additionalData)
|
||||
: base(eventObject, canCancel, messages, additionalData)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(TEventObject eventObject, bool canCancel, EventMessages eventMessages)
|
||||
: base(eventObject, canCancel, eventMessages)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(TEventObject eventObject, EventMessages eventMessages)
|
||||
: base(eventObject, eventMessages)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(TEventObject eventObject, bool canCancel)
|
||||
: base(eventObject, canCancel)
|
||||
{
|
||||
}
|
||||
|
||||
public CancellableObjectEventArgs(TEventObject eventObject)
|
||||
: base(eventObject)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the impacted object.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This is protected so that inheritors can expose it with their own name
|
||||
/// </remarks>
|
||||
protected new TEventObject EventObject
|
||||
{
|
||||
get => (TEventObject) base.EventObject;
|
||||
set => base.EventObject = value;
|
||||
}
|
||||
|
||||
public bool Equals(CancellableObjectEventArgs<TEventObject> other)
|
||||
{
|
||||
if (other is null) return false;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
return base.Equals(other) && EqualityComparer<TEventObject>.Default.Equals(EventObject, other.EventObject);
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj is null) return false;
|
||||
if (ReferenceEquals(this, obj)) return true;
|
||||
if (obj.GetType() != this.GetType()) return false;
|
||||
return Equals((CancellableObjectEventArgs<TEventObject>)obj);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
unchecked
|
||||
{
|
||||
return (base.GetHashCode() * 397) ^ EqualityComparer<TEventObject>.Default.GetHashCode(EventObject);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool operator ==(CancellableObjectEventArgs<TEventObject> left, CancellableObjectEventArgs<TEventObject> right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
public static bool operator !=(CancellableObjectEventArgs<TEventObject> left, CancellableObjectEventArgs<TEventObject> right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,29 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents event data for the Published event.
|
||||
/// </summary>
|
||||
public class ContentPublishedEventArgs : PublishEventArgs<IContent>
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ContentPublishedEventArgs"/> class.
|
||||
/// </summary>
|
||||
public ContentPublishedEventArgs(IEnumerable<IContent> eventObject, bool canCancel, EventMessages eventMessages)
|
||||
: base(eventObject, canCancel, eventMessages)
|
||||
{
|
||||
}
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether a culture has been published, during a Published event.
|
||||
/// </summary>
|
||||
public bool HasPublishedCulture(IContent content, string culture)
|
||||
=> content.WasPropertyDirty("_changedCulture_" + culture);
|
||||
=> content.WasPropertyDirty(ContentBase.ChangeTrackingPrefix.ChangedCulture + culture);
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether a culture has been unpublished, during a Published event.
|
||||
/// </summary>
|
||||
public bool HasUnpublishedCulture(IContent content, string culture)
|
||||
=> content.WasPropertyDirty("_unpublishedCulture_" + culture);
|
||||
|
||||
|
||||
|
||||
=> content.WasPropertyDirty(ContentBase.ChangeTrackingPrefix.UnpublishedCulture + culture);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents event data for the Publishing event.
|
||||
/// </summary>
|
||||
public class ContentPublishingEventArgs : PublishEventArgs<IContent>
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="ContentPublishingEventArgs"/>
|
||||
/// Initializes a new instance of the <see cref="ContentPublishingEventArgs"/> class.
|
||||
/// </summary>
|
||||
/// <param name="eventObject"></param>
|
||||
/// <param name="eventMessages"></param>
|
||||
public ContentPublishingEventArgs(IEnumerable<IContent> eventObject, EventMessages eventMessages)
|
||||
: base(eventObject, eventMessages)
|
||||
{
|
||||
}
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether a culture is being published, during a Publishing event.
|
||||
@@ -27,7 +25,6 @@ namespace Umbraco.Core.Events
|
||||
/// Determines whether a culture is being unpublished, during a Publishing event.
|
||||
/// </summary>
|
||||
public bool IsUnpublishingCulture(IContent content, string culture)
|
||||
=> content.IsPropertyDirty("_unpublishedCulture_" + culture); //bit of a hack since we know that the content implementation tracks changes this way
|
||||
|
||||
=> content.IsPropertyDirty(ContentBase.ChangeTrackingPrefix.UnpublishedCulture + culture); //bit of a hack since we know that the content implementation tracks changes this way
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,30 +1,24 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents event data for the Saved event.
|
||||
/// </summary>
|
||||
public class ContentSavedEventArgs : SaveEventArgs<IContent>
|
||||
{
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="ContentSavedEventArgs"/>
|
||||
/// Initializes a new instance of the <see cref="ContentSavedEventArgs"/> class.
|
||||
/// </summary>
|
||||
/// <param name="eventObject"></param>
|
||||
/// <param name="messages"></param>
|
||||
/// <param name="additionalData"></param>
|
||||
public ContentSavedEventArgs(IEnumerable<IContent> eventObject, EventMessages messages, IDictionary<string, object> additionalData)
|
||||
: base(eventObject, false, messages, additionalData)
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether a culture has been saved, during a Saved event.
|
||||
/// </summary>
|
||||
public bool HasSavedCulture(IContent content, string culture)
|
||||
=> content.WasPropertyDirty("_updatedCulture_" + culture);
|
||||
=> content.WasPropertyDirty(ContentBase.ChangeTrackingPrefix.UpdatedCulture + culture);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Represent event data for the Saving event.
|
||||
/// </summary>
|
||||
public class ContentSavingEventArgs : SaveEventArgs<IContent>
|
||||
{
|
||||
#region Factory Methods
|
||||
|
||||
/// <summary>
|
||||
/// Converts <see cref="ContentSavingEventArgs"/> to <see cref="ContentSavedEventArgs"/> while preserving all args state
|
||||
/// </summary>
|
||||
@@ -43,24 +46,32 @@ namespace Umbraco.Core.Events
|
||||
EventState = EventState,
|
||||
AdditionalData = AdditionalData
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public ContentSavingEventArgs(IEnumerable<IContent> eventObject, EventMessages eventMessages) : base(eventObject, eventMessages)
|
||||
{
|
||||
}
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ContentSavingEventArgs"/> class.
|
||||
/// </summary>
|
||||
public ContentSavingEventArgs(IEnumerable<IContent> eventObject, EventMessages eventMessages)
|
||||
: base(eventObject, eventMessages)
|
||||
{ }
|
||||
|
||||
public ContentSavingEventArgs(IContent eventObject, EventMessages eventMessages) : base(eventObject, eventMessages)
|
||||
{
|
||||
}
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ContentSavingEventArgs"/> class.
|
||||
/// </summary>
|
||||
public ContentSavingEventArgs(IContent eventObject, EventMessages eventMessages)
|
||||
: base(eventObject, eventMessages)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether a culture is being saved, during a Saving event.
|
||||
/// </summary>
|
||||
public bool IsSavingCulture(IContent content, string culture) => content.CultureInfos.TryGetValue(culture, out var cultureInfo) && cultureInfo.IsDirty();
|
||||
public bool IsSavingCulture(IContent content, string culture)
|
||||
=> content.CultureInfos.TryGetValue(culture, out var cultureInfo) && cultureInfo.IsDirty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ namespace Umbraco.Core.Migrations.Install
|
||||
|
||||
if (tableName.Equals(Constants.DatabaseSchema.Tables.RelationType))
|
||||
CreateRelationTypeData();
|
||||
|
||||
|
||||
if (tableName.Equals(Constants.DatabaseSchema.Tables.KeyValue))
|
||||
CreateKeyValueData();
|
||||
|
||||
@@ -210,12 +210,12 @@ namespace Umbraco.Core.Migrations.Install
|
||||
|
||||
private void CreatePropertyTypeData()
|
||||
{
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 6, UniqueId = 6.ToGuid(), DataTypeId = 1043, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = Constants.Conventions.Media.File, Name = "Upload image", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 6, UniqueId = 6.ToGuid(), DataTypeId = 1043, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = Constants.Conventions.Media.File, Name = "Upload image", SortOrder = 0, Mandatory = true, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 7, UniqueId = 7.ToGuid(), DataTypeId = Constants.DataTypes.LabelInt, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = Constants.Conventions.Media.Width, Name = "Width", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = "in pixels", Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 8, UniqueId = 8.ToGuid(), DataTypeId = Constants.DataTypes.LabelInt, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = Constants.Conventions.Media.Height, Name = "Height", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = "in pixels", Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 9, UniqueId = 9.ToGuid(), DataTypeId = Constants.DataTypes.LabelBigint, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = Constants.Conventions.Media.Bytes, Name = "Size", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = "in bytes", Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 10, UniqueId = 10.ToGuid(), DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = Constants.Conventions.Media.Extension, Name = "Type", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 24, UniqueId = 24.ToGuid(), DataTypeId = -90, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.File, Name = "Upload file", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 24, UniqueId = 24.ToGuid(), DataTypeId = -90, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.File, Name = "Upload file", SortOrder = 0, Mandatory = true, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 25, UniqueId = 25.ToGuid(), DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Extension, Name = "Type", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing });
|
||||
_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 26, UniqueId = 26.ToGuid(), DataTypeId = Constants.DataTypes.LabelBigint, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Bytes, Name = "Size", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = "in bytes", Variations = (byte) ContentVariation.Nothing });
|
||||
//membership property types
|
||||
|
||||
@@ -51,7 +51,6 @@ namespace Umbraco.Core.Models
|
||||
: base(name, parent, contentType, properties, culture)
|
||||
{
|
||||
if (contentType == null) throw new ArgumentNullException(nameof(contentType));
|
||||
ContentType = new SimpleContentType(contentType);
|
||||
_publishedState = PublishedState.Unpublished;
|
||||
PublishedVersionId = 0;
|
||||
}
|
||||
@@ -79,7 +78,6 @@ namespace Umbraco.Core.Models
|
||||
: base(name, parentId, contentType, properties, culture)
|
||||
{
|
||||
if (contentType == null) throw new ArgumentNullException(nameof(contentType));
|
||||
ContentType = new SimpleContentType(contentType);
|
||||
_publishedState = PublishedState.Unpublished;
|
||||
PublishedVersionId = 0;
|
||||
}
|
||||
@@ -172,12 +170,6 @@ namespace Umbraco.Core.Models
|
||||
[IgnoreDataMember]
|
||||
public bool Edited { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the ContentType used by this content object
|
||||
/// </summary>
|
||||
[IgnoreDataMember]
|
||||
public ISimpleContentType ContentType { get; private set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
[IgnoreDataMember]
|
||||
public DateTime? PublishDate { get; set; } // set by persistence
|
||||
@@ -242,7 +234,7 @@ namespace Umbraco.Core.Models
|
||||
public string GetPublishName(string culture)
|
||||
{
|
||||
if (culture.IsNullOrWhiteSpace()) return PublishName;
|
||||
if (!ContentTypeBase.VariesByCulture()) return null;
|
||||
if (!ContentType.VariesByCulture()) return null;
|
||||
if (_publishInfos == null) return null;
|
||||
return _publishInfos.TryGetValue(culture, out var infos) ? infos.Name : null;
|
||||
}
|
||||
@@ -251,7 +243,7 @@ namespace Umbraco.Core.Models
|
||||
public DateTime? GetPublishDate(string culture)
|
||||
{
|
||||
if (culture.IsNullOrWhiteSpace()) return PublishDate;
|
||||
if (!ContentTypeBase.VariesByCulture()) return null;
|
||||
if (!ContentType.VariesByCulture()) return null;
|
||||
if (_publishInfos == null) return null;
|
||||
return _publishInfos.TryGetValue(culture, out var infos) ? infos.Date : (DateTime?)null;
|
||||
}
|
||||
@@ -311,13 +303,7 @@ namespace Umbraco.Core.Models
|
||||
/// <remarks>Leaves PropertyTypes intact after change</remarks>
|
||||
internal void ChangeContentType(IContentType contentType)
|
||||
{
|
||||
ContentTypeId = contentType.Id;
|
||||
ContentType = new SimpleContentType(contentType);
|
||||
ContentTypeBase = contentType;
|
||||
Properties.EnsurePropertyTypes(PropertyTypes);
|
||||
|
||||
Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add
|
||||
Properties.CollectionChanged += PropertiesChanged;
|
||||
ChangeContentType(contentType, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -328,19 +314,15 @@ namespace Umbraco.Core.Models
|
||||
/// <param name="clearProperties">Boolean indicating whether to clear PropertyTypes upon change</param>
|
||||
internal void ChangeContentType(IContentType contentType, bool clearProperties)
|
||||
{
|
||||
ChangeContentType(new SimpleContentType(contentType));
|
||||
|
||||
if (clearProperties)
|
||||
{
|
||||
ContentTypeId = contentType.Id;
|
||||
ContentType = new SimpleContentType(contentType);
|
||||
ContentTypeBase = contentType;
|
||||
Properties.EnsureCleanPropertyTypes(PropertyTypes);
|
||||
Properties.EnsureCleanPropertyTypes(contentType.CompositionPropertyTypes);
|
||||
else
|
||||
Properties.EnsurePropertyTypes(contentType.CompositionPropertyTypes);
|
||||
|
||||
Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add
|
||||
Properties.CollectionChanged += PropertiesChanged;
|
||||
return;
|
||||
}
|
||||
|
||||
ChangeContentType(contentType);
|
||||
Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add
|
||||
Properties.CollectionChanged += PropertiesChanged;
|
||||
}
|
||||
|
||||
public override void ResetWereDirtyProperties()
|
||||
@@ -385,19 +367,19 @@ namespace Umbraco.Core.Models
|
||||
public override bool IsPropertyDirty(string propertyName)
|
||||
{
|
||||
//Special check here since we want to check if the request is for changed cultures
|
||||
if (propertyName.StartsWith("_publishedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.PublishedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_publishedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.PublishedCulture);
|
||||
return _currentPublishCultureChanges.addedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_unpublishedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.UnpublishedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_unpublishedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.UnpublishedCulture);
|
||||
return _currentPublishCultureChanges.removedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_changedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.ChangedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_changedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.ChangedCulture);
|
||||
return _currentPublishCultureChanges.updatedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
|
||||
@@ -409,19 +391,19 @@ namespace Umbraco.Core.Models
|
||||
public override bool WasPropertyDirty(string propertyName)
|
||||
{
|
||||
//Special check here since we want to check if the request is for changed cultures
|
||||
if (propertyName.StartsWith("_publishedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.PublishedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_publishedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.PublishedCulture);
|
||||
return _previousPublishCultureChanges.addedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_unpublishedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.UnpublishedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_unpublishedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.UnpublishedCulture);
|
||||
return _previousPublishCultureChanges.removedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_changedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.ChangedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_changedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.ChangedCulture);
|
||||
return _previousPublishCultureChanges.updatedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
|
||||
@@ -453,9 +435,6 @@ namespace Umbraco.Core.Models
|
||||
|
||||
//fixme - need to reset change tracking bits
|
||||
|
||||
//need to manually clone this since it's not settable
|
||||
clonedContent.ContentType = ContentType;
|
||||
|
||||
//if culture infos exist then deal with event bindings
|
||||
if (clonedContent._publishInfos != null)
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Collections.Specialized;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Exceptions;
|
||||
using Umbraco.Core.Models.Entities;
|
||||
|
||||
@@ -14,21 +15,30 @@ namespace Umbraco.Core.Models
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
[DataContract(IsReference = true)]
|
||||
[DebuggerDisplay("Id: {Id}, Name: {Name}, ContentType: {ContentTypeBase.Alias}")]
|
||||
[DebuggerDisplay("Id: {Id}, Name: {Name}, ContentType: {ContentType.Alias}")]
|
||||
public abstract class ContentBase : TreeEntityBase, IContentBase
|
||||
{
|
||||
|
||||
private int _contentTypeId;
|
||||
protected IContentTypeComposition ContentTypeBase;
|
||||
private int _writerId;
|
||||
private PropertyCollection _properties;
|
||||
private ContentCultureInfosCollection _cultureInfos;
|
||||
internal IReadOnlyList<PropertyType> AllPropertyTypes { get; }
|
||||
|
||||
#region Used for change tracking
|
||||
|
||||
private (HashSet<string> addedCultures, HashSet<string> removedCultures, HashSet<string> updatedCultures) _currentCultureChanges;
|
||||
private (HashSet<string> addedCultures, HashSet<string> removedCultures, HashSet<string> updatedCultures) _previousCultureChanges;
|
||||
|
||||
public static class ChangeTrackingPrefix
|
||||
{
|
||||
public const string UpdatedCulture = "_updatedCulture_";
|
||||
public const string ChangedCulture = "_changedCulture_";
|
||||
public const string PublishedCulture = "_publishedCulture_";
|
||||
public const string UnpublishedCulture = "_unpublishedCulture_";
|
||||
public const string AddedCulture = "_addedCulture_";
|
||||
public const string RemovedCulture = "_removedCulture_";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
@@ -53,7 +63,7 @@ namespace Umbraco.Core.Models
|
||||
|
||||
private ContentBase(string name, IContentTypeComposition contentType, PropertyCollection properties, string culture = null)
|
||||
{
|
||||
ContentTypeBase = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
ContentType = contentType?.ToSimple() ?? throw new ArgumentNullException(nameof(contentType));
|
||||
|
||||
// initially, all new instances have
|
||||
Id = 0; // no identity
|
||||
@@ -63,7 +73,21 @@ namespace Umbraco.Core.Models
|
||||
|
||||
_contentTypeId = contentType.Id;
|
||||
_properties = properties ?? throw new ArgumentNullException(nameof(properties));
|
||||
_properties.EnsurePropertyTypes(PropertyTypes);
|
||||
_properties.EnsurePropertyTypes(contentType.CompositionPropertyTypes);
|
||||
|
||||
//track all property types on this content type, these can never change during the lifetime of this single instance
|
||||
//there is no real extra memory overhead of doing this since these property types are already cached on this object via the
|
||||
//properties already.
|
||||
AllPropertyTypes = new List<PropertyType>(contentType.CompositionPropertyTypes);
|
||||
}
|
||||
|
||||
[IgnoreDataMember]
|
||||
public ISimpleContentType ContentType { get; private set; }
|
||||
|
||||
internal void ChangeContentType(ISimpleContentType contentType)
|
||||
{
|
||||
ContentType = contentType;
|
||||
ContentTypeId = contentType.Id;
|
||||
}
|
||||
|
||||
protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||
@@ -71,8 +95,6 @@ namespace Umbraco.Core.Models
|
||||
OnPropertyChanged(nameof(Properties));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Id of the user who wrote/updated this entity
|
||||
/// </summary>
|
||||
@@ -96,13 +118,13 @@ namespace Umbraco.Core.Models
|
||||
{
|
||||
//There will be cases where this has not been updated to reflect the true content type ID.
|
||||
//This will occur when inserting new content.
|
||||
if (_contentTypeId == 0 && ContentTypeBase != null && ContentTypeBase.HasIdentity)
|
||||
if (_contentTypeId == 0 && ContentType != null)
|
||||
{
|
||||
_contentTypeId = ContentTypeBase.Id;
|
||||
_contentTypeId = ContentType.Id;
|
||||
}
|
||||
return _contentTypeId;
|
||||
}
|
||||
protected set => SetPropertyValueAndDetectChanges(value, ref _contentTypeId, nameof(ContentTypeId));
|
||||
private set => SetPropertyValueAndDetectChanges(value, ref _contentTypeId, nameof(ContentTypeId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -124,20 +146,6 @@ namespace Umbraco.Core.Models
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the enumeration of property groups for the entity.
|
||||
/// TODO: remove this proxy method
|
||||
/// </summary>
|
||||
[IgnoreDataMember]
|
||||
public IEnumerable<PropertyGroup> PropertyGroups => ContentTypeBase.CompositionPropertyGroups;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the numeration of property types for the entity.
|
||||
/// TODO: remove this proxy method
|
||||
/// </summary>
|
||||
[IgnoreDataMember]
|
||||
public IEnumerable<PropertyType> PropertyTypes => ContentTypeBase.CompositionPropertyTypes;
|
||||
|
||||
#region Cultures
|
||||
|
||||
// notes - common rules
|
||||
@@ -178,7 +186,7 @@ namespace Umbraco.Core.Models
|
||||
public string GetCultureName(string culture)
|
||||
{
|
||||
if (culture.IsNullOrWhiteSpace()) return Name;
|
||||
if (!ContentTypeBase.VariesByCulture()) return null;
|
||||
if (!ContentType.VariesByCulture()) return null;
|
||||
if (_cultureInfos == null) return null;
|
||||
return _cultureInfos.TryGetValue(culture, out var infos) ? infos.Name : null;
|
||||
}
|
||||
@@ -187,7 +195,7 @@ namespace Umbraco.Core.Models
|
||||
public DateTime? GetUpdateDate(string culture)
|
||||
{
|
||||
if (culture.IsNullOrWhiteSpace()) return null;
|
||||
if (!ContentTypeBase.VariesByCulture()) return null;
|
||||
if (!ContentType.VariesByCulture()) return null;
|
||||
if (_cultureInfos == null) return null;
|
||||
return _cultureInfos.TryGetValue(culture, out var infos) ? infos.Date : (DateTime?)null;
|
||||
}
|
||||
@@ -195,7 +203,7 @@ namespace Umbraco.Core.Models
|
||||
/// <inheritdoc />
|
||||
public void SetCultureName(string name, string culture)
|
||||
{
|
||||
if (ContentTypeBase.VariesByCulture()) // set on variant content type
|
||||
if (ContentType.VariesByCulture()) // set on variant content type
|
||||
{
|
||||
if (culture.IsNullOrWhiteSpace()) // invariant is ok
|
||||
{
|
||||
@@ -299,21 +307,10 @@ namespace Umbraco.Core.Models
|
||||
/// <inheritdoc />
|
||||
public void SetValue(string propertyTypeAlias, object value, string culture = null, string segment = null)
|
||||
{
|
||||
if (Properties.Contains(propertyTypeAlias))
|
||||
{
|
||||
Properties[propertyTypeAlias].SetValue(value, culture, segment);
|
||||
//bump the culture to be flagged for updating
|
||||
this.TouchCulture(culture);
|
||||
return;
|
||||
}
|
||||
|
||||
var propertyType = PropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias));
|
||||
if (propertyType == null)
|
||||
if (!Properties.TryGetValue(propertyTypeAlias, out var property))
|
||||
throw new InvalidOperationException($"No PropertyType exists with the supplied alias \"{propertyTypeAlias}\".");
|
||||
|
||||
var property = propertyType.CreateProperty();
|
||||
property.SetValue(value, culture, segment);
|
||||
Properties.Add(property);
|
||||
|
||||
//bump the culture to be flagged for updating
|
||||
this.TouchCulture(culture);
|
||||
@@ -402,19 +399,19 @@ namespace Umbraco.Core.Models
|
||||
return true;
|
||||
|
||||
//Special check here since we want to check if the request is for changed cultures
|
||||
if (propertyName.StartsWith("_addedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.AddedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_addedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.AddedCulture);
|
||||
return _currentCultureChanges.addedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_removedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.RemovedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_removedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.RemovedCulture);
|
||||
return _currentCultureChanges.removedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_updatedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.UpdatedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_updatedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.UpdatedCulture);
|
||||
return _currentCultureChanges.updatedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
|
||||
@@ -429,19 +426,19 @@ namespace Umbraco.Core.Models
|
||||
return true;
|
||||
|
||||
//Special check here since we want to check if the request is for changed cultures
|
||||
if (propertyName.StartsWith("_addedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.AddedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_addedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.AddedCulture);
|
||||
return _previousCultureChanges.addedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_removedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.RemovedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_removedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.RemovedCulture);
|
||||
return _previousCultureChanges.removedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
if (propertyName.StartsWith("_updatedCulture_"))
|
||||
if (propertyName.StartsWith(ChangeTrackingPrefix.UpdatedCulture))
|
||||
{
|
||||
var culture = propertyName.TrimStart("_updatedCulture_");
|
||||
var culture = propertyName.TrimStart(ChangeTrackingPrefix.UpdatedCulture);
|
||||
return _previousCultureChanges.updatedCultures?.Contains(culture) ?? false;
|
||||
}
|
||||
|
||||
@@ -478,6 +475,9 @@ namespace Umbraco.Core.Models
|
||||
|
||||
var clonedContent = (ContentBase)clone;
|
||||
|
||||
//need to manually clone this since it's not settable
|
||||
clonedContent.ContentType = ContentType;
|
||||
|
||||
//if culture infos exist then deal with event bindings
|
||||
if (clonedContent._cultureInfos != null)
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Umbraco.Core.Models
|
||||
return Array.Empty<string>();
|
||||
|
||||
var culturesUnpublishing = content.CultureInfos.Values
|
||||
.Where(x => content.IsPropertyDirty("_unpublishedCulture_" + x.Culture))
|
||||
.Where(x => content.IsPropertyDirty(ContentBase.ChangeTrackingPrefix.UnpublishedCulture + x.Culture))
|
||||
.Select(x => x.Culture);
|
||||
|
||||
return culturesUnpublishing.ToList();
|
||||
@@ -88,8 +88,7 @@ namespace Umbraco.Core.Models
|
||||
{
|
||||
content.CultureInfos.Clear();
|
||||
content.CultureInfos = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (culture == null || culture == "*")
|
||||
content.Name = other.Name;
|
||||
@@ -158,8 +157,9 @@ namespace Umbraco.Core.Models
|
||||
if (!content.PublishCultureInfos.TryGetValue(culture, out var publishInfos))
|
||||
continue;
|
||||
|
||||
// if it's not dirty, it means it hasn't changed so there's nothing to adjust
|
||||
if (!publishInfos.IsDirty())
|
||||
continue; //if it's not dirty, it means it hasn't changed so there's nothing to adjust
|
||||
continue;
|
||||
|
||||
content.PublishCultureInfos.AddOrUpdate(culture, publishInfos.Name, date);
|
||||
|
||||
|
||||
@@ -41,6 +41,9 @@ namespace Umbraco.Core.Models
|
||||
_allowedTemplates = new List<ITemplate>();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override ISimpleContentType ToSimple() => new SimpleContentType(this);
|
||||
|
||||
/// <inheritdoc />
|
||||
public override bool IsPublishing => IsPublishingConst;
|
||||
|
||||
@@ -97,8 +100,8 @@ namespace Umbraco.Core.Models
|
||||
/// <returns>True if AllowedTemplates contains the templateId else False</returns>
|
||||
public bool IsAllowedTemplate(int templateId)
|
||||
{
|
||||
return AllowedTemplates == null
|
||||
? false
|
||||
return AllowedTemplates == null
|
||||
? false
|
||||
: AllowedTemplates.Any(t => t.Id == templateId);
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,8 @@ namespace Umbraco.Core.Models
|
||||
_variations = ContentVariation.Nothing;
|
||||
}
|
||||
|
||||
public abstract ISimpleContentType ToSimple();
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the content type is publishing.
|
||||
/// </summary>
|
||||
|
||||
@@ -66,11 +66,6 @@ namespace Umbraco.Core.Models
|
||||
/// </summary>
|
||||
DateTime? PublishDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content type of this content.
|
||||
/// </summary>
|
||||
ISimpleContentType ContentType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether a culture is published.
|
||||
/// </summary>
|
||||
|
||||
@@ -18,6 +18,11 @@ namespace Umbraco.Core.Models
|
||||
/// </summary>
|
||||
int ContentTypeId { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content type of this content.
|
||||
/// </summary>
|
||||
ISimpleContentType ContentType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the identifier of the writer.
|
||||
/// </summary>
|
||||
@@ -58,7 +63,7 @@ namespace Umbraco.Core.Models
|
||||
/// culture name, which must be get or set via the <see cref="TreeEntityBase.Name"/> property.</para>
|
||||
/// </remarks>
|
||||
ContentCultureInfosCollection CultureInfos { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the available cultures.
|
||||
/// </summary>
|
||||
@@ -95,18 +100,6 @@ namespace Umbraco.Core.Models
|
||||
/// <remarks>Properties are loaded as part of the Content object graph</remarks>
|
||||
PropertyCollection Properties { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// List of PropertyGroups available on this Content object
|
||||
/// </summary>
|
||||
/// <remarks>PropertyGroups are kind of lazy loaded as part of the object graph</remarks>
|
||||
IEnumerable<PropertyGroup> PropertyGroups { get; }
|
||||
|
||||
/// <summary>
|
||||
/// List of PropertyTypes available on this Content object
|
||||
/// </summary>
|
||||
/// <remarks>PropertyTypes are kind of lazy loaded as part of the object graph</remarks>
|
||||
IEnumerable<PropertyType> PropertyTypes { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the content entity has a property with the supplied alias.
|
||||
/// </summary>
|
||||
|
||||
@@ -159,5 +159,10 @@ namespace Umbraco.Core.Models
|
||||
/// <param name="propertyGroupName">Name of the PropertyGroup to move the PropertyType to</param>
|
||||
/// <returns></returns>
|
||||
bool MovePropertyType(string propertyTypeAlias, string propertyGroupName);
|
||||
|
||||
/// <summary>
|
||||
/// Gets an <see cref="ISimpleContentType"/> corresponding to this content type.
|
||||
/// </summary>
|
||||
ISimpleContentType ToSimple();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,5 @@
|
||||
using Umbraco.Core.Persistence.Mappers;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
public interface IMedia : IContentBase
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the ContentType used by this Media object
|
||||
/// </summary>
|
||||
IMediaType ContentType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Changes the <see cref="IMediaType"/> for the current content object
|
||||
/// </summary>
|
||||
/// <param name="contentType">New ContentType for this content</param>
|
||||
/// <remarks>Leaves PropertyTypes intact after change</remarks>
|
||||
void ChangeContentType(IMediaType contentType);
|
||||
|
||||
/// <summary>
|
||||
/// Changes the <see cref="IMediaType"/> for the current content object and removes PropertyTypes,
|
||||
/// which are not part of the new ContentType.
|
||||
/// </summary>
|
||||
/// <param name="contentType">New ContentType for this content</param>
|
||||
/// <param name="clearProperties">Boolean indicating whether to clear PropertyTypes upon change</param>
|
||||
void ChangeContentType(IMediaType contentType, bool clearProperties);
|
||||
}
|
||||
{ }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models.Entities;
|
||||
using Umbraco.Core.Models.Entities;
|
||||
using Umbraco.Core.Models.Membership;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
@@ -11,10 +9,5 @@ namespace Umbraco.Core.Models
|
||||
/// String alias of the default ContentType
|
||||
/// </summary>
|
||||
string ContentTypeAlias { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the ContentType used by this content object
|
||||
/// </summary>
|
||||
IMemberType ContentType { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
namespace Umbraco.Core.Models
|
||||
using Umbraco.Core.Models.Entities;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a simplified view of a content type.
|
||||
/// </summary>
|
||||
public interface ISimpleContentType
|
||||
public interface ISimpleContentType : IUmbracoEntity
|
||||
{
|
||||
new int Id { get; }
|
||||
new string Name { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the alias of the content type.
|
||||
/// </summary>
|
||||
string Alias { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the identifier of the content type.
|
||||
/// </summary>
|
||||
int Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the default template of the content type.
|
||||
/// </summary>
|
||||
@@ -35,11 +35,6 @@
|
||||
/// </summary>
|
||||
bool IsContainer { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the name of the content type.
|
||||
/// </summary>
|
||||
string Name { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether content of that type can be created at the root of the tree.
|
||||
/// </summary>
|
||||
|
||||
@@ -10,8 +10,6 @@ namespace Umbraco.Core.Models
|
||||
[DataContract(IsReference = true)]
|
||||
public class Media : ContentBase, IMedia
|
||||
{
|
||||
private IMediaType _contentType;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for creating a Media object
|
||||
/// </summary>
|
||||
@@ -31,9 +29,7 @@ namespace Umbraco.Core.Models
|
||||
/// <param name="properties">Collection of properties</param>
|
||||
public Media(string name, IMedia parent, IMediaType contentType, PropertyCollection properties)
|
||||
: base(name, parent, contentType, properties)
|
||||
{
|
||||
_contentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
}
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for creating a Media object
|
||||
@@ -54,30 +50,16 @@ namespace Umbraco.Core.Models
|
||||
/// <param name="properties">Collection of properties</param>
|
||||
public Media(string name, int parentId, IMediaType contentType, PropertyCollection properties)
|
||||
: base(name, parentId, contentType, properties)
|
||||
{
|
||||
_contentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the ContentType used by this Media object
|
||||
/// </summary>
|
||||
[IgnoreDataMember]
|
||||
public IMediaType ContentType => _contentType;
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Changes the <see cref="IMediaType"/> for the current Media object
|
||||
/// </summary>
|
||||
/// <param name="contentType">New MediaType for this Media</param>
|
||||
/// <remarks>Leaves PropertyTypes intact after change</remarks>
|
||||
public void ChangeContentType(IMediaType contentType)
|
||||
internal void ChangeContentType(IMediaType contentType)
|
||||
{
|
||||
ContentTypeId = contentType.Id;
|
||||
_contentType = contentType;
|
||||
ContentTypeBase = contentType;
|
||||
Properties.EnsurePropertyTypes(PropertyTypes);
|
||||
|
||||
Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add
|
||||
Properties.CollectionChanged += PropertiesChanged;
|
||||
ChangeContentType(contentType, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -86,33 +68,17 @@ namespace Umbraco.Core.Models
|
||||
/// </summary>
|
||||
/// <param name="contentType">New MediaType for this Media</param>
|
||||
/// <param name="clearProperties">Boolean indicating whether to clear PropertyTypes upon change</param>
|
||||
public void ChangeContentType(IMediaType contentType, bool clearProperties)
|
||||
internal void ChangeContentType(IMediaType contentType, bool clearProperties)
|
||||
{
|
||||
ChangeContentType(new SimpleContentType(contentType));
|
||||
|
||||
if (clearProperties)
|
||||
{
|
||||
ContentTypeId = contentType.Id;
|
||||
_contentType = contentType;
|
||||
ContentTypeBase = contentType;
|
||||
Properties.EnsureCleanPropertyTypes(PropertyTypes);
|
||||
Properties.EnsureCleanPropertyTypes(contentType.CompositionPropertyTypes);
|
||||
else
|
||||
Properties.EnsurePropertyTypes(contentType.CompositionPropertyTypes);
|
||||
|
||||
Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add
|
||||
Properties.CollectionChanged += PropertiesChanged;
|
||||
return;
|
||||
}
|
||||
|
||||
ChangeContentType(contentType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Changes the Trashed state of the content object
|
||||
/// </summary>
|
||||
/// <param name="isTrashed">Boolean indicating whether content is trashed (true) or not trashed (false)</param>
|
||||
/// <param name="parentId"> </param>
|
||||
public void ChangeTrashedState(bool isTrashed, int parentId = -20)
|
||||
{
|
||||
Trashed = isTrashed;
|
||||
//The Media Recycle Bin Id is -21 so we correct that here
|
||||
ParentId = parentId == -20 ? -21 : parentId;
|
||||
Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add
|
||||
Properties.CollectionChanged += PropertiesChanged;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,20 +15,17 @@ namespace Umbraco.Core.Models
|
||||
/// </summary>
|
||||
public static string GetUrl(this IMedia media, string propertyAlias, ILogger logger)
|
||||
{
|
||||
var propertyType = media.PropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyAlias));
|
||||
if (propertyType == null) return string.Empty;
|
||||
|
||||
var val = media.Properties[propertyType];
|
||||
if (val == null) return string.Empty;
|
||||
if (!media.Properties.TryGetValue(propertyAlias, out var property))
|
||||
return string.Empty;
|
||||
|
||||
// TODO: would need to be adjusted to variations, when media become variants
|
||||
var jsonString = val.GetValue() as string;
|
||||
if (jsonString == null) return string.Empty;
|
||||
if (!(property.GetValue() is string jsonString))
|
||||
return string.Empty;
|
||||
|
||||
if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.Aliases.UploadField)
|
||||
if (property.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.Aliases.UploadField)
|
||||
return jsonString;
|
||||
|
||||
if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.Aliases.ImageCropper)
|
||||
if (property.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.Aliases.ImageCropper)
|
||||
{
|
||||
if (jsonString.DetectIsJson() == false)
|
||||
return jsonString;
|
||||
|
||||
@@ -41,6 +41,9 @@ namespace Umbraco.Core.Models
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override ISimpleContentType ToSimple() => new SimpleContentType(this);
|
||||
|
||||
/// <inheritdoc />
|
||||
public override bool IsPublishing => IsPublishingConst;
|
||||
|
||||
|
||||
@@ -15,8 +15,6 @@ namespace Umbraco.Core.Models
|
||||
public class Member : ContentBase, IMember
|
||||
{
|
||||
private IDictionary<string, object> _additionalData;
|
||||
private IMemberType _contentType;
|
||||
private readonly string _contentTypeAlias;
|
||||
private string _username;
|
||||
private string _email;
|
||||
private string _rawPasswordValue;
|
||||
@@ -29,8 +27,6 @@ namespace Umbraco.Core.Models
|
||||
public Member(IMemberType contentType)
|
||||
: base("", -1, contentType, new PropertyCollection())
|
||||
{
|
||||
_contentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
_contentTypeAlias = contentType.Alias;
|
||||
IsApproved = true;
|
||||
|
||||
//this cannot be null but can be empty
|
||||
@@ -49,8 +45,6 @@ namespace Umbraco.Core.Models
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullOrEmptyException(nameof(name));
|
||||
|
||||
_contentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
_contentTypeAlias = contentType.Alias;
|
||||
IsApproved = true;
|
||||
|
||||
//this cannot be null but can be empty
|
||||
@@ -73,8 +67,6 @@ namespace Umbraco.Core.Models
|
||||
if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullOrEmptyException(nameof(name));
|
||||
if (string.IsNullOrWhiteSpace(username)) throw new ArgumentNullOrEmptyException(nameof(username));
|
||||
|
||||
_contentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
_contentTypeAlias = contentType.Alias;
|
||||
_email = email;
|
||||
_username = username;
|
||||
IsApproved = isApproved;
|
||||
@@ -96,9 +88,6 @@ namespace Umbraco.Core.Models
|
||||
public Member(string name, string email, string username, string rawPasswordValue, IMemberType contentType)
|
||||
: base(name, -1, contentType, new PropertyCollection())
|
||||
{
|
||||
_contentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
_contentTypeAlias = contentType.Alias;
|
||||
|
||||
_email = email;
|
||||
_username = username;
|
||||
_rawPasswordValue = rawPasswordValue;
|
||||
@@ -119,8 +108,6 @@ namespace Umbraco.Core.Models
|
||||
public Member(string name, string email, string username, string rawPasswordValue, IMemberType contentType, bool isApproved)
|
||||
: base(name, -1, contentType, new PropertyCollection())
|
||||
{
|
||||
_contentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
|
||||
_contentTypeAlias = contentType.Alias;
|
||||
_email = email;
|
||||
_username = username;
|
||||
_rawPasswordValue = rawPasswordValue;
|
||||
@@ -473,7 +460,7 @@ namespace Umbraco.Core.Models
|
||||
/// String alias of the default ContentType
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
public virtual string ContentTypeAlias => _contentTypeAlias;
|
||||
public virtual string ContentTypeAlias => ContentType.Alias;
|
||||
|
||||
/// <summary>
|
||||
/// User key from the Provider.
|
||||
@@ -504,12 +491,6 @@ namespace Umbraco.Core.Models
|
||||
ProviderUserKey = Key;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the ContentType used by this content object
|
||||
/// </summary>
|
||||
[IgnoreDataMember]
|
||||
public IMemberType ContentType => _contentType;
|
||||
|
||||
/* Internal experiment - only used for mapping queries.
|
||||
* Adding these to have first level properties instead of the Properties collection.
|
||||
*/
|
||||
@@ -575,17 +556,6 @@ namespace Umbraco.Core.Models
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override void PerformDeepClone(object clone)
|
||||
{
|
||||
base.PerformDeepClone(clone);
|
||||
|
||||
var clonedEntity = (Member)clone;
|
||||
|
||||
//need to manually clone this since it's not settable
|
||||
clonedEntity._contentType = (IMemberType)ContentType.DeepClone();
|
||||
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[DataMember]
|
||||
[DoNotClone]
|
||||
|
||||
@@ -31,6 +31,9 @@ namespace Umbraco.Core.Models
|
||||
MemberTypePropertyTypes = new Dictionary<string, MemberTypePropertyProfileAccess>();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override ISimpleContentType ToSimple() => new SimpleContentType(this);
|
||||
|
||||
/// <inheritdoc />
|
||||
public override bool IsPublishing => IsPublishingConst;
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ namespace Umbraco.Core.Models
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a property.
|
||||
/// Adds or updates a property.
|
||||
/// </summary>
|
||||
internal new void Add(Property property)
|
||||
{
|
||||
|
||||
@@ -87,8 +87,20 @@ namespace Umbraco.Core.Models.PublishedContent
|
||||
{
|
||||
lock (_publishedDataTypesLocker)
|
||||
{
|
||||
var dataTypes = _dataTypeService.GetAll(ids);
|
||||
_publishedDataTypes = dataTypes.ToDictionary(x => x.Id, CreatePublishedDataType);
|
||||
if (_publishedDataTypes == null)
|
||||
{
|
||||
var dataTypes = _dataTypeService.GetAll();
|
||||
_publishedDataTypes = dataTypes.ToDictionary(x => x.Id, CreatePublishedDataType);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var id in ids)
|
||||
_publishedDataTypes.Remove(id);
|
||||
|
||||
var dataTypes = _dataTypeService.GetAll(ids);
|
||||
foreach (var dataType in dataTypes)
|
||||
_publishedDataTypes[dataType.Id] = CreatePublishedDataType(dataType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
namespace Umbraco.Core.Models
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models.Entities;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements <see cref="ISimpleContentType"/>.
|
||||
@@ -9,14 +13,34 @@
|
||||
/// Initializes a new instance of the <see cref="SimpleContentType"/> class.
|
||||
/// </summary>
|
||||
public SimpleContentType(IContentType contentType)
|
||||
: this((IContentTypeBase)contentType)
|
||||
{
|
||||
DefaultTemplate = contentType.DefaultTemplate;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="SimpleContentType"/> class.
|
||||
/// </summary>
|
||||
public SimpleContentType(IMediaType mediaType)
|
||||
: this((IContentTypeBase)mediaType)
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="SimpleContentType"/> class.
|
||||
/// </summary>
|
||||
public SimpleContentType(IMemberType memberType)
|
||||
: this((IContentTypeBase)memberType)
|
||||
{ }
|
||||
|
||||
private SimpleContentType(IContentTypeBase contentType)
|
||||
{
|
||||
if (contentType == null) throw new ArgumentNullException(nameof(contentType));
|
||||
|
||||
Id = contentType.Id;
|
||||
Alias = contentType.Alias;
|
||||
DefaultTemplate = contentType.DefaultTemplate;
|
||||
Variations = contentType.Variations;
|
||||
Icon = contentType.Icon;
|
||||
IsContainer = contentType.IsContainer;
|
||||
Icon = contentType.Icon;
|
||||
Name = contentType.Name;
|
||||
AllowedAsRoot = contentType.AllowedAsRoot;
|
||||
IsElement = contentType.IsElement;
|
||||
@@ -25,8 +49,7 @@
|
||||
/// <inheritdoc />
|
||||
public string Alias { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public int Id { get; }
|
||||
public int Id { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public ITemplate DefaultTemplate { get; }
|
||||
@@ -39,8 +62,7 @@
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsContainer { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
public string Name { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -80,5 +102,33 @@
|
||||
return ((Alias != null ? Alias.GetHashCode() : 0) * 397) ^ Id;
|
||||
}
|
||||
}
|
||||
|
||||
// we have to have all this, because we're an IUmbracoEntity, because that is
|
||||
// required by the query expression visitor / SimpleContentTypeMapper
|
||||
|
||||
string ITreeEntity.Name { get => this.Name; set => throw new NotImplementedException(); }
|
||||
int IEntity.Id { get => this.Id; set => throw new NotImplementedException(); }
|
||||
bool IEntity.HasIdentity => this.Id != default;
|
||||
int ITreeEntity.CreatorId { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
int ITreeEntity.ParentId { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
int ITreeEntity.Level { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
string ITreeEntity.Path { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
int ITreeEntity.SortOrder { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
bool ITreeEntity.Trashed => throw new NotImplementedException();
|
||||
Guid IEntity.Key { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
DateTime IEntity.CreateDate { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
DateTime IEntity.UpdateDate { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
DateTime? IEntity.DeleteDate { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
void ITreeEntity.SetParent(ITreeEntity parent) => throw new NotImplementedException();
|
||||
object IDeepCloneable.DeepClone() => throw new NotImplementedException();
|
||||
bool IRememberBeingDirty.WasDirty() => throw new NotImplementedException();
|
||||
bool IRememberBeingDirty.WasPropertyDirty(string propertyName) => throw new NotImplementedException();
|
||||
void IRememberBeingDirty.ResetWereDirtyProperties() => throw new NotImplementedException();
|
||||
void IRememberBeingDirty.ResetDirtyProperties(bool rememberDirty) => throw new NotImplementedException();
|
||||
IEnumerable<string> IRememberBeingDirty.GetWereDirtyProperties() => throw new NotImplementedException();
|
||||
bool ICanBeDirty.IsDirty() => throw new NotImplementedException();
|
||||
bool ICanBeDirty.IsPropertyDirty(string propName) => throw new NotImplementedException();
|
||||
IEnumerable<string> ICanBeDirty.GetDirtyProperties() => throw new NotImplementedException();
|
||||
void ICanBeDirty.ResetDirtyProperties() => throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace Umbraco.Core.Persistence
|
||||
do
|
||||
{
|
||||
c = unwrapped;
|
||||
if (unwrapped is ProfiledDbConnection profiled) unwrapped = profiled.InnerConnection;
|
||||
if (unwrapped is ProfiledDbConnection profiled) unwrapped = profiled.WrappedConnection;
|
||||
if (unwrapped is RetryDbConnection retrying) unwrapped = retrying.Inner;
|
||||
|
||||
} while (c != unwrapped);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Reflection;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Persistence.Dtos;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
@@ -10,10 +11,14 @@ namespace Umbraco.Core.Persistence.Factories
|
||||
{
|
||||
internal static class DataTypeFactory
|
||||
{
|
||||
public static IDataType BuildEntity(DataTypeDto dto, PropertyEditorCollection editors)
|
||||
public static IDataType BuildEntity(DataTypeDto dto, PropertyEditorCollection editors, ILogger logger)
|
||||
{
|
||||
if (!editors.TryGet(dto.EditorAlias, out var editor))
|
||||
throw new InvalidOperationException($"Could not find an editor with alias \"{dto.EditorAlias}\".");
|
||||
{
|
||||
logger.Warn(typeof(DataTypeFactory), "Could not find an editor with alias {dto.EditorAlias}, converting to label", dto.EditorAlias);
|
||||
//convert to label
|
||||
editor = new LabelPropertyEditor(logger);
|
||||
}
|
||||
|
||||
var dataType = new DataType(editor);
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace Umbraco.Core.Persistence.Mappers
|
||||
Add<AuditItemMapper>();
|
||||
Add<ContentMapper>();
|
||||
Add<ContentTypeMapper>();
|
||||
Add<SimpleContentTypeMapper>();
|
||||
Add<DataTypeMapper>();
|
||||
Add<DictionaryMapper>();
|
||||
Add<DictionaryTranslationMapper>();
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
using System.Collections.Concurrent;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Persistence.Dtos;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Mappers
|
||||
{
|
||||
[MapperFor(typeof(ISimpleContentType))]
|
||||
[MapperFor(typeof(SimpleContentType))]
|
||||
public sealed class SimpleContentTypeMapper : BaseMapper
|
||||
{
|
||||
private static readonly ConcurrentDictionary<string, DtoMapModel> PropertyInfoCacheInstance = new ConcurrentDictionary<string, DtoMapModel>();
|
||||
|
||||
internal override ConcurrentDictionary<string, DtoMapModel> PropertyInfoCache => PropertyInfoCacheInstance;
|
||||
|
||||
protected override void BuildMap()
|
||||
{
|
||||
if (PropertyInfoCache.IsEmpty == false) return;
|
||||
|
||||
CacheMap<ContentType, NodeDto>(src => src.Id, dto => dto.NodeId);
|
||||
CacheMap<ContentType, NodeDto>(src => src.CreateDate, dto => dto.CreateDate);
|
||||
CacheMap<ContentType, NodeDto>(src => src.Level, dto => dto.Level);
|
||||
CacheMap<ContentType, NodeDto>(src => src.ParentId, dto => dto.ParentId);
|
||||
CacheMap<ContentType, NodeDto>(src => src.Path, dto => dto.Path);
|
||||
CacheMap<ContentType, NodeDto>(src => src.SortOrder, dto => dto.SortOrder);
|
||||
CacheMap<ContentType, NodeDto>(src => src.Name, dto => dto.Text);
|
||||
CacheMap<ContentType, NodeDto>(src => src.Trashed, dto => dto.Trashed);
|
||||
CacheMap<ContentType, NodeDto>(src => src.Key, dto => dto.UniqueId);
|
||||
CacheMap<ContentType, NodeDto>(src => src.CreatorId, dto => dto.UserId);
|
||||
CacheMap<ContentType, ContentTypeDto>(src => src.Alias, dto => dto.Alias);
|
||||
CacheMap<ContentType, ContentTypeDto>(src => src.AllowedAsRoot, dto => dto.AllowAtRoot);
|
||||
CacheMap<ContentType, ContentTypeDto>(src => src.Description, dto => dto.Description);
|
||||
CacheMap<ContentType, ContentTypeDto>(src => src.Icon, dto => dto.Icon);
|
||||
CacheMap<ContentType, ContentTypeDto>(src => src.IsContainer, dto => dto.IsContainer);
|
||||
CacheMap<ContentType, ContentTypeDto>(src => src.IsElement, dto => dto.IsElement);
|
||||
CacheMap<ContentType, ContentTypeDto>(src => src.Thumbnail, dto => dto.Thumbnail);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -148,7 +148,7 @@ namespace Umbraco.Core.Persistence
|
||||
where TConnection : class, IDbConnection
|
||||
{
|
||||
var profiled = connection as ProfiledDbConnection;
|
||||
return profiled == null ? connection as TConnection : profiled.InnerConnection as TConnection;
|
||||
return profiled == null ? connection as TConnection : profiled.WrappedConnection as TConnection;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace Umbraco.Core.Persistence.Querying
|
||||
|
||||
if (m.Expression != null
|
||||
&& m.Expression.Type != typeof(T)
|
||||
&& TypeHelper.IsTypeAssignableFrom<IUmbracoEntity>(m.Expression.Type)
|
||||
&& TypeHelper.IsTypeAssignableFrom<IUmbracoEntity>(m.Expression.Type) //TODO: Could this just be `IEntity` ? why does it need to be IUmbracoEntity, we aren't even using the reference to that below
|
||||
&& EndsWithConstant(m) == false)
|
||||
{
|
||||
//if this is the case, it means we have a sub expression / nested property access, such as: x.ContentType.Alias == "Test";
|
||||
|
||||
@@ -7,8 +7,6 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
public interface IDocumentRepository : IContentRepository<int, IContent>, IReadRepository<Guid, IContent>
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Clears the publishing schedule for all entries having an a date before (lower than, or equal to) a specified date.
|
||||
/// </summary>
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
}
|
||||
|
||||
var dtos = Database.Fetch<DataTypeDto>(dataTypeSql);
|
||||
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value)).ToArray();
|
||||
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger)).ToArray();
|
||||
}
|
||||
|
||||
protected override IEnumerable<IDataType> PerformGetByQuery(IQuery<IDataType> query)
|
||||
@@ -65,7 +65,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
|
||||
var dtos = Database.Fetch<DataTypeDto>(sql);
|
||||
|
||||
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value)).ToArray();
|
||||
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger)).ToArray();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -3,7 +3,6 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NPoco;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration.UmbracoSettings;
|
||||
using Umbraco.Core.Exceptions;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models;
|
||||
@@ -120,15 +119,15 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
break;
|
||||
case QueryType.Single:
|
||||
case QueryType.Many:
|
||||
// R# may flag this ambiguous and red-squiggle it, but it is not
|
||||
sql = sql.Select<DocumentDto>(r =>
|
||||
r.Select(documentDto => documentDto.ContentDto, r1 =>
|
||||
r1.Select(contentDto => contentDto.NodeDto))
|
||||
.Select(documentDto => documentDto.DocumentVersionDto, r1 =>
|
||||
r1.Select(documentVersionDto => documentVersionDto.ContentVersionDto))
|
||||
.Select(documentDto => documentDto.PublishedVersionDto, "pdv", r1 =>
|
||||
r1.Select(documentVersionDto => documentVersionDto.ContentVersionDto, "pcv")))
|
||||
|
||||
//we've put this in a local function so that the below sql.Select statement doesn't have a problem
|
||||
//thinking that the call is ambiguous
|
||||
NPocoSqlExtensions.SqlRef<DocumentDto> SelectStatement(NPocoSqlExtensions.SqlRef<DocumentDto> r) =>
|
||||
r.Select(documentDto => documentDto.ContentDto, r1 => r1.Select(contentDto => contentDto.NodeDto))
|
||||
.Select(documentDto => documentDto.DocumentVersionDto, r1 => r1.Select(documentVersionDto => documentVersionDto.ContentVersionDto))
|
||||
.Select(documentDto => documentDto.PublishedVersionDto, "pdv", r1 => r1.Select(documentVersionDto => documentVersionDto.ContentVersionDto, "pcv"));
|
||||
|
||||
sql = sql.Select<DocumentDto>(SelectStatement)
|
||||
// select the variant name, coalesce to the invariant name, as "variantName"
|
||||
.AndSelect(VariantNameSqlExpression + " AS variantName");
|
||||
break;
|
||||
@@ -954,8 +953,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
protected override string ApplySystemOrdering(ref Sql<ISqlContext> sql, Ordering ordering)
|
||||
{
|
||||
// note: 'updater' is the user who created the latest draft version,
|
||||
@@ -1187,17 +1184,18 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private void SetVariations(Content content, IDictionary<int, List<ContentVariation>> contentVariations, IDictionary<int, List<DocumentVariation>> documentVariations)
|
||||
{
|
||||
if (contentVariations.TryGetValue(content.VersionId, out var contentVariation))
|
||||
foreach (var v in contentVariation)
|
||||
content.SetCultureInfo(v.Culture, v.Name, v.Date);
|
||||
|
||||
if (content.PublishedVersionId > 0 && contentVariations.TryGetValue(content.PublishedVersionId, out contentVariation))
|
||||
{
|
||||
foreach (var v in contentVariation)
|
||||
content.SetPublishInfo(v.Culture, v.Name, v.Date);
|
||||
}
|
||||
|
||||
if (documentVariations.TryGetValue(content.Id, out var documentVariation))
|
||||
content.SetCultureEdited(documentVariation.Where(x => x.Edited).Select(x => x.Culture));
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
}
|
||||
|
||||
var entities = dtos.Select(x => BuildEntity(isContent, isMedia, x)).ToArray();
|
||||
|
||||
|
||||
if (isContent)
|
||||
BuildVariants(entities.Cast<DocumentEntitySlim>());
|
||||
|
||||
@@ -211,7 +211,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
|
||||
private IEnumerable<TreeEntityPath> PerformGetAllPaths(Guid objectType, Action<Sql<ISqlContext>> filter = null)
|
||||
{
|
||||
var sql = Sql().Select<NodeDto>(x => x.NodeId, x => x.Path).From<NodeDto>().Where<NodeDto>(x => x.NodeObjectType == objectType);
|
||||
// NodeId is named Id on TreeEntityPath = use an alias
|
||||
var sql = Sql().Select<NodeDto>(x => Alias(x.NodeId, nameof(TreeEntityPath.Id)), x => x.Path).From<NodeDto>().Where<NodeDto>(x => x.NodeObjectType == objectType);
|
||||
filter?.Invoke(sql);
|
||||
return Database.Fetch<TreeEntityPath>(sql);
|
||||
}
|
||||
@@ -418,7 +419,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
.InnerJoin<DataTypeDto>().On<PropertyTypeDto, DataTypeDto>((left, right) => left.DataTypeId == right.NodeId)
|
||||
.WhereIn<PropertyDataDto>(x => x.VersionId, versionIds)
|
||||
.OrderBy<PropertyDataDto>(x => x.VersionId);
|
||||
}
|
||||
}
|
||||
|
||||
// gets the base SELECT + FROM [+ filter] sql
|
||||
// always from the 'current' content version
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="mediaTypeAlias"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public static IContent CreateContent(this IContentService contentService, string name, Udi parentId, string mediaTypeAlias, int userId = 0)
|
||||
public static IContent CreateContent(this IContentService contentService, string name, Udi parentId, string mediaTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var guidUdi = parentId as GuidUdi;
|
||||
if (guidUdi == null)
|
||||
|
||||
@@ -32,27 +32,27 @@ namespace Umbraco.Core.Services
|
||||
/// <summary>
|
||||
/// Saves a blueprint.
|
||||
/// </summary>
|
||||
void SaveBlueprint(IContent content, int userId = 0);
|
||||
void SaveBlueprint(IContent content, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a blueprint.
|
||||
/// </summary>
|
||||
void DeleteBlueprint(IContent content, int userId = 0);
|
||||
void DeleteBlueprint(IContent content, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new content item from a blueprint.
|
||||
/// </summary>
|
||||
IContent CreateContentFromBlueprint(IContent blueprint, string name, int userId = 0);
|
||||
IContent CreateContentFromBlueprint(IContent blueprint, string name, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes blueprints for a content type.
|
||||
/// </summary>
|
||||
void DeleteBlueprintsOfType(int contentTypeId, int userId = 0);
|
||||
void DeleteBlueprintsOfType(int contentTypeId, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes blueprints for content types.
|
||||
/// </summary>
|
||||
void DeleteBlueprintsOfTypes(IEnumerable<int> contentTypeIds, int userId = 0);
|
||||
void DeleteBlueprintsOfTypes(IEnumerable<int> contentTypeIds, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -237,13 +237,13 @@ namespace Umbraco.Core.Services
|
||||
/// <summary>
|
||||
/// Saves a document.
|
||||
/// </summary>
|
||||
OperationResult Save(IContent content, int userId = 0, bool raiseEvents = true);
|
||||
OperationResult Save(IContent content, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Saves documents.
|
||||
/// </summary>
|
||||
// TODO: why only 1 result not 1 per content?!
|
||||
OperationResult Save(IEnumerable<IContent> contents, int userId = 0, bool raiseEvents = true);
|
||||
OperationResult Save(IEnumerable<IContent> contents, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a document.
|
||||
@@ -252,7 +252,7 @@ namespace Umbraco.Core.Services
|
||||
/// <para>This method will also delete associated media files, child content and possibly associated domains.</para>
|
||||
/// <para>This method entirely clears the content from the database.</para>
|
||||
/// </remarks>
|
||||
OperationResult Delete(IContent content, int userId = 0);
|
||||
OperationResult Delete(IContent content, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes all documents of a given document type.
|
||||
@@ -261,7 +261,7 @@ namespace Umbraco.Core.Services
|
||||
/// <para>All non-deleted descendants of the deleted documents are moved to the recycle bin.</para>
|
||||
/// <para>This operation is potentially dangerous and expensive.</para>
|
||||
/// </remarks>
|
||||
void DeleteOfType(int documentTypeId, int userId = 0);
|
||||
void DeleteOfType(int documentTypeId, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes all documents of given document types.
|
||||
@@ -270,17 +270,17 @@ namespace Umbraco.Core.Services
|
||||
/// <para>All non-deleted descendants of the deleted documents are moved to the recycle bin.</para>
|
||||
/// <para>This operation is potentially dangerous and expensive.</para>
|
||||
/// </remarks>
|
||||
void DeleteOfTypes(IEnumerable<int> contentTypeIds, int userId = 0);
|
||||
void DeleteOfTypes(IEnumerable<int> contentTypeIds, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes versions of a document prior to a given date.
|
||||
/// </summary>
|
||||
void DeleteVersions(int id, DateTime date, int userId = 0);
|
||||
void DeleteVersions(int id, DateTime date, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a version of a document.
|
||||
/// </summary>
|
||||
void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = 0);
|
||||
void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -289,7 +289,7 @@ namespace Umbraco.Core.Services
|
||||
/// <summary>
|
||||
/// Moves a document under a new parent.
|
||||
/// </summary>
|
||||
void Move(IContent content, int parentId, int userId = 0);
|
||||
void Move(IContent content, int parentId, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Copies a document.
|
||||
@@ -297,7 +297,7 @@ namespace Umbraco.Core.Services
|
||||
/// <remarks>
|
||||
/// <para>Recursively copies all children.</para>
|
||||
/// </remarks>
|
||||
IContent Copy(IContent content, int parentId, bool relateToOriginal, int userId = 0);
|
||||
IContent Copy(IContent content, int parentId, bool relateToOriginal, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Copies a document.
|
||||
@@ -305,12 +305,12 @@ namespace Umbraco.Core.Services
|
||||
/// <remarks>
|
||||
/// <para>Optionally recursively copies all children.</para>
|
||||
/// </remarks>
|
||||
IContent Copy(IContent content, int parentId, bool relateToOriginal, bool recursive, int userId = 0);
|
||||
IContent Copy(IContent content, int parentId, bool relateToOriginal, bool recursive, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Moves a document to the recycle bin.
|
||||
/// </summary>
|
||||
OperationResult MoveToRecycleBin(IContent content, int userId = 0);
|
||||
OperationResult MoveToRecycleBin(IContent content, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Empties the recycle bin.
|
||||
@@ -320,12 +320,12 @@ namespace Umbraco.Core.Services
|
||||
/// <summary>
|
||||
/// Sorts documents.
|
||||
/// </summary>
|
||||
OperationResult Sort(IEnumerable<IContent> items, int userId = 0, bool raiseEvents = true);
|
||||
OperationResult Sort(IEnumerable<IContent> items, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Sorts documents.
|
||||
/// </summary>
|
||||
OperationResult Sort(IEnumerable<int> ids, int userId = 0, bool raiseEvents = true);
|
||||
OperationResult Sort(IEnumerable<int> ids, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -341,12 +341,11 @@ namespace Umbraco.Core.Services
|
||||
/// <para>If the content type is variant, then culture can be either '*' or an actual culture, but neither 'null' nor
|
||||
/// 'empty'. If the content type is invariant, then culture can be either '*' or null or empty.</para>
|
||||
/// </remarks>
|
||||
/// <param name="content"></param>
|
||||
/// <param name="culture"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="raiseEvents"></param>
|
||||
/// <returns></returns>
|
||||
PublishResult SaveAndPublish(IContent content, string culture = "*", int userId = 0, bool raiseEvents = true);
|
||||
/// <param name="content">The document to publish.</param>
|
||||
/// <param name="culture">The culture to publish.</param>
|
||||
/// <param name="userId">The identifier of the user performing the action.</param>
|
||||
/// <param name="raiseEvents">A value indicating whether to raise events.</param>
|
||||
PublishResult SaveAndPublish(IContent content, string culture = "*", int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Saves and publishes a document.
|
||||
@@ -356,12 +355,11 @@ namespace Umbraco.Core.Services
|
||||
/// <para>When a culture is being published, it includes all varying values along with all invariant values.</para>
|
||||
/// <para>The document is *always* saved, even when publishing fails.</para>
|
||||
/// </remarks>
|
||||
/// <param name="content"></param>
|
||||
/// <param name="content">The document to publish.</param>
|
||||
/// <param name="cultures">The cultures to publish.</param>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="raiseEvents"></param>
|
||||
/// <returns></returns>
|
||||
PublishResult SaveAndPublish(IContent content, string[] cultures, int userId = 0, bool raiseEvents = true);
|
||||
/// <param name="userId">The identifier of the user performing the action.</param>
|
||||
/// <param name="raiseEvents">A value indicating whether to raise events.</param>
|
||||
PublishResult SaveAndPublish(IContent content, string[] cultures, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Saves and publishes a document branch.
|
||||
@@ -377,7 +375,7 @@ namespace Umbraco.Core.Services
|
||||
/// only those documents that are already published, are republished. When <c>true</c>, all documents are
|
||||
/// published. The root of the branch is always published, regardless of <paramref name="force"/>.</para>
|
||||
/// </remarks>
|
||||
IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string culture = "*", int userId = 0);
|
||||
IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string culture = "*", int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Saves and publishes a document branch.
|
||||
@@ -391,7 +389,7 @@ namespace Umbraco.Core.Services
|
||||
/// only those documents that are already published, are republished. When <c>true</c>, all documents are
|
||||
/// published. The root of the branch is always published, regardless of <paramref name="force"/>.</para>
|
||||
/// </remarks>
|
||||
IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string[] cultures, int userId = 0);
|
||||
IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string[] cultures, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Saves and publishes a document branch.
|
||||
@@ -416,7 +414,7 @@ namespace Umbraco.Core.Services
|
||||
IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force,
|
||||
Func<IContent, HashSet<string>> shouldPublish,
|
||||
Func<IContent, HashSet<string>, bool> publishCultures,
|
||||
int userId = 0);
|
||||
int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Unpublishes a document.
|
||||
@@ -428,7 +426,7 @@ namespace Umbraco.Core.Services
|
||||
/// <para>If the content type is variant, then culture can be either '*' or an actual culture, but neither null nor
|
||||
/// empty. If the content type is invariant, then culture can be either '*' or null or empty.</para>
|
||||
/// </remarks>
|
||||
PublishResult Unpublish(IContent content, string culture = "*", int userId = 0);
|
||||
PublishResult Unpublish(IContent content, string culture = "*", int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether a document is path-publishable.
|
||||
@@ -445,7 +443,7 @@ namespace Umbraco.Core.Services
|
||||
/// <summary>
|
||||
/// Saves a document and raises the "sent to publication" events.
|
||||
/// </summary>
|
||||
bool SendToPublication(IContent content, int userId = 0);
|
||||
bool SendToPublication(IContent content, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Publishes and unpublishes scheduled documents.
|
||||
@@ -480,27 +478,27 @@ namespace Umbraco.Core.Services
|
||||
/// <summary>
|
||||
/// Creates a document.
|
||||
/// </summary>
|
||||
IContent Create(string name, Guid parentId, string documentTypeAlias, int userId = 0);
|
||||
IContent Create(string name, Guid parentId, string documentTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a document.
|
||||
/// </summary>
|
||||
IContent Create(string name, int parentId, string documentTypeAlias, int userId = 0);
|
||||
IContent Create(string name, int parentId, string documentTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a document.
|
||||
/// </summary>
|
||||
IContent Create(string name, IContent parent, string documentTypeAlias, int userId = 0);
|
||||
IContent Create(string name, IContent parent, string documentTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates and saves a document.
|
||||
/// </summary>
|
||||
IContent CreateAndSave(string name, int parentId, string contentTypeAlias, int userId = 0);
|
||||
IContent CreateAndSave(string name, int parentId, string contentTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates and saves a document.
|
||||
/// </summary>
|
||||
IContent CreateAndSave(string name, IContent parent, string contentTypeAlias, int userId = 0);
|
||||
IContent CreateAndSave(string name, IContent parent, string contentTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -516,7 +514,7 @@ namespace Umbraco.Core.Services
|
||||
/// <remarks>
|
||||
/// <para>When no culture is specified, all cultures are rolled back.</para>
|
||||
/// </remarks>
|
||||
OperationResult Rollback(int id, int versionId, string culture = "*", int userId = 0);
|
||||
OperationResult Rollback(int id, int versionId, string culture = "*", int userId = Constants.Security.SuperUserId);
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -18,5 +18,10 @@ namespace Umbraco.Core.Services
|
||||
/// to retrieve the content / media / whatever type as <see cref="IContentTypeComposition"/>.</para>
|
||||
/// </remarks>
|
||||
IContentTypeBaseService For(IContentBase contentBase);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content type of an <see cref="IContentBase"/> object.
|
||||
/// </summary>
|
||||
IContentTypeComposition GetContentTypeOf(IContentBase contentBase);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,11 +47,11 @@ namespace Umbraco.Core.Services
|
||||
IEnumerable<TItem> GetChildren(int id);
|
||||
bool HasChildren(int id);
|
||||
|
||||
void Save(TItem item, int userId = 0);
|
||||
void Save(IEnumerable<TItem> items, int userId = 0);
|
||||
void Save(TItem item, int userId = Constants.Security.SuperUserId);
|
||||
void Save(IEnumerable<TItem> items, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
void Delete(TItem item, int userId = 0);
|
||||
void Delete(IEnumerable<TItem> item, int userId = 0);
|
||||
void Delete(TItem item, int userId = Constants.Security.SuperUserId);
|
||||
void Delete(IEnumerable<TItem> item, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
|
||||
Attempt<string[]> ValidateComposition(TItem compo);
|
||||
@@ -63,15 +63,15 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
bool HasContainerInPath(string contentPath);
|
||||
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentContainerId, string name, int userId = 0);
|
||||
Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = 0);
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentContainerId, string name, int userId = Constants.Security.SuperUserId);
|
||||
Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = Constants.Security.SuperUserId);
|
||||
EntityContainer GetContainer(int containerId);
|
||||
EntityContainer GetContainer(Guid containerId);
|
||||
IEnumerable<EntityContainer> GetContainers(int[] containerIds);
|
||||
IEnumerable<EntityContainer> GetContainers(TItem contentType);
|
||||
IEnumerable<EntityContainer> GetContainers(string folderName, int level);
|
||||
Attempt<OperationResult> DeleteContainer(int containerId, int userId = 0);
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = 0);
|
||||
Attempt<OperationResult> DeleteContainer(int containerId, int userId = Constants.Security.SuperUserId);
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
Attempt<OperationResult<MoveOperationStatusType>> Move(TItem moving, int containerId);
|
||||
Attempt<OperationResult<MoveOperationStatusType, TItem>> Copy(TItem copying, int containerId);
|
||||
|
||||
@@ -9,15 +9,15 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
public interface IDataTypeService : IService
|
||||
{
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentId, string name, int userId = 0);
|
||||
Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = 0);
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentId, string name, int userId = Constants.Security.SuperUserId);
|
||||
Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = Constants.Security.SuperUserId);
|
||||
EntityContainer GetContainer(int containerId);
|
||||
EntityContainer GetContainer(Guid containerId);
|
||||
IEnumerable<EntityContainer> GetContainers(string folderName, int level);
|
||||
IEnumerable<EntityContainer> GetContainers(IDataType dataType);
|
||||
IEnumerable<EntityContainer> GetContainers(int[] containerIds);
|
||||
Attempt<OperationResult> DeleteContainer(int containerId, int userId = 0);
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = 0);
|
||||
Attempt<OperationResult> DeleteContainer(int containerId, int userId = Constants.Security.SuperUserId);
|
||||
Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="IDataType"/> by its Name
|
||||
@@ -52,14 +52,14 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="dataType"><see cref="IDataType"/> to save</param>
|
||||
/// <param name="userId">Id of the user issuing the save</param>
|
||||
void Save(IDataType dataType, int userId = 0);
|
||||
void Save(IDataType dataType, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Saves a collection of <see cref="IDataType"/>
|
||||
/// </summary>
|
||||
/// <param name="dataTypeDefinitions"><see cref="IDataType"/> to save</param>
|
||||
/// <param name="userId">Id of the user issuing the save</param>
|
||||
void Save(IEnumerable<IDataType> dataTypeDefinitions, int userId = 0);
|
||||
void Save(IEnumerable<IDataType> dataTypeDefinitions, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Saves a collection of <see cref="IDataType"/>
|
||||
@@ -78,7 +78,7 @@ namespace Umbraco.Core.Services
|
||||
/// </remarks>
|
||||
/// <param name="dataType"><see cref="IDataType"/> to delete</param>
|
||||
/// <param name="userId">Id of the user issuing the deletion</param>
|
||||
void Delete(IDataType dataType, int userId = 0);
|
||||
void Delete(IDataType dataType, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="IDataType"/> by its control Id
|
||||
|
||||
@@ -18,12 +18,12 @@ namespace Umbraco.Core.Services
|
||||
IPartialView GetPartialView(string path);
|
||||
IPartialView GetPartialViewMacro(string path);
|
||||
IEnumerable<IPartialView> GetPartialViewMacros(params string[] names);
|
||||
Attempt<IPartialView> CreatePartialView(IPartialView partialView, string snippetName = null, int userId = 0);
|
||||
Attempt<IPartialView> CreatePartialViewMacro(IPartialView partialView, string snippetName = null, int userId = 0);
|
||||
bool DeletePartialView(string path, int userId = 0);
|
||||
bool DeletePartialViewMacro(string path, int userId = 0);
|
||||
Attempt<IPartialView> SavePartialView(IPartialView partialView, int userId = 0);
|
||||
Attempt<IPartialView> SavePartialViewMacro(IPartialView partialView, int userId = 0);
|
||||
Attempt<IPartialView> CreatePartialView(IPartialView partialView, string snippetName = null, int userId = Constants.Security.SuperUserId);
|
||||
Attempt<IPartialView> CreatePartialViewMacro(IPartialView partialView, string snippetName = null, int userId = Constants.Security.SuperUserId);
|
||||
bool DeletePartialView(string path, int userId = Constants.Security.SuperUserId);
|
||||
bool DeletePartialViewMacro(string path, int userId = Constants.Security.SuperUserId);
|
||||
Attempt<IPartialView> SavePartialView(IPartialView partialView, int userId = Constants.Security.SuperUserId);
|
||||
Attempt<IPartialView> SavePartialViewMacro(IPartialView partialView, int userId = Constants.Security.SuperUserId);
|
||||
bool ValidatePartialView(PartialView partialView);
|
||||
bool ValidatePartialViewMacro(PartialView partialView);
|
||||
|
||||
@@ -45,14 +45,14 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="stylesheet"><see cref="Stylesheet"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the stylesheet</param>
|
||||
void SaveStylesheet(Stylesheet stylesheet, int userId = 0);
|
||||
void SaveStylesheet(Stylesheet stylesheet, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a stylesheet by its name
|
||||
/// </summary>
|
||||
/// <param name="path">Name incl. extension of the Stylesheet to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the stylesheet</param>
|
||||
void DeleteStylesheet(string path, int userId = 0);
|
||||
void DeleteStylesheet(string path, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Validates a <see cref="Stylesheet"/>
|
||||
@@ -79,14 +79,14 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="script"><see cref="Script"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the script</param>
|
||||
void SaveScript(Script script, int userId = 0);
|
||||
void SaveScript(Script script, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a script by its name
|
||||
/// </summary>
|
||||
/// <param name="path">Name incl. extension of the Script to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the script</param>
|
||||
void DeleteScript(string path, int userId = 0);
|
||||
void DeleteScript(string path, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Validates a <see cref="Script"/>
|
||||
@@ -187,7 +187,7 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="template"><see cref="ITemplate"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the template</param>
|
||||
void SaveTemplate(ITemplate template, int userId = 0);
|
||||
void SaveTemplate(ITemplate template, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a template for a content type
|
||||
@@ -198,16 +198,16 @@ namespace Umbraco.Core.Services
|
||||
/// <returns>
|
||||
/// The template created
|
||||
/// </returns>
|
||||
Attempt<OperationResult<OperationResultType, ITemplate>> CreateTemplateForContentType(string contentTypeAlias, string contentTypeName, int userId = 0);
|
||||
Attempt<OperationResult<OperationResultType, ITemplate>> CreateTemplateForContentType(string contentTypeAlias, string contentTypeName, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
ITemplate CreateTemplateWithIdentity(string name, string alias, string content, ITemplate masterTemplate = null, int userId = 0);
|
||||
ITemplate CreateTemplateWithIdentity(string name, string alias, string content, ITemplate masterTemplate = null, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a template by its alias
|
||||
/// </summary>
|
||||
/// <param name="alias">Alias of the <see cref="ITemplate"/> to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the template</param>
|
||||
void DeleteTemplate(string alias, int userId = 0);
|
||||
void DeleteTemplate(string alias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Validates a <see cref="ITemplate"/>
|
||||
@@ -221,7 +221,7 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="templates">List of <see cref="Template"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user</param>
|
||||
void SaveTemplate(IEnumerable<ITemplate> templates, int userId = 0);
|
||||
void SaveTemplate(IEnumerable<ITemplate> templates, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content of a template as a stream.
|
||||
|
||||
@@ -86,7 +86,7 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the dictionary item</param>
|
||||
void Save(IDictionaryItem dictionaryItem, int userId = 0);
|
||||
void Save(IDictionaryItem dictionaryItem, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a <see cref="IDictionaryItem"/> object and its related translations
|
||||
@@ -94,7 +94,7 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the dictionary item</param>
|
||||
void Delete(IDictionaryItem dictionaryItem, int userId = 0);
|
||||
void Delete(IDictionaryItem dictionaryItem, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ILanguage"/> by its id
|
||||
@@ -153,14 +153,14 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="language"><see cref="ILanguage"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the language</param>
|
||||
void Save(ILanguage language, int userId = 0);
|
||||
void Save(ILanguage language, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a <see cref="ILanguage"/> by removing it and its usages from the db
|
||||
/// </summary>
|
||||
/// <param name="language"><see cref="ILanguage"/> to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the language</param>
|
||||
void Delete(ILanguage language, int userId = 0);
|
||||
void Delete(ILanguage language, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the full dictionary key map.
|
||||
|
||||
@@ -39,14 +39,14 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
/// <param name="macro"><see cref="IMacro"/> to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the macro</param>
|
||||
void Delete(IMacro macro, int userId = 0);
|
||||
void Delete(IMacro macro, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Saves an <see cref="IMacro"/>
|
||||
/// </summary>
|
||||
/// <param name="macro"><see cref="IMacro"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the macro</param>
|
||||
void Save(IMacro macro, int userId = 0);
|
||||
void Save(IMacro macro, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
///// <summary>
|
||||
///// Gets a list all available <see cref="IMacroPropertyType"/> plugins
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user creating the media item</param>
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
IMedia CreateMedia(string name, Guid parentId, string mediaTypeAlias, int userId = 0);
|
||||
IMedia CreateMedia(string name, Guid parentId, string mediaTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
|
||||
@@ -53,7 +53,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user creating the media item</param>
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
IMedia CreateMedia(string name, int parentId, string mediaTypeAlias, int userId = 0);
|
||||
IMedia CreateMedia(string name, int parentId, string mediaTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
|
||||
@@ -69,7 +69,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user creating the media item</param>
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
IMedia CreateMedia(string name, IMedia parent, string mediaTypeAlias, int userId = 0);
|
||||
IMedia CreateMedia(string name, IMedia parent, string mediaTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets an <see cref="IMedia"/> object by Id
|
||||
@@ -152,14 +152,14 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="parentId">Id of the Media's new Parent</param>
|
||||
/// <param name="userId">Id of the User moving the Media</param>
|
||||
/// <returns>True if moving succeeded, otherwise False</returns>
|
||||
Attempt<OperationResult> Move(IMedia media, int parentId, int userId = 0);
|
||||
Attempt<OperationResult> Move(IMedia media, int parentId, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes an <see cref="IMedia"/> object by moving it to the Recycle Bin
|
||||
/// </summary>
|
||||
/// <param name="media">The <see cref="IMedia"/> to delete</param>
|
||||
/// <param name="userId">Id of the User deleting the Media</param>
|
||||
Attempt<OperationResult> MoveToRecycleBin(IMedia media, int userId = 0);
|
||||
Attempt<OperationResult> MoveToRecycleBin(IMedia media, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Empties the Recycle Bin by deleting all <see cref="IMedia"/> that resides in the bin
|
||||
@@ -172,7 +172,7 @@ namespace Umbraco.Core.Services
|
||||
/// <remarks>This needs extra care and attention as its potentially a dangerous and extensive operation</remarks>
|
||||
/// <param name="mediaTypeId">Id of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional Id of the user deleting Media</param>
|
||||
void DeleteMediaOfType(int mediaTypeId, int userId = 0);
|
||||
void DeleteMediaOfType(int mediaTypeId, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes all media of the specified types. All Descendants of deleted media that is not of these types is moved to Recycle Bin.
|
||||
@@ -180,7 +180,7 @@ namespace Umbraco.Core.Services
|
||||
/// <remarks>This needs extra care and attention as its potentially a dangerous and extensive operation</remarks>
|
||||
/// <param name="mediaTypeIds">Ids of the <see cref="IMediaType"/>s</param>
|
||||
/// <param name="userId">Optional Id of the user issuing the delete operation</param>
|
||||
void DeleteMediaOfTypes(IEnumerable<int> mediaTypeIds, int userId = 0);
|
||||
void DeleteMediaOfTypes(IEnumerable<int> mediaTypeIds, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Permanently deletes an <see cref="IMedia"/> object
|
||||
@@ -191,7 +191,7 @@ namespace Umbraco.Core.Services
|
||||
/// </remarks>
|
||||
/// <param name="media">The <see cref="IMedia"/> to delete</param>
|
||||
/// <param name="userId">Id of the User deleting the Media</param>
|
||||
Attempt<OperationResult> Delete(IMedia media, int userId = 0);
|
||||
Attempt<OperationResult> Delete(IMedia media, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Saves a single <see cref="IMedia"/> object
|
||||
@@ -199,7 +199,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="media">The <see cref="IMedia"/> to save</param>
|
||||
/// <param name="userId">Id of the User saving the Media</param>
|
||||
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
|
||||
Attempt<OperationResult> Save(IMedia media, int userId = 0, bool raiseEvents = true);
|
||||
Attempt<OperationResult> Save(IMedia media, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Saves a collection of <see cref="IMedia"/> objects
|
||||
@@ -207,7 +207,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="medias">Collection of <see cref="IMedia"/> to save</param>
|
||||
/// <param name="userId">Id of the User saving the Media</param>
|
||||
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
|
||||
Attempt<OperationResult> Save(IEnumerable<IMedia> medias, int userId = 0, bool raiseEvents = true);
|
||||
Attempt<OperationResult> Save(IEnumerable<IMedia> medias, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Gets an <see cref="IMedia"/> object by its 'UniqueId'
|
||||
@@ -250,7 +250,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="id">Id of the <see cref="IMedia"/> object to delete versions from</param>
|
||||
/// <param name="versionDate">Latest version date</param>
|
||||
/// <param name="userId">Optional Id of the User deleting versions of a Content object</param>
|
||||
void DeleteVersions(int id, DateTime versionDate, int userId = 0);
|
||||
void DeleteVersions(int id, DateTime versionDate, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Permanently deletes specific version(s) from an <see cref="IMedia"/> object.
|
||||
@@ -259,7 +259,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="versionId">Id of the version to delete</param>
|
||||
/// <param name="deletePriorVersions">Boolean indicating whether to delete versions prior to the versionId</param>
|
||||
/// <param name="userId">Optional Id of the User deleting versions of a Content object</param>
|
||||
void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = 0);
|
||||
void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets an <see cref="IMedia"/> object from the path stored in the 'umbracoFile' property.
|
||||
@@ -304,7 +304,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="raiseEvents"></param>
|
||||
/// <returns>True if sorting succeeded, otherwise False</returns>
|
||||
bool Sort(IEnumerable<IMedia> items, int userId = 0, bool raiseEvents = true);
|
||||
bool Sort(IEnumerable<IMedia> items, int userId = Constants.Security.SuperUserId, bool raiseEvents = true);
|
||||
|
||||
/// <summary>
|
||||
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
|
||||
@@ -319,7 +319,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user creating the media item</param>
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
IMedia CreateMediaWithIdentity(string name, IMedia parent, string mediaTypeAlias, int userId = 0);
|
||||
IMedia CreateMediaWithIdentity(string name, IMedia parent, string mediaTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
|
||||
@@ -334,7 +334,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user creating the media item</param>
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
IMedia CreateMediaWithIdentity(string name, int parentId, string mediaTypeAlias, int userId = 0);
|
||||
IMedia CreateMediaWithIdentity(string name, int parentId, string mediaTypeAlias, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content of a media as a stream.
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="packageDefinition"></param>
|
||||
/// <param name="packageFile"></param>
|
||||
/// <param name="userId"></param>
|
||||
IEnumerable<string> InstallCompiledPackageFiles(PackageDefinition packageDefinition, FileInfo packageFile, int userId = 0);
|
||||
IEnumerable<string> InstallCompiledPackageFiles(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Installs the data, entities, objects contained in an umbraco package file (zip)
|
||||
@@ -35,7 +35,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="packageDefinition"></param>
|
||||
/// <param name="packageFile"></param>
|
||||
/// <param name="userId"></param>
|
||||
InstallationSummary InstallCompiledPackageData(PackageDefinition packageDefinition, FileInfo packageFile, int userId = 0);
|
||||
InstallationSummary InstallCompiledPackageData(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Uninstalls all versions of the package by name
|
||||
@@ -43,7 +43,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="packageName"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
UninstallationSummary UninstallPackage(string packageName, int userId = 0);
|
||||
UninstallationSummary UninstallPackage(string packageName, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="alreadyInstalled">If the package is an upgrade, the original/current PackageDefinition is returned</param>
|
||||
/// <returns></returns>
|
||||
PackageInstallType GetPackageInstallType(string packageName, SemVersion packageVersion, out PackageDefinition alreadyInstalled);
|
||||
void DeleteInstalledPackage(int packageId, int userId = 0);
|
||||
void DeleteInstalledPackage(int packageId, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Persists a package definition to storage
|
||||
@@ -89,7 +89,7 @@ namespace Umbraco.Core.Services
|
||||
|
||||
IEnumerable<PackageDefinition> GetAllCreatedPackages();
|
||||
PackageDefinition GetCreatedPackageById(int id);
|
||||
void DeleteCreatedPackage(int id, int userId = 0);
|
||||
void DeleteCreatedPackage(int id, int userId = Constants.Security.SuperUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Persists a package definition to storage
|
||||
|
||||
@@ -159,7 +159,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="contentTypeAlias">Alias of the <see cref="IContentType"/></param>
|
||||
/// <param name="userId">Optional id of the user creating the content</param>
|
||||
/// <returns><see cref="IContent"/></returns>
|
||||
public IContent Create(string name, Guid parentId, string contentTypeAlias, int userId = 0)
|
||||
public IContent Create(string name, Guid parentId, string contentTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// TODO: what about culture?
|
||||
|
||||
@@ -179,7 +179,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="contentTypeAlias">The alias of the content type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the content.</param>
|
||||
/// <returns>The content object.</returns>
|
||||
public IContent Create(string name, int parentId, string contentTypeAlias, int userId = 0)
|
||||
public IContent Create(string name, int parentId, string contentTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// TODO: what about culture?
|
||||
|
||||
@@ -212,7 +212,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="contentTypeAlias">The alias of the content type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the content.</param>
|
||||
/// <returns>The content object.</returns>
|
||||
public IContent Create(string name, IContent parent, string contentTypeAlias, int userId = 0)
|
||||
public IContent Create(string name, IContent parent, string contentTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// TODO: what about culture?
|
||||
|
||||
@@ -243,7 +243,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="contentTypeAlias">The alias of the content type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the content.</param>
|
||||
/// <returns>The content object.</returns>
|
||||
public IContent CreateAndSave(string name, int parentId, string contentTypeAlias, int userId = 0)
|
||||
public IContent CreateAndSave(string name, int parentId, string contentTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// TODO: what about culture?
|
||||
|
||||
@@ -277,7 +277,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="contentTypeAlias">The alias of the content type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the content.</param>
|
||||
/// <returns>The content object.</returns>
|
||||
public IContent CreateAndSave(string name, IContent parent, string contentTypeAlias, int userId = 0)
|
||||
public IContent CreateAndSave(string name, IContent parent, string contentTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// TODO: what about culture?
|
||||
|
||||
@@ -749,7 +749,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
#region Save, Publish, Unpublish
|
||||
|
||||
/// <inheritdoc />
|
||||
public OperationResult Save(IContent content, int userId = 0, bool raiseEvents = true)
|
||||
public OperationResult Save(IContent content, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var publishedState = content.PublishedState;
|
||||
if (publishedState != PublishedState.Published && publishedState != PublishedState.Unpublished)
|
||||
@@ -807,7 +807,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public OperationResult Save(IEnumerable<IContent> contents, int userId = 0, bool raiseEvents = true)
|
||||
public OperationResult Save(IEnumerable<IContent> contents, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
var contentsA = contents.ToArray();
|
||||
@@ -847,7 +847,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public PublishResult SaveAndPublish(IContent content, string culture = "*", int userId = 0, bool raiseEvents = true)
|
||||
public PublishResult SaveAndPublish(IContent content, string culture = "*", int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -908,14 +908,15 @@ namespace Umbraco.Core.Services.Implement
|
||||
: new PublishResult(PublishResultType.FailedPublishNothingToPublish, evtMsgs, content);
|
||||
}
|
||||
|
||||
// TODO: currently, no way to know which one failed
|
||||
if (cultures.Select(content.PublishCulture).Any(isValid => !isValid))
|
||||
return new PublishResult(PublishResultType.FailedPublishContentInvalid, evtMsgs, content); //fixme: no way to know which one failed?
|
||||
return new PublishResult(PublishResultType.FailedPublishContentInvalid, evtMsgs, content);
|
||||
|
||||
return CommitDocumentChanges(content, userId, raiseEvents);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public PublishResult Unpublish(IContent content, string culture = "*", int userId = 0)
|
||||
public PublishResult Unpublish(IContent content, string culture = "*", int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
if (content == null) throw new ArgumentNullException(nameof(content));
|
||||
|
||||
@@ -980,7 +981,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <see cref="CommitDocumentChanges"/> to actually commit the changes to the database.</para>
|
||||
/// <para>The document is *always* saved, even when publishing fails.</para>
|
||||
/// </remarks>
|
||||
internal PublishResult CommitDocumentChanges(IContent content, int userId = 0, bool raiseEvents = true)
|
||||
internal PublishResult CommitDocumentChanges(IContent content, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -991,7 +992,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
private PublishResult CommitDocumentChangesInternal(IScope scope, IContent content, int userId = 0, bool raiseEvents = true, bool branchOne = false, bool branchRoot = false)
|
||||
private PublishResult CommitDocumentChangesInternal(IScope scope, IContent content, int userId = Constants.Security.SuperUserId, bool raiseEvents = true, bool branchOne = false, bool branchRoot = false)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
PublishResult publishResult = null;
|
||||
@@ -1055,9 +1056,10 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
|
||||
// reset published state from temp values (publishing, unpublishing) to original value
|
||||
// (published, unpublished) in order to save the document, unchanged
|
||||
//TODO: why? this seems odd, were just setting the exact same value that it already has
|
||||
// instead do we want to just set the PublishState?
|
||||
// (published, unpublished) in order to save the document, unchanged - yes, this is odd,
|
||||
// but: (a) it means we don't reproduce the PublishState logic here and (b) setting the
|
||||
// PublishState to anything other than Publishing or Unpublishing - which is precisely
|
||||
// what we want to do here - throws
|
||||
content.Published = content.Published;
|
||||
}
|
||||
}
|
||||
@@ -1080,9 +1082,10 @@ namespace Umbraco.Core.Services.Implement
|
||||
else
|
||||
{
|
||||
// reset published state from temp values (publishing, unpublishing) to original value
|
||||
// (published, unpublished) in order to save the document, unchanged
|
||||
//TODO: why? this seems odd, were just setting the exact same value that it already has
|
||||
// instead do we want to just set the PublishState?
|
||||
// (published, unpublished) in order to save the document, unchanged - yes, this is odd,
|
||||
// but: (a) it means we don't reproduce the PublishState logic here and (b) setting the
|
||||
// PublishState to anything other than Publishing or Unpublishing - which is precisely
|
||||
// what we want to do here - throws
|
||||
content.Published = content.Published;
|
||||
}
|
||||
}
|
||||
@@ -1356,7 +1359,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string culture = "*", int userId = 0)
|
||||
public IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string culture = "*", int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// note: EditedValue and PublishedValue are objects here, so it is important to .Equals()
|
||||
// and not to == them, else we would be comparing references, and that is a bad thing
|
||||
@@ -1398,7 +1401,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string[] cultures, int userId = 0)
|
||||
public IEnumerable<PublishResult> SaveAndPublishBranch(IContent content, bool force, string[] cultures, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// note: EditedValue and PublishedValue are objects here, so it is important to .Equals()
|
||||
// and not to == them, else we would be comparing references, and that is a bad thing
|
||||
@@ -1438,7 +1441,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
public IEnumerable<PublishResult> SaveAndPublishBranch(IContent document, bool force,
|
||||
Func<IContent, HashSet<string>> shouldPublish,
|
||||
Func<IContent, HashSet<string>, bool> publishCultures,
|
||||
int userId = 0)
|
||||
int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
if (shouldPublish == null) throw new ArgumentNullException(nameof(shouldPublish));
|
||||
if (publishCultures == null) throw new ArgumentNullException(nameof(publishCultures));
|
||||
@@ -1507,9 +1510,8 @@ namespace Umbraco.Core.Services.Implement
|
||||
Audit(AuditType.Publish, userId, document.Id, "Branch published");
|
||||
|
||||
// trigger events for the entire branch
|
||||
// (SaveAndPublishBranchOne does *not* do it)
|
||||
scope.Events.Dispatch(TreeChanged, this, new TreeChange<IContent>(document, TreeChangeTypes.RefreshBranch).ToEventArgs());
|
||||
|
||||
//fixme - in the SaveAndPublishBranchOne -> CommitDocumentChangesInternal publishing/published is going to be raised there, so are we raising it 2x for the same thing?
|
||||
scope.Events.Dispatch(Published, this, new ContentPublishedEventArgs(publishedDocuments, false, evtMsgs), nameof(Published));
|
||||
|
||||
scope.Complete();
|
||||
@@ -1617,7 +1619,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="id">Id of the <see cref="IContent"/> object to delete versions from</param>
|
||||
/// <param name="versionDate">Latest version date</param>
|
||||
/// <param name="userId">Optional Id of the User deleting versions of a Content object</param>
|
||||
public void DeleteVersions(int id, DateTime versionDate, int userId = 0)
|
||||
public void DeleteVersions(int id, DateTime versionDate, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -1647,7 +1649,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="versionId">Id of the version to delete</param>
|
||||
/// <param name="deletePriorVersions">Boolean indicating whether to delete versions prior to the versionId</param>
|
||||
/// <param name="userId">Optional Id of the User deleting versions of a Content object</param>
|
||||
public void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = 0)
|
||||
public void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -1733,7 +1735,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="content">The <see cref="IContent"/> to move</param>
|
||||
/// <param name="parentId">Id of the Content's new Parent</param>
|
||||
/// <param name="userId">Optional Id of the User moving the Content</param>
|
||||
public void Move(IContent content, int parentId, int userId = 0)
|
||||
public void Move(IContent content, int parentId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// if moving to the recycle bin then use the proper method
|
||||
if (parentId == Constants.System.RecycleBinContent)
|
||||
@@ -1909,7 +1911,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="relateToOriginal">Boolean indicating whether the copy should be related to the original</param>
|
||||
/// <param name="userId">Optional Id of the User copying the Content</param>
|
||||
/// <returns>The newly created <see cref="IContent"/> object</returns>
|
||||
public IContent Copy(IContent content, int parentId, bool relateToOriginal, int userId = 0)
|
||||
public IContent Copy(IContent content, int parentId, bool relateToOriginal, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
return Copy(content, parentId, relateToOriginal, true, userId);
|
||||
}
|
||||
@@ -1924,7 +1926,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="recursive">A value indicating whether to recursively copy children.</param>
|
||||
/// <param name="userId">Optional Id of the User copying the Content</param>
|
||||
/// <returns>The newly created <see cref="IContent"/> object</returns>
|
||||
public IContent Copy(IContent content, int parentId, bool relateToOriginal, bool recursive, int userId = 0)
|
||||
public IContent Copy(IContent content, int parentId, bool relateToOriginal, bool recursive, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var copy = content.DeepCloneWithResetIdentities();
|
||||
copy.ParentId = parentId;
|
||||
@@ -2027,7 +2029,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="content">The <see cref="IContent"/> to send to publication</param>
|
||||
/// <param name="userId">Optional Id of the User issuing the send to publication</param>
|
||||
/// <returns>True if sending publication was successful otherwise false</returns>
|
||||
public bool SendToPublication(IContent content, int userId = 0)
|
||||
public bool SendToPublication(IContent content, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -2081,7 +2083,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="raiseEvents"></param>
|
||||
/// <returns>Result indicating what action was taken when handling the command.</returns>
|
||||
public OperationResult Sort(IEnumerable<IContent> items, int userId = 0, bool raiseEvents = true)
|
||||
public OperationResult Sort(IEnumerable<IContent> items, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -2110,7 +2112,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="raiseEvents"></param>
|
||||
/// <returns>Result indicating what action was taken when handling the command.</returns>
|
||||
public OperationResult Sort(IEnumerable<int> ids, int userId = 0, bool raiseEvents = true)
|
||||
public OperationResult Sort(IEnumerable<int> ids, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -2595,7 +2597,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </remarks>
|
||||
/// <param name="contentTypeIds">Id of the <see cref="IContentType"/></param>
|
||||
/// <param name="userId">Optional Id of the user issuing the delete operation</param>
|
||||
public void DeleteOfTypes(IEnumerable<int> contentTypeIds, int userId = 0)
|
||||
public void DeleteOfTypes(IEnumerable<int> contentTypeIds, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// TODO: This currently this is called from the ContentTypeService but that needs to change,
|
||||
// if we are deleting a content type, we should just delete the data and do this operation slightly differently.
|
||||
@@ -2671,7 +2673,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <remarks>This needs extra care and attention as its potentially a dangerous and extensive operation</remarks>
|
||||
/// <param name="contentTypeId">Id of the <see cref="IContentType"/></param>
|
||||
/// <param name="userId">Optional id of the user deleting the media</param>
|
||||
public void DeleteOfType(int contentTypeId, int userId = 0)
|
||||
public void DeleteOfType(int contentTypeId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
DeleteOfTypes(new[] { contentTypeId }, userId);
|
||||
}
|
||||
@@ -2729,7 +2731,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveBlueprint(IContent content, int userId = 0)
|
||||
public void SaveBlueprint(IContent content, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
//always ensure the blueprint is at the root
|
||||
if (content.ParentId != -1)
|
||||
@@ -2755,7 +2757,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public void DeleteBlueprint(IContent content, int userId = 0)
|
||||
public void DeleteBlueprint(IContent content, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -2768,7 +2770,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
private static readonly string[] ArrayOfOneNullString = { null };
|
||||
|
||||
public IContent CreateContentFromBlueprint(IContent blueprint, string name, int userId = 0)
|
||||
public IContent CreateContentFromBlueprint(IContent blueprint, string name, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
if (blueprint == null) throw new ArgumentNullException(nameof(blueprint));
|
||||
|
||||
@@ -2817,7 +2819,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public void DeleteBlueprintsOfTypes(IEnumerable<int> contentTypeIds, int userId = 0)
|
||||
public void DeleteBlueprintsOfTypes(IEnumerable<int> contentTypeIds, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -2844,7 +2846,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public void DeleteBlueprintsOfType(int contentTypeId, int userId = 0)
|
||||
public void DeleteBlueprintsOfType(int contentTypeId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
DeleteBlueprintsOfTypes(new[] { contentTypeId }, userId);
|
||||
}
|
||||
@@ -2853,7 +2855,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
#region Rollback
|
||||
|
||||
public OperationResult Rollback(int id, int versionId, string culture = "*", int userId = 0)
|
||||
public OperationResult Rollback(int id, int versionId, string culture = "*", int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
public IContentTypeBaseService For(IContentBase contentBase)
|
||||
{
|
||||
if (contentBase == null) throw new ArgumentNullException(nameof(contentBase));
|
||||
switch (contentBase)
|
||||
{
|
||||
case IContent _:
|
||||
@@ -30,5 +31,12 @@ namespace Umbraco.Core.Services.Implement
|
||||
throw new ArgumentException($"Invalid contentBase type: {contentBase.GetType().FullName}" , nameof(contentBase));
|
||||
}
|
||||
}
|
||||
|
||||
// note: this should be a default interface method with C# 8
|
||||
public IContentTypeComposition GetContentTypeOf(IContentBase contentBase)
|
||||
{
|
||||
if (contentBase == null) throw new ArgumentNullException(nameof(contentBase));
|
||||
return For(contentBase)?.Get(contentBase.ContentTypeId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -376,7 +376,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
#region Save
|
||||
|
||||
public void Save(TItem item, int userId = 0)
|
||||
public void Save(TItem item, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -414,7 +414,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public void Save(IEnumerable<TItem> items, int userId = 0)
|
||||
public void Save(IEnumerable<TItem> items, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var itemsA = items.ToArray();
|
||||
|
||||
@@ -460,7 +460,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
#region Delete
|
||||
|
||||
public void Delete(TItem item, int userId = 0)
|
||||
public void Delete(TItem item, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -514,7 +514,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public void Delete(IEnumerable<TItem> items, int userId = 0)
|
||||
public void Delete(IEnumerable<TItem> items, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var itemsA = items.ToArray();
|
||||
|
||||
@@ -735,7 +735,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
protected Guid ContainerObjectType => EntityContainer.GetContainerObjectType(ContainedObjectType);
|
||||
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentId, string name, int userId = 0)
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentId, string name, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
@@ -775,7 +775,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = 0)
|
||||
public Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -869,7 +869,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public Attempt<OperationResult> DeleteContainer(int containerId, int userId = 0)
|
||||
public Attempt<OperationResult> DeleteContainer(int containerId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
@@ -906,7 +906,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = 0)
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
#region Containers
|
||||
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentId, string name, int userId = 0)
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> CreateContainer(int parentId, string name, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
@@ -119,7 +119,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = 0)
|
||||
public Attempt<OperationResult> SaveContainer(EntityContainer container, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -153,7 +153,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
return OperationResult.Attempt.Succeed(evtMsgs);
|
||||
}
|
||||
|
||||
public Attempt<OperationResult> DeleteContainer(int containerId, int userId = 0)
|
||||
public Attempt<OperationResult> DeleteContainer(int containerId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
@@ -186,7 +186,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
return OperationResult.Attempt.Succeed(evtMsgs);
|
||||
}
|
||||
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = 0)
|
||||
public Attempt<OperationResult<OperationResultType, EntityContainer>> RenameContainer(int id, string name, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
@@ -331,7 +331,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="dataType"><see cref="IDataType"/> to save</param>
|
||||
/// <param name="userId">Id of the user issuing the save</param>
|
||||
public void Save(IDataType dataType, int userId = 0)
|
||||
public void Save(IDataType dataType, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
dataType.CreatorId = userId;
|
||||
|
||||
@@ -363,7 +363,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="dataTypeDefinitions"><see cref="IDataType"/> to save</param>
|
||||
/// <param name="userId">Id of the user issuing the save</param>
|
||||
public void Save(IEnumerable<IDataType> dataTypeDefinitions, int userId = 0)
|
||||
public void Save(IEnumerable<IDataType> dataTypeDefinitions, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
Save(dataTypeDefinitions, userId, true);
|
||||
}
|
||||
@@ -413,7 +413,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </remarks>
|
||||
/// <param name="dataType"><see cref="IDataType"/> to delete</param>
|
||||
/// <param name="userId">Optional Id of the user issuing the deletion</param>
|
||||
public void Delete(IDataType dataType, int userId = 0)
|
||||
public void Delete(IDataType dataType, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="stylesheet"><see cref="Stylesheet"/> to save</param>
|
||||
/// <param name="userId"></param>
|
||||
public void SaveStylesheet(Stylesheet stylesheet, int userId = 0)
|
||||
public void SaveStylesheet(Stylesheet stylesheet, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -100,7 +100,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="path">Name incl. extension of the Stylesheet to delete</param>
|
||||
/// <param name="userId"></param>
|
||||
public void DeleteStylesheet(string path, int userId = 0)
|
||||
public void DeleteStylesheet(string path, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -217,7 +217,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="script"><see cref="Script"/> to save</param>
|
||||
/// <param name="userId"></param>
|
||||
public void SaveScript(Script script, int userId = 0)
|
||||
public void SaveScript(Script script, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -242,7 +242,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="path">Name incl. extension of the Script to delete</param>
|
||||
/// <param name="userId"></param>
|
||||
public void DeleteScript(string path, int userId = 0)
|
||||
public void DeleteScript(string path, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -338,7 +338,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <returns>
|
||||
/// The template created
|
||||
/// </returns>
|
||||
public Attempt<OperationResult<OperationResultType, ITemplate>> CreateTemplateForContentType(string contentTypeAlias, string contentTypeName, int userId = 0)
|
||||
public Attempt<OperationResult<OperationResultType, ITemplate>> CreateTemplateForContentType(string contentTypeAlias, string contentTypeName, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var template = new Template(contentTypeName,
|
||||
//NOTE: We are NOT passing in the content type alias here, we want to use it's name since we don't
|
||||
@@ -395,7 +395,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="masterTemplate"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public ITemplate CreateTemplateWithIdentity(string name, string alias, string content, ITemplate masterTemplate = null, int userId = 0)
|
||||
public ITemplate CreateTemplateWithIdentity(string name, string alias, string content, ITemplate masterTemplate = null, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// file might already be on disk, if so grab the content to avoid overwriting
|
||||
var template = new Template(name, alias)
|
||||
@@ -529,7 +529,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="template"><see cref="Template"/> to save</param>
|
||||
/// <param name="userId"></param>
|
||||
public void SaveTemplate(ITemplate template, int userId = 0)
|
||||
public void SaveTemplate(ITemplate template, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -553,7 +553,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="templates">List of <see cref="Template"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user</param>
|
||||
public void SaveTemplate(IEnumerable<ITemplate> templates, int userId = 0)
|
||||
public void SaveTemplate(IEnumerable<ITemplate> templates, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var templatesA = templates.ToArray();
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
@@ -579,7 +579,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="alias">Alias of the <see cref="ITemplate"/> to delete</param>
|
||||
/// <param name="userId"></param>
|
||||
public void DeleteTemplate(string alias, int userId = 0)
|
||||
public void DeleteTemplate(string alias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -723,17 +723,17 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public Attempt<IPartialView> CreatePartialView(IPartialView partialView, string snippetName = null, int userId = 0)
|
||||
public Attempt<IPartialView> CreatePartialView(IPartialView partialView, string snippetName = null, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
return CreatePartialViewMacro(partialView, PartialViewType.PartialView, snippetName, userId);
|
||||
}
|
||||
|
||||
public Attempt<IPartialView> CreatePartialViewMacro(IPartialView partialView, string snippetName = null, int userId = 0)
|
||||
public Attempt<IPartialView> CreatePartialViewMacro(IPartialView partialView, string snippetName = null, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
return CreatePartialViewMacro(partialView, PartialViewType.PartialViewMacro, snippetName, userId);
|
||||
}
|
||||
|
||||
private Attempt<IPartialView> CreatePartialViewMacro(IPartialView partialView, PartialViewType partialViewType, string snippetName = null, int userId = 0)
|
||||
private Attempt<IPartialView> CreatePartialViewMacro(IPartialView partialView, PartialViewType partialViewType, string snippetName = null, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
string partialViewHeader;
|
||||
switch (partialViewType)
|
||||
@@ -799,17 +799,17 @@ namespace Umbraco.Core.Services.Implement
|
||||
return Attempt<IPartialView>.Succeed(partialView);
|
||||
}
|
||||
|
||||
public bool DeletePartialView(string path, int userId = 0)
|
||||
public bool DeletePartialView(string path, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
return DeletePartialViewMacro(path, PartialViewType.PartialView, userId);
|
||||
}
|
||||
|
||||
public bool DeletePartialViewMacro(string path, int userId = 0)
|
||||
public bool DeletePartialViewMacro(string path, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
return DeletePartialViewMacro(path, PartialViewType.PartialViewMacro, userId);
|
||||
}
|
||||
|
||||
private bool DeletePartialViewMacro(string path, PartialViewType partialViewType, int userId = 0)
|
||||
private bool DeletePartialViewMacro(string path, PartialViewType partialViewType, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -839,17 +839,17 @@ namespace Umbraco.Core.Services.Implement
|
||||
return true;
|
||||
}
|
||||
|
||||
public Attempt<IPartialView> SavePartialView(IPartialView partialView, int userId = 0)
|
||||
public Attempt<IPartialView> SavePartialView(IPartialView partialView, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
return SavePartialView(partialView, PartialViewType.PartialView, userId);
|
||||
}
|
||||
|
||||
public Attempt<IPartialView> SavePartialViewMacro(IPartialView partialView, int userId = 0)
|
||||
public Attempt<IPartialView> SavePartialViewMacro(IPartialView partialView, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
return SavePartialView(partialView, PartialViewType.PartialViewMacro, userId);
|
||||
}
|
||||
|
||||
private Attempt<IPartialView> SavePartialView(IPartialView partialView, PartialViewType partialViewType, int userId = 0)
|
||||
private Attempt<IPartialView> SavePartialView(IPartialView partialView, PartialViewType partialViewType, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
|
||||
@@ -227,7 +227,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the dictionary item</param>
|
||||
public void Save(IDictionaryItem dictionaryItem, int userId = 0)
|
||||
public void Save(IDictionaryItem dictionaryItem, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -256,7 +256,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the dictionary item</param>
|
||||
public void Delete(IDictionaryItem dictionaryItem, int userId = 0)
|
||||
public void Delete(IDictionaryItem dictionaryItem, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -356,7 +356,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="language"><see cref="ILanguage"/> to save</param>
|
||||
/// <param name="userId">Optional id of the user saving the language</param>
|
||||
public void Save(ILanguage language, int userId = 0)
|
||||
public void Save(ILanguage language, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -409,7 +409,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="language"><see cref="ILanguage"/> to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the language</param>
|
||||
public void Delete(ILanguage language, int userId = 0)
|
||||
public void Delete(ILanguage language, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
|
||||
@@ -81,7 +81,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="macro"><see cref="IMacro"/> to delete</param>
|
||||
/// <param name="userId">Optional id of the user deleting the macro</param>
|
||||
public void Delete(IMacro macro, int userId = 0)
|
||||
public void Delete(IMacro macro, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -106,7 +106,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="macro"><see cref="IMacro"/> to save</param>
|
||||
/// <param name="userId">Optional Id of the user deleting the macro</param>
|
||||
public void Save(IMacro macro, int userId = 0)
|
||||
public void Save(IMacro macro, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
|
||||
@@ -112,7 +112,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user creating the media item</param>
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
public IMedia CreateMedia(string name, Guid parentId, string mediaTypeAlias, int userId = 0)
|
||||
public IMedia CreateMedia(string name, Guid parentId, string mediaTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var parent = GetById(parentId);
|
||||
return CreateMedia(name, parent, mediaTypeAlias, userId);
|
||||
@@ -130,7 +130,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="mediaTypeAlias">The alias of the media type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the media.</param>
|
||||
/// <returns>The media object.</returns>
|
||||
public IMedia CreateMedia(string name, int parentId, string mediaTypeAlias, int userId = 0)
|
||||
public IMedia CreateMedia(string name, int parentId, string mediaTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var mediaType = GetMediaType(mediaTypeAlias);
|
||||
if (mediaType == null)
|
||||
@@ -160,7 +160,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="mediaTypeAlias">The alias of the media type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the media.</param>
|
||||
/// <returns>The media object.</returns>
|
||||
public IMedia CreateMedia(string name, string mediaTypeAlias, int userId = 0)
|
||||
public IMedia CreateMedia(string name, string mediaTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// not locking since not saving anything
|
||||
|
||||
@@ -190,7 +190,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="mediaTypeAlias">The alias of the media type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the media.</param>
|
||||
/// <returns>The media object.</returns>
|
||||
public IMedia CreateMedia(string name, IMedia parent, string mediaTypeAlias, int userId = 0)
|
||||
public IMedia CreateMedia(string name, IMedia parent, string mediaTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
if (parent == null) throw new ArgumentNullException(nameof(parent));
|
||||
|
||||
@@ -219,7 +219,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="mediaTypeAlias">The alias of the media type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the media.</param>
|
||||
/// <returns>The media object.</returns>
|
||||
public IMedia CreateMediaWithIdentity(string name, int parentId, string mediaTypeAlias, int userId = 0)
|
||||
public IMedia CreateMediaWithIdentity(string name, int parentId, string mediaTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -251,7 +251,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="mediaTypeAlias">The alias of the media type.</param>
|
||||
/// <param name="userId">The optional id of the user creating the media.</param>
|
||||
/// <returns>The media object.</returns>
|
||||
public IMedia CreateMediaWithIdentity(string name, IMedia parent, string mediaTypeAlias, int userId = 0)
|
||||
public IMedia CreateMediaWithIdentity(string name, IMedia parent, string mediaTypeAlias, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
if (parent == null) throw new ArgumentNullException(nameof(parent));
|
||||
|
||||
@@ -632,7 +632,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="media">The <see cref="IMedia"/> to save</param>
|
||||
/// <param name="userId">Id of the User saving the Media</param>
|
||||
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
|
||||
public Attempt<OperationResult> Save(IMedia media, int userId = 0, bool raiseEvents = true)
|
||||
public Attempt<OperationResult> Save(IMedia media, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -677,7 +677,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="medias">Collection of <see cref="IMedia"/> to save</param>
|
||||
/// <param name="userId">Id of the User saving the Media</param>
|
||||
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
|
||||
public Attempt<OperationResult> Save(IEnumerable<IMedia> medias, int userId = 0, bool raiseEvents = true)
|
||||
public Attempt<OperationResult> Save(IEnumerable<IMedia> medias, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
var mediasA = medias.ToArray();
|
||||
@@ -724,7 +724,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="media">The <see cref="IMedia"/> to delete</param>
|
||||
/// <param name="userId">Id of the User deleting the Media</param>
|
||||
public Attempt<OperationResult> Delete(IMedia media, int userId = 0)
|
||||
public Attempt<OperationResult> Delete(IMedia media, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -785,7 +785,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="id">Id of the <see cref="IMedia"/> object to delete versions from</param>
|
||||
/// <param name="versionDate">Latest version date</param>
|
||||
/// <param name="userId">Optional Id of the User deleting versions of a Media object</param>
|
||||
public void DeleteVersions(int id, DateTime versionDate, int userId = 0)
|
||||
public void DeleteVersions(int id, DateTime versionDate, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -809,7 +809,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
}
|
||||
}
|
||||
|
||||
private void DeleteVersions(IScope scope, bool wlock, int id, DateTime versionDate, int userId = 0)
|
||||
private void DeleteVersions(IScope scope, bool wlock, int id, DateTime versionDate, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var args = new DeleteRevisionsEventArgs(id, dateToRetain: versionDate);
|
||||
if (scope.Events.DispatchCancelable(DeletingVersions, this, args))
|
||||
@@ -832,7 +832,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="versionId">Id of the version to delete</param>
|
||||
/// <param name="deletePriorVersions">Boolean indicating whether to delete versions prior to the versionId</param>
|
||||
/// <param name="userId">Optional Id of the User deleting versions of a Media object</param>
|
||||
public void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = 0)
|
||||
public void DeleteVersion(int id, int versionId, bool deletePriorVersions, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
@@ -872,7 +872,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </summary>
|
||||
/// <param name="media">The <see cref="IMedia"/> to delete</param>
|
||||
/// <param name="userId">Id of the User deleting the Media</param>
|
||||
public Attempt<OperationResult> MoveToRecycleBin(IMedia media, int userId = 0)
|
||||
public Attempt<OperationResult> MoveToRecycleBin(IMedia media, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
var moves = new List<Tuple<IMedia, string>>();
|
||||
@@ -916,7 +916,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="media">The <see cref="IMedia"/> to move</param>
|
||||
/// <param name="parentId">Id of the Media's new Parent</param>
|
||||
/// <param name="userId">Id of the User moving the Media</param>
|
||||
public Attempt<OperationResult> Move(IMedia media, int parentId, int userId = 0)
|
||||
public Attempt<OperationResult> Move(IMedia media, int parentId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var evtMsgs = EventMessagesFactory.Get();
|
||||
|
||||
@@ -1084,7 +1084,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="raiseEvents"></param>
|
||||
/// <returns>True if sorting succeeded, otherwise False</returns>
|
||||
public bool Sort(IEnumerable<IMedia> items, int userId = 0, bool raiseEvents = true)
|
||||
public bool Sort(IEnumerable<IMedia> items, int userId = Constants.Security.SuperUserId, bool raiseEvents = true)
|
||||
{
|
||||
var itemsA = items.ToArray();
|
||||
if (itemsA.Length == 0) return true;
|
||||
@@ -1273,7 +1273,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// </remarks>
|
||||
/// <param name="mediaTypeIds">Id of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user deleting the media</param>
|
||||
public void DeleteMediaOfTypes(IEnumerable<int> mediaTypeIds, int userId = 0)
|
||||
public void DeleteMediaOfTypes(IEnumerable<int> mediaTypeIds, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
// TODO: This currently this is called from the ContentTypeService but that needs to change,
|
||||
// if we are deleting a content type, we should just delete the data and do this operation slightly differently.
|
||||
@@ -1338,7 +1338,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
/// <remarks>This needs extra care and attention as its potentially a dangerous and extensive operation</remarks>
|
||||
/// <param name="mediaTypeId">Id of the <see cref="IMediaType"/></param>
|
||||
/// <param name="userId">Optional id of the user deleting the media</param>
|
||||
public void DeleteMediaOfType(int mediaTypeId, int userId = 0)
|
||||
public void DeleteMediaOfType(int mediaTypeId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
DeleteMediaOfTypes(new[] { mediaTypeId }, userId);
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
public CompiledPackage GetCompiledPackageInfo(FileInfo packageFile) => _packageInstallation.ReadPackage(packageFile);
|
||||
|
||||
public IEnumerable<string> InstallCompiledPackageFiles(PackageDefinition packageDefinition, FileInfo packageFile, int userId = 0)
|
||||
public IEnumerable<string> InstallCompiledPackageFiles(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
if (packageDefinition == null) throw new ArgumentNullException(nameof(packageDefinition));
|
||||
if (packageDefinition.Id == default) throw new ArgumentException("The package definition has not been persisted");
|
||||
@@ -118,7 +118,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
return files;
|
||||
}
|
||||
|
||||
public InstallationSummary InstallCompiledPackageData(PackageDefinition packageDefinition, FileInfo packageFile, int userId = 0)
|
||||
public InstallationSummary InstallCompiledPackageData(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
if (packageDefinition == null) throw new ArgumentNullException(nameof(packageDefinition));
|
||||
if (packageDefinition.Id == default) throw new ArgumentException("The package definition has not been persisted");
|
||||
@@ -141,7 +141,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
return summary;
|
||||
}
|
||||
|
||||
public UninstallationSummary UninstallPackage(string packageName, int userId = 0)
|
||||
public UninstallationSummary UninstallPackage(string packageName, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
//this is ordered by descending version
|
||||
var allPackageVersions = GetInstalledPackageByName(packageName)?.ToList();
|
||||
@@ -187,7 +187,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
#region Created/Installed Package Repositories
|
||||
|
||||
public void DeleteCreatedPackage(int id, int userId = 0)
|
||||
public void DeleteCreatedPackage(int id, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var package = GetCreatedPackageById(id);
|
||||
if (package == null) return;
|
||||
@@ -236,7 +236,7 @@ namespace Umbraco.Core.Services.Implement
|
||||
|
||||
public bool SaveInstalledPackage(PackageDefinition definition) => _installedPackages.SavePackage(definition);
|
||||
|
||||
public void DeleteInstalledPackage(int packageId, int userId = 0)
|
||||
public void DeleteInstalledPackage(int packageId, int userId = Constants.Security.SuperUserId)
|
||||
{
|
||||
var package = GetInstalledPackageById(packageId);
|
||||
if (package == null) return;
|
||||
|
||||
@@ -55,25 +55,25 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<!-- note: NuGet deals with transitive references now -->
|
||||
<PackageReference Include="AutoMapper" Version="7.0.1" />
|
||||
<PackageReference Include="LightInject" Version="5.1.2" />
|
||||
<PackageReference Include="AutoMapper" Version="8.0.0" />
|
||||
<PackageReference Include="LightInject" Version="5.4.0" />
|
||||
<PackageReference Include="LightInject.Annotation" Version="1.1.0" />
|
||||
<PackageReference Include="LightInject.Web" Version="2.0.0" />
|
||||
<PackageReference Include="Microsoft.AspNet.Identity.Core">
|
||||
<Version>2.2.2</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.Client">
|
||||
<Version>5.2.6</Version>
|
||||
<Version>5.2.7</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Owin">
|
||||
<Version>4.0.0</Version>
|
||||
<Version>4.0.1</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="MiniProfiler" Version="3.2.0.157" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
||||
<PackageReference Include="MiniProfiler" Version="4.0.138" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
||||
<PackageReference Include="NPoco" Version="3.9.4" />
|
||||
<PackageReference Include="Semver" Version="2.0.4" />
|
||||
<PackageReference Include="Serilog">
|
||||
<Version>2.7.1</Version>
|
||||
<Version>2.8.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Serilog.Enrichers.Process">
|
||||
<Version>2.0.1</Version>
|
||||
@@ -88,7 +88,7 @@
|
||||
<Version>1.0.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Serilog.Formatting.Compact.Reader">
|
||||
<Version>1.0.2</Version>
|
||||
<Version>1.0.3</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Serilog.Settings.AppSettings">
|
||||
<Version>2.2.2</Version>
|
||||
@@ -302,6 +302,7 @@
|
||||
<Compile Include="DisposableObjectSlim.cs" />
|
||||
<Compile Include="EnumExtensions.cs" />
|
||||
<Compile Include="Events\CancellableEnumerableObjectEventArgs.cs" />
|
||||
<Compile Include="Events\CancellableObjectEventArgsOfTEventObject.cs" />
|
||||
<Compile Include="Events\ContentPublishedEventArgs.cs" />
|
||||
<Compile Include="Events\ContentPublishingEventArgs.cs" />
|
||||
<Compile Include="Events\ContentSavedEventArgs.cs" />
|
||||
@@ -473,6 +474,7 @@
|
||||
<Compile Include="Persistence\Mappers\AuditEntryMapper.cs" />
|
||||
<Compile Include="Persistence\Mappers\AuditItemMapper.cs" />
|
||||
<Compile Include="Persistence\Mappers\ConsentMapper.cs" />
|
||||
<Compile Include="Persistence\Mappers\SimpleContentTypeMapper.cs" />
|
||||
<Compile Include="Persistence\Repositories\IAuditEntryRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\IConsentRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\Implement\AuditEntryRepository.cs" />
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<ItemGroup>
|
||||
<!-- note: NuGet deals with transitive references now -->
|
||||
<PackageReference Include="Examine" Version="1.0.0-beta078" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
||||
<PackageReference Include="NPoco" Version="3.9.4" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -64,23 +64,23 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
|
||||
@@ -88,7 +88,7 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
|
||||
@@ -100,11 +100,11 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.0"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.0"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
|
||||
|
||||
@@ -264,7 +264,7 @@ AnotherContentFinder
|
||||
public void Resolves_Assigned_Mappers()
|
||||
{
|
||||
var foundTypes1 = _typeLoader.GetAssignedMapperTypes();
|
||||
Assert.AreEqual(29, foundTypes1.Count());
|
||||
Assert.AreEqual(30, foundTypes1.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -1,22 +1,60 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Composing.Composers;
|
||||
using Umbraco.Core.Configuration.UmbracoSettings;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Services.Implement;
|
||||
using Umbraco.Tests.TestHelpers.Entities;
|
||||
using Umbraco.Tests.Testing;
|
||||
using Umbraco.Web.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Tests.Models
|
||||
{
|
||||
[TestFixture]
|
||||
public class ContentExtensionsTests : UmbracoTestBase
|
||||
{
|
||||
#region Others
|
||||
private IContentTypeService _contentTypeService;
|
||||
|
||||
protected override void Compose()
|
||||
{
|
||||
base.Compose();
|
||||
|
||||
Composition.Register(_ => Mock.Of<ILogger>());
|
||||
Composition.ComposeFileSystems();
|
||||
|
||||
Composition.Register(_ => Mock.Of<IDataTypeService>());
|
||||
Composition.Register(_ => Mock.Of<IContentSection>());
|
||||
|
||||
// all this is required so we can validate properties...
|
||||
var editor = new TextboxPropertyEditor(Mock.Of<ILogger>()) { Alias = "test" };
|
||||
Composition.Register(_ => new DataEditorCollection(new[] { editor }));
|
||||
Composition.Register<PropertyEditorCollection>();
|
||||
var dataType = Mock.Of<IDataType>();
|
||||
Mock.Get(dataType).Setup(x => x.Configuration).Returns(() => new object());
|
||||
var dataTypeService = Mock.Of<IDataTypeService>();
|
||||
Mock.Get(dataTypeService)
|
||||
.Setup(x => x.GetDataType(It.IsAny<int>()))
|
||||
.Returns(() => dataType);
|
||||
|
||||
_contentTypeService = Mock.Of<IContentTypeService>();
|
||||
var mediaTypeService = Mock.Of<IMediaTypeService>();
|
||||
var memberTypeService = Mock.Of<IMemberTypeService>();
|
||||
Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService, contentTypeBaseServiceProvider: new ContentTypeBaseServiceProvider(_contentTypeService, mediaTypeService, memberTypeService)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DirtyProperty_Reset_Clears_SavedPublishedState()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
content.PublishedState = PublishedState.Publishing;
|
||||
@@ -30,6 +68,8 @@ namespace Umbraco.Tests.Models
|
||||
public void DirtyProperty_OnlyIfActuallyChanged_Content()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// if you assign a content property with its value it is not dirty
|
||||
@@ -52,6 +92,8 @@ namespace Umbraco.Tests.Models
|
||||
public void DirtyProperty_OnlyIfActuallyChanged_User()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
var prop = content.Properties.First();
|
||||
|
||||
@@ -76,6 +118,8 @@ namespace Umbraco.Tests.Models
|
||||
public void DirtyProperty_UpdateDate()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
var prop = content.Properties.First();
|
||||
|
||||
@@ -99,6 +143,8 @@ namespace Umbraco.Tests.Models
|
||||
public void DirtyProperty_WasDirty_ContentProperty()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
content.ResetDirtyProperties(false);
|
||||
Assert.IsFalse(content.IsDirty());
|
||||
@@ -126,6 +172,8 @@ namespace Umbraco.Tests.Models
|
||||
public void DirtyProperty_WasDirty_ContentSortOrder()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
content.ResetDirtyProperties(false);
|
||||
Assert.IsFalse(content.IsDirty());
|
||||
@@ -153,6 +201,8 @@ namespace Umbraco.Tests.Models
|
||||
public void DirtyProperty_WasDirty_UserProperty()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
var prop = content.Properties.First();
|
||||
content.ResetDirtyProperties(false);
|
||||
@@ -178,7 +228,5 @@ namespace Umbraco.Tests.Models
|
||||
//Assert.IsFalse(content.WasDirty()); // not impacted by user properties
|
||||
Assert.IsTrue(content.WasDirty()); // now it is!
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ using Umbraco.Core.Models.Entities;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Core.Serialization;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Services.Implement;
|
||||
using Umbraco.Tests.TestHelpers.Entities;
|
||||
using Umbraco.Tests.TestHelpers.Stubs;
|
||||
using Umbraco.Tests.Testing;
|
||||
@@ -28,6 +29,8 @@ namespace Umbraco.Tests.Models
|
||||
[TestFixture]
|
||||
public class ContentTests : UmbracoTestBase
|
||||
{
|
||||
private IContentTypeService _contentTypeService;
|
||||
|
||||
protected override void Compose()
|
||||
{
|
||||
base.Compose();
|
||||
@@ -48,19 +51,25 @@ namespace Umbraco.Tests.Models
|
||||
Mock.Get(dataTypeService)
|
||||
.Setup(x => x.GetDataType(It.IsAny<int>()))
|
||||
.Returns(() => dataType);
|
||||
Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService));
|
||||
|
||||
_contentTypeService = Mock.Of<IContentTypeService>();
|
||||
var mediaTypeService = Mock.Of<IMediaTypeService>();
|
||||
var memberTypeService = Mock.Of<IMemberTypeService>();
|
||||
Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService, contentTypeBaseServiceProvider: new ContentTypeBaseServiceProvider(_contentTypeService, mediaTypeService, memberTypeService)));
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Variant_Culture_Names_Track_Dirty_Changes()
|
||||
{
|
||||
var contentType = new ContentType(-1) { Alias = "contentType" };
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = new Content("content", -1, contentType) { Id = 1, VersionId = 1 };
|
||||
|
||||
const string langFr = "fr-FR";
|
||||
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
|
||||
Assert.IsFalse(content.IsPropertyDirty("CultureInfos")); //hasn't been changed
|
||||
|
||||
Thread.Sleep(500); //The "Date" wont be dirty if the test runs too fast since it will be the same date
|
||||
@@ -123,6 +132,7 @@ namespace Umbraco.Tests.Models
|
||||
|
||||
//ensure that nothing is marked as dirty
|
||||
contentType.ResetDirtyProperties(false);
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
|
||||
var content = MockedContent.CreateSimpleContent(contentType);
|
||||
@@ -138,6 +148,8 @@ namespace Umbraco.Tests.Models
|
||||
public void All_Dirty_Properties_Get_Reset()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
content.ResetDirtyProperties(false);
|
||||
@@ -154,6 +166,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -167,6 +181,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -183,6 +199,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -199,6 +217,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
content.Id = 10;
|
||||
content.Key = new Guid("29181B97-CB8F-403F-86DE-5FEB497F4800");
|
||||
@@ -278,6 +298,8 @@ namespace Umbraco.Tests.Models
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
contentType.Id = 99;
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
content.SetCultureName("Hello", "en-US");
|
||||
@@ -387,6 +409,8 @@ namespace Umbraco.Tests.Models
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
contentType.Id = 99;
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
content.SetCultureName("Hello", "en-US");
|
||||
@@ -458,6 +482,8 @@ namespace Umbraco.Tests.Models
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
contentType.Id = 99;
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
var i = 200;
|
||||
foreach (var property in content.Properties)
|
||||
@@ -509,10 +535,12 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
content.PropertyValues(new {title = "This is the new title"});
|
||||
content.PropertyValues(new { title = "This is the new title"});
|
||||
|
||||
// Assert
|
||||
Assert.That(content.Properties.Any(), Is.True);
|
||||
@@ -527,6 +555,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -543,14 +573,12 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
contentType.PropertyGroups.Add(new PropertyGroup(true) { Name = "Test Group", SortOrder = 3 });
|
||||
|
||||
// Assert
|
||||
Assert.That(contentType.PropertyGroups.Count, Is.EqualTo(3));
|
||||
Assert.That(content.PropertyGroups.Count(), Is.EqualTo(3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -573,7 +601,6 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
contentType.PropertyGroups["Content"].PropertyTypes.Add(new PropertyType("test", ValueStorageType.Ntext, "subtitle")
|
||||
@@ -587,7 +614,6 @@ namespace Umbraco.Tests.Models
|
||||
|
||||
// Assert
|
||||
Assert.That(contentType.PropertyGroups["Content"].PropertyTypes.Count, Is.EqualTo(3));
|
||||
Assert.That(content.PropertyGroups.First(x => x.Name == "Content").PropertyTypes.Count, Is.EqualTo(3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -595,6 +621,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -617,6 +645,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -637,8 +667,6 @@ namespace Umbraco.Tests.Models
|
||||
|
||||
// Assert
|
||||
Assert.That(content.Properties.Count, Is.EqualTo(5));
|
||||
Assert.That(content.PropertyTypes.Count(), Is.EqualTo(5));
|
||||
Assert.That(content.PropertyGroups.Count(), Is.EqualTo(3));
|
||||
Assert.That(content.Properties["subtitle"].GetValue(), Is.EqualTo("Subtitle Test"));
|
||||
Assert.That(content.Properties["title"].GetValue(), Is.EqualTo("Textpage textpage"));
|
||||
}
|
||||
@@ -648,6 +676,8 @@ namespace Umbraco.Tests.Models
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act - note that the PropertyType's properties like SortOrder is not updated through the Content object
|
||||
@@ -669,6 +699,8 @@ namespace Umbraco.Tests.Models
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
var simpleContentType = MockedContentTypes.CreateSimpleContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -676,8 +708,6 @@ namespace Umbraco.Tests.Models
|
||||
|
||||
// Assert
|
||||
Assert.That(content.Properties.Contains("author"), Is.True);
|
||||
Assert.That(content.PropertyGroups.Count(), Is.EqualTo(1));
|
||||
Assert.That(content.PropertyTypes.Count(), Is.EqualTo(3));
|
||||
//Note: There was 4 properties, after changing ContentType 1 has been added (no properties are deleted)
|
||||
Assert.That(content.Properties.Count, Is.EqualTo(5));
|
||||
}
|
||||
@@ -688,6 +718,8 @@ namespace Umbraco.Tests.Models
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
var simpleContentType = MockedContentTypes.CreateSimpleContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -705,6 +737,8 @@ namespace Umbraco.Tests.Models
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
var simpleContentType = MockedContentTypes.CreateSimpleContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
// Act
|
||||
@@ -723,6 +757,7 @@ namespace Umbraco.Tests.Models
|
||||
public void Can_Change_ContentType_On_Content_And_Clear_Old_PropertyTypes()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
//Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
//// Arrange
|
||||
//var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
@@ -742,6 +777,8 @@ namespace Umbraco.Tests.Models
|
||||
public void Can_Verify_Content_Is_Published()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
|
||||
|
||||
content.ResetDirtyProperties();
|
||||
@@ -811,6 +848,8 @@ namespace Umbraco.Tests.Models
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateTextPageContentType();
|
||||
contentType.ResetDirtyProperties(); //reset
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateTextpageContent(contentType, "test", -1);
|
||||
content.ResetDirtyProperties();
|
||||
|
||||
|
||||
@@ -121,16 +121,16 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
break;
|
||||
case 1:
|
||||
map
|
||||
.ForMember(dest => dest.ValueString, opt => opt.ResolveUsing<MemberValueResolver, string>(src => src.ValueString));
|
||||
.ForMember(dest => dest.ValueString, opt => opt.MapFrom<MemberValueResolver, string>(src => src.ValueString));
|
||||
break;
|
||||
case 2:
|
||||
map
|
||||
.ForMember(dest => dest.ValueString, opt => opt.ResolveUsing<ValueResolver>());
|
||||
.ForMember(dest => dest.ValueString, opt => opt.MapFrom<ValueResolver>());
|
||||
break;
|
||||
case 3:
|
||||
// in most cases that should be perfectly enough?
|
||||
map
|
||||
.ForMember(dest => dest.ValueString, opt => opt.ResolveUsing(source => "!!" + source.ValueString + "!!"));
|
||||
.ForMember(dest => dest.ValueString, opt => opt.MapFrom(source => "!!" + source.ValueString + "!!"));
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(ver));
|
||||
|
||||
@@ -4,15 +4,20 @@ using AutoMapper;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Composing.Composers;
|
||||
using Umbraco.Core.Configuration.UmbracoSettings;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Dictionary;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Core.Services.Implement;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Tests.TestHelpers.Entities;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
using Umbraco.Tests.Testing;
|
||||
using Umbraco.Web.PropertyEditors;
|
||||
using Current = Umbraco.Web.Composing.Current;
|
||||
|
||||
namespace Umbraco.Tests.Models.Mapping
|
||||
@@ -21,12 +26,37 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
[UmbracoTest(AutoMapper = true, Database = UmbracoTestOptions.Database.NewSchemaPerFixture)]
|
||||
public class ContentWebModelMappingTests : TestWithDatabaseBase
|
||||
{
|
||||
private IContentTypeService _contentTypeService;
|
||||
|
||||
|
||||
protected override void Compose()
|
||||
{
|
||||
base.Compose();
|
||||
|
||||
Composition.RegisterUnique(f => Mock.Of<ICultureDictionaryFactory>());
|
||||
Composition.RegisterUnique(f => Mock.Of<IContentTypeService>());
|
||||
|
||||
Composition.Register(_ => Mock.Of<ILogger>());
|
||||
Composition.ComposeFileSystems();
|
||||
|
||||
Composition.Register(_ => Mock.Of<IDataTypeService>());
|
||||
Composition.Register(_ => Mock.Of<IContentSection>());
|
||||
|
||||
// all this is required so we can validate properties...
|
||||
var editor = new TextboxPropertyEditor(Mock.Of<ILogger>()) { Alias = "test" };
|
||||
Composition.Register(_ => new DataEditorCollection(new[] { editor }));
|
||||
Composition.Register<PropertyEditorCollection>();
|
||||
var dataType = Mock.Of<IDataType>();
|
||||
Mock.Get(dataType).Setup(x => x.Configuration).Returns(() => new object());
|
||||
var dataTypeService = Mock.Of<IDataTypeService>();
|
||||
Mock.Get(dataTypeService)
|
||||
.Setup(x => x.GetDataType(It.IsAny<int>()))
|
||||
.Returns(() => dataType);
|
||||
|
||||
_contentTypeService = Mock.Of<IContentTypeService>();
|
||||
var mediaTypeService = Mock.Of<IMediaTypeService>();
|
||||
var memberTypeService = Mock.Of<IMemberTypeService>();
|
||||
Composition.RegisterUnique(_ => _contentTypeService);
|
||||
Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService, contentTypeBaseServiceProvider: new ContentTypeBaseServiceProvider(_contentTypeService, mediaTypeService, memberTypeService)));
|
||||
}
|
||||
|
||||
[DataEditor("Test.Test", "Test", "~/Test.html")]
|
||||
@@ -53,6 +83,8 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
public void To_Media_Item_Simple()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateImageMediaType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedMedia.CreateMediaImage(contentType, -1);
|
||||
FixUsers(content);
|
||||
|
||||
@@ -70,6 +102,8 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
public void To_Content_Item_Simple()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateSimpleContent(contentType);
|
||||
FixUsers(content);
|
||||
|
||||
@@ -87,6 +121,8 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
public void To_Content_Item_Dto()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType();
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateSimpleContent(contentType);
|
||||
FixUsers(content);
|
||||
|
||||
@@ -117,8 +153,8 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
public void To_Display_Model()
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType();
|
||||
var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService);
|
||||
contentTypeServiceMock.Setup(x => x.Get(contentType.Id)).Returns(() => contentType);
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
Mock.Get(_contentTypeService).Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = MockedContent.CreateSimpleContent(contentType);
|
||||
|
||||
@@ -127,7 +163,7 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
|
||||
// need ids for tabs
|
||||
var id = 1;
|
||||
foreach (var g in content.PropertyGroups)
|
||||
foreach (var g in contentType.CompositionPropertyGroups)
|
||||
g.Id = id++;
|
||||
|
||||
var result = Mapper.Map<IContent, ContentItemDisplay>(content);
|
||||
@@ -141,7 +177,7 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
AssertDisplayProperty(invariantContent, p);
|
||||
}
|
||||
|
||||
Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count());
|
||||
Assert.AreEqual(contentType.CompositionPropertyGroups.Count(), invariantContent.Tabs.Count());
|
||||
Assert.IsTrue(invariantContent.Tabs.First().IsActive);
|
||||
Assert.IsTrue(invariantContent.Tabs.Except(new[] { invariantContent.Tabs.First() }).All(x => x.IsActive == false));
|
||||
}
|
||||
@@ -151,9 +187,8 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
{
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType();
|
||||
contentType.PropertyGroups.Clear();
|
||||
var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService);
|
||||
contentTypeServiceMock.Setup(x => x.Get(contentType.Id)).Returns(() => contentType);
|
||||
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
Mock.Get(_contentTypeService).Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
var content = new Content("Home", -1, contentType) { Level = 1, SortOrder = 1, CreatorId = 0, WriterId = 0 };
|
||||
|
||||
@@ -168,7 +203,7 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
AssertDisplayProperty(invariantContent, p);
|
||||
}
|
||||
|
||||
Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count());
|
||||
Assert.AreEqual(contentType.CompositionPropertyGroups.Count(), invariantContent.Tabs.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -186,8 +221,8 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
p.Id = idSeed;
|
||||
idSeed++;
|
||||
}
|
||||
var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService);
|
||||
contentTypeServiceMock.Setup(x => x.Get(contentType.Id)).Returns(() => contentType);
|
||||
Mock.Get(_contentTypeService).As<IContentTypeBaseService>().Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
Mock.Get(_contentTypeService).Setup(x => x.Get(It.IsAny<int>())).Returns(contentType);
|
||||
|
||||
|
||||
var content = MockedContent.CreateSimpleContent(contentType);
|
||||
@@ -200,7 +235,7 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
}
|
||||
//need ids for tabs
|
||||
var id = 1;
|
||||
foreach (var g in content.PropertyGroups)
|
||||
foreach (var g in contentType.CompositionPropertyGroups)
|
||||
{
|
||||
g.Id = id;
|
||||
id++;
|
||||
@@ -221,7 +256,7 @@ namespace Umbraco.Tests.Models.Mapping
|
||||
AssertDisplayProperty(invariantContent, p);
|
||||
}
|
||||
|
||||
Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count() - 1);
|
||||
Assert.AreEqual(contentType.CompositionPropertyGroups.Count(), invariantContent.Tabs.Count() - 1);
|
||||
Assert.IsTrue(invariantContent.Tabs.Any(x => x.Label == Current.Services.TextService.Localize("general/properties")));
|
||||
Assert.AreEqual(2, invariantContent.Tabs.Where(x => x.Label == Current.Services.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count());
|
||||
}
|
||||
|
||||
@@ -67,20 +67,7 @@ namespace Umbraco.Tests.Models
|
||||
Assert.AreEqual(clone.Id, member.Id);
|
||||
Assert.AreEqual(clone.VersionId, member.VersionId);
|
||||
Assert.AreEqual(clone.AdditionalData, member.AdditionalData);
|
||||
Assert.AreNotSame(clone.ContentType, member.ContentType);
|
||||
Assert.AreEqual(clone.ContentType, member.ContentType);
|
||||
Assert.AreEqual(clone.ContentType.PropertyGroups.Count, member.ContentType.PropertyGroups.Count);
|
||||
for (var index = 0; index < member.ContentType.PropertyGroups.Count; index++)
|
||||
{
|
||||
Assert.AreNotSame(clone.ContentType.PropertyGroups[index], member.ContentType.PropertyGroups[index]);
|
||||
Assert.AreEqual(clone.ContentType.PropertyGroups[index], member.ContentType.PropertyGroups[index]);
|
||||
}
|
||||
Assert.AreEqual(clone.ContentType.PropertyTypes.Count(), member.ContentType.PropertyTypes.Count());
|
||||
for (var index = 0; index < member.ContentType.PropertyTypes.Count(); index++)
|
||||
{
|
||||
Assert.AreNotSame(clone.ContentType.PropertyTypes.ElementAt(index), member.ContentType.PropertyTypes.ElementAt(index));
|
||||
Assert.AreEqual(clone.ContentType.PropertyTypes.ElementAt(index), member.ContentType.PropertyTypes.ElementAt(index));
|
||||
}
|
||||
Assert.AreEqual(clone.ContentTypeId, member.ContentTypeId);
|
||||
Assert.AreEqual(clone.CreateDate, member.CreateDate);
|
||||
Assert.AreEqual(clone.CreatorId, member.CreatorId);
|
||||
@@ -112,6 +99,9 @@ namespace Umbraco.Tests.Models
|
||||
Assert.AreEqual(clone.Properties[index], member.Properties[index]);
|
||||
}
|
||||
|
||||
// this can be the same, it is immutable
|
||||
Assert.AreSame(clone.ContentType, member.ContentType);
|
||||
|
||||
//This double verifies by reflection
|
||||
var allProps = clone.GetType().GetProperties();
|
||||
foreach (var propertyInfo in allProps)
|
||||
|
||||
@@ -227,6 +227,9 @@ namespace Umbraco.Tests.Models
|
||||
// now it will work
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
|
||||
// recreate content to re-capture content type variations
|
||||
content = new Content("content", -1, contentType) { Id = 1, VersionId = 1 };
|
||||
|
||||
// invariant name works
|
||||
content.Name = "name";
|
||||
Assert.AreEqual("name", content.GetCultureName(null));
|
||||
|
||||
@@ -130,10 +130,11 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
var hasPropertiesContentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage");
|
||||
ServiceContext.FileService.SaveTemplate(hasPropertiesContentType.DefaultTemplate); // else, FK violation on contentType!
|
||||
|
||||
contentTypeRepository.Save(hasPropertiesContentType);
|
||||
|
||||
IContent content1 = MockedContent.CreateSimpleContent(hasPropertiesContentType);
|
||||
|
||||
// save = create the initial version
|
||||
contentTypeRepository.Save(hasPropertiesContentType);
|
||||
repository.Save(content1);
|
||||
|
||||
versions.Add(content1.VersionId); // the first version
|
||||
@@ -399,9 +400,10 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
var repository = CreateRepository((IScopeAccessor)provider, out var contentTypeRepository);
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage2", "Textpage");
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType!
|
||||
contentTypeRepository.Save(contentType);
|
||||
|
||||
IContent textpage = MockedContent.CreateSimpleContent(contentType);
|
||||
|
||||
contentTypeRepository.Save(contentType);
|
||||
repository.Save(textpage);
|
||||
scope.Complete();
|
||||
|
||||
@@ -487,9 +489,10 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
var repository = CreateRepository((IScopeAccessor)provider, out var contentTypeRepository);
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage");
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType!
|
||||
contentTypeRepository.Save(contentType);
|
||||
|
||||
var textpage = MockedContent.CreateSimpleContent(contentType);
|
||||
|
||||
contentTypeRepository.Save(contentType);
|
||||
repository.Save(textpage);
|
||||
|
||||
|
||||
|
||||
@@ -61,8 +61,9 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
udb.EnableSqlCount = false;
|
||||
|
||||
var mediaType = MockedContentTypes.CreateSimpleMediaType("umbTextpage1", "Textpage");
|
||||
var media = MockedMedia.CreateSimpleMedia(mediaType, "hello", -1);
|
||||
mediaTypeRepository.Save(mediaType);
|
||||
|
||||
var media = MockedMedia.CreateSimpleMedia(mediaType, "hello", -1);
|
||||
repository.Save(media);
|
||||
|
||||
udb.EnableSqlCount = true;
|
||||
@@ -271,7 +272,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1);
|
||||
repository.Save(folder);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var types = new[] { 1031 };
|
||||
var query = scope.SqlContext.Query<IMedia>().Where(x => types.Contains(x.ContentTypeId));
|
||||
@@ -302,7 +303,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1);
|
||||
repository.Save(folder);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var types = new[] { "Folder" };
|
||||
var query = scope.SqlContext.Query<IMedia>().Where(x => types.Contains(x.ContentType.Alias));
|
||||
|
||||
@@ -164,21 +164,19 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
|
||||
var memberType = MockedContentTypes.CreateSimpleMemberType();
|
||||
memberTypeRepository.Save(memberType);
|
||||
|
||||
|
||||
var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "johnny@example.com", "123", "hefty");
|
||||
repository.Save(member);
|
||||
|
||||
|
||||
var sut = repository.Get(member.Id);
|
||||
|
||||
Assert.That(sut.ContentType.PropertyGroups.Count(), Is.EqualTo(2));
|
||||
Assert.That(sut.ContentType.PropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count));
|
||||
Assert.That(memberType.CompositionPropertyGroups.Count(), Is.EqualTo(2));
|
||||
Assert.That(memberType.CompositionPropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count));
|
||||
Assert.That(sut.Properties.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count));
|
||||
var grp = sut.PropertyGroups.FirstOrDefault(x => x.Name == Constants.Conventions.Member.StandardPropertiesGroupName);
|
||||
var grp = memberType.CompositionPropertyGroups.FirstOrDefault(x => x.Name == Constants.Conventions.Member.StandardPropertiesGroupName);
|
||||
Assert.IsNotNull(grp);
|
||||
var aliases = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray();
|
||||
foreach (var p in sut.PropertyTypes.Where(x => aliases.Contains(x.Alias)))
|
||||
foreach (var p in memberType.CompositionPropertyTypes.Where(x => aliases.Contains(x.Alias)))
|
||||
{
|
||||
Assert.AreEqual(grp.Id, p.PropertyGroupId.Value);
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
|
||||
// Act
|
||||
repository.Save(user);
|
||||
|
||||
|
||||
|
||||
// Assert
|
||||
Assert.That(user.HasIdentity, Is.True);
|
||||
@@ -96,9 +96,9 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
|
||||
// Act
|
||||
repository.Save(user1);
|
||||
|
||||
|
||||
repository.Save(use2);
|
||||
|
||||
|
||||
|
||||
// Assert
|
||||
Assert.That(user1.HasIdentity, Is.True);
|
||||
@@ -117,7 +117,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
|
||||
var user = MockedUser.CreateUser();
|
||||
repository.Save(user);
|
||||
|
||||
|
||||
|
||||
// Act
|
||||
var resolved = repository.Get((int)user.Id);
|
||||
@@ -132,9 +132,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_Update_On_UserRepository()
|
||||
{
|
||||
var ct = MockedContentTypes.CreateBasicContentType("test");
|
||||
var content = MockedContent.CreateBasicContent(ct);
|
||||
var mt = MockedContentTypes.CreateSimpleMediaType("testmedia", "TestMedia");
|
||||
var media = MockedMedia.CreateSimpleMedia(mt, "asdf", -1);
|
||||
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(Logger);
|
||||
@@ -147,11 +145,12 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
|
||||
contentTypeRepo.Save(ct);
|
||||
mediaTypeRepo.Save(mt);
|
||||
|
||||
|
||||
var content = MockedContent.CreateBasicContent(ct);
|
||||
var media = MockedMedia.CreateSimpleMedia(mt, "asdf", -1);
|
||||
|
||||
contentRepository.Save(content);
|
||||
mediaRepository.Save(media);
|
||||
|
||||
|
||||
var user = CreateAndCommitUserWithGroup(userRepository, userGroupRepository);
|
||||
|
||||
@@ -171,7 +170,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
resolved.Username = "newName";
|
||||
|
||||
userRepository.Save(resolved);
|
||||
|
||||
|
||||
var updatedItem = (User) userRepository.Get(user.Id);
|
||||
|
||||
// Assert
|
||||
@@ -204,13 +203,13 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
|
||||
// Act
|
||||
repository.Save(user);
|
||||
|
||||
|
||||
var id = user.Id;
|
||||
|
||||
var repository2 = new UserRepository((IScopeAccessor) provider, AppCaches.Disabled, Logger, Mock.Of<IMapperCollection>(),TestObjects.GetGlobalSettings());
|
||||
|
||||
repository2.Delete(user);
|
||||
|
||||
|
||||
|
||||
var resolved = repository2.Get((int) id);
|
||||
|
||||
@@ -373,7 +372,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
scope.Database.AsUmbracoDatabase().EnableSqlCount = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -429,7 +428,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
{
|
||||
var user = MockedUser.CreateUser();
|
||||
repository.Save(user);
|
||||
|
||||
|
||||
|
||||
var group = MockedUserGroup.CreateUserGroup();
|
||||
userGroupRepository.AddOrUpdateGroupWithUsers(@group, new[] { user.Id });
|
||||
|
||||
@@ -195,7 +195,7 @@ namespace Umbraco.Tests.PublishedContent
|
||||
[Test]
|
||||
public void PublishedContentQueryTypedContentList()
|
||||
{
|
||||
var query = new PublishedContentQuery(UmbracoContext.Current.ContentCache, UmbracoContext.Current.MediaCache, UmbracoContext.Current.VariationContextAccessor);
|
||||
var query = new PublishedContentQuery(UmbracoContext.Current.PublishedSnapshot, UmbracoContext.Current.VariationContextAccessor);
|
||||
var result = query.Content(new[] { 1, 2, 4 }).ToArray();
|
||||
Assert.AreEqual(2, result.Length);
|
||||
Assert.AreEqual(1, result[0].Id);
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace Umbraco.Tests.Services
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate);
|
||||
contentTypeService.Save(contentType);
|
||||
|
||||
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", -1);
|
||||
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", Constants.System.Root);
|
||||
blueprint.SetValue("title", "blueprint 1");
|
||||
blueprint.SetValue("bodyText", "blueprint 2");
|
||||
blueprint.SetValue("keywords", "blueprint 3");
|
||||
@@ -92,7 +92,7 @@ namespace Umbraco.Tests.Services
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate);
|
||||
contentTypeService.Save(contentType);
|
||||
|
||||
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", -1);
|
||||
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", Constants.System.Root);
|
||||
blueprint.SetValue("title", "blueprint 1");
|
||||
blueprint.SetValue("bodyText", "blueprint 2");
|
||||
blueprint.SetValue("keywords", "blueprint 3");
|
||||
@@ -118,7 +118,7 @@ namespace Umbraco.Tests.Services
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate);
|
||||
contentTypeService.Save(contentType);
|
||||
|
||||
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", -1);
|
||||
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", Constants.System.Root);
|
||||
blueprint.SetValue("title", "blueprint 1");
|
||||
blueprint.SetValue("bodyText", "blueprint 2");
|
||||
blueprint.SetValue("keywords", "blueprint 3");
|
||||
@@ -153,7 +153,7 @@ namespace Umbraco.Tests.Services
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
var blueprint = MockedContent.CreateTextpageContent(i % 2 == 0 ? ct1 : ct2, "hello" + i, -1);
|
||||
var blueprint = MockedContent.CreateTextpageContent(i % 2 == 0 ? ct1 : ct2, "hello" + i, Constants.System.Root);
|
||||
contentService.SaveBlueprint(blueprint);
|
||||
}
|
||||
|
||||
@@ -264,7 +264,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentService = ServiceContext.ContentService;
|
||||
|
||||
// Act
|
||||
var content = contentService.CreateAndSave("Test", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
var content = contentService.CreateAndSave("Test", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
|
||||
content.ContentSchedule.Add(null, DateTime.Now.AddHours(2));
|
||||
contentService.Save(content, Constants.Security.SuperUserId);
|
||||
@@ -292,7 +292,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentService = ServiceContext.ContentService;
|
||||
|
||||
// Act
|
||||
var content = contentService.CreateAndSave("Test", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
var content = contentService.CreateAndSave("Test", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
for (var i = 0; i < 20; i++)
|
||||
{
|
||||
content.SetValue("bodyText", "hello world " + Guid.NewGuid());
|
||||
@@ -317,7 +317,7 @@ namespace Umbraco.Tests.Services
|
||||
var results = new List<IContent>();
|
||||
for (var i = 0; i < 20; i++)
|
||||
{
|
||||
results.Add(contentService.CreateAndSave("Test", -1, "umbTextpage", 0));
|
||||
results.Add(contentService.CreateAndSave("Test", Constants.System.Root, "umbTextpage", 0));
|
||||
}
|
||||
|
||||
var sortedGet = contentService.GetByIds(new[] {results[10].Id, results[5].Id, results[12].Id}).ToArray();
|
||||
@@ -337,7 +337,7 @@ namespace Umbraco.Tests.Services
|
||||
// Act
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
contentService.CreateAndSave("Test", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
contentService.CreateAndSave("Test", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
}
|
||||
|
||||
// Assert
|
||||
@@ -356,7 +356,7 @@ namespace Umbraco.Tests.Services
|
||||
// Act
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
contentService.CreateAndSave("Test", -1, "umbBlah", Constants.Security.SuperUserId);
|
||||
contentService.CreateAndSave("Test", Constants.System.Root, "umbBlah", Constants.Security.SuperUserId);
|
||||
}
|
||||
|
||||
// Assert
|
||||
@@ -371,7 +371,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentTypeService = ServiceContext.ContentTypeService;
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType("umbBlah", "test Doc Type");
|
||||
contentTypeService.Save(contentType);
|
||||
var parent = contentService.CreateAndSave("Test", -1, "umbBlah", Constants.Security.SuperUserId);
|
||||
var parent = contentService.CreateAndSave("Test", Constants.System.Root, "umbBlah", Constants.Security.SuperUserId);
|
||||
|
||||
// Act
|
||||
for (int i = 0; i < 20; i++)
|
||||
@@ -391,7 +391,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentTypeService = ServiceContext.ContentTypeService;
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType("umbBlah", "test Doc Type");
|
||||
contentTypeService.Save(contentType);
|
||||
var parent = contentService.CreateAndSave("Test", -1, "umbBlah", Constants.Security.SuperUserId);
|
||||
var parent = contentService.CreateAndSave("Test", Constants.System.Root, "umbBlah", Constants.Security.SuperUserId);
|
||||
|
||||
// Act
|
||||
IContent current = parent;
|
||||
@@ -425,7 +425,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentService = ServiceContext.ContentService;
|
||||
|
||||
// Act
|
||||
var content = contentService.Create("Test", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
var content = contentService.Create("Test", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
|
||||
// Assert
|
||||
Assert.That(content, Is.Not.Null);
|
||||
@@ -439,7 +439,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentService = ServiceContext.ContentService;
|
||||
|
||||
// Act
|
||||
var content = contentService.Create("Test", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
var content = contentService.Create("Test", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
|
||||
// Assert
|
||||
Assert.That(content, Is.Not.Null);
|
||||
@@ -453,12 +453,12 @@ namespace Umbraco.Tests.Services
|
||||
var contentService = ServiceContext.ContentService;
|
||||
|
||||
// Act
|
||||
var content = contentService.Create("Test", -1, "umbTextpage");
|
||||
var content = contentService.Create("Test", Constants.System.Root, "umbTextpage");
|
||||
|
||||
// Assert
|
||||
Assert.That(content, Is.Not.Null);
|
||||
Assert.That(content.HasIdentity, Is.False);
|
||||
Assert.That(content.CreatorId, Is.EqualTo(0)); //Default to 0 (unknown) since we didn't explicitly set this in the Create call
|
||||
Assert.That(content.CreatorId, Is.EqualTo(Constants.Security.SuperUserId)); //Default to -1 aka SuperUser (unknown) since we didn't explicitly set this in the Create call
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -472,7 +472,7 @@ namespace Umbraco.Tests.Services
|
||||
RawPasswordValue = "test"
|
||||
};
|
||||
ServiceContext.UserService.Save(user);
|
||||
var content = new Content("Test", -1, ServiceContext.ContentTypeService.Get("umbTextpage"));
|
||||
var content = new Content("Test", Constants.System.Root, ServiceContext.ContentTypeService.Get("umbTextpage"));
|
||||
|
||||
// Act
|
||||
ServiceContext.ContentService.Save(content, (int)user.Id);
|
||||
@@ -489,7 +489,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentService = ServiceContext.ContentService;
|
||||
|
||||
// Act & Assert
|
||||
Assert.Throws<Exception>(() => contentService.Create("Test", -1, "umbAliasDoesntExist"));
|
||||
Assert.Throws<Exception>(() => contentService.Create("Test", Constants.System.Root, "umbAliasDoesntExist"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -497,7 +497,7 @@ namespace Umbraco.Tests.Services
|
||||
{
|
||||
// Arrange
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = new Content(string.Empty, -1, ServiceContext.ContentTypeService.Get("umbTextpage"));
|
||||
var content = new Content(string.Empty, Constants.System.Root, ServiceContext.ContentTypeService.Get("umbTextpage"));
|
||||
|
||||
// Act & Assert
|
||||
Assert.Throws<InvalidOperationException>(() => contentService.Save(content));
|
||||
@@ -727,7 +727,7 @@ namespace Umbraco.Tests.Services
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
|
||||
IContent content = new Content("content", -1, contentType);
|
||||
IContent content = new Content("content", Constants.System.Root, contentType);
|
||||
content.SetCultureName("content-fr", langFr.IsoCode);
|
||||
content.SetCultureName("content-en", langUk.IsoCode);
|
||||
content.PublishCulture(langFr.IsoCode);
|
||||
@@ -779,7 +779,7 @@ namespace Umbraco.Tests.Services
|
||||
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
|
||||
IContent content = new Content("content", -1, contentType);
|
||||
IContent content = new Content("content", Constants.System.Root, contentType);
|
||||
content.SetCultureName("content-en", langGB.IsoCode);
|
||||
content.SetCultureName("content-fr", langFr.IsoCode);
|
||||
|
||||
@@ -821,7 +821,7 @@ namespace Umbraco.Tests.Services
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
|
||||
IContent content = new Content("content", -1, contentType);
|
||||
IContent content = new Content("content", Constants.System.Root, contentType);
|
||||
content.SetCultureName("content-fr", langFr.IsoCode);
|
||||
var published = ServiceContext.ContentService.SaveAndPublish(content, langFr.IsoCode);
|
||||
//audit log will only show that french was published
|
||||
@@ -852,7 +852,7 @@ namespace Umbraco.Tests.Services
|
||||
contentType.Variations = ContentVariation.Culture;
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
|
||||
IContent content = new Content("content", -1, contentType);
|
||||
IContent content = new Content("content", Constants.System.Root, contentType);
|
||||
content.SetCultureName("content-fr", langFr.IsoCode);
|
||||
content.SetCultureName("content-gb", langGB.IsoCode);
|
||||
var published = ServiceContext.ContentService.SaveAndPublish(content, new[] {langGB.IsoCode, langFr.IsoCode});
|
||||
@@ -910,7 +910,7 @@ namespace Umbraco.Tests.Services
|
||||
{
|
||||
// Arrange
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var parent = contentService.Create("parent", -1, "umbTextpage");
|
||||
var parent = contentService.Create("parent", Constants.System.Root, "umbTextpage");
|
||||
|
||||
contentService.SaveAndPublish(parent);
|
||||
var content = contentService.Create("child", parent, "umbTextpage");
|
||||
@@ -1235,7 +1235,7 @@ namespace Umbraco.Tests.Services
|
||||
{
|
||||
// Arrange
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = contentService.Create("Home US", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
var content = contentService.Create("Home US", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
content.SetValue("author", "Barack Obama");
|
||||
|
||||
// Act
|
||||
@@ -1574,7 +1574,7 @@ namespace Umbraco.Tests.Services
|
||||
|
||||
var contentType = MockedContentTypes.CreateAllTypesContentType("test", "test");
|
||||
ServiceContext.ContentTypeService.Save(contentType, Constants.Security.SuperUserId);
|
||||
|
||||
|
||||
object obj =
|
||||
new
|
||||
{
|
||||
@@ -1730,7 +1730,7 @@ namespace Umbraco.Tests.Services
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType!
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
|
||||
var content = MockedContent.CreateSimpleContent(contentType, "Simple Tags Page", -1);
|
||||
var content = MockedContent.CreateSimpleContent(contentType, "Simple Tags Page", Constants.System.Root);
|
||||
content.AssignTags(propAlias, new[] {"hello", "world"});
|
||||
contentService.Save(content);
|
||||
|
||||
@@ -1906,7 +1906,7 @@ namespace Umbraco.Tests.Services
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType!
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
|
||||
var page = new Content("Page", -1, contentType)
|
||||
var page = new Content("Page", Constants.System.Root, contentType)
|
||||
{
|
||||
Level = 1,
|
||||
SortOrder = 1,
|
||||
@@ -2133,7 +2133,7 @@ namespace Umbraco.Tests.Services
|
||||
var contentType = MockedContentTypes.CreateAllTypesContentType("allDataTypes", "All DataTypes");
|
||||
contentTypeService.Save(contentType);
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = MockedContent.CreateAllTypesContent(contentType, "Random Content", -1);
|
||||
var content = MockedContent.CreateAllTypesContent(contentType, "Random Content", Constants.System.Root);
|
||||
contentService.Save(content);
|
||||
var id = content.Id;
|
||||
|
||||
@@ -2186,7 +2186,7 @@ namespace Umbraco.Tests.Services
|
||||
public void Ensure_Content_Xml_Created()
|
||||
{
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = contentService.Create("Home US", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
var content = contentService.Create("Home US", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
content.SetValue("author", "Barack Obama");
|
||||
|
||||
contentService.Save(content);
|
||||
@@ -2208,7 +2208,7 @@ namespace Umbraco.Tests.Services
|
||||
public void Ensure_Preview_Xml_Created()
|
||||
{
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = contentService.Create("Home US", -1, "umbTextpage", Constants.Security.SuperUserId);
|
||||
var content = contentService.Create("Home US", Constants.System.Root, "umbTextpage", Constants.Security.SuperUserId);
|
||||
content.SetValue("author", "Barack Obama");
|
||||
|
||||
contentService.Save(content);
|
||||
@@ -2236,10 +2236,10 @@ namespace Umbraco.Tests.Services
|
||||
}
|
||||
|
||||
long total;
|
||||
var entities = service.GetPagedChildren(-1, 0, 6, out total).ToArray();
|
||||
var entities = service.GetPagedChildren(Constants.System.Root, 0, 6, out total).ToArray();
|
||||
Assert.That(entities.Length, Is.EqualTo(6));
|
||||
Assert.That(total, Is.EqualTo(10));
|
||||
entities = service.GetPagedChildren(-1, 1, 6, out total).ToArray();
|
||||
entities = service.GetPagedChildren(Constants.System.Root, 1, 6, out total).ToArray();
|
||||
Assert.That(entities.Length, Is.EqualTo(4));
|
||||
Assert.That(total, Is.EqualTo(10));
|
||||
}
|
||||
@@ -2271,10 +2271,10 @@ namespace Umbraco.Tests.Services
|
||||
|
||||
long total;
|
||||
// children in root including the folder - not the descendants in the folder
|
||||
var entities = service.GetPagedChildren(-1, 0, 6, out total).ToArray();
|
||||
var entities = service.GetPagedChildren(Constants.System.Root, 0, 6, out total).ToArray();
|
||||
Assert.That(entities.Length, Is.EqualTo(6));
|
||||
Assert.That(total, Is.EqualTo(10));
|
||||
entities = service.GetPagedChildren(-1, 1, 6, out total).ToArray();
|
||||
entities = service.GetPagedChildren(Constants.System.Root, 1, 6, out total).ToArray();
|
||||
Assert.That(entities.Length, Is.EqualTo(4));
|
||||
Assert.That(total, Is.EqualTo(10));
|
||||
|
||||
@@ -2290,7 +2290,7 @@ namespace Umbraco.Tests.Services
|
||||
[Test]
|
||||
public void PublishingTest()
|
||||
{
|
||||
var contentType = new ContentType(-1)
|
||||
var contentType = new ContentType(Constants.System.Root)
|
||||
{
|
||||
Alias = "foo",
|
||||
Name = "Foo"
|
||||
@@ -2308,7 +2308,7 @@ namespace Umbraco.Tests.Services
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = contentService.Create("foo", -1, "foo");
|
||||
var content = contentService.Create("foo", Constants.System.Root, "foo");
|
||||
contentService.Save(content);
|
||||
|
||||
Assert.IsFalse(content.Published);
|
||||
@@ -2436,7 +2436,7 @@ namespace Umbraco.Tests.Services
|
||||
contentTypeService.Save(contentType);
|
||||
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = new Content(null, -1, contentType);
|
||||
var content = new Content(null, Constants.System.Root, contentType);
|
||||
|
||||
content.SetCultureName("name-us", langUk.IsoCode);
|
||||
content.SetCultureName("name-fr", langFr.IsoCode);
|
||||
@@ -2471,7 +2471,7 @@ namespace Umbraco.Tests.Services
|
||||
|
||||
var contentService = ServiceContext.ContentService;
|
||||
|
||||
var content = new Content(null, -1, contentType);
|
||||
var content = new Content(null, Constants.System.Root, contentType);
|
||||
content.SetCultureName("root", langUk.IsoCode);
|
||||
contentService.Save(content);
|
||||
|
||||
@@ -2513,13 +2513,13 @@ namespace Umbraco.Tests.Services
|
||||
var o = new[] { 2, 1, 3, 0, 4 }; // randomly different
|
||||
for (var i = 0; i < 5; i++)
|
||||
{
|
||||
var contentA = new Content(null, -1, contentType);
|
||||
var contentA = new Content(null, Constants.System.Root, contentType);
|
||||
contentA.SetCultureName("contentA" + i + "uk", langUk.IsoCode);
|
||||
contentA.SetCultureName("contentA" + o[i] + "fr", langFr.IsoCode);
|
||||
contentA.SetCultureName("contentX" + i + "da", langDa.IsoCode);
|
||||
contentService.Save(contentA);
|
||||
|
||||
var contentB = new Content(null, -1, contentType);
|
||||
var contentB = new Content(null, Constants.System.Root, contentType);
|
||||
contentB.SetCultureName("contentB" + i + "uk", langUk.IsoCode);
|
||||
contentB.SetCultureName("contentB" + o[i] + "fr", langFr.IsoCode);
|
||||
contentB.SetCultureName("contentX" + i + "da", langDa.IsoCode);
|
||||
@@ -2527,7 +2527,7 @@ namespace Umbraco.Tests.Services
|
||||
}
|
||||
|
||||
// get all
|
||||
var list = contentService.GetPagedChildren(-1, 0, 100, out var total).ToList();
|
||||
var list = contentService.GetPagedChildren(Constants.System.Root, 0, 100, out var total).ToList();
|
||||
|
||||
Console.WriteLine("ALL");
|
||||
WriteList(list);
|
||||
@@ -2537,7 +2537,7 @@ namespace Umbraco.Tests.Services
|
||||
Assert.AreEqual(11, list.Count);
|
||||
|
||||
// filter
|
||||
list = contentService.GetPagedChildren(-1, 0, 100, out total,
|
||||
list = contentService.GetPagedChildren(Constants.System.Root, 0, 100, out total,
|
||||
SqlContext.Query<IContent>().Where(x => x.Name.Contains("contentX")),
|
||||
Ordering.By("name", culture: langFr.IsoCode)).ToList();
|
||||
|
||||
@@ -2545,7 +2545,7 @@ namespace Umbraco.Tests.Services
|
||||
Assert.AreEqual(0, list.Count);
|
||||
|
||||
// filter
|
||||
list = contentService.GetPagedChildren(-1, 0, 100, out total,
|
||||
list = contentService.GetPagedChildren(Constants.System.Root, 0, 100, out total,
|
||||
SqlContext.Query<IContent>().Where(x => x.Name.Contains("contentX")),
|
||||
Ordering.By("name", culture: langDa.IsoCode)).ToList();
|
||||
|
||||
@@ -2556,7 +2556,7 @@ namespace Umbraco.Tests.Services
|
||||
Assert.AreEqual(10, list.Count);
|
||||
|
||||
// filter
|
||||
list = contentService.GetPagedChildren(-1, 0, 100, out total,
|
||||
list = contentService.GetPagedChildren(Constants.System.Root, 0, 100, out total,
|
||||
SqlContext.Query<IContent>().Where(x => x.Name.Contains("contentA")),
|
||||
Ordering.By("name", culture: langFr.IsoCode)).ToList();
|
||||
|
||||
@@ -2569,7 +2569,7 @@ namespace Umbraco.Tests.Services
|
||||
for (var i = 0; i < 5; i++)
|
||||
Assert.AreEqual("contentA" + i + "fr", list[i].GetCultureName(langFr.IsoCode));
|
||||
|
||||
list = contentService.GetPagedChildren(-1, 0, 100, out total,
|
||||
list = contentService.GetPagedChildren(Constants.System.Root, 0, 100, out total,
|
||||
SqlContext.Query<IContent>().Where(x => x.Name.Contains("contentA")),
|
||||
Ordering.By("name", direction: Direction.Descending, culture: langFr.IsoCode)).ToList();
|
||||
|
||||
@@ -2614,7 +2614,7 @@ namespace Umbraco.Tests.Services
|
||||
contentTypeService.Save(contentType);
|
||||
|
||||
var contentService = ServiceContext.ContentService;
|
||||
var content = contentService.Create("Home US", -1, "umbTextpage");
|
||||
var content = contentService.Create("Home US", Constants.System.Root, "umbTextpage");
|
||||
|
||||
// creating content with a name but no culture - will set the invariant name
|
||||
// but, because that content is variant, as soon as we save, we'll need to
|
||||
|
||||
@@ -554,7 +554,6 @@ namespace Umbraco.Tests.Services
|
||||
IContent contentItem = MockedContent.CreateTextpageContent(contentType1, "Testing", -1);
|
||||
ServiceContext.ContentService.SaveAndPublish(contentItem);
|
||||
var initProps = contentItem.Properties.Count;
|
||||
var initPropTypes = contentItem.PropertyTypes.Count();
|
||||
|
||||
//remove a property
|
||||
contentType1.RemovePropertyType(contentType1.PropertyTypes.First().Alias);
|
||||
@@ -563,7 +562,6 @@ namespace Umbraco.Tests.Services
|
||||
//re-load it from the db
|
||||
contentItem = ServiceContext.ContentService.GetById(contentItem.Id);
|
||||
|
||||
Assert.AreEqual(initPropTypes - 1, contentItem.PropertyTypes.Count());
|
||||
Assert.AreEqual(initProps - 1, contentItem.Properties.Count);
|
||||
}
|
||||
|
||||
|
||||
@@ -83,7 +83,6 @@ namespace Umbraco.Tests.Services
|
||||
IMember member = MockedMember.CreateSimpleMember(memberType, "test", "test@test.com", "pass", "test");
|
||||
ServiceContext.MemberService.Save(member);
|
||||
var initProps = member.Properties.Count;
|
||||
var initPropTypes = member.PropertyTypes.Count();
|
||||
|
||||
//remove a property (NOT ONE OF THE DEFAULTS)
|
||||
var standardProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs();
|
||||
@@ -93,7 +92,6 @@ namespace Umbraco.Tests.Services
|
||||
//re-load it from the db
|
||||
member = ServiceContext.MemberService.GetById(member.Id);
|
||||
|
||||
Assert.AreEqual(initPropTypes - 1, member.PropertyTypes.Count());
|
||||
Assert.AreEqual(initProps - 1, member.Properties.Count);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,15 +33,20 @@ namespace Umbraco.Tests.TestHelpers.Stubs
|
||||
{
|
||||
if (_enabled == false) return;
|
||||
|
||||
MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter();
|
||||
MiniProfiler.Settings.StackMaxLength = 5000;
|
||||
MiniProfiler.Start();
|
||||
//see https://miniprofiler.com/dotnet/AspDotNet
|
||||
MiniProfiler.Configure(new MiniProfilerOptions
|
||||
{
|
||||
SqlFormatter = new SqlServerFormatter(),
|
||||
StackMaxLength = 5000,
|
||||
});
|
||||
|
||||
MiniProfiler.StartNew();
|
||||
}
|
||||
|
||||
public void Stop(bool discardResults = false)
|
||||
{
|
||||
if (_enabled)
|
||||
MiniProfiler.Stop(discardResults);
|
||||
MiniProfiler.Current.Stop(discardResults);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Services;
|
||||
|
||||
namespace Umbraco.Tests.Testing
|
||||
{
|
||||
public static class ContentBaseExtensions
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Set property values by alias with an annonymous object.
|
||||
/// Set property values by alias with an anonymous object.
|
||||
/// </summary>
|
||||
/// <remarks>Does not support variants.</remarks>
|
||||
public static void PropertyValues(this IContentBase content, object value, string culture = null, string segment = null)
|
||||
@@ -18,26 +22,12 @@ namespace Umbraco.Tests.Testing
|
||||
var propertyInfos = value.GetType().GetProperties();
|
||||
foreach (var propertyInfo in propertyInfos)
|
||||
{
|
||||
//Check if a PropertyType with alias exists thus being a valid property
|
||||
var propertyType = content.PropertyTypes.FirstOrDefault(x => x.Alias == propertyInfo.Name);
|
||||
if (propertyType == null)
|
||||
if (!content.Properties.TryGetValue(propertyInfo.Name, out var property))
|
||||
throw new Exception($"The property alias {propertyInfo.Name} is not valid, because no PropertyType with this alias exists");
|
||||
|
||||
//Check if a Property with the alias already exists in the collection thus being updated or inserted
|
||||
var item = content.Properties.FirstOrDefault(x => x.Alias == propertyInfo.Name);
|
||||
if (item != null)
|
||||
{
|
||||
item.SetValue(propertyInfo.GetValue(value, null), culture, segment);
|
||||
//Update item with newly added value
|
||||
content.Properties.Add(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Create new Property to add to collection
|
||||
var property = propertyType.CreateProperty();
|
||||
property.SetValue(propertyInfo.GetValue(value, null), culture, segment);
|
||||
content.Properties.Add(property);
|
||||
}
|
||||
property.SetValue(propertyInfo.GetValue(value, null), culture, segment);
|
||||
//Update item with newly added value
|
||||
content.Properties.Add(property);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,40 +78,39 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AutoMapper" Version="7.0.1" />
|
||||
<PackageReference Include="Castle.Core" Version="4.2.1" />
|
||||
<PackageReference Include="AutoMapper" Version="8.0.0" />
|
||||
<PackageReference Include="Castle.Core" Version="4.3.1" />
|
||||
<PackageReference Include="Examine" Version="1.0.0-beta078" />
|
||||
<PackageReference Include="HtmlAgilityPack">
|
||||
<Version>1.8.9</Version>
|
||||
<Version>1.8.14</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="LightInject" Version="5.1.2" />
|
||||
<PackageReference Include="LightInject" Version="5.4.0" />
|
||||
<PackageReference Include="LightInject.Annotation" Version="1.1.0" />
|
||||
<PackageReference Include="Lucene.Net" Version="3.0.3" />
|
||||
<PackageReference Include="Lucene.Net.Contrib" Version="3.0.3" />
|
||||
<PackageReference Include="Microsoft.AspNet.Identity.Core" Version="2.2.2" />
|
||||
<PackageReference Include="Microsoft.AspNet.Mvc" Version="5.2.6" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi" Version="5.2.6" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.6" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.Owin" Version="5.2.6" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.SelfHost" Version="5.2.6" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.WebHost" Version="5.2.6" />
|
||||
<PackageReference Include="Microsoft.Owin" Version="4.0.0" />
|
||||
<PackageReference Include="Microsoft.Owin.Hosting" Version="4.0.0" />
|
||||
<PackageReference Include="Microsoft.Owin.Security" Version="4.0.0" />
|
||||
<PackageReference Include="Microsoft.Owin.Testing" Version="4.0.0" />
|
||||
<PackageReference Include="Microsoft.AspNet.Mvc" Version="5.2.7" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi" Version="5.2.7" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.Owin" Version="5.2.7" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.SelfHost" Version="5.2.7" />
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.WebHost" Version="5.2.7" />
|
||||
<PackageReference Include="Microsoft.Owin" Version="4.0.1" />
|
||||
<PackageReference Include="Microsoft.Owin.Hosting" Version="4.0.1" />
|
||||
<PackageReference Include="Microsoft.Owin.Security" Version="4.0.1" />
|
||||
<PackageReference Include="Microsoft.Owin.Testing" Version="4.0.1" />
|
||||
<PackageReference Include="Microsoft.Web.Infrastructure" Version="1.0.0.0" />
|
||||
<PackageReference Include="MiniProfiler" Version="3.2.0.157" />
|
||||
<PackageReference Include="Moq" Version="4.8.2" />
|
||||
<PackageReference Include="MiniProfiler" Version="4.0.138" />
|
||||
<PackageReference Include="Moq" Version="4.10.1" />
|
||||
<PackageReference Include="NPoco" Version="3.9.4" />
|
||||
<PackageReference Include="NUnit" Version="3.10.1" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
||||
<PackageReference Include="NUnit" Version="3.11.0" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="3.12.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
||||
<PackageReference Include="Owin" Version="1.0" />
|
||||
<PackageReference Include="Selenium.WebDriver" Version="3.11.0" />
|
||||
<PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
|
||||
<PackageReference Include="Semver" Version="2.0.4" />
|
||||
<PackageReference Include="SharpZipLib" Version="0.86.0" />
|
||||
<PackageReference Include="Umbraco.SqlServerCE" Version="4.0.0.1" />
|
||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.4.0" />
|
||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.2" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Cache\DistributedCacheBinderTests.cs" />
|
||||
|
||||
@@ -110,7 +110,7 @@ namespace Umbraco.Tests.UmbracoExamine
|
||||
m.GetCultureName(It.IsAny<string>()) == (string)x.Attribute("nodeName") &&
|
||||
m.Path == (string)x.Attribute("path") &&
|
||||
m.Properties == new PropertyCollection() &&
|
||||
m.ContentType == Mock.Of<IMediaType>(mt =>
|
||||
m.ContentType == Mock.Of<ISimpleContentType>(mt =>
|
||||
mt.Alias == (string)x.Attribute("nodeTypeAlias") &&
|
||||
mt.Id == (int)x.Attribute("nodeType"))))
|
||||
.ToArray();
|
||||
|
||||
@@ -43,6 +43,14 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
[UmbracoTest(Database = UmbracoTestOptions.Database.None)]
|
||||
public class ContentControllerTests : TestWithDatabaseBase
|
||||
{
|
||||
private IContentType _contentTypeForMockedContent;
|
||||
|
||||
public override void SetUp()
|
||||
{
|
||||
base.SetUp();
|
||||
_contentTypeForMockedContent = null;
|
||||
}
|
||||
|
||||
protected override void ComposeApplication(bool withApplication)
|
||||
{
|
||||
base.ComposeApplication(withApplication);
|
||||
@@ -115,23 +123,42 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
};
|
||||
}
|
||||
|
||||
private IContent GetMockedContent()
|
||||
private IContentType GetMockedContentType()
|
||||
{
|
||||
var content = MockedContent.CreateSimpleContent(MockedContentTypes.CreateSimpleContentType());
|
||||
content.Id = 123;
|
||||
content.Path = "-1,123";
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType();
|
||||
//ensure things have ids
|
||||
var ids = 888;
|
||||
foreach (var g in content.PropertyGroups)
|
||||
foreach (var g in contentType.CompositionPropertyGroups)
|
||||
{
|
||||
g.Id = ids;
|
||||
ids++;
|
||||
}
|
||||
foreach (var p in content.PropertyTypes)
|
||||
foreach (var p in contentType.CompositionPropertyGroups)
|
||||
{
|
||||
p.Id = ids;
|
||||
ids++;
|
||||
}
|
||||
|
||||
return contentType;
|
||||
}
|
||||
|
||||
private IContent GetMockedContent()
|
||||
{
|
||||
if (_contentTypeForMockedContent == null)
|
||||
{
|
||||
_contentTypeForMockedContent = GetMockedContentType();
|
||||
Mock.Get(Current.Services.ContentTypeService)
|
||||
.Setup(x => x.Get(_contentTypeForMockedContent.Id))
|
||||
.Returns(_contentTypeForMockedContent);
|
||||
Mock.Get(Current.Services.ContentTypeService)
|
||||
.As<IContentTypeBaseService>()
|
||||
.Setup(x => x.Get(_contentTypeForMockedContent.Id))
|
||||
.Returns(_contentTypeForMockedContent);
|
||||
}
|
||||
|
||||
var content = MockedContent.CreateSimpleContent(_contentTypeForMockedContent);
|
||||
content.Id = 123;
|
||||
content.Path = "-1,123";
|
||||
return content;
|
||||
}
|
||||
|
||||
@@ -229,7 +256,7 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
Factory.GetInstance<IProfilingLogger>(),
|
||||
Factory.GetInstance<IRuntimeState>(),
|
||||
helper);
|
||||
|
||||
|
||||
return controller;
|
||||
}
|
||||
|
||||
@@ -251,9 +278,6 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
{
|
||||
ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper)
|
||||
{
|
||||
var contentServiceMock = Mock.Get(Current.Services.ContentService);
|
||||
contentServiceMock.Setup(x => x.GetById(123)).Returns(() => GetMockedContent());
|
||||
|
||||
var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty<DataEditor>()));
|
||||
var controller = new ContentController(
|
||||
propertyEditorCollection,
|
||||
@@ -336,15 +360,11 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
|
||||
ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper)
|
||||
{
|
||||
|
||||
var contentServiceMock = Mock.Get(Current.Services.ContentService);
|
||||
contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content);
|
||||
contentServiceMock.Setup(x => x.Save(It.IsAny<IContent>(), It.IsAny<int>(), It.IsAny<bool>()))
|
||||
.Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success
|
||||
|
||||
var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService);
|
||||
contentTypeServiceMock.Setup(x => x.Get(content.ContentTypeId)).Returns(() => MockedContentTypes.CreateSimpleContentType());
|
||||
|
||||
var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty<DataEditor>()));
|
||||
var controller = new ContentController(
|
||||
propertyEditorCollection,
|
||||
@@ -369,8 +389,6 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
Assert.AreEqual(HttpStatusCode.OK, response.Item1.StatusCode);
|
||||
var display = JsonConvert.DeserializeObject<ContentItemDisplay>(response.Item2);
|
||||
Assert.AreEqual(1, display.Variants.Count());
|
||||
Assert.AreEqual(content.PropertyGroups.Count(), display.Variants.ElementAt(0).Tabs.Count());
|
||||
Assert.AreEqual(content.PropertyTypes.Count(), display.Variants.ElementAt(0).Tabs.ElementAt(0).Properties.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -380,15 +398,11 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
|
||||
ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper)
|
||||
{
|
||||
|
||||
var contentServiceMock = Mock.Get(Current.Services.ContentService);
|
||||
contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content);
|
||||
contentServiceMock.Setup(x => x.Save(It.IsAny<IContent>(), It.IsAny<int>(), It.IsAny<bool>()))
|
||||
.Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success
|
||||
|
||||
var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService);
|
||||
contentTypeServiceMock.Setup(x => x.Get(content.ContentTypeId)).Returns(() => MockedContentTypes.CreateSimpleContentType());
|
||||
|
||||
var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty<DataEditor>()));
|
||||
var controller = new ContentController(
|
||||
propertyEditorCollection,
|
||||
@@ -428,15 +442,11 @@ namespace Umbraco.Tests.Web.Controllers
|
||||
|
||||
ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper)
|
||||
{
|
||||
|
||||
var contentServiceMock = Mock.Get(Current.Services.ContentService);
|
||||
contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content);
|
||||
contentServiceMock.Setup(x => x.Save(It.IsAny<IContent>(), It.IsAny<int>(), It.IsAny<bool>()))
|
||||
.Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success
|
||||
|
||||
var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService);
|
||||
contentTypeServiceMock.Setup(x => x.Get(content.ContentTypeId)).Returns(() => MockedContentTypes.CreateSimpleContentType());
|
||||
|
||||
var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty<DataEditor>()));
|
||||
var controller = new ContentController(
|
||||
propertyEditorCollection,
|
||||
|
||||
@@ -6,5 +6,5 @@ var runSequence = require('run-sequence');
|
||||
|
||||
// Build - build the files ready for production
|
||||
gulp.task('build', function(cb) {
|
||||
runSequence(["dependencies", "js", "less", "views"], cb);
|
||||
runSequence(["js", "dependencies", "less", "views"], /*"test:unit",*/ cb);
|
||||
});
|
||||
|
||||
@@ -11,7 +11,7 @@ var runSequence = require('run-sequence');
|
||||
|
||||
// Karma test
|
||||
gulp.task('runTests', function(cb) {
|
||||
runSequence(["js"], "test:unit", cb);
|
||||
runSequence("js", "test:unit", cb);
|
||||
});
|
||||
|
||||
gulp.task('test:unit', function () {
|
||||
|
||||
+337
-129
File diff suppressed because it is too large
Load Diff
-5
@@ -105,11 +105,6 @@ function sectionsDirective($timeout, $window, navigationService, treeService, se
|
||||
return;
|
||||
}
|
||||
|
||||
if (scope.userDialog) {
|
||||
closeUserDialog();
|
||||
}
|
||||
|
||||
|
||||
navigationService.hideSearch();
|
||||
navigationService.showTree(section.alias);
|
||||
|
||||
|
||||
@@ -871,6 +871,8 @@
|
||||
|
||||
$scope.app = app;
|
||||
|
||||
$scope.$broadcast("editors.apps.appChanged", { app: app });
|
||||
|
||||
if (infiniteMode) {
|
||||
createInfiniteModeButtons($scope.content);
|
||||
} else {
|
||||
@@ -878,6 +880,15 @@
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Call back when a content app changes
|
||||
* @param {any} app
|
||||
*/
|
||||
$scope.appAnchorChanged = function (app, anchor) {
|
||||
//send an event downwards
|
||||
$scope.$broadcast("editors.apps.appAnchorChanged", { app: app, anchor: anchor });
|
||||
};
|
||||
|
||||
// methods for infinite editing
|
||||
$scope.close = function () {
|
||||
if ($scope.infiniteModel.close) {
|
||||
|
||||
+11
-15
@@ -3,7 +3,7 @@
|
||||
|
||||
function ContentNodeInfoDirective($timeout, logResource, eventsService, userService, localizationService, dateHelper, editorService, redirectUrlsResource, overlayService) {
|
||||
|
||||
function link(scope, umbVariantContentCtrl) {
|
||||
function link(scope) {
|
||||
|
||||
var evts = [];
|
||||
var isInfoTab = false;
|
||||
@@ -96,22 +96,17 @@
|
||||
scope.previewOpenUrl = '#/settings/documenttypes/edit/' + scope.documentType.id;
|
||||
}
|
||||
|
||||
//load in the audit trail if we are currently looking at the INFO tab
|
||||
if (umbVariantContentCtrl && umbVariantContentCtrl.editor) {
|
||||
var activeApp = _.find(umbVariantContentCtrl.editor.content.apps, a => a.active);
|
||||
if (activeApp && activeApp.alias === "umbInfo") {
|
||||
isInfoTab = true;
|
||||
loadAuditTrail();
|
||||
loadRedirectUrls();
|
||||
}
|
||||
var activeApp = _.find(scope.node.apps, (a) => a.active);
|
||||
if (activeApp.alias === "umbInfo") {
|
||||
loadRedirectUrls();
|
||||
loadAuditTrail();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
scope.auditTrailPageChange = function (pageNumber) {
|
||||
scope.auditTrailOptions.pageNumber = pageNumber;
|
||||
auditTrailLoaded = false;
|
||||
loadAuditTrail();
|
||||
loadAuditTrail(true);
|
||||
};
|
||||
|
||||
scope.openDocumentType = function (documentType) {
|
||||
@@ -192,10 +187,12 @@
|
||||
editorService.rollback(rollback);
|
||||
};
|
||||
|
||||
function loadAuditTrail() {
|
||||
function loadAuditTrail(forceReload) {
|
||||
|
||||
//don't load this if it's already done
|
||||
if (auditTrailLoaded) { return; };
|
||||
if (auditTrailLoaded && !forceReload) {
|
||||
return;
|
||||
}
|
||||
|
||||
scope.loadingAuditTrail = true;
|
||||
|
||||
@@ -334,8 +331,7 @@
|
||||
if (newValue === oldValue) { return; }
|
||||
|
||||
if (isInfoTab) {
|
||||
auditTrailLoaded = false;
|
||||
loadAuditTrail();
|
||||
loadAuditTrail(true);
|
||||
loadRedirectUrls();
|
||||
setNodePublishStatus();
|
||||
updateCurrentUrls();
|
||||
|
||||
+142
-29
@@ -2,40 +2,153 @@
|
||||
'use strict';
|
||||
|
||||
/** This directive is used to render out the current variant tabs and properties and exposes an API for other directives to consume */
|
||||
function tabbedContentDirective() {
|
||||
function tabbedContentDirective($timeout) {
|
||||
|
||||
function link($scope, $element, $attrs) {
|
||||
|
||||
var appRootNode = $element[0];
|
||||
|
||||
// Directive for cached property groups.
|
||||
var propertyGroupNodesDictionary = {};
|
||||
|
||||
var scrollableNode = appRootNode.closest(".umb-scrollable");
|
||||
scrollableNode.addEventListener("scroll", onScroll);
|
||||
scrollableNode.addEventListener("mousewheel", cancelScrollTween);
|
||||
|
||||
function onScroll(event) {
|
||||
|
||||
var viewFocusY = scrollableNode.scrollTop + scrollableNode.clientHeight * .5;
|
||||
|
||||
for(var i in $scope.content.tabs) {
|
||||
var group = $scope.content.tabs[i];
|
||||
var node = propertyGroupNodesDictionary[group.id];
|
||||
if (viewFocusY >= node.offsetTop && viewFocusY <= node.offsetTop + node.clientHeight) {
|
||||
setActiveAnchor(group);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function setActiveAnchor(tab) {
|
||||
if (tab.active !== true) {
|
||||
var i = $scope.content.tabs.length;
|
||||
while(i--) {
|
||||
$scope.content.tabs[i].active = false;
|
||||
}
|
||||
tab.active = true;
|
||||
}
|
||||
}
|
||||
function getActiveAnchor() {
|
||||
var i = $scope.content.tabs.length;
|
||||
while(i--) {
|
||||
if ($scope.content.tabs[i].active === true)
|
||||
return $scope.content.tabs[i];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function getScrollPositionFor(id) {
|
||||
if (propertyGroupNodesDictionary[id]) {
|
||||
return propertyGroupNodesDictionary[id].offsetTop - 20;// currently only relative to closest relatively positioned parent
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function scrollTo(id) {
|
||||
var y = getScrollPositionFor(id);
|
||||
if (getScrollPositionFor !== null) {
|
||||
|
||||
var viewportHeight = scrollableNode.clientHeight;
|
||||
var from = scrollableNode.scrollTop;
|
||||
var to = Math.min(y, scrollableNode.scrollHeight - viewportHeight);
|
||||
|
||||
var animeObject = {_y: from};
|
||||
$scope.scrollTween = anime({
|
||||
targets: animeObject,
|
||||
_y: to,
|
||||
easing: 'easeOutExpo',
|
||||
duration: 200 + Math.min(Math.abs(to-from)/viewportHeight*100, 400),
|
||||
update: () => {
|
||||
scrollableNode.scrollTo(0, animeObject._y);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
function jumpTo(id) {
|
||||
var y = getScrollPositionFor(id);
|
||||
if (getScrollPositionFor !== null) {
|
||||
cancelScrollTween();
|
||||
scrollableNode.scrollTo(0, y);
|
||||
}
|
||||
}
|
||||
function cancelScrollTween() {
|
||||
if($scope.scrollTween) {
|
||||
$scope.scrollTween.pause();
|
||||
}
|
||||
}
|
||||
|
||||
$scope.registerPropertyGroup = function(element, appAnchor) {
|
||||
propertyGroupNodesDictionary[appAnchor] = element;
|
||||
};
|
||||
|
||||
$scope.$on("editors.apps.appChanged", function($event, $args) {
|
||||
// if app changed to this app, then we want to scroll to the current anchor
|
||||
if($args.app.alias === "umbContent") {
|
||||
var activeAnchor = getActiveAnchor();
|
||||
$timeout(jumpTo.bind(null, [activeAnchor.id]));
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$on("editors.apps.appAnchorChanged", function($event, $args) {
|
||||
if($args.app.alias === "umbContent") {
|
||||
setActiveAnchor($args.anchor);
|
||||
scrollTo($args.anchor.id);
|
||||
}
|
||||
});
|
||||
|
||||
//ensure to unregister from all dom-events
|
||||
$scope.$on('$destroy', function () {
|
||||
cancelScrollTween();
|
||||
scrollableNode.removeEventListener("scroll", onScroll);
|
||||
scrollableNode.removeEventListener("mousewheel", cancelScrollTween);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function controller($scope, $element, $attrs) {
|
||||
|
||||
|
||||
//expose the property/methods for other directives to use
|
||||
this.content = $scope.content;
|
||||
this.activeVariant = _.find(this.content.variants, variant => {
|
||||
return variant.active;
|
||||
});
|
||||
|
||||
$scope.activeVariant = this.activeVariant;
|
||||
|
||||
$scope.defaultVariant = _.find(this.content.variants, variant => {
|
||||
return variant.language.isDefault;
|
||||
});
|
||||
|
||||
$scope.unlockInvariantValue = function(property) {
|
||||
property.unlockInvariantValue = !property.unlockInvariantValue;
|
||||
};
|
||||
|
||||
$scope.$watch("tabbedContentForm.$dirty",
|
||||
function (newValue, oldValue) {
|
||||
if (newValue === true) {
|
||||
$scope.content.isDirty = true;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
var directive = {
|
||||
restrict: 'E',
|
||||
replace: true,
|
||||
templateUrl: 'views/components/content/umb-tabbed-content.html',
|
||||
controller: function ($scope) {
|
||||
|
||||
//expose the property/methods for other directives to use
|
||||
this.content = $scope.content;
|
||||
this.activeVariant = _.find(this.content.variants, variant => {
|
||||
return variant.active;
|
||||
});
|
||||
|
||||
$scope.activeVariant = this.activeVariant;
|
||||
|
||||
$scope.defaultVariant = _.find(this.content.variants, variant => {
|
||||
return variant.language.isDefault;
|
||||
});
|
||||
|
||||
$scope.unlockInvariantValue = function(property) {
|
||||
property.unlockInvariantValue = !property.unlockInvariantValue;
|
||||
};
|
||||
|
||||
$scope.$watch("tabbedContentForm.$dirty",
|
||||
function (newValue, oldValue) {
|
||||
if (newValue === true) {
|
||||
$scope.content.isDirty = true;
|
||||
}
|
||||
});
|
||||
},
|
||||
link: function(scope) {
|
||||
|
||||
},
|
||||
controller: controller,
|
||||
link: link,
|
||||
scope: {
|
||||
content: "="
|
||||
}
|
||||
|
||||
+23
-6
@@ -16,7 +16,8 @@
|
||||
onCloseSplitView: "&",
|
||||
onSelectVariant: "&",
|
||||
onOpenSplitView: "&",
|
||||
onSelectApp: "&"
|
||||
onSelectApp: "&",
|
||||
onSelectAppAnchor: "&"
|
||||
},
|
||||
controllerAs: 'vm',
|
||||
controller: umbVariantContentController
|
||||
@@ -35,6 +36,7 @@
|
||||
vm.selectVariant = selectVariant;
|
||||
vm.openSplitView = openSplitView;
|
||||
vm.selectApp = selectApp;
|
||||
vm.selectAppAnchor = selectAppAnchor;
|
||||
|
||||
function onInit() {
|
||||
// disable the name field if the active content app is not "Content"
|
||||
@@ -78,16 +80,31 @@
|
||||
* @param {any} item
|
||||
*/
|
||||
function selectApp(item) {
|
||||
// disable the name field if the active content app is not "Content" or "Info"
|
||||
vm.nameDisabled = false;
|
||||
if(item && item.alias !== "umbContent" && item.alias !== "umbInfo") {
|
||||
vm.nameDisabled = true;
|
||||
}
|
||||
// call the callback if any is registered
|
||||
if(vm.onSelectApp) {
|
||||
vm.onSelectApp({"app": item});
|
||||
}
|
||||
}
|
||||
|
||||
$scope.$on("editors.apps.appChanged", function($event, $args) {
|
||||
var app = $args.app;
|
||||
// disable the name field if the active content app is not "Content" or "Info"
|
||||
vm.nameDisabled = false;
|
||||
if(app && app.alias !== "umbContent" && app.alias !== "umbInfo") {
|
||||
vm.nameDisabled = true;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Used to proxy a callback
|
||||
* @param {any} item
|
||||
*/
|
||||
function selectAppAnchor(item, anchor) {
|
||||
// call the callback if any is registered
|
||||
if(vm.onSelectAppAnchor) {
|
||||
vm.onSelectAppAnchor({"app": item, "anchor": anchor});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to proxy a callback
|
||||
|
||||
+17
-4
@@ -10,7 +10,8 @@
|
||||
page: "<",
|
||||
content: "<", // TODO: Not sure if this should be = since we are changing the 'active' property of a variant
|
||||
culture: "<",
|
||||
onSelectApp: "&?"
|
||||
onSelectApp: "&?",
|
||||
onSelectAppAnchor: "&?"
|
||||
},
|
||||
controllerAs: 'vm',
|
||||
controller: umbVariantContentEditorsController
|
||||
@@ -32,6 +33,7 @@
|
||||
vm.closeSplitView = closeSplitView;
|
||||
vm.selectVariant = selectVariant;
|
||||
vm.selectApp = selectApp;
|
||||
vm.selectAppAnchor = selectAppAnchor;
|
||||
|
||||
//Used to track how many content views there are (for split view there will be 2, it could support more in theory)
|
||||
vm.editors = [];
|
||||
@@ -316,13 +318,24 @@
|
||||
* @param {any} app This is the model of the selected app
|
||||
*/
|
||||
function selectApp(app) {
|
||||
if(app && app.alias) {
|
||||
activeAppAlias = app.alias;
|
||||
}
|
||||
if(vm.onSelectApp) {
|
||||
vm.onSelectApp({"app": app});
|
||||
}
|
||||
}
|
||||
|
||||
function selectAppAnchor(app, anchor) {
|
||||
if(vm.onSelectAppAnchor) {
|
||||
vm.onSelectAppAnchor({"app": app, "anchor": anchor});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$scope.$on("editors.apps.appChanged", function($event, $args) {
|
||||
var app = $args.app;
|
||||
if(app && app.alias) {
|
||||
activeAppAlias = app.alias;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
+22
-7
@@ -11,17 +11,26 @@
|
||||
if (!scope.serverValidationAliasField) {
|
||||
scope.serverValidationAliasField = "Alias";
|
||||
}
|
||||
|
||||
|
||||
scope.vm = {};
|
||||
scope.vm.dropdownOpen = false;
|
||||
scope.vm.currentVariant = "";
|
||||
|
||||
function onInit() {
|
||||
|
||||
setCurrentVariant();
|
||||
|
||||
angular.forEach(scope.content.apps, (app) => {
|
||||
if (app.alias === "umbContent") {
|
||||
console.log("app: ", app)
|
||||
app.anchors = scope.content.tabs;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function setCurrentVariant() {
|
||||
angular.forEach(scope.variants, function (variant) {
|
||||
angular.forEach(scope.content.variants, function (variant) {
|
||||
if (variant.active) {
|
||||
scope.vm.currentVariant = variant;
|
||||
}
|
||||
@@ -46,6 +55,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
scope.selectAnchorItem = function(item, anchor) {
|
||||
if(scope.onSelectAnchorItem) {
|
||||
scope.onSelectAnchorItem({"item": item, "anchor": anchor});
|
||||
}
|
||||
}
|
||||
|
||||
scope.closeSplitView = function () {
|
||||
if (scope.onCloseSplitView) {
|
||||
scope.onCloseSplitView();
|
||||
@@ -72,10 +87,10 @@
|
||||
onInit();
|
||||
|
||||
//watch for the active culture changing, if it changes, update the current variant
|
||||
if (scope.variants) {
|
||||
if (scope.content.variants) {
|
||||
scope.$watch(function () {
|
||||
for (var i = 0; i < scope.variants.length; i++) {
|
||||
var v = scope.variants[i];
|
||||
for (var i = 0; i < scope.content.variants.length; i++) {
|
||||
var v = scope.content.variants[i];
|
||||
if (v.active) {
|
||||
return v.language.culture;
|
||||
}
|
||||
@@ -100,11 +115,11 @@
|
||||
nameDisabled: "<?",
|
||||
menu: "=",
|
||||
hideMenu: "<?",
|
||||
variants: "=",
|
||||
content: "=",
|
||||
openVariants: "<",
|
||||
hideChangeVariant: "<?",
|
||||
navigation: "=",
|
||||
onSelectNavigationItem: "&?",
|
||||
onSelectAnchorItem: "&?",
|
||||
showBackButton: "<?",
|
||||
splitViewOpen: "=?",
|
||||
onOpenInSplitView: "&?",
|
||||
|
||||
+17
-6
@@ -17,14 +17,24 @@
|
||||
name: "More"
|
||||
};
|
||||
|
||||
scope.clickNavigationItem = function (selectedItem) {
|
||||
scope.openNavigationItem = function(item) {
|
||||
|
||||
scope.showDropdown = false;
|
||||
runItemAction(selectedItem);
|
||||
setItemToActive(selectedItem);
|
||||
runItemAction(item);
|
||||
setItemToActive(item);
|
||||
if(scope.onSelect) {
|
||||
scope.onSelect({"item": selectedItem});
|
||||
scope.onSelect({"item": item});
|
||||
}
|
||||
eventsService.emit("app.tabChange", item);
|
||||
};
|
||||
|
||||
scope.openAnchorItem = function(item, anchor) {
|
||||
if(scope.onAnchorSelect) {
|
||||
scope.onAnchorSelect({"item": item, "anchor": anchor});
|
||||
}
|
||||
if (item.active !== true) {
|
||||
scope.openNavigationItem(item);
|
||||
}
|
||||
eventsService.emit("app.tabChange", selectedItem);
|
||||
};
|
||||
|
||||
scope.toggleDropdown = function () {
|
||||
@@ -128,7 +138,8 @@
|
||||
templateUrl: 'views/components/editor/umb-editor-navigation.html',
|
||||
scope: {
|
||||
navigation: "=",
|
||||
onSelect: "&"
|
||||
onSelect: "&",
|
||||
onAnchorSelect: "&"
|
||||
},
|
||||
link: link
|
||||
};
|
||||
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
function UmbEditorNavigationItemController($scope, $element, $attrs) {
|
||||
|
||||
var vm = this;
|
||||
|
||||
vm.clicked = function() {
|
||||
vm.onOpen({item:vm.item});
|
||||
};
|
||||
|
||||
vm.anchorClicked = function(anchor, $event) {
|
||||
vm.onOpenAnchor({item:vm.item, anchor:anchor});
|
||||
$event.stopPropagation();
|
||||
$event.preventDefault();
|
||||
};
|
||||
|
||||
// needed to make sure that we update what anchors are active.
|
||||
vm.mouseOver = function() {
|
||||
$scope.$digest();
|
||||
}
|
||||
|
||||
var componentNode = $element[0];
|
||||
|
||||
componentNode.classList.add('umb-sub-views-nav-item');
|
||||
componentNode.addEventListener('mouseover', vm.mouseOver);
|
||||
|
||||
//ensure to unregister from all dom-events
|
||||
$scope.$on('$destroy', function () {
|
||||
componentNode.removeEventListener("mouseover", vm.mouseOver);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
angular
|
||||
.module('umbraco.directives.html')
|
||||
.component('umbEditorNavigationItem', {
|
||||
templateUrl: 'views/components/editor/umb-editor-navigation-item.html',
|
||||
controller: UmbEditorNavigationItemController,
|
||||
controllerAs: 'vm',
|
||||
bindings: {
|
||||
item: '=',
|
||||
onOpen: '&',
|
||||
onOpenAnchor: '&',
|
||||
index: '@'
|
||||
}
|
||||
});
|
||||
|
||||
})();
|
||||
@@ -0,0 +1,17 @@
|
||||
angular.module("umbraco.directives").directive("retriveDomElement", function () {
|
||||
var directiveDefinitionObject = {
|
||||
|
||||
restrict: "A",
|
||||
selector: '[retriveDomElement]',
|
||||
scope: {
|
||||
"retriveDomElement": "&"
|
||||
},
|
||||
link: {
|
||||
post: function(scope, iElement, iAttrs, controller) {
|
||||
scope.retriveDomElement({element:iElement, attributes: iAttrs});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return directiveDefinitionObject;
|
||||
});
|
||||
+2
-2
@@ -5,11 +5,11 @@
|
||||
for (var property in obj) {
|
||||
if (obj.hasOwnProperty(property)) {
|
||||
|
||||
if (property.startsWith(propertyPrefix) && obj[property]) {
|
||||
if (property.startsWith(propertyPrefix) && obj[property] !== undefined) {
|
||||
obj[property] = undefined;
|
||||
}
|
||||
|
||||
if (typeof obj[property] == "object") {
|
||||
if (typeof obj[property] === "object") {
|
||||
removeProperty(obj[property], propertyPrefix);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +91,7 @@
|
||||
@import "components/application/umb-dashboard.less";
|
||||
|
||||
@import "components/html/umb-expansion-panel.less";
|
||||
@import "components/html/umb-group-panel.less";
|
||||
@import "components/html/umb-alert.less";
|
||||
|
||||
@import "components/tree/umb-tree.less";
|
||||
@@ -105,6 +106,7 @@
|
||||
@import "components/editor/umb-editor.less";
|
||||
@import "components/umb-sub-views.less";
|
||||
@import "components/umb-editor-navigation.less";
|
||||
@import "components/umb-editor-navigation-item.less";
|
||||
@import "components/umb-editor-sub-views.less";
|
||||
@import "components/editor/subheader/umb-editor-sub-header.less";
|
||||
@import "components/umb-flatpickr.less";
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user