| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 | ;;; org-secretary.el --- Team management with org-mode;; Copyright (C) 2010-2014 Juan Reyero;;;; Author: Juan Reyero <juan _at_ juanreyero _dot_ com>;; Keywords: outlines, tasks, team, management;; Homepage: http://juanreyero.com/article/emacs/org-teams.html;; Version: 0.02;;;; This file is not part of GNU Emacs.;;;; This file is free software; you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation; either version 3, or (at your option);; any later version.;; THis file is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Commentary:;;;; This module implements helper functions for team management.  It;; makes it easy to keep track of the work of several people.  It;; keeps context (with whom and where you are) and allows you to use;; it to metadata to your notes, and to query the tasks associated;; with the people you are with and the place.;;;; See http://juanreyero.com/article/emacs/org-teams.html for a full;; explanation and configuration instructions.;;;;; Configuration;;;;;;;;;;;;;;;;;;;;; In short; your todos use the TODO keyword, your team's use TASK.;; Your org-todo-keywords should look something like this:;;;; (setq org-todo-keywords;;       '((sequence "TODO(t)" "|" "DONE(d)" "CANCELLED(c)");;         (sequence "TASK(f)" "|" "DONE(d)");;         (sequence "MAYBE(m)" "|" "CANCELLED(c)")));;;; It helps to distinguish them by color, like this:;;;; (setq org-todo-keyword-faces;;       '(("TODO" . (:foreground "DarkOrange1" :weight bold));;         ("MAYBE" . (:foreground "sea green"));;         ("DONE" . (:foreground "light sea green"));;         ("CANCELLED" . (:foreground "forest green"));;         ("TASK" . (:foreground "blue"))));;;; If you want to keep track of stuck projects you should tag your;; projects with :prj:, and define:;;;; (setq org-tags-exclude-from-inheritance '("prj");;       org-stuck-projects '("+prj/-MAYBE-DONE";;                            ("TODO" "TASK") ()));;;; Define a tag that marks TASK entries as yours:;;;; (setq org-sec-me "juanre");;;; Finally, you add the special views to your org-agenda-custom-commands:;;;; (setq org-agenda-custom-commands;;       '(("h" "Work todos" tags-todo;;          "-personal-doat={.+}-dowith={.+}/!-TASK";;          ((org-agenda-todo-ignore-scheduled t)));;         ("H" "All work todos" tags-todo "-personal/!-TASK-MAYBE";;          ((org-agenda-todo-ignore-scheduled nil)));;         ("A" "Work todos with doat or dowith" tags-todo;;          "-personal+doat={.+}|dowith={.+}/!-TASK";;          ((org-agenda-todo-ignore-scheduled nil)));;         ("j" "TODO dowith and TASK with";;          ((org-sec-with-view "TODO dowith");;           (org-sec-where-view "TODO doat");;           (org-sec-assigned-with-view "TASK with");;           (org-sec-stuck-with-view "STUCK with")));;         ("J" "Interactive TODO dowith and TASK with";;          ((org-sec-who-view "TODO dowith")))));;;;; Usage;;;;;;;;;;;;;  Do C-c w to say with whom you are meeting (a space-separated list;;  of names). Maybe do also C-c W to say where you are.  Then do C-c a;;  j to see:;;     - Todo items defined with TODO (ie, mine) in which the;;       =dowith= property matches any of the people with me.;;     - Todo items defined with TODO in which the =doat= property;;       matches my current location.;;     - Todo items defined with TASK that are tagged with the name;;       of any of the people with me (this is, assigned to them).;;     - Stuck projects tagged with the name of the people with me.;;;; Use C-c j to add meta-data with the people with me, the;; location and the time to entries.(require 'org)(defvar org-sec-me nil  "Tag that defines TASK todo entries associated to me")(defvar org-sec-with nil  "Value of the :with: property when doing an   org-sec-tag-entry. Change it with org-sec-set-with,   set to C-c w.  Defaults to org-sec-me")(defvar org-sec-where ""  "Value of the :at: property when doing an   org-sec-tag-entry. Change it with org-sec-set-with,   set to C-c W")(defvar org-sec-with-history '()  "History list of :with: properties")(defvar org-sec-where-history '()  "History list of :where: properties")(defun org-sec-set-with ()  "Changes the value of the org-sec-with variable for use in the   next call of org-sec-tag-entry.  Leave it empty to default to   org-sec-me (you)."  (interactive)  (setq org-sec-with (let ((w (read-string "With: " nil                                           'org-sec-with-history "")))                       (if (string= w "")                           nil                         w))))(global-set-key "\C-cw" 'org-sec-set-with)(defun org-sec-set-where ()  "Changes the value of the org-sec-where variable for use   in the next call of org-sec-tag-entry."  (interactive)  (setq org-sec-where        (read-string "Where: " nil                     'org-sec-where-history "")))(global-set-key "\C-cW" 'org-sec-set-where)(defun org-sec-set-dowith ()  "Sets the value of the dowith property."  (interactive)  (let ((do-with         (read-string "Do with: "                      nil 'org-sec-dowith-history "")))    (unless (string= do-with "")      (org-entry-put nil "dowith" do-with))))(global-set-key "\C-cd" 'org-sec-set-dowith)(defun org-sec-set-doat ()  "Sets the value of the doat property."  (interactive)  (let ((do-at (read-string "Do at: "                            nil 'org-sec-doat-history "")))    (unless (string= do-at "")      (org-entry-put nil "doat" do-at))))(global-set-key "\C-cD" 'org-sec-set-doat)(defun org-sec-tag-entry ()  "Adds a :with: property with the value of org-sec-with if   defined, an :at: property with the value of org-sec-where   if defined, and an :on: property with the current time."  (interactive)  (save-excursion    (org-entry-put nil "on" (format-time-string                             (org-time-stamp-format 'long)                             (current-time)))    (unless (string= org-sec-where "")      (org-entry-put nil "at" org-sec-where))    (if org-sec-with        (org-entry-put nil "with" org-sec-with))))(global-set-key "\C-cj" 'org-sec-tag-entry)(defun join (lst sep &optional pre post)  (mapconcat (function (lambda (x) (concat pre x post))) lst sep))(defun org-sec-get-with ()  (if org-sec-with      org-sec-with    org-sec-me))(defun org-sec-with-view (par &optional who)  "Select tasks marked as dowith=who, where who   defaults to the value of org-sec-with."  (org-tags-view '(4) (join (split-string (if who                                              who                                            (org-sec-get-with)))                            "|" "dowith=\"" "\"")))(defun org-sec-where-view (par)  "Select tasks marked as doat=org-sec-where."  (org-tags-view '(4) (concat "doat={" org-sec-where "}")))(defun org-sec-assigned-with-view (par &optional who)  "Select tasks assigned to who, by default org-sec-with."  (org-tags-view '(4)                 (concat (join (split-string (if who                                                 who                                               (org-sec-get-with)))                               "|")                         "/TASK")))(defun org-sec-stuck-with-view (par &optional who)  "Select stuck projects assigned to who, by default   org-sec-with."  (let ((org-stuck-projects         `(,(concat "+prj+"                    (join (split-string (if who                                            who                                          (org-sec-get-with))) "|")                    "/-MAYBE-DONE")           ("TODO" "TASK") ())))    (org-agenda-list-stuck-projects)))(defun org-sec-who-view (par)  "Builds agenda for a given user.  Queried. "  (let ((who (read-string "Build todo for user/tag: "                          "" "" "")))    (org-sec-with-view "TODO dowith" who)    (org-sec-assigned-with-view "TASK with" who)    (org-sec-stuck-with-view "STUCK with" who)))(provide 'org-secretary);;; org-secretary.el ends here
 |