mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-18 17:47:54 +08:00
Refactoring Model concepts into ContentItem based concepts.
--HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4041350
This commit is contained in:
@@ -26,7 +26,7 @@ namespace Orchard.Tests.Packages.Users.Controllers {
|
||||
|
||||
public override void Register(ContainerBuilder builder) {
|
||||
builder.Register<AdminController>();
|
||||
builder.Register<DefaultModelManager>().As<IModelManager>();
|
||||
builder.Register<DefaultContentManager>().As<IContentManager>();
|
||||
builder.Register<MembershipService>().As<IMembershipService>();
|
||||
builder.Register<UserDriver>().As<IModelDriver>();
|
||||
builder.Register(new Mock<INotifier>().Object);
|
||||
@@ -34,14 +34,14 @@ namespace Orchard.Tests.Packages.Users.Controllers {
|
||||
|
||||
protected override IEnumerable<Type> DatabaseTypes {
|
||||
get {
|
||||
return new[] { typeof(UserRecord), typeof(ModelRecord), typeof(ModelTypeRecord) };
|
||||
return new[] { typeof(UserRecord), typeof(ContentItemRecord), typeof(ContentTypeRecord) };
|
||||
}
|
||||
}
|
||||
|
||||
public override void Init() {
|
||||
base.Init();
|
||||
|
||||
var manager = _container.Resolve<IModelManager>();
|
||||
var manager = _container.Resolve<IContentManager>();
|
||||
|
||||
var userOne = manager.New("user").As<UserModel>();
|
||||
userOne.Record = new UserRecord { UserName = "one" };
|
||||
@@ -83,7 +83,7 @@ namespace Orchard.Tests.Packages.Users.Controllers {
|
||||
|
||||
var redirect = (RedirectToRouteResult)result;
|
||||
var id = Convert.ToInt32(redirect.RouteValues["id"]);
|
||||
var manager = _container.Resolve<IModelManager>();
|
||||
var manager = _container.Resolve<IContentManager>();
|
||||
var user = manager.Get(id).As<IUser>();
|
||||
Assert.That(user.UserName, Is.EqualTo("four"));
|
||||
}
|
||||
|
@@ -43,8 +43,8 @@ namespace Orchard.Tests.Packages.Users.Services {
|
||||
_sessionFactory = DataUtility.CreateSessionFactory(
|
||||
databaseFileName,
|
||||
typeof(UserRecord),
|
||||
typeof(ModelRecord),
|
||||
typeof(ModelTypeRecord));
|
||||
typeof(ContentItemRecord),
|
||||
typeof(ContentTypeRecord));
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
@@ -57,7 +57,7 @@ namespace Orchard.Tests.Packages.Users.Services {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterModule(new ImplicitCollectionSupportModule());
|
||||
builder.Register<MembershipService>().As<IMembershipService>();
|
||||
builder.Register<DefaultModelManager>().As<IModelManager>();
|
||||
builder.Register<DefaultContentManager>().As<IContentManager>();
|
||||
builder.Register<UserDriver>().As<IModelDriver>();
|
||||
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
|
||||
_session = _sessionFactory.OpenSession();
|
||||
|
@@ -15,6 +15,8 @@ using Orchard.Environment;
|
||||
using Orchard.Mvc;
|
||||
using Orchard.Mvc.ModelBinders;
|
||||
using Orchard.Mvc.Routes;
|
||||
using Orchard.Packages;
|
||||
using Orchard.Tests.Mvc.Routes;
|
||||
using Orchard.Tests.Stubs;
|
||||
|
||||
namespace Orchard.Tests.Environment {
|
||||
@@ -42,9 +44,21 @@ namespace Orchard.Tests.Environment {
|
||||
builder.Register(_controllerBuilder);
|
||||
builder.Register(_routeCollection);
|
||||
builder.Register(_modelBinderDictionary);
|
||||
builder.Register(new ViewEngineCollection());
|
||||
builder.Register(new StuPackageManager()).As<IPackageManager>();
|
||||
});
|
||||
}
|
||||
|
||||
public class StuPackageManager : IPackageManager {
|
||||
public IEnumerable<PackageDescriptor> AvailablePackages() {
|
||||
return Enumerable.Empty<PackageDescriptor>();
|
||||
}
|
||||
|
||||
public IEnumerable<PackageEntry> ActivePackages() {
|
||||
return Enumerable.Empty<PackageEntry>();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void HostShouldSetControllerFactory() {
|
||||
var host = _container.Resolve<IOrchardHost>();
|
||||
|
@@ -14,7 +14,7 @@ namespace Orchard.Tests.Models {
|
||||
[TestFixture]
|
||||
public class DefaultModelManagerTests {
|
||||
private IContainer _container;
|
||||
private IModelManager _manager;
|
||||
private IContentManager _manager;
|
||||
private ISessionFactory _sessionFactory;
|
||||
private ISession _session;
|
||||
|
||||
@@ -24,8 +24,8 @@ namespace Orchard.Tests.Models {
|
||||
_sessionFactory = DataUtility.CreateSessionFactory(
|
||||
databaseFileName,
|
||||
typeof(GammaRecord),
|
||||
typeof(ModelRecord),
|
||||
typeof(ModelTypeRecord));
|
||||
typeof(ContentItemRecord),
|
||||
typeof(ContentTypeRecord));
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
@@ -37,7 +37,7 @@ namespace Orchard.Tests.Models {
|
||||
public void Init() {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterModule(new ImplicitCollectionSupportModule());
|
||||
builder.Register<DefaultModelManager>().As<IModelManager>();
|
||||
builder.Register<DefaultContentManager>().As<IContentManager>();
|
||||
builder.Register<AlphaDriver>().As<IModelDriver>();
|
||||
builder.Register<BetaDriver>().As<IModelDriver>();
|
||||
builder.Register<GammaDriver>().As<IModelDriver>();
|
||||
@@ -50,7 +50,7 @@ namespace Orchard.Tests.Models {
|
||||
builder.Register(new TestSessionLocator(_session)).As<ISessionLocator>();
|
||||
|
||||
_container = builder.Build();
|
||||
_manager = _container.Resolve<IModelManager>();
|
||||
_manager = _container.Resolve<IContentManager>();
|
||||
}
|
||||
|
||||
public class TestSessionLocator : ISessionLocator {
|
||||
@@ -103,7 +103,7 @@ namespace Orchard.Tests.Models {
|
||||
var modelRecord = CreateModelRecord("alpha");
|
||||
|
||||
var model = _manager.Get(modelRecord.Id);
|
||||
Assert.That(model.ModelType, Is.EqualTo("alpha"));
|
||||
Assert.That(model.ContentType, Is.EqualTo("alpha"));
|
||||
Assert.That(model.Id, Is.EqualTo(modelRecord.Id));
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ namespace Orchard.Tests.Models {
|
||||
|
||||
// create a gamma record
|
||||
var gamma = new GammaRecord {
|
||||
Model = _container.Resolve<IRepository<ModelRecord>>().Get(model.Id),
|
||||
ContentItem = _container.Resolve<IRepository<ContentItemRecord>>().Get(model.Id),
|
||||
Frap = "foo"
|
||||
};
|
||||
|
||||
@@ -130,11 +130,11 @@ namespace Orchard.Tests.Models {
|
||||
// re-fetch from database
|
||||
model = _manager.Get(modelRecord.Id);
|
||||
|
||||
Assert.That(model.ModelType, Is.EqualTo("gamma"));
|
||||
Assert.That(model.ContentType, Is.EqualTo("gamma"));
|
||||
Assert.That(model.Id, Is.EqualTo(modelRecord.Id));
|
||||
Assert.That(model.Is<Gamma>(), Is.True);
|
||||
Assert.That(model.As<Gamma>().Record, Is.Not.Null);
|
||||
Assert.That(model.As<Gamma>().Record.Model.Id, Is.EqualTo(model.Id));
|
||||
Assert.That(model.As<Gamma>().Record.ContentItem.Id, Is.EqualTo(model.Id));
|
||||
|
||||
}
|
||||
|
||||
@@ -143,17 +143,17 @@ namespace Orchard.Tests.Models {
|
||||
var beta = _manager.New("beta");
|
||||
_manager.Create(beta);
|
||||
|
||||
var modelRecord = _container.Resolve<IRepository<ModelRecord>>().Get(beta.Id);
|
||||
var modelRecord = _container.Resolve<IRepository<ContentItemRecord>>().Get(beta.Id);
|
||||
Assert.That(modelRecord, Is.Not.Null);
|
||||
Assert.That(modelRecord.ModelType.Name, Is.EqualTo("beta"));
|
||||
Assert.That(modelRecord.ContentType.Name, Is.EqualTo("beta"));
|
||||
}
|
||||
|
||||
private ModelRecord CreateModelRecord(string modelType) {
|
||||
var modelRepository = _container.Resolve<IRepository<ModelRecord>>();
|
||||
var modelTypeRepository = _container.Resolve<IRepository<ModelTypeRecord>>();
|
||||
private ContentItemRecord CreateModelRecord(string modelType) {
|
||||
var modelRepository = _container.Resolve<IRepository<ContentItemRecord>>();
|
||||
var modelTypeRepository = _container.Resolve<IRepository<ContentTypeRecord>>();
|
||||
|
||||
var modelRecord = new ModelRecord { ModelType = new ModelTypeRecord { Name = modelType } };
|
||||
modelTypeRepository.Create(modelRecord.ModelType);
|
||||
var modelRecord = new ContentItemRecord { ContentType = new ContentTypeRecord { Name = modelType } };
|
||||
modelTypeRepository.Create(modelRecord.ContentType);
|
||||
modelRepository.Create(modelRecord);
|
||||
|
||||
_session.Flush();
|
||||
|
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Models;
|
||||
using Orchard.Models.Driver;
|
||||
using Orchard.Tests.Models.Stubs;
|
||||
|
||||
@@ -11,21 +12,21 @@ namespace Orchard.Tests.Models.Drivers {
|
||||
public class ModelBuilderTests {
|
||||
[Test]
|
||||
public void BuilderShouldReturnWorkingModelWithTypeAndId() {
|
||||
var builder = new ModelBuilder("foo");
|
||||
var builder = new ContentItemBuilder("foo");
|
||||
var model = builder.Build();
|
||||
Assert.That(model.ModelType, Is.EqualTo("foo"));
|
||||
Assert.That(model.ContentType, Is.EqualTo("foo"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IdShouldDefaultToZero() {
|
||||
var builder = new ModelBuilder("foo");
|
||||
var builder = new ContentItemBuilder("foo");
|
||||
var model = builder.Build();
|
||||
Assert.That(model.Id, Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WeldShouldAddPartToModel() {
|
||||
var builder = new ModelBuilder("foo");
|
||||
var builder = new ContentItemBuilder("foo");
|
||||
builder.Weld<Alpha>();
|
||||
var model = builder.Build();
|
||||
|
||||
|
@@ -10,8 +10,11 @@ namespace Orchard.Tests.Models.Drivers {
|
||||
public void ModelDriverShouldUsePersistenceFilterToDelegateCreateAndLoad() {
|
||||
var modelDriver = new TestModelDriver();
|
||||
|
||||
var contentItem = new ContentItem();
|
||||
var part = new TestModelPart();
|
||||
((IModelDriver)modelDriver).Creating(new CreateModelContext { Instance = part });
|
||||
contentItem.Weld(part);
|
||||
|
||||
((IModelDriver)modelDriver).Creating(new CreateModelContext { ContentItem = contentItem });
|
||||
Assert.That(part.CreatingCalled, Is.True);
|
||||
}
|
||||
|
||||
@@ -19,14 +22,14 @@ namespace Orchard.Tests.Models.Drivers {
|
||||
public void PartShouldBeAddedBasedOnSimplePredicate() {
|
||||
var modelDriver = new TestModelDriver();
|
||||
|
||||
var builder = new ModelBuilder("testing");
|
||||
var builder = new ContentItemBuilder("testing");
|
||||
((IModelDriver)modelDriver).Activating(new ActivatingModelContext { Builder = builder, ModelType = "testing" });
|
||||
var model = builder.Build();
|
||||
Assert.That(model.Is<TestModelPart>(), Is.True);
|
||||
Assert.That(model.As<TestModelPart>(), Is.Not.Null);
|
||||
}
|
||||
|
||||
public class TestModelPart : ModelPart {
|
||||
public class TestModelPart : ContentItemPart {
|
||||
public bool CreatingCalled { get; set; }
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
using Orchard.Models;
|
||||
|
||||
namespace Orchard.Tests.Models.Stubs {
|
||||
public class Alpha : ModelPart {
|
||||
public class Alpha : ContentItemPart {
|
||||
}
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
using Orchard.Models;
|
||||
|
||||
namespace Orchard.Tests.Models.Stubs {
|
||||
public class Beta : ModelPart {
|
||||
public class Beta : ContentItemPart {
|
||||
}
|
||||
}
|
@@ -5,6 +5,6 @@ using System.Text;
|
||||
using Orchard.Models;
|
||||
|
||||
namespace Orchard.Tests.Models.Stubs {
|
||||
class Flavored : ModelPart {
|
||||
class Flavored : ContentItemPart {
|
||||
}
|
||||
}
|
||||
|
@@ -4,10 +4,10 @@ using Orchard.Models.Driver;
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Tests.Models.Stubs {
|
||||
public class Gamma : ModelPartWithRecord<GammaRecord> {
|
||||
public class Gamma : ContentItemPartWithRecord<GammaRecord> {
|
||||
}
|
||||
|
||||
public class GammaRecord : ModelPartRecord {
|
||||
public class GammaRecord : ContentPartRecordBase {
|
||||
public virtual string Frap { get; set; }
|
||||
}
|
||||
|
||||
|
@@ -5,6 +5,6 @@ using System.Text;
|
||||
using Orchard.Models;
|
||||
|
||||
namespace Orchard.Tests.Models.Stubs {
|
||||
public class Styled : ModelPart {
|
||||
public class Styled : ContentItemPart {
|
||||
}
|
||||
}
|
||||
|
@@ -9,17 +9,17 @@ namespace Orchard.Core.Common.Models {
|
||||
public class CommonDriver : ModelDriver {
|
||||
private readonly IClock _clock;
|
||||
private readonly IAuthenticationService _authenticationService;
|
||||
private readonly IModelManager _modelManager;
|
||||
private readonly IContentManager _contentManager;
|
||||
|
||||
public CommonDriver(
|
||||
IRepository<CommonRecord> repository,
|
||||
IClock clock,
|
||||
IAuthenticationService authenticationService,
|
||||
IModelManager modelManager) {
|
||||
IContentManager contentManager) {
|
||||
|
||||
_clock = clock;
|
||||
_authenticationService = authenticationService;
|
||||
_modelManager = modelManager;
|
||||
_contentManager = contentManager;
|
||||
|
||||
AddOnCreating<CommonModel>(SetCreateTimesAndAuthor);
|
||||
Filters.Add(new StorageFilterForRecord<CommonRecord>(repository));
|
||||
@@ -42,7 +42,7 @@ namespace Orchard.Core.Common.Models {
|
||||
|
||||
void LoadOwnerModel(LoadModelContext context, CommonModel instance) {
|
||||
if (instance.Record.OwnerId != 0) {
|
||||
instance.Owner = _modelManager.Get(instance.Record.OwnerId).As<IUser>();
|
||||
instance.Owner = _contentManager.Get(instance.Record.OwnerId).As<IUser>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@ using Orchard.Models;
|
||||
using Orchard.Security;
|
||||
|
||||
namespace Orchard.Core.Common.Models {
|
||||
public class CommonModel : ModelPartWithRecord<CommonRecord> {
|
||||
public class CommonModel : ContentItemPartWithRecord<CommonRecord> {
|
||||
public IUser Owner { get; set; }
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
using Orchard.Models;
|
||||
|
||||
namespace Orchard.Core.Common.Models {
|
||||
public class ContentModel : ModelPart {
|
||||
public class ContentModel : ContentItemPart {
|
||||
public string Body { get; set; }
|
||||
public string Format { get; set; }
|
||||
}
|
||||
|
@@ -2,6 +2,6 @@ using Orchard.Core.Common.Records;
|
||||
using Orchard.Models;
|
||||
|
||||
namespace Orchard.Core.Common.Models {
|
||||
public class RoutableModel : ModelPartWithRecord<RoutableRecord> {
|
||||
public class RoutableModel : ContentItemPartWithRecord<RoutableRecord> {
|
||||
}
|
||||
}
|
@@ -2,7 +2,7 @@
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Core.Common.Records {
|
||||
public class CommonRecord : ModelPartRecord {
|
||||
public class CommonRecord : ContentPartRecordBase {
|
||||
public virtual int OwnerId { get; set; }
|
||||
public virtual DateTime? CreatedUtc { get; set; }
|
||||
public virtual DateTime? ModifiedUtc { get; set; }
|
||||
|
@@ -1,7 +1,7 @@
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Core.Common.Records {
|
||||
public class RoutableRecord : ModelPartRecord {
|
||||
public class RoutableRecord : ContentPartRecordBase {
|
||||
public virtual string Title { get; set; }
|
||||
public virtual string Slug { get; set; }
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@ using Orchard.Models;
|
||||
using Orchard.Settings;
|
||||
|
||||
namespace Orchard.Core.Settings.Models {
|
||||
public sealed class SiteModel : ModelPartWithRecord<SiteSettingsRecord>, ISite {
|
||||
public sealed class SiteModel : ContentItemPartWithRecord<SiteSettingsRecord>, ISite {
|
||||
public string SiteName {
|
||||
get { return Record.SiteName; }
|
||||
set { Record.SiteName = value; }
|
||||
|
@@ -1,7 +1,7 @@
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Core.Settings.Records {
|
||||
public class SiteSettingsRecord : ModelPartRecord {
|
||||
public class SiteSettingsRecord : ContentPartRecordBase {
|
||||
public virtual string SiteUrl { get; set; }
|
||||
public virtual string SiteName { get; set; }
|
||||
public virtual string SuperUser { get; set; }
|
||||
|
@@ -9,11 +9,11 @@ using System.Web;
|
||||
namespace Orchard.Core.Settings.Services {
|
||||
public class SiteService : ISiteService {
|
||||
private readonly IRepository<SiteSettingsRecord> _siteSettingsRepository;
|
||||
private readonly IModelManager _modelManager;
|
||||
private readonly IContentManager _contentManager;
|
||||
|
||||
public SiteService(IRepository<SiteSettingsRecord> siteSettingsRepository, IModelManager modelManager) {
|
||||
public SiteService(IRepository<SiteSettingsRecord> siteSettingsRepository, IContentManager contentManager) {
|
||||
_siteSettingsRepository = siteSettingsRepository;
|
||||
_modelManager = modelManager;
|
||||
_contentManager = contentManager;
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
|
||||
@@ -25,12 +25,12 @@ namespace Orchard.Core.Settings.Services {
|
||||
string applicationName = HttpContext.Current.Request.ApplicationPath;
|
||||
SiteSettingsRecord record = _siteSettingsRepository.Get(x => x.SiteUrl == applicationName);
|
||||
if (record == null) {
|
||||
SiteModel site = _modelManager.New("site").As<SiteModel>();
|
||||
SiteModel site = _contentManager.New("site").As<SiteModel>();
|
||||
site.Record.SiteUrl = applicationName;
|
||||
_modelManager.Create(site);
|
||||
_contentManager.Create(site);
|
||||
return site;
|
||||
}
|
||||
return _modelManager.Get(record.Id).As<ISite>();
|
||||
return _contentManager.Get(record.Id).As<ISite>();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using Orchard.Data;
|
||||
using Orchard.Models;
|
||||
using Orchard.Models.Driver;
|
||||
using Orchard.Roles.Models.NoRecord;
|
||||
using Orchard.Roles.Records;
|
||||
@@ -28,21 +29,21 @@ namespace Orchard.Roles.Models {
|
||||
}
|
||||
|
||||
protected override void Creating(CreateModelContext context) {
|
||||
var userRoles = context.Instance.As<UserRolesModel>();
|
||||
var userRoles = context.ContentItem.As<UserRolesModel>();
|
||||
if (userRoles != null) {
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Loading(LoadModelContext context) {
|
||||
var userRoles = context.Instance.As<UserRolesModel>();
|
||||
var userRoles = context.ContentItem.As<UserRolesModel>();
|
||||
if (userRoles != null) {
|
||||
userRoles.Roles = _userRolesRepository.Fetch(x => x.UserId == userRoles.Id)
|
||||
userRoles.Roles = _userRolesRepository.Fetch(x => x.UserId == context.ContentItem.Id)
|
||||
.Select(x => x.Role.Name).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void GetEditors(GetModelEditorsContext context) {
|
||||
var userRoles = context.Instance.As<UserRolesModel>();
|
||||
var userRoles = context.ContentItem.As<UserRolesModel>();
|
||||
if (userRoles != null) {
|
||||
var roles =
|
||||
_roleService.GetRoles().Select(
|
||||
@@ -63,18 +64,18 @@ namespace Orchard.Roles.Models {
|
||||
}
|
||||
|
||||
protected override void UpdateEditors(UpdateModelContext context) {
|
||||
var userRoles = context.Instance.As<UserRolesModel>();
|
||||
var userRoles = context.ContentItem.As<UserRolesModel>();
|
||||
if (userRoles != null) {
|
||||
var viewModel = new UserRolesViewModel();
|
||||
if (context.Updater.TryUpdateModel(viewModel, "UserRoles", null, null)) {
|
||||
|
||||
var currentUserRoleRecords = _userRolesRepository.Fetch(x => x.UserId == userRoles.Id);
|
||||
var currentUserRoleRecords = _userRolesRepository.Fetch(x => x.UserId == context.ContentItem.Id);
|
||||
var currentRoleRecords = currentUserRoleRecords.Select(x => x.Role);
|
||||
var targetRoleRecords = viewModel.Roles.Where(x => x.Granted).Select(x => _roleService.GetRole(x.RoleId));
|
||||
|
||||
foreach (var addingRole in targetRoleRecords.Where(x => !currentRoleRecords.Contains(x))) {
|
||||
_notifier.Warning(string.Format("Adding role {0} to user {1}", addingRole.Name, userRoles.As<IUser>().UserName));
|
||||
_userRolesRepository.Create(new UserRolesRecord { UserId = userRoles.Id, Role = addingRole });
|
||||
_userRolesRepository.Create(new UserRolesRecord { UserId = context.ContentItem.Id, Role = addingRole });
|
||||
}
|
||||
|
||||
foreach (var removingRole in currentUserRoleRecords.Where(x => !targetRoleRecords.Contains(x.Role))) {
|
||||
|
@@ -2,11 +2,11 @@ using System.Collections.Generic;
|
||||
using Orchard.Models;
|
||||
|
||||
namespace Orchard.Roles.Models.NoRecord {
|
||||
public interface IUserRoles : IModel {
|
||||
public interface IUserRoles : IContentItemPart {
|
||||
IList<string> Roles { get; }
|
||||
}
|
||||
|
||||
public class UserRolesModel : ModelPart, IUserRoles {
|
||||
public class UserRolesModel : ContentItemPart, IUserRoles {
|
||||
public UserRolesModel() {
|
||||
Roles = new List<string>();
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Models;
|
||||
using Orchard.Roles.Models.NoRecord;
|
||||
using Orchard.Roles.Records;
|
||||
using Orchard.Security;
|
||||
|
@@ -14,17 +14,17 @@ namespace Orchard.Users.Controllers {
|
||||
|
||||
public class AdminController : Controller, IModelUpdater {
|
||||
private readonly IMembershipService _membershipService;
|
||||
private readonly IModelManager _modelManager;
|
||||
private readonly IContentManager _contentManager;
|
||||
private readonly IRepository<UserRecord> _userRepository;
|
||||
private readonly INotifier _notifier;
|
||||
|
||||
public AdminController(
|
||||
IMembershipService membershipService,
|
||||
IModelManager modelManager,
|
||||
IContentManager contentManager,
|
||||
IRepository<UserRecord> userRepository,
|
||||
INotifier notifier) {
|
||||
_membershipService = membershipService;
|
||||
_modelManager = modelManager;
|
||||
_contentManager = contentManager;
|
||||
_userRepository = userRepository;
|
||||
_notifier = notifier;
|
||||
T = NullLocalizer.Instance;
|
||||
@@ -38,7 +38,7 @@ namespace Orchard.Users.Controllers {
|
||||
var model = new UsersIndexViewModel();
|
||||
model.Rows = _userRepository.Fetch(x => x.UserName != null)
|
||||
.Select(x => new UsersIndexViewModel.Row {
|
||||
User = _modelManager.Get(x.Id).As<UserModel>()
|
||||
User = _contentManager.Get(x.Id).As<UserModel>()
|
||||
})
|
||||
.ToList();
|
||||
|
||||
@@ -67,15 +67,15 @@ namespace Orchard.Users.Controllers {
|
||||
}
|
||||
|
||||
public ActionResult Edit(int id) {
|
||||
var model = new UserEditViewModel { User = _modelManager.Get(id) };
|
||||
model.Editors = _modelManager.GetEditors(model.User);
|
||||
var model = new UserEditViewModel { User = _contentManager.Get<UserModel>(id) };
|
||||
model.Editors = _contentManager.GetEditors(model.User.ContentItem);
|
||||
return View(model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult Edit(int id, FormCollection input) {
|
||||
var model = new UserEditViewModel { User = _modelManager.Get(id) };
|
||||
model.Editors = _modelManager.UpdateEditors(model.User, this);
|
||||
var model = new UserEditViewModel { User = _contentManager.Get<UserModel>(id) };
|
||||
model.Editors = _contentManager.UpdateEditors(model.User.ContentItem, this);
|
||||
|
||||
if (!TryUpdateModel(model, input.ToValueProvider())) {
|
||||
return View(model);
|
||||
|
@@ -2,8 +2,19 @@
|
||||
using Orchard.Security;
|
||||
|
||||
namespace Orchard.Users.Models {
|
||||
public sealed class UserModel : ModelPartWithRecord<UserRecord>, IUser {
|
||||
string IUser.UserName {get { return Record.UserName; }}
|
||||
string IUser.Email {get { return Record.Email; }}
|
||||
public sealed class UserModel : ContentItemPartWithRecord<UserRecord>, IUser {
|
||||
public int Id {
|
||||
get { return ContentItem.Id; }
|
||||
}
|
||||
|
||||
public string UserName {
|
||||
get { return Record.UserName; }
|
||||
set { Record.UserName = value; }
|
||||
}
|
||||
|
||||
public string Email {
|
||||
get { return Record.Email; }
|
||||
set { Record.Email = value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@ using System.Web.Security;
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Users.Models {
|
||||
public class UserRecord : ModelPartRecord {
|
||||
public class UserRecord : ContentPartRecordBase {
|
||||
public virtual string UserName { get; set; }
|
||||
public virtual string Email { get; set; }
|
||||
|
||||
|
@@ -11,11 +11,11 @@ using Orchard.Users.Models;
|
||||
|
||||
namespace Orchard.Users.Services {
|
||||
public class MembershipService : IMembershipService {
|
||||
private readonly IModelManager _modelManager;
|
||||
private readonly IContentManager _contentManager;
|
||||
private readonly IRepository<UserRecord> _userRepository;
|
||||
|
||||
public MembershipService(IModelManager modelManager, IRepository<UserRecord> userRepository) {
|
||||
_modelManager = modelManager;
|
||||
public MembershipService(IContentManager contentManager, IRepository<UserRecord> userRepository) {
|
||||
_contentManager = contentManager;
|
||||
_userRepository = userRepository;
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
@@ -36,9 +36,9 @@ namespace Orchard.Users.Services {
|
||||
};
|
||||
SetPassword(record, createUserParams.Password);
|
||||
|
||||
var user = _modelManager.New("user");
|
||||
var user = _contentManager.New("user");
|
||||
user.As<UserModel>().Record = record;
|
||||
_modelManager.Create(user);
|
||||
_contentManager.Create(user);
|
||||
return user.As<IUser>();
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace Orchard.Users.Services {
|
||||
if (userRecord == null) {
|
||||
return null;
|
||||
}
|
||||
return _modelManager.Get(userRecord.Id).As<IUser>();
|
||||
return _contentManager.Get(userRecord.Id).As<IUser>();
|
||||
}
|
||||
|
||||
public IUser ValidateUser(string username, string password) {
|
||||
@@ -55,7 +55,7 @@ namespace Orchard.Users.Services {
|
||||
if (userRecord == null || ValidatePassword(userRecord, password) == false)
|
||||
return null;
|
||||
|
||||
return _modelManager.Get(userRecord.Id).As<IUser>();
|
||||
return _contentManager.Get(userRecord.Id).As<IUser>();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -8,7 +8,7 @@ using Orchard.Users.Models;
|
||||
|
||||
namespace Orchard.Users.ViewModels {
|
||||
public class UserEditViewModel : AdminViewModel {
|
||||
public IModel User { get; set; }
|
||||
public UserModel User { get; set; }
|
||||
public IEnumerable<ModelTemplate> Editors { get; set; }
|
||||
|
||||
[HiddenInput(DisplayValue = false)]
|
||||
|
@@ -6,10 +6,10 @@ using Orchard.Security;
|
||||
|
||||
namespace Orchard.Wikis.Controllers {
|
||||
public class AdminController : Controller {
|
||||
private readonly IModelManager _modelManager;
|
||||
private readonly IContentManager _contentManager;
|
||||
|
||||
public AdminController(IModelManager modelManager) {
|
||||
_modelManager = modelManager;
|
||||
public AdminController(IContentManager contentManager) {
|
||||
_contentManager = contentManager;
|
||||
}
|
||||
|
||||
public ActionResult Index() {
|
||||
@@ -19,14 +19,14 @@ namespace Orchard.Wikis.Controllers {
|
||||
public IUser CurrentUser { get; set; }
|
||||
|
||||
public ActionResult Create() {
|
||||
var page = _modelManager.New("wikipage");
|
||||
_modelManager.Create(page);
|
||||
var page = _contentManager.New("wikipage");
|
||||
_contentManager.Create(page);
|
||||
|
||||
return RedirectToAction("View", new{page.Id});
|
||||
}
|
||||
|
||||
public ActionResult View(int id) {
|
||||
var page = _modelManager.Get(id).As<CommonModel>();
|
||||
var page = _contentManager.Get(id).As<CommonModel>();
|
||||
return View(page);
|
||||
}
|
||||
}
|
||||
|
@@ -6,10 +6,10 @@ using Orchard.Models.Records;
|
||||
using Orchard.UI.Models;
|
||||
|
||||
namespace Orchard.Wikis.Models {
|
||||
public class WikiSettings : ModelPartWithRecord<WikiSettingsRecord> {
|
||||
public class WikiSettings : ContentItemPartWithRecord<WikiSettingsRecord> {
|
||||
}
|
||||
|
||||
public class WikiSettingsRecord : ModelPartRecord {
|
||||
public class WikiSettingsRecord : ContentPartRecordBase {
|
||||
public virtual bool AllowAnonymousEdits { get; set; }
|
||||
|
||||
[Required]
|
||||
@@ -26,7 +26,7 @@ namespace Orchard.Wikis.Models {
|
||||
}
|
||||
|
||||
protected override void GetEditors(GetModelEditorsContext context) {
|
||||
var model = context.Instance.As<WikiSettings>();
|
||||
var model = context.ContentItem.As<WikiSettings>();
|
||||
if (model == null)
|
||||
return;
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace Orchard.Wikis.Models {
|
||||
}
|
||||
|
||||
protected override void UpdateEditors(UpdateModelContext context) {
|
||||
var model = context.Instance.As<WikiSettings>();
|
||||
var model = context.ContentItem.As<WikiSettings>();
|
||||
if (model == null)
|
||||
return;
|
||||
|
||||
|
@@ -101,7 +101,10 @@ namespace Orchard.Controllers {
|
||||
}
|
||||
|
||||
try {
|
||||
if (true/*MembershipService.ChangePassword(User.Identity.Name, currentPassword, newPassword)*/) {
|
||||
var validated = _membershipService.ValidateUser(User.Identity.Name, currentPassword);
|
||||
|
||||
if (validated != null) {
|
||||
_membershipService.SetPassword(validated, newPassword);
|
||||
return RedirectToAction("ChangePasswordSuccess");
|
||||
}
|
||||
else {
|
||||
|
@@ -64,7 +64,7 @@ namespace Orchard.Data {
|
||||
type.GetProperty("Id") != null &&
|
||||
!type.IsSealed &&
|
||||
!type.IsAbstract &&
|
||||
!typeof(IModel).IsAssignableFrom(type);
|
||||
!typeof(IContentItemPart).IsAssignableFrom(type);
|
||||
}
|
||||
|
||||
public ISession For(Type entityType) {
|
||||
|
50
src/Orchard/Models/ContentExtensions.cs
Normal file
50
src/Orchard/Models/ContentExtensions.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models {
|
||||
|
||||
public static class ContentExtensions {
|
||||
public static T New<T>(this IContentManager manager, string contentType) where T : class, IContentItemPart {
|
||||
var contentItem = manager.New(contentType);
|
||||
if (contentItem == null)
|
||||
return null;
|
||||
|
||||
var part = contentItem.Get<T>();
|
||||
if (part == null)
|
||||
throw new InvalidCastException();
|
||||
|
||||
return part;
|
||||
}
|
||||
|
||||
public static T Get<T>(this IContentManager manager, int id) where T : class, IContentItemPart {
|
||||
return manager.Get(id).Get<T>();
|
||||
}
|
||||
|
||||
public static void Create(this IContentManager manager, IContentItemPart part) {
|
||||
manager.Create(part.ContentItem);
|
||||
}
|
||||
|
||||
public static bool Has<T>(this IContentItemPart part) {
|
||||
return part.ContentItem.Has<T>();
|
||||
}
|
||||
|
||||
public static T Get<T>(this IContentItemPart part) {
|
||||
return part.ContentItem.Get<T>();
|
||||
}
|
||||
|
||||
public static bool Is<T>(this IContentItemPart part) {
|
||||
return part.ContentItem.Has<T>();
|
||||
}
|
||||
|
||||
public static T As<T>(this IContentItemPart part) {
|
||||
return part.ContentItem.Get<T>();
|
||||
}
|
||||
|
||||
public static bool Is<T>(this ContentItem contentItem) {
|
||||
return contentItem.Has<T>();
|
||||
}
|
||||
public static T As<T>(this ContentItem contentItem) {
|
||||
return contentItem.Get<T>();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
34
src/Orchard/Models/ContentItemPart.cs
Normal file
34
src/Orchard/Models/ContentItemPart.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public class ContentItem {
|
||||
public ContentItem() {
|
||||
_parts = new List<IContentItemPart>();
|
||||
}
|
||||
|
||||
private readonly IList<IContentItemPart> _parts;
|
||||
|
||||
public int Id { get; set; }
|
||||
|
||||
public string ContentType { get; set; }
|
||||
|
||||
public bool Has<TPart>() {
|
||||
return _parts.Any(part => part is TPart);
|
||||
}
|
||||
|
||||
public TPart Get<TPart>() {
|
||||
return _parts.OfType<TPart>().FirstOrDefault();
|
||||
}
|
||||
|
||||
public void Weld(IContentItemPart part) {
|
||||
part.ContentItem = this;
|
||||
_parts.Add(part);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class ContentItemPart : IContentItemPart {
|
||||
public ContentItem ContentItem { get; set; }
|
||||
}
|
||||
}
|
5
src/Orchard/Models/ContentItemPartWithRecord.cs
Normal file
5
src/Orchard/Models/ContentItemPartWithRecord.cs
Normal file
@@ -0,0 +1,5 @@
|
||||
namespace Orchard.Models {
|
||||
public abstract class ContentItemPartWithRecord<TRecord> : ContentItemPart {
|
||||
public TRecord Record { get; set; }
|
||||
}
|
||||
}
|
@@ -8,18 +8,18 @@ using Orchard.Models.Records;
|
||||
using Orchard.UI.Models;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public class DefaultModelManager : IModelManager {
|
||||
public class DefaultContentManager : IContentManager {
|
||||
private readonly IContext _context;
|
||||
private readonly IRepository<ModelRecord> _modelRepository;
|
||||
private readonly IRepository<ModelTypeRecord> _modelTypeRepository;
|
||||
private readonly IRepository<ContentItemRecord> _contentItemRepository;
|
||||
private readonly IRepository<ContentTypeRecord> _contentTypeRepository;
|
||||
|
||||
public DefaultModelManager(
|
||||
public DefaultContentManager(
|
||||
IContext context,
|
||||
IRepository<ModelRecord> modelRepository,
|
||||
IRepository<ModelTypeRecord> modelTypeRepository) {
|
||||
IRepository<ContentItemRecord> contentItemRepository,
|
||||
IRepository<ContentTypeRecord> contentTypeRepository) {
|
||||
_context = context;
|
||||
_modelRepository = modelRepository;
|
||||
_modelTypeRepository = modelTypeRepository;
|
||||
_contentItemRepository = contentItemRepository;
|
||||
_contentTypeRepository = contentTypeRepository;
|
||||
}
|
||||
|
||||
private IEnumerable<IModelDriver> _drivers;
|
||||
@@ -31,12 +31,12 @@ namespace Orchard.Models {
|
||||
}
|
||||
}
|
||||
|
||||
public virtual IModel New(string modelType) {
|
||||
public virtual ContentItem New(string modelType) {
|
||||
|
||||
// create a new kernel for the model instance
|
||||
var context = new ActivatingModelContext {
|
||||
ModelType = modelType,
|
||||
Builder = new ModelBuilder(modelType)
|
||||
Builder = new ContentItemBuilder(modelType)
|
||||
};
|
||||
|
||||
// invoke drivers to weld aspects onto kernel
|
||||
@@ -44,31 +44,31 @@ namespace Orchard.Models {
|
||||
driver.Activating(context);
|
||||
}
|
||||
var context2 = new ActivatedModelContext {
|
||||
ModelType = modelType,
|
||||
Instance = context.Builder.Build()
|
||||
ContentType = modelType,
|
||||
ContentItem = context.Builder.Build()
|
||||
};
|
||||
foreach (var driver in Drivers) {
|
||||
driver.Activated(context2);
|
||||
}
|
||||
|
||||
// composite result is returned
|
||||
return context2.Instance;
|
||||
return context2.ContentItem;
|
||||
}
|
||||
|
||||
public virtual IModel Get(int id) {
|
||||
public virtual ContentItem Get(int id) {
|
||||
// obtain root record to determine the model type
|
||||
var modelRecord = _modelRepository.Get(id);
|
||||
var contentItemRecord = _contentItemRepository.Get(id);
|
||||
|
||||
// create a context with a new instance to load
|
||||
var context = new LoadModelContext {
|
||||
Id = modelRecord.Id,
|
||||
ModelType = modelRecord.ModelType.Name,
|
||||
ModelRecord = modelRecord,
|
||||
Instance = New(modelRecord.ModelType.Name)
|
||||
Id = contentItemRecord.Id,
|
||||
ModelType = contentItemRecord.ContentType.Name,
|
||||
ContentItemRecord = contentItemRecord,
|
||||
ContentItem = New(contentItemRecord.ContentType.Name)
|
||||
};
|
||||
|
||||
// set the id
|
||||
context.Instance.As<ModelRoot>().Id = context.Id;
|
||||
context.ContentItem.Id = context.Id;
|
||||
|
||||
// invoke drivers to acquire state, or at least establish lazy loading callbacks
|
||||
foreach (var driver in Drivers) {
|
||||
@@ -78,24 +78,24 @@ namespace Orchard.Models {
|
||||
driver.Loaded(context);
|
||||
}
|
||||
|
||||
return context.Instance;
|
||||
return context.ContentItem;
|
||||
}
|
||||
|
||||
public void Create(IModel model) {
|
||||
public void Create(ContentItem contentItem) {
|
||||
// produce root record to determine the model id
|
||||
var modelRecord = new ModelRecord { ModelType = AcquireModelTypeRecord(model.ModelType) };
|
||||
_modelRepository.Create(modelRecord);
|
||||
var modelRecord = new ContentItemRecord { ContentType = AcquireContentTypeRecord(contentItem.ContentType) };
|
||||
_contentItemRepository.Create(modelRecord);
|
||||
|
||||
// build a context with the initialized instance to create
|
||||
var context = new CreateModelContext {
|
||||
Id = modelRecord.Id,
|
||||
ModelType = modelRecord.ModelType.Name,
|
||||
ModelRecord = modelRecord,
|
||||
Instance = model.As<ModelRoot>().Welded
|
||||
ModelType = modelRecord.ContentType.Name,
|
||||
ContentItemRecord = modelRecord,
|
||||
ContentItem = contentItem
|
||||
};
|
||||
|
||||
// set the id
|
||||
context.Instance.As<ModelRoot>().Id = context.Id;
|
||||
context.ContentItem.Id = context.Id;
|
||||
|
||||
|
||||
// invoke drivers to add information to persistent stores
|
||||
@@ -107,28 +107,28 @@ namespace Orchard.Models {
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<ModelTemplate> GetEditors(IModel model) {
|
||||
var context = new GetModelEditorsContext(model);
|
||||
public IEnumerable<ModelTemplate> GetEditors(ContentItem contentItem) {
|
||||
var context = new GetModelEditorsContext(contentItem);
|
||||
foreach (var driver in Drivers) {
|
||||
driver.GetEditors(context);
|
||||
}
|
||||
return context.Editors;
|
||||
}
|
||||
|
||||
public IEnumerable<ModelTemplate> UpdateEditors(IModel model, IModelUpdater updater) {
|
||||
var context = new UpdateModelContext(model, updater);
|
||||
public IEnumerable<ModelTemplate> UpdateEditors(ContentItem contentItem, IModelUpdater updater) {
|
||||
var context = new UpdateModelContext(contentItem, updater);
|
||||
foreach (var driver in Drivers) {
|
||||
driver.UpdateEditors(context);
|
||||
}
|
||||
return context.Editors;
|
||||
}
|
||||
|
||||
private ModelTypeRecord AcquireModelTypeRecord(string modelType) {
|
||||
var modelTypeRecord = _modelTypeRepository.Get(x => x.Name == modelType);
|
||||
private ContentTypeRecord AcquireContentTypeRecord(string contentType) {
|
||||
var modelTypeRecord = _contentTypeRepository.Get(x => x.Name == contentType);
|
||||
if (modelTypeRecord == null) {
|
||||
//TEMP: this is not safe... Model types could be created concurrently?
|
||||
modelTypeRecord = new ModelTypeRecord { Name = modelType };
|
||||
_modelTypeRepository.Create(modelTypeRecord);
|
||||
//TEMP: this is not safe... ContentItem types could be created concurrently?
|
||||
modelTypeRecord = new ContentTypeRecord { Name = contentType };
|
||||
_contentTypeRepository.Create(modelTypeRecord);
|
||||
}
|
||||
return modelTypeRecord;
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
namespace Orchard.Models.Driver {
|
||||
public class ActivatedModelContext {
|
||||
public string ModelType { get; set; }
|
||||
public IModel Instance { get; set; }
|
||||
public string ContentType { get; set; }
|
||||
public ContentItem ContentItem { get; set; }
|
||||
}
|
||||
}
|
@@ -2,7 +2,7 @@ using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class ActivatingFilter<TPart> : IModelActivatingFilter where TPart : class, IModel, new() {
|
||||
public class ActivatingFilter<TPart> : IModelActivatingFilter where TPart : class, IContentItemPart, new() {
|
||||
private readonly Func<string, bool> _predicate;
|
||||
|
||||
public ActivatingFilter(Func<string, bool> predicate) {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
namespace Orchard.Models.Driver {
|
||||
public class ActivatingModelContext {
|
||||
public string ModelType { get; set; }
|
||||
public ModelBuilder Builder { get; set; }
|
||||
public ContentItemBuilder Builder { get; set; }
|
||||
}
|
||||
}
|
||||
|
21
src/Orchard/Models/Driver/ContentItemBuilder.cs
Normal file
21
src/Orchard/Models/Driver/ContentItemBuilder.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class ContentItemBuilder {
|
||||
private ContentItem _item;
|
||||
|
||||
public ContentItemBuilder(string contentType) {
|
||||
_item = new ContentItem { ContentType = contentType };
|
||||
}
|
||||
|
||||
public ContentItem Build() {
|
||||
return _item;
|
||||
}
|
||||
|
||||
public ContentItemBuilder Weld<TPart>() where TPart : class, IContentItemPart, new() {
|
||||
var part = new TPart();
|
||||
_item.Weld(part);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
@@ -4,7 +4,7 @@ namespace Orchard.Models.Driver {
|
||||
public class CreateModelContext {
|
||||
public int Id { get; set; }
|
||||
public string ModelType { get; set; }
|
||||
public ModelRecord ModelRecord { get; set; }
|
||||
public IModel Instance { get; set; }
|
||||
public ContentItemRecord ContentItemRecord { get; set; }
|
||||
public ContentItem ContentItem { get; set; }
|
||||
}
|
||||
}
|
@@ -3,11 +3,11 @@ using Orchard.UI.Models;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class GetModelEditorsContext {
|
||||
public GetModelEditorsContext(IModel model) {
|
||||
Instance = model;
|
||||
public GetModelEditorsContext(ContentItem part) {
|
||||
ContentItem = part;
|
||||
Editors= new List<ModelTemplate>();
|
||||
}
|
||||
public IModel Instance { get; set; }
|
||||
public ContentItem ContentItem { get; set; }
|
||||
public IList<ModelTemplate> Editors { get; set; }
|
||||
}
|
||||
}
|
@@ -5,7 +5,7 @@ namespace Orchard.Models.Driver {
|
||||
public class LoadModelContext {
|
||||
public int Id { get; set; }
|
||||
public string ModelType { get; set; }
|
||||
public ModelRecord ModelRecord { get; set; }
|
||||
public IModel Instance { get; set; }
|
||||
public ContentItemRecord ContentItemRecord { get; set; }
|
||||
public ContentItem ContentItem { get; set; }
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class ModelBuilder {
|
||||
private IModel _instance;
|
||||
|
||||
public ModelBuilder(string modelType) {
|
||||
_instance = new ModelRoot(modelType);
|
||||
}
|
||||
|
||||
public IModel Build() {
|
||||
return _instance;
|
||||
}
|
||||
|
||||
public ModelBuilder Weld<TPart>() where TPart : class, IModel, new() {
|
||||
var part = new TPart();
|
||||
part.Weld(_instance);
|
||||
_instance = part;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
@@ -13,17 +13,17 @@ namespace Orchard.Models.Driver {
|
||||
public List<IModelFilter> Filters { get; set; }
|
||||
public ILogger Logger { get; set; }
|
||||
|
||||
public void AddOnActivated<TPart>(Action<ActivatedModelContext, TPart> handler) where TPart : class, IModel {
|
||||
public void AddOnActivated<TPart>(Action<ActivatedModelContext, TPart> handler) where TPart : class, IContentItemPart {
|
||||
Filters.Add(new InlineStorageFilter<TPart> { OnActivated = handler });
|
||||
}
|
||||
public void AddOnCreating<TPart>(Action<CreateModelContext, TPart> handler) where TPart : class, IModel {
|
||||
public void AddOnCreating<TPart>(Action<CreateModelContext, TPart> handler) where TPart : class, IContentItemPart {
|
||||
Filters.Add(new InlineStorageFilter<TPart> { OnCreating = handler });
|
||||
}
|
||||
public void AddOnLoaded<TPart>(Action<LoadModelContext, TPart> handler) where TPart : class, IModel {
|
||||
public void AddOnLoaded<TPart>(Action<LoadModelContext, TPart> handler) where TPart : class, IContentItemPart {
|
||||
Filters.Add(new InlineStorageFilter<TPart> { OnLoaded = handler });
|
||||
}
|
||||
|
||||
class InlineStorageFilter<TPart> : StorageFilterBase<TPart> where TPart : class, IModel {
|
||||
class InlineStorageFilter<TPart> : StorageFilterBase<TPart> where TPart : class, IContentItemPart {
|
||||
public Action<ActivatedModelContext, TPart> OnActivated { get; set; }
|
||||
public Action<CreateModelContext, TPart> OnCreating { get; set; }
|
||||
public Action<CreateModelContext, TPart> OnCreated { get; set; }
|
||||
|
@@ -1,10 +0,0 @@
|
||||
namespace Orchard.Models.Driver {
|
||||
public class NewModelContext {
|
||||
public string ModelType { get; set; }
|
||||
public ModelBuilder Builder { get; set; }
|
||||
}
|
||||
public class NewedModelContext {
|
||||
public string ModelType { get; set; }
|
||||
public IModel Instance { get; set; }
|
||||
}
|
||||
}
|
@@ -1,5 +1,5 @@
|
||||
namespace Orchard.Models.Driver {
|
||||
public abstract class StorageFilterBase<TPart> : IModelStorageFilter where TPart : class, IModel {
|
||||
public abstract class StorageFilterBase<TPart> : IModelStorageFilter where TPart : class, IContentItemPart {
|
||||
|
||||
protected virtual void Activated(ActivatedModelContext context, TPart instance) { }
|
||||
protected virtual void Creating(CreateModelContext context, TPart instance) { }
|
||||
@@ -9,28 +9,28 @@ namespace Orchard.Models.Driver {
|
||||
|
||||
|
||||
void IModelStorageFilter.Activated(ActivatedModelContext context) {
|
||||
if (context.Instance.Is<TPart>())
|
||||
Activated(context, context.Instance.As<TPart>());
|
||||
if (context.ContentItem.Is<TPart>())
|
||||
Activated(context, context.ContentItem.As<TPart>());
|
||||
}
|
||||
|
||||
void IModelStorageFilter.Creating(CreateModelContext context) {
|
||||
if (context.Instance.Is<TPart>())
|
||||
Creating(context, context.Instance.As<TPart>());
|
||||
if (context.ContentItem.Is<TPart>())
|
||||
Creating(context, context.ContentItem.As<TPart>());
|
||||
}
|
||||
|
||||
void IModelStorageFilter.Created(CreateModelContext context) {
|
||||
if (context.Instance.Is<TPart>())
|
||||
Created(context, context.Instance.As<TPart>());
|
||||
if (context.ContentItem.Is<TPart>())
|
||||
Created(context, context.ContentItem.As<TPart>());
|
||||
}
|
||||
|
||||
void IModelStorageFilter.Loading(LoadModelContext context) {
|
||||
if (context.Instance.Is<TPart>())
|
||||
Loading(context, context.Instance.As<TPart>());
|
||||
if (context.ContentItem.Is<TPart>())
|
||||
Loading(context, context.ContentItem.As<TPart>());
|
||||
}
|
||||
|
||||
void IModelStorageFilter.Loaded(LoadModelContext context) {
|
||||
if (context.Instance.Is<TPart>())
|
||||
Loaded(context, context.Instance.As<TPart>());
|
||||
if (context.ContentItem.Is<TPart>())
|
||||
Loaded(context, context.ContentItem.As<TPart>());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@ using Orchard.Data;
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class StorageFilterForRecord<TRecord> : StorageFilterBase<ModelPartWithRecord<TRecord>> where TRecord : ModelPartRecord,new() {
|
||||
public class StorageFilterForRecord<TRecord> : StorageFilterBase<ContentItemPartWithRecord<TRecord>> where TRecord : ContentPartRecordBase,new() {
|
||||
private readonly IRepository<TRecord> _repository;
|
||||
|
||||
public StorageFilterForRecord(IRepository<TRecord> repository) {
|
||||
@@ -11,19 +11,19 @@ namespace Orchard.Models.Driver {
|
||||
|
||||
public bool AutomaticallyCreateMissingRecord { get; set; }
|
||||
|
||||
protected override void Activated(ActivatedModelContext context, ModelPartWithRecord<TRecord> instance) {
|
||||
protected override void Activated(ActivatedModelContext context, ContentItemPartWithRecord<TRecord> instance) {
|
||||
instance.Record = new TRecord();
|
||||
}
|
||||
|
||||
protected override void Creating(CreateModelContext context, ModelPartWithRecord<TRecord> instance) {
|
||||
instance.Record.Model = context.ModelRecord;
|
||||
protected override void Creating(CreateModelContext context, ContentItemPartWithRecord<TRecord> instance) {
|
||||
instance.Record.ContentItem = context.ContentItemRecord;
|
||||
_repository.Create(instance.Record);
|
||||
}
|
||||
|
||||
protected override void Loading(LoadModelContext context, ModelPartWithRecord<TRecord> instance) {
|
||||
instance.Record = _repository.Get(instance.Id);
|
||||
protected override void Loading(LoadModelContext context, ContentItemPartWithRecord<TRecord> instance) {
|
||||
instance.Record = _repository.Get(instance.ContentItem.Id);
|
||||
if (instance.Record == null && AutomaticallyCreateMissingRecord) {
|
||||
instance.Record = new TRecord {Model = context.ModelRecord};
|
||||
instance.Record = new TRecord {ContentItem = context.ContentItemRecord};
|
||||
_repository.Create(instance.Record);
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
namespace Orchard.Models.Driver {
|
||||
public class UpdateModelContext : GetModelEditorsContext {
|
||||
public UpdateModelContext(IModel model, IModelUpdater updater) : base(model) {
|
||||
public UpdateModelContext(ContentItem contentItem, IModelUpdater updater) : base(contentItem) {
|
||||
Updater = updater;
|
||||
}
|
||||
|
||||
|
12
src/Orchard/Models/IContentItemPart.cs
Normal file
12
src/Orchard/Models/IContentItemPart.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
namespace Orchard.Models {
|
||||
public interface IContentItemPart {
|
||||
ContentItem ContentItem { get; set; }
|
||||
//int Id { get; }
|
||||
//string ModelType { get; }
|
||||
|
||||
//bool Is<T>() where T : class, IContentItemPart;
|
||||
//T As<T>() where T : class, IContentItemPart;
|
||||
|
||||
//void Weld(IContentItemPart part);
|
||||
}
|
||||
}
|
14
src/Orchard/Models/IContentManager.cs
Normal file
14
src/Orchard/Models/IContentManager.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Models.Driver;
|
||||
using Orchard.UI.Models;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public interface IContentManager : IDependency {
|
||||
ContentItem New(string contentType);
|
||||
ContentItem Get(int id);
|
||||
void Create(ContentItem contentItem);
|
||||
|
||||
IEnumerable<ModelTemplate> GetEditors(ContentItem contentItem);
|
||||
IEnumerable<ModelTemplate> UpdateEditors(ContentItem contentItem, IModelUpdater updater);
|
||||
}
|
||||
}
|
@@ -1,11 +0,0 @@
|
||||
namespace Orchard.Models {
|
||||
public interface IModel {
|
||||
int Id { get; }
|
||||
string ModelType { get; }
|
||||
|
||||
bool Is<T>() where T : class, IModel;
|
||||
T As<T>() where T : class, IModel;
|
||||
|
||||
void Weld(IModel model);
|
||||
}
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Models.Driver;
|
||||
using Orchard.UI.Models;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public interface IModelManager : IDependency {
|
||||
IModel New(string modelType);
|
||||
IModel Get(int id);
|
||||
void Create(IModel model);
|
||||
IEnumerable<ModelTemplate> GetEditors(IModel model);
|
||||
IEnumerable<ModelTemplate> UpdateEditors(IModel model, IModelUpdater updater);
|
||||
}
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public static class ModelExtensions {
|
||||
public static T New<T>(this IModelManager manager, string modelType) where T : class, IModel {
|
||||
var t = manager.New(modelType).As<T>();
|
||||
if (t == null)
|
||||
throw new InvalidCastException();
|
||||
return t;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -1,33 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public abstract class ModelPart : IModel {
|
||||
protected IModel Next { get; set; }
|
||||
protected ModelRoot Root { get; set; }
|
||||
|
||||
void IModel.Weld(IModel model) {
|
||||
Next = model;
|
||||
Root = model.As<ModelRoot>();
|
||||
Root.Welded = this;
|
||||
}
|
||||
|
||||
public int Id { get { return Root.Id; } }
|
||||
public string ModelType { get { return Root.ModelType; } }
|
||||
|
||||
bool IModel.Is<T>() {
|
||||
return this is T ? true : Next.Is<T>();
|
||||
}
|
||||
|
||||
T IModel.As<T>() {
|
||||
return this is T ? this as T : Next.As<T>();
|
||||
}
|
||||
|
||||
public bool Is<T>() where T : class, IModel {
|
||||
return Root.WeldedIs<T>();
|
||||
}
|
||||
|
||||
public T As<T>() where T : class, IModel {
|
||||
return Root.WeldedAs<T>();
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,5 +0,0 @@
|
||||
namespace Orchard.Models {
|
||||
public abstract class ModelPartWithRecord<TRecord> : ModelPart {
|
||||
public TRecord Record { get; set; }
|
||||
}
|
||||
}
|
@@ -1,35 +1,4 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public sealed class ModelRoot : IModel {
|
||||
public ModelRoot(string modelType) {
|
||||
Welded = this;
|
||||
ModelType = modelType;
|
||||
}
|
||||
|
||||
public IModel Welded { get; set; }
|
||||
|
||||
public int Id { get; set; }
|
||||
public string ModelType { get; set; }
|
||||
|
||||
bool IModel.Is<T>() {
|
||||
return this is T;
|
||||
}
|
||||
|
||||
T IModel.As<T>() {
|
||||
return this as T;
|
||||
}
|
||||
|
||||
public bool WeldedIs<T>() where T : class, IModel {
|
||||
return Welded.Is<T>();
|
||||
}
|
||||
|
||||
public T WeldedAs<T>() where T : class, IModel {
|
||||
return Welded.As<T>();
|
||||
}
|
||||
|
||||
void IModel.Weld(IModel model) {
|
||||
// this method is not called on root
|
||||
}
|
||||
}
|
||||
}
|
6
src/Orchard/Models/Records/ContentItemRecord.cs
Normal file
6
src/Orchard/Models/Records/ContentItemRecord.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Orchard.Models.Records {
|
||||
public class ContentItemRecord {
|
||||
public virtual int Id { get; set; }
|
||||
public virtual ContentTypeRecord ContentType { get; set; }
|
||||
}
|
||||
}
|
42
src/Orchard/Models/Records/ContentPartRecordBase.cs
Normal file
42
src/Orchard/Models/Records/ContentPartRecordBase.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using FluentNHibernate.Automapping;
|
||||
using FluentNHibernate.Automapping.Alterations;
|
||||
|
||||
namespace Orchard.Models.Records {
|
||||
public abstract class ContentPartRecordBase {
|
||||
public virtual int Id { get; set; }
|
||||
public virtual ContentItemRecord ContentItem { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ModelPartRecordAlteration : IAutoMappingAlteration {
|
||||
public void Alter(AutoPersistenceModel model) {
|
||||
|
||||
model.OverrideAll(mapping => {
|
||||
var genericArguments = mapping.GetType().GetGenericArguments();
|
||||
if (!genericArguments.Single().IsSubclassOf(typeof(ContentPartRecordBase))) {
|
||||
return;
|
||||
}
|
||||
|
||||
var type = typeof(Alteration<>).MakeGenericType(genericArguments);
|
||||
var alteration = (IAlteration)Activator.CreateInstance(type);
|
||||
alteration.Override(mapping);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
interface IAlteration {
|
||||
void Override(object mapping);
|
||||
}
|
||||
|
||||
class Alteration<T> : IAlteration where T : ContentPartRecordBase {
|
||||
public void Override(object o) {
|
||||
var mapping = (AutoMapping<T>)o;
|
||||
mapping.Id(x => x.Id).GeneratedBy.Foreign("ContentItem");
|
||||
mapping.HasOne(x => x.ContentItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
6
src/Orchard/Models/Records/ContentTypeRecord.cs
Normal file
6
src/Orchard/Models/Records/ContentTypeRecord.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Orchard.Models.Records {
|
||||
public class ContentTypeRecord {
|
||||
public virtual int Id { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
}
|
||||
}
|
@@ -139,25 +139,25 @@
|
||||
<Compile Include="Logging\LoggingModule.cs" />
|
||||
<Compile Include="Logging\NullLogger.cs" />
|
||||
<Compile Include="Logging\NullLoggerFactory.cs" />
|
||||
<Compile Include="Models\DefaultModelManager.cs" />
|
||||
<Compile Include="Models\DefaultContentManager.cs" />
|
||||
<Compile Include="Models\Driver\CreateModelContext.cs" />
|
||||
<Compile Include="Models\Driver\LoadModelContext.cs" />
|
||||
<Compile Include="Models\Driver\ModelBuilder.cs" />
|
||||
<Compile Include="Models\Driver\ContentItemBuilder.cs" />
|
||||
<Compile Include="Models\Driver\ModelDriver.cs" />
|
||||
<Compile Include="Models\Driver\ActivatingModelContext.cs" />
|
||||
<Compile Include="Models\Driver\GetModelEditorsContext.cs" />
|
||||
<Compile Include="Models\Driver\StorageFilterForRecord.cs" />
|
||||
<Compile Include="Models\Driver\StorageFilterBase.cs" />
|
||||
<Compile Include="Models\IModelManager.cs" />
|
||||
<Compile Include="Models\IContentManager.cs" />
|
||||
<Compile Include="Models\Driver\IModelDriver.cs" />
|
||||
<Compile Include="Models\IModel.cs" />
|
||||
<Compile Include="Models\ModelExtensions.cs" />
|
||||
<Compile Include="Models\ModelPart.cs" />
|
||||
<Compile Include="Models\ModelPartWithRecord.cs" />
|
||||
<Compile Include="Models\ContentExtensions.cs" />
|
||||
<Compile Include="Models\ContentItemPart.cs" />
|
||||
<Compile Include="Models\IContentItemPart.cs" />
|
||||
<Compile Include="Models\ContentItemPartWithRecord.cs" />
|
||||
<Compile Include="Models\ModelRoot.cs" />
|
||||
<Compile Include="Models\Records\ModelPartRecord.cs" />
|
||||
<Compile Include="Models\Records\ModelTypeRecord.cs" />
|
||||
<Compile Include="Models\Records\ModelRecord.cs" />
|
||||
<Compile Include="Models\Records\ContentPartRecordBase.cs" />
|
||||
<Compile Include="Models\Records\ContentTypeRecord.cs" />
|
||||
<Compile Include="Models\Records\ContentItemRecord.cs" />
|
||||
<Compile Include="Models\Driver\UpdateModelContext.cs" />
|
||||
<Compile Include="Mvc\Html\HtmlHelperExtensions.cs" />
|
||||
<Compile Include="Mvc\Filters\FilterProvider.cs" />
|
||||
|
@@ -4,7 +4,8 @@ namespace Orchard.Security {
|
||||
/// <summary>
|
||||
/// Interface provided by the "user" model.
|
||||
/// </summary>
|
||||
public interface IUser : IModel {
|
||||
public interface IUser : IContentItemPart {
|
||||
int Id { get; }
|
||||
string UserName { get; }
|
||||
string Email { get; }
|
||||
}
|
||||
|
@@ -8,12 +8,12 @@ using Orchard.Services;
|
||||
namespace Orchard.Security.Providers {
|
||||
public class FormsAuthenticationService : IAuthenticationService {
|
||||
private readonly IClock _clock;
|
||||
private readonly IModelManager _modelManager;
|
||||
private readonly IContentManager _contentManager;
|
||||
private readonly HttpContextBase _httpContext;
|
||||
|
||||
public FormsAuthenticationService(IClock clock, IModelManager modelManager, HttpContextBase httpContext) {
|
||||
public FormsAuthenticationService(IClock clock, IContentManager contentManager, HttpContextBase httpContext) {
|
||||
_clock = clock;
|
||||
_modelManager = modelManager;
|
||||
_contentManager = contentManager;
|
||||
_httpContext = httpContext;
|
||||
Logger = NullLogger.Instance;
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace Orchard.Security.Providers {
|
||||
Logger.Fatal("User id not a parsable integer");
|
||||
return null;
|
||||
}
|
||||
return _modelManager.Get(userId).As<IUser>();
|
||||
return _contentManager.Get(userId).As<IUser>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ namespace Orchard.Settings {
|
||||
/// <summary>
|
||||
/// Interface provided by the "settings" model.
|
||||
/// </summary>
|
||||
public interface ISite : IModel {
|
||||
public interface ISite : IContentItemPart {
|
||||
string SiteName { get; }
|
||||
string SuperUser { get; }
|
||||
}
|
||||
|
Reference in New Issue
Block a user