Forum OpenACS Development: OpenACS + Voo2do
Voo2do (http://www.voo2do.com/) is an advanced (and very simple) task manager. It has an API (voo2do.com/help/api) to use through other systems. I'm using voo2do since some months ago to control tasks and hours. I also used OACS logger, it's great but with a team, not for only one person.
Also, I use OACS calendar as day-calendar. So I did some glue to put in my day-cal-view my task-list from voodo and a form to add a new task. I did:
-An adp page to include whatever package (I use it in OACS Calendar cal-day-view)
-A TCL page to do programming things (call API and stuff like that)
but, I have some things to solve:
-Control User/Password. Now I have it only for my user. I have to solve how to pass user/passwd for every user
-Control last call to API, now, I have to use Back Key.
I'm trying to solve this, perhaps next month, but I'd like to show this code because it has been very useful to me.
-----------------Code------------------
-------------view-voo2do-tasks.adp-----
<div class="cal-month-title-text" style="font-size: 80%">
Tareas Pendientes
</div>
<div class="cal-day-table">
<multiple name="lista_tareas">
<div class="cal-day-row">
<div class="cal-day-hour">
<if @lista_tareas.pretty_deadline@ not nil>
<span class="cal-text-grey-sml"> @lista_tareas.pretty_deadline@</span>
</if>
<else>
<span class="cal-text-grey-sml">No date</span>
</else>
@lista_tareas.task@ <span class="cal-text-grey-sml">
<if @lista_tareas.working_time@ not nil><b> @lista_tareas.working_time@</b> </if>
<else><b>0</b>
</else>
/ @lista_tareas.total_time@ (<a href="http://voo2do.com/api/saveTask?userId=@userID@&loginHash=@loginHash@&completed=1&taskId=@lista_tareas.id@&taskDesc=@lista_tareas.task@&projName=@lista_tareas.projName@&estOrig=@lista_tareas.total_time@&elapsed=@lista_tareas.total_time@&deadline=@lista_tareas.deadline@&priority=@lista_tareas.priority@">Fin</a>)</span>
</div>
</div>
</multiple>
</div>
<div class="cal-month-title-text" style="font-size: 80%">
Nueva Tarea
</div>
<div class="cal-day-table">
<formtemplate id="ejemplo_form"></formtemplate>
</div>
-------------view-voo2do-tasks.tcl-----
#Get XML data and if there is an error, put an Error Task in xml variable
set xml [ns_httpget "http://voo2do.com/api/getLoginHash?email=YOUREMAIL&password=YOURPASSWD"]
set doc [dom parse $xml]
set root [$doc documentElement]
set node [$root selectNodes /response/login]
set userID [$node getAttribute userId]
set loginHash [$node getAttribute loginHash]
set xml [ns_httpget "http://voo2do.com/api/getIncompleteTasks?userId=$userID&loginHash=$loginHash"]
if {$xml == ""} {
set xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<response method=\"getIncompleteTasks\">
<task estCurr=\"1.0000\" priority=\"4.0000\" dtcreated=\"2006-09-07 19:05:33.837469\" taskdesc=\"Error en la conexion\" taskId=\"00\" estOrig=\"1.0000\" collabId=\"\" userId=\"33\" deadline=\"\" active=\"1\" elapsed=\"1.0000\" projId=\"4\" projName=\"Formacin\" viewId=\"\" completed=\"\"/>
</response>
"
}
#Parse XML Data of getIncompleteTask Voo2do Method
set doc [dom parse $xml]
set root [$doc documentElement]
set node [$root selectNodes /response/task]
#Multirow create of data. I trim 0s and . (point) to show clearly data
template::multirow create lista_tareas "id" "task" "priority" "total_time" "working_time" "projName" "deadline" "pretty_deadline"
foreach i $node {
template::multirow append \
lista_tareas [$i getAttribute taskId] \
[$i getAttribute taskdesc] \
[$i getAttribute priority] \
[string trimright [$i getAttribute estCurr] "0."] \
[string trimright [$i getAttribute elapsed] "0."] \
[$i getAttribute projName] \
[lc_time_fmt [$i getAttribute deadline] "%m/%d/%Y"] \
[lc_time_fmt [$i getAttribute deadline] "%d %b"]
}
############# Defining form to Add New Task #########################
#Get Project names
set xml [ns_httpget "http://voo2do.com/api/getProjects?userId=$userID&loginHash=$loginHash"]
set doc [dom parse $xml]
set root [$doc documentElement]
set node [$root selectNodes /response/project]
#Creating Project Names options
set project_names [list]
foreach project $node {
set pr [$project getAttribute projName]
lappend project_names [ list $pr $pr ]
}
#Creating estimation options
set estimations { "0.5" "1" "1.5" "2" "3" "4" }
set estimation_options [list]
foreach p $estimations {
lappend estimation_options [list $p $p ]
}
#Creating priorities options
set priorities { "1" "2" "3" }
set priority_options [list]
foreach p $priorities {
lappend priority_options [list $p $p ]
}
# Define Task Add form
ad_form -name ejemplo_form -method GET -action "http://voo2do.com/api/saveTask" -form {
{userId:text(hidden) {value "$userID"} }
{loginHash:text(hidden) {value "$loginHash"} }
{taskdesc:text(text)
{label "Tarea"}
{html {size 35} maxlength 255}
}
{projName:text(select)
{label "Proyecto"}
{options $project_names}
}
{priority:text(select)
{label "Prioridad"}
{options $priority_options}
}
{estOrig:text(select)
{label "Estimacion"}
{options $estimation_options}
}
{deadline:date(text)
{label "Plazo"}
{html {id sel1} }
{help_text "Format MM/DD/YYYY"}
{after_html {<input type='reset' value=' ... ' onclick=\"return showCalendar('sel1');\"> }
}
}
}
#regexp {([0-9]+)-([0-9][0-9])-([0-9][0-9])} $deadline match year month day
#set deadline ""
#append deadline $month "/" $day "/" $year
ad_form -extend -name ejemplo_form -form {
{submit:text(submit)
{label "Crear"}
}
}
- highlight dates that passed headlines
- voo2do user control
All this development is on two files: view-voo2do-tasks.adp and view-voo2do-tasks.tcl