diff --git a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj
new file mode 100644
index 000000000..797ae59ec
--- /dev/null
+++ b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj
@@ -0,0 +1,61 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {6CB3EB30-F725-45C0-9742-42599BA8E8D2}
+ Library
+ Properties
+ Orchard.Tests.Packages
+ Orchard.Tests.Packages
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+ 3.5
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Orchard.Tests.Packages/Properties/AssemblyInfo.cs b/src/Orchard.Tests.Packages/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..f593d1b89
--- /dev/null
+++ b/src/Orchard.Tests.Packages/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Orchard.Tests.Packages")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft IT")]
+[assembly: AssemblyProduct("Orchard.Tests.Packages")]
+[assembly: AssemblyCopyright("Copyright © Microsoft IT 2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("48eebfb4-714d-4859-829a-15fbe7e1bc9f")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/Orchard.Tests/DataUtility.cs b/src/Orchard.Tests/DataUtility.cs
index 35a2dabda..1e20f7690 100644
--- a/src/Orchard.Tests/DataUtility.cs
+++ b/src/Orchard.Tests/DataUtility.cs
@@ -28,7 +28,7 @@ namespace Orchard.Tests {
private static void AddAlterations(AutoMappingAlterationCollection alterations, Type[] types) {
foreach (var assembly in types.Select(t => t.Assembly).Distinct()) {
alterations.Add(new AutoMappingOverrideAlteration(assembly));
- }
+ }
}
public static ISessionFactory CreateSessionFactory(params Type[] types) {
diff --git a/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs b/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs
index 28db73b28..c5c90c591 100644
--- a/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs
+++ b/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs
@@ -2,9 +2,12 @@
using Autofac;
using Autofac.Builder;
using Autofac.Modules;
+using NHibernate;
using NUnit.Framework;
+using Orchard.Data;
using Orchard.Models;
using Orchard.Models.Driver;
+using Orchard.Models.Records;
using Orchard.Tests.Models.Stubs;
namespace Orchard.Tests.Models {
@@ -12,6 +15,23 @@ namespace Orchard.Tests.Models {
public class DefaultModelBuilderTests {
private IContainer _container;
private IModelManager _manager;
+ private ISessionFactory _sessionFactory;
+ private ISession _session;
+
+ [TestFixtureSetUp]
+ public void InitFixture() {
+ var databaseFileName = System.IO.Path.GetTempFileName();
+ _sessionFactory = DataUtility.CreateSessionFactory(
+ databaseFileName,
+ typeof(ModelRecord),
+ typeof(ModelTypeRecord),
+ typeof(GammaRecord));
+ }
+
+ [TestFixtureTearDown]
+ public void TermFixture() {
+
+ }
[SetUp]
public void Init() {
@@ -20,17 +40,35 @@ namespace Orchard.Tests.Models {
builder.Register().As();
builder.Register().As();
builder.Register().As();
+ builder.Register().As();
builder.Register().As();
builder.Register().As();
+ builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
+
+ _session = _sessionFactory.OpenSession();
+ builder.Register(new TestSessionLocator(_session)).As();
+
_container = builder.Build();
_manager = _container.Resolve();
}
+ public class TestSessionLocator : ISessionLocator {
+ private readonly ISession _session;
+
+ public TestSessionLocator(ISession session) {
+ _session = session;
+ }
+
+ public ISession For(Type entityType) {
+ return _session;
+ }
+ }
+
[Test]
public void AlphaDriverShouldWeldItsPart() {
var foo = _manager.New("alpha");
-
+
Assert.That(foo.Is(), Is.True);
Assert.That(foo.As(), Is.Not.Null);
Assert.That(foo.Is(), Is.False);
@@ -46,7 +84,7 @@ namespace Orchard.Tests.Models {
[Test, ExpectedException(typeof(InvalidCastException))]
public void StronglyTypedNewShouldThrowCastExceptionIfNull() {
- var foo = _manager.New("alpha");
+ _manager.New("alpha");
}
[Test]
@@ -60,5 +98,59 @@ namespace Orchard.Tests.Models {
Assert.That(beta.Is(), Is.False);
}
+ [Test]
+ public void GetByIdShouldDetermineTypeAndLoadParts() {
+ var modelRecord = CreateModelRecord("alpha");
+
+ var model = _manager.Get(modelRecord.Id);
+ Assert.That(model.ModelType, Is.EqualTo("alpha"));
+ Assert.That(model.Id, Is.EqualTo(modelRecord.Id));
+ }
+
+
+ [Test]
+ public void ModelPartWithRecordShouldCallRepositoryToPopulate() {
+
+ var modelRecord = CreateModelRecord("gamma");
+
+ var model = _manager.Get(modelRecord.Id);
+
+ // create a gamma record
+ var gamma = new GammaRecord {
+ Model = _container.Resolve>().Get(model.Id),
+ Frap = "foo"
+ };
+
+ _container.Resolve>().Create(gamma);
+ _session.Flush();
+ _session.Clear();
+
+ // re-fetch from database
+ model = _manager.Get(modelRecord.Id);
+
+ Assert.That(model.ModelType, Is.EqualTo("gamma"));
+ Assert.That(model.Id, Is.EqualTo(modelRecord.Id));
+ Assert.That(model.Is(), Is.True);
+ Assert.That(model.As().Record, Is.Not.Null);
+ Assert.That(model.As().Record.Model.Id, Is.EqualTo(model.Id));
+
+ }
+
+
+ private ModelRecord CreateModelRecord(string modelType) {
+ var modelRepository = _container.Resolve>();
+ var modelTypeRepository = _container.Resolve>();
+
+ var modelRecord = new ModelRecord { ModelType = new ModelTypeRecord { Name = modelType } };
+ modelTypeRepository.Create(modelRecord.ModelType);
+ modelRepository.Create(modelRecord);
+
+ _session.Flush();
+ _session.Clear();
+ return modelRecord;
+ }
+
+
+
}
}
diff --git a/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs b/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs
index 4bb8dacdf..b9911bd3e 100644
--- a/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs
+++ b/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs
@@ -1,7 +1,7 @@
using Orchard.Models.Driver;
namespace Orchard.Tests.Models.Stubs {
- public class AlphaDriver : ModelDriverBase {
+ public class AlphaDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "alpha") {
WeldModelPart(context);
diff --git a/src/Orchard.Tests/Models/Stubs/BetaDriver.cs b/src/Orchard.Tests/Models/Stubs/BetaDriver.cs
index 4004ccfbe..d872aed16 100644
--- a/src/Orchard.Tests/Models/Stubs/BetaDriver.cs
+++ b/src/Orchard.Tests/Models/Stubs/BetaDriver.cs
@@ -5,7 +5,7 @@ using System.Text;
using Orchard.Models.Driver;
namespace Orchard.Tests.Models.Stubs {
- public class BetaDriver : ModelDriverBase {
+ public class BetaDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "beta") {
WeldModelPart(context);
diff --git a/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs b/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs
index 24a7c1bc1..8acaa662a 100644
--- a/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs
+++ b/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs
@@ -1,7 +1,7 @@
using Orchard.Models.Driver;
namespace Orchard.Tests.Models.Stubs {
- public class FlavoredDriver : ModelDriverBase {
+ public class FlavoredDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "beta" || context.ModelType == "alpha") {
WeldModelPart(context);
diff --git a/src/Orchard.Tests/Models/Stubs/StyledDriver.cs b/src/Orchard.Tests/Models/Stubs/StyledDriver.cs
index 870f34172..2ce06faba 100644
--- a/src/Orchard.Tests/Models/Stubs/StyledDriver.cs
+++ b/src/Orchard.Tests/Models/Stubs/StyledDriver.cs
@@ -1,7 +1,7 @@
using Orchard.Models.Driver;
namespace Orchard.Tests.Models.Stubs {
- public class StyledDriver : ModelDriverBase {
+ public class StyledDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "alpha") {
WeldModelPart(context);
diff --git a/src/Orchard.Tests/Orchard.Tests.csproj b/src/Orchard.Tests/Orchard.Tests.csproj
index 583864430..9b51841ab 100644
--- a/src/Orchard.Tests/Orchard.Tests.csproj
+++ b/src/Orchard.Tests/Orchard.Tests.csproj
@@ -111,6 +111,7 @@
+
@@ -130,8 +131,6 @@
-
-
@@ -142,6 +141,9 @@
+
+
+
+
+
+
+ $(ProjectDir)\..\Manifests
+
+
+
+
+
+
+
+
+
+
+
+ False
+ True
+ 40373
+ /
+
+
+ False
+ False
+
+
+ False
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Orchard.Web/Packages/Orchard.Users/Properties/AssemblyInfo.cs b/src/Orchard.Web/Packages/Orchard.Users/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..ccf4d4dd1
--- /dev/null
+++ b/src/Orchard.Web/Packages/Orchard.Users/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Orchard.Users")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft IT")]
+[assembly: AssemblyProduct("Orchard.Users")]
+[assembly: AssemblyCopyright("Copyright © Microsoft IT 2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("700045c0-0c7d-44f9-9b09-ca4364d1e9fb")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Web.config b/src/Orchard.Web/Packages/Orchard.Users/Views/Web.config
new file mode 100644
index 000000000..e065d8735
--- /dev/null
+++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Web.config
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Orchard.Web/Packages/Orchard.Users/Web.config b/src/Orchard.Web/Packages/Orchard.Users/Web.config
new file mode 100644
index 000000000..d38df4e6d
--- /dev/null
+++ b/src/Orchard.Web/Packages/Orchard.Users/Web.config
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Orchard.Web/Web.config b/src/Orchard.Web/Web.config
index 33fa0a895..8718a7a46 100644
--- a/src/Orchard.Web/Web.config
+++ b/src/Orchard.Web/Web.config
@@ -61,10 +61,10 @@
-
+
-
+ />-->
+
@@ -96,6 +98,7 @@
+
diff --git a/src/Orchard.sln b/src/Orchard.sln
index 4ea384516..0fccd4d78 100644
--- a/src/Orchard.sln
+++ b/src/Orchard.sln
@@ -25,6 +25,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.XmlRpc", "Orchard.W
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.XmlRpc.Tests", "Orchard.Web\Packages\Orchard.XmlRpc.Tests\Orchard.XmlRpc.Tests.csproj", "{58506223-CB7D-474F-B936-6E17D53B0FB8}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Users", "Orchard.Web\Packages\Orchard.Users\Orchard.Users.csproj", "{79AED36E-ABD0-4747-93D3-8722B042454B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Tests.Packages", "Orchard.Tests.Packages\Orchard.Tests.Packages.csproj", "{6CB3EB30-F725-45C0-9742-42599BA8E8D2}"
+EndProject
Global
GlobalSection(TeamFoundationVersionControl) = preSolution
SccNumberOfProjects = 9
@@ -130,6 +134,14 @@ Global
{58506223-CB7D-474F-B936-6E17D53B0FB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{58506223-CB7D-474F-B936-6E17D53B0FB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{58506223-CB7D-474F-B936-6E17D53B0FB8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {79AED36E-ABD0-4747-93D3-8722B042454B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {79AED36E-ABD0-4747-93D3-8722B042454B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {79AED36E-ABD0-4747-93D3-8722B042454B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {79AED36E-ABD0-4747-93D3-8722B042454B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -142,5 +154,6 @@ Global
{15CFEF40-F2C2-44DD-ADAF-18A26DA2320C} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
{0DC6B598-6D03-4923-A6C2-274D09854117} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
{58506223-CB7D-474F-B936-6E17D53B0FB8} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
+ {79AED36E-ABD0-4747-93D3-8722B042454B} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
EndGlobalSection
EndGlobal
diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs
index b0486063c..df64225e7 100644
--- a/src/Orchard/Environment/DefaultOrchardHost.cs
+++ b/src/Orchard/Environment/DefaultOrchardHost.cs
@@ -36,6 +36,7 @@ namespace Orchard.Environment {
_current = runtime;
_controllerBuilder.SetControllerFactory(new OrchardControllerFactory());
+ ServiceLocator.SetLocator(t=>_containerProvider.RequestContainer.Resolve(t));
}
protected virtual void EndRequest() {
diff --git a/src/Orchard/Environment/ServiceLocator.cs b/src/Orchard/Environment/ServiceLocator.cs
new file mode 100644
index 000000000..8575503ac
--- /dev/null
+++ b/src/Orchard/Environment/ServiceLocator.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Orchard.Environment {
+ public static class ServiceLocator {
+ private static Func _locator;
+
+ public static void SetLocator(Func locator) {
+ _locator = locator;
+ }
+
+ public static T Resolve() {
+ return (T)_locator(typeof(T));
+ }
+
+ }
+}
diff --git a/src/Orchard/Models/DefaultModelManager.cs b/src/Orchard/Models/DefaultModelManager.cs
index df261808d..f4ce2aea0 100644
--- a/src/Orchard/Models/DefaultModelManager.cs
+++ b/src/Orchard/Models/DefaultModelManager.cs
@@ -1,16 +1,23 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
+using Orchard.Data;
using Orchard.Models.Driver;
+using Orchard.Models.Records;
namespace Orchard.Models {
public class DefaultModelManager : IModelManager {
private readonly IEnumerable _drivers;
+ private readonly IRepository _modelRepository;
- public DefaultModelManager(IEnumerable drivers) {
+ public DefaultModelManager(
+ IEnumerable drivers,
+ IRepository modelRepository) {
_drivers = drivers;
+ _modelRepository = modelRepository;
}
public virtual IModel New(string modelType) {
-
+
// create a new kernel for the model instance
var context = new NewModelContext {
ModelType = modelType,
@@ -18,12 +25,34 @@ namespace Orchard.Models {
};
// invoke drivers to weld aspects onto kernel
- foreach(var driver in _drivers) {
+ foreach (var driver in _drivers) {
driver.New(context);
}
// composite result is returned
return context.Instance;
}
+
+ public virtual IModel Get(int id) {
+ // obtain root record to determine the model type
+ var modelRecord = _modelRepository.Get(id);
+
+ // create a context with a new instance to load
+ var context = new LoadModelContext {
+ Id = modelRecord.Id,
+ ModelType = modelRecord.ModelType.Name,
+ Instance = New(modelRecord.ModelType.Name)
+ };
+
+ // set the id
+ context.Instance.As().Id = context.Id;
+
+ // invoke drivers to weld aspects onto kernel
+ foreach (var driver in _drivers) {
+ driver.Load(context);
+ }
+
+ return context.Instance;
+ }
}
}
diff --git a/src/Orchard/Models/Driver/IModelDriver.cs b/src/Orchard/Models/Driver/IModelDriver.cs
index db1655b96..986b3d41d 100644
--- a/src/Orchard/Models/Driver/IModelDriver.cs
+++ b/src/Orchard/Models/Driver/IModelDriver.cs
@@ -1,27 +1,6 @@
-using Orchard.Logging;
-
-namespace Orchard.Models.Driver {
+namespace Orchard.Models.Driver {
public interface IModelDriver : IDependency {
void New(NewModelContext context);
- }
-
- public abstract class ModelDriverBase : IModelDriver {
- protected ModelDriverBase() {
- Logger = NullLogger.Instance;
- }
-
- public ILogger Logger{ get; set;}
-
- void IModelDriver.New(NewModelContext context) {New(context);}
-
- protected virtual void New(NewModelContext context) {
- }
-
- protected void WeldModelPart(NewModelContext context) where TPart : class,IModel,new() {
- var newPart = new TPart();
- newPart.Weld(context.Instance);
- context.Instance = newPart;
- }
-
+ void Load(LoadModelContext context);
}
}
\ No newline at end of file
diff --git a/src/Orchard/Models/Driver/ModelDriver.cs b/src/Orchard/Models/Driver/ModelDriver.cs
new file mode 100644
index 000000000..d08d4f4cd
--- /dev/null
+++ b/src/Orchard/Models/Driver/ModelDriver.cs
@@ -0,0 +1,43 @@
+using Orchard.Data;
+using Orchard.Logging;
+
+namespace Orchard.Models.Driver {
+ public class ModelDriver : IModelDriver {
+ protected ModelDriver() {
+ Logger = NullLogger.Instance;
+ }
+
+ public ILogger Logger{ get; set;}
+
+ void IModelDriver.New(NewModelContext context) {New(context);}
+ void IModelDriver.Load(LoadModelContext context) {Load(context);}
+
+ protected virtual void New(NewModelContext context) {
+ }
+
+ protected virtual void Load(LoadModelContext context) {
+ }
+
+ protected void WeldModelPart(NewModelContext context) where TPart : class,IModel,new() {
+ var newPart = new TPart();
+ newPart.Weld(context.Instance);
+ context.Instance = newPart;
+ }
+ }
+
+ public class ModelDriver : ModelDriver {
+ private readonly IRepository _repository;
+
+ public ModelDriver(IRepository repository) {
+ _repository = repository;
+ }
+
+ protected override void Load(LoadModelContext context) {
+ var instance = context.Instance.As>();
+ if (instance != null)
+ instance.Record = _repository.Get(context.Id);
+
+ base.Load(context);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard/Models/Driver/NewModelContext.cs b/src/Orchard/Models/Driver/NewModelContext.cs
index cdf1fda30..23b21affc 100644
--- a/src/Orchard/Models/Driver/NewModelContext.cs
+++ b/src/Orchard/Models/Driver/NewModelContext.cs
@@ -3,4 +3,9 @@ namespace Orchard.Models.Driver {
public string ModelType { get; set; }
public IModel Instance { get; set; }
}
+ public class LoadModelContext {
+ public int Id { get; set; }
+ public string ModelType { get; set; }
+ public IModel Instance { get; set; }
+ }
}
diff --git a/src/Orchard/Models/IModelManager.cs b/src/Orchard/Models/IModelManager.cs
index 7d9fbff22..09fb476bb 100644
--- a/src/Orchard/Models/IModelManager.cs
+++ b/src/Orchard/Models/IModelManager.cs
@@ -1,5 +1,6 @@
namespace Orchard.Models {
public interface IModelManager {
IModel New(string modelType);
+ IModel Get(int id);
}
}
diff --git a/src/Orchard/Models/ModelPart.cs b/src/Orchard/Models/ModelPart.cs
index 569137317..55f630376 100644
--- a/src/Orchard/Models/ModelPart.cs
+++ b/src/Orchard/Models/ModelPart.cs
@@ -30,4 +30,14 @@ namespace Orchard.Models {
return Root.WeldedAs();
}
}
-}
\ No newline at end of file
+
+ public class ModelPart : ModelPart {
+ private TRecord _record;
+
+ public TRecord Record {
+ get { return _record; }
+ set {_record = value;}
+ }
+
+ }
+}
diff --git a/src/Orchard/Models/Records/ModelRecord.cs b/src/Orchard/Models/Records/ModelRecord.cs
new file mode 100644
index 000000000..5936ebf8c
--- /dev/null
+++ b/src/Orchard/Models/Records/ModelRecord.cs
@@ -0,0 +1,6 @@
+namespace Orchard.Models.Records {
+ public class ModelRecord {
+ public virtual int Id { get; set; }
+ public virtual ModelTypeRecord ModelType { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard/Models/Records/ModelTypeRecord.cs b/src/Orchard/Models/Records/ModelTypeRecord.cs
new file mode 100644
index 000000000..8473431f0
--- /dev/null
+++ b/src/Orchard/Models/Records/ModelTypeRecord.cs
@@ -0,0 +1,6 @@
+namespace Orchard.Models.Records {
+ public class ModelTypeRecord {
+ public virtual int Id { get; set; }
+ public virtual string Name { get; set; }
+ }
+}
diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj
index c77e9bac3..5c1bbfd5d 100644
--- a/src/Orchard/Orchard.csproj
+++ b/src/Orchard/Orchard.csproj
@@ -60,6 +60,7 @@
..\..\lib\linqnhibernate\NHibernate.Linq.dll
+
3.5
@@ -114,6 +115,7 @@
+
@@ -123,6 +125,7 @@
+
@@ -130,6 +133,8 @@
+
+
@@ -146,9 +151,12 @@
+
+
+
diff --git a/src/Orchard/Security/IMembershipService.cs b/src/Orchard/Security/IMembershipService.cs
new file mode 100644
index 000000000..5848d464e
--- /dev/null
+++ b/src/Orchard/Security/IMembershipService.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Web.Security;
+
+namespace Orchard.Security {
+ public interface IMembershipService : IDependency {
+ void ReadSettings(MembershipSettings settings);
+ }
+
+ public class MembershipSettings {
+ public bool EnablePasswordRetrieval { get; set; }
+ public bool EnablePasswordReset { get; set; }
+ public bool RequiresQuestionAndAnswer { get; set; }
+ public int MaxInvalidPasswordAttempts { get; set; }
+ public int PasswordAttemptWindow { get; set; }
+ public bool RequiresUniqueEmail { get; set; }
+ public MembershipPasswordFormat PasswordFormat { get; set; }
+ public int MinRequiredPasswordLength { get; set; }
+ public int MinRequiredNonAlphanumericCharacters { get; set; }
+ public string PasswordStrengthRegularExpression { get; set; }
+ }
+}
diff --git a/src/Orchard/Security/IUser.cs b/src/Orchard/Security/IUser.cs
index 7bd273538..cf63320bf 100644
--- a/src/Orchard/Security/IUser.cs
+++ b/src/Orchard/Security/IUser.cs
@@ -5,6 +5,7 @@ namespace Orchard.Security {
/// Interface provided by the "user" model.
///
public interface IUser : IModel {
- string Name { get; }
+ string UserName { get; }
+ string Email { get; }
}
}
diff --git a/src/Orchard/Security/Providers/OrchardMembershipProvider.cs b/src/Orchard/Security/Providers/OrchardMembershipProvider.cs
new file mode 100644
index 000000000..833d46907
--- /dev/null
+++ b/src/Orchard/Security/Providers/OrchardMembershipProvider.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Web;
+using System.Web.Security;
+using Orchard.Environment;
+
+namespace Orchard.Security.Providers {
+ public class OrchardMembershipProvider : MembershipProvider {
+ public OrchardMembershipProvider() {
+ int x =5;
+ }
+
+ static IMembershipService GetService() {
+ return ServiceLocator.Resolve();
+ }
+
+ static MembershipSettings GetSettings() {
+ var settings = new MembershipSettings {
+ EnablePasswordRetrieval = false,
+ EnablePasswordReset = true,
+ RequiresQuestionAndAnswer = true,
+ RequiresUniqueEmail = true,
+ MaxInvalidPasswordAttempts = 5,
+ PasswordAttemptWindow = 10,
+ MinRequiredPasswordLength = 7,
+ MinRequiredNonAlphanumericCharacters = 1,
+ PasswordStrengthRegularExpression = "",
+ PasswordFormat = MembershipPasswordFormat.Hashed,
+ };
+ GetService().ReadSettings(settings);
+ return settings;
+ }
+
+
+ public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) {
+ throw new NotImplementedException();
+ }
+
+ public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) {
+ throw new NotImplementedException();
+ }
+
+ public override string GetPassword(string username, string answer) {
+ throw new NotImplementedException();
+ }
+
+ public override bool ChangePassword(string username, string oldPassword, string newPassword) {
+ throw new NotImplementedException();
+ }
+
+ public override string ResetPassword(string username, string answer) {
+ throw new NotImplementedException();
+ }
+
+ public override void UpdateUser(MembershipUser user) {
+ throw new NotImplementedException();
+ }
+
+ public override bool ValidateUser(string username, string password) {
+ throw new NotImplementedException();
+ }
+
+ public override bool UnlockUser(string userName) {
+ throw new NotImplementedException();
+ }
+
+ public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) {
+ throw new NotImplementedException();
+ }
+
+ public override MembershipUser GetUser(string username, bool userIsOnline) {
+ throw new NotImplementedException();
+ }
+
+ public override string GetUserNameByEmail(string email) {
+ throw new NotImplementedException();
+ }
+
+ public override bool DeleteUser(string username, bool deleteAllRelatedData) {
+ throw new NotImplementedException();
+ }
+
+ public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) {
+ throw new NotImplementedException();
+ }
+
+ public override int GetNumberOfUsersOnline() {
+ throw new NotImplementedException();
+ }
+
+ public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) {
+ throw new NotImplementedException();
+ }
+
+ public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) {
+ throw new NotImplementedException();
+ }
+
+ public override string ApplicationName {
+ get { throw new NotImplementedException(); }
+ set { throw new NotImplementedException(); }
+ }
+
+ public override bool EnablePasswordRetrieval { get { return GetSettings().EnablePasswordRetrieval; } }
+ public override bool EnablePasswordReset { get { return GetSettings().EnablePasswordReset; } }
+ public override bool RequiresQuestionAndAnswer { get { return GetSettings().RequiresQuestionAndAnswer; } }
+ public override int MaxInvalidPasswordAttempts { get { return GetSettings().MaxInvalidPasswordAttempts; } }
+ public override int PasswordAttemptWindow { get { return GetSettings().PasswordAttemptWindow; } }
+ public override bool RequiresUniqueEmail { get { return GetSettings().RequiresUniqueEmail; } }
+ public override MembershipPasswordFormat PasswordFormat { get { return GetSettings().PasswordFormat; } }
+ public override int MinRequiredPasswordLength { get { return GetSettings().MinRequiredPasswordLength; } }
+ public override int MinRequiredNonAlphanumericCharacters { get { return GetSettings().MinRequiredNonAlphanumericCharacters; } }
+ public override string PasswordStrengthRegularExpression { get { return GetSettings().PasswordStrengthRegularExpression; } }
+ }
+}
diff --git a/src/Orchard/Security/Providers/OrchardRoleProvider.cs b/src/Orchard/Security/Providers/OrchardRoleProvider.cs
new file mode 100644
index 000000000..f20d7fdec
--- /dev/null
+++ b/src/Orchard/Security/Providers/OrchardRoleProvider.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Web.Security;
+
+namespace Orchard.Security.Providers {
+ public class OrchardRoleProvider : RoleProvider {
+ public override bool IsUserInRole(string username, string roleName) {
+ throw new NotImplementedException();
+ }
+
+ public override string[] GetRolesForUser(string username) {
+ throw new NotImplementedException();
+ }
+
+ public override void CreateRole(string roleName) {
+ throw new NotImplementedException();
+ }
+
+ public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) {
+ throw new NotImplementedException();
+ }
+
+ public override bool RoleExists(string roleName) {
+ throw new NotImplementedException();
+ }
+
+ public override void AddUsersToRoles(string[] usernames, string[] roleNames) {
+ throw new NotImplementedException();
+ }
+
+ public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) {
+ throw new NotImplementedException();
+ }
+
+ public override string[] GetUsersInRole(string roleName) {
+ throw new NotImplementedException();
+ }
+
+ public override string[] GetAllRoles() {
+ throw new NotImplementedException();
+ }
+
+ public override string[] FindUsersInRole(string roleName, string usernameToMatch) {
+ throw new NotImplementedException();
+ }
+
+ public override string ApplicationName {
+ get { throw new NotImplementedException(); }
+ set { throw new NotImplementedException(); }
+ }
+ }
+}