Allowed delete of langage via services even if used as a fall-back for other languages, by setting references to null before deleting

This commit is contained in:
AndyButland
2018-07-21 08:24:08 +02:00
parent 91a0ee2c93
commit ecc75bc4c9
5 changed files with 45 additions and 4 deletions

View File

@@ -45,6 +45,7 @@ namespace Umbraco.Core.Persistence.Dtos
/// </summary>
[Column("fallbackLanguageId")]
[ForeignKey(typeof(LanguageDto), Column = "id")]
[Index(IndexTypes.NonClustered)]
[NullSetting(NullSetting = NullSettings.Null)]
public int? FallbackLanguageId { get; set; }
}

View File

@@ -177,7 +177,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
protected override void PersistDeletedItem(ILanguage entity)
{
//we need to validate that we can delete this language
// We need to validate that we can delete this language
if (entity.IsDefaultVariantLanguage)
throw new InvalidOperationException($"Cannot delete the default language ({entity.IsoCode})");
@@ -185,9 +185,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (count == 1)
throw new InvalidOperationException($"Cannot delete the default language ({entity.IsoCode})");
// We need to remove any references to the language if it's being used as a fall-back from other ones
Database.Execute(Sql().Update<LanguageDto>(u => u.Set(x => x.FallbackLanguageId, null)).Where<LanguageDto>(x => x.FallbackLanguageId == entity.Id));
base.PersistDeletedItem(entity);
//Clear the cache entries that exist by key/iso
// Clear the cache entries that exist by key/iso
IsolatedCache.ClearCacheItem(RepositoryCacheKeys.GetKey<ILanguage>(entity.IsoCode));
IsolatedCache.ClearCacheItem(RepositoryCacheKeys.GetKey<ILanguage>(entity.CultureName));
}

View File

@@ -393,8 +393,7 @@ namespace Umbraco.Core.Services.Implement
return;
}
//NOTE: There isn't any constraints in the db, so possible references aren't deleted
// NOTE: Other than the fall-back language, there aren't any other constraints in the db, so possible references aren't deleted
_languageRepository.Delete(language);
deleteEventArgs.CanCancel = false;

View File

@@ -318,6 +318,30 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
[Test]
public void Can_Perform_Delete_On_LanguageRepository_With_Language_Used_As_Fallback()
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
{
// Add language to delete as a fall-back language to another one
var repository = CreateRepository(provider);
var languageToFallbackFrom = repository.Get(5);
languageToFallbackFrom.FallbackLanguageId = 1;
repository.Save(languageToFallbackFrom);
// Act
var languageToDelete = repository.Get(1);
repository.Delete(languageToDelete);
var exists = repository.Exists(1);
// Assert
Assert.That(exists, Is.False);
}
}
[Test]
public void Can_Perform_Exists_On_LanguageRepository()
{

View File

@@ -192,6 +192,20 @@ namespace Umbraco.Tests.Services
Assert.Null(language);
}
[Test]
public void Can_Delete_Language_Used_As_Fallback()
{
var danish = ServiceContext.LocalizationService.GetLanguageByIsoCode("da-DK");
var norwegian = new Language("nb-NO") { CultureName = "Norwegian", FallbackLanguageId = danish.Id };
ServiceContext.LocalizationService.Save(norwegian, 0);
var languageId = danish.Id;
ServiceContext.LocalizationService.Delete(danish);
var language = ServiceContext.LocalizationService.GetLanguageById(languageId);
Assert.Null(language);
}
[Test]
public void Can_Create_DictionaryItem_At_Root()
{