From 6b358328722f88dbb7281c732ae1949e43e4cdaf Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 5 Mar 2013 11:51:50 -0800 Subject: [PATCH] Adding Recipes manager screen --HG-- branch : 1.x extra : rebase_source : 40b859a2e2fbae6d64aa5b092dd725241a4522b9 --- .../Modules/Orchard.Modules/AdminMenu.cs | 4 +- .../Controllers/AdminController.cs | 61 +++++++++++++++++++ .../Orchard.Modules/Orchard.Modules.csproj | 9 +++ .../ViewModels/RecipesViewModel.cs | 14 +++++ .../Views/Admin/Recipes.cshtml | 39 ++++++++++++ 5 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Modules/ViewModels/RecipesViewModel.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Recipes.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Modules/AdminMenu.cs b/src/Orchard.Web/Modules/Orchard.Modules/AdminMenu.cs index 3fcbf4553..66f2406d5 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/AdminMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/AdminMenu.cs @@ -14,7 +14,9 @@ namespace Orchard.Modules { builder.AddImageSet("modules") .Add(T("Modules"), "9", menu => menu.Action("Features", "Admin", new {area = "Orchard.Modules"}).Permission(Permissions.ManageFeatures) .Add(T("Features"), "0", item => item.Action("Features", "Admin", new {area = "Orchard.Modules"}).Permission(Permissions.ManageFeatures).LocalNav()) - .Add(T("Installed"), "1", item => item.Action("Index", "Admin", new {area = "Orchard.Modules"}).Permission(StandardPermissions.SiteOwner).LocalNav())); + .Add(T("Installed"), "1", item => item.Action("Index", "Admin", new { area = "Orchard.Modules" }).Permission(StandardPermissions.SiteOwner).LocalNav()) + .Add(T("Recipes"), "2", item => item.Action("Recipes", "Admin", new { area = "Orchard.Modules" }).Permission(StandardPermissions.SiteOwner).LocalNav()) + ); } } } diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index 305630f46..f17c8bd8f 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -14,6 +14,8 @@ using Orchard.Modules.Events; using Orchard.Modules.Models; using Orchard.Modules.Services; using Orchard.Modules.ViewModels; +using Orchard.Recipes.Models; +using Orchard.Recipes.Services; using Orchard.Reports.Services; using Orchard.Security; using Orchard.UI.Navigation; @@ -28,6 +30,8 @@ namespace Orchard.Modules.Controllers { private readonly IReportsCoordinator _reportsCoordinator; private readonly IExtensionManager _extensionManager; private readonly IFeatureManager _featureManager; + private readonly IRecipeHarvester _recipeHarvester; + private readonly IRecipeManager _recipeManager; private readonly ShellDescriptor _shellDescriptor; public AdminController( @@ -38,6 +42,8 @@ namespace Orchard.Modules.Controllers { IReportsCoordinator reportsCoordinator, IExtensionManager extensionManager, IFeatureManager featureManager, + IRecipeHarvester recipeHarvester, + IRecipeManager recipeManager, ShellDescriptor shellDescriptor, IShapeFactory shapeFactory) { @@ -48,6 +54,8 @@ namespace Orchard.Modules.Controllers { _reportsCoordinator = reportsCoordinator; _extensionManager = extensionManager; _featureManager = featureManager; + _recipeHarvester = recipeHarvester; + _recipeManager = recipeManager; _shellDescriptor = shellDescriptor; Shape = shapeFactory; @@ -97,6 +105,59 @@ namespace Orchard.Modules.Controllers { }); } + public ActionResult Recipes() { + if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to manage modules"))) + return new HttpUnauthorizedResult(); + + IEnumerable modules = _extensionManager.AvailableExtensions() + .Where(extensionDescriptor => DefaultExtensionTypes.IsModule(extensionDescriptor.ExtensionType)) + .OrderBy(extensionDescriptor => extensionDescriptor.Name) + .Select(extensionDescriptor => new ModuleEntry { Descriptor = extensionDescriptor }); + + var viewModel = new RecipesViewModel(); + + if (_recipeHarvester != null) { + viewModel.Modules = modules.Select(x => new ModuleRecipesViewModel { + Module = x, + Recipes = _recipeHarvester.HarvestRecipes(x.Descriptor.Id).ToList() + }) + .Where(x => x.Recipes.Any()); + } + + return View(viewModel); + + } + + [HttpPost, ActionName("Recipes")] + public ActionResult RecipesPOST(string moduleId, string name) { + if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to manage modules"))) + return new HttpUnauthorizedResult(); + + ModuleEntry module = _extensionManager.AvailableExtensions() + .Where(extensionDescriptor => extensionDescriptor.Id == moduleId) + .Select(extensionDescriptor => new ModuleEntry { Descriptor = extensionDescriptor }).FirstOrDefault(); + + if (module == null) { + return HttpNotFound(); + } + + Recipe recipe = _recipeHarvester.HarvestRecipes(module.Descriptor.Id).FirstOrDefault(x => x.Name == name); + + if (recipe == null) { + return HttpNotFound(); + } + + try { + _recipeManager.Execute(recipe); + } + catch(Exception e) { + Logger.Error(e, "Error while executing recipe {0} in {1}", moduleId, name); + Services.Notifier.Error(T("Recipes contains {0} unsupported module installation steps.", recipe.Name)); + } + + return RedirectToAction("Recipes"); + + } public ActionResult Features() { if (!Services.Authorizer.Authorize(Permissions.ManageFeatures, T("Not allowed to manage features"))) return new HttpUnauthorizedResult(); diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj index d0fd029b5..8870475e2 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj +++ b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj @@ -20,6 +20,11 @@ + false + + + + true @@ -65,6 +70,7 @@ + @@ -108,6 +114,9 @@ + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/RecipesViewModel.cs b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/RecipesViewModel.cs new file mode 100644 index 000000000..02c6fb86b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/RecipesViewModel.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Orchard.Modules.Models; +using Orchard.Recipes.Models; + +namespace Orchard.Modules.ViewModels { + public class RecipesViewModel { + public IEnumerable Modules { get; set; } + } + + public class ModuleRecipesViewModel { + public ModuleEntry Module { get; set; } + public IEnumerable Recipes { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Recipes.cshtml b/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Recipes.cshtml new file mode 100644 index 000000000..a9166145d --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Recipes.cshtml @@ -0,0 +1,39 @@ +@using Orchard.Utility.Extensions +@model Orchard.Modules.ViewModels.RecipesViewModel + +@{ + Layout.Title = T("Recipes"); +} +@using (Html.BeginFormAntiForgeryPost()) { + if (Model.Modules.Any()) { +
    + @foreach (var moduleEntry in Model.Modules.OrderBy(m => m.Module.Descriptor.Name)) { + var module = moduleEntry.Module; + var descriptor = module.Descriptor; + +
  • +
    +
    +

    @descriptor.Name - @T("Version: {0}", !string.IsNullOrEmpty(descriptor.Version) ? descriptor.Version : T("1.0").ToString())

    + + @*@if (!string.IsNullOrEmpty(descriptor.Description)) { +

    @descriptor.Description

    + }*@ + + @foreach (var recipe in moduleEntry.Recipes) { +
    +
    +

    @recipe.Name.CamelFriendly() - @Html.ActionLink(T("Execute").Text, "Recipes", "Admin", new {area = "Orchard.Modules", moduleId = descriptor.Id, name = recipe.Name}, new {itemprop = "UnsafeUrl"})

    +

    @(!string.IsNullOrEmpty(recipe.Description) ? recipe.Description : T("No description").ToString())

    +
    + } +
    +
    +
  • + } +
+ } + else { +

@T("No modules available").ToString()

+ } +} \ No newline at end of file