From 341116752299ea65a0371baddc1b6826cf22cb86 Mon Sep 17 00:00:00 2001 From: loudej Date: Thu, 19 Nov 2009 18:51:41 +0000 Subject: [PATCH] Adding a ~/devtools package with not-for-production controllers and diagnostics and such --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4041419 --- src/Orchard.Web/Orchard.Web.csproj | 4 + .../Packages/Orchard.DevTools/AdminMenu.cs | 14 ++ .../Controllers/ContentController.cs | 60 +++++++ .../Controllers/HomeController.cs | 23 +++ .../Orchard.DevTools/Orchard.DevTools.csproj | 133 +++++++++++++++ .../Packages/Orchard.DevTools/Package.txt | 1 + .../Properties/AssemblyInfo.cs | 35 ++++ .../ViewModels/ContentDetailsViewModel.cs | 26 +++ .../ViewModels/ContentIndexViewModel.cs | 14 ++ .../Views/Content/Details.aspx | 91 ++++++++++ .../Orchard.DevTools/Views/Content/Index.aspx | 48 ++++++ .../Orchard.DevTools/Views/Home/Index.aspx | 38 +++++ .../Orchard.DevTools/Views/Web.config | 34 ++++ .../Packages/Orchard.DevTools/Web.config | 156 ++++++++++++++++++ .../Orchard.Roles/Models/UserRolesHandler.cs | 23 +-- .../Orchard.Wikis/Models/WikiSettings.cs | 2 +- src/Orchard.sln | 7 + src/Orchard/Models/ContentItem.cs | 2 +- 18 files changed, 691 insertions(+), 20 deletions(-) create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/AdminMenu.cs create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Controllers/HomeController.cs create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Package.txt create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Properties/AssemblyInfo.cs create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentDetailsViewModel.cs create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentIndexViewModel.cs create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Views/Web.config create mode 100644 src/Orchard.Web/Packages/Orchard.DevTools/Web.config diff --git a/src/Orchard.Web/Orchard.Web.csproj b/src/Orchard.Web/Orchard.Web.csproj index 0849e03d5..5a09b8b29 100644 --- a/src/Orchard.Web/Orchard.Web.csproj +++ b/src/Orchard.Web/Orchard.Web.csproj @@ -128,6 +128,10 @@ {1ECC1131-0D0C-4822-AD90-E979868C63F3} Orchard.CmsPages + + {67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890} + Orchard.DevTools + {D9A7B330-CD22-4DA1-A95A-8DE1982AD8EB} Orchard.Media diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/AdminMenu.cs b/src/Orchard.Web/Packages/Orchard.DevTools/AdminMenu.cs new file mode 100644 index 000000000..212319d8d --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/AdminMenu.cs @@ -0,0 +1,14 @@ +using Orchard.UI.Navigation; + +namespace Orchard.Media { + public class AdminMenu : INavigationProvider { + public string MenuName { get { return "admin"; } } + + public void GetNavigation(NavigationBuilder builder) { + builder.Add("Media", "4", + menu => menu + .Add("Manage Folders", "1.0", item => item.Action("Index", "Admin", new { area = "Orchard.Media" })) + ); + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs new file mode 100644 index 000000000..213d6c958 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using System.Web.Mvc.Ajax; +using Orchard.Data; +using Orchard.DevTools.ViewModels; +using Orchard.Models; +using Orchard.Models.Records; + +namespace Orchard.DevTools.Controllers +{ + public class ContentController : Controller + { + private readonly IRepository _contentItemRepository; + private readonly IRepository _contentTypeRepository; + private readonly IContentManager _contentManager; + + public ContentController( + IRepository contentItemRepository, + IRepository contentTypeRepository, + IContentManager contentManager) { + _contentItemRepository = contentItemRepository; + _contentTypeRepository = contentTypeRepository; + _contentManager = contentManager; + } + + public ActionResult Index() { + return View(new ContentIndexViewModel { + Items = _contentItemRepository.Table.ToList(), + Types = _contentTypeRepository.Table.ToList() + }); + } + + public ActionResult Details(int id) { + var model = new ContentDetailsViewModel { + Item = _contentManager.Get(id) + }; + model.PartTypes = model.Item.Parts + .Select(x => x.GetType()) + .SelectMany(x => AllTypes(x)) + .Distinct(); + model.Editors = _contentManager.GetEditors(model.Item); + + return View(model); + } + + static IEnumerable AllTypes(Type type) { + var scan = type; + while(scan != null && scan != typeof(Object) && scan != typeof(ContentItemPart)) { + yield return scan; + scan = scan.BaseType; + } + foreach(var itf in type.GetInterfaces()) { + yield return itf; + } + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/HomeController.cs b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/HomeController.cs new file mode 100644 index 000000000..7cfb0d1d7 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/HomeController.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using System.Web.Mvc.Ajax; +using Orchard.Data; +using Orchard.DevTools.ViewModels; +using Orchard.Models; +using Orchard.Models.Records; +using Orchard.Mvc.ViewModels; + +namespace Orchard.DevTools.Controllers +{ + public class HomeController : Controller + { + public ActionResult Index() + { + return View(new BaseViewModel()); + } + + } +} diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj b/src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj new file mode 100644 index 000000000..fffa1b142 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj @@ -0,0 +1,133 @@ + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890} + {F85E285D-A4E0-4152-9332-AB1D724D3325};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Orchard.DevTools + Orchard.DevTools + v3.5 + false + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + False + ..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6} + Orchard + + + + + + + + + + + + + $(ProjectDir)\..\Manifests + + + + + + + + + + + + False + True + 1231 + / + + + False + False + + + False + + + + + \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Package.txt b/src/Orchard.Web/Packages/Orchard.DevTools/Package.txt new file mode 100644 index 000000000..022c35fc0 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Package.txt @@ -0,0 +1 @@ +name: DevTools diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Properties/AssemblyInfo.cs b/src/Orchard.Web/Packages/Orchard.DevTools/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..ca752fe09 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Orchard.DevTools")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft IT")] +[assembly: AssemblyProduct("Orchard.DevTools")] +[assembly: AssemblyCopyright("Copyright © Microsoft IT 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c185e02c-ccf9-4976-bdaa-1fd7e12c1296")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentDetailsViewModel.cs b/src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentDetailsViewModel.cs new file mode 100644 index 000000000..2dc2e7cf0 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentDetailsViewModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.Models; +using Orchard.Models.Records; +using Orchard.Mvc.ViewModels; +using Orchard.UI.Models; + +namespace Orchard.DevTools.ViewModels { + public class ContentDetailsViewModel : BaseViewModel { + public ContentItem Item { get; set; } + + public IEnumerable PartTypes { get; set; } + + public IEnumerable Editors { get; set; } + + public object Locate(Type type) { + foreach(var part in Item.Parts) { + if (type.IsAssignableFrom(part.GetType())) + return (part); + } + return null; + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentIndexViewModel.cs b/src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentIndexViewModel.cs new file mode 100644 index 000000000..7b70c7aec --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/ViewModels/ContentIndexViewModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.Models; +using Orchard.Models.Records; +using Orchard.Mvc.ViewModels; + +namespace Orchard.DevTools.ViewModels { + public class ContentIndexViewModel : BaseViewModel { + public IEnumerable Types { get; set; } + public IEnumerable Items { get; set; } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx new file mode 100644 index 000000000..155e976bc --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx @@ -0,0 +1,91 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> + +<%@ Import Namespace="System.Reflection" %> +<%@ Import Namespace="Orchard.Mvc.Html" %> + + + + TwoColumns + " rel="stylesheet" type="text/css" /> + + + +
+ +
+

+ Content Item

+

+ Id: + <%=Model.Item.Id %>

+

+ ContentType: + <%=Model.Item.ContentType%>

+

+ Content Item Parts

+
    + <%foreach (var partType in Model.PartTypes.OrderBy(x => x.Name)) {%> +
  • + <%if (partType.IsGenericType) {%><%=Html.Encode(partType.Name +" "+partType.GetGenericArguments().First().Name)%> + <%=Html.Encode(" (" + partType.GetGenericArguments().First().Namespace + ")")%><%} + else {%><%=Html.Encode(partType.Name)%> + <%=Html.Encode( " (" + partType.Namespace + ")")%><% + }%> +
      + <%foreach (var prop in partType.GetProperties().Where(x => x.DeclaringType == partType)) { + var value = prop.GetValue(Model.Locate(partType), null);%> +
    • + <%=Html.Encode(prop.Name) %>: + <%=Html.Encode(value) %> +
        + <%if (value == null || prop.PropertyType.IsPrimitive || prop.PropertyType == typeof(string)) { } + else if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType)) { + foreach (var item in value as IEnumerable) { + %> +
      • <%=Html.Encode(item.GetType().Name) %>:<%=Html.Encode(item) %>
      • + <% + } + + } + else {%> + <%foreach (var prop2 in value.GetType().GetProperties().Where(x => x.GetIndexParameters().Count() == 0)) {%> +
      • + <%=Html.Encode(prop2.Name)%> + <%=Html.Encode(prop2.GetValue(value, null))%>
      • + <%} %> + <%} %> +
      +
    • + <%} %> +
    +
  • + <%}%> +
+

+ Editors

+
    + <%foreach (var editor in Model.Editors) {%> +
  • + <%=Html.Encode(editor.Prefix) %> + <%=Html.Encode(editor.Model.GetType().Name) %> + (<%=Html.Encode(editor.Model.GetType().Namespace) %>) +
    + <%=Html.EditorFor(x=>editor.Model, editor.TemplateName, editor.Prefix) %> +
    +
  • + <% + }%> +
+
+ +
+ + diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx new file mode 100644 index 000000000..4904ac12e --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx @@ -0,0 +1,48 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> +<%@ Import Namespace="Orchard.Mvc.Html"%> + + + + + + TwoColumns + " rel="stylesheet" type="text/css" /> + + + + + +
+ + +
+

Content Types

+
    +<%foreach(var item in Model.Types.OrderBy(x=>x.Name)){%> +
  • <%=Html.Encode(item.Name) %>
  • +<%}%> +
+ +

Content Items

+
    +<%foreach(var item in Model.Items.OrderBy(x=>x.Id)){%> +
  • <%=Html.ActionLink(item.Id+": "+item.ContentType.Name, "details", "content", new{item.Id},new{}) %>
  • +<%}%> +
+ +
+ + +
+ + + + diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx new file mode 100644 index 000000000..4ed8fb1b8 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx @@ -0,0 +1,38 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> +<%@ Import Namespace="Orchard.Mvc.ViewModels"%> +<%@ Import Namespace="Orchard.Mvc.Html"%> + + + + + + TwoColumns + " rel="stylesheet" type="text/css" /> + + + + + +
+ + +
+ +

<%=Html.ActionLink("Contents", "Index", "Content") %>

+ +
+ + +
+ + + + diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Web.config b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Web.config new file mode 100644 index 000000000..e065d8735 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Web.config @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Web.config b/src/Orchard.Web/Packages/Orchard.DevTools/Web.config new file mode 100644 index 000000000..4e552c48c --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Web.config @@ -0,0 +1,156 @@ + + + + + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs b/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs index 1f172612c..39dc4e332 100644 --- a/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs @@ -20,26 +20,13 @@ namespace Orchard.Roles.Models { _userRolesRepository = userRolesRepository; _roleService = roleService; _notifier = notifier; - } - protected override void Activating(ActivatingContentContext context) { - if (context.ContentType == "user") { - context.Builder.Weld(); - } - } - - protected override void Creating(CreateContentContext context) { - var userRoles = context.ContentItem.As(); - if (userRoles != null) { - } - } - - protected override void Loading(LoadContentContext context) { - var userRoles = context.ContentItem.As(); - if (userRoles != null) { - userRoles.Roles = _userRolesRepository.Fetch(x => x.UserId == context.ContentItem.Id) + Filters.Add(new ActivatingFilter("user")); + AddOnLoaded((context, userRoles) => { + userRoles.Roles = _userRolesRepository + .Fetch(x => x.UserId == context.ContentItem.Id) .Select(x => x.Role.Name).ToList(); - } + }); } protected override void GetEditors(GetContentEditorsContext context) { diff --git a/src/Orchard.Web/Packages/Orchard.Wikis/Models/WikiSettings.cs b/src/Orchard.Web/Packages/Orchard.Wikis/Models/WikiSettings.cs index 02c446374..a8b957424 100644 --- a/src/Orchard.Web/Packages/Orchard.Wikis/Models/WikiSettings.cs +++ b/src/Orchard.Web/Packages/Orchard.Wikis/Models/WikiSettings.cs @@ -7,7 +7,7 @@ using Orchard.Models.Records; namespace Orchard.Wikis.Models { public class WikiSettingsRecord : ContentPartRecord { public virtual bool AllowAnonymousEdits { get; set; } - + [Required] public virtual string WikiEditTheme { get; set; } } diff --git a/src/Orchard.sln b/src/Orchard.sln index 15b573bf5..5f809b705 100644 --- a/src/Orchard.sln +++ b/src/Orchard.sln @@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Blogs", "Orchard.We EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Comments", "Orchard.Web\Packages\Orchard.Comments\Orchard.Comments.csproj", "{14C049FD-B35B-415A-A824-87F26B26E7FD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.DevTools", "Orchard.Web\Packages\Orchard.DevTools\Orchard.DevTools.csproj", "{67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -101,6 +103,10 @@ Global {14C049FD-B35B-415A-A824-87F26B26E7FD}.Debug|Any CPU.Build.0 = Debug|Any CPU {14C049FD-B35B-415A-A824-87F26B26E7FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {14C049FD-B35B-415A-A824-87F26B26E7FD}.Release|Any CPU.Build.0 = Release|Any CPU + {67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -118,5 +124,6 @@ Global {17C44253-65A2-4597-98C7-16EE576824B6} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {63FBD4D9-E1DA-4A7B-AA6A-D6074FE50867} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {14C049FD-B35B-415A-A824-87F26B26E7FD} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} + {67C1D3AF-A0EC-46B2-BAE1-DF1DA8E0B890} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} EndGlobalSection EndGlobal diff --git a/src/Orchard/Models/ContentItem.cs b/src/Orchard/Models/ContentItem.cs index 308532fbb..0197c02bc 100644 --- a/src/Orchard/Models/ContentItem.cs +++ b/src/Orchard/Models/ContentItem.cs @@ -10,8 +10,8 @@ namespace Orchard.Models { private readonly IList _parts; public int Id { get; set; } - public string ContentType { get; set; } + public IEnumerable Parts { get { return _parts; } } public bool Has() { return _parts.Any(part => part is TPart);