about summary refs log tree commit diff
path: root/org-clubhouse.el
diff options
context:
space:
mode:
Diffstat (limited to 'org-clubhouse.el')
-rw-r--r--org-clubhouse.el37
1 files changed, 34 insertions, 3 deletions
diff --git a/org-clubhouse.el b/org-clubhouse.el
index 21158f19414c..2547e136ca04 100644
--- a/org-clubhouse.el
+++ b/org-clubhouse.el
@@ -112,6 +112,17 @@ stories.
 If set to a list of todo-state's, will mark the current user as the owner of
 clubhouse stories whenever updating the status to one of those todo states.")
 
+(defvar org-clubhouse-create-stories-with-labels nil
+  "Controls the way org-clubhouse creates stories with labels based on org tags.
+
+If set to 't, will create labels for all org tags on headlines when stories are
+created.
+
+If set to 'existing, will set labels on created stories only if the label
+already exists in clubhouse
+
+If set to nil, will never create stories with labels")
+
 ;;;
 ;;; Utilities
 ;;;
@@ -282,6 +293,17 @@ clubhouse stories whenever updating the status to one of those todo states.")
                          drawer-pos))
            (org-clubhouse-find-description-drawer)))))))
 
+(defun org-clubhouse--labels-for-elt (elt)
+  "Return the Clubhouse labels based on the tags of ELT and the user's config."
+  (unless (eq nil org-clubhouse-create-stories-with-labels)
+    (let ((tags (org-get-tags (plist-get elt :contents-begin))))
+      (cl-case org-clubhouse-create-stories-with-labels
+        ('t tags)
+        ('existing (-filter (lambda (tag) (-some (lambda (l)
+                                              (string-equal tag (cdr l)))
+                                            (org-clubhouse-labels)))
+                            tags))))))
+
 ;;;
 ;;; API integration
 ;;;
@@ -429,6 +451,10 @@ clubhouse stories whenever updating the status to one of those todo states.")
                       'name
                       'id)))
 
+(defcache org-clubhouse-labels
+  "Returns labels as (label-id . name)"
+  (org-clubhouse-fetch-as-id-name-pairs "labels"))
+
 (defcache org-clubhouse-whoami
   "Returns the ID of the logged in user"
   (->> (org-clubhouse-request
@@ -599,7 +625,7 @@ If the epics already have a CLUBHOUSE-EPIC-ID, they are filtered and ignored."
   (alist-get-equal org-clubhouse-default-state (org-clubhouse-workflow-states)))
 
 (cl-defun org-clubhouse-create-story-internal
-    (title &key project-id epic-id story-type description)
+    (title &key project-id epic-id story-type description labels)
   (cl-assert (and (stringp title)
                (integerp project-id)
                (or (null epic-id) (integerp epic-id))
@@ -609,7 +635,8 @@ If the epics already have a CLUBHOUSE-EPIC-ID, they are filtered and ignored."
                   (project_id . ,project-id)
                   (epic_id . ,epic-id)
                   (story_type . ,story-type)
-                  (description . ,(or description "")))))
+                  (description . ,(or description ""))
+                  (labels . ,labels))))
 
     (when workflow-state-id
       (push `(workflow_state_id . ,workflow-state-id) params))
@@ -682,12 +709,16 @@ If the stories already have a CLUBHOUSE-ID, they are filtered and ignored."
                                 (save-mark-and-excursion
                                   (goto-char (plist-get elt :begin))
                                   (org-clubhouse-find-description-drawer)))
+                               (labels (-map (lambda (l) `((name . ,l)))
+                                             (org-clubhouse--labels-for-elt
+                                              elt)))
                                (story (org-clubhouse-create-story-internal
                                        title
                                        :project-id project-id
                                        :epic-id epic-id
                                        :story-type story-type
-                                       :description description)))
+                                       :description description
+                                       :labels labels)))
                           (org-clubhouse-populate-created-story elt story)
                           (when (functionp then)
                             (funcall then story))))