From cab247320abbcea967a2ff5486d264c93f4f77e1 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Sat, 10 Sep 2011 10:31:07 -0700 Subject: [PATCH] Refactoring Rules features --HG-- branch : 1.x --- .hgsubstate | 6 +- .../Core/Contents/Handlers/RulesHandler.cs | 48 ++++++++++++++ src/Orchard.Web/Core/Contents/Module.txt | 12 +++- .../Core/Contents/Rules/ContentEvents.cs | 64 +++++++++++++++++++ .../Core/Contents/Rules/ContentForms.cs | 61 ++++++++++++++++++ src/Orchard.Web/Core/Orchard.Core.csproj | 3 + .../Modules/Orchard.Comments/Module.txt | 20 +++--- .../Orchard.Comments/Orchard.Comments.csproj | 8 --- .../Properties/AssemblyInfo.cs | 1 + .../Orchard.Comments/Rules/CommentsActions.cs | 21 ++++-- .../Orchard.Comments/Rules/CommentsForms.cs | 30 +++++---- 11 files changed, 234 insertions(+), 40 deletions(-) create mode 100644 src/Orchard.Web/Core/Contents/Handlers/RulesHandler.cs create mode 100644 src/Orchard.Web/Core/Contents/Rules/ContentEvents.cs create mode 100644 src/Orchard.Web/Core/Contents/Rules/ContentForms.cs diff --git a/.hgsubstate b/.hgsubstate index 1e2a88747..be8b045cc 100644 --- a/.hgsubstate +++ b/.hgsubstate @@ -1,3 +1,3 @@ -4d1cc7eaae172f400159e64a747fac69d9608aa8 src/Orchard.Web/Modules/Orchard.Forms -19fadd2cddbac89051c0e6fa0c8f6a2bc8d67b24 src/Orchard.Web/Modules/Orchard.Rules -7b7a9141401137d855a5a33d1652aa51a5636bd8 src/Orchard.Web/Modules/Orchard.Tokens +30c41b905ee07be02fe134f72c7a2449d85d71b3 src/Orchard.Web/Modules/Orchard.Forms +bdfbf617bbd125d3e76689fba17999c76b4b8ac0 src/Orchard.Web/Modules/Orchard.Rules +6093698fc61157076a8c26653a07e27da5280cfd src/Orchard.Web/Modules/Orchard.Tokens diff --git a/src/Orchard.Web/Core/Contents/Handlers/RulesHandler.cs b/src/Orchard.Web/Core/Contents/Handlers/RulesHandler.cs new file mode 100644 index 000000000..1a690d842 --- /dev/null +++ b/src/Orchard.Web/Core/Contents/Handlers/RulesHandler.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Handlers; +using Orchard.Environment.Extensions; +using Orchard.Events; + +namespace Orchard.Core.Contents.Handlers { + + public interface IRulesManager : IEventHandler + { + void TriggerEvent(string category, string type, Func> tokensContext); + } + + [OrchardFeature("Orchard.Core.Contents.Rules")] + public class RulePartHandler : ContentHandler + { + public RulePartHandler(IRulesManager rulesManager) + { + + OnPublished( + (context, part) => + rulesManager.TriggerEvent("Content", "Published", + () => new Dictionary { { "Content", context.ContentItem } })); + + OnPublished( + (context, part) => + rulesManager.TriggerEvent("Content", "Published", + () => new Dictionary { { "Content", context.ContentItem } } )); + + OnRemoved( + (context, part) => + rulesManager.TriggerEvent("Content", "Removed", + () => new Dictionary { { "Content", context.ContentItem } })); + + OnVersioned( + (context, part1, part2) => + rulesManager.TriggerEvent("Content", "Versioned", + () => new Dictionary { { "Content", part1.ContentItem } })); + + OnCreated( + (context, part) => + rulesManager.TriggerEvent("Content", "Created", + () => new Dictionary { { "Content", context.ContentItem } })); + + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Contents/Module.txt b/src/Orchard.Web/Core/Contents/Module.txt index d040c61e2..f0246dc9b 100644 --- a/src/Orchard.Web/Core/Contents/Module.txt +++ b/src/Orchard.Web/Core/Contents/Module.txt @@ -5,5 +5,13 @@ Website: http://orchardproject.net Version: 1.2.0 OrchardVersion: 1.2.0 Description: The contents module enables the creation of custom content types. -FeatureDescription: Default custom content type definition, creation and management. -Category: Core +Features: + Orchard.Core.Contents + Name: Contents + Description: Default custom content type definition, creation and management. + Category: Core + Orchard.Core.Contents.Rules: + Name: Contents Rules + Description: Rules for the Contents modules + Category: Rules + Dependency: Rules diff --git a/src/Orchard.Web/Core/Contents/Rules/ContentEvents.cs b/src/Orchard.Web/Core/Contents/Rules/ContentEvents.cs new file mode 100644 index 000000000..8a8271fdd --- /dev/null +++ b/src/Orchard.Web/Core/Contents/Rules/ContentEvents.cs @@ -0,0 +1,64 @@ +using System; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.Environment.Extensions; +using Orchard.Events; +using Orchard.Localization; + +namespace Orchard.Core.Contents.Rules +{ + public interface IEventProvider : IEventHandler + { + void Describe(dynamic describe); + } + + [OrchardFeature("Orchard.Core.Contents.Rules")] + public class ContentEvents : IEventProvider + { + public Localizer T { get; set; } + + public void Describe(dynamic describe) + { + Func contentHasPart = ContentHasPart; + + describe.For("Content", T("Content Items"), T("Content Items")) + .Element("Created", T("Content Created"), T("Content is actually created."), contentHasPart, (Func) (context => T("When content with types ({0}) is created.", FormatPartsList(context))), "SelectContentTypes") + .Element("Versioned", T("Content Versioned"), T("Content is actually versioned."), contentHasPart, (Func) (context => T("When content with types ({0}) is versioned.", FormatPartsList(context))), "SelectContentTypes") + .Element("Published", T("Content Published"), T("Content is actually published."), contentHasPart, (Func) (context => T("When content with types ({0}) is published.", FormatPartsList(context))), "SelectContentTypes") + .Element("Removed", T("Content Removed"), T("Content is actually removed."), contentHasPart, (Func) (context => T("When content with types ({0}) is removed.", FormatPartsList(context))), "SelectContentTypes"); + } + + private string FormatPartsList(dynamic context) + { + var contenttypes = context.Properties["contenttypes"]; + + if(String.IsNullOrEmpty(contenttypes)) + { + return T("Any").Text; + } + + return contenttypes; + } + + private static bool ContentHasPart(dynamic context) + { + string contenttypes = context.Properties["contenttypes"]; + var content = context.Tokens["Content"] as IContent; + + // "" means 'any' + if(String.IsNullOrEmpty(contenttypes)) + { + return true; + } + + if(content == null) + { + return false; + } + + var contentTypes = contenttypes.Split(new [] {','} ); + + return contentTypes.Any(contentType => content.ContentItem.TypeDefinition.Name == contentType); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Contents/Rules/ContentForms.cs b/src/Orchard.Web/Core/Contents/Rules/ContentForms.cs new file mode 100644 index 000000000..fa164eb0b --- /dev/null +++ b/src/Orchard.Web/Core/Contents/Rules/ContentForms.cs @@ -0,0 +1,61 @@ +using System; +using System.Web.Mvc; +using Orchard.ContentManagement.MetaData; +using Orchard.DisplayManagement; +using Orchard.Environment.Extensions; +using Orchard.Events; +using Orchard.Localization; + +namespace Orchard.Core.Contents.Rules +{ + public interface IFormProvider : IEventHandler + { + void Describe(dynamic context); + } + + [OrchardFeature("Orchard.Core.Contents.Rules")] + public class ContentForms : IFormProvider + { + private readonly IContentDefinitionManager _contentDefinitionManager; + protected dynamic Shape { get; set; } + public Localizer T { get; set; } + + public ContentForms( + IShapeFactory shapeFactory, + IContentDefinitionManager contentDefinitionManager) + { + _contentDefinitionManager = contentDefinitionManager; + Shape = shapeFactory; + } + + public void Describe(dynamic context) + { + Func form = + shape => { + + var f = Shape.Form( + Id: "AnyOfContentTypes", + _Parts: Shape.SelectList( + Id: "contenttypes", Name: "contenttypes", + Title: T("Content types"), + Description: T("Select some content types."), + Size: 10, + Multiple: true + ) + ); + + f._Parts.Add(new SelectListItem { Value = "", Text = T("Any").Text }); + + foreach (var contentType in _contentDefinitionManager.ListTypeDefinitions()) + { + f._Parts.Add(new SelectListItem { Value = contentType.Name, Text = contentType.DisplayName }); + } + + return f; + }; + + context.Form("SelectContentTypes", form); + + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index dd6a1485d..ad840c685 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -103,6 +103,9 @@ + + + diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Module.txt b/src/Orchard.Web/Modules/Orchard.Comments/Module.txt index 9bb3fd81a..589d33cf6 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.Comments/Module.txt @@ -6,13 +6,13 @@ Version: 1.2.0 OrchardVersion: 1.2.0 Description: The comments system implemented by this module can be applied to arbitrary Orchard content types, such as blogs and pages. It includes comment validation and spam protection through the Akismet service. Features: - Orchard.Comments: - Name: Comments - Description: Standard content item comments. - Dependencies: Settings - Category: Social - Orchard.Comments.Rules: - Name: Comments Rules - Description: Rules for the Comments modules - Dependencies: Orchard.Rules, Orchard.Forms - Category: Rules + Orchard.Comments: + Name: Comments + Description: Standard content item comments. + Dependencies: Settings + Category: Social + Orchard.Comments.Rules: + Name: Comments Rules + Description: Rules for the Comments modules + Category: Rules + Dependency: Rules \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj b/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj index 54aa1653c..e7c1147d7 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj +++ b/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj @@ -117,14 +117,6 @@ {9916839C-39FC-4CEB-A5AF-89CA7E87119F} Orchard.Core - - {642A49D7-8752-4177-80D6-BFBBCFAD3DE0} - Orchard.Forms - - - {966EC390-3C7F-4D98-92A6-F0F30D02E9B1} - Orchard.Rules - diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Properties/AssemblyInfo.cs b/src/Orchard.Web/Modules/Orchard.Comments/Properties/AssemblyInfo.cs index ec015441f..e1f3bcfe6 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Properties/AssemblyInfo.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Properties/AssemblyInfo.cs @@ -32,3 +32,4 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("1.2.0")] [assembly: AssemblyFileVersion("1.2.0")] +[assembly:SecurityTransparent] \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsActions.cs b/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsActions.cs index 8795e810d..fc93afa89 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsActions.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsActions.cs @@ -1,13 +1,17 @@ using System; using Orchard.Comments.Models; using Orchard.Environment.Extensions; -using Orchard.Rules.Models; -using Orchard.Rules.Services; +using Orchard.Events; using Orchard.ContentManagement; using Orchard.Localization; namespace Orchard.Comments.Rules { + public interface IActionProvider : IEventHandler + { + void Describe(dynamic describe); + } + [OrchardFeature("Orchard.Comments.Rules")] public class CommentsActions : IActionProvider { @@ -20,13 +24,18 @@ namespace Orchard.Comments.Rules public Localizer T { get; set; } - public void Describe(DescribeActionContext context) + public void Describe(dynamic describe) { - context.For("Comments", T("Comments"), T("Comments")) - .Element("Close", T("Close Comments"), T("Closes comments on a content item."), Close, actionContext => T("Close comments"), "ActionCloseComments"); + Func display = context => T("Close comments"); + + describe.For("Comments", T("Comments"), T("Comments")) + .Element("Close", T("Close Comments"), T("Closes comments on a content item."), (Action) Close, display, "ActionCloseComments"); } - private void Close(ActionContext context) + /// + /// Closes the comments on the content represented by "ContentId" + /// + private void Close(dynamic context) { var contentId = Convert.ToInt32(context.Properties["ContentId"]); var content = _contentManager.Get(contentId); diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsForms.cs b/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsForms.cs index e5bb28b91..c3c7bcac5 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsForms.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Rules/CommentsForms.cs @@ -1,10 +1,16 @@ -using Orchard.DisplayManagement; +using System; +using Orchard.DisplayManagement; using Orchard.Environment.Extensions; -using Orchard.Forms.Services; +using Orchard.Events; using Orchard.Localization; namespace Orchard.Comments.Rules { + public interface IFormProvider : IEventHandler + { + void Describe(dynamic context); + } + [OrchardFeature("Orchard.Comments.Rules")] public class CommentsForms : IFormProvider { @@ -16,17 +22,19 @@ namespace Orchard.Comments.Rules Shape = shapeFactory; } - public void Describe(DescribeContext context) + public void Describe(dynamic context) { - context.Form("ActionCloseComments", + + Func form = shape => Shape.Form( - Id: "ActionCloseComments", - _Type: Shape.Textbox( - Id: "ContentId", Name: "ContentId", - Title: T("Content Item Id"), - Description: T("Content Item Id.")) - ) - ); + Id: "ActionCloseComments", + _Type: Shape.Textbox( + Id: "ContentId", Name: "ContentId", + Title: T("Content Item Id"), + Description: T("Content Item Id.")) + ); + + context.Form("ActionCloseComments", form); } } } \ No newline at end of file