fix(import): correctly set child project relations
This commit is contained in:
parent
93795d2f29
commit
b2f3a23cb3
@ -52,13 +52,44 @@ func insertFromStructure(s *xorm.Session, str []*models.ProjectWithTasksAndBucke
|
|||||||
labels := make(map[string]*models.Label)
|
labels := make(map[string]*models.Label)
|
||||||
archivedProjects := []int64{}
|
archivedProjects := []int64{}
|
||||||
|
|
||||||
|
childRelations := make(map[int64][]int64) // old id is the key, slice of old children ids
|
||||||
|
projectsByOldID := make(map[int64]*models.Project) // old id is the key
|
||||||
// Create all projects
|
// Create all projects
|
||||||
for _, p := range str {
|
for _, p := range str {
|
||||||
|
oldID := p.ID
|
||||||
|
|
||||||
|
if p.ParentProjectID != 0 {
|
||||||
|
childRelations[p.ParentProjectID] = append(childRelations[p.ParentProjectID], oldID)
|
||||||
|
}
|
||||||
|
|
||||||
p.ID = 0
|
p.ID = 0
|
||||||
err = createProjectWithChildren(s, p, 0, &archivedProjects, labels, user)
|
err = createProject(s, p, &archivedProjects, labels, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
projectsByOldID[oldID] = &p.Project
|
||||||
|
}
|
||||||
|
|
||||||
|
// parent / child relations
|
||||||
|
for parentID, children := range childRelations {
|
||||||
|
parent, has := projectsByOldID[parentID]
|
||||||
|
if !has {
|
||||||
|
log.Debugf("[creating structure] could not find parentID project with old id %d", parentID)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, childID := range children {
|
||||||
|
child, has := projectsByOldID[childID]
|
||||||
|
if !has {
|
||||||
|
log.Debugf("[creating structure] could not find child project with old id %d for parent project with old id %d", childID, parentID)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
child.ParentProjectID = parent.ID
|
||||||
|
err = child.Update(s, user)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(archivedProjects) > 0 {
|
if len(archivedProjects) > 0 {
|
||||||
@ -76,30 +107,18 @@ func insertFromStructure(s *xorm.Session, str []*models.ProjectWithTasksAndBucke
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createProjectWithChildren(s *xorm.Session, project *models.ProjectWithTasksAndBuckets, parentProjectID int64, archivedProjectIDs *[]int64, labels map[string]*models.Label, user *user.User) (err error) {
|
func createProject(s *xorm.Session, project *models.ProjectWithTasksAndBuckets, archivedProjectIDs *[]int64, labels map[string]*models.Label, user *user.User) (err error) {
|
||||||
err = createProjectWithEverything(s, project, parentProjectID, archivedProjectIDs, labels, user)
|
err = createProjectWithEverything(s, project, archivedProjectIDs, labels, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("[creating structure] Created project %d", project.ID)
|
log.Debugf("[creating structure] Created project %d", project.ID)
|
||||||
|
|
||||||
if len(project.ChildProjects) > 0 {
|
|
||||||
log.Debugf("[creating structure] Creating %d projects", len(project.ChildProjects))
|
|
||||||
|
|
||||||
// Create all projects
|
|
||||||
for _, cp := range project.ChildProjects {
|
|
||||||
err = createProjectWithChildren(s, cp, project.ID, archivedProjectIDs, labels, user)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func createProjectWithEverything(s *xorm.Session, project *models.ProjectWithTasksAndBuckets, parentProjectID int64, archivedProjects *[]int64, labels map[string]*models.Label, user *user.User) (err error) {
|
func createProjectWithEverything(s *xorm.Session, project *models.ProjectWithTasksAndBuckets, archivedProjects *[]int64, labels map[string]*models.Label, user *user.User) (err error) {
|
||||||
// The tasks and bucket slices are going to be reset during the creation of the project, so we rescue it here
|
// The tasks and bucket slices are going to be reset during the creation of the project, so we rescue it here
|
||||||
// to be able to still loop over them aftere the project was created.
|
// to be able to still loop over them aftere the project was created.
|
||||||
tasks := project.Tasks
|
tasks := project.Tasks
|
||||||
@ -114,7 +133,6 @@ func createProjectWithEverything(s *xorm.Session, project *models.ProjectWithTas
|
|||||||
project.IsArchived = false
|
project.IsArchived = false
|
||||||
}
|
}
|
||||||
|
|
||||||
project.ParentProjectID = parentProjectID
|
|
||||||
project.ID = 0
|
project.ID = 0
|
||||||
err = project.Create(s, user)
|
err = project.Create(s, user)
|
||||||
if err != nil && models.IsErrProjectIdentifierIsNotUnique(err) {
|
if err != nil && models.IsErrProjectIdentifierIsNotUnique(err) {
|
||||||
@ -230,7 +248,6 @@ func createProjectWithEverything(s *xorm.Session, project *models.ProjectWithTas
|
|||||||
if err != nil && !models.IsErrRelationAlreadyExists(err) {
|
if err != nil && !models.IsErrRelationAlreadyExists(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = nil
|
|
||||||
|
|
||||||
log.Debugf("[creating structure] Created task relation between task %d and %d", t.ID, rt.ID)
|
log.Debugf("[creating structure] Created task relation between task %d and %d", t.ID, rt.ID)
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) er
|
|||||||
}
|
}
|
||||||
|
|
||||||
versionString := bufVersion.String()
|
versionString := bufVersion.String()
|
||||||
if versionString == "dev" && versionString == vversion.Version {
|
if versionString == "dev" && vversion.Version == "dev" {
|
||||||
log.Debugf(logPrefix + "Importing from dev version")
|
log.Debugf(logPrefix + "Importing from dev version")
|
||||||
} else {
|
} else {
|
||||||
dumpedVersion, err := version.NewVersion(bufVersion.String())
|
dumpedVersion, err := version.NewVersion(bufVersion.String())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user