← Back to team overview

openerp-dev-web team mailing list archive

lp:~openerp-dev/openobject-addons/addons-training-exam-processing-ysa into lp:~openobject-training/openobject-addons/training_with_history

 

Yogesh(Open ERP) has proposed merging lp:~openerp-dev/openobject-addons/addons-training-exam-processing-ysa into lp:~openobject-training/openobject-addons/training_with_history.

Requested reviews:
  OpenObject Training (openobject-training)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/addons-training-exam-processing-ysa/+merge/54347

training_exam_process :- convert into version 6.0
document_scan :- menu reference id change in view xml file.
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/addons-training-exam-processing-ysa/+merge/54347
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-addons/addons-training-exam-processing-ysa.
=== modified file 'document_scan/view.xml'
--- document_scan/view.xml	2011-03-18 10:08:17 +0000
+++ document_scan/view.xml	2011-03-22 13:39:51 +0000
@@ -66,7 +66,7 @@
     </record>
 
     <menuitem id="document_scanning_device_menu"
-            parent="document.menu_document_configuration"
+            parent="knowledge.menu_document_configuration"
             action="document_scanning_device_act"/>
 
     <record model="ir.ui.view" id="document_scanning_action_form">
@@ -105,7 +105,7 @@
     </record>
 
     <menuitem id="document_scanning_action_menu"
-            parent="document.menu_document_configuration"
+            parent="knowledge.menu_document_configuration"
             action="document_scanning_action_act"/>
 
     <record id="view_document_scanning_rename_tree" model="ir.ui.view">
@@ -121,7 +121,7 @@
         </tree>
         </field>
     </record>
-    
+
     <record id="view_document_scanning_rename_form" model="ir.ui.view">
         <field name="name">document.scanning.rename.form</field>
         <field name="model">document.scanning.rename</field>
@@ -132,7 +132,7 @@
             <field name="res_model" select="1" colspan="4"/>
             <field name="rename_cond"/>
             <field name="rename_pattern"/>
-            <label colspan="4">Available pattern variable are:
+            <label colspan="4" string="Available pattern variable are:
 - res_model: The model attached (ex: res.partner)
 - res_id: The resource id (ex: 1)
 - page_num: The document page number
@@ -140,12 +140,11 @@
 - doctype: The document type (is a string, '0': standard, '1': annex, '2': skip this document)
 - ext: The file extension
 - obj_name: The orignal object file name
-- obj_id: The original object id (attachement id)
-            </label>
+- obj_id: The original object id (attachement id)"/>
         </form>
         </field>
     </record>
-    
+
     <record model="ir.actions.act_window" id="act_open_document_scanning_rename_view">
         <field name="name">Document Scanning Rename</field>
         <field name="type">ir.actions.act_window</field>
@@ -155,9 +154,9 @@
         <field name="domain">[]</field>
         <field name="context">{}</field>
     </record>
-    
+
     <menuitem id="menu_document_scanning_rename"
-        parent="document.menu_document_configuration"
+        parent="knowledge.menu_document_configuration"
         action="act_open_document_scanning_rename_view"/>
 
   </data>

=== modified file 'training_exam_processing/__init__.py'
--- training_exam_processing/__init__.py	2010-08-04 19:42:34 +0000
+++ training_exam_processing/__init__.py	2011-03-22 13:39:51 +0000
@@ -20,7 +20,7 @@
 #
 ##############################################################################
 
-import code
+import training_exam_processing
 import report
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== renamed file 'training_exam_processing/__terp__.py' => 'training_exam_processing/__openerp__.py'
--- training_exam_processing/__terp__.py	2011-02-25 12:33:02 +0000
+++ training_exam_processing/__openerp__.py	2011-03-22 13:39:51 +0000
@@ -39,11 +39,11 @@
     'update_xml' : [
         'security/groups.xml',
         'security/ir.model.access.csv',
-        'sequence.xml',
-        'workflow.xml',
-        'view.xml',
-        'data.xml',
-        'reports.xml',
+        'training_exam_processing_sequence.xml',
+        'training_exam_processing_workflow.xml',
+        'training_exam_processing_view.xml',
+        'training_exam_processing_data.xml',
+        'training_exam_processing_report.xml',
     ],
     'active' : False,
     'installable' : True,

=== modified file 'training_exam_processing/security/ir.model.access.csv'
--- training_exam_processing/security/ir.model.access.csv	2011-02-23 14:55:09 +0000
+++ training_exam_processing/security/ir.model.access.csv	2011-03-22 13:39:51 +0000
@@ -44,5 +44,3 @@
 "access_degree_contact_user","training.degree.contact","training_degree.model_training_degree_contact","group_training_exam_correction_user",1,0,0,0
 "access_degree_scan_contact_manager","training.degree.contact","training_degree.model_training_degree_contact","document_scan.group_document_scan_manager",1,0,0,0
 "access_degree_contact_manager","training.degree.contact","training_degree.model_training_degree_contact","group_training_exam_correction_manager",1,0,0,0
-"access_res_partner_function_docscan_user","res.partner.function","base.model_res_partner_function","document_scan.group_document_scan_user",1,0,0,0
-"access_res_partner_function_docscan_manager","res.partner.function","base.model_res_partner_function","document_scan.group_document_scan_manager",1,0,0,0

=== renamed file 'training_exam_processing/code.py' => 'training_exam_processing/training_exam_processing.py'
--- training_exam_processing/code.py	2011-02-25 12:33:02 +0000
+++ training_exam_processing/training_exam_processing.py	2011-03-22 13:39:51 +0000
@@ -22,10 +22,10 @@
 #
 ############################################################################################
 
-from osv import osv, fields
+from osv import osv
+from osv import fields
 
 import tools
-import os
 import time
 from tools.translate import _
 import netsvc
@@ -38,9 +38,11 @@
     _inherit = 'res.partner.job'
 #
     def search(self, cr, uid, domain, offset=0, limit=None, order=None, context=None, count=False):
-        correct = context and context.get('wizard_create_correction_request', False) or False
+        if context is None:
+            context = {}
+        participation_proxy = self.pool.get('training.participation')
+        correct = context.get('wizard_create_correction_request', False)
         if correct:
-            participation_proxy = self.pool.get('training.participation')
             job_set = set()
             part_ids = context.get('active_ids', [])
             for p in participation_proxy.browse(cr, uid, context.get('active_ids', []), context=context):
@@ -52,6 +54,7 @@
             if job_set:
                 domain.extend([('id', 'in', list(job_set))])
         return super(res_partner_job, self).search(cr, uid, domain, offset=0, limit=limit, order=order, context=context, count=count)
+
 res_partner_job()
 
 class training_config_contact_function(osv.osv):
@@ -63,6 +66,7 @@
             vals = []
         vals.append(('corrector', 'Corrector'))
         return vals
+
 training_config_contact_function()
 
 class exam_correction_request(osv.osv):
@@ -71,14 +75,12 @@
     _order = 'create_date ASC'
 
     def _amount_to_pay(self, cr, uid, ids, name, args, context=None):
-        res = dict.fromkeys(ids, 'N/A')
+        result = dict.fromkeys(ids, 'N/A')
         if not ids:
-            return res
-
+            return result
         for request in self.browse(cr, uid, ids, context=context):
-            res[request.id] = unicode(request.product_id.standard_price * len(request.correction_ids))
-
-        return res
+            result[request.id] = unicode(request.product_id.standard_price * len(request.correction_ids))
+        return result
 
     _columns = {
         'name' : fields.char('Reference', size=32, required=True, readonly=True, select=1),
@@ -87,25 +89,15 @@
                                    **WRITABLE_ONLY_IN_DRAFT),
         'contact_id' : fields.related('job_id', 'contact_id', type='many2one', relation='res.partner.contact',
                                       select=1, string='Contact', store=True, readonly=True),
-
-        'partner_id' : fields.related('job_id', 'name',
-                                      string='Partner',
-                                      type='many2one',
-                                      relation='res.partner',
-                                      readonly=True,
-                                      select=1,
-                                      store=True),
-
+        'partner_id' : fields.related('job_id', 'name', string='Partner', type='many2one', relation='res.partner',
+                                      readonly=True, select=1, store=True),
         'create_date' : fields.datetime('Create Date', readonly=True),
-
         'validate_date' : fields.datetime('Validate Date', select=1, readonly=True),
         'acceptation_date': fields.datetime('Acceptation Date', select=2, readonly=True),
         'forward_looking_date' : fields.datetime('Forward Looking Date', select=1, required=True, write=['training.group_training']),
-
         'correction_ids' : fields.one2many('training.exam.correction', 'request_id', 'Corrections', **WRITABLE_ONLY_IN_DRAFT),
         'po_id' : fields.many2one('purchase.order', 'Purchase Order', select=1, **WRITABLE_ONLY_IN_DRAFT),
-        'po_id_state' : fields.related('po_id', 'state',
-                                       type='selection',
+        'po_id_state' : fields.related('po_id', 'state', type='selection',
                                        selection=[('draft', 'Request for Quotation'),
                                                   ('wait', 'Waiting'),
                                                   ('confirmed', 'Confirmed'),
@@ -114,30 +106,22 @@
                                                   ('except_invoice', 'Invoice Exception'),
                                                   ('done', 'Done'),
                                                   ('cancel', 'Cancelled')
-                                                 ],
-                                       string='Order Status',
-                                       readonly=True),
+                                                 ], string='Order Status', readonly=True),
         'po_id_amount' : fields.related('po_id', 'amount_total', type='float', string='Total Amount', readonly=True),
-
-
-        'invoice_id' : fields.related('po_id', 'invoice_id', type='many2one', relation='account.invoice', string="Invoice", readonly=True),
-        'invoice_id_state': fields.related('invoice_id', 'state',
-                                           type='selection',
-                                           selection=[
-                                               ('draft','Draft'),
-                                               ('proforma','Pro-forma'),
-                                               ('proforma2','Pro-forma'),
-                                               ('open','Open'),
-                                               ('paid','Done'),
-                                               ('cancel','Cancelled'),
-                                           ],
-                                           string='Invoice Status',
-                                           readonly=True),
-        'invoice_id_amount' : fields.related('invoice_id', 'amount_total', type='float', string='Total Amount', readonly=True),
-        'invoice_id_paid': fields.related('po_id', 'invoice_id', 'reconciled', type='boolean', string='Invoice Paid', readonly=True),
-
+        'invoice_ids' : fields.related('po_id', 'invoice_ids', type='many2many', relation='account.invoice', string="Invoice", readonly=True),
+#Need to fixed
+#        'invoice_id_state': fields.related('invoice_id', 'state', type='selection',
+#                                           selection=[
+#                                               ('draft','Draft'),
+#                                               ('proforma','Pro-forma'),
+#                                               ('proforma2','Pro-forma'),
+#                                               ('open','Open'),
+#                                               ('paid','Done'),
+#                                               ('cancel','Cancelled'),
+#                                           ], string='Invoice Status', readonly=True),
+#        'invoice_id_amount' : fields.related('invoice_id', 'amount_total', type='float', string='Total Amount', readonly=True),
+#        'invoice_id_paid': fields.related('po_id', 'invoice_id', 'reconciled', type='boolean', string='Invoice Paid', readonly=True),
         'product_id' : fields.many2one('product.product', 'Product', select=2, required=True, **WRITABLE_ONLY_IN_DRAFT),
-
         'state': fields.selection([('draft', 'Draft'),
                                    ('validated', 'Validated'),
                                    ('requested', 'Requested'),
@@ -145,20 +129,14 @@
                                    ('refused', 'Refused'),
                                    ('cancelled', 'Cancelled'),
                                    ('done', 'Done'),
-                                  ],
-                                  'State',
-                                  readonly=True,
-                                  required=True,
-                                  select=1),
-
+                                  ], 'State', readonly=True, required=True, select=1),
         'payment_mode' : fields.selection([('contract', 'Contract'), ('invoice', 'Invoice') ], 'Payment Mode', required=True, select=1, **WRITABLE_ONLY_IN_DRAFT),
         'email' : fields.char('Email', size=128, select=1, **WRITABLE_ONLY_IN_DRAFT),
         'amount_to_pay': fields.function(_amount_to_pay, string='Amount to pay', type='char', size='20', readonly=True, method=True),
     }
 
-    def create(self, cr, uid, vals, context):
+    def create(self, cr, uid, vals, context=None):
         vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'training.excr')
-
         return super(exam_correction_request, self).create(cr, uid, vals, context)
 
     def _default_forward_looking_date(self, cr, uid, context=None):
@@ -173,14 +151,15 @@
 
     @tools.cache(skiparg=4)
     def _get_stock_location(self, cr, uid, context=None):
-        r = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'internal')], context=context, limit=1)
-        if not r:
+        result = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'internal')], context=context, limit=1)
+        if not result:
             return False
-        return r[0]
+        return result[0]
 
     def _create_PO(self, cr, uid, ids, context=None):
+        if context is None:
+            context = {}
         po_proxy = self.pool.get('purchase.order')
-
         for this in self.browse(cr, uid, ids, context=context):
             po_id = po_proxy.create(cr, uid, {
                 'name': "Correction Request : %s" % this.name,
@@ -193,11 +172,13 @@
             }, context=context)
 
             this.write({'po_id' : po_id})
-
             for obj in this.correction_ids:
                 obj.create_purchase_order_line(po_id)
+        return True
 
     def action_create_purchase_order(self, cr, uid, ids, context=None):
+        if context is None:
+            context = {}
         for obj in self.browse(cr, uid, ids, context=context):
             if not obj.payment_mode:
                 raise osv.except_osv(_('Error'),
@@ -217,19 +198,21 @@
         workflow = netsvc.LocalService('workflow')
         for this in self.browse(cr, uid, ids, context=context):
             workflow.trg_validate(uid, 'purchase.order', this.po_id.id, 'purchase_confirm', cr)
+        return True
 
     def _approve_PO(self,cr, uid, ids, context=None):
         workflow = netsvc.LocalService('workflow')
-
         for this in self.browse(cr, uid, ids, context=context):
             if this.po_id:
                 workflow.trg_validate(uid, 'purchase.order', this.po_id.id, 'purchase_approve', cr)
+        return True
 
     def _cancel_PO(self, cr, uid, ids, context=None):
         workflow = netsvc.LocalService('workflow')
         for this in self.browse(cr, uid, ids, context=context):
             if this.po_id:
                 self.pool.get('purchase.order').action_cancel(cr, uid, [this.po_id.id], context=context)
+        return True
 
     def action_wkf_draft(self, cr, uid, ids, context=None):
         return self.write(cr, uid, ids, {'state' : 'draft'}, context=context)
@@ -334,8 +317,9 @@
         return [(obj.id, obj.request_id.name) for obj in self.browse(cr, uid, ids, context=context)]
 
     def f_get_courses(self, cr, uid, ids, fname, args, context=None):
+        if context is None:
+            context = {}
         res = dict.fromkeys(ids, '')
-
         for tec in self.browse(cr, uid, ids, context=context):
             quizz = tec.participation_id.questionnaire_id
             if quizz:
@@ -350,35 +334,21 @@
         'request_id' : fields.many2one('training.exam.correction.request', 'Request', required=True, ondelete='cascade'),
         'participation_id' : fields.many2one('training.participation', 'Participation', required=True,
                                              domain="[('kind', '=', 'exam'), ('result_received', '=', 0)]"),
-
-        'course_ids': fields.function(f_get_courses,
-                                      method=True,
-                                      type='text',
-                                      string='Course',
-                                      readonly=1),
+        'course_ids': fields.function(f_get_courses, method=True, type='text', string='Course', readonly=1),
         'date' : fields.related('participation_id', 'date', type='datetime', readonly=True, string='Date'),
-
         'result' : fields.related('participation_id', 'result', type='float', readonly=True, string='Result'),
         'present' : fields.related('participation_id', 'present', type='boolean', string='Present', readonly=True),
         'passing_score' : fields.related('participation_id', 'passing_score', type='float', readonly=True, string="Passing Score"),
-        'succeeded': fields.related('participation_id', 'succeeded',
-                                    type='selection',
+        'succeeded': fields.related('participation_id', 'succeeded', type='selection',
                                     selection=[('n/a', 'N/A'),
                                                ('no', 'No'),
-                                               ('yes', 'Yes')],
-                                    readonly=True,
-                                    string='Succeeded'),
-
+                                               ('yes', 'Yes')], readonly=True, string='Succeeded'),
         'pol_id' : fields.many2one('purchase.order.line', 'Purchase Order Line', readonly=True),
         'po_id' : fields.related('pol_id', 'order_id', string='Purchase Order', type='many2one', relation='purchase.order', readonly=True),
-
         'state' : fields.selection([('to_correct', 'To Correct'),
                                     ('corrected', 'Corrected'),
                                     ('moved', 'Moved')],
-                                   'State',
-                                   readonly=True,
-                                   required=True,
-                                  ),
+                                   'State', readonly=True, required=True),
     }
 
     _defaults = {
@@ -387,12 +357,16 @@
     }
 
     def create(self, cr, uid, values, context=None):
+        if context is None:
+            context = {}
         values['name'] = self.pool.get('ir.sequence').get(cr, uid, 'training.exc')
         correction_id = super(exam_correction, self).create(cr, uid, values, context=context)
         self.pool.get('training.participation').write(cr, uid, values['participation_id'], {'correction_id' : correction_id}, context=context)
         return correction_id
 
     def unlink(self, cr, uid, ids, context=None):
+        if context is None:
+            context = {}
         if any(obj.state in ('corrected', 'moved') for obj in self.browse(cr, uid, ids, context=context)):
             raise osv.except_osv(_('Warning'),
                                  _("""You can not remove a corrected/moved correction"""))
@@ -403,6 +377,8 @@
         return super(exam_correction, self).unlink(cr, uid, ids, context=context)
 
     def move_cb(self, cr, uid, ids, context=None):
+        if context is None:
+            context = {}
         wkf = netsvc.LocalService('workflow')
 
         for obj in self.browse(cr, uid, ids, context=context):
@@ -415,25 +391,22 @@
 
     def done_cb(self, cr, uid, ids, context=None):
         wkf = netsvc.LocalService('workflow')
-
         for obj in self.browse(cr, uid, ids, context=context):
             obj.write({'state': 'corrected'})
-
             wkf.trg_validate(uid, 'training.exam.correction.request', obj.request_id.id, 'excr_done', cr)
-
         return True
 
     def create_purchase_order_line(self, cr, uid, ids, po_id, context=None):
+        if context is None:
+            context = {}
         po_proxy = self.pool.get('purchase.order')
         pol_proxy = self.pool.get('purchase.order.line')
-
         journal_ids = self.pool.get('account.analytic.journal').search(cr, uid, [('type','=','purchase'),('active','=',True)])
         if journal_ids:
             journal_id = journal_ids[0]
         else:
             raise osv.except_osv(_('Error'), _('Unable to find an active Analytic Purchase Journal'))
 
-
         for obj in self.browse(cr, uid, ids, context=context):
             price = 0 #obj.price
             qty = 1.0 #obj.seance_id.duration * 1.0
@@ -481,11 +454,14 @@
     }
 
     def do_correction_cb(self, cr, uid, ids, context=None):
+        if context is None:
+            context = {}
         for obj in self.browse(cr, uid, ids, context=context):
             if not all([ x.graded for x in obj.participation_line_ids ]):
                 raise osv.except_osv(_('Error'), _('Can\'t mark this participation as done because some candidate responses are note marked as graded'))
             obj.write({'result_received' : 1})
             obj.correction_id.done_cb()
+        return True
 
     def dump_correction_info(self, q, page_num, r_list, r_user):
         title_data = []
@@ -500,9 +476,8 @@
         return s
 
     def do_correction_auto(self, cr, uid, res_id, page_num, scanner, context=None):
-        if not context:
+        if context is None:
             context = {}
-
         res_obj = self.browse(cr, uid, res_id)
         # first check that que res_id actually exists
         try:
@@ -629,11 +604,15 @@
     }
 
     def create_request(self, cr, uid, ids, context=None):
+        if not ids:
+            return {}
+        if context is None:
+            context = {}
         wizard = self.browse(cr, uid, ids[0], context=context)
         proxy = self.pool.get('training.exam.correction.request')
 
         participation_pool = self.pool.get('training.participation')
-        participation_ids = context and context.get('active_ids', []) or []
+        participation_ids = context.get('active_ids', [])
         if not participation_ids:
             # TODO: raise error to client?
             return {}
@@ -673,5 +652,4 @@
 
 training_exam_correction_request_create()
 
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== renamed file 'training_exam_processing/data.xml' => 'training_exam_processing/training_exam_processing_data.xml'
=== renamed file 'training_exam_processing/reports.xml' => 'training_exam_processing/training_exam_processing_report.xml'
=== renamed file 'training_exam_processing/sequence.xml' => 'training_exam_processing/training_exam_processing_sequence.xml'
=== renamed file 'training_exam_processing/view.xml' => 'training_exam_processing/training_exam_processing_view.xml'
--- training_exam_processing/view.xml	2011-02-23 13:39:36 +0000
+++ training_exam_processing/training_exam_processing_view.xml	2011-03-22 13:39:51 +0000
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <openerp>
     <data>
-        <menuitem id="exam_followup_mi" parent="training.participant_participation_mi" name="Exam Followup" />
-        <menuitem id="exam_mi" parent="exam_followup_mi" name="Exam" />
-        <menuitem id="exam_followup_automatic_mi" parent="exam_mi" name="Automatic" />
-        <menuitem id="exam_followup_manual_mi" parent="exam_mi" name="Manual" />
+        <menuitem id="exam_followup_mi" parent="training.participant_participation_mi" name="Exam Followup" sequence="1"/>
+        <menuitem id="exam_mi" parent="exam_followup_mi" name="Exam" sequence="1"/>
+        <menuitem id="exam_followup_automatic_mi" parent="exam_mi" name="Automatic"/>
+        <menuitem id="exam_followup_manual_mi" parent="exam_mi" name="Manual"/>
 
         <record model="ir.ui.view" id="exam_correction_form">
             <field name="name">training.exam.correction.form</field>
@@ -26,7 +26,7 @@
                     <separator colspan="4" />
                     <group colspan="4" col="3">
                         <field name="state" />
-                        <button name="move_cb" string="Move / Reassign" type="object" groups="training.group_training" states="to_correct" confirm="Are you sure you want to move or reassign this correction?"/>
+                        <button name="move_cb" string="Move / Reassign" icon="gtk-execute" type="object" groups="training.group_training" states="to_correct" confirm="Are you sure you want to move or reassign this correction?"/>
                     </group>
                 </form>
             </field>
@@ -42,11 +42,41 @@
                     <field name="participation_id" />
                     <field name="course_ids" />
                     <field name="date" />
+                    <field name="request_id" invisible="1"/>
                     <field name="state" />
                 </tree>
             </field>
         </record>
 
+        <record model="ir.ui.view" id="exam_correction_search">
+            <field name="name">training.exam.correction.search</field>
+            <field name="model">training.exam.correction</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Correction">
+                   <group colspan='4'>
+                        <filter icon="terp-document-new" string="To Correct" domain="[('state','=', 'to_correct')]"/>
+                        <filter icon="terp-camera_test" string="Corrected" domain="[('state','=', 'corrected')]"/>
+                        <filter icon="gtk-ok" string="Move" domain="[('state','=', 'move')]"/>
+                        <separator orientation="vertical"/>
+                        <field name="name"/>
+                        <field name="request_id"/>
+                        <field name="participation_id"/>
+                        <field name="pol_id"/>
+                        <field name="date"/>
+                   </group>
+                   <newline/>
+                   <group expand="0" string="Group By..." colspan="4">
+                       <filter string="Participation" icon="terp-partner" domain="[]"  context="{'group_by':'participation_id'}"/>
+                       <separator orientation="vertical"/>
+                       <filter string="Request" icon="gtk-convert" domain="[]"  context="{'group_by':'request_id'}"/>
+                       <separator orientation="vertical"/>
+                       <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]"  context="{'group_by':'state'}"/>
+                   </group>
+               </search>
+            </field>
+        </record>
+
         <record model="ir.ui.view" id="exam_correction_request_form">
             <field name="name">training.exam.correction.request.form</field>
             <field name="model">training.exam.correction.request</field>
@@ -65,21 +95,23 @@
                             <field name="product_id" groups="base.group_user" />
                             <field name="amount_to_pay" />
                             <group col="7" colspan="4" groups="base.group_user">
-				<separator string="Purchase Order &amp; Invoicing" colspan="7" />
+				                <separator string="Purchase Order" colspan="7" />
                                 <field name="po_id" />
                                 <field name="po_id_amount" />
                                 <field name="po_id_state" />
                                 <button type="object" name="action_create_purchase_order" string="Create Purchase Order"
-                                    attrs="{'invisible' : [('po_id', '!=', False)]}"/>
+                                    icon="terp-document-new" attrs="{'invisible' : [('po_id', '!=', False)]}"/>
                                 <newline />
-                                <field name="invoice_id" />
-                                <field name="invoice_id_amount" />
-                                <field name="invoice_id_state" />
-                                <group col="1" colspan="1" attrs="{'invisible' : [('po_id', '=', False)]}">
+                                <separator string="Invoice" colspan="7"/>
+                                <field name="invoice_ids" nolabel="1" colspan="7"/>
+                                    <!--  Need To Fix. (invoice_ids many2many field in purchase.order -->
+<!--                                <field name="invoice_id_amount" />-->
+<!--                                <field name="invoice_id_state" />-->
+                                <group col="1" colspan="7" attrs="{'invisible' : [('po_id', '=', False)]}">
                                     <button type="object" name="action_create_invoice" string="Create Invoice"
-                                        attrs="{'invisible' : [('invoice_id', '!=', False)]}"/>
+                                        icon="terp-document-new" colspan="7"/>
                                 </group>
-				<field name="invoice_id_paid"/>
+				            <!--field name="invoice_id_paid"/ -->
                             </group>
                             <separator string="Dates" colspan="4" />
                             <field name="create_date" />
@@ -93,22 +125,22 @@
                     </notebook>
                     <group col="9" colspan="4">
                         <field name="state" />
-                        <button name="excr_validate" string="Validate" type="workflow" states="draft" 
-                            groups="training.group_training"
+                        <button name="excr_validate" string="Validate" type="workflow" states="draft"
+                            groups="training.group_training" icon="terp-camera_test"
                             confirm="Do you want to validate this request ?"/>
-                        <button name="excr_request" string="Send Request" type="workflow" 
-                            groups="training.group_training"
+                        <button name="excr_request" string="Send Request" type="workflow"
+                            groups="training.group_training" icon="gtk-execute"
                             states="validated" />
-                        <button name="excr_resend_email" type="workflow" string="Resend Request Email" 
+                        <button name="excr_resend_email" type="workflow" string="Resend Request Email" icon="gtk-convert"
                             states="requested" groups="training.group_training" />
-                        <button name="excr_accept" string="Accept" type="workflow" 
-                            states="requested,validated" 
+                        <button name="excr_accept" string="Accept" type="workflow"
+                            states="requested,validated"  icon="terp-idea"
                             confirm="Do you want to confirm this request ?" />
-                        <button name="excr_refuse" string="Refuse" type="workflow" states="requested" confirm="Do you want to refuse this request ?" />
-                        <button name="excr_cancel" string="Cancel" type="workflow" states="draft,validate,requested,accepted" 
-                            confirm="Do you want to cancel this request ?" groups="base.group_user" />
+                        <button name="excr_refuse" string="Refuse" icon="gtk-refresh" type="workflow" states="requested" confirm="Do you want to refuse this request ?" />
+                        <button name="excr_cancel" string="Cancel" type="workflow" states="draft,validate,requested,accepted"
+                            confirm="Do you want to cancel this request ?" groups="base.group_user" icon="gtk-cancel"/>
                         <button name="excr_done" string="Done" type="workflow"
-                            states="accepted"
+                            states="accepted" icon="gtk-jump-to"
                             groups="training_exam.group_exam_manager"/>
                     </group>
                 </form>
@@ -142,89 +174,50 @@
                     <field name="name" />
                     <field name="job_id" />
                     <field name="partner_id" />
-		    <field name="invoice_id_paid" groups="training.group_training"/>
+<!--                    <field name="invoice_id_paid" groups="training.group_training"/>-->
                 </tree>
             </field>
         </record>
 
+        <record model="ir.ui.view" id="exam_correction_request_search">
+            <field name="name">training.exam.correction.request.search</field>
+            <field name="model">training.exam.correction.request</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Correction">
+                   <group colspan='4'>
+                        <filter icon="terp-document-new" string="Draft" domain="[('state','=', 'draft')]"/>
+                        <filter icon="terp-camera_test" string="Validated" domain="[('state','=', 'validated')]"/>
+                        <filter icon="gtk-ok" string="Accepted" domain="[('state','=', 'accepted')]"/>
+                        <filter icon="gtk-convert" string="Requested" domain="[('state','=', 'requested')]"/>
+                        <separator orientation="vertical"/>
+                        <field name="name"/>
+                        <field name="job_id"/>
+                        <field name="product_id"/>
+                        <field name="partner_id"/>
+                        <field name="payment_mode"/>
+                   </group>
+                   <newline/>
+                   <group expand="0" string="Group By..." colspan="4">
+                       <filter string="Partner" icon="terp-partner" domain="[]"  context="{'group_by':'partner_id'}"/>
+                       <separator orientation="vertical"/>
+                       <filter string="Product" icon="terp-accessories-archiver" domain="[]"  context="{'group_by':'product_id'}"/>
+                       <separator orientation="vertical"/>
+                       <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]"  context="{'group_by':'state'}"/>
+                   </group>
+               </search>
+            </field>
+        </record>
+
         <record model="ir.actions.act_window" id="exam_correction_request_all_act">
-            <field name="name">All Correction Requests</field>
+            <field name="name">Correction Requests</field>
             <field name="res_model">training.exam.correction.request</field>
             <field name="view_type">form</field>
             <field name="view_mode">tree,form</field>
+            <field name="search_view_id" ref="exam_correction_request_search"/>
         </record>
 
         <menuitem id="exam_correction_request_all_mi" parent="training.training_request_mi" action="exam_correction_request_all_act"/>
-        
-        <record model="ir.actions.act_window" id="exam_correction_request_draft_act">
-            <field name="name">Requests to validate</field>
-            <field name="res_model">training.exam.correction.request</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="domain">[('state', '=', 'draft')]</field>
-        </record>
-
-        <menuitem id="exam_correction_request_draft_mi" parent="exam_correction_request_all_mi" action="exam_correction_request_draft_act"/>
-
-        <record model="ir.actions.act_window" id="exam_correction_request_validate_act">
-            <field name="name">Requests to send</field>
-            <field name="res_model">training.exam.correction.request</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="domain">[('state', '=', 'validated')]</field>
-        </record>
-
-        <menuitem id="exam_correction_request_validate_mi" parent="exam_correction_request_all_mi" action="exam_correction_request_validate_act"/>
-
-        <record model="ir.actions.act_window" id="exam_correction_request_requested_act">
-            <field name="name">Requests awaiting response</field>
-            <field name="res_model">training.exam.correction.request</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="domain">[('state', '=', 'requested')]</field>
-        </record>
-
-        <menuitem id="exam_correction_request_requested_mi" parent="exam_correction_request_all_mi" action="exam_correction_request_requested_act"/>
-
-        <record model="ir.actions.act_window" id="exam_correction_rq_pending_correction_act">
-            <field name="name">Requests Pending Correction</field>
-            <field name="res_model">training.exam.correction.request</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="domain">[('state', 'not in', ['done', 'cancelled'])]</field>
-        </record>
-
-        <menuitem id="exam_correction_rq_pending_correction_mi" parent="exam_correction_request_all_mi" action="exam_correction_rq_pending_correction_act"/>
-
-        <record model="ir.actions.act_window" id="exam_correction_request_accepted_act">
-            <field name="name">Accepted Requests</field>
-            <field name="res_model">training.exam.correction.request</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="domain">[('state', '=', 'accepted')]</field>
-        </record>
-
-        <menuitem id="exam_correction_request_accepted_mi" parent="exam_correction_request_all_mi" action="exam_correction_request_accepted_act"/>
-
-        <record model="ir.actions.act_window" id="exam_correction_request_refused_act">
-            <field name="name">Refused Requests</field>
-            <field name="res_model">training.exam.correction.request</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="domain">[('state', '=', 'refused')]</field>
-        </record>
-
-        <menuitem id="exam_correction_request_refused_mi" parent="exam_correction_request_all_mi" action="exam_correction_request_refused_act"/>
-
-        <record model="ir.actions.act_window" id="exam_correction_request_cancelled_act">
-            <field name="name">Cancelled Requests</field>
-            <field name="res_model">training.exam.correction.request</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">tree,form</field>
-            <field name="domain">[('state', '=', 'cancelled')]</field>
-        </record>
-
-        <menuitem id="exam_correction_request_cancelled_mi" parent="exam_correction_request_all_mi" action="exam_correction_request_cancelled_act"/>
 
         <record model="ir.ui.view" id="participation_form">
             <field name="name">training.participation.form</field>
@@ -237,10 +230,10 @@
                     <separator string='Correction' colspan="2"/>
                     <field name="correction_id" groups="training_exam.group_exam_user"/>
                     <field name="correction_state_id" groups="training_exam.group_exam_user,training_exam.group_exam_manager" invisible="1"/>
-                    <button name="do_correction_cb" string="Correction Done" type="object"
+                    <button name="do_correction_cb" string="Correction Done" type="object" icon="gtk-jump-to"
                             attrs="{'invisible' : [('correction_state_id','=','corrected')]}" colspan="2"
                             groups="training_exam.group_exam_manager"/>
-		    </group>
+		          </group>
                 </field>
             </field>
         </record>
@@ -262,12 +255,17 @@
             <field name="arch" type="xml">
                 <form string="Create Correction Request">
                     <label string="Can you select the examiner ?" colspan="2" />
-                    <newline />
+                    <separator colspan="4"/>
                     <field name="job_id" context="{'wizard_create_correction_request': True, 'function': 'corrector'}"/>
                     <newline />
                     <field name="product_id" />
                     <newline />
-                    <button string="Create Correction" name="create_request" type="object" icon="gtk-execute" colspan="2"/>
+                    <separator colspan="4"/>
+                    <group colspan="4">
+                        <label colspan="2"/>
+                        <button name="cancel_cb" string="Cancel" special="cancel" type="object" icon="gtk-cancel"/>
+                        <button string="Create Correction" name="create_request" type="object" icon="gtk-execute" colspan="1"/>
+                    </group>
                 </form>
             </field>
         </record>
@@ -278,8 +276,8 @@
             <field name="view_type">form</field>
             <field name="view_mode">form</field>
             <field name="target">new</field>
-	    <field name="context">{ 'wizard_create_correction_request': True }</field>
-	    <field name="groups_id" eval="[(6,0,[ref('training_exam.group_exam_user')])]" />
+		    <field name="context">{ 'wizard_create_correction_request': True }</field>
+		    <field name="groups_id" eval="[(6,0,[ref('training_exam.group_exam_user')])]" />
         </record>
 
         <record model="ir.values" id="training_exam_correction_request_create_act2">

=== renamed file 'training_exam_processing/workflow.xml' => 'training_exam_processing/training_exam_processing_workflow.xml'

Follow ups