Commit 906637ae authored by Pelle Johnsen's avatar Pelle Johnsen

Fix issue with reverse(many) for models with custom pk

 - Also add test covering the issue
parent 332fa442
...@@ -186,7 +186,7 @@ func (t *dbTables) getJoinSQL() (join string) { ...@@ -186,7 +186,7 @@ func (t *dbTables) getJoinSQL() (join string) {
table = jt.mi.table table = jt.mi.table
switch { switch {
case jt.fi.fieldType == RelManyToMany || jt.fi.reverse && jt.fi.reverseFieldInfo.fieldType == RelManyToMany: case jt.fi.fieldType == RelManyToMany || jt.fi.fieldType == RelReverseMany || jt.fi.reverse && jt.fi.reverseFieldInfo.fieldType == RelManyToMany:
c1 = jt.fi.mi.fields.pk.column c1 = jt.fi.mi.fields.pk.column
for _, ffi := range jt.mi.fields.fieldsRel { for _, ffi := range jt.mi.fields.fieldsRel {
if jt.fi.mi == ffi.relModelInfo { if jt.fi.mi == ffi.relModelInfo {
......
...@@ -332,6 +332,24 @@ func NewComment() *Comment { ...@@ -332,6 +332,24 @@ func NewComment() *Comment {
return obj return obj
} }
type Group struct {
GID string `orm:"pk;column(gid);size(32);unique"`
Name string
Permissions []*Permission `orm:"reverse(many)" json:"-"`
}
type Permission struct {
ID int `orm:"column(id)"`
Name string
Groups []*Group `orm:"rel(m2m);rel_through(github.com/astaxie/beego/orm.GroupPermissions)"`
}
type GroupPermissions struct {
ID int `orm:"column(id)"`
Group *Group `orm:"rel(fk)"`
Permission *Permission `orm:"rel(fk)"`
}
var DBARGS = struct { var DBARGS = struct {
Driver string Driver string
Source string Source string
......
...@@ -35,6 +35,19 @@ var ( ...@@ -35,6 +35,19 @@ var (
testDateTime = formatDateTime + " -0700" testDateTime = formatDateTime + " -0700"
) )
type argAny []interface{}
// get interface by index from interface slice
func (a argAny) Get(i int, args ...interface{}) (r interface{}) {
if i >= 0 && i < len(a) {
r = a[i]
}
if len(args) > 0 {
r = args[0]
}
return
}
func ValuesCompare(is bool, a interface{}, args ...interface{}) (ok bool, err error) { func ValuesCompare(is bool, a interface{}, args ...interface{}) (ok bool, err error) {
if len(args) == 0 { if len(args) == 0 {
return false, fmt.Errorf("miss args") return false, fmt.Errorf("miss args")
...@@ -171,6 +184,9 @@ func TestSyncDb(t *testing.T) { ...@@ -171,6 +184,9 @@ func TestSyncDb(t *testing.T) {
RegisterModel(new(Comment)) RegisterModel(new(Comment))
RegisterModel(new(UserBig)) RegisterModel(new(UserBig))
RegisterModel(new(PostTags)) RegisterModel(new(PostTags))
RegisterModel(new(Group))
RegisterModel(new(Permission))
RegisterModel(new(GroupPermissions))
err := RunSyncdb("default", true, false) err := RunSyncdb("default", true, false)
throwFail(t, err) throwFail(t, err)
...@@ -187,6 +203,9 @@ func TestRegisterModels(t *testing.T) { ...@@ -187,6 +203,9 @@ func TestRegisterModels(t *testing.T) {
RegisterModel(new(Comment)) RegisterModel(new(Comment))
RegisterModel(new(UserBig)) RegisterModel(new(UserBig))
RegisterModel(new(PostTags)) RegisterModel(new(PostTags))
RegisterModel(new(Group))
RegisterModel(new(Permission))
RegisterModel(new(GroupPermissions))
BootStrap() BootStrap()
...@@ -635,6 +654,45 @@ The program—and web server—godoc processes Go source files to extract docume ...@@ -635,6 +654,45 @@ The program—and web server—godoc processes Go source files to extract docume
throwFail(t, err) throwFail(t, err)
throwFail(t, AssertIs(id > 0, true)) throwFail(t, AssertIs(id > 0, true))
} }
permissions := []*Permission{
{Name: "writePosts"},
{Name: "readComments"},
{Name: "readPosts"},
}
groups := []*Group{
{
GID: "g1",
Name: "admins",
Permissions: []*Permission{permissions[0], permissions[1], permissions[2]},
},
{
GID: "g2",
Name: "users",
Permissions: []*Permission{permissions[1], permissions[2]},
},
}
for _, permission := range permissions {
id, err := dORM.Insert(permission)
throwFail(t, err)
throwFail(t, AssertIs(id > 0, true))
}
for _, group := range groups {
id, err := dORM.Insert(group)
throwFail(t, err)
throwFail(t, AssertIs(id > 0, true))
num := len(group.Permissions)
if num > 0 {
nums, err := dORM.QueryM2M(group, "permissions").Add(group.Permissions)
throwFailNow(t, err)
throwFailNow(t, AssertIs(nums, num))
}
}
} }
func TestCustomField(t *testing.T) { func TestCustomField(t *testing.T) {
...@@ -1398,6 +1456,18 @@ func TestQueryRelate(t *testing.T) { ...@@ -1398,6 +1456,18 @@ func TestQueryRelate(t *testing.T) {
// throwFailNow(t, AssertIs(num, 2)) // throwFailNow(t, AssertIs(num, 2))
} }
func TestPkManyRelated(t *testing.T) {
permission := &Permission{Name: "readPosts"}
err := dORM.Read(permission, "Name")
throwFailNow(t, err)
var groups []*Group
qs := dORM.QueryTable("Group")
num, err := qs.Filter("Permissions__Permission", permission.ID).All(&groups)
throwFailNow(t, err)
throwFailNow(t, AssertIs(num, 2))
}
func TestPrepareInsert(t *testing.T) { func TestPrepareInsert(t *testing.T) {
qs := dORM.QueryTable("user") qs := dORM.QueryTable("user")
i, err := qs.PrepareInsert() i, err := qs.PrepareInsert()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment