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) { %>
+<%
+ } %>
\ 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 @@
+
+