Merge contributions -> integration

--HG--
branch : integration
This commit is contained in:
Suha Can
2011-06-16 16:49:24 -07:00
16 changed files with 194 additions and 10 deletions

View File

@@ -13,3 +13,8 @@ d2cca954cbf94750946a6325e5ec23e267430bd2 perf snapshot 1
5cc01ad95f11fcd241163685effaf01ef4b6cb02 1.0
5cc01ad95f11fcd241163685effaf01ef4b6cb02 1.0
16f874f7c4f38ed92ec2e40bd5a9cc7b1ee87407 1.0
6d7b973415c94482a417ba025a4c823d5c2d6630 1.1
6d7b973415c94482a417ba025a4c823d5c2d6630 1.1
48aedbdcebb174eb37534df9c7401fa35da22bbd 1.1
48aedbdcebb174eb37534df9c7401fa35da22bbd 1.1
97186e9f4536562febcdecf3da481231d375b0c7 1.1

View File

@@ -43,7 +43,7 @@ namespace Orchard.Blogs.Drivers {
var blogPostList = shapeHelper.Parts_Blogs_BlogPost_List(ContentPart: part, ContentItems: list);
return ContentShape(shapeHelper.Parts_Blogs_RecentBlogPosts(ContentItem: part.ContentItem, ContentItems: blogPostList));
return ContentShape(shapeHelper.Parts_Blogs_RecentBlogPosts(ContentItem: part.ContentItem, ContentItems: blogPostList, Blog: blog));
}
protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) {

View File

@@ -0,0 +1,98 @@
<#@ template language="C#" HostSpecific="True" #>
<#
MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)(Host);
#>
using System.Web.Mvc;
using Orchard.Localization;
using Orchard;
namespace <#= mvcHost.Namespace #>
{
public class <#= mvcHost.ControllerName #> : Controller
{
public IOrchardServices Services { get; set; }
public <#= mvcHost.ControllerName #>(IOrchardServices services) {
Services = services;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
<#
if(mvcHost.AddActionMethods) {
#>
public ActionResult Index()
{
return View();
}
public ActionResult Details(int id)
{
return View();
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
// TODO: Add insert logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
public ActionResult Edit(int id)
{
return View();
}
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
try
{
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
public ActionResult Delete(int id)
{
return View();
}
[HttpPost]
public ActionResult Delete(int id, FormCollection collection)
{
try
{
// TODO: Add delete logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
<#
}
#>
}
}

View File

@@ -6,7 +6,7 @@
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{$$ModuleProjectGuid$$}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<ProjectTypeGuids>{E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>$$ModuleName$$</RootNamespace>

View File

@@ -23,7 +23,7 @@ namespace Orchard.CodeGeneration.Commands {
"", "Content", "Styles", "Scripts", "Views", "Zones"
};
private static readonly string[] _moduleDirectories = new [] {
"", "Properties", "Controllers", "Views", "Models", "Scripts", "Styles"
"", "Properties", "Controllers", "Views", "Models", "Scripts", "Styles", "CodeTemplates/AddController"
};
private const string ModuleName = "CodeGeneration";
@@ -210,6 +210,7 @@ namespace Orchard.CodeGeneration.Commands {
string propertiesPath = modulePath + "Properties";
var content = new HashSet<string>();
var folders = new HashSet<string>();
var contentNoDeploy = new HashSet<string>();
foreach(var folder in _moduleDirectories) {
Directory.CreateDirectory(modulePath + folder);
@@ -226,6 +227,8 @@ namespace Orchard.CodeGeneration.Commands {
content.Add(modulePath + "Scripts\\Web.config");
File.WriteAllText(modulePath + "Styles\\Web.config", File.ReadAllText(_codeGenTemplatePath + "StaticFilesWebConfig.txt"));
content.Add(modulePath + "Styles\\Web.config");
File.WriteAllText(modulePath + "CodeTemplates\\AddController\\Controller.tt", File.ReadAllText(_codeGenTemplatePath + "Controller.tt."));
contentNoDeploy.Add(modulePath + "CodeTemplates\\AddController\\Controller.tt");
string templateText = File.ReadAllText(_codeGenTemplatePath + "ModuleAssemblyInfo.txt");
templateText = templateText.Replace("$$ModuleName$$", moduleName);
@@ -238,7 +241,7 @@ namespace Orchard.CodeGeneration.Commands {
File.WriteAllText(modulePath + "Module.txt", templateText);
content.Add(modulePath + "Module.txt");
var itemGroup = CreateProjectItemGroup(modulePath, content, folders);
var itemGroup = CreateProjectItemGroup(modulePath, content, folders, contentNoDeploy);
File.WriteAllText(modulePath + moduleName + ".csproj", CreateCsProject(moduleName, projectGuid, itemGroup));
}
@@ -321,7 +324,7 @@ namespace Orchard.CodeGeneration.Commands {
// create new csproj for the theme
if (projectGuid != null) {
var itemGroup = CreateProjectItemGroup(themePath, createdFiles, createdFolders);
var itemGroup = CreateProjectItemGroup(themePath, createdFiles, createdFolders, null);
string projectText = CreateCsProject(themeName, projectGuid, itemGroup);
File.WriteAllText(themePath + "\\" + themeName + ".csproj", projectText);
}
@@ -329,7 +332,7 @@ namespace Orchard.CodeGeneration.Commands {
if (includeInSolution) {
if (projectGuid == null) {
// include in solution but dont create a project: just add the references to Orchard.Themes project
var itemGroup = CreateProjectItemGroup(HostingEnvironment.MapPath("~/Themes/"), createdFiles, createdFolders);
var itemGroup = CreateProjectItemGroup(HostingEnvironment.MapPath("~/Themes/"), createdFiles, createdFolders, null);
AddFilesToOrchardThemesProject(output, itemGroup);
TouchSolution(output);
}
@@ -356,7 +359,8 @@ namespace Orchard.CodeGeneration.Commands {
}
}
private static string CreateProjectItemGroup(string relativeFromPath, HashSet<string> content, HashSet<string> folders) {
private static string CreateProjectItemGroup(string relativeFromPath, HashSet<string> content, HashSet<string> folders, HashSet<string> contentNoDeploy)
{
var contentInclude = "";
if (relativeFromPath != null && !relativeFromPath.EndsWith("\\", StringComparison.OrdinalIgnoreCase)) {
relativeFromPath += "\\";
@@ -374,6 +378,10 @@ namespace Orchard.CodeGeneration.Commands {
contentInclude += "\r\n" + string.Join("\r\n", from folder in folders
select " <Folder Include=\"" + folder.Replace(relativeFromPath, "") + "\" />");
}
if (contentNoDeploy != null && contentNoDeploy.Count > 0) {
contentInclude += "\r\n" + string.Join("\r\n", from file in contentNoDeploy
select " <None Include=\"" + file.Replace(relativeFromPath, "") + "\" />");
}
return string.Format(CultureInfo.InvariantCulture, "<ItemGroup>\r\n{0}\r\n </ItemGroup>\r\n ", contentInclude);
}

View File

@@ -82,6 +82,9 @@
<ItemGroup>
<Content Include="CodeGenerationTemplates\Placement.info" />
</ItemGroup>
<ItemGroup>
<Content Include="CodeGenerationTemplates\Controller.tt" />
</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

@@ -14,3 +14,8 @@ Features:
Name: Url Alternates
Category: Designer
Description: Adds shape alternates for specific urls
WidgetAlternates:
Name: Widget Alternates
Category: Designer
Description: Adds shape alternates for content types stereotyped as widgets, allowing to customize shapes by widget and zone
Dependencies: Orchard.Widgets

View File

@@ -100,6 +100,10 @@
<Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project>
<Name>Orchard.Core</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Widgets\Orchard.Widgets.csproj">
<Project>{194D3CCC-1153-474D-8176-FDE8D7D0D0BD}</Project>
<Name>Orchard.Widgets</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="Controllers\AlternateController.cs" />
@@ -107,6 +111,7 @@
<Compile Include="Services\TemplatesFilter.cs" />
<Compile Include="Services\ShapeTracingFactory.cs" />
<Compile Include="Services\UrlAlternatesFactory.cs" />
<Compile Include="Services\WidgetAlternatesFactory.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\ShapeTracingWrapper.cshtml" />

View File

@@ -0,0 +1,34 @@
using Orchard.DisplayManagement.Implementation;
using Orchard.Environment.Extensions;
using Orchard.ContentManagement;
using Orchard.Widgets.Models;
namespace Orchard.DesignerTools.Services {
[OrchardFeature("WidgetAlternates")]
public class WidgetAlternatesFactory : ShapeDisplayEvents {
public override void Displaying(ShapeDisplayingContext context) {
context.ShapeMetadata.OnDisplaying(displayedContext => {
// We don't want the "Widget" content item itself, but the content item that consists of the Widget part (e.g. Parts.Blogs.RecentBlogPosts)
if (displayedContext.ShapeMetadata.Type != "Widget") {
ContentItem contentItem = displayedContext.Shape.ContentItem;
if (contentItem != null) {
// Is the contentItem a widget? (we could probably test for the stereotype setting, don't know if that is more efficient than selecting the WidgetPart)
var widgetPart = contentItem.As<WidgetPart>();
if (widgetPart != null) {
var zoneName = widgetPart.Zone;
var shapeName = displayedContext.ShapeMetadata.Type;
var contentTypeName = contentItem.ContentType;
// Add 2 alternates for flexible widget shape naming:
// [ShapeName]-[ZoneName].cshtml: (e.g. "Parts.Blogs.RecentBlogPosts-myZoneName.cshtml")
// [ContentTypeName]-[ZoneName].cshtml: (e.g. "RecentBlogPosts-myZoneName.cshtml")
displayedContext.ShapeMetadata.Alternates.Add(contentTypeName + "__" + zoneName);
displayedContext.ShapeMetadata.Alternates.Add(shapeName + "__" + zoneName);
}
}
}
});
}
}
}

View File

@@ -41,6 +41,8 @@ namespace Orchard.Media.Controllers {
foreach (string key in input.Keys) {
if (key.StartsWith("Checkbox.") && input[key] == "true") {
string folderName = key.Substring("Checkbox.".Length);
if (!Services.Authorizer.Authorize(Permissions.ManageMedia, T("Couldn't delete media folder")))
return new HttpUnauthorizedResult();
_mediaService.DeleteFolder(folderName);
}
}

View File

@@ -4,13 +4,13 @@ using System.Text.RegularExpressions;
using System.Web.Mvc;
using System.Web.Routing;
using Orchard.ContentManagement;
using Orchard.Core.Common.Models;
using Orchard.Core.Contents.Controllers;
using Orchard.Core.Settings.Models;
using Orchard.DisplayManagement;
using Orchard.Localization;
using Orchard.Security;
using Orchard.UI.Notify;
using Orchard.Users.Events;
using Orchard.Users.Models;
using Orchard.Users.Services;
using Orchard.Users.ViewModels;
@@ -24,6 +24,7 @@ namespace Orchard.Users.Controllers {
public class AdminController : Controller, IUpdateModel {
private readonly IMembershipService _membershipService;
private readonly IUserService _userService;
private readonly IEnumerable<IUserEventHandler> _userEventHandlers;
private readonly ISiteService _siteService;
public AdminController(
@@ -31,10 +32,12 @@ namespace Orchard.Users.Controllers {
IMembershipService membershipService,
IUserService userService,
IShapeFactory shapeFactory,
IEnumerable<IUserEventHandler> userEventHandlers,
ISiteService siteService) {
Services = services;
_membershipService = membershipService;
_userService = userService;
_userEventHandlers = userEventHandlers;
_siteService = siteService;
T = NullLocalizer.Instance;
@@ -311,6 +314,9 @@ namespace Orchard.Users.Controllers {
if ( user != null ) {
user.As<UserPart>().RegistrationStatus = UserStatus.Approved;
Services.Notifier.Information(T("User {0} approved", user.UserName));
foreach (var userEventHandler in _userEventHandlers) {
userEventHandler.Approved(user);
}
}
return RedirectToAction("Index");

View File

@@ -19,7 +19,7 @@ namespace Orchard.Users.Events {
void LoggedIn(IUser user);
/// <summary>
/// Called when a user explicitly logs out (as opposed to one whos session cookie simply expires)
/// Called when a user explicitly logs out (as opposed to one whose session cookie simply expires)
/// </summary>
void LoggedOut(IUser user);
@@ -42,6 +42,11 @@ namespace Orchard.Users.Events {
/// Called after a user has confirmed their email address
/// </summary>
void ConfirmedEmail(IUser user);
/// <summary>
/// Called after a user has been approved
/// </summary>
void Approved(IUser user);
}
}

View File

@@ -76,6 +76,9 @@ namespace Orchard.Users.Services {
foreach ( var userEventHandler in _userEventHandlers ) {
userEventHandler.Created(userContext);
if (user.RegistrationStatus == UserStatus.Approved) {
userEventHandler.Approved(user);
}
}
if ( registrationSettings != null && registrationSettings.UsersAreModerated && registrationSettings.NotifyModeration && !createUserParams.IsApproved ) {

View File

@@ -21,6 +21,11 @@ namespace Orchard.DisplayManagement.Shapes {
public virtual IEnumerable<dynamic> Items { get { return _items; } }
public virtual Shape Add(object item, string position = DefaultPosition) {
// pszmyd: Ignoring null shapes
if (item == null) {
return this;
}
try {
// todo: (sebros) this is a temporary implementation to prevent common known scenarios throwing exceptions. The final solution would need to filter based on the fact that it is a Shape instance
if ( item is MvcHtmlString ||

View File

@@ -35,7 +35,8 @@ namespace Orchard.UI {
public virtual string ZoneName { get; set; }
public IZone Add(Action<HtmlHelper> action, string position) {
throw new NotImplementedException();
// pszmyd: Replaced the NotImplementedException with simply doing nothing
return this;
}
}
}

View File

@@ -89,6 +89,10 @@ namespace Orchard.UI.Zones {
public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {
var argsCount = args.Count();
if (name == "Add" && (argsCount == 1 || argsCount == 2)) {
// pszmyd: Ignore null shapes
if (args.First() == null)
return _parent;
dynamic parent = _parent;
dynamic zone = _zoneFactory();