Attachment 'TaskPlanner1.8.4plusEmail.py'

Download

   1 # -*- coding: utf-8 -*-
   2 """
   3     MoinMoin - TaskPlanner Action
   4     Version 0.9
   5 
   6     A task planner plugin for Moin.
   7 
   8     General information:
   9     * The task database file "task-db" is located in the wiki's data dir and is
  10       a plain text file.
  11     * The total number of tasks is currently restricted to 999.999 tasks. However
  12       a plain text database doesn't scale very well. So try to keep the database
  13       small and do remove task not needed anymore.
  14     * Note: Removing a task from the database does also mean: deleting the task's wiki
  15       homepage.
  16     * Note: You have to be superuser to be able to remove tasks. Normal users can mark
  17       a completed task with the label "remove me" so superuser get to know which tasks to
  18       remove.
  19  
  20     @copyright: 2007 by Oliver Siemoneit
  21     @license: GNU GPL, see COPYING for details.
  22 
  23 """
  24 
  25 import os, time
  26 from MoinMoin import config, wikiutil, user
  27 from MoinMoin.Page import Page
  28 from MoinMoin.util import timefuncs
  29 from MoinMoin.mail.sendmail import sendmail
  30 
  31 
  32 def _make_unique_task_id(request):
  33     """
  34         Make unique task id
  35         
  36         @param request: request object
  37         @return: 6-digit id (string)
  38     """
  39     from random import randint
  40     databaseFile = os.path.join(request.cfg.data_dir, "task-db")
  41     if os.path.isfile(databaseFile):
  42         existing_id = task_id = 0
  43         while task_id == existing_id:
  44             task_id = "%06d" % randint(1, 999999)
  45             for line in open(databaseFile).readlines():
  46                     tmp = line.split("\t")
  47                     existing_id = tmp[0]
  48                     if existing_id == task_id:
  49                         break
  50     else:
  51        task_id = "%06d" % randint(1, 999999)
  52 
  53     return task_id
  54 
  55 
  56 def _make_local_timestamp(request):
  57     """
  58         Make a timestamp for creation/closing of task
  59 
  60         @param request: request object
  61         @return: timestamp (string)
  62     """
  63     now = time.time()
  64     user = request.user
  65 
  66     if user.valid and user.tz_offset:
  67         tz = user.tz_offset
  68         tz -= tz % 60
  69         minutes = tz / 60
  70         hours = minutes / 60
  71         minutes -= hours * 60
  72         now += tz
  73 
  74     return time.strftime("%Y.%m.%dT%H:%M:%S", timefuncs.tmtuple(now))
  75 
  76 
  77 def do_mainform(request, actname, msg=None):
  78     """
  79         Build the main form
  80 
  81         @param request: request object
  82         @param actname: actname object 
  83         @param msg: message to display
  84         @return: html form (string)
  85     """
  86     _ = request.getText
  87     ticket = wikiutil.createTicket(request)
  88     querytext = _('TaskPlanner User Interface')
  89     button1 = _('Add Task')
  90     button2 = _('Edit Task')
  91     button3 = _('Remove Task')
  92     button4 = _('Close')
  93 
  94     formhtml1 = '''
  95 <form method="post" action="">
  96 <strong>%s <br></strong>''' % querytext
  97     
  98     if msg:
  99         formhtml2 = "<br> %s <br>" % msg
 100     else:
 101         formhtml2 = ""
 102 
 103     formhtml3 = '''
 104 <br> 
 105 <input type="hidden" name="action" value="%(actname)s">
 106 <input type="hidden" name="ticket" value="%(ticket)s">
 107 <input class="buttons" type="submit" name="button_add" value="%(button1)s">
 108 <input class="buttons" type="submit" name="button_edit" value="%(button2)s"> '''  % {
 109     'actname'  : actname,
 110     'ticket'   : ticket,
 111     'button1'  : button1,
 112     'button2'  : button2, }
 113 
 114     if request.user.isSuperUser():
 115         formhtml4 = '''
 116 <input class="buttons" type="submit" name="button_remove" value="%(button3)s">''' % {
 117     'button3'  : button3, }
 118     
 119     else:
 120         formhtml4 = ""
 121 
 122     formhtml5 = '''
 123 <input class="buttons" type="submit" name="button_cancel" value="%(button4)s">
 124 </form>''' % {
 125     'button4'  : button4, }
 126     
 127     formhtml = formhtml1 + formhtml2 + formhtml3 + formhtml4 + formhtml5
 128     return formhtml
 129 
 130 
 131 def do_addform(request, actname, page, msg=None, assoc_page=None, assign=None):
 132     """
 133         Build the 'add task' form
 134         
 135         @param request: request object
 136         @param actname: actname object
 137         @param page: page object
 138         @param msg: message to display
 139         @param assoc_page: preset page association (by TaskTable macro)
 140         @param assign: preset assign (by TaskTable macro)
 141         @return: html form (string)
 142     """
 143     _ = request.getText
 144     ticket = wikiutil.createTicket(request)
 145     task_id = _make_unique_task_id(request)
 146     querytext = _('Add Task')
 147     button1 = _('Add')
 148     button2 = _('Cancel')
 149     label1 = _('Task ID')
 150     value1 = task_id 
 151     label2 = _('Created by')
 152     value2 = request.user.name
 153     label3 = _('Created on')
 154     value3 = _make_local_timestamp(request)
 155     label4 = _('Task name')
 156     value4 = ""
 157     label5 = _('Assigned to')
 158     if assign:
 159         value5 = assign.replace('%20', ' ')
 160     else:
 161         value5 = ""
 162     label6 = _('Time-frame')
 163     value6 = ""
 164     label7 = _('Priority')
 165     value7 = ""
 166     label8 = _('Status')
 167     value8 = _('to do')
 168     label9 = _('Task description')
 169     value9 = ""
 170     label10 = _('Task\'s wiki homepage')
 171     value10 = "ToDos/%s" % task_id
 172     label11 = _('Task associated with page')
 173     label12 = _('Notify assignee?')
 174     value12= "Yes"
 175     if assoc_page:
 176         value11 = assoc_page.replace('%20', ' ')
 177     else:
 178         value11 = page.page_name
 179 
 180     formhtml1 = '''
 181 <form method="post" action="">
 182 <div class="userpref">
 183 <strong>%s <br></strong>''' % querytext
 184     
 185     if msg:
 186         formhtml2 = "%s" % msg
 187     else:
 188         formhtml2 = ""
 189 
 190     formhtml3 = '''
 191 <br>
 192 <input type="hidden" name="action" value="%(actname)s">
 193 <input type="hidden" name="ticket" value="%(ticket)s">
 194 <input type="hidden" name="closed_by" value="unknown">
 195 <input type="hidden" name="closed_at" value="unknown">
 196 <table border="0">
 197     <tr>
 198         <td class="label"><label>%(label1)s</label></td>
 199         <td class="content">
 200             <input type="text" name="task_id" value="%(value1)s" size="6" readonly="readonly">
 201         </td>
 202     </tr>
 203     <tr>
 204         <td class="label"><label>%(label2)s</label></td>
 205         <td class="content">
 206             <input type="text" name="created_by" value="%(value2)s" size="36" readonly="readonly">
 207         </td>
 208     </tr>
 209     <tr>
 210         <td class="label"><label>%(label3)s</label></td>
 211         <td class="content">
 212             <input type="text" name="created_at" value="%(value3)s" size="36" readonly="readonly">
 213         </td>
 214     </tr>
 215     <tr>
 216         <td class="label"><label>%(label4)s</label></td>
 217         <td class="content">
 218             <input type="text" name="task_name" value="%(value4)s" size="36" maxlength="50">
 219         </td>
 220     </tr>
 221     <tr>
 222         <td class="label"><label>%(label5)s</label></td>
 223         <td class="content">
 224             <input type="text" name="assigned_to" value="%(value5)s" size="36" maxlength="50">
 225         </td>
 226     </tr>
 227     <tr>
 228         <td class="label"><label>%(label6)s</label></td>
 229         <td class="content">
 230             <input type="text" name="time_frame" value="%(value6)s" size="36" maxlength="20">
 231         </td>
 232     </tr>
 233     <tr>
 234         <td class="label"><label>%(label7)s</label></td>
 235         <td class="content">
 236              <select name="priority" size="1">
 237                <option selected value="">   </option>
 238                <option value="low">%(low)s</option>
 239                <option value="medium">%(medium)s</option>
 240                <option value="high">%(high)s</option>
 241                <option value="critical">%(critical)s</option>
 242              </select>
 243         </td>
 244     </tr>
 245     <tr>
 246         <td class="label"><label>%(label8)s</label></td>
 247         <td class="content">
 248              <select name="status" size="1">
 249                <option selected value="to do">%(ToDo)s</option>
 250                <option value="in progress">%(InProgress)s</option>
 251                <option value="pending">%(Pending)s</option>
 252              </select>
 253         </td>
 254     </tr>
 255     <tr>
 256         <td class="label"><label>%(label9)s</label></td>
 257         <td class="content">
 258             <input type="text" name="task_desc" value="%(value9)s" size="80" maxlength="200">
 259         </td>
 260     </tr>
 261     <tr>
 262         <td class="label"><label>%(label10)s</label></td>
 263         <td class="content">
 264             <input type="text" name="task_disc_page" value="%(value10)s" size="80" maxlength="100">
 265         </td>
 266     </tr>
 267     <tr>
 268         <td class="label"><label>%(label11)s</label></td>
 269         <td class="content">
 270             <input type="text" name="task_assoc" value="%(value11)s" size="80" maxlength="100">
 271         </td>
 272     </tr>
 273     <tr>
 274         <td class="label"><label>%(label12)s</label></td>
 275         <td class="content">
 276             <input type="checkbox" name="email_notification" value="%(value12)s">
 277         </td>
 278     </tr>
 279     <tr>
 280         <td> </td>
 281         <td>
 282         <input class="buttons" type="submit" name="button_add_a" value="%(button1)s">
 283         <input class="buttons" type="submit" name="button_back" value="%(button2)s">
 284         </td>
 285     </tr>
 286 </table>
 287 </div>
 288 </form>''' % {
 289     'actname'    : actname,
 290     'ticket'     : ticket,
 291     'label1'     : label1,
 292     'value1'     : value1,
 293     'label2'     : label2,
 294     'value2'     : value2,
 295     'label3'     : label3,
 296     'value3'     : value3,
 297     'label4'     : label4,
 298     'value4'     : value4,
 299     'label5'     : label5,
 300     'value5'     : value5,
 301     'label6'     : label6,
 302     'value6'     : value6,
 303     'label7'     : label7,
 304     'low'        : _('low'),
 305     'medium'     : _('medium'),
 306     'high'       : _('high'),
 307     'critical'   : _('critical'),
 308     'label8'     : label8,
 309     'ToDo'       : _('to do'),
 310     'Pending'    : _('pending'),
 311     'InProgress' : _('in progress'),
 312     'label9'     : label9,
 313     'value9'     : value9,
 314     'label10'    : label10,
 315     'value10'    : value10,
 316     'label11'    : label11,
 317     'value11'    : value11,
 318     'label12'	 : label12,
 319     'value12'	 : value12, 
 320     'button1'    : button1,
 321     'button2'    : button2
 322 }
 323     formhtml = formhtml1 + formhtml2 + formhtml3
 324     return formhtml
 325 
 326 
 327 def _check_form_input(request):
 328     """
 329         Check for valid input in 'add task' and 'edit task' form
 330 
 331         @param request: request object
 332         @result: result (string)
 333     """
 334     _ = request.getText
 335     task_name = request.form.get('task_name', [""])[0]
 336     task_name = task_name.strip(' ')
 337     if task_name == "":
 338         return (_('You have to specify a task name.'), "warning")
 339 
 340     assigned_to = request.form.get('assigned_to', [""])[0]
 341     assigned_to = assigned_to.strip(' ')
 342     if assigned_to == "":
 343         return (_('You have to assign the task to someone.'), "warning")
 344     else:
 345         assignee_id=user.getUserId(request, assigned_to)
 346 	if assignee_id==None:
 347 	    return (_('You can only assign the task to a user.'), "warning")
 348 
 349     time_frame = request.form.get('time_frame', [""])[0]
 350     time_frame = time_frame.strip(' ')
 351     if time_frame != "":
 352         from time import strptime
 353         try:
 354 	    time_struct=strptime(time_frame, "%d.%m.%y")
 355         except ValueError:
 356             try:
 357                 time_struct = strptime(time_frame, "%d.%m.%y %H:%M")
 358             except ValueError:
 359                 return (_('Valid time-frame formats are either dd.mm.yy or dd.mm.yy hh:mm.'),"warning")
 360     return ""
 361 
 362 
 363 def _save_task(request):
 364     """
 365         Save task data to disc
 366 
 367         @param request: request object
 368         @return: result (string)
 369     """
 370     _ = request.getText
 371     task_id = request.form.get('task_id', [""])[0]
 372     created_by = request.form.get('created_by', [""])[0]
 373     created_at = request.form.get('created_at', [""])[0]
 374     closed_by = request.form.get('closed_by', [""])[0]
 375     closed_at = request.form.get('closed_at', [""])[0]
 376     task_name = request.form.get('task_name', [""])[0]
 377     task_name = wikiutil.escape(task_name, 1)
 378     task_name = wikiutil.clean_input(task_name)
 379     assigned_to = request.form.get('assigned_to', [""])[0]
 380     assigned_to = wikiutil.escape(assigned_to, 1)
 381     assigned_to = wikiutil.clean_input(assigned_to)
 382     time_frame = request.form.get('time_frame', [""])[0]
 383     priority = request.form.get('priority', [""])[0]
 384     status = request.form.get('status', [""])[0]
 385     task_desc = request.form.get('task_desc', [""])[0]
 386     email_notification = request.form.get('email_notification',[""])[0]
 387     if task_desc != "":
 388         task_desc = wikiutil.escape(task_desc, 1)
 389         task_desc = wikiutil.clean_input(task_desc)
 390     task_disc_page = request.form.get('task_disc_page', [""])[0]
 391     if task_disc_page != "":
 392         task_disc_page = wikiutil.escape(task_disc_page, 1)
 393         task_disc_page = wikiutil.clean_input(task_disc_page)
 394     task_assoc = request.form.get('task_assoc', [""])[0]
 395     if task_assoc != "":
 396         task_assoc = wikiutil.escape(task_assoc, 1)
 397         task_assoc = wikiutil.clean_input(task_assoc)
 398             
 399     try:
 400         databaseFile = os.path.join(request.cfg.data_dir, "task-db")
 401         db = open(databaseFile,"a")
 402         db.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (task_id,
 403                                                                            created_by,
 404                                                                            created_at,
 405                                                                            closed_by,
 406                                                                            closed_at,
 407                                                                            task_name,
 408                                                                            assigned_to,
 409                                                                            time_frame,
 410                                                                            priority,
 411                                                                            status,
 412                                                                            task_desc,
 413                                                                            task_disc_page,
 414                                                                            task_assoc))
 415         db.close()
 416     except IOError:
 417         return (_('Error while trying to save task data.'), "error")
 418     if email_notification=="Yes":
 419 	#here must the notify by email function call appear
 420 	#make the email body
 421 	txtbody =u'''
 422 Hi,
 423 You have been assigned a new task.
 424 The task details are: 
 425  Created by: %(1)s
 426  Created at: %(2)s
 427  Task_name: %(3)s
 428  Finish before: %(4)s
 429  Priority: %(5)s
 430  Status: %(6)s
 431  Task description: %(7)s
 432 Have a good day!
 433 	''' % {
 434 		'1': created_by,
 435 		'2': created_at,
 436 		'3': task_name,
 437 		'4': time_frame,
 438 		'5': priority,
 439 		'6': status,
 440 		'7': task_desc,
 441 	      }
 442 	# get email address
 443 	# first make a user
 444 	assignee=user.User(request,id=user.getUserId(request, assigned_to))
 445 	# then load the data from disk so that its email adress becomes available
 446 	assignee.load_from_id()
 447 	# then we can send
 448 	sendok=sendmail(request, [assignee.email], u'New task: '+task_name, txtbody)[0]
 449 	if sendok:
 450 	    return (_('Task succesfully saved and assignee notified succesfully.'),"ok")
 451 	else:
 452 	    return (_('Task successfully saved but assignee could not be notified.'), "warning")
 453     return (_('Task successfully saved.'), "ok")  
 454 
 455 def do_edit_search_form(request, actname, msg=None):
 456     """
 457         Build the 'search task for editing' form
 458 
 459         @param request: request object
 460         @param actname: actname object
 461         @param msg: message to display
 462         @return: html form (string)
 463     """
 464     _ = request.getText
 465     ticket = wikiutil.createTicket(request)
 466     querytext = _('Edit Task')
 467     button1 = _('Edit')
 468     button2 = _('Cancel')
 469     label1 = _('Task ID')
 470     value1 = ""
 471 
 472     formhtml1 = '''
 473 <form method="post" action="">
 474 <div class="userpref">
 475 <strong>%s <br></strong>''' % querytext
 476     
 477     if msg:
 478         formhtml2 = "%s" % msg
 479     else:
 480         formhtml2 = ""
 481 
 482     formhtml3 = '''
 483 <br>
 484 <input type="hidden" name="action" value="%(actname)s">
 485 <input type="hidden" name="ticket" value="%(ticket)s">
 486 <table border="0">
 487     <tr>
 488         <td class="label"><label>%(label1)s</label></td>
 489         <td class="content">
 490             <input type="text" name="task_id" value="%(value1)s" size="6" maxlength="6">
 491         </td>
 492     </tr>
 493     <tr>
 494         <td> </td>
 495         <td>
 496         <input class="buttons" type="submit" name="button_search_id" value="%(button1)s">
 497         <input class="buttons" type="submit" name="button_back" value="%(button2)s">
 498         </td>
 499     </tr>
 500 </table>
 501 </div>
 502 </form>''' % {
 503     'actname': actname,
 504     'ticket' : ticket,
 505     'label1' : label1,
 506     'value1' : value1,
 507     'button1': button1,
 508     'button2': button2
 509 }
 510     formhtml = formhtml1 + formhtml2 + formhtml3
 511     return formhtml
 512 
 513 
 514 def do_editform(request, actname, page, task, msg=None):
 515     """
 516         Build the 'edit task' form
 517 
 518         @param request: request object
 519         @param actname: actname object
 520         @param page: page object
 521         @param task: task to edit
 522         @param msg: message to display
 523         @return: html form (string)
 524     """
 525     _ = request.getText
 526     ticket = wikiutil.createTicket(request)
 527     querytext = _('Edit Task')
 528     button1 = _('Save')
 529     button2 = _('Cancel')
 530     label1 = _('Task ID')
 531     value1 = task[0] 
 532     label2 = _('Created by')
 533     value2 = task[1]
 534     label3 = _('Created on')
 535     value3 = task[2]
 536     label4 = _('Closed by')
 537     value4 = task[3]
 538     label5 = _('Closed at')
 539     value5 = task[4]
 540     label6 = _('Task name')
 541     value6 = task[5]
 542     label7 = _('Assigned to')
 543     value7 = task[6]
 544     label8 = _('Time-frame')
 545     value8 = task[7]
 546     label9 = _('Priority')
 547     value9 = task[8]
 548     label10 = _('Status')
 549     value10 = task[9]
 550     label11 = _('Task description')
 551     value11 = task[10]
 552     label12 = _('Task\'s wiki homepage')
 553     value12 = task[11]
 554     label13 = _('Task associated with page')
 555     value13 = task[12]
 556     label14 = _('Notify assignee?')
 557     value14 ="Yes"
 558     
 559     formhtml1 = '''
 560 <form method="post" action="">
 561 <div class="userpref">
 562 <strong>%s <br></strong>''' % querytext
 563 
 564     if msg:
 565         formhtml2 = "%s" % msg
 566     else:
 567         formhtml2 = ""
 568 
 569     formhtml3 = '''
 570 <br>
 571 <input type="hidden" name="action" value="%(actname)s">
 572 <input type="hidden" name="ticket" value="%(ticket)s">
 573 <table border="0">
 574     <tr>
 575         <td class="label"><label>%(label1)s</label></td>
 576         <td class="content">
 577             <input type="text" name="task_id" value="%(value1)s" size="6" readonly="readonly">
 578         </td>
 579     </tr>
 580     <tr>
 581         <td class="label"><label>%(label2)s</label></td>
 582         <td class="content">
 583             <input type="text" name="created_by" value="%(value2)s" size="36" readonly="readonly">
 584         </td>
 585     </tr>
 586     <tr>
 587         <td class="label"><label>%(label3)s</label></td>
 588         <td class="content">
 589             <input type="text" name="created_at" value="%(value3)s" size="36" readonly="readonly">
 590         </td>
 591     </tr> ''' % {
 592         'actname': actname,
 593         'ticket' : ticket,
 594         'label1' : label1,
 595         'value1' : value1,
 596         'label2' : label2,
 597         'value2' : value2,
 598         'label3' : label3,
 599         'value3' : value3
 600 }
 601     
 602     if value4 != "unknown":
 603         formhtml4 = '''
 604    <tr>
 605         <td class="label"><label>%(label4)s</label></td>
 606         <td class="content">
 607             <input type="text" name="closed_by" value="%(value4)s" size="36" readonly="readonly">
 608         </td>
 609     </tr>
 610     <tr>
 611         <td class="label"><label>%(label5)s</label></td>
 612         <td class="content">
 613             <input type="text" name="closed_at" value="%(value5)s" size="36" readonly="readonly">
 614         </td>
 615     </tr> ''' % {
 616         'label4' : label4,
 617         'value4' : value4,
 618         'label5' : label5,
 619         'value5' : value5
 620 }
 621     else:
 622         formhtml4 = '''
 623 <input type="hidden" name="closed_by" value="%(value4)s">
 624 <input type="hidden" name="closed_at" value="%(value5)s"> ''' % {
 625     'value4' : value4,
 626     'value5' : value5
 627 }
 628 
 629     formhtml5 = '''
 630     <tr>
 631         <td class="label"><label>%(label6)s</label></td>
 632         <td class="content">
 633             <input type="text" name="task_name" value="%(value6)s" size="36" maxlength="50">
 634         </td>
 635     </tr>
 636     <tr>
 637         <td class="label"><label>%(label7)s</label></td>
 638         <td class="content">
 639             <input type="text" name="assigned_to" value="%(value7)s" size="36" maxlength="50">
 640         </td>
 641     </tr>
 642     <tr>
 643         <td class="label"><label>%(label8)s</label></td>
 644         <td class="content">
 645             <input type="text" name="time_frame" value="%(value8)s" size="36" maxlength="20">
 646         </td>
 647     </tr>
 648     <tr>
 649         <td class="label"><label>%(label9)s</label></td>
 650         <td class="content">
 651              <select name="priority" size="1"> ''' % {
 652                  'label6' : label6,
 653                  'value6' : value6,
 654                  'label7' : label7,
 655                  'value7' : value7,
 656                  'label8' : label8,
 657                  'value8' : value8,
 658                 'label9'  : label9
 659 }
 660     # ToDo: Make code more compact. Don't use if value9 = ..
 661     if value9 == "":
 662         formhtml6 = '''    
 663                    <option selected value="">   </option>
 664                    <option value="low">%(low)s</option>
 665                    <option value="medium">%(medium)s</option>
 666                    <option value="high">%(high)s</option>
 667                    <option value="critical">%(critical)s</option>
 668                  </select>''' % { 'low'      : _('low'),
 669                                   'medium'   : _('medium'),
 670                                   'high'     : _('high'),
 671                                   'critical' : _('critical') }
 672 
 673     if value9 == "low":
 674         formhtml6 = '''    
 675                    <option value="">   </option>
 676                    <option selected value="low">%(low)s</option>
 677                    <option value="medium">%(medium)s</option>
 678                    <option value="high">%(high)s</option>
 679                    <option value="critical">%(critical)s</option>
 680                  </select>''' % { 'low'      : _('low'),
 681                                   'medium'   : _('medium'),
 682                                   'high'     : _('high'),
 683                                   'critical' : _('critical') }
 684 
 685     if value9 == "medium":
 686         formhtml6 = '''    
 687                    <option value="">   </option>
 688                    <option value="low">%(low)s</option>
 689                    <option selected value="medium">%(medium)s</option>
 690                    <option value="high">%(high)s</option>
 691                    <option value="critical">%(critical)s</option>
 692                  </select>''' % { 'low'      : _('low'),
 693                                   'medium'   : _('medium'),
 694                                   'high'     : _('high'),
 695                                   'critical' : _('critical') }
 696 
 697     if value9 == "high":
 698         formhtml6 = '''    
 699                    <option value="">   </option>
 700                    <option value="low">%(low)s</option>
 701                    <option value="medium">%(medium)s</option>
 702                    <option selected value="high">%(high)s</option>
 703                    <option value="critical">%(critical)s</option>
 704                  </select>''' % { 'low'      : _('low'),
 705                                   'medium'   : _('medium'),
 706                                   'high'     : _('high'),
 707                                   'critical' : _('critical') }
 708 
 709     if value9 == "critical":
 710         formhtml6 = '''    
 711                    <option value="">   </option>
 712                    <option value="low">%(low)s</option>
 713                    <option value="medium">%(medium)s</option>
 714                    <option value="high">%(high)s</option>
 715                    <option selected value="critical">%(critical)s</option>
 716                  </select>''' % { 'low'      : _('low'),
 717                                   'medium'   : _('medium'),
 718                                   'high'     : _('high'),
 719                                   'critical' : _('critical') }
 720 
 721     formhtml7 = '''
 722         </td>
 723     </tr>
 724     <tr>
 725         <td class="label"><label>%(label10)s</label></td>
 726         <td class="content">
 727              <select name="status" size="1"> ''' % {
 728                  'label10' : label10 }
 729 
 730     # ToDo: Make code more compact. Don't use if value10 = ..
 731     if value10 == "to do":
 732         formhtml8 = '''
 733                <option selected value="to do">%(ToDo)s</option>
 734                <option value="in progress">%(InProgress)s</option>
 735                <option value="pending">%(Pending)s</option>
 736                <option value="done">%(Done)s</option>
 737                <option value="failed">%(Undone)s</option>
 738                <option value="closed">%(Closed)s</option>
 739                <option value="remove me">%(RemoveMe)s</option>''' % { 'ToDo'       : _('to do'),
 740                                                                      'InProgress' : _('in progress'),
 741                                                                      'Pending'    : _('pending'),
 742                                                                      'Done'       : _('done'),
 743                                                                      'Undone'     : _('failed'),
 744                                                                      'Closed'     : _('closed'),
 745                                                                      'RemoveMe'   : _('remove me') }
 746 
 747     if value10 == "in progress":
 748         formhtml8 = '''
 749                <option value="to do">%(ToDo)s</option>
 750                <option selected value="in progress">%(InProgress)s</option>
 751                <option value="pending">%(Pending)s</option>
 752                <option value="done">%(Done)s</option>
 753                <option value="failed">%(Undone)s</option>
 754                <option value="closed">%(Closed)s</option>
 755                <option value="remove me">%(RemoveMe)s</option>''' % { 'ToDo'       : _('to do'),
 756                                                                      'InProgress' : _('in progress'),
 757                                                                      'Pending'    : _('pending'),
 758                                                                      'Done'       : _('done'),
 759                                                                      'Undone'     : _('failed'),
 760                                                                      'Closed'     : _('closed'),
 761                                                                      'RemoveMe'   : _('remove me') }
 762 
 763     if value10 == "pending":
 764         formhtml8 = '''
 765                <option value="to do">%(ToDo)s</option>
 766                <option value="in progress">%(InProgress)s</option>
 767                <option selected value="pending">%(Pending)s</option>
 768                <option value="done">%(Done)s</option>
 769                <option value="failed">%(Undone)s</option>
 770                <option value="closed">%(Closed)s</option>
 771                <option value="remove me">%(RemoveMe)s</option>''' % { 'ToDo'       : _('to do'),
 772                                                                      'InProgress' : _('in progress'),
 773                                                                      'Pending'    : _('pending'),
 774                                                                      'Done'       : _('done'),
 775                                                                      'Undone'     : _('failed'),
 776                                                                      'Closed'     : _('closed'),
 777                                                                      'RemoveMe'   : _('remove me') }
 778 
 779     if value10 == "done":
 780         formhtml8 = '''
 781                <option value="to do">%(ToDo)s</option>
 782                <option value="in progress">%(InProgress)s</option>
 783                <option value="pending">%(Pending)s</option>
 784                <option selected value="done">%(Done)s</option>
 785                <option value="failed">%(Undone)s</option>
 786                <option value="closed">%(Closed)s</option>
 787                <option value="remove me">%(RemoveMe)s</option>''' % { 'ToDo'       : _('to do'),
 788                                                                      'InProgress' : _('in progress'),
 789                                                                      'Pending'    : _('pending'),
 790                                                                      'Done'       : _('done'),
 791                                                                      'Undone'     : _('failed'),
 792                                                                      'Closed'     : _('closed'),
 793                                                                      'RemoveMe'   : _('remove me') }
 794 
 795     if value10 == "failed":
 796         formhtml8 = '''
 797                <option value="to do">%(ToDo)s</option>
 798                <option value="in progress">%(InProgress)s</option>
 799                <option value="pending">%(Pending)s</option>
 800                <option value="done">%(Done)s</option>
 801                <option selected value="failed">%(Undone)s</option>
 802                <option value="closed">%(Closed)s</option>
 803                <option value="remove me">%(RemoveMe)s</option>''' % { 'ToDo'       : _('to do'),
 804                                                                      'InProgress' : _('in progress'),
 805                                                                      'Pending'    : _('pending'),
 806                                                                      'Done'       : _('done'),
 807                                                                      'Undone'     : _('failed'),
 808                                                                      'Closed'     : _('closed'),
 809                                                                      'RemoveMe'   : _('remove me') }
 810 
 811     if value10 == "closed":
 812         formhtml8 = '''
 813                <option value="to do">%(ToDo)s</option>
 814                <option value="in progress">%(InProgress)s</option>
 815                <option value="pending">%(Pending)s</option>
 816                <option value="done">%(Done)s</option>
 817                <option value="failed">%(Undone)s</option>
 818                <option selected value="closed">%(Closed)s</option>
 819                <option value="remove me">%(RemoveMe)s</option>''' % { 'ToDo'       : _('to do'),
 820                                                                      'InProgress' : _('in progress'),
 821                                                                      'Pending'    : _('pending'),
 822                                                                      'Done'       : _('done'),
 823                                                                      'Undone'     : _('failed'),
 824                                                                      'Closed'     : _('closed'),
 825                                                                      'RemoveMe'   : _('remove me') }
 826 
 827     if value10 == "remove me":
 828         formhtml8 = '''
 829                <option value="to do">%(ToDo)s</option>
 830                <option value="in progress">%(InProgress)s</option>
 831                <option value="pending">%(Pending)s</option>
 832                <option value="done">%(Done)s</option>
 833                <option value="failed">%(Undone)s</option>
 834                <option value="closed">%(Closed)s</option>
 835                <option selected value="remove me">%(RemoveMe)s</option>''' % { 'ToDo'       : _('to do'),
 836                                                                               'InProgress' : _('in progress'),
 837                                                                               'Pending'    : _('pending'),
 838                                                                               'Done'       : _('done'),
 839                                                                               'Undone'     : _('failed'),
 840                                                                               'Closed'     : _('closed'),
 841                                                                               'RemoveMe'   : _('remove me') }
 842 
 843     formhtml9 = '''
 844              </select>
 845         </td>
 846     </tr>
 847     <tr>
 848         <td class="label"><label>%(label11)s</label></td>
 849         <td class="content">
 850             <input type="text" name="task_desc" value="%(value11)s" size="80" maxlength="200">
 851         </td>
 852     </tr>
 853     <tr>
 854         <td class="label"><label>%(label12)s</label></td>
 855         <td class="content">
 856             <input type="text" name="task_disc_page" value="%(value12)s" size="80" maxlength="100">
 857         </td>
 858     </tr>
 859     <tr>
 860         <td class="label"><label>%(label13)s</label></td>
 861         <td class="content">
 862             <input type="text" name="task_assoc" value="%(value13)s" size="80" maxlength="100">
 863         </td>
 864     </tr>
 865     <tr>
 866         <td class="label"><label>%(label14)s</label></td>
 867         <td class="content">
 868             <input type="checkbox" name="email_notification" value="%(value14)s">
 869         </td>
 870     </tr>
 871     <tr>
 872         <td> </td>
 873         <td>
 874         <input class="buttons" type="submit" name="button_save_edit" value="%(button1)s">
 875         <input class="buttons" type="submit" name="button_back_search" value="%(button2)s">
 876         </td>
 877     </tr>
 878 </table>
 879 </div>
 880 </form>''' % {
 881     'label11' : label11,
 882     'value11' : value11,
 883     'label12' : label12,
 884     'value12' : value12,
 885     'label13' : label13,
 886     'value13' : value13,
 887     'label14' : label14,
 888     'value14' : value14,
 889     'button1' : button1,
 890     'button2' : button2
 891 }
 892     formhtml = formhtml1 + formhtml2 + formhtml3 + formhtml4 + formhtml5 + formhtml6 + formhtml7 + formhtml8 + formhtml9
 893     return formhtml
 894 
 895 
 896 def _save_changed_task(request, page):
 897     """
 898         Save changed task data to disc
 899 
 900         @param request: request object
 901         @param page: page object
 902         @return: result (string)
 903 
 904     """
 905     _ = request.getText
 906     task_id = request.form.get('task_id', [""])[0]
 907     created_by = request.form.get('created_by', [""])[0]
 908     created_at = request.form.get('created_at', [""])[0]
 909     closed_by = request.form.get('closed_by', [""])[0]
 910     closed_at = request.form.get('closed_at', [""])[0]
 911     task_name = request.form.get('task_name', [""])[0]
 912     task_name = wikiutil.escape(task_name, 1)
 913     task_name = wikiutil.clean_input(task_name)
 914     assigned_to = request.form.get('assigned_to', [""])[0]
 915     assigned_to = wikiutil.escape(assigned_to, 1)
 916     assigned_to = wikiutil.clean_input(assigned_to)
 917     time_frame = request.form.get('time_frame', [""])[0]
 918     priority = request.form.get('priority', [""])[0]
 919     status = request.form.get('status', [""])[0]
 920     task_desc = request.form.get('task_desc', [""])[0]
 921     email_notification = request.form.get('email_notification', [""])[0]
 922     if task_desc != "":
 923         task_desc = wikiutil.escape(task_desc, 1)
 924         task_desc = wikiutil.clean_input(task_desc)
 925     task_disc_page = request.form.get('task_disc_page', [""])[0]
 926     if task_disc_page != "":
 927         task_disc_page = wikiutil.escape(task_disc_page, 1)
 928         task_disc_page = wikiutil.clean_input(task_disc_page)
 929     task_assoc = request.form.get('task_assoc', [""])[0]
 930     if task_assoc != "":
 931         task_assoc = wikiutil.escape(task_assoc, 1)
 932         task_assoc = wikiutil.clean_input(task_assoc)
 933         
 934     databaseFile = os.path.join(request.cfg.data_dir, "task-db")
 935     try:
 936         db = open(databaseFile,"r")
 937         taskdata = db.readlines()
 938         db.close()  
 939     except IOError:
 940         return (_('Error while trying to read task data.'), "error")
 941 
 942     new_taskdata = []    
 943     for line in taskdata:
 944         tmp = line.split("\t")
 945         if tmp[0] == task_id:
 946             # task closed
 947             if (status == "closed" or status == "remove me") and (tmp[9] != "closed" or tmp[9] != "remove me"):
 948                 tmp[3] = request.user.name
 949                 tmp[4] = _make_local_timestamp(request)
 950             # task reopend
 951             if status in ["to do", "in progress", "pending", "done", "failed"] and (tmp[9] == "closed" or tmp[9] == "remove me"):
 952                 tmp[3] = "unknown"
 953                 tmp[4] = "unknown"
 954             tmp[5] = task_name
 955             tmp[6] = assigned_to
 956             tmp[7] = time_frame
 957             tmp[8] = priority
 958             tmp[9] = status
 959             tmp[10] = task_desc
 960             tmp[11] = task_disc_page
 961             tmp[12] = task_assoc
 962             newline = "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (tmp[0],
 963                                                                                 tmp[1],
 964                                                                                 tmp[2],
 965                                                                                 tmp[3],
 966                                                                                 tmp[4],
 967                                                                                 tmp[5],
 968                                                                                 tmp[6],
 969                                                                                 tmp[7],
 970                                                                                 tmp[8],
 971                                                                                 tmp[9],
 972                                                                                 tmp[10],
 973                                                                                 tmp[11],
 974                                                                                 tmp[12])
 975             new_taskdata += newline
 976         else:
 977             new_taskdata += line
 978             
 979     try:
 980         db = open(databaseFile,"w")
 981         db.writelines(new_taskdata)
 982         db.close()    
 983     except IOError:
 984         return (_('Error while trying to save task data.'),"error")
 985     if email_notification=="Yes":
 986 	#here must the notify by email function call appear
 987 	#make the email body
 988 	txtbody =u'''
 989 Hi,
 990 A task previously assigned to you has been modified.
 991 The new task details are: 
 992  Created by: %(1)s
 993  Created at: %(2)s
 994  Task_name: %(3)s
 995  Finish before: %(4)s
 996  Priority: %(5)s
 997  Status: %(6)s
 998  Task description: %(7)s
 999 Have a good day!
1000 	''' % {
1001 		'1': created_by,
1002 		'2': created_at,
1003 		'3': task_name,
1004 		'4': time_frame,
1005 		'5': priority,
1006 		'6': status,
1007 		'7': task_desc,
1008 	      }
1009 	# get email address
1010 	# first make a user
1011 	assignee=user.User(request,id=user.getUserId(request, assigned_to))
1012 	# then load the data from disk so that its email adress becomes available
1013 	assignee.load_from_id()
1014 	# then we can send
1015 	sendok=sendmail(request, [assignee.email], u'Modified task: '+task_name, txtbody)[0]
1016 	if sendok:
1017 	    return (_('Task succesfully saved and assignee notified succesfully.'),"ok")
1018 	else:
1019 	    return (_('Task successfully saved but assignee could not be notified.'), "warning")
1020    
1021     return (_('Task successfully saved.'),"ok")
1022 
1023 
1024 def do_removeform(request, actname, msg=None):
1025     """
1026         Build the 'remove task' form
1027 
1028         @param request: request object
1029         @param actname: actname object
1030         @param msg: message to display
1031         @return: html form (string)
1032     """
1033     _ = request.getText
1034     ticket = wikiutil.createTicket(request)
1035     querytext = _('Remove Task')
1036     button1 = _('Remove')
1037     button2 = _('Cancel')
1038     label1 = _('Task ID')
1039     value1 = ""
1040 
1041     formhtml1 = '''
1042 <form method="post" action="">
1043 <div class="userpref">
1044 <strong>%s <br></strong>''' % querytext
1045     
1046     if msg:
1047         formhtml2 = "%s" % msg
1048     else:
1049         formhtml2 = ""
1050 
1051     formhtml3 = '''
1052 <br>
1053 <input type="hidden" name="action" value="%(actname)s">
1054 <input type="hidden" name="ticket" value="%(ticket)s">
1055 <table border="0">
1056     <tr>
1057         <td class="label"><label>%(label1)s</label></td>
1058         <td class="content">
1059             <input type="text" name="task_id" value="%(value1)s" size="6" maxlength="6">
1060         </td>
1061     </tr>
1062     <tr>
1063         <td> </td>
1064         <td>
1065         <input class="buttons" type="submit" name="button_remove_id" value="%(button1)s">
1066         <input class="buttons" type="submit" name="button_back" value="%(button2)s">
1067         </td>
1068     </tr>
1069 </table>
1070 </div>
1071 </form>''' % {
1072     'actname': actname,
1073     'ticket' : ticket,
1074     'label1' : label1,
1075     'value1' : value1,
1076     'button1': button1,
1077     'button2': button2
1078 }
1079     formhtml = formhtml1 + formhtml2 + formhtml3
1080     return formhtml
1081 
1082 
1083 def _remove_task(request, task_to_remove=None):
1084     """
1085         Remove task from database
1086 
1087         @param request: request object
1088         @param task_to_remove: id of task to remove
1089         @return: tuple result, message (bool, string)
1090     """
1091     _ = request.getText
1092     if task_to_remove == None:
1093         task_id = request.form['task_id'][0]
1094     else:
1095         task_id = task_to_remove
1096     databaseFile = os.path.join(request.cfg.data_dir, "task-db")
1097     if os.path.isfile(databaseFile):
1098         try:
1099             db = open(databaseFile, "r")
1100             database = db.readlines()
1101             db.close()
1102         except:
1103             return (False, (_('Error while trying to remove task from database.'), "error"))
1104         found = False
1105         task_homepage = ""
1106         new_database = []
1107         for line in database:
1108             tmp = line.split("\t")
1109             if tmp[0] == task_id:
1110                 found = True
1111                 task_homepage = tmp[11]
1112             else:
1113                 new_database += line
1114 
1115         if found == True:
1116             try:
1117                 db = open(databaseFile, "w")
1118                 db.writelines(new_database)
1119                 db.close()
1120             except:
1121                 return (False, (_('Error while trying to remove task from database.'), "error"))
1122             if Page(request, task_homepage).exists():
1123                 if request.user.may.delete(task_homepage):
1124                     page = PageEditor(request, task_homepage, do_editor_backup=0)
1125                     success, msg = page.deletePage()
1126                     if success:
1127                         return (True, (_("Task and task's wiki homepage successfully removed."),"ok"))
1128                     else:
1129                         return (True, (_("Task successfully removed from database. Error while trying to delete task's wiki homepage."),"warning"))
1130                 else:
1131                     return (True, (_("Task successfully removed from database. Error while trying to delete task's wiki homepage: You are not allowed to delete this page."),"warning"))
1132             return (True, (_('Task successfully removed.'),"ok"))
1133         else:
1134             return (False, (_('Task not found.'),"error"))
1135     else:
1136         return (False, (_('Database not found.'),"error"))
1137     
1138 
1139 def execute(pagename, request):
1140     _ = request.getText
1141     actname = __name__.split('.')[-1]
1142     page = Page(request, pagename)
1143 
1144     # check whether user is logged in
1145     if request.user.valid == 0:
1146 #        return page.send_page(msg=_('Please log in first.'))
1147 	request.theme.add_msg(_('Please log in first.'),'error')
1148         return page.send_page()
1149     
1150     # ckeck whether action is allowed
1151     if actname in request.cfg.actions_excluded:
1152 #        return page.send_page(msg=_('You are not allowed to perform this action.'))
1153 	request.theme.add_msg(_('You are not allowed to perform this action.'),"warning")
1154         return page.send_page()
1155 
1156     # check whether page does really exist
1157     if not page.exists():
1158 #        return page.send_page(msg=_('This page is already deleted or was never created!'))
1159 	request.theme.add_msg(_('This page is already deleted or was never created!'),"error")
1160         return page.send_page()
1161 
1162     #
1163     # 'add task' called from outside by the macro via "?action=TaskPlanner&add" (currently not used)
1164     #
1165     if request.form.has_key('action') and request.form.has_key('add'):
1166         # check whether this is a valid request (make outside
1167         # attacks harder by requiring two full HTTP transactions)
1168         if not request.form.has_key('ticket'):
1169 #            return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1170 #	    msg=_('Please use the interactive user interface for adding, editing and removing tasks.')
1171 	    request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1172 	    return page.send_page()
1173 
1174         if not wikiutil.checkTicket(request, request.form['ticket'][0]):
1175 #            return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1176 	    request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1177 	    return page.send_page()
1178         
1179         if request.form.has_key('button_back'):
1180             return page.send_page()
1181 
1182         # check whether TaskTable macro has forwarded information on page and assign
1183         assoc_page = assign = None
1184         if request.form.has_key('page'):
1185             assoc_page = request.form.get('page', [None])[0]
1186         if request.form.has_key('assign'):
1187             assign = request.form.get('assign', [None])[0]
1188 
1189         if request.form.has_key('button_add_a'):
1190             result = _check_form_input(request)
1191             if result =="":
1192                 result = _save_task(request)
1193  #               return page.send_page(msg=result)        
1194 		request.theme.add_msg(*result)
1195 		return page.send_page()
1196             else:  
1197 #                return page.send_page(msg=do_addform(request, actname, page, msg=result, assoc_page=assoc_page, assign=assign))
1198 		request.theme.add_msg(_(do_addform(request, actname, page, msg=result[0], assoc_page=assoc_page, assign=assign)),result[1])
1199 		return page.send_page()
1200 
1201 #        return page.send_page(msg=do_addform(request, actname, page, assoc_page=assoc_page, assign=assign))
1202 	request.theme.add_msg(_(do_addform(request, actname, page, assoc_page=assoc_page, assign=assign)))
1203 	return page.send_page()
1204 
1205     #
1206     # 'edit task' called from outside by the macro via "?action=TaskPlanner&edit=[task_id]"
1207     #
1208     elif request.form.has_key('action') and request.form.has_key('edit'):
1209         # check whether this is a valid request (make outside
1210         # attacks harder by requiring two full HTTP transactions)
1211         if not request.form.has_key('ticket'):
1212 #            return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1213 	    request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1214 	    return page.send_page()
1215 
1216         if not wikiutil.checkTicket(request, request.form['ticket'][0]):
1217 #            return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1218 	    request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1219 	    return page.send_page()
1220         
1221         if request.form.has_key('button_back_search'):
1222             return page.send_page()
1223 
1224         task_id = request.form.get('edit', [""])[0]
1225         databaseFile = os.path.join(request.cfg.data_dir, "task-db")
1226         if os.path.isfile(databaseFile):
1227             existing_id = 0
1228             found = False
1229             for line in open(databaseFile).readlines():
1230                 tmp = line.split("\t")
1231                 existing_id = tmp[0]
1232                 if existing_id == task_id:
1233                     found = True
1234                     break
1235         else:
1236 #            return page.send_page(msg=_('/!\\ Database not found. '))
1237 	    request.theme.add_msg(_('Database not found. '),"error")
1238 	    return page.send_page()
1239 
1240         if request.form.has_key('button_save_edit'):
1241             result = _check_form_input(request)
1242             if result =="":
1243                 result = _save_changed_task(request, page)
1244 #                return page.send_page(msg=result)
1245 		request.theme.add_msg(*result)
1246 		return page.send_page()
1247             else:
1248 #                return page.send_page(msg=do_editform(request, actname, page, tmp, msg=result))
1249 		request.theme.add_msg(do_editform(request, actname, page, tmp, msg=result[0]))
1250 		return page.send_page()
1251 
1252         if found == True:
1253 #            return page.send_page(msg=do_editform(request, actname, page, tmp))
1254 	    request.theme.add_msg(_(do_editform(request, actname, page, tmp)))
1255 	    return page.send_page()
1256 
1257         else:
1258 	    #return page.send_page(msg=_('/!\\ Task not found. '))
1259 	    request.theme.add_msg(_('Task not found. '),"error")
1260 	    return page.send_page()
1261 
1262     #
1263     # 'remove task' called from outside by the macro via "?action=TaskPlanner&remove=[task_id]"
1264     #
1265     elif request.form.has_key('action') and request.form.has_key('remove'):
1266         # check whether this is a valid request (make outside
1267         # attacks harder by requiring two full HTTP transactions)
1268         if not request.form.has_key('ticket'):
1269             #return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1270 	    request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1271 	    return page.send_page()
1272 
1273         if not wikiutil.checkTicket(request, request.form['ticket'][0]):
1274            #return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1275 	   request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1276 	   return page.send_page()
1277 
1278         if not request.user.isSuperUser():
1279             # return page.send_page(msg=_('You have to be superuser to remove items from the task list database.'))
1280 	    request.theme.add_msg(_('You have to be superuser to remove items from the task list database.'),"warning")
1281 	    return page.send_page()
1282         
1283         task_id = request.form.get('remove', [""])[0]
1284         success, msg = _remove_task(request, task_id)
1285         # return page.send_page(msg=msg)
1286 	request.theme.add_msg(*msg)
1287 	return page.send_page()
1288 
1289     #
1290     # Event handling for TaskPlanner user interface
1291     #
1292     elif request.form.has_key('action') and request.form.has_key('ticket'):
1293         # check whether ticket is valid (make outside attacks harder
1294         # by requiring two full HTTP transactions)
1295         if not request.form.has_key('ticket'):
1296             #return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1297 	    request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1298 	    return page.send_page()
1299 
1300         if not wikiutil.checkTicket(request, request.form['ticket'][0]):
1301             # return page.send_page(msg=_('Please use the interactive user interface for adding, editing and removing tasks.'))
1302 	    request.theme.add_msg(_('Please use the interactive user interface for adding, editing and removing tasks.'),"warning")
1303 	    return page.send_page()
1304         #
1305         # 'add task' stuff
1306         #
1307         
1308         # check whether TaskTable macro has forwarded information on page and assign
1309         assoc_page = assign = None
1310         if request.form.has_key('page'):
1311             assoc_page = request.form.get('page', [None])[0]
1312         if request.form.has_key('assign'):
1313             assign = request.form.get('assign', [None])[0]
1314 
1315         # display menu for adding tasks
1316         if request.form.has_key('button_add'):
1317             #return page.send_page(msg=do_addform(request, actname, page, assoc_page=assoc_page, assign=assign))
1318     	    request.theme.add_msg(do_addform(request, actname, page, assoc_page=assoc_page, assign=assign))
1319 	    return page.send_page()
1320 
1321         # user pressed button 'add task'
1322         if request.form.has_key('button_add_a'):
1323             result = _check_form_input(request)
1324             if result != "":
1325                 #return page.send_page(msg=do_addform(request, actname, page, msg=result, assoc_page=assoc_page, assign=assign))
1326 		request.theme.add_msg(_(do_addform(request, actname, page, msg=result[0], assoc_page=assoc_page, assign=assign)),result[1])
1327 		return page.send_page()
1328             else:
1329                 result = _save_task(request)
1330                 # return page.send_page(msg=do_mainform(request, actname, msg=result))
1331 		request.theme.add_msg(_(do_mainform(request, actname, msg=result[0])),result[1])
1332 		return page.send_page()
1333 
1334         #
1335         # 'edit task' stuff
1336         #
1337 
1338         # display menu for searching task to edit
1339         if request.form.has_key('button_edit'):
1340             # return page.send_page(msg=do_edit_search_form(request, actname))
1341 	    request.theme.add_msg(_(do_edit_search_form(request, actname)))
1342 	    return page.send_page()
1343 
1344         # user pressed button 'edit task' in the search task form
1345         if request.form.has_key('button_search_id'):
1346             task_id = request.form['task_id'][0]
1347             databaseFile = os.path.join(request.cfg.data_dir, "task-db")
1348             if os.path.isfile(databaseFile):
1349                 existing_id = 0
1350                 found = False
1351                 for line in open(databaseFile).readlines():
1352                     tmp = line.split("\t")
1353                     existing_id = tmp[0]
1354                     if existing_id == task_id:
1355                         found = True
1356                         break
1357             else:
1358                 # return page.send_page(msg=do_edit_search_form(request, actname, msg=_('/!\\ Database not found. '))) 
1359 		request.theme.add_msg(_('Database not found. '),"error")
1360 		return page.send_page()
1361 
1362             if found == True:
1363                 # return page.send_page(msg=do_editform(request, actname, page, tmp))
1364 		request.theme.add_msg(do_editform(request, actname, page, tmp))
1365 		return page.send_page()
1366             else:
1367                 # return page.send_page(msg=do_edit_search_form(request, actname, msg=_('/!\\ Task not found. ')))
1368 		request.theme.add_msg(_('Task not found. '),"warning")
1369 		return page.send_page()
1370 
1371         # user pressed button 'save edited' task
1372         if request.form.has_key('button_save_edit'):
1373             result = _check_form_input(request)
1374             # if we have invalid input, reload task data and display edit form again
1375             if result != "":
1376                 task_id = request.form['task_id'][0]
1377                 databaseFile = os.path.join(request.cfg.data_dir, "task-db")
1378                 if os.path.isfile(databaseFile):
1379                     existing_id = 0
1380                     found = False
1381                     for line in open(databaseFile).readlines():
1382                         tmp = line.split("\t")
1383                         existing_id = tmp[0]
1384                         if existing_id == task_id:
1385                             found = True
1386                             break
1387                 else:
1388                     #return page.send_page(msg=do_edit_search_form(request, actname, msg=_('/!\\ Database not found. '))) 
1389 		    request.theme.add_msg(_('Database not found. '),"error")
1390 		    return page.send_page()
1391                 # return page.send_page(msg=do_editform(request, actname, page, tmp, msg=result))
1392 		request.theme.add_msg(do_editform(request, actname, page, tmp, msg=result[0]),result[1])
1393 		return page.send_page()
1394 
1395             else:
1396                 result = _save_changed_task(request, page)
1397                 # return page.send_page(msg=do_mainform(request, actname, msg=result))
1398 		request.theme.add_msg(do_mainform(request, actname, msg=result[0]),result[1])
1399 		return page.send_page()
1400             
1401         # user pressed button cancel editing task
1402         if request.form.has_key('button_back_search'):
1403             # return page.send_page(msg=do_mainform(request, actname))
1404 	    request.theme.add_msg(do_mainform(request, actname))
1405 	    return page.send_page()
1406             
1407         #
1408         # 'remove task' stuff
1409         #
1410 
1411         # display menu for removing tasks
1412         if request.form.has_key('button_remove'):
1413             if not request.user.isSuperUser():
1414                 # return page.send_page(msg=do_mainform(request, actname, msg=_('You have to be superuser to remove items from the task list database.')))
1415 		request.theme.add_msg(do_mainform(request, actname, msg=_('You have to be superuser to remove items from the task list database.')),"warning")
1416 		return page.send_page()
1417             # return page.send_page(msg=do_removeform(request, actname))
1418 	    request.theme.add_msg(do_removeform(request, actname))
1419 	    return page.send_page()
1420 	    
1421 	    
1422 
1423         # user pressed button 'remove task'
1424         if request.form.has_key('button_remove_id'):
1425             if not request.user.isSuperUser():
1426                 # return page.send_page(msg=do_mainform(request, actname, msg= _('You have to be superuser to remove items from the task list database.')))
1427 		request.theme.add_msg(do_mainform(request, actname, msg= _('You have to be superuser to remove items from the task list database.')),"warning")
1428 		return page.send_page()
1429             
1430             success, msg = _remove_task(request)
1431             if success:
1432                 # return page.send_page(msg=do_mainform(request, actname, msg=msg))
1433 		request.theme.add_msg(do_mainform(request, actname, msg=msg[0]),msg[1])
1434 		return page.send_page()
1435             else:
1436                 #return page.send_page(msg=do_removeform(request, actname, msg=msg))
1437 		request.theme.add_msg(do_removeform(request, actname, msg=msg[0]),msg[1])
1438 		return page.send_page()
1439 
1440         # user pressed button 'cancel' in the main form
1441         if request.form.has_key('button_cancel'):
1442             return page.send_page()                
1443 
1444     # either no button was pressed (i.e. just display TaskPlanner user interface after calling the action
1445     # or 'button_back' was pressed (then show main form again)
1446     # return page.send_page(msg=do_mainform(request, actname))
1447     request.theme.add_msg(do_mainform(request, actname))
1448     return page.send_page()    

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2006-12-29 15:02:33, 14.7 KB) [[attachment:AttachTable.py]]
  • [get | view] (2009-08-11 07:04:46, 53.6 KB) [[attachment:TaskPlanner-1.8.4.py]]
  • [get | view] (2010-01-23 14:17:02, 52.7 KB) [[attachment:TaskPlanner-1.9.1.py]]
  • [get | view] (2007-04-14 15:35:39, 49.1 KB) [[attachment:TaskPlanner.py]]
  • [get | view] (2007-02-01 07:00:31, 243.0 KB) [[attachment:TaskPlanner.zip]]
  • [get | view] (2009-08-11 07:05:54, 56.5 KB) [[attachment:TaskPlanner1.8.4plusEmail.py]]
  • [get | view] (2006-12-29 19:46:46, 146.4 KB) [[attachment:TaskPlannerAttachTableIcons.zip]]
  • [get | view] (2007-08-24 20:11:02, 244.6 KB) [[attachment:TaskPlanner_LlubNek.zip]]
  • [get | view] (2007-04-02 14:42:44, 15.3 KB) [[attachment:TaskTable.py]]
  • [get | view] (2006-12-29 19:45:58, 66.9 KB) [[attachment:__init__.py]]
  • [get | view] (2006-12-29 19:45:29, 5.0 KB) [[attachment:_init_.diff]]
  • [get | view] (2006-12-26 16:49:56, 63.8 KB) [[attachment:addtask.jpg]]
  • [get | view] (2007-01-01 22:27:54, 3.8 KB) [[attachment:classic_theme.jpg]]
  • [get | view] (2008-05-07 16:42:25, 201.5 KB) [[attachment:clickingerror.jpg]]
  • [get | view] (2006-12-26 16:55:30, 9.7 KB) [[attachment:common.css]]
  • [get | view] (2006-12-26 16:55:03, 1.1 KB) [[attachment:common.diff]]
  • [get | view] (2007-01-01 22:27:36, 13.8 KB) [[attachment:common_icons.jpg]]
  • [get | view] (2006-12-26 16:53:07, 3.1 KB) [[attachment:de.AttachTable.po]]
  • [get | view] (2006-12-26 16:52:44, 7.4 KB) [[attachment:de.TaskPlanner.po]]
  • [get | view] (2006-12-26 16:50:48, 72.5 KB) [[attachment:imagepreview.jpg]]
  • [get | view] (2006-12-26 16:50:21, 78.2 KB) [[attachment:tasktable.jpg]]
  • [get | view] (2008-05-07 16:42:29, 8.4 KB) [[attachment:traceback_taskplanner.html]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.