diff --git a/.hgignore b/.hgignore index dc8bbfe68..704e42375 100644 --- a/.hgignore +++ b/.hgignore @@ -11,3 +11,4 @@ glob:*.sln.cache glob:src/Orchard.Web/Modules/Orchard.DevTools/Module.txt glob:src/Orchard.Web/Modules/Orchard.Sandbox/Module.txt glob:src/Orchard.Web/Media/* +glob:desktop.ini diff --git a/src/Orchard.Specs/Modules.feature b/src/Orchard.Specs/Modules.feature new file mode 100644 index 000000000..63fbb1c6a --- /dev/null +++ b/src/Orchard.Specs/Modules.feature @@ -0,0 +1,11 @@ +Feature: Module management + In order add and enable features + As a root Orchard system operator + I want to install and enable modules and enable features + +Scenario: Default modules are listed + Given I have installed Orchard + When I go to "admin/modules" + Then I should see "Installed Modules" + And I should see "

Themes

" + And the status should be 200 OK diff --git a/src/Orchard.Specs/Modules.feature.cs b/src/Orchard.Specs/Modules.feature.cs new file mode 100644 index 000000000..2090eff59 --- /dev/null +++ b/src/Orchard.Specs/Modules.feature.cs @@ -0,0 +1,74 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (http://www.specflow.org/). +// SpecFlow Version:1.2.0.0 +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Orchard.Specs +{ + using TechTalk.SpecFlow; + + + [NUnit.Framework.TestFixtureAttribute()] + [NUnit.Framework.DescriptionAttribute("Module management")] + public partial class ModuleManagementFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + +#line 1 "Modules.feature" +#line hidden + + [NUnit.Framework.TestFixtureSetUpAttribute()] + public virtual void FeatureSetup() + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Module management", "In order add and enable features\r\nAs a root Orchard system operator\r\nI want to in" + + "stall and enable modules and enable features", ((string[])(null))); + testRunner.OnFeatureStart(featureInfo); + } + + [NUnit.Framework.TestFixtureTearDownAttribute()] + public virtual void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioStart(scenarioInfo); + } + + [NUnit.Framework.TearDownAttribute()] + public virtual void ScenarioTearDown() + { + testRunner.OnScenarioEnd(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Default modules are listed")] + public virtual void DefaultModulesAreListed() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Default modules are listed", ((string[])(null))); +#line 6 +this.ScenarioSetup(scenarioInfo); +#line 7 + testRunner.Given("I have installed Orchard"); +#line 8 + testRunner.When("I go to \"admin/modules\""); +#line 9 + testRunner.Then("I should see \"Installed Modules\""); +#line 10 + testRunner.And("I should see \"

Themes

\""); +#line 11 + testRunner.And("the status should be 200 OK"); +#line hidden + testRunner.CollectScenarioErrors(); + } + } +} diff --git a/src/Orchard.Specs/Orchard.Specs.csproj b/src/Orchard.Specs/Orchard.Specs.csproj index 8d160a754..96cf0b66b 100644 --- a/src/Orchard.Specs/Orchard.Specs.csproj +++ b/src/Orchard.Specs/Orchard.Specs.csproj @@ -111,6 +111,11 @@ + + True + True + Modules.feature + True True @@ -165,6 +170,10 @@ Always + + SpecFlowSingleFileGenerator + Modules.feature.cs + SpecFlowSingleFileGenerator MultiTenancy.feature.cs diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index a43a3b945..e9ae73f24 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -3,8 +3,15 @@ using Orchard.Modules.ViewModels; namespace Orchard.Modules.Controllers { public class AdminController : Controller { + private readonly IModuleService _moduleService; + + public AdminController(IModuleService moduleService) { + _moduleService = moduleService; + } + public ActionResult Index() { - return View(new ModulesIndexViewModel()); + var modules = _moduleService.GetInstalledModules(); + return View(new ModulesIndexViewModel {Modules = modules}); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Models/Module.cs b/src/Orchard.Web/Modules/Orchard.Modules/Models/Module.cs new file mode 100644 index 000000000..0fc26089a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/Models/Module.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using Orchard.Environment.Extensions.Models; + +namespace Orchard.Modules.Models { + public class Module : IModule { + public string ModuleName { get; set; } + public string DisplayName { get; set; } + public string Description { get; set; } + public string Version { get; set; } + public string Author { get; set; } + public string HomePage { get; set; } + public string Tags { get; set; } + public IEnumerable Features { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj index 84e84c03f..2a7864520 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj +++ b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj @@ -63,8 +63,10 @@ + + diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Services/ModuleService.cs b/src/Orchard.Web/Modules/Orchard.Modules/Services/ModuleService.cs new file mode 100644 index 000000000..0cd468f9a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/Services/ModuleService.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.Environment.Extensions; +using Orchard.Modules.Models; + +namespace Orchard.Modules.Services { + public class ModuleService : IModuleService { + private readonly IExtensionManager _extensionManager; + + public ModuleService(IExtensionManager extensionManager) { + _extensionManager = extensionManager; + } + + public IModule GetModuleByName(string moduleName) { + return null; + } + + public IEnumerable GetInstalledModules() { + return + _extensionManager.AvailableExtensions().Where( + e => String.Equals(e.ExtensionType, "Module", StringComparison.OrdinalIgnoreCase)).Select( + descriptor => (new Module { + ModuleName = descriptor.Name, + DisplayName = descriptor.DisplayName, + Description = descriptor.Description, + Version = descriptor.Version, + Author = descriptor.Author, + HomePage = descriptor.WebSite, + Tags = descriptor.Tags + }) as IModule); + } + + public void InstallModule(HttpPostedFileBase file) { + } + + public void UninstallModule(string moduleName) { + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/ModulesIndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/ModulesIndexViewModel.cs index c0fb5a8e1..248e2881a 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/ModulesIndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/ViewModels/ModulesIndexViewModel.cs @@ -1,6 +1,8 @@ -using Orchard.Mvc.ViewModels; +using System.Collections.Generic; +using Orchard.Mvc.ViewModels; namespace Orchard.Modules.ViewModels { public class ModulesIndexViewModel : BaseViewModel { + public IEnumerable Modules { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Index.ascx b/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Index.ascx index c47212b04..6b9f34254 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Index.ascx +++ b/src/Orchard.Web/Modules/Orchard.Modules/Views/Admin/Index.ascx @@ -2,4 +2,14 @@ <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.Modules.ViewModels"%>

<%=Html.TitleForPage(T("Manage Modules").ToString()) %>

-

manage the modules

\ No newline at end of file +

<%=T("Installed Modules") %>

+<% if (Model.Modules.Count() > 0) { %> +
    <% + foreach (var module in Model.Modules.OrderBy(m => m.DisplayName)) { %> +
  • +

    <%=Html.Encode(module.DisplayName) %>

    +

    <%=module.Description != null ? Html.Encode(module.Description) : T("no description") %>

    +
  • <% + } %> +
<% + } %> \ No newline at end of file diff --git a/src/Orchard/Modules/IModule.cs b/src/Orchard/Modules/IModule.cs new file mode 100644 index 000000000..4bd53880c --- /dev/null +++ b/src/Orchard/Modules/IModule.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using Orchard.Environment.Extensions.Models; + +namespace Orchard.Modules { + public interface IModule { + string ModuleName { get; set; } + string DisplayName { get; set; } + string Description { get; set; } + string Version { get; set; } + string Author { get; set; } + string HomePage { get; set; } + string Tags { get; set; } + IEnumerable Features { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard/Modules/IModuleService.cs b/src/Orchard/Modules/IModuleService.cs new file mode 100644 index 000000000..e717af79a --- /dev/null +++ b/src/Orchard/Modules/IModuleService.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Web; + +namespace Orchard.Modules { + public interface IModuleService : IDependency { + IModule GetModuleByName(string moduleName); + IEnumerable GetInstalledModules(); + void InstallModule(HttpPostedFileBase file); + void UninstallModule(string moduleName); + } +} \ No newline at end of file diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 1ea08b201..44589f27c 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -190,6 +190,8 @@ + +