mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-18 17:47:54 +08:00
Adding simple package.txt manifest files. Adding user record/model/driver to package. Wiring create user in through asp.net membership provider.
--HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4039401
This commit is contained in:
@@ -28,7 +28,8 @@ 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));
|
||||
}
|
||||
}
|
||||
alterations.AddFromAssemblyOf<DataModule>();
|
||||
}
|
||||
|
||||
public static ISessionFactory CreateSessionFactory(params Type[] types) {
|
||||
|
@@ -23,9 +23,9 @@ namespace Orchard.Tests.Models {
|
||||
var databaseFileName = System.IO.Path.GetTempFileName();
|
||||
_sessionFactory = DataUtility.CreateSessionFactory(
|
||||
databaseFileName,
|
||||
typeof(GammaRecord),
|
||||
typeof(ModelRecord),
|
||||
typeof(ModelTypeRecord),
|
||||
typeof(GammaRecord));
|
||||
typeof(ModelTypeRecord));
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
@@ -111,6 +111,8 @@ namespace Orchard.Tests.Models {
|
||||
[Test]
|
||||
public void ModelPartWithRecordShouldCallRepositoryToPopulate() {
|
||||
|
||||
CreateModelRecord("gamma");
|
||||
CreateModelRecord("gamma");
|
||||
var modelRecord = CreateModelRecord("gamma");
|
||||
|
||||
var model = _manager.Get(modelRecord.Id);
|
||||
|
@@ -7,27 +7,21 @@ using Orchard.Models.Driver;
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Tests.Models.Stubs {
|
||||
public class Gamma : ModelPart<GammaRecord> {
|
||||
public class Gamma : ModelPartWithRecord<GammaRecord> {
|
||||
}
|
||||
|
||||
public class GammaRecord {
|
||||
public virtual int Id { get; set; }
|
||||
public virtual ModelRecord Model { get; set; }
|
||||
public class GammaRecord : ModelPartRecord {
|
||||
public virtual string Frap { get; set; }
|
||||
}
|
||||
|
||||
public class GammaRecordOverride : IAutoMappingOverride<GammaRecord> {
|
||||
public void Override(AutoMapping<GammaRecord> mapping) {
|
||||
mapping.HasOne(x => x.Model);
|
||||
}
|
||||
}
|
||||
|
||||
public class GammaDriver : ModelDriver<GammaRecord> {
|
||||
public GammaDriver(IRepository<GammaRecord> repository) : base(repository) {
|
||||
public class GammaDriver : ModelDriverWithRecord<GammaRecord> {
|
||||
public GammaDriver(IRepository<GammaRecord> repository)
|
||||
: base(repository) {
|
||||
}
|
||||
|
||||
protected override void New(NewModelContext context) {
|
||||
if(context.ModelType == "gamma") {
|
||||
if (context.ModelType == "gamma") {
|
||||
WeldModelPart<Gamma>(context);
|
||||
}
|
||||
}
|
||||
|
1
src/Orchard.Web/Packages/Orchard.CmsPages/Package.txt
Normal file
1
src/Orchard.Web/Packages/Orchard.CmsPages/Package.txt
Normal file
@@ -0,0 +1 @@
|
||||
name: Pages
|
1
src/Orchard.Web/Packages/Orchard.Media/Package.txt
Normal file
1
src/Orchard.Web/Packages/Orchard.Media/Package.txt
Normal file
@@ -0,0 +1 @@
|
||||
name: Media
|
@@ -1,7 +1,11 @@
|
||||
using Orchard.Models.Driver;
|
||||
using Orchard.Data;
|
||||
using Orchard.Models.Driver;
|
||||
|
||||
namespace Orchard.Users.Models {
|
||||
public class UserDriver : ModelDriver {
|
||||
public class UserDriver : ModelDriverWithRecord<UserRecord> {
|
||||
public UserDriver(IRepository<UserRecord> repository) : base(repository) {
|
||||
}
|
||||
|
||||
protected override void New(NewModelContext context) {
|
||||
if (context.ModelType == "user") {
|
||||
WeldModelPart<UserModel>(context);
|
||||
|
@@ -1,14 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using Orchard.Models;
|
||||
using Orchard.Security;
|
||||
|
||||
namespace Orchard.Users.Models {
|
||||
public class UserModel : ModelPart, IUser {
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string Email { get; set; }
|
||||
public sealed class UserModel : ModelPartWithRecord<UserRecord>, IUser {
|
||||
string IUser.UserName {get { return Record.UserName; }}
|
||||
string IUser.Email {get { return Record.Email; }}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,8 @@
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Users.Models {
|
||||
public class UserRecord : ModelPartRecord {
|
||||
public virtual string UserName { get; set; }
|
||||
public virtual string Email { get; set; }
|
||||
}
|
||||
}
|
@@ -65,6 +65,7 @@
|
||||
<Compile Include="Controllers\HomeController.cs" />
|
||||
<Compile Include="Models\UserModel.cs" />
|
||||
<Compile Include="Models\UserDriver.cs" />
|
||||
<Compile Include="Models\UserRecord.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Services\MembershipService.cs" />
|
||||
</ItemGroup>
|
||||
|
1
src/Orchard.Web/Packages/Orchard.Users/Package.txt
Normal file
1
src/Orchard.Web/Packages/Orchard.Users/Package.txt
Normal file
@@ -0,0 +1 @@
|
||||
name: Users
|
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Models;
|
||||
using Orchard.Security;
|
||||
using Orchard.Users.Models;
|
||||
@@ -12,18 +10,24 @@ namespace Orchard.Users.Services {
|
||||
|
||||
public MembershipService(IModelManager modelManager) {
|
||||
_modelManager = modelManager;
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
|
||||
public ILogger Logger { get; set; }
|
||||
|
||||
public void ReadSettings(MembershipSettings settings) {
|
||||
// accepting defaults
|
||||
}
|
||||
|
||||
public IUser CreateUser(CreateUserParams createUserParams) {
|
||||
var user = _modelManager.New("user").As<UserModel>();
|
||||
user.UserName = createUserParams.Username;
|
||||
user.Email = createUserParams.Email;
|
||||
Logger.Information("CreateUser {0} {1}", createUserParams.Username, createUserParams.Email);
|
||||
var user = _modelManager.New("user");
|
||||
user.As<UserModel>().Record = new UserRecord {
|
||||
UserName = createUserParams.Username,
|
||||
Email = createUserParams.Email
|
||||
};
|
||||
_modelManager.Create(user);
|
||||
return user;
|
||||
return user.As<IUser>();
|
||||
}
|
||||
|
||||
public IUser GetUser(string username) {
|
||||
|
1
src/Orchard.Web/Packages/Orchard.XmlRpc/Package.txt
Normal file
1
src/Orchard.Web/Packages/Orchard.XmlRpc/Package.txt
Normal file
@@ -0,0 +1 @@
|
||||
name: XmlRpc
|
1
src/Orchard.Web/Packages/TinyMce/Package.txt
Normal file
1
src/Orchard.Web/Packages/TinyMce/Package.txt
Normal file
@@ -0,0 +1 @@
|
||||
name: TinyMce
|
@@ -26,8 +26,10 @@ namespace Orchard.Data {
|
||||
var database =
|
||||
SQLiteConfiguration.Standard.UsingFile(HttpContext.Current.Server.MapPath("~/App_Data/hack.db"));
|
||||
|
||||
var automaps = new AutoPersistenceModel[] {
|
||||
var automaps = new[] {
|
||||
CreatePersistenceModel(Assembly.Load("Orchard.CmsPages")),
|
||||
CreatePersistenceModel(Assembly.Load("Orchard.Users")),
|
||||
CreatePersistenceModel(Assembly.Load("Orchard")),
|
||||
};
|
||||
|
||||
return _sessionFactory ??
|
||||
@@ -36,23 +38,32 @@ namespace Orchard.Data {
|
||||
Fluently.Configure()
|
||||
.Database(database)
|
||||
.Mappings(m => {
|
||||
foreach (var automap in automaps) {
|
||||
m.AutoMappings.Add(automap);
|
||||
}
|
||||
})
|
||||
foreach (var automap in automaps) {
|
||||
m.AutoMappings.Add(automap);
|
||||
}
|
||||
})
|
||||
.ExposeConfiguration(
|
||||
c => new SchemaUpdate(c).Execute(false /*script*/, true /*doUpdate*/))
|
||||
.BuildSessionFactory(), null) ?? _sessionFactory;
|
||||
}
|
||||
}
|
||||
|
||||
private AutoPersistenceModel CreatePersistenceModel(Assembly assembly) {
|
||||
private static AutoPersistenceModel CreatePersistenceModel(Assembly assembly) {
|
||||
return AutoMap.Assembly(assembly)
|
||||
.Where(t => t.Namespace.EndsWith(".Models") && t.GetProperty("Id") != null)
|
||||
.Alterations(alt => alt.Add(new AutoMappingOverrideAlteration(assembly)))
|
||||
.Where(IsModelType)
|
||||
.Alterations(alt => alt
|
||||
.Add(new AutoMappingOverrideAlteration(assembly))
|
||||
.AddFromAssemblyOf<DataModule>())
|
||||
.Conventions.AddFromAssemblyOf<DataModule>();
|
||||
}
|
||||
|
||||
private static bool IsModelType(Type type) {
|
||||
return (type.Namespace.EndsWith(".Models") || type.Namespace.EndsWith(".Records")) &&
|
||||
type.GetProperty("Id") != null &&
|
||||
!type.IsSealed &&
|
||||
!type.IsAbstract;
|
||||
}
|
||||
|
||||
public ISession For(Type entityType) {
|
||||
return _session ?? Interlocked.CompareExchange(ref _session, SessionFactory.OpenSession(), null) ?? _session;
|
||||
}
|
||||
|
@@ -44,6 +44,7 @@ namespace Orchard.Models {
|
||||
var context = new LoadModelContext {
|
||||
Id = modelRecord.Id,
|
||||
ModelType = modelRecord.ModelType.Name,
|
||||
Record = modelRecord,
|
||||
Instance = New(modelRecord.ModelType.Name)
|
||||
};
|
||||
|
||||
@@ -60,13 +61,14 @@ namespace Orchard.Models {
|
||||
|
||||
public void Create(IModel model) {
|
||||
// produce root record to determine the model id
|
||||
var modelRecord = new ModelRecord {ModelType = AcquireModelTypeRecord(model.ModelType)};
|
||||
var modelRecord = new ModelRecord { ModelType = AcquireModelTypeRecord(model.ModelType) };
|
||||
_modelRepository.Create(modelRecord);
|
||||
|
||||
// build a context with the initialized instance to create
|
||||
var context = new CreateModelContext {
|
||||
Id = modelRecord.Id,
|
||||
ModelType = modelRecord.ModelType.Name,
|
||||
Record = modelRecord,
|
||||
Instance = model.As<ModelRoot>().Welded
|
||||
};
|
||||
|
||||
@@ -84,7 +86,7 @@ namespace Orchard.Models {
|
||||
var modelTypeRecord = _modelTypeRepository.Get(x => x.Name == modelType);
|
||||
if (modelTypeRecord == null) {
|
||||
//TEMP: this is not safe... Model types could be created concurrently?
|
||||
modelTypeRecord = new ModelTypeRecord {Name = modelType};
|
||||
modelTypeRecord = new ModelTypeRecord { Name = modelType };
|
||||
_modelTypeRepository.Create(modelTypeRecord);
|
||||
}
|
||||
return modelTypeRecord;
|
||||
|
10
src/Orchard/Models/Driver/CreateModelContext.cs
Normal file
10
src/Orchard/Models/Driver/CreateModelContext.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class CreateModelContext {
|
||||
public int Id { get; set; }
|
||||
public string ModelType { get; set; }
|
||||
public ModelRecord Record { get; set; }
|
||||
public IModel Instance { get; set; }
|
||||
}
|
||||
}
|
11
src/Orchard/Models/Driver/LoadModelContext.cs
Normal file
11
src/Orchard/Models/Driver/LoadModelContext.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using System;
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class LoadModelContext {
|
||||
public int Id { get; set; }
|
||||
public string ModelType { get; set; }
|
||||
public ModelRecord Record { get; set; }
|
||||
public IModel Instance { get; set; }
|
||||
}
|
||||
}
|
@@ -1,9 +1,8 @@
|
||||
using System;
|
||||
using Orchard.Data;
|
||||
using Orchard.Logging;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public class ModelDriver : IModelDriver {
|
||||
public abstract class ModelDriver : IModelDriver {
|
||||
protected ModelDriver() {
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
@@ -29,20 +28,4 @@ namespace Orchard.Models.Driver {
|
||||
context.Instance = newPart;
|
||||
}
|
||||
}
|
||||
|
||||
public class ModelDriver<TRecord> : ModelDriver {
|
||||
private readonly IRepository<TRecord> _repository;
|
||||
|
||||
public ModelDriver(IRepository<TRecord> repository) {
|
||||
_repository = repository;
|
||||
}
|
||||
|
||||
protected override void Load(LoadModelContext context) {
|
||||
var instance = context.Instance.As<ModelPart<TRecord>>();
|
||||
if (instance != null)
|
||||
instance.Record = _repository.Get(context.Id);
|
||||
|
||||
base.Load(context);
|
||||
}
|
||||
}
|
||||
}
|
28
src/Orchard/Models/Driver/ModelDriverWithRecord.cs
Normal file
28
src/Orchard/Models/Driver/ModelDriverWithRecord.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using Orchard.Data;
|
||||
using Orchard.Models.Records;
|
||||
|
||||
namespace Orchard.Models.Driver {
|
||||
public abstract class ModelDriverWithRecord<TRecord> : ModelDriver where TRecord : ModelPartRecord {
|
||||
private readonly IRepository<TRecord> _repository;
|
||||
|
||||
public ModelDriverWithRecord(IRepository<TRecord> repository) {
|
||||
_repository = repository;
|
||||
}
|
||||
|
||||
protected override void Create(CreateModelContext context) {
|
||||
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
|
||||
if (instance != null && instance.Record != null) {
|
||||
instance.Record.Model = context.Record;
|
||||
_repository.Create(instance.Record);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Load(LoadModelContext context) {
|
||||
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
|
||||
if (instance != null) {
|
||||
instance.Record = _repository.Get(context.Id);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -3,14 +3,4 @@ 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; }
|
||||
}
|
||||
public class CreateModelContext {
|
||||
public int Id { get; set; }
|
||||
public string ModelType { get; set; }
|
||||
public IModel Instance { get; set; }
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
using Orchard.Security;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public interface IModelManager {
|
||||
public interface IModelManager : IDependency {
|
||||
IModel New(string modelType);
|
||||
IModel Get(int id);
|
||||
void Create(IModel model);
|
||||
|
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public class ModelPart : IModel {
|
||||
public abstract class ModelPart : IModel {
|
||||
protected IModel Next { get; set; }
|
||||
protected ModelRoot Root { get; set; }
|
||||
|
||||
@@ -30,14 +30,4 @@ namespace Orchard.Models {
|
||||
return Root.WeldedAs<T>();
|
||||
}
|
||||
}
|
||||
|
||||
public class ModelPart<TRecord> : ModelPart {
|
||||
private TRecord _record;
|
||||
|
||||
public TRecord Record {
|
||||
get { return _record; }
|
||||
set {_record = value;}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
5
src/Orchard/Models/ModelPartWithRecord.cs
Normal file
5
src/Orchard/Models/ModelPartWithRecord.cs
Normal file
@@ -0,0 +1,5 @@
|
||||
namespace Orchard.Models {
|
||||
public abstract class ModelPartWithRecord<TRecord> : ModelPart {
|
||||
public TRecord Record { get; set; }
|
||||
}
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Models {
|
||||
public class ModelRoot : IModel {
|
||||
public sealed class ModelRoot : IModel {
|
||||
public ModelRoot(string modelType) {
|
||||
Welded = this;
|
||||
ModelType = modelType;
|
||||
|
42
src/Orchard/Models/Records/ModelPartRecord.cs
Normal file
42
src/Orchard/Models/Records/ModelPartRecord.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 ModelPartRecord {
|
||||
public virtual int Id { get; set; }
|
||||
public virtual ModelRecord Model { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ModelPartRecordAlteration : IAutoMappingAlteration {
|
||||
public void Alter(AutoPersistenceModel model) {
|
||||
|
||||
model.OverrideAll(mapping => {
|
||||
var genericArguments = mapping.GetType().GetGenericArguments();
|
||||
if (!genericArguments.Single().IsSubclassOf(typeof(ModelPartRecord))) {
|
||||
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 : ModelPartRecord {
|
||||
public void Override(object o) {
|
||||
var mapping = (AutoMapping<T>)o;
|
||||
mapping.Id(x => x.Id).GeneratedBy.Foreign("Model");
|
||||
mapping.HasOne(x => x.Model);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -131,14 +131,19 @@
|
||||
<Compile Include="Logging\NullLogger.cs" />
|
||||
<Compile Include="Logging\NullLoggerFactory.cs" />
|
||||
<Compile Include="Models\DefaultModelManager.cs" />
|
||||
<Compile Include="Models\Driver\CreateModelContext.cs" />
|
||||
<Compile Include="Models\Driver\LoadModelContext.cs" />
|
||||
<Compile Include="Models\Driver\ModelDriver.cs" />
|
||||
<Compile Include="Models\Driver\ModelDriverWithRecord.cs" />
|
||||
<Compile Include="Models\Driver\NewModelContext.cs" />
|
||||
<Compile Include="Models\IModelManager.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\ModelRoot.cs" />
|
||||
<Compile Include="Models\Records\ModelPartRecord.cs" />
|
||||
<Compile Include="Models\Records\ModelTypeRecord.cs" />
|
||||
<Compile Include="Models\Records\ModelRecord.cs" />
|
||||
<Compile Include="Mvc\Html\HtmlHelperExtensions.cs" />
|
||||
|
@@ -80,7 +80,7 @@ namespace Orchard.Security.Providers {
|
||||
}
|
||||
|
||||
public override bool ValidateUser(string username, string password) {
|
||||
throw new NotImplementedException();
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool UnlockUser(string userName) {
|
||||
|
Reference in New Issue
Block a user