emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* How to set priority of a heading with the highest one among its children
@ 2023-04-20 11:04 Edouard Debry
  2023-04-23 18:07 ` Ihor Radchenko
  0 siblings, 1 reply; 4+ messages in thread
From: Edouard Debry @ 2023-04-20 11:04 UTC (permalink / raw)
  To: emacs-orgmode


Given this tree :

* TODO Main [#2]
** DONE Child1 [#0]
** TODO Child2 [#3]
** TODO Child3 [#4]
*** TODO Subchild1 [#1]
*** TODO Subchild2 [#2]

I would like that the priority of parent headings be automatically set to the highest
priority among its note done children.

So, in previous example, as soon as Subchild1 priority is set to 1 (0=highest, 5=lowest),
then priority of Child3 should be replaced by 1 (instead of 4) and priority of Main should
also be changed to 1 as this became the priority of its child Child3, but it would not
be set to 0, priority of Child1, as this task is done.

The reason for this it that usually a project is a main heading, which is split in
subtasks and, I want the overall project priority to reflect the highest priority of its
not done tasks.

To do so, I need to create a recursive function :

(adjust-priority ()
  (apply-on-child  #'adjust-priority)
  (set-priority (if-child (collect highest-priority))))

and apply this function to the top level heading whenever a change in priority occurs in
its children.

But this involves org skills a bit beyond my understanding, I wonder if you could give
me some piece of advices on how to do that :
- is there a suitable hook for this function ?
- when in a given tree, how can I select the top level heading ?
- when at a given heading, how can I change programmatically the priority ?

For this latter question, I tried (org-entry-put nil "PRIORITY" "2"), but it replied that

 org-priority: Priority must be between ‘0’ and ‘5’


Regards


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: How to set priority of a heading with the highest one among its children
  2023-04-20 11:04 How to set priority of a heading with the highest one among its children Edouard Debry
@ 2023-04-23 18:07 ` Ihor Radchenko
  2023-04-24 12:24   ` *** BULK *** " DEBRY.Edouard
  0 siblings, 1 reply; 4+ messages in thread
From: Ihor Radchenko @ 2023-04-23 18:07 UTC (permalink / raw)
  To: Edouard Debry; +Cc: emacs-orgmode

Edouard Debry <edouard.debry@gmail.com> writes:

> But this involves org skills a bit beyond my understanding, I wonder if you could give
> me some piece of advices on how to do that :
> - is there a suitable hook for this function ?

No hook, but you can advice `org-priority' using :after advice.

> - when in a given tree, how can I select the top level heading ?

(while (org-up-heading-safe))

Try to play with this using M-: with point at different headings.

> - when at a given heading, how can I change programmatically the priority ?

(org-priority 1), for example.

> For this latter question, I tried (org-entry-put nil "PRIORITY" "2"), but it replied that
>
>  org-priority: Priority must be between ‘0’ and ‘5’

That's because `org-entry-put' converts the argument into number,
assuming a single-character string like "A". This is probably a bug.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: *** BULK *** Re: How to set priority of a heading with the highest one among its children
  2023-04-23 18:07 ` Ihor Radchenko
@ 2023-04-24 12:24   ` DEBRY.Edouard
  2023-04-24 12:31     ` Ihor Radchenko
  0 siblings, 1 reply; 4+ messages in thread
From: DEBRY.Edouard @ 2023-04-24 12:24 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: Edouard Debry, emacs-orgmode@gnu.org



Here is something working, probably not yet all cases proof

(defun local/set-priority1 ()
  (org-with-wide-buffer
   (when (org-goto-first-child)
     (let ((ls (remove nil (cl-loop collect (local/set-priority1) while (org-goto-sibling)))))
       (outline-up-heading 1)
       (if ls (org-priority (seq-min ls)))))
   (if (eq 'todo (org-element-property :todo-type (org-element-at-point)))
       (string-to-number (org-entry-get nil "PRIORITY")))))

(defun local/set-priority2 ()
  (save-excursion
    (outline-up-heading (- (org-element-property :level (org-element-at-point)) 1))
    (local/set-priority1)))


Ihor Radchenko <yantar92@posteo.net> writes:

> -------------------------------------------------------------------------------------------------------------------------------------------------------------------
> Attention, ce courriel provient d'Internet. L'emetteur n'est peut-etre pas celui que vous pensez. 
> Merci de considerer ce point en lisant ce courriel, avant d'y repondre, de cliquer sur les liens ou d'ouvrir les pieces jointes.
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Edouard Debry <edouard.debry@gmail.com> writes:
>
>> But this involves org skills a bit beyond my understanding, I wonder if you could give
>> me some piece of advices on how to do that :
>> - is there a suitable hook for this function ?
>
> No hook, but you can advice `org-priority' using :after advice.
>
>> - when in a given tree, how can I select the top level heading ?
>
> (while (org-up-heading-safe))
>
> Try to play with this using M-: with point at different headings.
>
>> - when at a given heading, how can I change programmatically the priority ?
>
> (org-priority 1), for example.
>
>> For this latter question, I tried (org-entry-put nil "PRIORITY" "2"), but it replied that
>>
>>  org-priority: Priority must be between ‘0’ and ‘5’
>
> That's because `org-entry-put' converts the argument into number,
> assuming a single-character string like "A". This is probably a bug.

___________________________________________________________________________________________________________________________________

This email and any attachments are confidential to the intended recipient and may also be privileged.
If you are not the intended recipient please delete it from your system and notify the sender. 
You should not copy it or use it for any purpose nor disclose or distribute its contents to any other person.
 

Ce courriel et ses pieces-jointes sont envoyes de maniere confidentielle et doivent etre traites avec attention.
Si vous n'etes pas le destinataire, merci de le detruire et d'en informer son auteur. 
Vous ne devez pas copier, utiliser, reveler ou diffuser son contenu a quiconque.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: *** BULK *** Re: How to set priority of a heading with the highest one among its children
  2023-04-24 12:24   ` *** BULK *** " DEBRY.Edouard
@ 2023-04-24 12:31     ` Ihor Radchenko
  0 siblings, 0 replies; 4+ messages in thread
From: Ihor Radchenko @ 2023-04-24 12:31 UTC (permalink / raw)
  To: DEBRY.Edouard; +Cc: Edouard Debry, emacs-orgmode@gnu.org

DEBRY.Edouard <edouard.debry@mbda-systems.com> writes:

> Here is something working, probably not yet all cases proof
>
> (defun local/set-priority1 ()
>   (org-with-wide-buffer
>    (when (org-goto-first-child)
>      (let ((ls (remove nil (cl-loop collect (local/set-priority1) while (org-goto-sibling)))))
>        (outline-up-heading 1)

I recommend using org-* functions, when you can. outline-* functions are
not always compatible with Org.

> (defun local/set-priority2 ()
>   (save-excursion
>     (outline-up-heading (- (org-element-property :level (org-element-at-point)) 1))

Note that parent heading may or may not be just one level lower.
Consider
* heading 1
****** child 

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-04-24 12:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-20 11:04 How to set priority of a heading with the highest one among its children Edouard Debry
2023-04-23 18:07 ` Ihor Radchenko
2023-04-24 12:24   ` *** BULK *** " DEBRY.Edouard
2023-04-24 12:31     ` Ihor Radchenko

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).