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.You are not allowed to attach a file to this page.