diff --git a/pkg/caldav/parsing.go b/pkg/caldav/parsing.go index 7678b0fe4e3..d9f18d95885 100644 --- a/pkg/caldav/parsing.go +++ b/pkg/caldav/parsing.go @@ -17,6 +17,7 @@ package caldav import ( + "code.vikunja.io/api/pkg/db" "errors" "strconv" "strings" @@ -90,8 +91,12 @@ func ParseTaskFromVTODO(content string) (vTask *models.Task, err error) { } // We put the vTodo details in a map to be able to handle them more easily task := make(map[string]ics.IANAProperty) + var relation *ics.IANAProperty for _, c := range vTodo.UnknownPropertiesIANAProperties() { task[c.IANAToken] = c + if strings.HasPrefix(c.IANAToken, "RELATED-TO") { + relation = &c + } } // Parse the priority @@ -134,6 +139,19 @@ func ParseTaskFromVTODO(content string) (vTask *models.Task, err error) { DoneAt: caldavTimeToTimestamp(task["COMPLETED"]), } + if relation != nil { + s := db.NewSession() + defer s.Close() + + subtask, err := models.GetTaskSimpleByUUID(s, relation.Value) + if err != nil { + return nil, err + } + + vTask.RelatedTasks = make(map[models.RelationKind][]*models.Task) + vTask.RelatedTasks[models.RelationKindSubtask] = []*models.Task{subtask} + } + if task["STATUS"].Value == "COMPLETED" { vTask.Done = true } diff --git a/pkg/models/tasks.go b/pkg/models/tasks.go index c542ed34ff7..9b359878452 100644 --- a/pkg/models/tasks.go +++ b/pkg/models/tasks.go @@ -371,6 +371,11 @@ func (bt *BulkTask) GetTasksByIDs(s *xorm.Session) (err error) { return } +func GetTaskSimpleByUUID(s *xorm.Session, uid string) (task *Task, err error) { + _, err = s.In("uid", uid).Get(task) + return +} + // GetTasksByUIDs gets all tasks from a bunch of uids func GetTasksByUIDs(s *xorm.Session, uids []string, a web.Auth) (tasks []*Task, err error) { tasks = []*Task{}