o
    ï*#j[4  ã                   @   s´   d Z ddlZddlZddlZddlZddlmZmZ ej dd¡ ddl	m
Z
 ej dd¡ZdZd	Zd
d„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ ZedkrXeƒ  dS dS )añ  POST endpoint for todo mutations (tag/campaign model).

Body: JSON {action: "...", ...args}. Every mutation bumps meta.version.
Response: {success, version, ...}

Todos:      add_todo, edit_todo, delete_todo, set_status, reorder_todos,
            set_todo_tags, set_campaign
Notes:      add_note, delete_event
Tags:       add_tag, rename_tag, archive_tag, reorder_tags
Tag types:  add_tag_type
Campaigns:  add_campaign, edit_campaign, set_campaign_status, delete_campaign,
            bulk_spawn
é    N)ÚdatetimeÚtimezonez/opt/ngon/apps)ÚAuthManagerÚTODO_DBz/opt/ngon/data/todo.db)ÚopenÚin_progressÚblockedÚdone)Úactiver	   Úarchivedc                   C   s   t  tj¡jdd�S )NÚseconds)Útimespec)r   Únowr   ÚutcÚ	isoformat© r   r   útodo_action_cgi.pyÚnow_iso   s   r   c                 C   s    |   d¡ t|   d¡ ¡ d ƒS )NzTUPDATE meta SET value = CAST(CAST(value AS INTEGER) + 1 AS TEXT) WHERE key='version'z*SELECT value FROM meta WHERE key='version'r   )ÚexecuteÚintÚfetchone©Úconnr   r   r   Úbump_version"   s   
r   Ú r   c                 C   s,   |   d|› d|› �|¡ ¡ }t|d ƒd S )Nz'SELECT COALESCE(MAX(position), 0) FROM ú r   g      ð?)r   r   Úfloat)r   ÚtableÚ	where_sqlÚ
where_argsÚrowr   r   r   Únext_position'   s   r!   c                 C   s   |   d|||||f¡ d S )NzSINSERT INTO todo_events(todo_id,type,body,created_by,created_at) VALUES (?,?,?,?,?))r   )r   Útodo_idÚetypeÚbodyÚuserÚtsr   r   r   Ú	add_event,   s   þr'   c                 C   s(   |   d|f¡ ¡ }|r|d S d|› �S )Nz SELECT name FROM tags WHERE id=?r   ú#)r   r   )r   Útag_idÚrr   r   r   Útag_name2   s   r+   c                 C   s"   t dƒ t dƒ t t | ¡ƒ d S )NzContent-Type: application/jsonr   )ÚprintÚjsonÚdumps)Úpayloadr   r   r   Úrespond7   s   r0   c            )         sª
  t dƒ} |  ¡ }|r|  |¡stdddœƒ d S zttj d¡p!dƒ}W n ty/   d}Y nw |r8t	j
 |¡nd}z|rBt |¡ni }W n tjyW   tdddœƒ Y d S w | d	¡}|shtdd
dœƒ d S |}t t¡‰ ˆ  d¡ �zÚ�zªddi}tƒ }|dkrì| d¡p‰d ¡ }	|	s’tdƒ‚| d¡p˜d }
| d¡pŸd }tˆ dƒ}ˆ  d|	|d||
||f¡}|j}||d< | d¡p¿g D ]}ˆ  d|t|ƒf¡ qÀtˆ |dd ||ƒ | d¡pÜd ¡ }|rêtˆ |d|||ƒ �n&|dk�r*t|d ƒ}d|v �r| d¡�pd ¡ }	|	�stdƒ‚ˆ  d|	|f¡ d|v �r(ˆ  d| d¡�p$d |f¡ �nè|dk�r>t|d ƒ}ˆ  d |f¡ �nÔ|d!k�r™t|d ƒ}| d"¡}|tv�rZtd#|› �ƒ‚ˆ  d$|f¡ ¡ }|�rj|d nd}|d%k�r|ˆ  d&||||f¡ nˆ  d'||f¡ ||k�r—tˆ |d"|› d(|› �||ƒ �ny|d)k�rÀ| d*¡�p¥g }t|ƒD ]\}}ˆ  d+t|d, ƒt|ƒf¡ �qª�nR|d-k�rJt|d ƒ}td.d/„ | d¡�pÖg D ƒƒ}td0d/„ ˆ  d1|f¡D ƒƒ}|| }|| }|D ]}ˆ  d2||f¡ �qò|D ]}ˆ  d||f¡ �q |�s|�rHg }|�r(| d3d4 ‡ fd5d/„|D ƒ¡ ¡ |�r<| d6d7 ‡ fd8d/„|D ƒ¡ ¡ tˆ |d9d: |¡||ƒ �nÈ|d;k�rgt|d ƒ}| d¡�p\d }ˆ  d<||f¡ �n«|d=k�rŽt|d ƒ}| d>¡�pyd ¡ }|�sƒtd?ƒ‚tˆ |d|||ƒ �n„|d@k�r¢t|dA ƒ}ˆ  dB|f¡ �np|dCk�rät|dD ƒ}| dE¡�p´d ¡ }|�s¾tdFƒ‚| dG¡�pÅd }tˆ dHdI|||fƒ}ˆ  dJ|||d |||f¡}|j|dK< �n.|dLk�r| dE¡�pðd ¡ }|�sútdFƒ‚ˆ  dM|t|dK ƒf¡ �n
|dNk�rˆ  dOt|dK ƒf¡ �nø|dPk�r5ˆ  dQ| dR¡�r*d,ndt|dK ƒf¡ �nÝ|dSk�r\| d¡�pAg }t|ƒD ]\}}ˆ  dTt|d, ƒt|ƒf¡ �qF�n¶|dUk�rŸ| dE¡�phd ¡  ¡ }| dV¡�ptd ¡ } |�r}| �s�tdWƒ‚| dX¡�pˆdY}!tˆ dZƒ}ˆ  d[|| |!|f¡}|j|dD< �ns|d\k�rÚ| dE¡�p«d ¡ }|�sµtdFƒ‚ˆ  d]|| d^¡�pÀd | d¡�pÇd | dX¡�pÎd_||f¡}|j|d< �n8|d`k�rt|d ƒ}ˆ  da| dE¡�pïd ¡ �pôd | d^¡�pûd | d¡�pd | dX¡�p	d |f¡ �n|dbk�r>t|d ƒ}| d"¡}|t v�r+tdc|› �ƒ‚|d%k�r2|nd }"ˆ  dd||"|f¡ nÔ|dek�rQt|d ƒ}ˆ  df|f¡ nÁ|dgk�r| d¡�p]d ¡ }	|	�sgtdƒ‚dhdi„ | d¡�pqg D ƒ}#|#�s{tdjƒ‚dkdi„ | dl¡�p…g D ƒ}$| d¡�p�d }| d¡}|�s½| dm¡�pŸ|	 ¡ }%ˆ  d]|%| d^¡�p­d || dX¡�pµd_||f¡}|j}t|ƒ}||d< g }&|#D ]<}'tˆ dƒ}ˆ  d|	|d||||f¡}|j}ˆ  d||'f¡ |$D ]}ˆ  d||f¡ �qêtˆ |dd ||ƒ |& |¡ �qÉ|&|dn< ntdo|› �ƒ‚t!ˆ ƒ|dp< ˆ  "¡  t|ƒ W n  t#�yA }( zˆ  $¡  tdt%|(ƒdœƒ W Y d }(~(nd }(~(ww W ˆ  &¡  d S W ˆ  &¡  d S ˆ  &¡  w )qNÚtodoFÚunauthorized)ÚsuccessÚerrorÚCONTENT_LENGTHr   r   zinvalid jsonÚactionzmissing actionzPRAGMA foreign_keys = ONr3   TÚadd_todoÚtextztext requiredÚcampaign_idÚdue_dateÚitemszuINSERT INTO items(text,position,status,due_date,campaign_id,completed,created_by,created_at) VALUES (?,?,?,?,?,0,?,?)r   Úitem_idÚtag_idsz<INSERT OR IGNORE INTO todo_tags(todo_id,tag_id) VALUES (?,?)ÚcreatedÚnoteÚ	edit_todor"   z"UPDATE items SET text=? WHERE id=?z&UPDATE items SET due_date=? WHERE id=?Údelete_todozDELETE FROM items WHERE id=?Ú
set_statusÚstatuszbad status: z#SELECT status FROM items WHERE id=?r	   zQUPDATE items SET status=?, completed=1, completed_by=?, completed_at=? WHERE id=?zWUPDATE items SET status=?, completed=0, completed_by=NULL, completed_at=NULL WHERE id=?u    â†’ Úreorder_todosÚtodo_idsz&UPDATE items SET position=? WHERE id=?é   Úset_todo_tagsc                 s   s   � | ]}t |ƒV  qd S ©N©r   ©Ú.0Úxr   r   r   Ú	<genexpr>˜   ó   € zmain.<locals>.<genexpr>c                 s   s   � | ]}|d  V  qdS )r   Nr   )rK   r*   r   r   r   rM   ™   rN   z,SELECT tag_id FROM todo_tags WHERE todo_id=?z2DELETE FROM todo_tags WHERE todo_id=? AND tag_id=?ú+z, +c                 3   ó   � | ]}t ˆ |ƒV  qd S rH   ©r+   rJ   r   r   r   rM   ¤   ó   € ú-z, -c                 3   rP   rH   rQ   rJ   r   r   r   rM   ¦   rR   Útagr   Úset_campaignz)UPDATE items SET campaign_id=? WHERE id=?Úadd_noter$   znote body requiredÚdelete_eventÚevent_idz2DELETE FROM todo_events WHERE id=? AND type='note'Úadd_tagÚtag_type_idÚnamezname requiredÚ	parent_idÚtagsz7WHERE tag_type_id=? AND (parent_id IS ? OR parent_id=?)zoINSERT INTO tags(tag_type_id,name,parent_id,external_key,position,created_by,created_at) VALUES (?,?,?,?,?,?,?)r)   Ú
rename_tagz!UPDATE tags SET name=? WHERE id=?Ú
delete_tagzDELETE FROM tags WHERE id=?Úarchive_tagz%UPDATE tags SET archived=? WHERE id=?r   Úreorder_tagsz%UPDATE tags SET position=? WHERE id=?Úadd_tag_typeÚlabelzname and label requiredÚcolorz#888888Ú	tag_typeszdINSERT INTO tag_types(name,label,color,is_hierarchical,seeded_from,position) VALUES (?,?,?,0,NULL,?)Úadd_campaignzqINSERT INTO campaigns(name,description,due_date,status,color,created_by,created_at) VALUES (?,?,?,'active',?,?,?)Údescriptionz#aa44ffÚedit_campaignziUPDATE campaigns SET name=COALESCE(?,name), description=?, due_date=?, color=COALESCE(?,color) WHERE id=?Úset_campaign_statuszbad campaign status: z8UPDATE campaigns SET status=?, completed_at=? WHERE id=?Údelete_campaignz DELETE FROM campaigns WHERE id=?Ú
bulk_spawnc                 S   ó   g | ]}t |ƒ‘qS r   rI   rJ   r   r   r   Ú
<listcomp>  ó    zmain.<locals>.<listcomp>zat least one location requiredc                 S   rl   r   rI   rJ   r   r   r   rm     rn   Úextra_tag_idsÚcampaign_nameÚspawnedzunknown action: Úversion)'r   Úis_authenticatedÚcheck_accessr0   r   ÚosÚenvironÚgetÚ
ValueErrorÚsysÚstdinÚreadr-   ÚloadsÚJSONDecodeErrorÚsqlite3ÚconnectÚDBr   r   Ústripr!   Ú	lastrowidr'   ÚVALID_STATUSr   Ú	enumerater   ÚsetÚappendÚjoinÚlowerÚVALID_CAMPAIGN_STATUSr   ÚcommitÚ	ExceptionÚrollbackÚstrÚclose))ÚauthÚusernameÚlengthÚrawr$   r6   r%   Úresultr&   r8   r9   r:   ÚposÚcurÚtidr)   r?   rC   ÚprevÚidsÚidxÚnew_idsÚcur_idsÚaddedÚremovedrL   ÚpartsÚcidÚeidÚtype_idr[   r\   rc   rd   Úcompleted_atÚloc_tag_idsro   Úcnamerq   ÚlocÚer   r   r   Úmain=   sà  ÿþ



ý€


ÿ€





þþ
€
 ÿ

ÿ""€



ÿý


ÿ
 ÿ


þ
ÿý
&ÿý


ÿ


ÿý
ý
€þÿþr§   Ú__main__)r   r   )Ú__doc__r-   ru   r~   ry   r   r   ÚpathÚinsertÚmanagers.auth_managerr   rv   rw   r€   rƒ   r‰   r   r   r!   r'   r+   r0   r§   Ú__name__r   r   r   r   Ú<module>   s.   
  
ÿ