Guest User

Untitled

a guest
May 8th, 2019
1,169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 3.02 KB | None | 0 0
  1. (require 'request-deferred)
  2.  
  3. (defconst user-id 33)
  4. (defconst api-token "asdf")
  5. (defconst aika-url "http://localhost:4000/api")
  6.  
  7. (defun org-aika ()
  8.   (interactive)
  9.   "HTTP POSTs a very specific sort of org-clocktable to the aikasheet API"
  10.   (save-excursion
  11.     (goto-char (point-max))
  12.     (insert "\n#+TIMESHEET:\n"))
  13.   (if (post-timesheet (collect-timesheet))
  14.    (progn
  15.      (goto-char (point-max))
  16.      (message "GREAT SUCCESS"))
  17.    (save-excursion
  18.      (goto-char (point-max))
  19.      (insert ":(╯°□°)╯︵ ┻━┻)"))))
  20.  
  21. (defun post-timesheet (entries)
  22.   (if entries
  23.       (let ((entry (car entries)))
  24.         (request
  25.          (format "%s/entries/%s" aika-url (plist-get entry ':date))
  26.          :type "POST"
  27.          :data (json-encode-plist (plist-get entry ':data))
  28.          :headers '(("Content-Type" . "application/json"))
  29.          :parser 'json-read
  30.          :sync t
  31.          :success
  32.          (cl-function
  33.           (lambda (&key data &allow-other-keys)
  34.             (save-excursion
  35.               (goto-char (point-max))
  36.               (insert (format ":  OK %s\n" data)))
  37.             (post-timesheet (cdr entries))))
  38.          :error
  39.          (cl-function
  40.           (lambda (&rest args &key error-thrown &allow-other-keys)
  41.             (save-excursion
  42.               (goto-char (point-max))
  43.               (insert (format ": ERR %s \n" error-thrown)))
  44.             (post-timesheet (cdr entries))))))))
  45.  
  46. (defun collect-timesheet ()
  47.   (org-element-map (org-element-parse-buffer) 'headline
  48.     (lambda (el)
  49.       (if (eq 2 (level el))
  50.           (list
  51.            :date (date el)
  52.            :data
  53.            (list
  54.             :user_id user-id
  55.             :api_token api-token
  56.             :entry
  57.             (list
  58.              :description (format "[%s] %s"
  59.                                   (tag el)
  60.                                   (description el))
  61.              :time (duration el))))))))
  62.  
  63. (defun level (el)
  64.   (org-element-property :level el))
  65.  
  66. (defun date (el)
  67.   (car
  68.    (org-element-map el 'clock
  69.      (lambda (clock)
  70.        (let ((timestamp (org-element-property :value clock)))
  71.          (format
  72.           "%02d-%02d-%02d"
  73.           (org-element-property :year-start timestamp)
  74.           (org-element-property :month-start timestamp)
  75.           (org-element-property :day-start timestamp)))))))
  76.  
  77. (defun tag (el)
  78.   (car (org-element-property :tags el)))
  79.  
  80. (defun description (el)
  81.   (or (car
  82.        (org-element-map el 'link
  83.          (lambda (headline)
  84.            (substring-no-properties (nth 2 headline)))))
  85.       (org-element-property :raw-value el)))
  86.  
  87. (defun duration (el)
  88.   (apply '+ (all-durations el)))
  89.  
  90. (defun all-durations (el)
  91.   (org-element-map el 'clock
  92.     (lambda (clock)
  93.       (timestamp-to-hours
  94.        (or (org-element-property :duration clock)
  95.            "00:00")))))
  96.  
  97. (defun timestamp-to-hours (str)
  98.   (setq parts (split-string str ":"))
  99.   (setq hours (string-to-number (car parts)))
  100.   (setq mins (string-to-number (cadr parts)))
  101. (+ hours (/ mins (float 60))))
Advertisement
Add Comment
Please, Sign In to add comment