Fixes some underlying type conversions, fixes more of the member type wrapping, updates contenttypecontrolnew to work with member types properly, ensures the property type cache is cleared when member types change.

This commit is contained in:
Shannon
2014-01-23 13:33:58 +11:00
parent 011be60205
commit 6377b9aa50
6 changed files with 197 additions and 127 deletions

View File

@@ -306,10 +306,8 @@ namespace Umbraco.Core.Models
/// <returns><see cref="Property"/> Value as a <see cref="TPassType"/></returns>
public virtual TPassType GetValue<TPassType>(string propertyTypeAlias)
{
if (Properties[propertyTypeAlias].Value is TPassType)
return (TPassType)Properties[propertyTypeAlias].Value;
return (TPassType)Convert.ChangeType(Properties[propertyTypeAlias].Value, typeof(TPassType));
var convertAttempt = Properties[propertyTypeAlias].Value.TryConvertTo<TPassType>();
return convertAttempt.Success ? convertAttempt.Result : default(TPassType);
}
/// <summary>

View File

@@ -207,13 +207,12 @@ namespace Umbraco.Core.Models
{
get
{
if (Properties[Constants.Conventions.Member.IsApproved].Value == null)
return default(bool);
if (Properties[Constants.Conventions.Member.IsApproved].Value is bool)
return (bool)Properties[Constants.Conventions.Member.IsApproved].Value;
return (bool)Convert.ChangeType(Properties[Constants.Conventions.Member.IsApproved].Value, typeof(bool));
var tryConvert = Properties[Constants.Conventions.Member.IsApproved].Value.TryConvertTo<bool>();
if (tryConvert.Success)
{
return tryConvert.Result;
}
return default(bool);
}
set
{
@@ -233,13 +232,12 @@ namespace Umbraco.Core.Models
{
get
{
if (Properties[Constants.Conventions.Member.IsLockedOut].Value == null)
return default(bool);
if (Properties[Constants.Conventions.Member.IsLockedOut].Value is bool)
return (bool)Properties[Constants.Conventions.Member.IsLockedOut].Value;
return (bool)Convert.ChangeType(Properties[Constants.Conventions.Member.IsLockedOut].Value, typeof(bool));
var tryConvert = Properties[Constants.Conventions.Member.IsLockedOut].Value.TryConvertTo<bool>();
if (tryConvert.Success)
{
return tryConvert.Result;
}
return default(bool);
}
set
{
@@ -259,13 +257,12 @@ namespace Umbraco.Core.Models
{
get
{
if (Properties[Constants.Conventions.Member.LastLoginDate].Value == null)
return default(DateTime);
if (Properties[Constants.Conventions.Member.LastLoginDate].Value is DateTime)
return (DateTime)Properties[Constants.Conventions.Member.LastLoginDate].Value;
return (DateTime)Convert.ChangeType(Properties[Constants.Conventions.Member.LastLoginDate].Value, typeof(DateTime));
var tryConvert = Properties[Constants.Conventions.Member.LastLoginDate].Value.TryConvertTo<DateTime>();
if (tryConvert.Success)
{
return tryConvert.Result;
}
return default(DateTime);
}
set
{
@@ -285,13 +282,12 @@ namespace Umbraco.Core.Models
{
get
{
if (Properties[Constants.Conventions.Member.LastPasswordChangeDate].Value == null)
return default(DateTime);
if (Properties[Constants.Conventions.Member.LastPasswordChangeDate].Value is DateTime)
return (DateTime)Properties[Constants.Conventions.Member.LastPasswordChangeDate].Value;
return (DateTime)Convert.ChangeType(Properties[Constants.Conventions.Member.LastPasswordChangeDate].Value, typeof(DateTime));
var tryConvert = Properties[Constants.Conventions.Member.LastPasswordChangeDate].Value.TryConvertTo<DateTime>();
if (tryConvert.Success)
{
return tryConvert.Result;
}
return default(DateTime);
}
set
{
@@ -311,13 +307,12 @@ namespace Umbraco.Core.Models
{
get
{
if (Properties[Constants.Conventions.Member.LastLockoutDate].Value == null)
return default(DateTime);
if (Properties[Constants.Conventions.Member.LastLockoutDate].Value is DateTime)
return (DateTime)Properties[Constants.Conventions.Member.LastLockoutDate].Value;
return (DateTime)Convert.ChangeType(Properties[Constants.Conventions.Member.LastLockoutDate].Value, typeof(DateTime));
var tryConvert = Properties[Constants.Conventions.Member.LastLockoutDate].Value.TryConvertTo<DateTime>();
if (tryConvert.Success)
{
return tryConvert.Result;
}
return default(DateTime);
}
set
{
@@ -338,13 +333,12 @@ namespace Umbraco.Core.Models
{
get
{
if (Properties[Constants.Conventions.Member.FailedPasswordAttempts].Value == null)
return default(int);
if (Properties[Constants.Conventions.Member.FailedPasswordAttempts].Value is int)
return (int)Properties[Constants.Conventions.Member.FailedPasswordAttempts].Value;
return (int)Convert.ChangeType(Properties[Constants.Conventions.Member.FailedPasswordAttempts].Value, typeof(int));
var tryConvert = Properties[Constants.Conventions.Member.FailedPasswordAttempts].Value.TryConvertTo<int>();
if (tryConvert.Success)
{
return tryConvert.Result;
}
return default(int);
}
set
{

View File

@@ -86,6 +86,8 @@ namespace Umbraco.Web.Cache
ContentTypeService.SavedMediaType += ContentTypeServiceSavedMediaType;
ContentTypeService.DeletedContentType += ContentTypeServiceDeletedContentType;
ContentTypeService.DeletedMediaType += ContentTypeServiceDeletedMediaType;
MemberTypeService.Saved += MemberTypeServiceSaved;
MemberTypeService.Deleted += MemberTypeServiceDeleted;
//Bind to user events
@@ -363,7 +365,7 @@ namespace Umbraco.Web.Cache
}
#endregion
#region Content/media Type event handlers
#region Content/media/member Type event handlers
/// <summary>
/// Fires when a media type is deleted
/// </summary>
@@ -384,6 +386,16 @@ namespace Umbraco.Web.Cache
e.DeletedEntities.ForEach(contentType => DistributedCache.Instance.RemoveContentTypeCache(contentType));
}
/// <summary>
/// Fires when a member type is deleted
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void MemberTypeServiceDeleted(IMemberTypeService sender, Core.Events.DeleteEventArgs<IMemberType> e)
{
e.DeletedEntities.ForEach(contentType => DistributedCache.Instance.RemoveMemberTypeCache(contentType));
}
/// <summary>
/// Fires when a media type is saved
/// </summary>
@@ -402,7 +414,19 @@ namespace Umbraco.Web.Cache
static void ContentTypeServiceSavedContentType(IContentTypeService sender, Core.Events.SaveEventArgs<IContentType> e)
{
e.SavedEntities.ForEach(contentType => DistributedCache.Instance.RefreshContentTypeCache(contentType));
}
}
/// <summary>
/// Fires when a member type is saved
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void MemberTypeServiceSaved(IMemberTypeService sender, Core.Events.SaveEventArgs<IMemberType> e)
{
e.SavedEntities.ForEach(x => DistributedCache.Instance.RefreshMemberTypeCache(x));
}
#endregion
#region User event handlers

View File

@@ -353,7 +353,7 @@ namespace Umbraco.Web.Cache
}
#endregion
#region Content type cache
#region Document type cache
/// <summary>
/// Remove all cache for a given content type
@@ -364,27 +364,11 @@ namespace Umbraco.Web.Cache
{
if (contentType != null)
{
//dc.Refresh(new Guid(DistributedCache.ContentTypeCacheRefresherId), x => x.Id, contentType);
dc.RefreshByJson(new Guid(DistributedCache.ContentTypeCacheRefresherId),
ContentTypeCacheRefresher.SerializeToJsonPayload(false, contentType));
}
}
/// <summary>
/// Remove all cache for a given media type
/// </summary>
/// <param name="dc"></param>
/// <param name="mediaType"></param>
public static void RefreshMediaTypeCache(this DistributedCache dc, IMediaType mediaType)
{
if (mediaType != null)
{
//dc.Refresh(new Guid(DistributedCache.ContentTypeCacheRefresherId), x => x.Id, mediaType);
dc.RefreshByJson(new Guid(DistributedCache.ContentTypeCacheRefresherId),
ContentTypeCacheRefresher.SerializeToJsonPayload(false, mediaType));
}
}
/// <summary>
/// Remove all cache for a given content type
/// </summary>
@@ -394,12 +378,29 @@ namespace Umbraco.Web.Cache
{
if (contentType != null)
{
//dc.Remove(new Guid(DistributedCache.ContentTypeCacheRefresherId), x => x.Id, contentType);
dc.RefreshByJson(new Guid(DistributedCache.ContentTypeCacheRefresherId),
ContentTypeCacheRefresher.SerializeToJsonPayload(true, contentType));
}
}
#endregion
#region Media type cache
/// <summary>
/// Remove all cache for a given media type
/// </summary>
/// <param name="dc"></param>
/// <param name="mediaType"></param>
public static void RefreshMediaTypeCache(this DistributedCache dc, IMediaType mediaType)
{
if (mediaType != null)
{
dc.RefreshByJson(new Guid(DistributedCache.ContentTypeCacheRefresherId),
ContentTypeCacheRefresher.SerializeToJsonPayload(false, mediaType));
}
}
/// <summary>
/// Remove all cache for a given media type
/// </summary>
@@ -409,13 +410,46 @@ namespace Umbraco.Web.Cache
{
if (mediaType != null)
{
//dc.Remove(new Guid(DistributedCache.ContentTypeCacheRefresherId), x => x.Id, mediaType);
dc.RefreshByJson(new Guid(DistributedCache.ContentTypeCacheRefresherId),
ContentTypeCacheRefresher.SerializeToJsonPayload(true, mediaType));
}
}
}
#endregion
#region Media type cache
/// <summary>
/// Remove all cache for a given media type
/// </summary>
/// <param name="dc"></param>
/// <param name="memberType"></param>
public static void RefreshMemberTypeCache(this DistributedCache dc, IMemberType memberType)
{
if (memberType != null)
{
dc.RefreshByJson(new Guid(DistributedCache.ContentTypeCacheRefresherId),
ContentTypeCacheRefresher.SerializeToJsonPayload(false, memberType));
}
}
/// <summary>
/// Remove all cache for a given media type
/// </summary>
/// <param name="dc"></param>
/// <param name="memberType"></param>
public static void RemoveMemberTypeCache(this DistributedCache dc, IMemberType memberType)
{
if (memberType != null)
{
dc.RefreshByJson(new Guid(DistributedCache.ContentTypeCacheRefresherId),
ContentTypeCacheRefresher.SerializeToJsonPayload(true, memberType));
}
}
#endregion
#region Stylesheet Cache
public static void RefreshStylesheetPropertyCache(this DistributedCache dc, global::umbraco.cms.businesslogic.web.StylesheetProperty styleSheetProperty)

View File

@@ -292,8 +292,10 @@ namespace umbraco.controls
//to avoid the multiple cache flushing when each property is set using the legacy ContentType class,
//which has been reduced to the else-clause.
//For IContentType and IMediaType the cache will only be flushed upon saving.
if (_contentType.ContentTypeItem is IContentType || _contentType.ContentTypeItem is IMediaType)
{
//if (_contentType.ContentTypeItem is IContentType
// || _contentType.ContentTypeItem is IMediaType
// || _contentType.ContentTypeItem is IMemberType)
//{
_contentType.ContentTypeItem.Name = txtName.Text;
_contentType.ContentTypeItem.Alias = txtAlias.Text;
_contentType.ContentTypeItem.Icon = ddlIcons.SelectedValue;
@@ -331,40 +333,40 @@ namespace umbraco.controls
}
_contentType.Save();
}
else //Legacy approach for supporting MemberType
{
if (asyncState.HasNameChanged())
_contentType.Text = txtName.Text;
//}
//else //Legacy approach for supporting MemberType
//{
// if (asyncState.HasNameChanged())
// _contentType.Text = txtName.Text;
if (asyncState.HasAliasChanged())
_contentType.Alias = txtAlias.Text;
// if (asyncState.HasAliasChanged())
// _contentType.Alias = txtAlias.Text;
_contentType.IconUrl = ddlIcons.SelectedValue;
_contentType.Description = description.Text;
_contentType.Thumbnail = ddlThumbnails.SelectedValue;
// _contentType.IconUrl = ddlIcons.SelectedValue;
// _contentType.Description = description.Text;
// _contentType.Thumbnail = ddlThumbnails.SelectedValue;
SavePropertyTypesLegacy(asyncState.SaveArgs);
// SavePropertyTypesLegacy(asyncState.SaveArgs);
var tabs = SaveTabs();
foreach (var tab in tabs)
{
_contentType.SetTabName(tab.Item1, tab.Item2);
_contentType.SetTabSortOrder(tab.Item1, tab.Item3);
}
// var tabs = SaveTabs();
// foreach (var tab in tabs)
// {
// _contentType.SetTabName(tab.Item1, tab.Item2);
// _contentType.SetTabSortOrder(tab.Item1, tab.Item3);
// }
_contentType.AllowedChildContentTypeIDs = SaveAllowedChildTypes();
_contentType.AllowAtRoot = allowAtRoot.Checked;
// _contentType.AllowedChildContentTypeIDs = SaveAllowedChildTypes();
// _contentType.AllowAtRoot = allowAtRoot.Checked;
_contentType.Save();
// _contentType.Save();
// Only if the doctype alias changed, cause a regeneration of the xml cache file since
// the xml element names will need to be updated to reflect the new alias
if (asyncState.HasAliasChanged() || asyncState.HasAnyPropertyAliasChanged(_contentType))
{
_contentType.RebuildXmlStructuresForContent();
}
}
// // Only if the doctype alias changed, cause a regeneration of the xml cache file since
// // the xml element names will need to be updated to reflect the new alias
// if (asyncState.HasAliasChanged() || asyncState.HasAnyPropertyAliasChanged(_contentType))
// {
// _contentType.RebuildXmlStructuresForContent();
// }
//}
Trace.Write("ContentTypeControlNew", "task completing");
};
@@ -1042,8 +1044,10 @@ jQuery(document).ready(function() {{ refreshDropDowns(); }});
int propertyId = int.Parse(e.Item.Cells[0].Text);
string rawName = string.Empty;
if (_contentType.ContentTypeItem is IContentType || _contentType.ContentTypeItem is IMediaType)
{
//if (_contentType.ContentTypeItem is IContentType
// || _contentType.ContentTypeItem is IMediaType
// || _contentType.ContentTypeItem is IMemberType)
//{
var propertyType = _contentType.ContentTypeItem.PropertyTypes.FirstOrDefault(x => x.Id == propertyId);
if (propertyType != null && string.IsNullOrEmpty(propertyType.Alias) == false)
{
@@ -1051,13 +1055,13 @@ jQuery(document).ready(function() {{ refreshDropDowns(); }});
_contentType.ContentTypeItem.RemovePropertyType(propertyType.Alias);
_contentType.Save();
}
}
else
{
cms.businesslogic.propertytype.PropertyType pt = cms.businesslogic.propertytype.PropertyType.GetPropertyType(propertyId);
rawName = pt.GetRawName();
pt.delete();
}
//}
//else
//{
// cms.businesslogic.propertytype.PropertyType pt = cms.businesslogic.propertytype.PropertyType.GetPropertyType(propertyId);
// rawName = pt.GetRawName();
// pt.delete();
//}
RaiseBubbleEvent(new object(), new SaveClickEventArgs("Property ´" + rawName + "´ deleted"));
@@ -1128,20 +1132,22 @@ jQuery(document).ready(function() {{ refreshDropDowns(); }});
//we need to re-set the UmbracoContext since it will be nulled and our cache handlers need it
global::Umbraco.Web.UmbracoContext.Current = asyncState.UmbracoContext;
if (_contentType.ContentTypeItem is IContentType || _contentType.ContentTypeItem is IMediaType)
{
//if (_contentType.ContentTypeItem is IContentType
// || _contentType.ContentTypeItem is IMediaType
// || _contentType.ContentTypeItem is IMemberType)
//{
_contentType.ContentTypeItem.RemovePropertyType(asyncState.GenericPropertyWrapper.PropertyType.Alias);
_contentType.Save();
}
else
{
//if it is not a document type or a media type, then continue to call the legacy delete() method.
//the new API for document type and media type's will ensure that the data is removed correctly and that
//the cache is flushed correctly (using events). If it is not one of these types, we'll rever to the
//legacy operation (... like for members i suppose ?)
asyncState.GenericPropertyWrapper.GenricPropertyControl.PropertyType.delete();
//}
//else
//{
// //if it is not a document type or a media type, then continue to call the legacy delete() method.
// //the new API for document type and media type's will ensure that the data is removed correctly and that
// //the cache is flushed correctly (using events). If it is not one of these types, we'll rever to the
// //legacy operation (... like for members i suppose ?)
// asyncState.GenericPropertyWrapper.GenricPropertyControl.PropertyType.delete();
}
//}
Trace.Write("ContentTypeControlNew", "task completing");
};
@@ -1277,15 +1283,17 @@ jQuery(document).ready(function() {{ refreshDropDowns(); }});
{
if (txtNewTab.Text.Trim() != "")
{
if (_contentType.ContentTypeItem is IContentType || _contentType.ContentTypeItem is IMediaType)
{
//if (_contentType.ContentTypeItem is IContentType
// || _contentType.ContentTypeItem is IMediaType
// || _contentType.ContentTypeItem is IMemberType)
//{
_contentType.ContentTypeItem.AddPropertyGroup(txtNewTab.Text);
_contentType.Save();
}
else
{
_contentType.AddVirtualTab(txtNewTab.Text);
}
//}
//else
//{
// _contentType.AddVirtualTab(txtNewTab.Text);
//}
LoadContentType();
@@ -1317,15 +1325,17 @@ Umbraco.Controls.TabView.onActiveTabChange(function(tabviewid, tabid, tabs) {
if (e.CommandName == "Delete")
{
int propertyGroupId = int.Parse(e.Item.Cells[0].Text);
if (_contentType.ContentTypeItem is IContentType || _contentType.ContentTypeItem is IMediaType)
{
//if (_contentType.ContentTypeItem is IContentType
// || _contentType.ContentTypeItem is IMediaType
// || _contentType.ContentTypeItem is IMemberType)
//{
var propertyGroup = _contentType.ContentTypeItem.PropertyGroups.FirstOrDefault(x => x.Id == propertyGroupId);
if (propertyGroup != null && string.IsNullOrEmpty(propertyGroup.Name) == false)
{
_contentType.ContentTypeItem.PropertyGroups.Remove(propertyGroup.Name);
_contentType.Save();
}
}
//}
_contentType.DeleteVirtualTab(propertyGroupId);

View File

@@ -247,6 +247,16 @@ namespace umbraco.cms.businesslogic.member
}
#endregion
#region Protected Methods
protected override void setupNode()
{
var memberType = ApplicationContext.Current.Services.MemberTypeService.Get(Id);
SetupNode(memberType);
}
#endregion
#region Private Methods
private void SetupNode(IMemberType contentType)