using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using AutoMapper; using umbraco.interfaces; using Umbraco.Core; using Umbraco.Core.CodeAnnotations; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping { /// /// Converts an IUserGroup instance into a dictionary of permissions by category /// internal class PermissionsResolver : ValueResolver>> { private readonly ILocalizedTextService _textService; public PermissionsResolver(ILocalizedTextService textService) { if (textService == null) throw new ArgumentNullException("textService"); _textService = textService; } protected override IDictionary> ResolveCore(IUserGroup source) { return ActionsResolver.Current.Actions .Where(x => x.CanBePermissionAssigned) .Select(x => GetPermission(x, source)) .GroupBy(x => x.Category) .ToDictionary(x => x.Key, x => (IEnumerable)x.ToArray()); } private Permission GetPermission(IAction action, IUserGroup source) { var result = new Permission(); var attribute = action.GetType().GetCustomAttribute(false); result.Category = attribute == null ? _textService.Localize(string.Format("actionCategories/{0}", Constants.Conventions.PermissionCategories.OtherCategory)) : _textService.Localize(string.Format("actionCategories/{0}", attribute.Category)); result.Name = attribute == null || attribute.Name.IsNullOrWhiteSpace() ? _textService.Localize(string.Format("actions/{0}", action.Alias)) : attribute.Name; result.Description = _textService.Localize(String.Format("actionDescriptions/{0}", action.Alias)); result.Icon = action.Icon; result.Checked = source.Permissions.Contains(action.Letter.ToString(CultureInfo.InvariantCulture)); result.Letter = action.Letter.ToString(CultureInfo.InvariantCulture); return result; } } }