diff --git a/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesCustomExportStep.cs b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesCustomExportStep.cs new file mode 100644 index 000000000..4f0880685 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesCustomExportStep.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Orchard.Events; + +namespace Orchard.Roles.ImportExport { + public interface ICustomExportStep : IEventHandler { + void Register(IList steps); + } + + public class RolesCustomExportStep : ICustomExportStep { + public void Register(IList steps) { + steps.Add("Roles"); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs new file mode 100644 index 000000000..d0b67e04d --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using Orchard.Data; +using Orchard.Events; +using Orchard.Roles.Models; + +namespace Orchard.Roles.ImportExport { + public interface IExportEventHandler : IEventHandler { + void Exporting(dynamic context); + void Exported(dynamic context); + } + + public class RolesExportEventHandler : IExportEventHandler { + private readonly IRepository _roleRecordepository; + + public RolesExportEventHandler(IRepository roleRecordRepository) { + _roleRecordepository = roleRecordRepository; + } + + public void Exporting(dynamic context) {} + + public void Exported(dynamic context) { + + if (!((IEnumerable) context.ExportOptions.CustomSteps).Contains("Roles")) { + return; + } + + var roles = _roleRecordepository.Table.ToList(); + + if (!roles.Any()) { + return; + } + + var root = new XElement("Roles"); + context.Document.Element("Orchard").Add(root); + + foreach (var role in roles) { + root.Add(new XElement("Role", + new XAttribute("Name", role.Name), + new XAttribute("Permissions", string.Join(",", role.RolesPermissions.Select(rolePermission => rolePermission.Permission.Name))))); + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesRecipeHandler.cs new file mode 100644 index 000000000..ab7134dfa --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesRecipeHandler.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Orchard.Data; +using Orchard.Localization; +using Orchard.Logging; +using Orchard.Recipes.Models; +using Orchard.Recipes.Services; +using Orchard.Roles.Models; +using Orchard.Roles.Services; + +namespace Orchard.Roles.ImportExport { + public class RolesRecipeHandler : IRecipeHandler { + private readonly IRoleService _roleService; + private readonly IRepository _roleRecordRepository; + private readonly IRepository _permissionRepository; + + public RolesRecipeHandler(IRoleService roleService, + IRepository roleRecordRepository, + IRepository permissionRepository) { + _roleService = roleService; + _roleRecordRepository = roleRecordRepository; + _permissionRepository = permissionRepository; + Logger = NullLogger.Instance; + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + public ILogger Logger { get; set; } + + public void ExecuteRecipeStep(RecipeContext recipeContext) { + if (!String.Equals(recipeContext.RecipeStep.Name, "Roles", StringComparison.OrdinalIgnoreCase)) { + return; + } + + var installedPermissions = _roleService.GetInstalledPermissions().SelectMany(p => p.Value).ToList(); + + foreach (var roleElement in recipeContext.RecipeStep.Step.Elements()) { + var roleName = roleElement.Attribute("Name").Value; + + var role = _roleService.GetRoleByName(roleName); + if (role == null) { + _roleService.CreateRole(roleName); + role = _roleService.GetRoleByName(roleName); + } + + var permissions = roleElement.Attribute("Permissions").Value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + // only import permissions for currenlty installed modules + var permissionsValid = permissions.Where(permission => installedPermissions.Any(x => x.Name == permission)).ToList(); + + // union to keep existing permissions + _roleService.UpdateRole(role.Id, role.Name, permissionsValid.Union(role.RolesPermissions.Select(p => p.Permission.Name))); + } + recipeContext.Executed = true; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Roles/Orchard.Roles.csproj b/src/Orchard.Web/Modules/Orchard.Roles/Orchard.Roles.csproj index 8cda89c54..6e92f3250 100644 --- a/src/Orchard.Web/Modules/Orchard.Roles/Orchard.Roles.csproj +++ b/src/Orchard.Web/Modules/Orchard.Roles/Orchard.Roles.csproj @@ -56,6 +56,9 @@ + + +