Fix duplicating empty lists
This commit is contained in:
parent
3f6d85497f
commit
8e65ffb99b
1 changed files with 100 additions and 87 deletions
|
@ -107,12 +107,111 @@ func (ld *ListDuplicate) Create(s *xorm.Session, doer web.Auth) (err error) {
|
||||||
|
|
||||||
log.Debugf("Duplicated all buckets from list %d into %d", ld.ListID, ld.List.ID)
|
log.Debugf("Duplicated all buckets from list %d into %d", ld.ListID, ld.List.ID)
|
||||||
|
|
||||||
|
err = duplicateTasks(s, doer, ld, bucketMap)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Background files + unsplash info
|
||||||
|
if ld.List.BackgroundFileID != 0 {
|
||||||
|
|
||||||
|
log.Debugf("Duplicating background %d from list %d into %d", ld.List.BackgroundFileID, ld.ListID, ld.List.ID)
|
||||||
|
|
||||||
|
f := &files.File{ID: ld.List.BackgroundFileID}
|
||||||
|
if err := f.LoadFileMetaByID(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := f.LoadFileByID(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.File.Close()
|
||||||
|
|
||||||
|
file, err := files.Create(f.File, f.Name, f.Size, doer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get unsplash info if applicable
|
||||||
|
up, err := GetUnsplashPhotoByFileID(s, ld.List.BackgroundFileID)
|
||||||
|
if err != nil && files.IsErrFileIsNotUnsplashFile(err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if up != nil {
|
||||||
|
up.ID = 0
|
||||||
|
up.FileID = file.ID
|
||||||
|
if err := up.Save(s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := SetListBackground(s, ld.List.ID, file); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Duplicated list background from list %d into %d", ld.ListID, ld.List.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rights / Shares
|
||||||
|
// To keep it simple(r) we will only copy rights which are directly used with the list, no namespace changes.
|
||||||
|
users := []*ListUser{}
|
||||||
|
err = s.Where("list_id = ?", ld.ListID).Find(&users)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, u := range users {
|
||||||
|
u.ID = 0
|
||||||
|
u.ListID = ld.List.ID
|
||||||
|
if _, err := s.Insert(u); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Duplicated user shares from list %d into %d", ld.ListID, ld.List.ID)
|
||||||
|
|
||||||
|
teams := []*TeamList{}
|
||||||
|
err = s.Where("list_id = ?", ld.ListID).Find(&teams)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, t := range teams {
|
||||||
|
t.ID = 0
|
||||||
|
t.ListID = ld.List.ID
|
||||||
|
if _, err := s.Insert(t); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate new link shares if any are available
|
||||||
|
linkShares := []*LinkSharing{}
|
||||||
|
err = s.Where("list_id = ?", ld.ListID).Find(&linkShares)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, share := range linkShares {
|
||||||
|
share.ID = 0
|
||||||
|
share.ListID = ld.List.ID
|
||||||
|
share.Hash = utils.MakeRandomString(40)
|
||||||
|
if _, err := s.Insert(share); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Duplicated all link shares from list %d into %d", ld.ListID, ld.List.ID)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func duplicateTasks(s *xorm.Session, doer web.Auth, ld *ListDuplicate, bucketMap map[int64]int64) (err error) {
|
||||||
// Get all tasks + all task details
|
// Get all tasks + all task details
|
||||||
tasks, _, _, err := getTasksForLists(s, []*List{{ID: ld.ListID}}, doer, &taskOptions{})
|
tasks, _, _, err := getTasksForLists(s, []*List{{ID: ld.ListID}}, doer, &taskOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(tasks) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// This map contains the old task id as key and the new duplicated task id as value.
|
// This map contains the old task id as key and the new duplicated task id as value.
|
||||||
// It is used to map old task items to new ones.
|
// It is used to map old task items to new ones.
|
||||||
taskMap := make(map[int64]int64)
|
taskMap := make(map[int64]int64)
|
||||||
|
@ -255,91 +354,5 @@ func (ld *ListDuplicate) Create(s *xorm.Session, doer web.Auth) (err error) {
|
||||||
|
|
||||||
log.Debugf("Duplicated all task relations from list %d into %d", ld.ListID, ld.List.ID)
|
log.Debugf("Duplicated all task relations from list %d into %d", ld.ListID, ld.List.ID)
|
||||||
|
|
||||||
// Background files + unsplash info
|
return nil
|
||||||
if ld.List.BackgroundFileID != 0 {
|
|
||||||
|
|
||||||
log.Debugf("Duplicating background %d from list %d into %d", ld.List.BackgroundFileID, ld.ListID, ld.List.ID)
|
|
||||||
|
|
||||||
f := &files.File{ID: ld.List.BackgroundFileID}
|
|
||||||
if err := f.LoadFileMetaByID(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := f.LoadFileByID(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer f.File.Close()
|
|
||||||
|
|
||||||
file, err := files.Create(f.File, f.Name, f.Size, doer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get unsplash info if applicable
|
|
||||||
up, err := GetUnsplashPhotoByFileID(s, ld.List.BackgroundFileID)
|
|
||||||
if err != nil && files.IsErrFileIsNotUnsplashFile(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if up != nil {
|
|
||||||
up.ID = 0
|
|
||||||
up.FileID = file.ID
|
|
||||||
if err := up.Save(s); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := SetListBackground(s, ld.List.ID, file); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("Duplicated list background from list %d into %d", ld.ListID, ld.List.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rights / Shares
|
|
||||||
// To keep it simple(r) we will only copy rights which are directly used with the list, no namespace changes.
|
|
||||||
users := []*ListUser{}
|
|
||||||
err = s.Where("list_id = ?", ld.ListID).Find(&users)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, u := range users {
|
|
||||||
u.ID = 0
|
|
||||||
u.ListID = ld.List.ID
|
|
||||||
if _, err := s.Insert(u); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("Duplicated user shares from list %d into %d", ld.ListID, ld.List.ID)
|
|
||||||
|
|
||||||
teams := []*TeamList{}
|
|
||||||
err = s.Where("list_id = ?", ld.ListID).Find(&teams)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, t := range teams {
|
|
||||||
t.ID = 0
|
|
||||||
t.ListID = ld.List.ID
|
|
||||||
if _, err := s.Insert(t); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate new link shares if any are available
|
|
||||||
linkShares := []*LinkSharing{}
|
|
||||||
err = s.Where("list_id = ?", ld.ListID).Find(&linkShares)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, share := range linkShares {
|
|
||||||
share.ID = 0
|
|
||||||
share.ListID = ld.List.ID
|
|
||||||
share.Hash = utils.MakeRandomString(40)
|
|
||||||
if _, err := s.Insert(share); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("Duplicated all link shares from list %d into %d", ld.ListID, ld.List.ID)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue