From 339bcc77ada65c37cae12995dc0bc59da812fb2f Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Sun, 9 May 2010 13:31:44 -0700 Subject: [PATCH 01/99] Some work on the MT UI --HG-- branch : dev --- .../Modules/Orchard.MultiTenancy/AdminMenu.cs | 2 +- .../Content/Admin/images/disabled.gif | Bin 0 -> 603 bytes .../Content/Admin/images/enabled.gif | Bin 0 -> 1024 bytes .../Orchard.MultiTenancy.csproj | 6 ++ .../DisplayTemplates/ActionsForDisabled.ascx | 3 + .../DisplayTemplates/ActionsForInvalid.ascx | 3 + .../DisplayTemplates/ActionsForRunning.ascx | 3 + .../ActionsForUninitialized.ascx | 3 + .../Views/Admin/Index.ascx | 67 +++++++++--------- .../Themes/TheAdmin/Styles/site.css | 4 ++ 10 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Content/Admin/images/disabled.gif create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Content/Admin/images/enabled.gif create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForDisabled.ascx create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForInvalid.ascx create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForRunning.ascx create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/AdminMenu.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/AdminMenu.cs index a62de0bd8..aab63b491 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/AdminMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/AdminMenu.cs @@ -5,7 +5,7 @@ namespace Orchard.MultiTenancy { public string MenuName { get { return "admin"; } } public void GetNavigation(NavigationBuilder builder) { - builder.Add("MultiTenancy", "2", + builder.Add("Tenants", "22", menu => menu .Add("Manage Tenants", "1.0", item => item.Action("Index", "Admin", new { area = "Orchard.MultiTenancy" }).Permission(Permissions.ManageTenants)) .Add("Add New Tenant", "1.1", item => item.Action("Add", "Admin", new { area = "Orchard.MultiTenancy" }).Permission(Permissions.ManageTenants))); diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Content/Admin/images/disabled.gif b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Content/Admin/images/disabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..42c8bde22365a15c7481853c2ca8b74bdeccd86b GIT binary patch literal 603 zcmV-h0;K&%Nk%w1VGsZi0Oo!G&`&=9|Nrb?RQv1e=ft`Cos0I*&+d|s-g$J~rk3x? z#qhPY^rD{We|Ye=w(rWu`ns<2cVqRYp}tl*?u32uoR;ZhTlu-K`m3Gtt*Yu~T;pqD z`jdbAshs3^ap`+-?}mQyotEiaPwKF&=2%Sq+tj*JG|XmI_2%K+rHK_vq%`cyqs8K=tS1-fL>aWK8#we)x=b?URneXH4U6WAmq@ z@MKo~+}O-gJmywR?#aXSj)Bc!QT42$#85Q(>ge`_Z01%_=2}wVWnAuNQq5>s;(K-D zczO4ee&T<9)Ny6pYiRk?%=hT!+g3~NYF^f0RO_>^`lFHIsh-DcRQSWbz*#@yd3oWh zpxkb0__nC%dUe4~Gxn>Z?u>!$$;0@DaQw%*^`oESaAyDi{{R30A^8LW004dfEC2ui z01yBW000NLfPR95goT9z4r54V2x~Nkeg<(&Z)Q3{owSQ{bi@JcHQ2(@BY>)C;GQP+)#8n)N_NnX1VIi?@!m>pMCK0wyd22fB*fx z_U_W^%d^vtdfLylsXLe%w7}`vm&c_iG79&_H=HW2JeczMwH&1tr^~qxP9Eyf$_Ir3v=k*6Xe>%-tStT5mY*bX(50 zu-ZLoF$b(?oN3>FbL-phucw{u*mhxS!H&qXlbN%w^gev^uz6puT8nbY;gp#dyZvT6 z&N$t+`R3BRqsf&gvroT0kaN^~;(`9z*C%G4@S1hJebem~_N~_SJ2H!pr){~rYTL!F z`G*tpjwI$EO6)vRRj_2=xyu)ds zamk^`#n-0+BbQ+m;0*!ApDc_F4D%UuK&n7_f`Q{MgFUB=$A$z)m)5kBnTHkzu{Y0u zaN*?>O$P=o%LNZKZX~rbvaqmlC=@VoDoZfuelaLeXzXU{ZP}Cgp?$Joqq%{iM}R}~ zY?m&H3@Jy=wgVO#&n8%2YVV(~!qBwB@QL$-cE?GdPTaVdBHX~(UKiu2JfW@0)g_35 z;j<~v63#$1&X`9le580<7+zdxIvUhz6~+?QxM2AS0YUYUoP`V;ho$(L9CZv5)t#0Y z^6PnIHmi5fY}99(8~CV|o70R>C*@Y~hi+j7(TbLeLoQ7c9n+t1RE0b~$0jDwEY8Eh GU=0BKCVeOX literal 0 HcmV?d00001 diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj index b94684a61..3ad5f1c63 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj @@ -71,8 +71,14 @@ + + + + + + diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForDisabled.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForDisabled.ascx new file mode 100644 index 000000000..ddf4a29bc --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForDisabled.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Environment.Configuration" %> +<%=Html.ActionLink(T("Resume").ToString(), "_enable", new {tenantName = Model.Name, area = "Orchard.MultiTenancy"}) %> \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForInvalid.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForInvalid.ascx new file mode 100644 index 000000000..94d76d5bf --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForInvalid.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Environment.Configuration" %> +<%=Html.ActionLink(T("Make Valid*").ToString(), "_setup", new {tenantName = Model.Name, area = "Orchard.MultiTenancy"}) %> \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForRunning.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForRunning.ascx new file mode 100644 index 000000000..b5892fc64 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForRunning.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Environment.Configuration" %> +<%=Html.ActionLink(T("Suspend").ToString(), "_disable", new {tenantName = Model.Name, area = "Orchard.MultiTenancy"}) %> \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx new file mode 100644 index 000000000..c259a137b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Environment.Configuration" %> +<%=Html.ActionLink(T("Setup").ToString(), "_setup", new {tenantName = Model.Name, area = "Orchard.MultiTenancy"}) %> \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx index 44c8a1d1a..82fce478f 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx @@ -1,39 +1,40 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Environment.Configuration" %> <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.MultiTenancy.ViewModels"%>

<%=Html.TitleForPage(T("List of Site's Tenants").ToString())%>

- - - - - - - - - - - - - - - - - - - - - - <% +
<%=Html.ActionLink(T("Add a Tenant").ToString(), "Add", new {area = "Orchard.MultiTenancy"}, new { @class = "button primaryAction" })%>
+
    <% foreach (var tenant in Model.TenantSettings) { %> -
- - - - - - - - <% +
  • +
    +
    +

    <% + if (tenant.State.CurrentState == TenantState.State.Running) { + //todo: (heskew) need common shared resources (in the theme?) %> + " alt="<%=_Encoded("Running") %>" title="<%=_Encoded("This tenant is currently running") %>" /><% + } + else { %> + " alt="<%=_Encoded("Not Running") %>" title="<%=_Encoded("This tenant is not running for some reason") %>" /><% + } %> + <%=Html.Encode(tenant.Name) %><% + if (!string.IsNullOrEmpty(tenant.RequestUrlHost)) { + %> - <%=Html.Link(tenant.RequestUrlHost, tenant.RequestUrlHost)%><% + } %> +

    +
    + +
    +
  • <% } %> - -
    <%=_Encoded("Name") %><%=_Encoded("Data Provider") %><%=_Encoded("ConnectionString") %><%=_Encoded("Table Prefix") %><%=_Encoded("Request Url Host") %><%=_Encoded("Request Url Prefix") %><%=_Encoded("State") %>
    <%= tenant.Name %><%= tenant.DataProvider %><%= tenant.DataConnectionString %><%= tenant.DataTablePrefix %><%= tenant.RequestUrlHost %><%= tenant.RequestUrlPrefix %><%= tenant.State %>
    + \ No newline at end of file diff --git a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css index 768ef4a9f..09488b477 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css +++ b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css @@ -767,6 +767,7 @@ table.items, textarea, input.text, input.text-box, text-align:right; } .contentItems { + clear:both; padding:0; } .properties { @@ -798,6 +799,9 @@ table.items, textarea, input.text, input.text-box, .icon { margin:0 .2em -.2em .2em; } +h3 .icon { + margin-bottom:-.05em; +} .linkButton { border:none; padding:0; From 88ea798bdac2d0e303afef4c14eda225701f2898 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Mon, 10 May 2010 00:44:52 -0700 Subject: [PATCH 02/99] A little more work on the MultiTenancy UI --HG-- branch : dev --- .../Extensions/UrlHelperExtensions.cs | 15 +++++++++ .../Orchard.MultiTenancy.csproj | 1 + .../Orchard.MultiTenancy/Views/Admin/Add.ascx | 32 +++++++++++++++---- .../Views/Admin/Index.ascx | 3 +- 4 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs new file mode 100644 index 000000000..df5f8921f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs @@ -0,0 +1,15 @@ +using System.Web.Mvc; +using Orchard.Environment.Configuration; + +namespace Orchard.MultiTenancy.Extensions { + public static class UrlHelperExtensions { + public static string Tenant(this UrlHelper urlHelper, ShellSettings tenantShellSettings) { + return string.Format( + "http://{0}/{1}", + !string.IsNullOrEmpty(tenantShellSettings.RequestUrlHost) + ? tenantShellSettings.RequestUrlHost + : urlHelper.RequestContext.HttpContext.Request.Url.Host, + tenantShellSettings.RequestUrlPrefix); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj index 3ad5f1c63..7cb57741e 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj @@ -63,6 +63,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx index eb6aca4dc..7da93552e 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx @@ -1,17 +1,35 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.MultiTenancy.ViewModels"%> - -

    <%=Html.TitleForPage(T("Add a Tenant to your Site").ToString()) %>

    - +

    <%=Html.TitleForPage(T("Add New Tenant").ToString()) %>

    <%using (Html.BeginFormAntiForgeryPost()) { %> <%= Html.ValidationSummary() %>
    - -
    - -
    +
    + + +
    +
    + + + <%=_Encoded("Example: If host is \"orchardproject.net\", the tenant site URL is \"http://orchardproject.net/\"") %> +
    +
    + <%=_Encoded("Database Setup") %> +
    + + +
    +
    + + +
    +
    + + +
    +
    " />
    diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx index 82fce478f..d20bf66db 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx @@ -1,5 +1,6 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Environment.Configuration" %> +<%@ Import Namespace="Orchard.MultiTenancy.Extensions" %> <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.MultiTenancy.ViewModels"%>

    <%=Html.TitleForPage(T("List of Site's Tenants").ToString())%>

    @@ -19,7 +20,7 @@ } %> <%=Html.Encode(tenant.Name) %><% if (!string.IsNullOrEmpty(tenant.RequestUrlHost)) { - %> - <%=Html.Link(tenant.RequestUrlHost, tenant.RequestUrlHost)%><% + %> - <%=Html.Link(Url.Tenant(tenant), Url.Tenant(tenant))%><% } %> From bfc6edc1dde18f4acc825ccfb397cdfebd99de31 Mon Sep 17 00:00:00 2001 From: Suha Can Date: Mon, 10 May 2010 13:35:07 -0700 Subject: [PATCH 03/99] - An autofac events module for dynamic proxy creation when an interface of type IEventHandler is resolved through DI. - Intercept method on the proxy calls Notify on the event-bus with appropriate conversion of event name and parameters. --HG-- branch : dev --- src/Orchard/Events/EventsInterceptor.cs | 23 ++++++++++ src/Orchard/Events/EventsModule.cs | 10 +++++ .../Events/EventsRegistrationSource.cs | 43 +++++++++++++++++++ src/Orchard/Events/IEventHandler.cs | 4 ++ src/Orchard/Orchard.Framework.csproj | 4 ++ 5 files changed, 84 insertions(+) create mode 100644 src/Orchard/Events/EventsInterceptor.cs create mode 100644 src/Orchard/Events/EventsModule.cs create mode 100644 src/Orchard/Events/EventsRegistrationSource.cs create mode 100644 src/Orchard/Events/IEventHandler.cs diff --git a/src/Orchard/Events/EventsInterceptor.cs b/src/Orchard/Events/EventsInterceptor.cs new file mode 100644 index 000000000..0c71265fe --- /dev/null +++ b/src/Orchard/Events/EventsInterceptor.cs @@ -0,0 +1,23 @@ +using System.Linq; +using Castle.Core.Interceptor; + +namespace Orchard.Events { + public class EventsInterceptor : IInterceptor { + private readonly IEventBus _eventBus; + + public EventsInterceptor(IEventBus eventBus) { + _eventBus = eventBus; + } + + public void Intercept(IInvocation invocation) { + var interfaceName = invocation.Method.DeclaringType.Name; + var methodName = invocation.Method.Name; + + var data = invocation.Method.GetParameters() + .Select((parameter, index) => new { parameter.Name, Value = invocation.Arguments[index] }) + .ToDictionary(kv => kv.Name, kv => kv.Value.ToString()); + + _eventBus.Notify(interfaceName + "_" + methodName, data); + } + } +} diff --git a/src/Orchard/Events/EventsModule.cs b/src/Orchard/Events/EventsModule.cs new file mode 100644 index 000000000..2aa10ef52 --- /dev/null +++ b/src/Orchard/Events/EventsModule.cs @@ -0,0 +1,10 @@ +using Autofac; + +namespace Orchard.Events { + public class EventsModule : Module { + protected override void Load(ContainerBuilder builder) { + builder.RegisterSource(new EventsRegistrationSource()); + base.Load(builder); + } + } +} diff --git a/src/Orchard/Events/EventsRegistrationSource.cs b/src/Orchard/Events/EventsRegistrationSource.cs new file mode 100644 index 000000000..e39d7fe51 --- /dev/null +++ b/src/Orchard/Events/EventsRegistrationSource.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using Autofac; +using Autofac.Builder; +using Autofac.Core; +using Castle.Core.Interceptor; +using Castle.DynamicProxy; + +namespace Orchard.Events { + public class EventsRegistrationSource : IRegistrationSource { + private readonly DefaultProxyBuilder _proxyBuilder; + + public EventsRegistrationSource() { + _proxyBuilder = new DefaultProxyBuilder(); + } + + public IEnumerable RegistrationsFor(Service service, Func> registrationAccessor) { + var serviceWithType = service as IServiceWithType; + if (serviceWithType == null) + yield break; + + var serviceType = serviceWithType.ServiceType; + if (!serviceType.IsInterface || !typeof(IEventHandler).IsAssignableFrom(serviceType)) + yield break; + + var interfaceProxyType = _proxyBuilder.CreateInterfaceProxyTypeWithoutTarget( + serviceType, + new Type[0], + ProxyGenerationOptions.Default); + + + var rb = RegistrationBuilder + .ForDelegate((ctx, parameters) => { + var interceptors = new IInterceptor[] { new EventsInterceptor(ctx.Resolve()) }; + var args = new object[] { interceptors, null }; + return Activator.CreateInstance(interfaceProxyType, args); + }) + .As(service); + + yield return rb.CreateRegistration(); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Events/IEventHandler.cs b/src/Orchard/Events/IEventHandler.cs new file mode 100644 index 000000000..b40f7ae9a --- /dev/null +++ b/src/Orchard/Events/IEventHandler.cs @@ -0,0 +1,4 @@ +namespace Orchard.Events { + public interface IEventHandler { + } +} diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 9beecc61b..0a8653d58 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -181,6 +181,9 @@ + + + @@ -190,6 +193,7 @@ + From 6187110957128f92b247f4803de352a97ed09a65 Mon Sep 17 00:00:00 2001 From: Bertrand Le Roy Date: Mon, 10 May 2010 14:08:12 -0700 Subject: [PATCH 04/99] Fixing orchard.proj spec build target case in specs/webhost, removing unwanted, warning-inducing references. CR: Louis --HG-- branch : dev --- src/Orchard.Specs/Hosting/WebHost.cs | 7 ++++++- src/Orchard.Specs/Orchard.Specs.csproj | 2 -- src/Orchard.Tests/Orchard.Framework.Tests.csproj | 2 -- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Orchard.Specs/Hosting/WebHost.cs b/src/Orchard.Specs/Hosting/WebHost.cs index d834cbe01..95f71b609 100644 --- a/src/Orchard.Specs/Hosting/WebHost.cs +++ b/src/Orchard.Specs/Hosting/WebHost.cs @@ -17,7 +17,12 @@ namespace Orchard.Specs.Hosting { _tempSite = Path.Get(System.IO.Path.GetTempFileName()).Delete().CreateDirectory(); - _orchardWebPath = baseDir.Parent.Parent.Parent.Combine("Orchard.Web"); + // Trying the two known relative paths to the Orchard.Web directory. + // The second one is for the target "spec" in orchard.proj. + _orchardWebPath = baseDir.Up(3).Combine("Orchard.Web"); + if (!_orchardWebPath.Exists) { + _orchardWebPath = baseDir.Up(2).Combine("src").Combine("Orchard.Web"); + } baseDir.Combine("Hosting").Combine(templateName) .DeepCopy(_tempSite); diff --git a/src/Orchard.Specs/Orchard.Specs.csproj b/src/Orchard.Specs/Orchard.Specs.csproj index 992a66ad9..346b649ba 100644 --- a/src/Orchard.Specs/Orchard.Specs.csproj +++ b/src/Orchard.Specs/Orchard.Specs.csproj @@ -63,8 +63,6 @@ False ..\..\lib\fluentnhibernate\log4net.dll - - False ..\..\lib\fluentnhibernate\NHibernate.dll diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index 00e849f60..745ae30fd 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -55,8 +55,6 @@ False ..\..\lib\fluentnhibernate\FluentNHibernate.dll - - False ..\..\lib\moq\Moq.dll From fa6ac5f0dd76fcc5d3dbe98c3295ddbe32df653e Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Mon, 10 May 2010 16:01:04 -0700 Subject: [PATCH 05/99] Some more work on the MT UI - tenant database setup can be preconfigured - site setup UI reflects available settings (e.g. if database setup is preconfigured then don't show db options) - updated jQuery from 1.4.1 to 1.4.2 (finally) --HG-- branch : dev --- src/Orchard.Specs/MultiTenancy.feature | 6 +- src/Orchard.Specs/MultiTenancy.feature.cs | 6 +- .../SqlDatabaseConnectionStringAttribute.cs | 21 + .../Controllers/AdminController.cs | 3 + .../Extensions/UrlHelperExtensions.cs | 7 +- .../Orchard.MultiTenancy.csproj | 1 + .../ViewModels/TenantsAddViewModel.cs | 7 +- .../Orchard.MultiTenancy/Views/Admin/Add.ascx | 32 +- .../ActionsForUninitialized.ascx | 4 +- .../Views/Admin/Index.ascx | 17 +- .../Controllers/SetupController.cs | 3 +- .../Orchard.Setup/Services/ISetupService.cs | 5 +- .../Orchard.Setup/Services/SetupService.cs | 14 +- .../ViewModels/SetupViewModel.cs | 3 +- .../Orchard.Setup/Views/Setup/Index.ascx | 14 +- .../Orchard.Themes/Orchard.Themes.csproj | 4 +- .../Modules/Orchard.Themes/Scripts/base.js | 15 +- .../Orchard.Themes/Scripts/jquery-1.4.1.js | 6078 ---------------- .../Scripts/jquery-1.4.1.min.js | 152 - .../Orchard.Themes/Scripts/jquery-1.4.2.js | 6239 +++++++++++++++++ .../Scripts/jquery-1.4.2.min.js | 154 + .../Orchard.Themes/Views/HeadPreload.ascx | 2 +- .../Themes/SafeMode/Views/Layout.ascx | 2 +- 23 files changed, 6503 insertions(+), 6286 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.MultiTenancy/Annotations/SqlDatabaseConnectionStringAttribute.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.Themes/Scripts/jquery-1.4.1.js delete mode 100644 src/Orchard.Web/Modules/Orchard.Themes/Scripts/jquery-1.4.1.min.js create mode 100644 src/Orchard.Web/Modules/Orchard.Themes/Scripts/jquery-1.4.2.js create mode 100644 src/Orchard.Web/Modules/Orchard.Themes/Scripts/jquery-1.4.2.min.js diff --git a/src/Orchard.Specs/MultiTenancy.feature b/src/Orchard.Specs/MultiTenancy.feature index b91693135..39f5e40ec 100644 --- a/src/Orchard.Specs/MultiTenancy.feature +++ b/src/Orchard.Specs/MultiTenancy.feature @@ -8,7 +8,7 @@ Scenario: Default site is listed And I have installed "Orchard.MultiTenancy" When I go to "Admin/MultiTenancy" Then I should see "List of Site's Tenants" - And I should see "Default" + And I should see "Default" And the status should be 200 OK Scenario: New tenant fields are required @@ -27,7 +27,7 @@ Scenario: A new tenant is created | Name | Scott | And I hit "Save" And I am redirected - Then I should see "Scott" + Then I should see "Scott" And the status should be 200 OK Scenario: A new tenant is created with uninitialized state @@ -39,7 +39,7 @@ Scenario: A new tenant is created with uninitialized state | Name | Scott | And I hit "Save" And I am redirected - Then I should see "Uninitialized" + Then I should see "
  • " And the status should be 200 OK Scenario: A new tenant goes to the setup screen diff --git a/src/Orchard.Specs/MultiTenancy.feature.cs b/src/Orchard.Specs/MultiTenancy.feature.cs index 701a66ee0..765f83947 100644 --- a/src/Orchard.Specs/MultiTenancy.feature.cs +++ b/src/Orchard.Specs/MultiTenancy.feature.cs @@ -66,7 +66,7 @@ this.ScenarioSetup(scenarioInfo); #line 10 testRunner.Then("I should see \"List of Site\'s Tenants\""); #line 11 - testRunner.And("I should see \"Default\""); + testRunner.And("I should see \"Default\""); #line 12 testRunner.And("the status should be 200 OK"); #line hidden @@ -121,7 +121,7 @@ this.ScenarioSetup(scenarioInfo); #line 29 testRunner.And("I am redirected"); #line 30 - testRunner.Then("I should see \"Scott\""); + testRunner.Then("I should see \"Scott\""); #line 31 testRunner.And("the status should be 200 OK"); #line hidden @@ -155,7 +155,7 @@ this.ScenarioSetup(scenarioInfo); #line 41 testRunner.And("I am redirected"); #line 42 - testRunner.Then("I should see \"Uninitialized\""); + testRunner.Then("I should see \"
  • \""); #line 43 testRunner.And("the status should be 200 OK"); #line hidden diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Annotations/SqlDatabaseConnectionStringAttribute.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Annotations/SqlDatabaseConnectionStringAttribute.cs new file mode 100644 index 000000000..47112ad02 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Annotations/SqlDatabaseConnectionStringAttribute.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; +using System.Data.SqlClient; + +namespace Orchard.MultiTenancy.Annotations { + public class SqlDatabaseConnectionStringAttribute : ValidationAttribute { + public override bool IsValid(object value) { + if (value is string && ((string) value).Length > 0) { + try { + var connectionStringBuilder = new SqlConnectionStringBuilder(value as string); + + //TODO: (erikpo) Should the keys be checked here to ensure that a valid combination was entered? Needs investigation. + } + catch { + return false; + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Controllers/AdminController.cs index 65c5a56c0..4f6a635ec 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Controllers/AdminController.cs @@ -38,6 +38,9 @@ namespace Orchard.MultiTenancy.Controllers { Name = viewModel.Name, RequestUrlHost = viewModel.RequestUrlHost, RequestUrlPrefix = viewModel.RequestUrlPrefix, + DataProvider = viewModel.DatabaseOptions != null ? ((bool)viewModel.DatabaseOptions ? "SQLite" : "SqlServer") : null, + DataConnectionString = viewModel.DatabaseConnectionString, + DataTablePrefix = viewModel.DatabaseTablePrefix, State = new TenantState("Uninitialized") }); diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs index df5f8921f..54a8233ac 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Extensions/UrlHelperExtensions.cs @@ -4,12 +4,15 @@ using Orchard.Environment.Configuration; namespace Orchard.MultiTenancy.Extensions { public static class UrlHelperExtensions { public static string Tenant(this UrlHelper urlHelper, ShellSettings tenantShellSettings) { + //info: (heskew) might not keep the port insertion around beyond... + var port = urlHelper.RequestContext.HttpContext.Request.Url.Port; return string.Format( - "http://{0}/{1}", + "http://{0}{2}/{1}", !string.IsNullOrEmpty(tenantShellSettings.RequestUrlHost) ? tenantShellSettings.RequestUrlHost : urlHelper.RequestContext.HttpContext.Request.Url.Host, - tenantShellSettings.RequestUrlPrefix); + tenantShellSettings.RequestUrlPrefix, + port != 80 ? string.Format(":{0}", port) : ""); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj index 7cb57741e..029f401b2 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj @@ -61,6 +61,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/ViewModels/TenantsAddViewModel.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/ViewModels/TenantsAddViewModel.cs index 98ac2ade8..acbd903ef 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/ViewModels/TenantsAddViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/ViewModels/TenantsAddViewModel.cs @@ -1,13 +1,18 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; +using Orchard.MultiTenancy.Annotations; using Orchard.Mvc.ViewModels; namespace Orchard.MultiTenancy.ViewModels { public class TenantsAddViewModel : BaseViewModel { - [Required, DisplayName("Tenant Name:")] + [Required] public string Name { get; set; } public string RequestUrlHost { get; set; } public string RequestUrlPrefix { get; set; } + public bool? DatabaseOptions { get; set; } + [SqlDatabaseConnectionString] + public string DatabaseConnectionString { get; set; } + public string DatabaseTablePrefix { get; set; } } } diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx index 7da93552e..5963d2b3b 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Add.ascx @@ -1,6 +1,7 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.MultiTenancy.ViewModels"%> +<% Html.RegisterFootScript("multitenancy.js"); %>

    <%=Html.TitleForPage(T("Add New Tenant").ToString()) %>

    <%using (Html.BeginFormAntiForgeryPost()) { %> <%= Html.ValidationSummary() %> @@ -18,18 +19,27 @@
    <%=_Encoded("Database Setup") %>
    - - + /> +
    -
    - - -
    -
    - - -
    -
    +
    + <%=Html.RadioButtonFor(svm => svm.DatabaseOptions, true, new { id = "builtinDatabaseOption" })%> + +
    +
    + <%=Html.RadioButtonFor(svm => svm.DatabaseOptions, false, new { id = "sqlDatabaseOption" })%> + + + + <%=Html.EditorFor(svm => svm.DatabaseConnectionString)%> + <%=_Encoded("Example:") %>
    <%=_Encoded("Data Source=sqlServerName;Initial Catalog=dbName;Persist Security Info=True;User ID=userName;Password=password") %>
    +
    + + + <%=Html.EditorFor(svm => svm.DatabaseTablePrefix)%> + +
    +
    " />
    diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx index c259a137b..d918cf219 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/DisplayTemplates/ActionsForUninitialized.ascx @@ -1,3 +1,5 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.MultiTenancy.Extensions"%> +<%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.Environment.Configuration" %> -<%=Html.ActionLink(T("Setup").ToString(), "_setup", new {tenantName = Model.Name, area = "Orchard.MultiTenancy"}) %> \ No newline at end of file +<%=Html.Link(T("Set Up").ToString(), Url.Tenant(Model))%> \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx index d20bf66db..a7d1a94a9 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Views/Admin/Index.ascx @@ -5,24 +5,15 @@ <%@ Import Namespace="Orchard.MultiTenancy.ViewModels"%>

    <%=Html.TitleForPage(T("List of Site's Tenants").ToString())%>

    <%=Html.ActionLink(T("Add a Tenant").ToString(), "Add", new {area = "Orchard.MultiTenancy"}, new { @class = "button primaryAction" })%>
    -