From 259fbcb8f0ec03f2f578bf151b760d8db6d414d6 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 18 Mar 2013 08:50:24 -0100 Subject: [PATCH 01/24] Fixed U4-1934 Error in comments of config files --- src/Umbraco.Web.UI/config/ExamineSettings.Release.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI/config/ExamineSettings.Release.config b/src/Umbraco.Web.UI/config/ExamineSettings.Release.config index 2ab27fbf57..d7ce43eae0 100644 --- a/src/Umbraco.Web.UI/config/ExamineSettings.Release.config +++ b/src/Umbraco.Web.UI/config/ExamineSettings.Release.config @@ -21,7 +21,7 @@ More information and documentation can be found on CodePlex: http://umbracoexami interval="10" analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/> - + Date: Thu, 21 Mar 2013 13:10:31 -0100 Subject: [PATCH 02/24] Making the export method internal until its been properly implemented --- src/Umbraco.Core/Services/PackagingService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index 8d67e7ab1d..7caec71ed3 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -23,6 +23,7 @@ namespace Umbraco.Core.Services private readonly RepositoryFactory _repositoryFactory; private readonly IDatabaseUnitOfWorkProvider _uowProvider; private Dictionary _importedContentTypes; + //Support recursive locks because some of the methods that require locking call other methods that require locking. //for example, the Move method needs to be locked but this calls the Save method which also needs to be locked. private static readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); @@ -176,7 +177,7 @@ namespace Umbraco.Core.Services return content; } - public XElement Export(IContent content, bool deep = false) + internal XElement Export(IContent content, bool deep = false) { throw new NotImplementedException(); } From a55fedab0aaffc2e33234d10a66f02df501aaa34 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 13:40:54 -0100 Subject: [PATCH 03/24] Adding a few checks to ensure package installation doesn't fail when properties are not present in the xml. --- src/Umbraco.Core/Services/PackagingService.cs | 4 +++- src/umbraco.cms/businesslogic/Packager/Installer.cs | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index 7caec71ed3..64ea920943 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -280,7 +280,9 @@ namespace Umbraco.Core.Services contentType.Icon = infoElement.Element("Icon").Value; contentType.Thumbnail = infoElement.Element("Thumbnail").Value; contentType.Description = infoElement.Element("Description").Value; - contentType.AllowedAsRoot = infoElement.Element("AllowAtRoot").Value.ToLowerInvariant().Equals("true"); + //NOTE AllowAtRoot is a new property in the package xml so we need to verify it exists before using it. + if (infoElement.Element("AllowAtRoot") != null) + contentType.AllowedAsRoot = infoElement.Element("AllowAtRoot").Value.ToLowerInvariant().Equals("true"); UpdateContentTypesAllowedTemplates(contentType, infoElement.Element("AllowedTemplates"), defaultTemplateElement); UpdateContentTypesTabs(contentType, documentType.Element("Tab")); diff --git a/src/umbraco.cms/businesslogic/Packager/Installer.cs b/src/umbraco.cms/businesslogic/Packager/Installer.cs index 30e41b4bea..b4b6a2722b 100644 --- a/src/umbraco.cms/businesslogic/Packager/Installer.cs +++ b/src/umbraco.cms/businesslogic/Packager/Installer.cs @@ -475,11 +475,13 @@ namespace umbraco.cms.businesslogic.packager #endregion #region Documents - var documentElement = rootElement.Descendants("DocumentSet").First(); - var content = packagingService.ImportContent(documentElement, -1, currentUser.Id); - var firstContentItem = content.First(); - insPack.Data.ContentNodeId = firstContentItem.Id.ToString(CultureInfo.InvariantCulture); - + var documentElement = rootElement.Descendants("DocumentSet").FirstOrDefault(); + if (documentElement != null) + { + var content = packagingService.ImportContent(documentElement, -1, currentUser.Id); + var firstContentItem = content.First(); + insPack.Data.ContentNodeId = firstContentItem.Id.ToString(CultureInfo.InvariantCulture); + } /*foreach (XmlElement n in _packageConfig.DocumentElement.SelectNodes("Documents/DocumentSet [@importMode = 'root']/*")) { insPack.Data.ContentNodeId = cms.businesslogic.web.Document.Import(-1, currentUser, n).ToString(); From 5cc55ad6e2d731da3519f3f8c6a10e696a517826 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 13:51:45 -0100 Subject: [PATCH 04/24] Fixing U4-1948 by setting the Published property when using document.Publish so updating the cache won't be skipped. --- src/umbraco.cms/businesslogic/web/Document.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/umbraco.cms/businesslogic/web/Document.cs b/src/umbraco.cms/businesslogic/web/Document.cs index 14f1742a53..6a17478dd9 100644 --- a/src/umbraco.cms/businesslogic/web/Document.cs +++ b/src/umbraco.cms/businesslogic/web/Document.cs @@ -774,7 +774,7 @@ namespace umbraco.cms.businesslogic.web [Obsolete("Obsolete, Use Umbraco.Core.Services.ContentService.Publish()", false)] public void Publish(User u) { - SaveAndPublish(u); + this.Published = SaveAndPublish(u); } /// From c6b7f20dab1c9ee3b3e561c71e1ea999a04d16fd Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 14:40:17 -0100 Subject: [PATCH 05/24] Fixes U4-1849 by introducing a new attribute for packaged DataTypes, so it stores information about the database type. Will still default to Ntext, but seeing as the database type has never been used before it always defaulted to Ntext. --- .../Models/DataTypeDatabaseType.cs | 8 ++-- src/Umbraco.Core/Services/PackagingService.cs | 11 ++++- .../datatype/DataTypeDefinition.cs | 45 +++++++------------ .../businesslogic/member/Member.cs | 2 +- 4 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/Umbraco.Core/Models/DataTypeDatabaseType.cs b/src/Umbraco.Core/Models/DataTypeDatabaseType.cs index 0ba8ea98b2..e45cdd1a73 100644 --- a/src/Umbraco.Core/Models/DataTypeDatabaseType.cs +++ b/src/Umbraco.Core/Models/DataTypeDatabaseType.cs @@ -15,12 +15,12 @@ namespace Umbraco.Core.Models public enum DataTypeDatabaseType { [EnumMember] - Integer, - [EnumMember] - Date, + Ntext, [EnumMember] Nvarchar, [EnumMember] - Ntext /*, Object*/ + Integer, + [EnumMember] + Date } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index 64ea920943..b60919d6ee 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -478,11 +478,20 @@ namespace Umbraco.Core.Services var dataTypeDefinitionName = dataTypeElement.Attribute("Name").Value; var dataTypeId = new Guid(dataTypeElement.Attribute("Id").Value); var dataTypeDefinitionId = new Guid(dataTypeElement.Attribute("Definition").Value); + var databaseTypeAttribute = dataTypeElement.Attribute("DatabaseType"); var definition = _dataTypeService.GetDataTypeDefinitionById(dataTypeDefinitionId); if (definition == null) { - var dataTypeDefinition = new DataTypeDefinition(-1, dataTypeId) { Key = dataTypeDefinitionId, Name = dataTypeDefinitionName }; + var databaseType = databaseTypeAttribute != null + ? databaseTypeAttribute.Value.EnumParse(true) + : DataTypeDatabaseType.Ntext; + var dataTypeDefinition = new DataTypeDefinition(-1, dataTypeId) + { + Key = dataTypeDefinitionId, + Name = dataTypeDefinitionName, + DatabaseType = databaseType + }; dataTypes.Add(dataTypeDefinitionName, dataTypeDefinition); } } diff --git a/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs b/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs index 877bd02235..a83c456688 100644 --- a/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs +++ b/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs @@ -1,12 +1,14 @@ using System; +using System.Collections.Generic; using System.Data; using System.Collections; using System.Linq; +using Umbraco.Core.Models; using umbraco.DataLayer; using System.Xml; using umbraco.interfaces; -using umbraco.cms.businesslogic.propertytype; +using PropertyType = umbraco.cms.businesslogic.propertytype.PropertyType; namespace umbraco.cms.businesslogic.datatype { @@ -23,6 +25,14 @@ namespace umbraco.cms.businesslogic.datatype #region Private fields private Guid _controlId; + private static Dictionary _databaseTypes = + new Dictionary + { + {"Integer", DataTypeDatabaseType.Integer}, + {"Date", DataTypeDatabaseType.Date}, + {"Ntext", DataTypeDatabaseType.Ntext}, + {"Nvarchar", DataTypeDatabaseType.Nvarchar} + }; private static Guid _objectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"); private string _dbType; @@ -117,36 +127,21 @@ namespace umbraco.cms.businesslogic.datatype OnSaving(EventArgs.Empty); } - /* - public SortedList PreValues { - get { - SortedList retVal = new SortedList(); - SqlDataReader dr = SqlHelper.ExecuteReader("select id, value from cmsDataTypePreValues where dataTypeNodeId = @nodeId order by sortOrder", SqlHelper.CreateParameter("@nodeId", this.Id)); - while (dr.Read()) - { - retVal.Add(dr.GetString("id"), dr.GetString("value")); - } - dr.Close(); - - return retVal; - } - } - */ - public XmlElement ToXml(XmlDocument xd) { XmlElement dt = xd.CreateElement("DataType"); dt.Attributes.Append(xmlHelper.addAttribute(xd, "Name", Text)); dt.Attributes.Append(xmlHelper.addAttribute(xd, "Id", this.DataType.Id.ToString())); dt.Attributes.Append(xmlHelper.addAttribute(xd, "Definition", this.UniqueId.ToString())); + dt.Attributes.Append(xmlHelper.addAttribute(xd, "DatabaseType", this.DbType)); // templates XmlElement prevalues = xd.CreateElement("PreValues"); foreach (DictionaryEntry item in PreValues.GetPreValues(this.Id)) { XmlElement prevalue = xd.CreateElement("PreValue"); - prevalue.Attributes.Append(xmlHelper.addAttribute(xd, "Id", ((umbraco.cms.businesslogic.datatype.PreValue)item.Value).Id.ToString())); - prevalue.Attributes.Append(xmlHelper.addAttribute(xd, "Value", ((umbraco.cms.businesslogic.datatype.PreValue)item.Value).Value)); + prevalue.Attributes.Append(xmlHelper.addAttribute(xd, "Id", ((PreValue)item.Value).Id.ToString())); + prevalue.Attributes.Append(xmlHelper.addAttribute(xd, "Value", ((PreValue)item.Value).Value)); prevalues.AppendChild(prevalue); } @@ -166,18 +161,14 @@ namespace umbraco.cms.businesslogic.datatype //Make sure that the dtd is not already present - if (!CMSNode.IsNode(new Guid(_def)) - ) + if (!CMSNode.IsNode(new Guid(_def))) { - - BusinessLogic.User u = umbraco.BusinessLogic.User.GetCurrent(); + BusinessLogic.User u = BusinessLogic.User.GetCurrent(); if (u == null) u = BusinessLogic.User.GetUser(0); - cms.businesslogic.datatype.controls.Factory f = new umbraco.cms.businesslogic.datatype.controls.Factory(); - - + controls.Factory f = new controls.Factory(); DataTypeDefinition dtd = MakeNew(u, _name, new Guid(_def)); var dataType = f.DataType(new Guid(_id)); if (dataType == null) @@ -189,8 +180,6 @@ namespace umbraco.cms.businesslogic.datatype //add prevalues foreach (XmlNode xmlPv in xmlData.SelectNodes("PreValues/PreValue")) { - - XmlAttribute val = xmlPv.Attributes["Value"]; if (val != null) diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index 94bebaf74a..4b75790d1e 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -588,7 +588,7 @@ namespace umbraco.cms.businesslogic.member if (property.Value != null) { string dbType = property.PropertyType.DataTypeDefinition.DbType; - if (dbType.Equals("Int")) + if (dbType.Equals("Integer")) { int value = 0; if (int.TryParse(property.Value.ToString(), out value)) From 1a56e6693abc3eb32e797df3d5b66e0bd0099bcb Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 14:50:39 -0100 Subject: [PATCH 06/24] Removing dictionary from DataTypeDefinition as it wasn't used. Updating package xml to include DatabaseType for testing. --- .../Services/Importing/StandardMvc-Package.xml | 2 +- .../businesslogic/datatype/DataTypeDefinition.cs | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/Umbraco.Tests/Services/Importing/StandardMvc-Package.xml b/src/Umbraco.Tests/Services/Importing/StandardMvc-Package.xml index ddf3d5e66f..82cbcc5d84 100644 --- a/src/Umbraco.Tests/Services/Importing/StandardMvc-Package.xml +++ b/src/Umbraco.Tests/Services/Importing/StandardMvc-Package.xml @@ -2256,7 +2256,7 @@ table th, td {border: 0px solid #fff;} - + diff --git a/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs b/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs index a83c456688..3417245798 100644 --- a/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs +++ b/src/umbraco.cms/businesslogic/datatype/DataTypeDefinition.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; -using System.Data; - using System.Collections; using System.Linq; -using Umbraco.Core.Models; using umbraco.DataLayer; using System.Xml; using umbraco.interfaces; @@ -25,14 +21,6 @@ namespace umbraco.cms.businesslogic.datatype #region Private fields private Guid _controlId; - private static Dictionary _databaseTypes = - new Dictionary - { - {"Integer", DataTypeDatabaseType.Integer}, - {"Date", DataTypeDatabaseType.Date}, - {"Ntext", DataTypeDatabaseType.Ntext}, - {"Nvarchar", DataTypeDatabaseType.Nvarchar} - }; private static Guid _objectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"); private string _dbType; From 1214082997b5d155fa2c20945e4f65a77d33f4ff Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 14:56:50 -0100 Subject: [PATCH 07/24] Fixes U4-1883 by setting the Document/Media UpdateDate property in the Save/SaveAndPublish methods --- src/umbraco.cms/businesslogic/media/Media.cs | 4 +++- src/umbraco.cms/businesslogic/web/Document.cs | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/umbraco.cms/businesslogic/media/Media.cs b/src/umbraco.cms/businesslogic/media/Media.cs index d8231bf7aa..66fba35273 100644 --- a/src/umbraco.cms/businesslogic/media/Media.cs +++ b/src/umbraco.cms/businesslogic/media/Media.cs @@ -249,7 +249,7 @@ namespace umbraco.cms.businesslogic.media [Obsolete("Obsolete, Use Umbraco.Core.Services.MediaService.Save()", false)] public override void Save() { - SaveEventArgs e = new SaveEventArgs(); + var e = new SaveEventArgs(); FireBeforeSave(e); foreach (var property in GenericProperties) @@ -263,6 +263,8 @@ namespace umbraco.cms.businesslogic.media int userId = current == null ? 0 : current.Id; ApplicationContext.Current.Services.MediaService.Save(MediaItem, userId); + base.VersionDate = MediaItem.UpdateDate; + base.Save(); XmlDocument xd = new XmlDocument(); diff --git a/src/umbraco.cms/businesslogic/web/Document.cs b/src/umbraco.cms/businesslogic/web/Document.cs index 6a17478dd9..20fdc652e6 100644 --- a/src/umbraco.cms/businesslogic/web/Document.cs +++ b/src/umbraco.cms/businesslogic/web/Document.cs @@ -893,6 +893,9 @@ namespace umbraco.cms.businesslogic.web int userId = current == null ? 0 : current.Id; ApplicationContext.Current.Services.ContentService.Save(Content, userId); + base.VersionDate = Content.UpdateDate; + this.UpdateDate = Content.UpdateDate; + base.Save(); FireAfterSave(e); @@ -927,6 +930,8 @@ namespace umbraco.cms.businesslogic.web var result = ((ContentService) ApplicationContext.Current.Services.ContentService).SaveAndPublish(Content, true, u.Id); + base.VersionDate = Content.UpdateDate; + this.UpdateDate = Content.UpdateDate; base.Save(); From d485c3da97be93f34da4a6604c2b0342463534af Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 16:09:45 -0100 Subject: [PATCH 08/24] Fixes U4-1875 by correcting the Creating events in the ContentService and MediaService, so null is returned if the creation of an object is cancelled. In the legacy Document and Media classes we check if the created object is null to determine if the event has been cancelled through the new api. --- src/Umbraco.Core/Services/ContentService.cs | 6 ++++-- src/Umbraco.Core/Services/MediaService.cs | 19 ++++++++++------- src/Umbraco.Core/Services/PackagingService.cs | 4 ++++ src/umbraco.cms/businesslogic/media/Media.cs | 21 ++++++++++++++++++- src/umbraco.cms/businesslogic/web/Document.cs | 6 +++++- 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index c645d60175..0376bc7a28 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -65,11 +65,12 @@ namespace Umbraco.Core.Services public IContent CreateContent(string name, int parentId, string contentTypeAlias, int userId = 0) { IContentType contentType = FindContentTypeByAlias(contentTypeAlias); - IContent content = new Content(name, parentId, contentType); + IContent content = null; if (Creating.IsRaisedEventCancelled(new NewEventArgs(content, contentTypeAlias, parentId), this)) return content; + content = new Content(name, parentId, contentType); content.CreatorId = userId; content.WriterId = userId; @@ -92,11 +93,12 @@ namespace Umbraco.Core.Services public IContent CreateContent(string name, IContent parent, string contentTypeAlias, int userId = 0) { IContentType contentType = FindContentTypeByAlias(contentTypeAlias); - IContent content = new Content(name, parent, contentType); + IContent content = null; if (Creating.IsRaisedEventCancelled(new NewEventArgs(content, contentTypeAlias, parent), this)) return content; + content = new Content(name, parent, contentType); content.CreatorId = userId; content.WriterId = userId; diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 11e36cc72b..88aab5d5e1 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -46,7 +46,11 @@ namespace Umbraco.Core.Services /// public IMedia CreateMedia(string name, int parentId, string mediaTypeAlias, int userId = 0) { + Models.Media media = null; IMediaType mediaType = null; + if (Creating.IsRaisedEventCancelled(new NewEventArgs(media, mediaTypeAlias, parentId), this)) + return media; + var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMediaTypeRepository(uow)) { @@ -64,10 +68,7 @@ namespace Umbraco.Core.Services mediaTypeAlias)); } - var media = new Models.Media(name, parentId, mediaType); - - if (Creating.IsRaisedEventCancelled(new NewEventArgs(media, mediaTypeAlias, parentId), this)) - return media; + media = new Models.Media(name, parentId, mediaType); media.CreatorId = userId; @@ -89,7 +90,12 @@ namespace Umbraco.Core.Services /// public IMedia CreateMedia(string name, IMedia parent, string mediaTypeAlias, int userId = 0) { + Models.Media media = null; IMediaType mediaType = null; + + if (Creating.IsRaisedEventCancelled(new NewEventArgs(media, mediaTypeAlias, parent), this)) + return media; + var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMediaTypeRepository(uow)) { @@ -107,10 +113,7 @@ namespace Umbraco.Core.Services mediaTypeAlias)); } - var media = new Models.Media(name, parent, mediaType); - - if (Creating.IsRaisedEventCancelled(new NewEventArgs(media, mediaTypeAlias, parent), this)) - return media; + media = new Models.Media(name, parent, mediaType); media.CreatorId = userId; diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index b60919d6ee..6aa51e824d 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -13,6 +13,10 @@ using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Services { + /// + /// Represents the Packaging Service, which provides import/export functionality for the Core models of the API + /// using xml representation. This is primarily used by the Package functionality. + /// public class PackagingService : IService { private readonly IContentService _contentService; diff --git a/src/umbraco.cms/businesslogic/media/Media.cs b/src/umbraco.cms/businesslogic/media/Media.cs index 66fba35273..aed7476d5b 100644 --- a/src/umbraco.cms/businesslogic/media/Media.cs +++ b/src/umbraco.cms/businesslogic/media/Media.cs @@ -77,11 +77,21 @@ namespace umbraco.cms.businesslogic.media [Obsolete("Obsolete, Use Umbraco.Core.Services.MediaService.CreateMedia()", false)] public static Media MakeNew(string Name, MediaType dct, BusinessLogic.User u, int ParentId) { + var e = new NewEventArgs(); + OnNewing(e); + if (e.Cancel) + { + return null; + } + var media = ApplicationContext.Current.Services.MediaService.CreateMedia(Name, ParentId, dct.Alias, u.Id); + //The media object will only be null if the 'Creating' event has been cancelled + if (media == null) + return null; + ApplicationContext.Current.Services.MediaService.Save(media); var tmp = new Media(media); - NewEventArgs e = new NewEventArgs(); tmp.OnNew(e); return tmp; @@ -504,6 +514,15 @@ namespace umbraco.cms.businesslogic.media New(this, e); } + public static event EventHandler Newing; + protected static void OnNewing(NewEventArgs e) + { + if (Newing != null) + { + Newing(null, e); + } + } + /// /// Occurs when [before delete]. /// diff --git a/src/umbraco.cms/businesslogic/web/Document.cs b/src/umbraco.cms/businesslogic/web/Document.cs index 20fdc652e6..a470d31fb7 100644 --- a/src/umbraco.cms/businesslogic/web/Document.cs +++ b/src/umbraco.cms/businesslogic/web/Document.cs @@ -288,6 +288,10 @@ namespace umbraco.cms.businesslogic.web //Create a new IContent object based on the passed in DocumentType's alias, set the name and save it IContent content = ApplicationContext.Current.Services.ContentService.CreateContent(Name, ParentId, dct.Alias, u.Id); + //The content object will only be null if the 'Creating' event has been cancelled, so we return null. + if (content == null) + return null; + //don't raise events here (false), they will get raised with the d.Save() call. ApplicationContext.Current.Services.ContentService.Save(content, u.Id, false); @@ -302,7 +306,7 @@ namespace umbraco.cms.businesslogic.web LogHelper.Info(string.Format("New document {0}", d.Id)); // Run Handler - umbraco.BusinessLogic.Actions.Action.RunActionHandlers(d, ActionNew.Instance); + BusinessLogic.Actions.Action.RunActionHandlers(d, ActionNew.Instance); // Save doc d.Save(); From b4d5658d45cb73b8fe6b472d8737f82815a0a807 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 17:34:08 -0100 Subject: [PATCH 09/24] Fixes U4-1828 by correctly incrementing the sortorder ... doh! --- .../Persistence/Repositories/ContentRepository.cs | 2 +- src/Umbraco.Core/Services/ContentService.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index c6281a44ff..b6e0749a4e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -267,7 +267,7 @@ namespace Umbraco.Core.Persistence.Repositories entity.Path = string.Concat(parent.Path, ",", entity.Id); entity.Level = parent.Level + 1; var maxSortOrder = Database.ExecuteScalar("SELECT coalesce(max(sortOrder),0) FROM umbracoNode WHERE parentid = @ParentId", new { ParentId = entity.ParentId }); - entity.SortOrder = maxSortOrder; + entity.SortOrder = maxSortOrder + 1; } var factory = new ContentFactory(NodeObjectTypeId, entity.Id); diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 0376bc7a28..ee435f0ffa 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -732,9 +732,9 @@ namespace Umbraco.Core.Services if (Moving.IsRaisedEventCancelled(new MoveEventArgs(content, parentId), this)) return; - + content.WriterId = userId; - if (parentId == -1) + if (parentId == -1) { content.Path = string.Concat("-1,", content.Id); content.Level = 1; From f0699afb6e8e02414ccffd03a491c050527413bf Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 21 Mar 2013 18:45:06 -0100 Subject: [PATCH 10/24] Fixes U4-1974 --- src/umbraco.cms/businesslogic/ContentType.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/umbraco.cms/businesslogic/ContentType.cs b/src/umbraco.cms/businesslogic/ContentType.cs index 87b86a8c5f..64d844a746 100644 --- a/src/umbraco.cms/businesslogic/ContentType.cs +++ b/src/umbraco.cms/businesslogic/ContentType.cs @@ -632,10 +632,17 @@ namespace umbraco.cms.businesslogic if (value != MasterContentType) { //TODO: Add support for multiple masters - foreach (var mct in MasterContentTypes) + /*foreach (var mct in MasterContentTypes) { RemoveParentContentType(mct); + }*/ + + if (MasterContentTypes.Count > 0) + { + var masterId = MasterContentTypes[0]; + RemoveParentContentType(masterId); } + AddParentContentType(value); } } From 4b87a5c2d3bfadaf0ca893d939cffa29d5d1ac85 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Fri, 22 Mar 2013 09:56:21 -0100 Subject: [PATCH 11/24] Adding safe alias cast to Templates. Updating doc type create dialog to verify alias before saving. Updating ContentTypeRepository to Mandate that the alias is not empty. Fixes the cause for U4-1976 --- src/Umbraco.Core/Models/Template.cs | 4 +-- .../Repositories/ContentTypeRepository.cs | 27 +++++++++++++++++++ .../Repositories/TemplateRepository.cs | 2 ++ .../Repositories/VersionableRepositoryBase.cs | 2 -- .../umbraco/create/nodeType.ascx | 6 ++--- src/Umbraco.Web/Umbraco.Web.csproj | 2 +- .../umbraco/create/nodeType.ascx | 6 ++--- .../umbraco/create/nodeType.ascx.cs | 11 ++++++-- .../umbraco/create/nodeType.ascx.designer.cs | 27 ++++++++++++------- 9 files changed, 65 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index fca0d420c8..be1601945e 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -29,8 +29,8 @@ namespace Umbraco.Core.Models base.Path = path; ParentId = -1; Key = name.EncodeAsGuid(); - _name = name; - _alias = alias; + _name = name.Replace("/", ".").Replace("\\", ""); + _alias = alias.ToSafeAlias(); CreateDate = DateTime.Now; UpdateDate = DateTime.Now; diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs index e28e38efa1..de9651dad9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; @@ -167,6 +168,19 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistNewItem(IContentType entity) { + Mandate.That(string.IsNullOrEmpty(entity.Alias) == false, + () => + { + var message = + string.Format( + "ContentType '{0}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.", + entity.Name); + var exception = new Exception(message); + + LogHelper.Error(message, exception); + throw exception; + }); + ((ContentType)entity).AddingEntity(); var factory = new ContentTypeFactory(NodeObjectTypeId); @@ -192,6 +206,19 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistUpdatedItem(IContentType entity) { + Mandate.That(string.IsNullOrEmpty(entity.Alias) == false, + () => + { + var message = + string.Format( + "ContentType '{0}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.", + entity.Name); + var exception = new Exception(message); + + LogHelper.Error(message, exception); + throw exception; + }); + //Updates Modified date ((ContentType)entity).UpdatingEntity(); diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 818ab6f147..8ab279022d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -182,6 +182,8 @@ namespace Umbraco.Core.Persistence.Repositories } } + //TODO Possibly ensure unique alias here (as is done in the legacy Template class)? + //Save to db var template = entity as Template; var factory = new TemplateFactory(NodeObjectTypeId); diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs index 15266aae16..d64d12a552 100644 --- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Caching; -using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories diff --git a/src/Umbraco.Web.UI/umbraco/create/nodeType.ascx b/src/Umbraco.Web.UI/umbraco/create/nodeType.ascx index 6bb38a3466..68d3ec0853 100644 --- a/src/Umbraco.Web.UI/umbraco/create/nodeType.ascx +++ b/src/Umbraco.Web.UI/umbraco/create/nodeType.ascx @@ -6,11 +6,9 @@
<%=umbraco.ui.Text("name")%>: * - -
-
+
@@ -18,6 +16,8 @@