Adding detailed module installation page.

--HG--
branch : dev
This commit is contained in:
andrerod
2011-02-24 13:48:03 -08:00
parent d4933ade53
commit a46736e2f8
9 changed files with 177 additions and 11 deletions

View File

@@ -1,15 +1,17 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web.Hosting;
using System.Web.Mvc;
using System.Web.Routing;
using System.Xml.Linq;
using NuGet;
using Orchard.Environment.Configuration;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.Environment.Features;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Packaging.Models;
using Orchard.Packaging.Services;
using Orchard.Packaging.ViewModels;
@@ -19,7 +21,9 @@ using Orchard.UI.Admin;
using Orchard.UI.Navigation;
using Orchard.UI.Notify;
using Orchard.Utility.Extensions;
using ILogger = Orchard.Logging.ILogger;
using IPackageManager = Orchard.Packaging.Services.IPackageManager;
using NullLogger = Orchard.Logging.NullLogger;
namespace Orchard.Packaging.Controllers {
[OrchardFeature("Gallery")]
@@ -28,15 +32,18 @@ namespace Orchard.Packaging.Controllers {
private readonly ShellSettings _shellSettings;
private readonly IPackageManager _packageManager;
private readonly IPackagingSourceManager _packagingSourceManager;
private readonly IFeatureManager _featureManager;
public GalleryController(
ShellSettings shellSettings,
IPackageManager packageManager,
IPackagingSourceManager packagingSourceManager,
IFeatureManager featureManager,
IOrchardServices services) {
_shellSettings = shellSettings;
_packageManager = packageManager;
_packagingSourceManager = packagingSourceManager;
_featureManager = featureManager;
Services = services;
T = NullLocalizer.Instance;
@@ -211,6 +218,7 @@ namespace Orchard.Packaging.Controllers {
// maintain previous route data when generating page links
var routeData = new RouteData();
routeData.Values.Add("Options.Order", options.Order);
routeData.Values.Add("Options.SearchText", options.SearchText);
pagerShape.RouteData(routeData);
return View(packageType == DefaultExtensionTypes.Theme ? "Themes" : "Modules", new PackagingExtensionsViewModel {
@@ -226,26 +234,90 @@ namespace Orchard.Packaging.Controllers {
if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to add sources")))
return new HttpUnauthorizedResult();
var source = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault();
if (source == null) {
return HttpNotFound();
}
if (packageId.StartsWith(PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Theme))) {
return InstallPOST(packageId, version, sourceId, redirectTo);
}
IPackageRepository packageRepository = PackageRepositoryFactory.Default.CreateRepository(new PackageSource(source.FeedUrl, "Default"));
IPackage package = packageRepository.FindPackage(packageId);
ExtensionDescriptor extensionDescriptor = _packageManager.GetExtensionDescriptor(package);
List<PackagingInstallFeatureViewModel> features = extensionDescriptor.Features
.Select(featureDescriptor => new PackagingInstallFeatureViewModel {
Enable = true, // by default all features are enabled
FeatureDescriptor = featureDescriptor
}).ToList();
return View("InstallModule", new PackagingInstallViewModel {
Features = features,
ExtensionDescriptor = extensionDescriptor
});
}
[HttpPost, ActionName("InstallModule")]
public ActionResult InstallModulePOST(PackagingInstallViewModel packagingInstallViewModel, string packageId, string version, int sourceId, string redirectTo) {
if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to add sources")))
return new HttpUnauthorizedResult();
var source = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault();
if (source == null) {
return HttpNotFound();
}
try {
_packageManager.Install(packageId, version, source.FeedUrl, HostingEnvironment.MapPath("~/"));
PackageInfo packageInfo = InstallPackage(packageId, version, source);
if (packagingInstallViewModel.PackagingInstallMode == PackagingInstallMode.Custom) {
// Enable selected features
_featureManager.EnableFeatures(packagingInstallViewModel.Features
.Select(feature => feature.FeatureDescriptor.Id));
} else {
IEnumerable<FeatureDescriptor> features = _featureManager.GetAvailableFeatures()
.Where(feature => feature.Extension.Id.Equals(packageInfo.ExtensionName) &&
feature.Extension.Version.Equals(packageInfo.ExtensionVersion));
if (packageId.StartsWith(PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Theme))) {
_featureManager.EnableFeatures(features
.Select(feature => feature.Id));
}
return RedirectToAction(redirectTo == "Themes" ? "Themes" : "Modules");
}
[HttpPost, ActionName("Install")]
public ActionResult InstallPOST(string packageId, string version, int sourceId, string redirectTo) {
if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to add sources")))
return new HttpUnauthorizedResult();
var source = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault();
if (source == null) {
return HttpNotFound();
}
InstallPackage(packageId, version, source);
return RedirectToAction(redirectTo == "Themes" ? "Themes" : "Modules");
}
private PackageInfo InstallPackage(string packageId, string version, PackagingSource source) {
PackageInfo packageInfo = null;
try {
packageInfo = _packageManager.Install(packageId, version, source.FeedUrl, HostingEnvironment.MapPath("~/"));
if (DefaultExtensionTypes.IsTheme(packageInfo.ExtensionType)) {
Services.Notifier.Information(T("The theme has been successfully installed. It can be enabled in the \"Themes\" page accessible from the menu."));
}
else if (packageId.StartsWith(PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Module))) {
Services.Notifier.Information(T("The module has been successfully installed. Its features can be enabled in the \"Configuration | Features\" page accessible from the menu."));
} else if (DefaultExtensionTypes.IsModule(packageInfo.ExtensionType)) {
Services.Notifier.Information(T("The module has been successfully installed."));
}
} catch (Exception exception) {
this.Error(exception, T("Package installation failed."), Logger, Services.Notifier);
}
return RedirectToAction(redirectTo == "Themes" ? "Themes" : "Modules");
return packageInfo;
}
}
}

View File

@@ -3,7 +3,6 @@ using System.Linq;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.Localization;
using Orchard.PackageManager.Events;
using Orchard.Packaging.Models;
using Orchard.Packaging.Services;

View File

@@ -2,7 +2,7 @@
using Orchard.Environment.Extensions.Models;
using Orchard.Events;
namespace Orchard.PackageManager.Events {
namespace Orchard.Packaging.Events {
public interface IExtensionDisplayEventHandler : IEventHandler {
/// <summary>
/// Called before an extension is displayed

View File

@@ -97,6 +97,7 @@
<Compile Include="ViewModels\PackagingHarvestViewModel.cs" />
<Compile Include="ViewModels\PackagingExtensionsViewModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ViewModels\PackagingInstallViewModel.cs" />
<Compile Include="ViewModels\PackagingListViewModel.cs" />
<Compile Include="ViewModels\PackagingSourcesViewModel.cs" />
</ItemGroup>
@@ -160,6 +161,9 @@
<ItemGroup>
<Content Include="Views\GalleryUpdates\ModulesUpdates.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Gallery\InstallModule.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -1,4 +1,6 @@
using System.Collections.Generic;
using NuGet;
using Orchard.Environment.Extensions.Models;
using Orchard.Packaging.Models;
namespace Orchard.Packaging.Services {
@@ -7,5 +9,7 @@ namespace Orchard.Packaging.Services {
PackageInfo Install(IPackage package, string location, string applicationPath);
PackageInfo Install(string packageId, string version, string location, string applicationPath);
void Uninstall(string packageId, string applicationPath);
ExtensionDescriptor GetExtensionDescriptor(IPackage package);
}
}

View File

@@ -1,8 +1,14 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NuGet;
using Orchard.Environment.Descriptor;
using Orchard.Environment.Descriptor.Models;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Folders;
using Orchard.Environment.Extensions.Models;
using Orchard.Environment.Features;
using Orchard.Localization;
using Orchard.Packaging.Models;
@@ -67,6 +73,17 @@ namespace Orchard.Packaging.Services {
_packageExpander.Uninstall(packageId, applicationPath);
}
public ExtensionDescriptor GetExtensionDescriptor(IPackage package) {
IPackageFile packageFile = package.GetFiles().FirstOrDefault(file => Path.GetFileName(file.Path).Equals("module.txt", StringComparison.OrdinalIgnoreCase));
if (packageFile != null) {
using (StreamReader streamReader = new StreamReader(packageFile.GetStream())) {
return ExtensionFolders.GetDescriptorForExtension("", package.Id, DefaultExtensionTypes.Module, streamReader.ReadToEnd());
}
}
return null;
}
#endregion
}
}

View File

@@ -1,4 +1,10 @@
.orchard-packaging #main .contentItems p {
.custom_details legend {
font-size: small;
}
.custom_details {
padding-left: 30px;
}
.orchard-packaging #main .contentItems p {
margin:0;
}
.extensionName {

View File

@@ -0,0 +1,20 @@
using System.Collections.Generic;
using Orchard.Environment.Extensions.Models;
namespace Orchard.Packaging.ViewModels {
public enum PackagingInstallMode {
All,
Custom
}
public class PackagingInstallViewModel {
public List<PackagingInstallFeatureViewModel> Features { get; set; }
public ExtensionDescriptor ExtensionDescriptor { get; set; }
public PackagingInstallMode PackagingInstallMode { get; set; }
}
public class PackagingInstallFeatureViewModel {
public FeatureDescriptor FeatureDescriptor { get; set; }
public bool Enable { get; set; }
}
}

View File

@@ -0,0 +1,44 @@
@model Orchard.Packaging.ViewModels.PackagingInstallViewModel
@using Orchard.Environment.Extensions.Models;
@using Orchard.Packaging.ViewModels;
@using System.Linq;
@{
Style.Require("PackagingAdmin");
Layout.Title = T("{0} - {1} Details", Model.ExtensionDescriptor.Name, Model.ExtensionDescriptor.Version).ToString();
}
@using (Html.BeginFormAntiForgeryPost(Url.Action("InstallModule", "Gallery", new { packageId = Request.QueryString["packageId"], version = Request.QueryString["version"], sourceId = Request.QueryString["sourceId"], redirectTo = Request.QueryString["redirectTo"] }))) {
<h3>@T("Which type of installation do you want?").ToString()</h3>
<fieldset>
@Html.RadioButton("PackagingInstallMode", "All", (Model.PackagingInstallMode == PackagingInstallMode.All), new { id = "PackagingInstallMode_All" })
<label for="Features_All" class="forcheckbox">@T("Install and enable all features")</label>
</fieldset>
if (Model.Features.Count > 0) {
<fieldset>
@Html.RadioButton("PackagingInstallMode", "Custom", (Model.PackagingInstallMode == PackagingInstallMode.Custom), new { id = "PackagingInstallMode_Custom" })
<label for="Features_Custom" class="forcheckbox">@T("Custom")</label>
<div class="custom_details">
<legend>@T("Pick the features you want enabled during install").ToString()</legend>
@{ var index = 0; }
@foreach (PackagingInstallFeatureViewModel feature in Model.Features) {
<div>
@Html.HiddenFor(m => m.Features[index].FeatureDescriptor.Id)
@Html.HiddenFor(m => m.Features[index].FeatureDescriptor.Name)
@Html.EditorFor(m => m.Features[index].Enable)
<label class="forcheckbox" for="@Html.FieldIdFor(m => m.Features[index].Enable)">@feature.FeatureDescriptor.Name</label>
@{ index++; }
</div>
}
</div>
</fieldset>
}
<button class="primaryAction" type="submit">@T("Install")</button>
}