From a3f0598057bfc669d009f6f7f3a1bd38f31d867e Mon Sep 17 00:00:00 2001 From: loudej Date: Tue, 10 Nov 2009 17:33:39 +0000 Subject: [PATCH] Implementing Users AdminController and views --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4039450 --- .../DatabaseEnabledTestsBase.cs | 69 ++++++++++++ .../Orchard.Tests.Packages.csproj | 12 +++ .../Users/Controllers/AdminControllerTests.cs | 102 ++++++++++++++++++ .../Controllers/AdminController.cs | 61 ++++++++++- .../Orchard.Users/Orchard.Users.csproj | 9 ++ .../ViewModels/UserCreateViewModel.cs | 12 +++ .../ViewModels/UserEditViewModel.cs | 28 +++++ .../ViewModels/UsersIndexViewModel.cs | 17 +++ .../Orchard.Users/Views/Admin/Create.aspx | 31 ++++++ .../Orchard.Users/Views/Admin/Edit.aspx | 34 ++++++ .../EditorTemplates/UserCreateViewModel.ascx | 7 ++ .../EditorTemplates/UserEditViewModel.ascx | 8 ++ .../Admin/EditorTemplates/inputTextLarge.ascx | 6 ++ .../Orchard.Users/Views/Admin/Index.aspx | 56 ++++++++++ .../Packages/Orchard.Users/Web.config | 54 +--------- 15 files changed, 451 insertions(+), 55 deletions(-) create mode 100644 src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs create mode 100644 src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Users/ViewModels/UsersIndexViewModel.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx create mode 100644 src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx create mode 100644 src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserCreateViewModel.ascx create mode 100644 src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserEditViewModel.ascx create mode 100644 src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/inputTextLarge.ascx create mode 100644 src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Index.aspx diff --git a/src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs b/src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs new file mode 100644 index 000000000..66d496949 --- /dev/null +++ b/src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Autofac; +using Autofac.Builder; +using Autofac.Modules; +using NHibernate; +using NUnit.Framework; +using Orchard.Data; +using Orchard.Services; +using Orchard.Tests.Data; +using Orchard.Tests.Stubs; + +namespace Orchard.Tests.Packages { + public abstract class DatabaseEnabledTestsBase { + + protected IContainer _container; + + protected ISession _session; + protected string _databaseFilePath; + protected ISessionFactory _sessionFactory; + protected StubClock _clock; + + + [TestFixtureSetUp] + public void InitFixture() { + _databaseFilePath = Path.GetTempFileName(); + } + + [TestFixtureTearDown] + public void TearDownFixture() { + File.Delete(_databaseFilePath); + } + + [SetUp] + public virtual void Init() { + _sessionFactory = DataUtility.CreateSessionFactory(_databaseFilePath, DatabaseTypes.ToArray()); + _session = _sessionFactory.OpenSession(); + _clock = new StubClock(); + + var builder = new ContainerBuilder(); + builder.RegisterModule(new ImplicitCollectionSupportModule()); + builder.Register(new StubLocator(_session)).As(); + builder.Register(_clock).As(); + builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); + Register(builder); + _container = builder.Build(); + } + + [TearDown] + public void Cleanup() { + _session.Close(); + } + + public abstract void Register(ContainerBuilder builder); + + protected virtual IEnumerable DatabaseTypes { + get { + return Enumerable.Empty(); + } + } + + protected void ClearSession() { + _session.Flush(); + _session.Clear(); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj index b2957fa12..78268e343 100644 --- a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj +++ b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj @@ -39,6 +39,10 @@ False ..\..\lib\fluentnhibernate\FluentNHibernate.dll + + False + ..\..\lib\moq\Moq.dll + False ..\..\lib\fluentnhibernate\NHibernate.dll @@ -60,10 +64,16 @@ ..\..\lib\sqlite\System.Data.SQLite.DLL True + + 3.5 + False ..\..\lib\aspnetmvc\System.Web.Mvc.dll + + 3.5 + 3.5 @@ -74,7 +84,9 @@ + + diff --git a/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs new file mode 100644 index 000000000..acdde5fc1 --- /dev/null +++ b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; +using Autofac.Builder; +using Moq; +using NUnit.Framework; +using Orchard.Data; +using Orchard.Models; +using Orchard.Models.Driver; +using Orchard.Models.Records; +using Orchard.Notify; +using Orchard.Security; +using Orchard.Users.Controllers; +using Orchard.Users.Models; +using Orchard.Users.ViewModels; + +namespace Orchard.Tests.Packages.Users.Controllers { + [TestFixture] + public class AdminControllerTests : DatabaseEnabledTestsBase { + private AdminController _controller; + + public override void Register(ContainerBuilder builder) { + builder.Register(); + builder.Register().As(); + builder.Register().As(); + builder.Register(new Moq.Mock().Object); + } + + protected override IEnumerable DatabaseTypes { + get { + return new[] { typeof(UserRecord), typeof(ModelRecord), typeof(ModelTypeRecord) }; + } + } + + public override void Init() { + base.Init(); + + var manager = _container.Resolve(); + + var userOne = manager.New("user").As(); + userOne.Record = new UserRecord { UserName = "one" }; + manager.Create(userOne); + + var userTwo = manager.New("user").As(); + userTwo.Record = new UserRecord { UserName = "two" }; + manager.Create(userTwo); + + var userThree = manager.New("user").As(); + userThree.Record = new UserRecord { UserName = "three" }; + manager.Create(userThree); + + _controller = _container.Resolve(); + + var mockHttpContext = new Mock(); + _controller.ControllerContext = new ControllerContext( + mockHttpContext.Object, + new RouteData( + new Route("foo", new MvcRouteHandler()), + new MvcRouteHandler()), + _controller); + } + + [Test] + public void IndexShouldReturnRowsForUsers() { + var controller = _container.Resolve(); + var result = (ViewResult)controller.Index(); + var model = (UsersIndexViewModel)result.ViewData.Model; + + Assert.That(model.Rows, Is.Not.Null); + } + + [Test] + public void CreateShouldAddUserAndRedirect() { + var controller = _container.Resolve(); + var result = controller.Create(new UserCreateViewModel { UserName = "four" }); + Assert.That(result, Is.TypeOf()); + + var redirect = (RedirectToRouteResult)result; + var id = Convert.ToInt32(redirect.RouteValues["id"]); + var manager = _container.Resolve(); + var user = manager.Get(id).As(); + Assert.That(user.UserName, Is.EqualTo("four")); + } + + [Test] + public void EditShouldDisplayUserAndStoreChanges() { + var repository = _container.Resolve>(); + var id = repository.Get(x => x.UserName == "two").Id; + var result = (ViewResult)_container.Resolve().Edit(id); + var model = (UserEditViewModel)result.ViewData.Model; + Assert.That(model.UserName, Is.EqualTo("two")); + + var input = new FormCollection { { "UserName", "bubba" }, { "Email", "hotep" } }; + var result2 = _container.Resolve().Edit(id, input); + Assert.That(result2, Is.TypeOf()); + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs b/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs index 9e7001898..99fff8f25 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs +++ b/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs @@ -1,10 +1,67 @@ +using System.Linq; using System.Web.Mvc; +using Orchard.Data; +using Orchard.Models; +using Orchard.Notify; +using Orchard.Users.Models; +using Orchard.Users.ViewModels; namespace Orchard.Users.Controllers { public class AdminController : Controller { - public ActionResult Index() { - return View(); + private readonly IModelManager _modelManager; + private readonly IRepository _userRepository; + private readonly INotifier _notifier; + + public AdminController( + IModelManager modelManager, + IRepository userRepository, + INotifier notifier) { + _modelManager = modelManager; + _userRepository = userRepository; + _notifier = notifier; } + public ActionResult Index() { + var model = new UsersIndexViewModel(); + model.Rows = _userRepository.Fetch(x => x.UserName != null) + .Select(x => new UsersIndexViewModel.Row { + User = _modelManager.Get(x.Id).As() + }) + .ToList(); + + return View(model); + } + + public ActionResult Create() { + var model = new UserCreateViewModel(); + return View(model); + } + + [HttpPost] + public ActionResult Create(UserCreateViewModel model) { + if (ModelState.IsValid == false) { + return View(model); + } + var user = _modelManager.New("user"); + user.As().Record = new UserRecord { UserName = model.UserName, Email = model.Email }; + _modelManager.Create(user); + return RedirectToAction("edit", new { user.Id }); + } + + public ActionResult Edit(int id) { + var model = new UserEditViewModel { User = _modelManager.Get(id) }; + return View(model); + } + + [HttpPost] + public ActionResult Edit(int id, FormCollection input) { + var model = new UserEditViewModel { User = _modelManager.Get(id) }; + if (!TryUpdateModel(model, input.ToValueProvider())) { + return View(model); + } + _notifier.Information("User information updated"); + return RedirectToAction("Edit", new { id }); + } } + } diff --git a/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj b/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj index 1da3381f9..85fa20096 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj +++ b/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj @@ -68,9 +68,18 @@ + + + + + + + + + diff --git a/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs new file mode 100644 index 000000000..1d97783bc --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; +using Orchard.Mvc.ViewModels; + +namespace Orchard.Users.ViewModels { + public class UserCreateViewModel : AdminViewModel { + [Required] + public string UserName { get; set; } + + [Required] + public string Email { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs new file mode 100644 index 000000000..4347256a9 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs @@ -0,0 +1,28 @@ +using System.ComponentModel.DataAnnotations; +using System.Web.Mvc; +using Orchard.Models; +using Orchard.Mvc.ViewModels; +using Orchard.Users.Models; + +namespace Orchard.Users.ViewModels { + public class UserEditViewModel : AdminViewModel { + public IModel User { get; set; } + + [HiddenInput(DisplayValue = false)] + public int Id { + get { return User.Id; } + } + + [Required] + public string UserName { + get { return User.As().Record.UserName; } + set { User.As().Record.UserName = value; } + } + + [Required] + public string Email { + get { return User.As().Record.Email; } + set { User.As().Record.Email = value; } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UsersIndexViewModel.cs b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UsersIndexViewModel.cs new file mode 100644 index 000000000..643272589 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UsersIndexViewModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.Mvc.ViewModels; +using Orchard.Users.Models; + +namespace Orchard.Users.ViewModels { + + public class UsersIndexViewModel : AdminViewModel { + public class Row { + public UserModel User { get; set; } + } + + public IList Rows { get; set; } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx new file mode 100644 index 000000000..20e83e125 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx @@ -0,0 +1,31 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> + +<%@ Import Namespace="Orchard.Security" %> +<%@ Import Namespace="Orchard.Mvc.Html" %> + + + + Add a new User + <% Html.Include("Head"); %> + + + <% Html.Include("Header"); %> +
+

+ Add a new User

+ +
+
+ <%using (Html.BeginForm()) { %> +
    + <%= Html.ValidationSummary() %> + <%= Html.EditorForModel() %> +
  1. + + <%=Html.ActionLink("Cancel", "Index", new{}, new{@class="button"}) %>
  2. +
+ <%}/*EndForm*/%> +
+ <% Html.Include("Footer"); %> + + diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx new file mode 100644 index 000000000..efffbe13d --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx @@ -0,0 +1,34 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> + +<%@ Import Namespace="Orchard.Security" %> +<%@ Import Namespace="Orchard.Mvc.Html" %> + + + + Edit User + <% Html.Include("Head"); %> + + + <% Html.Include("Header"); %> +
+

+ Edit User

+

+ <%=Html.ActionLink("Users", "Index") %> > Edit #<%=Model.Id%> <%=Html.Encode(Model.UserName)%> +

+
+
+ <%using (Html.BeginForm()) { %> +
    + <%= Html.ValidationSummary() %> + <%= Html.EditorForModel() %> +
  1. + + <%=Html.ActionLink("Cancel", "Index", new{}, new{@class="button"}) %> +
  2. +
+ <%}/*EndForm*/%> +
+ <% Html.Include("Footer"); %> + + diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserCreateViewModel.ascx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserCreateViewModel.ascx new file mode 100644 index 000000000..1a804f6d6 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserCreateViewModel.ascx @@ -0,0 +1,7 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Utility" %> + +
    + <%=Html.EditorFor(m=>m.UserName, "inputTextLarge") %> + <%=Html.EditorFor(m=>m.Email, "inputTextLarge") %> +
diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserEditViewModel.ascx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserEditViewModel.ascx new file mode 100644 index 000000000..f6c02264b --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserEditViewModel.ascx @@ -0,0 +1,8 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Utility" %> + +
    + <%=Html.EditorFor(m=>m.Id) %> + <%=Html.EditorFor(m=>m.UserName, "inputTextLarge") %> + <%=Html.EditorFor(m=>m.Email, "inputTextLarge") %> +
diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/inputTextLarge.ascx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/inputTextLarge.ascx new file mode 100644 index 000000000..10a6f7c7d --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/inputTextLarge.ascx @@ -0,0 +1,6 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +
  • + <%=Html.LabelForModel() %> + <%=Html.TextBox("",Model,new{@class="inputText inputTextLarge"}) %> + <%=Html.ValidationMessage("","*")%> +
  • diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Index.aspx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Index.aspx new file mode 100644 index 000000000..7bd4e1f01 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Index.aspx @@ -0,0 +1,56 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> + +<%@ Import Namespace="Orchard.Security" %> +<%@ Import Namespace="Orchard.Mvc.Html" %> + + + + Manage Users + <% Html.Include("Head"); %> + + + <% Html.Include("Header"); %> + <% Html.BeginForm(); %> +
    +

    + Manage Users

    + + <%=Html.ValidationSummary() %> + <%=Html.ActionLink("Add a new user", "Create", new {}, new {@class="floatRight topSpacer"}) %> + + + + + + + + + + + + + + <% foreach (var row in Model.Rows) { %> + + + + + + <%}%> +
    + Name + + Email + +
    + <%=Html.Encode(row.User.As().UserName) %> + + <%=Html.Encode(row.User.As().Email) %> + + <%=Html.ActionLink("Edit", "Edit", new { row.User.Id })%> +
    +
    + <% Html.EndForm(); %> + <% Html.Include("Footer"); %> + + diff --git a/src/Orchard.Web/Packages/Orchard.Users/Web.config b/src/Orchard.Web/Packages/Orchard.Users/Web.config index d38df4e6d..ca8f0375f 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Web.config +++ b/src/Orchard.Web/Packages/Orchard.Users/Web.config @@ -23,11 +23,6 @@ - - - - - @@ -37,7 +32,7 @@ affects performance, set this value to true only during development. --> - + @@ -50,54 +45,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - -