diff options
64 files changed, 1299 insertions, 279 deletions
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index a10cba705e4..b26b2c5ac29 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -1,9 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> - <!-- - Invoices - --> + + <!-- Invoices --> <record id="view_invoice_line_calendar" model="ir.ui.view"> <field name="name">account.invoice.calendar</field> <field name="model">account.invoice</field> @@ -148,12 +147,14 @@ <field name="arch" type="xml"> <form version="7.0"> <header> - <button name="invoice_open" states="draft" string="Validate" class="oe_highlight"/> - <button name="invoice_open" states="proforma2" string="Validate"/> - <button name="%(action_account_invoice_refund)d" type='action' string='Ask Refund' states='open,paid'/> - <button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" groups="base.group_no_one"/> - <button name="action_cancel_draft" states="cancel" string="Set to Draft" type="object"/> - <button name='%(action_account_state_open)d' type='action' string='Re-Open' groups="account.group_account_invoice" attrs="{'invisible':['|', ('state','<>','paid'), ('reconciled', '=', True)]}" help="This button only appears when the state of the invoice is 'paid' (showing that it has been fully reconciled) and auto-computed boolean 'reconciled' is False (depicting that it's not the case anymore). In other words, the invoice has been dereconciled and it does not fit anymore the 'paid' state. You should press this button to re-open it and let it continue its normal process after having resolved the eventual exceptions it may have created."/> + <span groups="base.group_user"> + <button name="invoice_open" states="draft" string="Validate" class="oe_highlight"/> + <button name="invoice_open" states="proforma2" string="Validate"/> + <button name="%(action_account_invoice_refund)d" type='action' string='Ask Refund' states='open,paid'/> + <button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" groups="base.group_no_one"/> + <button name="action_cancel_draft" states="cancel" string="Set to Draft" type="object"/> + <button name='%(action_account_state_open)d' type='action' string='Re-Open' groups="account.group_account_invoice" attrs="{'invisible':['|', ('state','<>','paid'), ('reconciled', '=', True)]}" help="This button only appears when the state of the invoice is 'paid' (showing that it has been fully reconciled) and auto-computed boolean 'reconciled' is False (depicting that it's not the case anymore). In other words, the invoice has been dereconciled and it does not fit anymore the 'paid' state. You should press this button to re-open it and let it continue its normal process after having resolved the eventual exceptions it may have created."/> + </span> <field name="state" widget="statusbar" statusbar_visible="draft,open,paid" statusbar_colors='{"proforma":"blue","proforma2":"blue"}'/> </header> <sheet string="Supplier Invoice"> @@ -275,15 +276,17 @@ <field name="arch" type="xml"> <form version="7.0"> <header> - <button name="action_invoice_sent" type="object" string="Send by Email" states="open" attrs="{'invisible':['|',('sent','=',True), ('state', '=', 'draft')]}" class="oe_highlight"/> - <button name="invoice_print" string="Print Invoice" type="object" states="open" attrs="{'invisible':['|',('sent','=',True), ('state', '=', 'draft')]}" class="oe_highlight"/> - <button name="invoice_open" states="draft" string="Validate" class="oe_highlight"/> - <button name="invoice_open" states="proforma2" string="Validate"/> - <button name="invoice_proforma2" states="draft" string="PRO-FORMA" groups="account.group_proforma_invoices"/> - <button name="%(action_account_invoice_refund)d" type='action' string='Refund Invoice' states='paid'/> - <button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" groups="base.group_no_one"/> - <button name="action_cancel_draft" states="cancel" string="Reset to Draft" type="object"/> - <button name='%(action_account_state_open)d' type='action' string='Re-Open' groups="account.group_account_invoice" attrs="{'invisible':['|', ('state','<>','paid'), ('reconciled', '=', True)]}" help="This button only appears when the state of the invoice is 'paid' (showing that it has been fully reconciled) and auto-computed boolean 'reconciled' is False (depicting that it's not the case anymore). In other words, the invoice has been dereconciled and it does not fit anymore the 'paid' state. You should press this button to re-open it and let it continue its normal process after having resolved the eventual exceptions it may have created."/> + <span groups="base.group_user"> + <button name="action_invoice_sent" type="object" string="Send by Email" states="open" attrs="{'invisible':['|',('sent','=',True), ('state', '=', 'draft')]}" class="oe_highlight"/> + <button name="invoice_print" string="Print Invoice" type="object" states="open" attrs="{'invisible':['|',('sent','=',True), ('state', '=', 'draft')]}" class="oe_highlight"/> + <button name="invoice_open" states="draft" string="Validate" class="oe_highlight"/> + <button name="invoice_open" states="proforma2" string="Validate"/> + <button name="invoice_proforma2" states="draft" string="PRO-FORMA" groups="account.group_proforma_invoices"/> + <button name="%(action_account_invoice_refund)d" type='action' string='Refund Invoice' states='paid'/> + <button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" groups="base.group_no_one"/> + <button name="action_cancel_draft" states="cancel" string="Reset to Draft" type="object"/> + <button name='%(action_account_state_open)d' type='action' string='Re-Open' groups="account.group_account_invoice" attrs="{'invisible':['|', ('state','<>','paid'), ('reconciled', '=', True)]}" help="This button only appears when the state of the invoice is 'paid' (showing that it has been fully reconciled) and auto-computed boolean 'reconciled' is False (depicting that it's not the case anymore). In other words, the invoice has been dereconciled and it does not fit anymore the 'paid' state. You should press this button to re-open it and let it continue its normal process after having resolved the eventual exceptions it may have created."/> + </span> <!--button name="%(account_invoices)d" string="Print Invoice" type="action" states="open,paid,proforma,sale,proforma2"/--> <field name="state" widget="statusbar" nolabel="1" statusbar_visible="draft,open,paid" statusbar_colors='{"proforma":"blue","proforma2":"blue"}'/> </header> @@ -321,9 +324,8 @@ <field domain="[('company_id', '=', company_id),('type','=', 'receivable')]" name="account_id" groups="account.group_account_user"/> - <label for="currency_id"/> - <div> - <field name="currency_id" class="oe_inline"/> + <field name="currency_id"/> + <div groups="base.group_user"> <button name="%(action_account_change_currency)d" type="action" icon="terp-stock_effects-object-colorize" attrs="{'invisible':[('state','!=','draft')]}" @@ -369,15 +371,15 @@ <field name="company_id" on_change="onchange_company_id(company_id,partner_id,type,invoice_line,currency_id)" widget="selection" groups="base.group_multi_company"/> <newline/> <field name="date_due"/> - <field name="user_id"/> + <field name="user_id" groups="base.group_user"/> <newline/> <field domain="[('partner_id.ref_companies', 'in', [company_id])]" name="partner_bank_id"/> - <field name="origin" placeholder="SO0032"/> + <field name="origin" placeholder="SO0032" groups="base.group_user"/> <field name="move_id" groups="account.group_account_user"/> </group> <field name="comment" placeholder="Add an additional information in the invoice..."/> </page> - <page string="Payments"> + <page string="Payments" groups="base.group_user"> <field name="payment_ids"> <tree string="Payments"> <field name="date"/> diff --git a/addons/account/product_view.xml b/addons/account/product_view.xml index 73bf64893ba..98f9f93dfa7 100644 --- a/addons/account/product_view.xml +++ b/addons/account/product_view.xml @@ -8,7 +8,7 @@ <field name="inherit_id" ref="product.product_normal_form_view"/> <field name="arch" type="xml"> <notebook position="inside"> - <page string="Accounting"> + <page string="Accounting" groups="base.group_user"> <group name="properties"> <group> <field name="property_account_income" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('sale_ok','=',0)]}"/> diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml index db479343281..a080dd71c52 100644 --- a/addons/crm_claim/crm_claim_view.xml +++ b/addons/crm_claim/crm_claim_view.xml @@ -4,7 +4,7 @@ <menuitem id="menu_config_claim" name="Claim" groups="base.group_no_one" - parent="base.menu_base_config" sequence="55" /> + parent="base.menu_base_config" sequence="55"/> <!-- Claims categories --> @@ -70,7 +70,7 @@ <tree string="Claims" colors="blue:state=='pending' and not(date_deadline and (date_deadline < current_date));gray:state in ('close', 'cancel');red:date_deadline and (date_deadline < current_date)"> <field name="name"/> <field name="partner_id"/> - <field name="user_id" /> + <field name="user_id"/> <field name="date"/> <field name="stage_id"/> <field name="date_action_next"/> @@ -90,43 +90,45 @@ <field name="arch" type="xml"> <form version="7.0"> <header> - <button name="case_open" string="Open" type="object" - states="draft,pending"/> - <button name="case_close" string="Done" type="object" - states="open,pending"/> - <button name="case_refuse" string="Refuse" type="object" - states="draft,open,pending"/> - <button name="stage_previous" string="Previous Stage" type="object" - states="open,pending" icon="gtk-go-back" attrs="{'invisible': [('stage_id','=', False)]}"/> - <button name="stage_next" string="Next Stage" type="object" - states="open,pending" icon="gtk-go-forward" attrs="{'invisible': [('stage_id','=', False)]}"/> - <button name="case_reset" string="Reset to Draft" type="object" - states="cancel,done"/> - <button name="case_cancel" string="Cancel" type="object" - states="draft,open,pending"/> + <span groups="base.group_user"> + <button name="case_open" string="Open" type="object" + states="draft,pending"/> + <button name="case_close" string="Done" type="object" + states="open,pending"/> + <button name="case_refuse" string="Refuse" type="object" + states="draft,open,pending"/> + <button name="stage_previous" string="Previous Stage" type="object" + states="open,pending" icon="gtk-go-back" attrs="{'invisible': [('stage_id','=', False)]}"/> + <button name="stage_next" string="Next Stage" type="object" + states="open,pending" icon="gtk-go-forward" attrs="{'invisible': [('stage_id','=', False)]}"/> + <button name="case_reset" string="Reset to Draft" type="object" + states="cancel,done"/> + <button name="case_cancel" string="Cancel" type="object" + states="draft,open,pending"/> + </span> <field name="stage_id" widget="statusbar" on_change="onchange_stage_id(stage_id)"/> </header> <sheet string="Claims" layout="auto"> <group> - <field name="name" /> + <field name="name"/> <field name="date"/> </group> <group colspan="4" col="6"> <field name="user_id"/> - <field name="section_id" widget="selection" /> + <field name="section_id" widget="selection"/> <field name="state" groups="base.group_no_one"/> - <newline /> - <field name="priority"/> + <newline/> + <field name="priority" groups="base.group_user"/> <field name="date_deadline"/> </group> <group colspan="4" col="4"> <notebook> <page string="Claim Description"> - <group colspan="2" col="2"> + <group colspan="2" col="2" groups="base.group_user"> <separator colspan="2" string="Claim Reporter"/> <field name="partner_id" string="Partner" - on_change="onchange_partner_id(partner_id)" /> + on_change="onchange_partner_id(partner_id)"/> <field name="partner_phone"/> <field name="email_from" widget="email"/> </group> @@ -134,7 +136,7 @@ <separator colspan="2" string="Responsibilities"/> <field name="user_fault"/> <field name="categ_id" widget="selection" - domain="[('object_id.model', '=', 'crm.claim')]" /> + domain="[('object_id.model', '=', 'crm.claim')]"/> <field name="ref"/> </group> <separator colspan="4" string="Claim/Action Description"/> @@ -200,17 +202,14 @@ <separator orientation="vertical"/> <filter icon="terp-check" string="New" name="current" domain="[('state','=','draft')]" - help="New Claims" /> + help="New Claims"/> <filter icon="terp-camera_test" string="In Progress" domain="[('state','=','open')]" - help="In Progress Claims" - /> + help="In Progress Claims"/> <filter icon="terp-gtk-media-pause" string="Pending" - domain="[('state','=','pending')]" - help="All pending Claims" - /> + domain="[('state','=','pending')]"/> <filter string="Unassigned Claims" icon="terp-personal-" domain="[('user_id','=', False)]" @@ -222,25 +221,25 @@ <group expand="0" string="Group By..."> <filter string="Partner" icon="terp-partner" domain="[]" help="Partner" - context="{'group_by':'partner_id'}" /> + context="{'group_by':'partner_id'}"/> <filter string="Responsible" icon="terp-personal" domain="[]" help="Responsible User" - context="{'group_by':'user_id'}" /> + context="{'group_by':'user_id'}"/> <separator orientation="vertical"/> <filter string="Stage" icon="terp-stage" - domain="[]" context="{'group_by':'stage_id'}" /> + domain="[]" context="{'group_by':'stage_id'}"/> <filter string="Type" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'categ_id'}" /> + domain="[]" context="{'group_by':'categ_id'}"/> <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}" groups="base.group_no_one"/> <separator orientation="vertical"/> <filter string="Claim Date" icon="terp-go-month" domain="[]" help="Claim Date" - context="{'group_by':'date'}" /> + context="{'group_by':'date'}"/> <filter string="Deadline" icon="terp-go-month" domain="[]" - context="{'group_by':'date_deadline'}" /> + context="{'group_by':'date_deadline'}"/> <filter string="Closure" icon="terp-go-month" domain="[]" help="Date Closed" context="{'group_by':'date_closed'}" groups="base.group_no_one"/> diff --git a/addons/hr/hr.py b/addons/hr/hr.py index 59e28a28a4b..44b533fdc52 100644 --- a/addons/hr/hr.py +++ b/addons/hr/hr.py @@ -108,7 +108,7 @@ class hr_job(osv.osv): }, multi='no_of_employee'), 'no_of_recruitment': fields.float('Expected in Recruitment', help='Number of new employees you expect to recruit.'), - 'employee_ids': fields.one2many('hr.employee', 'job_id', 'Employees'), + 'employee_ids': fields.one2many('hr.employee', 'job_id', 'Employees', groups='base.group_user'), 'description': fields.text('Job Description'), 'requirements': fields.text('Requirements'), 'department_id': fields.many2one('hr.department', 'Department'), diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml index 5915511d385..4d6a8447d53 100644 --- a/addons/hr/hr_view.xml +++ b/addons/hr/hr_view.xml @@ -10,11 +10,7 @@ <menuitem id="menu_hr_configuration" name="Configuration" parent="hr.menu_hr_root" groups="base.group_hr_manager" sequence="50"/> <menuitem id="menu_hr_management" name="Human Resources" parent="hr.menu_hr_configuration" sequence="25"/> - <!-- - ========== - Employee - ========== - --> + <!--Employee form view --> <record id="view_employee_form" model="ir.ui.view"> <field name="name">hr.employee.form</field> <field name="model">hr.employee</field> @@ -42,7 +38,7 @@ <group string="General"> <field name="user_id" on_change="onchange_user(user_id)"/> <field name="active"/> - <field name="parent_id" /> + <field name="parent_id"/> </group> <group groups="base.group_hr_user" string="Social IDs"> <field name="identification_id"/> @@ -57,15 +53,15 @@ </group> <group string="Contact Information"> <field name="address_home_id"/> - <field name="address_id" on_change="onchange_address_id(address_id)" /> + <field name="address_id" on_change="onchange_address_id(address_id)"/> <field name="work_phone"/> <field name="mobile_phone"/> - <field name="work_email" widget="email" /> + <field name="work_email" widget="email"/> <field name="work_location"/> </group> <group string="Job Information"> <field name="job_id" domain="[('state','!=','old')]" context="{'form_view_ref': 'hr.view_hr_job_employee_form'}"/> - <field name="coach_id" /> + <field name="coach_id"/> </group> </group> </page> @@ -94,7 +90,7 @@ <field name="department_id"/> <field name="job_id"/> <field name="parent_id"/> - <field name="coach_id" invisible="1" /> + <field name="coach_id" invisible="1"/> </tree> </field> </record> @@ -242,7 +238,7 @@ <field name="company_id" groups="base.group_multi_company"/> <field name="department_id"/> <field name="job_id"/> - <field name="coach_id" invisible="1" /> + <field name="coach_id" invisible="1"/> </tree> </field> </record> @@ -279,8 +275,8 @@ <field name="arch" type="xml"> <form string="Employee Category" version="7.0"> <group> - <field name="name" /> - <field name="parent_id" /> + <field name="name"/> + <field name="parent_id"/> </group> </form> </field> @@ -354,15 +350,17 @@ <field name="arch" type="xml"> <form string="Job" version="7.0"> <header> - <button name="job_recruitement" string="In Recruitement" states="open" type="object"/> - <button name="job_open" string="Recruitment Done" states="recruit" type="object"/> + <span groups="base.group_user"> + <button name="job_recruitement" string="In Recruitement" states="open" type="object"/> + <button name="job_open" string="Recruitment Done" states="recruit" type="object"/> + </span> <field name="state" widget="statusbar" statusbar_visible="recruit,open"/> </header> <sheet> <group> <group> - <field name="name" /> - <field name="department_id" /> + <field name="name"/> + <field name="department_id"/> <field name="company_id" widget="selection" groups="base.group_multi_company"/> </group> <group> @@ -378,7 +376,7 @@ <label for="requirements"/> <field name="requirements"/> </page> - <page string="Employees"> + <page string="Employees" groups="base.group_user"> <field name="employee_ids" widget="many2many" mode="tree,form"/> </page> </notebook> @@ -393,8 +391,8 @@ <field name="type">tree</field> <field name="arch" type="xml"> <tree string="Job"> - <field name="name" /> - <field name="department_id" /> + <field name="name"/> + <field name="department_id"/> <field name="company_id" groups="base.group_multi_company"/> <field name="expected_employees"/> <field name="no_of_employee"/> @@ -438,8 +436,8 @@ <field name="arch" type="xml"> <form string="Job" version="7.0"> <group col="4"> - <field name="name" /> - <field name="department_id" /> + <field name="name"/> + <field name="department_id"/> </group> <label for="description"/> <field name="description"/> diff --git a/addons/mail/mail_thread_view.xml b/addons/mail/mail_thread_view.xml index 6bac1a49f2e..a32045efafc 100644 --- a/addons/mail/mail_thread_view.xml +++ b/addons/mail/mail_thread_view.xml @@ -5,7 +5,8 @@ <!-- toplevel menu --> <menuitem id="mail_feeds_main" name="Feeds" sequence="0" web_icon="static/src/img/feeds.png" - web_icon_hover="static/src/img/feeds-hover.png" /> + web_icon_hover="static/src/img/feeds-hover.png" + groups="base.group_user"/> <!-- left-side menu: Feeds !--> <menuitem id="mail_feeds" name="Feeds" parent="mail_feeds_main"/> diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml index 5ff8a996116..34445c48f8d 100644 --- a/addons/mail/static/src/xml/mail.xml +++ b/addons/mail/static/src/xml/mail.xml @@ -1,12 +1,23 @@ <?xml version="1.0" encoding="UTF-8"?> <template> - <div t-name="mail.Wall" class="oe_mail_wall"> + <div t-name="mail.Wall" class="oe_view_manager oe_mail_wall oe_view_manager_global"> <table class="oe_view_manager_header"> + <colgroup> + <col width="33%"/> + <col width="33%"/> + <col width="34%"/> + </colgroup> + <tbody> <tr class="oe_header_row"> - <td><h2 class="oe_view_title">All Feeds</h2></td> + <td colspan="2"> + <h2 class="oe_view_title"> + <span class="oe_view_title_text">All Feeds</span> + </h2> + </td> <td><div class="oe_view_manager_view_search" t-opentag="true"/></td> </tr> + </tbody> </table> <div class="oe_mail_wall_main"> <div class="oe_mail_wall_action"> diff --git a/addons/portal/__openerp__.py b/addons/portal/__openerp__.py index 035ee45b4df..aaf94526615 100644 --- a/addons/portal/__openerp__.py +++ b/addons/portal/__openerp__.py @@ -40,10 +40,14 @@ module 'share'. 'security/portal_security.xml', 'security/ir.model.access.csv', 'portal_view.xml', + 'portal_data.xml', 'res_user_view.xml', 'wizard/portal_wizard_view.xml', 'wizard/share_wizard_view.xml', ], + 'demo': [ + 'portal_demo.xml', + ], 'installable': True, } diff --git a/addons/portal/portal.py b/addons/portal/portal.py index 8f4ff66aef2..399377e8ccc 100644 --- a/addons/portal/portal.py +++ b/addons/portal/portal.py @@ -97,34 +97,9 @@ class portal(osv.osv): act_window_obj.write(cr, uid, action_ids, action_values, context) return True - - def do_create_menu(self, cr, uid, ids, context=None): - """ create a parent menu for the given portals """ - menu_obj = self.pool.get('ir.ui.menu') - ir_data = self.pool.get('ir.model.data') - menu_root = self._res_xml_id(cr, uid, 'portal', 'portal_menu') - - for p in self.browse(cr, uid, ids, context): - # create a menuitem under 'portal.portal_menu' - menu_values = { - 'name': _('%s Menu') % p.name, - 'parent_id': menu_root, - 'groups_id': [(6, 0, [p.group_id.id])], - } - menu_id = menu_obj.create(cr, uid, menu_values, context) - # set the parent_menu_id to item_id - self.write(cr, uid, [p.id], {'parent_menu_id': menu_id}, context) - menu_values.pop('parent_id') - menu_values.pop('groups_id') - menu_values.update({'model': 'ir.ui.menu', - 'module': 'portal', - 'res_id': menu_id, - 'noupdate': 'True'}) - data_id = ir_data.create(cr, uid, menu_values, context) - return True def _assign_menu(self, cr, uid, ids, context=None): - """ assign portal menu to users of portals (ids) """ + """ assign portal_menu_settings to users of portals (ids) """ user_obj = self.pool.get('res.users') for p in self.browse(cr, uid, ids, context): # user menu action = portal menu action if set in portal diff --git a/addons/portal/portal_data.xml b/addons/portal/portal_data.xml new file mode 100644 index 00000000000..2cba3a1945a --- /dev/null +++ b/addons/portal/portal_data.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data noupdate="1"> + + <record id="portal" model="res.portal"> + <field name="name">Portal</field> + <field name="group_id" ref="group_portal_member"/> + <field name="override_menu" eval="True"/> + <field name="parent_menu_id" ref="portal_members_root_menu"/> + </record> + + </data> +</openerp> diff --git a/addons/portal/portal_demo.xml b/addons/portal/portal_demo.xml new file mode 100644 index 00000000000..1776493eb32 --- /dev/null +++ b/addons/portal/portal_demo.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<openerp> + <data> + + <record id="portal_demo_user" model="res.users"> + <field name="name">Demo Portal User</field> + <field name="login">portal</field> + <field name="password">portal</field> + <field name="avatar">/9j/4AAQSkZJRgABAQEASABIAAD/4RJ/RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAMAAAAcgEyAAIAAAAUAAAAfodpAAQAAAABAAAAkgAAANQAAABIAAAAAQAAAEgAAAABR0lNUCAyLjYuMTIAMjAxMjowNToyOSAxMjoxMjoyNgAABZAAAAcAAAAEMDIxMKAAAAcAAAAEMDEwMKABAAMAAAABAAEAAKACAAQAAAABAAAAlqADAAQAAAABAAAAlgAAAAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAABIgEbAAUAAAABAAABKgEoAAMAAAABAAIAAAIBAAQAAAABAAABMgICAAQAAAABAAARRQAAAAAAAABIAAAAAQAAAEgAAAAB/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACWAJYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCp9tT/AJ9lpftUROfs6j8BVEkggAZzXN+JtXeAmyiO3gGQ9zntXOlc2LGt+IlmLW2nW6LyQ85Ayf8Ad/xrlXTc5LyAtnLHr/OqjSlzy7Y9zShGznIxjuau1hXuXAQowkig46VXYgMffqaQDy17EnvinpGXDYXJCknHakMhDlicD6CnfcA+XFdf4I8Ow6v9rnm5WLau33OTn9K7FPCOnxEbYR05JwSaynWjF2ZrChKaujx7d6/qKsW975LLvBKKe3avUL/wRpV0rYjMbnowPINeda74futDuNkvzwv9yQdD7expwqxnognRlDUsrL55LLkgdqnsVR3PmDjNYum3fkvsY9Tge4rSSXYj4+8TV9TI2/Jsdy43deOa9fb7x+teH2ZJnijkkOXcAE9smvbyeTUTEx1A5pM8UqH+dZiJF4OPUUpOTmmKQGPrTu/FUgFD7Rk0UjEA4opiPNWU7cDrXmWsXZutSuJt2QznHbgcD9BXpsZDY9a8juQ3mtwSFJA/CtYFS2HpIoONuSenrU0Qd5ACAoHOAar26HfuatGBQASABVMSEK9T6Vu+GrQXtrrEITdL9iZ4/wDgDoxH5VkzQMtlFPg7ZHYfXGK3vB0hstQllP3fs8gI9cqT/wCy1nN+7oawXvJM3fhfOqrqsG4Bj5TAeo+YH+n5135IIryfwjLLpPipLeQECfMTD68j9cV6r0UCuOuvfudlB+5Yjk71ha5p8Wp2EtrKMBh8rd1bsa3D19ap3KrtLMwCjqT2rKLs7o2aurM8LuYZLO7khlXbJG5Vh7g1rQN5yCTHXk1d8b21t9tjvLSWORZQVl2MDhh0J+o/lWTo04dXtnbB/h969KL5o3PLnHlk0bVuUkvbQjAxKn8xXtp5NeJ2Vk5vrUZ585MD8RXtneokQHSlUkGk70Z54rMBwJ3/AI1JnmowpLufQZp8BBlwRnIqkDF6mik6Eiii4jzKKAQAnex57mvMb1JYr+eIRk7JXXdj0YivUQ28EVwWtJ5eq3Azwzlh+PNbR0LZkIkhPOEHp1JrVsbWS7mSCJSzMQOKzywBznjtXe+A7aPM1w4+ZRgE9hU1JcquVThzSsVNY09IoooI2UpasIgo/icqCx/M4/A1Qglm3tFZoSW6tnG5cFcD67sVcvrmO4SParOgLEKuSXdySf5kfifSq1lLdQaiLa2tzNqkpysZYBYxz1PT/JqVexo9zS1PQ9ditkvdtuZ4G879wDvXpx7gYHHtW9oPia+1Qobm3jVHHEiHv9Kxpp9Vt7j7OdRtnugceUqNjIbb97I/i4/XFR6FO8d0yiIx+ZIf3eOEkHVfy/lWdSL5feNac4uXunoEkyrGWrkdTs5NXuybq8ZLRTxEp6/h61015FI2lsU++FzXGXVrPdStGxdbZEEjYBxKcj5M/TNYUtzeo7Iq60fD/wDZk1haxQJOqbkZWBfcOefriuMsUJvAynBUhvwzg/zrtJrCO+09bRoofOWSNonhgK7MMdxyegK7eO5GfeuXubMad4jmtuQkb8f7pGR+hFdsbL3bnBNuS5mrG9pd3u1SzD9fPjA/76Fez5OTXjWnRRvfWDIMYuYz/wCPCvZCfmNKZkLSg9aTPNKCd341kMQkl8etTQ584D0qF1xJTlY7simIex+c+lFNH0opDPMGkYMF2nHrTP7I0a7ZJ7+zurmVkK4jkKoqg9cKQSev59KlfcnJGc1b0XUQI5/MhbfGjBffOP8A69VUbSujooKMpWkchr/hiws0S+0u5d7dn2tE5BK/Q/nwea29IhlstOKtuQHLNjqQKr6qklxeW8kwVUmcCOJVCgcjnjvyefet64yJDj7pI/LNQ5PlVzdU0puxqaHodlaWdu0kQN0EG5jztOOQPSlvtCtriYTwBobhekkZ2n86gS/IxzWhBeB8e9YOTvc2UFaxhtolyLnzZLqZzu3gAADd64A68DmtXTdNjtdrsgO05BPJz61qLIr9ajuJkiQbjtBIGfTNS6kpbgqcY7I0ktftNs0mAFx0J61zRtCs8kBxlTke4NT3viOxs0S2jnyOp3Nzj1+lUF1eK41a3jiy7tkNjnApuLWwJ9y4tiqDkAY9K4HxPbwp4tD4HMClj74I/kK9GupdqV5r4kIm18licCNRwf8Ae/xrXD35jHEq0CTSbmN9Y05BjBuoh7ffFeykZ+teGaQg/wCEh00g8fa4eP8AgYr3INk101EeeLjBNKx5FA5zTWrMBW+/7UJ1NIfvD3py9CaXUB2cDiikzkUUAeYfaVfKqckHnilhufKuFdecHnHpTBGquWHeo1i2E7epNatX0LTtqjodRnhvtEWGIxyygbgRCsbDBB28cZyo/wAmqihbiEOpyDyP8/XNZYfBwCQw9DSaJOzS3qu/76KXEgz95Typx69R/OsZ07I64VlJ2e5ohWjbB6VaglxiopMEgigDHIrBnQma8E+cc1adY54mjcAqwwQaxYZCD1ovdUmtYwILZ5XboR0B9z2FTy3ZbZof2XplnbsHZVD8FnPzH8aqltLsRAsU0auOQFOQM+9YMEV9qUplup4UPQB2yfoAOPzNPvtLaK28z7ZDkDBURk/1FacndjUFY2by7zEcnmvPNXJl1OZyTg42/gAP5g109pFJFpWZJvMOTgYxtHp1rm7ho5L5st8qELz9P8a1oqz0OLEO6sS6Rahdb0lhkFryEHJz/Gtez7gDzXkukyIdd0wZBP2uH/0MV6yRk1tM4iUdM0jE8e9N3HbQx4BrIY7kkU/imA8ZpwoEKSBRR+FFOwHkE9+QV8vBBFJb3U5yWUsp5zStarNHlOMcVPxCiRjGTWpRFHd+bKVC4amwyfYPEVrPnMd0PIk/3v4T/SrDR5dWAHFUNVEkkIjiBEoIeNh/Cw5Boeug07O5uzzeRLj+HtUkdyrjrTZFW9s4pwABLGrgD3Gf61jyLNbP8pyK5bJnbdo6FGyetXUClNvr1rl4dVMfDgj61q22sQtjLCpcWUpl+fS2uMYlMY9VHNVW0KBCGaaZyP7z5q8upQlcl1qtc6rbIjEyqPqaFcbaKGqSJaWrkH5QOlcSSHZmb7xOc+9aWsal9umCocRL09z61mooZhuPBrqpxsrnDVnzOyNLw4pOvaeQM4u4T/4+K9nA4rx/w5GU8R2WPu/aE/nXr6mie5kOOQOlHVaU9OPSmjmoYIcQOPenjtTCeQKdnmgBCeaKQmigDyzeiZ/hFJsVpA5bJxxSSoJDt6il8pQPfFalCs2DjNMYgEcZoTHJbrU1pZ3OoXIgtoy7n8h7k9hQxo0LOORNGtPNQo+04BOfl3HafxXB/GongE3bmtzVIVjkEcZOyMBFz6AYqjCnzc1xXu7nelZWMo6ej/KwqJ9AJOUcjNbhiHmdKkwR2p8zDlTMAaOIIy0ssjnoFDECoNStVi050RBk46dzmuglTc659azdRj8y3fjPNUpO+pLirHGOSX5BGPWmjcrDb09a65tCh1KNZA5ikIG5lGc/UVc0r4em+uzBFqkSu0bGISwkBmAztJBOOO/P0rojVi3bqck6Uopy6HPeHbrPiHTYyPma5jGf+BCvYwhzXnVr4Yv9D8Saabu0HltcLtljIdDzxyOnTvjpXpLxyQtskRkbGcMMGnNGN09hnPzfSkGSwNBPTHpSK1ZsaHMDuFO5yKQnLCn9xQAzoeaKG+9RTCx5foeh+IPEnm/2RYG4EJAkcyIgUnpyxGfwzXSXnwy1620yO5W7tZ71pNptI2wFHr5jEDPtj6EnivSbee301UhsbOK1tlYEpEgXPufU47mtOaJJUeMcpIv8+h/z7VdOUZp2Kqc0HqcbafDjSNN0qX+0S2pXzp/rA7RpGf8AZAIzzjk9cdBkiqkDW9pbmG1hjhjJyQgxk+/rXYtIzwBZDzjY31HBrg5sx3EqHgq7KcexqMXGyTQ8DUcpSjLcqagN7596oqNrc960ZkLjiqU0ZTtXKegNI5BNDcClAqGYkcChbldAbmoDF5sTjvVkL8nuabbr+9K+tAmNsEMfy4roNLU/2lbBTg78j8OazRb7GBArb0JN2pbv7iE/0qoLmqIxrS5aUn5DvEnmJoN9LG7I0a+ajKeQVYkVIklxdadoxEjbngVnJ5z8oz+pqPxnL9n8L3QBwZgsP4Hj+prVtbcLaWS4x5dqB+i/4V3T+I8qjpD5mbHKG+U8OGKke44qRfvGo71FTUbhB2bP5gH+tEe8dQSK4nWtJpnf7C8VKJYHIB9KUnBGKQEYyDxSZ5rVSTWhjKLjuBOTjvRQvPXrRTEW5L5mTY4zWppd01zZxNn5lZomz27j9QK5bzwWya2NDuA8E6j+CRWP5/8A1q58LJ89jqxcFyXNacATtg8OA4H6H+lcfq9uI9alx0kCyAemRj+Y/WutuOXRh1V2T8M5/oKwtdh23UFx/DsKN+B4/ma7qyvTZ5+Hly115lCK1BXpVbULddvFXEul7cVXuX83vXnHsIxmTbiqznmtKWHg1RK5JpovcauSAKt2kGZc4pkEG4Z960YFCGhiZKYBtrS0K32faZec8IP5/wBRWc0uK39HUDTw+fvuT/T+lb4ZXqHDjZWpNdznPHrf6BYxdnuufwVj/QV1Cj5EA/hgx/KuW8aAy3OmQry3mFgPc8f+zV1eMHA9Y1/8erpl8bOOC/dx+ZiXrA6tdEc/MB+goW4cDAqvdHGo3PP/AC0P86Fcd68ufxs9imvcXoiVpXDA9ifypJXkjw6DPqvr9KN4I6Ch/mWkm07ocoqSsyS3uY51LRtnHBU8FfqKKxLkSLLvjdo26bl64orpVZW1OSWHd9C990E1veF1ElnO2BzMB/Kiipw3xmmL/h/M0r5iiSEfwzx/kxUH+ZrP1UebpcmeoXdn6DP9KKK9H7LPJ2qRaOVSYt2p5cmiivMPcQMcrzUHlDIooqS0SRqEBAqYcAmiimSyJ3bBrq9OyulQ+uzP6UUV14X4mefj/hRzmoL9q8cafC33YlL/AFx0/lXYBQvPrIf0BH9BRRW32mc0fgj6fqzjJJN08sn952P607NFFeW9z2o7IlQ9BUmTj3ooqRlK5XkE/pRRRVok/9n/4Ql7aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnhtcD0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyc+CiAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3M8L3htcDpDcmVhdG9yVG9vbD4KICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDExLTA1LTExVDAxOjMxOjI1KzAyOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogIDx4bXA6TW9kaWZ5RGF0ZT4yMDExLTA1LTExVDAxOjMxOjI1KzAyOjAwPC94bXA6TW9kaWZ5RGF0ZT4KICA8eG1wOkNyZWF0ZURhdGU+MjAxMS0wNC0yN1QwMTozNzo0OCswMjowMDwveG1wOkNyZWF0ZURhdGU+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnhtcE1NPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vJz4KICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjlGNDk1OTlGNUQ3QkUwMTE4M0E2RkQ1MjM3ODdBREI1PC94bXBNTTpJbnN0YW5jZUlEPgogIDx4bXBNTTpEb2N1bWVudElEIHJkZjpyZXNvdXJjZT0neG1wLmRpZDoyMTUxMUFDRjU4NzBFMDExQjE4OEJBMDcwREM1NDg5MicgLz4KICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6MjE1MTFBQ0Y1ODcwRTAxMUIxODhCQTA3MERDNTQ4OTI8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICA8eG1wTU06SGlzdG9yeT4KICAgPHJkZjpTZXE+CiAgIDwvcmRmOlNlcT4KICA8L3htcE1NOkhpc3Rvcnk+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyc+CiAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnBob3Rvc2hvcD0naHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyc+CiAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICA8cGhvdG9zaG9wOklDQ1Byb2ZpbGU+c1JHQiBJRUM2MTk2Ni0yLjE8L3Bob3Rvc2hvcDpJQ0NQcm9maWxlPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiB4bWxuczp0aWZmPSdodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyc+CiAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgPHRpZmY6TmF0aXZlRGlnZXN0PjI1NiwyNTcsMjU4LDI1OSwyNjIsMjc0LDI3NywyODQsNTMwLDUzMSwyODIsMjgzLDI5NiwzMDEsMzE4LDMxOSw1MjksNTMyLDMwNiwyNzAsMjcxLDI3MiwzMDUsMzE1LDMzNDMyO0Q1MDVBNEM2MDlBQzIyNUVGMzcwM0UwMTE0NkQ4RTYzPC90aWZmOk5hdGl2ZURpZ2VzdD4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24geG1sbnM6ZXhpZj0naHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8nPgogIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNTA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zNzA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogIDxleGlmOk5hdGl2ZURpZ2VzdD4zNjg2NCw0MDk2MCw0MDk2MSwzNzEyMSwzNzEyMiw0MDk2Miw0MDk2MywzNzUxMCw0MDk2NCwzNjg2NywzNjg2OCwzMzQzNCwzMzQzNywzNDg1MCwzNDg1MiwzNDg1NSwzNDg1NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4MywzNzM4NCwzNzM4NSwzNzM4NiwzNzM5Niw0MTQ4Myw0MTQ4NCw0MTQ4Niw0MTQ4Nyw0MTQ4OCw0MTQ5Miw0MTQ5Myw0MTQ5NSw0MTcyOCw0MTcyOSw0MTczMCw0MTk4NSw0MTk4Niw0MTk4Nyw0MTk4OCw0MTk4OSw0MTk5MCw0MTk5MSw0MTk5Miw0MTk5Myw0MTk5NCw0MTk5NSw0MTk5Niw0MjAxNiwwLDIsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMjAsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMzA7MTM3NUU3MDc1MjVBMTE0RjBBRkNBNzg4RTM2QzAyN0I8L2V4aWY6TmF0aXZlRGlnZXN0PgogPC9yZGY6RGVzY3JpcHRpb24+Cgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSdyJz8+Cv/iDFhJQ0NfUFJPRklM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</field> + <!-- Avoid auto-including this demo user in any default group --> + <field name="groups_id" eval="[(5,)]"/> + <field name="partner_id" eval="ref('base.res_partner_agrolait')"/> + </record> + + <record id="portal" model="res.portal"> + <field name="users" eval="[(4,ref('portal_demo_user'))]"/> + </record> + + </data> +</openerp> diff --git a/addons/portal/portal_view.xml b/addons/portal/portal_view.xml index 123926d7c10..21641f45bc7 100644 --- a/addons/portal/portal_view.xml +++ b/addons/portal/portal_view.xml @@ -1,9 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> - <!-- menu Administration/Portals --> - <menuitem name="Portals" id="portal_menu" parent="base.menu_administration" - groups="group_portal_manager"/> <!-- menu Administration/Portals/Portals --> <record id="portal_list_action" model="ir.actions.act_window"> @@ -19,8 +16,6 @@ portal group). A portal menu, widgets and specific groups may be assigned to the portal's users. </field> </record> - <menuitem name="Portals" id="portal_list_menu" - parent="portal_menu" sequence="1" action="portal_list_action"/> <!-- portal tree view --> <record id="portal_list_view" model="ir.ui.view"> @@ -70,5 +65,42 @@ the portal's users. </page> </field> </record> + + <record id="company_news_feed" model="mail.group"> + <field name="name">Company's news feed</field> + </record> + + <record id="action_news" model="ir.actions.act_window"> + <field name="name">News</field> + <field name="res_model">mail.group</field> + <field name="res_id" ref="company_news_feed"/> + <field name="view_mode">form</field> + </record> + + + <!-- module's menu --> + <!-- menu Administration/Portals --> + <menuitem name="Portals Settings" id="portal_menu_settings" parent="base.menu_administration" + groups="group_portal_manager"/> + + <menuitem name="Portals" id="portal_list_menu" parent="portal_menu_settings" action="portal_list_action"/> + + <!-- root menu for portal members (chrooted in this menu) --> + <menuitem name="Portal Members Root Menu" id="portal_members_root_menu" parent="portal_menu_settings"/> + <menuitem name="Portal Member's Menu" id="menu_portal" parent="portal_members_root_menu"/> + <menuitem name="Our company" id="portal_company" + parent="menu_portal" sequence="10"/> + <menuitem name="News" id="portal_company_news" + parent="portal_company" sequence="10" action="action_news"/> + + <menuitem name="Orders" id="portal_orders" + parent="menu_portal" sequence="20"/> + <menuitem name="Invoices and Payments" id="portal_invoices_payements" + parent="menu_portal" sequence="30"/> + <menuitem name="Projects" id="portal_projects" + parent="menu_portal" sequence="40"/> + <menuitem name="After Sale Services" id="portal_after_sales" + parent="menu_portal" sequence="50"/> + </data> </openerp> diff --git a/addons/portal/security/ir.model.access.csv b/addons/portal/security/ir.model.access.csv index c132b0dfb68..b1975a3c8b2 100644 --- a/addons/portal/security/ir.model.access.csv +++ b/addons/portal/security/ir.model.access.csv @@ -1,5 +1,11 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_all,access.portal.all,model_res_portal,,1,0,0,0
-access_widget_all,access.portal.widget.all,model_res_portal_widget,,1,0,0,0
-access_manager,access.portal.manager,model_res_portal,group_portal_manager,1,1,1,1
-access_widget_manager,access.portal.widget.manager,model_res_portal_widget,group_portal_manager,1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_all,access.portal.all,model_res_portal,,1,0,0,0 +access_widget_all,access.portal.widget.all,model_res_portal_widget,,1,0,0,0 +access_manager,access.portal.manager,model_res_portal,group_portal_manager,1,1,1,1 +access_widget_manager,access.portal.widget.manager,model_res_portal_widget,group_portal_manager,1,1,1,1 +access_mail_message,mail.message,mail.model_mail_message,group_portal_member,1,0,1,1 +access_mail_message_all,mail.message.all,mail.model_mail_message,group_portal_member,1,0,0,0 +access_mail_thread,mail.thread,mail.model_mail_thread,group_portal_member,1,0,0,0 +access_mail_subscription,mail.subscription,mail.model_mail_subscription,group_portal_member,1,0,1,1 +access_mail_notification,mail.notification,mail.model_mail_notification,group_portal_member,1,0,1,0 +access_mail_group,mail.group,mail.model_mail_group,group_portal_member,1,0,0,0 diff --git a/addons/portal/security/portal_security.xml b/addons/portal/security/portal_security.xml index 0c0213ec56a..37e94581d77 100644 --- a/addons/portal/security/portal_security.xml +++ b/addons/portal/security/portal_security.xml @@ -1,17 +1,26 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> - <data noupdate="1"> - <record model="ir.module.category" id="module_category_portal"> + <data> + + <!-- Don't use any implied_ids here; this group behavior is particular --> + <record id="group_portal_member" model="res.groups"> + <field name="name">Portal Member</field> + <field name="comment">Portal members can access information provided by the portal menu and the others module it's linked with. Also, portal members are chrooted in a specific menu.</field> + </record> + + <record id="module_category_portal" model="ir.module.category"> <field name="name">Portal</field> <field name="parent_id" ref="base.module_category_tools"/> <field name="sequence">25</field> </record> + <!-- No implied ids with 'member' since this group is highly restrictive (chrooted menu) --> <record id="group_portal_officer" model="res.groups"> <field name="name">Officer</field> <field name="comment">Portal officers can create new portal users with the portal wizard.</field> <field name="category_id" ref="module_category_portal"/> </record> + <record id="group_portal_manager" model="res.groups"> <field name="name">Manager</field> <field name="comment">Portal managers have access to the portal definitions, and can easily configure the users, access rights and menus of portal users.</field> @@ -19,5 +28,6 @@ <field name="implied_ids" eval="[(4, ref('group_portal_officer'))]"/> <field name="users" eval="[(4, ref('base.user_root'))]"/> </record> + </data> </openerp> diff --git a/addons/portal/static/src/img/icon.png b/addons/portal/static/src/img/icon.png Binary files differnew file mode 100644 index 00000000000..ee901f47d2c --- /dev/null +++ b/addons/portal/static/src/img/icon.png diff --git a/addons/portal/wizard/portal_wizard.py b/addons/portal/wizard/portal_wizard.py index 5ce1ca2f114..374e264195a 100644 --- a/addons/portal/wizard/portal_wizard.py +++ b/addons/portal/wizard/portal_wizard.py @@ -91,12 +91,22 @@ class wizard(osv.osv_memory): def _default_user_ids(self, cr, uid, context): """ determine default user_ids from the active records """ def create_user_from_address(address): - return { # a user config based on a contact (address) - 'name': address.name, - 'user_email': extract_email(address.email), - 'lang': address.parent_id and address.parent_id.lang or 'en_US', - 'partner_id': address.parent_id and address.parent_id.id, - } + if isinstance(address, int): + res_partner_obj = self.pool.get('res.partner') + address = res_partner_obj.browse(cr, uid, address, context=context) + lang = address.id and address.lang or 'en_US' + partner_id = address.id + + else: + lang = address.parent_id and address.parent_id.lang or 'en_US' + partner_id = address.parent_id and address.parent_id.id + + return{ + 'name': address.name, + 'user_email': extract_email(address.email), + 'lang': lang, + 'partner_id': partner_id, + } user_ids = [] if context.get('active_model') == 'res.partner': @@ -107,6 +117,8 @@ class wizard(osv.osv_memory): # add one user per contact, or one user if no contact if p.child_ids: user_ids.extend(map(create_user_from_address, p.child_ids)) + elif p.is_company == False and p.customer == True: + user_ids.extend(map(create_user_from_address, [p.id])) else: user_ids.append({'lang': p.lang or 'en_US', 'parent_id': p.id}) @@ -148,6 +160,7 @@ class wizard(osv.osv_memory): 'share': True, 'action_id': wiz.portal_id.home_action_id and wiz.portal_id.home_action_id.id or False, 'partner_id': u.partner_id and u.partner_id.id, + 'groups_id': [(6, 0, [])], } for u in wiz.user_ids if u.user_email not in existing_logins ] portal_obj.write(cr, ROOT_UID, [wiz.portal_id.id], {'users': [(0, 0, data) for data in new_users_data]}, context0) diff --git a/addons/portal_claim/__init__.py b/addons/portal_claim/__init__.py new file mode 100644 index 00000000000..26c654db9dd --- /dev/null +++ b/addons/portal_claim/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + diff --git a/addons/portal_claim/__openerp__.py b/addons/portal_claim/__openerp__.py new file mode 100644 index 00000000000..9fba57ba9ac --- /dev/null +++ b/addons/portal_claim/__openerp__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + 'name': 'Portal Claim', + 'version': '0.1', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +This module adds claim menu and features to your portal if claim and portal are +installed. + """, + 'author': 'OpenERP SA', + 'depends': ['crm_claim','portal'], + 'data': [ + 'security/portal_security.xml', + 'portal_claim_view.xml', + "security/ir.model.access.csv", + ], + 'installable': True, + 'auto_install':True, + 'category':'Hidden', +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/portal_claim/portal_claim_view.xml b/addons/portal_claim/portal_claim_view.xml new file mode 100644 index 00000000000..86be0764d26 --- /dev/null +++ b/addons/portal_claim/portal_claim_view.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<openerp> + <data> + + <record id="crm_case_categ_claim0" model="ir.actions.act_window"> + <field name="name">Claims</field> + <field name="res_model">crm.claim</field> + <field name="view_type">form</field> + <field name="view_mode">tree,calendar,form</field> + <field name="view_id" ref="crm_claim.crm_case_claims_tree_view"/> + <field name="context">{"search_default_user_id":'', "stage_type":'claim'}</field> + <field name="search_view_id" ref="crm_claim.view_crm_case_claims_filter"/> + <field name="help">Record and track your customers' claims. Claims may be linked to a sales order or a lot. You can send emails with attachments and keep the full history for a claim (emails sent, intervention type and so on). Claims may automatically be linked to an email address using the mail gateway module.</field> + </record> + + <menuitem name="Claims" id="portal_after_sales_claims" parent="portal.portal_after_sales" + action="crm_case_categ_claim0" sequence="10"/> + + </data> +</openerp> diff --git a/addons/portal_claim/security/ir.model.access.csv b/addons/portal_claim/security/ir.model.access.csv new file mode 100644 index 00000000000..554c66cc998 --- /dev/null +++ b/addons/portal_claim/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_crm_claim,crm.claim,crm_claim.model_crm_claim,portal.group_portal_member,1,0,0,0 +access_crm_claim_stage,crm.claim.stage,crm_claim.model_crm_claim_stage,portal.group_portal_member,1,0,0,0 diff --git a/addons/portal_claim/security/portal_security.xml b/addons/portal_claim/security/portal_security.xml new file mode 100644 index 00000000000..feff94ed43c --- /dev/null +++ b/addons/portal_claim/security/portal_security.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data noupdate="1"> + + <record id="portal_stock_picking_user_rule" model="ir.rule"> + <field name="name">Personal Claims</field> + <field ref="crm_claim.model_crm_claim" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + </data> +</openerp> diff --git a/addons/portal_crm/__init__.py b/addons/portal_crm/__init__.py new file mode 100644 index 00000000000..6b791be9f25 --- /dev/null +++ b/addons/portal_crm/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +import wizard diff --git a/addons/portal_crm/__openerp__.py b/addons/portal_crm/__openerp__.py new file mode 100644 index 00000000000..044f3280ce3 --- /dev/null +++ b/addons/portal_crm/__openerp__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + 'name': 'Portal CRM', + 'version': '0.1', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +This module adds crm menu and features (contact form) to your portal if crm and +portal are installed. + """, + 'author': 'OpenERP SA', + 'depends': ['crm','portal'], + 'data': [ + 'security/ir.model.access.csv', + 'wizard/contact_view.xml', + ], + 'installable': True, + 'auto_install':True, + 'category':'Hidden', + +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/portal_crm/security/ir.model.access.csv b/addons/portal_crm/security/ir.model.access.csv new file mode 100644 index 00000000000..08145a00f54 --- /dev/null +++ b/addons/portal_crm/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink + diff --git a/addons/portal_crm/wizard/__init__.py b/addons/portal_crm/wizard/__init__.py new file mode 100644 index 00000000000..92b3ac62321 --- /dev/null +++ b/addons/portal_crm/wizard/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2011 OpenERP S.A (<http://www.openerp.com>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +import contact diff --git a/addons/portal_crm/wizard/contact.py b/addons/portal_crm/wizard/contact.py new file mode 100644 index 00000000000..be21decafa9 --- /dev/null +++ b/addons/portal_crm/wizard/contact.py @@ -0,0 +1,40 @@ +from openerp.osv import osv, fields + +class crm_contact_us(osv.TransientModel): + """ Create new leads through the "contact us" form """ + _name = 'portal_crm.crm_contact_us' + _description = 'Contact form for the portal' + _inherit = 'crm.lead' + + def create(self, cr, uid, values, context=None): + """ + Since they potentially sensitive, we don't want any user to be able to + read datas generated through this module. That's why we'll write those + information in the crm.lead table and leave blank entries in the + portal_crm.crm_contact_us table. This is why the create() method is + overridden. + """ + crm_lead = self.pool.get('crm.lead') + + """ + Because of the complex inheritance of the crm.lead model and the other + models implied (like mail.thread, among others, that performs a read + when its create() method is called (in method message_get_subscribers()), + it is quite complicated to set proper rights for this object. + Therefore, user #1 will perform the creation until a better workaround + is figured out. + """ + crm_lead.create(cr, 1, dict(values,user_id=False), context) + + """ Create an empty record in the portal_crm.crm_contact_us table """ + return super(crm_contact_us, self).create(cr, uid, {}) + + def submit(self, cr, uid, ids, context=None): + """ When the form is submitted, redirect the user to a "Thanks" message """ + return {'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'view_type': 'form', + 'res_model': self._name, + 'res_id': ids[0], + 'view_id': self.pool.get('ir.model.data').get_object_reference(cr, uid, 'portal_crm', 'wizard_contact_form_view_thanks')[1] + } diff --git a/addons/portal_crm/wizard/contact_view.xml b/addons/portal_crm/wizard/contact_view.xml new file mode 100644 index 00000000000..904326ea409 --- /dev/null +++ b/addons/portal_crm/wizard/contact_view.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<openerp> + <data> + + <!-- wizard form view --> + <record id="wizard_contact_form_view" model="ir.ui.view"> + <field name="name">Wizard form view</field> + <field name="model">portal_crm.crm_contact_us</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form string="Contact Us wizard view"> + <group col="2"> + <field name="contact_name" string="Name"/> + <field name="name" string="Company"/> + <field name="email_from"/> + <field name="phone"/> + <field name="description" string="Your question"/> + <label string=""/> + <button string="Submit" name="submit" type="object"/> + </group> + </form> + </field> + </record> + + <!-- wizard thanks message (shows after submitting the form) --> + <record id="wizard_contact_form_view_thanks" model="ir.ui.view"> + <field name="name">Wizard thanks message</field> + <field name="model">portal_crm.crm_contact_us</field> + <field name="type">form</field> + <!-- give it a low priority to ensure this won't be the default view --> + <field name="priority">99</field> + <field name="arch" type="xml"> + <form string="Thank you"> + <!-- + make sure there is at least one field in the view, + otherwise the orm will try to select all the model's + records and this will result in a permission denied error + --> + <field name="name" invisible="1"/> + <label string="Thank you for your interest, we'll respond to your request shortly."/> + </form> + </field> + </record> + + <!-- wizard action --> + <record id="action_wizard_contact_us" model="ir.actions.act_window"> + <field name="name">Contact Us</field> + <field name="res_model">portal_crm.crm_contact_us</field> + <field name="view_mode">form</field> + </record> + + <!-- attach it to the portal menu --> + <menuitem name="Contact" id="portal_company_contact" + parent="portal.portal_company" action="action_wizard_contact_us" sequence="30"/> + + </data> +</openerp> diff --git a/addons/portal_event/__init__.py b/addons/portal_event/__init__.py new file mode 100644 index 00000000000..26c654db9dd --- /dev/null +++ b/addons/portal_event/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + diff --git a/addons/portal_event/__openerp__.py b/addons/portal_event/__openerp__.py new file mode 100644 index 00000000000..865f18604d6 --- /dev/null +++ b/addons/portal_event/__openerp__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + 'name': 'Portal Event', + 'version': '0.1', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +This module adds event menu and features to your portal if event and portal are +installed. + """, + 'author': 'OpenERP SA', + 'depends': ['event','portal'], + 'data': [ + 'security/portal_security.xml', + 'portal_event_view.xml', + 'security/ir.model.access.csv', + ], + 'installable': True, + 'auto_install':True, + 'category':'Hidden', +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/portal_event/portal_event_view.xml b/addons/portal_event/portal_event_view.xml new file mode 100644 index 00000000000..70bb408b32d --- /dev/null +++ b/addons/portal_event/portal_event_view.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <menuitem name="Events" id="portal_company_events" parent="portal.portal_company" + action="event.action_event_view" sequence="40"/> + + </data> +</openerp> diff --git a/addons/portal_event/security/ir.model.access.csv b/addons/portal_event/security/ir.model.access.csv new file mode 100644 index 00000000000..b418acbb9c4 --- /dev/null +++ b/addons/portal_event/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_event,event,event.model_event_event,portal.group_portal_member,1,0,0,0
+access_registration,registration,event.model_event_registration,portal.group_portal_member,1,0,0,0
diff --git a/addons/portal_event/security/portal_security.xml b/addons/portal_event/security/portal_security.xml new file mode 100644 index 00000000000..82044fb8b11 --- /dev/null +++ b/addons/portal_event/security/portal_security.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <record id="portal_event_rule" model="ir.rule"> + <field name="name">Personal Events</field> + <field ref="event.model_event_event" name="model_id"/> + <field name="domain_force">[]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + <record id="portal_registration_rule" model="ir.rule"> + <field name="name">Personal Registrations</field> + <field ref="event.model_event_registration" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + </data> +</openerp> diff --git a/addons/portal_hr_recruitment/__init__.py b/addons/portal_hr_recruitment/__init__.py new file mode 100644 index 00000000000..26c654db9dd --- /dev/null +++ b/addons/portal_hr_recruitment/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + diff --git a/addons/portal_hr_recruitment/__openerp__.py b/addons/portal_hr_recruitment/__openerp__.py new file mode 100644 index 00000000000..015e76d3d06 --- /dev/null +++ b/addons/portal_hr_recruitment/__openerp__.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + 'name': 'Portal Jobs', + 'version': '0.1', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +This module adds applications menu and features to your portal if hr and portal +are installed. + """, + 'author': 'OpenERP SA', + 'depends': ['hr','portal'], + 'data': [ + 'portal_jobs_view.xml', + 'security/ir.model.access.csv', + ], + 'installable': True, + 'auto_install':True, + 'category':'Hidden', +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/portal_hr_recruitment/portal_jobs_view.xml b/addons/portal_hr_recruitment/portal_jobs_view.xml new file mode 100644 index 00000000000..30976fc1954 --- /dev/null +++ b/addons/portal_hr_recruitment/portal_jobs_view.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <menuitem name="Jobs" id="portal_company_jobs" + parent="portal.portal_company" action="hr.action_hr_job" + sequence="20"/> + + </data> +</openerp> diff --git a/addons/portal_hr_recruitment/security/ir.model.access.csv b/addons/portal_hr_recruitment/security/ir.model.access.csv new file mode 100644 index 00000000000..0725d1e41eb --- /dev/null +++ b/addons/portal_hr_recruitment/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_job,job,hr.model_hr_job,portal.group_portal_member,1,0,0,0 +access_hr_department_employee,hr_department_employee,hr.model_hr_department,portal.group_portal_member,1,0,0,0 diff --git a/addons/portal_project/__init__.py b/addons/portal_project/__init__.py new file mode 100644 index 00000000000..26c654db9dd --- /dev/null +++ b/addons/portal_project/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + diff --git a/addons/portal_project/__openerp__.py b/addons/portal_project/__openerp__.py new file mode 100644 index 00000000000..f90c0cf9df2 --- /dev/null +++ b/addons/portal_project/__openerp__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + 'name': 'Portal Issue', + 'version': '0.1', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +This module adds project menu and features (tasks) to your portal if project +and portal are installed. + """, + 'author': 'OpenERP SA', + 'depends': ['project','portal'], + 'data': [ + 'security/portal_security.xml', + 'security/ir.model.access.csv', + 'portal_project_view.xml', + ], + 'installable': True, + 'auto_install':True, + 'category':'Hidden', +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/portal_project/portal_project_view.xml b/addons/portal_project/portal_project_view.xml new file mode 100644 index 00000000000..51f6683382a --- /dev/null +++ b/addons/portal_project/portal_project_view.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <menuitem name="Tasks" id="portal_services_tasks" parent="portal.portal_projects" + action="project.action_view_task" sequence="20"/> + + </data> +</openerp> diff --git a/addons/portal_project/security/ir.model.access.csv b/addons/portal_project/security/ir.model.access.csv new file mode 100644 index 00000000000..212230634c3 --- /dev/null +++ b/addons/portal_project/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_task,tasks,project.model_project_task,portal.group_portal_member,1,0,0,0 +access_task_type,task_type,project.model_project_task_type,portal.group_portal_member,1,0,0,0 +access_task_work,task_work,project.model_project_task_work,portal.group_portal_member,1,0,0,0 diff --git a/addons/portal_project/security/portal_security.xml b/addons/portal_project/security/portal_security.xml new file mode 100644 index 00000000000..f9983861c68 --- /dev/null +++ b/addons/portal_project/security/portal_security.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data noupdate="1"> + + <record id="portal_task_rule" model="ir.rule"> + <field name="name">Personal Task</field> + <field ref="project.model_project_task" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + </data> +</openerp> diff --git a/addons/portal_project_issue/__init__.py b/addons/portal_project_issue/__init__.py new file mode 100644 index 00000000000..26c654db9dd --- /dev/null +++ b/addons/portal_project_issue/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + diff --git a/addons/portal_project_issue/__openerp__.py b/addons/portal_project_issue/__openerp__.py new file mode 100644 index 00000000000..d1be2ec604d --- /dev/null +++ b/addons/portal_project_issue/__openerp__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + 'name': 'Portal Issue', + 'version': '0.1', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +This module adds issue menu and features to your portal if project_issue and +portal are installed. + """, + 'author': 'OpenERP SA', + 'depends': ['project_issue','portal'], + 'data': [ + 'security/portal_security.xml', + 'security/ir.model.access.csv', + 'portal_project_issue_view.xml', + ], + 'installable': True, + 'auto_install':True, + 'category':'Hidden', +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/portal_project_issue/portal_project_issue_view.xml b/addons/portal_project_issue/portal_project_issue_view.xml new file mode 100644 index 00000000000..fdbf1037c20 --- /dev/null +++ b/addons/portal_project_issue/portal_project_issue_view.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <record id="project_issue_categ_act0" model="ir.actions.act_window"> + <field name="name">Issues</field> + <field name="res_model">project.issue</field> + <field name="view_type">form</field> + <field name="view_mode">kanban,tree,calendar</field> + <field name="view_id" eval="False"/> + <field name="domain" eval=""/> + <field name="context">{"search_default_user_id":'', "search_default_draft":'', "search_default_todo":''}</field> + <field name="search_view_id" ref="project_issue.view_project_issue_filter"/> + <field name="help">Issues such as system bugs, customer complaints, and material breakdowns are collected here. You can define the stages assigned when solving the project issue (analysis, development, done). With the mailgateway module, issues can be integrated through an email address (example: support@mycompany.com)</field> + </record> + + <menuitem name="Issues" id="portal_after_sales_issues" parent="portal.portal_projects" + action="project_issue_categ_act0" sequence="10"/> + + </data> +</openerp> diff --git a/addons/portal_project_issue/security/ir.model.access.csv b/addons/portal_project_issue/security/ir.model.access.csv new file mode 100644 index 00000000000..8ddfff0f398 --- /dev/null +++ b/addons/portal_project_issue/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_issues,project_issue,project_issue.model_project_issue,portal.group_portal_member,1,0,1,0 diff --git a/addons/portal_project_issue/security/portal_security.xml b/addons/portal_project_issue/security/portal_security.xml new file mode 100644 index 00000000000..1bae1ef8e8c --- /dev/null +++ b/addons/portal_project_issue/security/portal_security.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data noupdate="1"> + + <record id="portal_issue_rule" model="ir.rule"> + <field name="name">Personal Issues</field> + <field ref="project_issue.model_project_issue" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + </data> +</openerp> diff --git a/addons/portal_sale/__init__.py b/addons/portal_sale/__init__.py new file mode 100644 index 00000000000..26c654db9dd --- /dev/null +++ b/addons/portal_sale/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + diff --git a/addons/portal_sale/__openerp__.py b/addons/portal_sale/__openerp__.py new file mode 100644 index 00000000000..f87bebd19fd --- /dev/null +++ b/addons/portal_sale/__openerp__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + 'name': 'Portal Sale', + 'version': '0.1', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +This module adds sale menu and features to your portal if sale and portal are +installed. + """, + 'author': 'OpenERP SA', + 'depends': ['sale','portal'], + 'data': [ + 'security/portal_security.xml', + 'portal_sale_view.xml', + "security/ir.model.access.csv", + ], + 'installable': True, + 'auto_install':True, + 'category':'Hidden', +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/portal_sale/portal_sale_view.xml b/addons/portal_sale/portal_sale_view.xml new file mode 100644 index 00000000000..a644be7be61 --- /dev/null +++ b/addons/portal_sale/portal_sale_view.xml @@ -0,0 +1,43 @@ +<?xml version="1.0"?> +<openerp> + <data> + + <record id="action_picking_tree" model="ir.actions.act_window"> + <field name="name">Delivery Orders</field> + <field name="res_model">stock.picking</field> + <field name="type">ir.actions.act_window</field> + <field name="view_type">form</field> + <field name="view_mode">tree</field> + <field name="domain">[('type','=','out')]</field> + <field name="context">{'default_type': 'out', 'contact_display': 'partner_address'}</field> + <field name="search_view_id" ref="stock.view_picking_out_search"/> + <field name="help">This is the list of all delivery orders that have to be prepared, according to your different sales orders and your logistics rules.</field> + </record> + + <record id="product_normal_action" model="ir.actions.act_window"> + <field name="name">Products</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">product.product</field> + <field name="view_type">form</field> + <field name="view_mode">kanban,tree,form</field> + <field name="view_id" ref="product.product_kanban_view"/> + <field name="search_view_id" ref="product.product_search_form_view"/> + <field name="help">You must define a Product for everything you buy or sell. Products can be raw materials, stockable products, consumables or services. The Product form contains detailed information about your products related to procurement logistics, sales price, product category, suppliers and so on.</field> + </record> + + <menuitem name="Quotations" id="portal_quotations" parent="portal.portal_orders" + action="sale.action_order_tree5" sequence="10"/> + <menuitem name="Sales Orders" id="portal_sales_orders" parent="portal.portal_orders" + action="sale.action_order_form" sequence="20"/> + <menuitem name="Delivery Orders" id="portal_delivery" parent="portal.portal_orders" + action="action_picking_tree" sequence="30"/> + <menuitem name="Products" id="portal_products" parent="portal.portal_orders" + action="product_normal_action" sequence="40"/> + + <menuitem name="Invoice" id="portal_invoices" parent="portal.portal_invoices_payements" + action="account.action_invoice_tree1" sequence="10"/> + <menuitem name="Refund/Payments" id="portal_payments" parent="portal.portal_invoices_payements" + action="account_voucher.action_vendor_receipt" sequence="20"/> + + </data> +</openerp> diff --git a/addons/portal_sale/security/ir.model.access.csv b/addons/portal_sale/security/ir.model.access.csv new file mode 100644 index 00000000000..5a016f00a05 --- /dev/null +++ b/addons/portal_sale/security/ir.model.access.csv @@ -0,0 +1,32 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_sale_order,sale.order,sale.model_sale_order,portal.group_portal_member,1,0,0,0 +access_sale_order_line,sale.order.line,sale.model_sale_order_line,portal.group_portal_member,1,0,0,0 +access_stock_picking,stock.picking,stock.model_stock_picking,portal.group_portal_member,1,0,0,0 +access_stock_move,stock.move,stock.model_stock_move,portal.group_portal_member,1,0,0,0 +access_stock_warehouse_orderpoint,stock.warehouse.orderpoint,procurement.model_stock_warehouse_orderpoint,portal.group_portal_member,1,0,0,0 +access_account_invoice,account.invoice,account.model_account_invoice,portal.group_portal_member,1,0,0,0 +access_account_invoice_tax,account.invoice.tax,account.model_account_invoice_tax,portal.group_portal_member,1,0,0,0 +access_account_invoice_line,account.invoice.line,account.model_account_invoice_line,portal.group_portal_member,1,0,0,0 +access_account_journal,account.journal,account.model_account_journal,portal.group_portal_member,1,0,0,0 +access_account_voucher,account.voucher,account_voucher.model_account_voucher,portal.group_portal_member,1,0,0,0 +access_account_voucher_line,account.voucher.line,account_voucher.model_account_voucher_line,portal.group_portal_member,1,0,0,0 +access_account_move,account.move,account.model_account_move,portal.group_portal_member,1,0,0,0 +access_account_move_line,account.move.line,account.model_account_move_line,portal.group_portal_member,1,0,0,0 +access_account_move_reconcile,account.move.reconcile,account.model_account_move_reconcile,portal.group_portal_member,1,0,0,0 +access_account_fiscalyear,account.sequence.fiscalyear,account.model_account_sequence_fiscalyear,portal.group_portal_member,1,0,0,0 +access_sale_shop,sale.shop,sale.model_sale_shop,portal.group_portal_member,1,0,0,0 +access_product_list,product.pricelist,product.model_product_pricelist,portal.group_portal_member,1,0,0,0 +access_product,product.product,product.model_product_product,portal.group_portal_member,1,0,0,0 +access_res_partner,res.partner,base.model_res_partner,portal.group_portal_member,1,0,0,0 +access_product_uom,product.uom,product.model_product_uom,portal.group_portal_member,1,0,0,0 +access_account_tax,account.tax,account.model_account_tax,portal.group_portal_member,1,0,0,0 +access_mrp_property,mrp.property,procurement.model_mrp_property,portal.group_portal_member,1,0,0,0 +access_product_template,product.template,product.model_product_template,portal.group_portal_member,1,0,0,0 +access_stock_warehouse,stock.warehouse,stock.model_stock_warehouse,portal.group_portal_member,1,0,0,0 +access_stock_location,stock.location,stock.model_stock_location,portal.group_portal_member,1,0,0,0 +access_account_fiscalyear,account.fiscalyear,account.model_account_fiscalyear,portal.group_portal_member,1,0,0,0 +access_res_partner_category,res.partner.category,base.model_res_partner_category,portal.group_portal_member,1,0,0,0 +access_product_supplierinfo,product.supplierinfo,product.model_product_supplierinfo,portal.group_portal_member,1,0,0,0 +access_product_packaging,product.packaging,product.model_product_packaging,portal.group_portal_member,1,0,0,0 +access_account_period,account.period,account.model_account_period,portal.group_portal_member,1,0,0,0 +access_account_account,account.account,account.model_account_account,portal.group_portal_member,1,0,0,0 diff --git a/addons/portal_sale/security/portal_security.xml b/addons/portal_sale/security/portal_security.xml new file mode 100644 index 00000000000..43e6867dfd9 --- /dev/null +++ b/addons/portal_sale/security/portal_security.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data noupdate="1"> + + <!-- Sale Portal Access Rules --> + + <record id="portal_sale_order_user_rule" model="ir.rule"> + <field name="name">Personal Quotations/Sales Orders</field> + <field ref="sale.model_sale_order" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + <record id="portal_stock_picking_user_rule" model="ir.rule"> + <field name="name">Personal Delivery Orders</field> + <field ref="stock.model_stock_picking" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',[user.partner_id.id])]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + <record id="portal_account_invoice_user_rule" model="ir.rule"> + <field name="name">Personal Account Invoices</field> + <field ref="account.model_account_invoice" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + <record id="portal_personal_payment" model="ir.rule"> + <field name="name">Personal Payments</field> + <field ref="account_voucher.model_account_voucher" name="model_id"/> + <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + <record id="portal_personal_contact" model="ir.rule"> + <field name="name">Personal Contacts</field> + <field ref="base.model_res_partner" name="model_id"/> + <field name="domain_force">[('id','child_of',user.partner_id.id)]</field> + <field name="groups" eval="[(4, ref('portal.group_portal_member'))]"/> + </record> + + </data> +</openerp> diff --git a/addons/product/product.py b/addons/product/product.py index f81378be04e..a81074aa56e 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -298,7 +298,7 @@ class product_template(osv.osv): 'rental': fields.boolean('Can be Rent'), 'categ_id': fields.many2one('product.category','Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"), 'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Sale Price'), help="Base price for computing the customer price. Sometimes called the catalog price."), - 'standard_price': fields.float('Cost Price', required=True, digits_compute=dp.get_precision('Purchase Price'), help="Product's cost for accounting stock valuation. It is the base price for the supplier price."), + 'standard_price': fields.float('Cost Price', required=True, digits_compute=dp.get_precision('Purchase Price'), help="Product's cost for accounting stock valuation. It is the base price for the supplier price.", groups="base.group_user"), 'volume': fields.float('Volume', help="The volume in m3."), 'weight': fields.float('Gross Weight', digits_compute=dp.get_precision('Stock Weight'), help="The gross weight in Kg."), 'weight_net': fields.float('Net Weight', digits_compute=dp.get_precision('Stock Weight'), help="The net weight in Kg."), diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml index f02c4648c15..f4922292ff2 100644 --- a/addons/product/product_view.xml +++ b/addons/product/product_view.xml @@ -14,23 +14,23 @@ <filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/> <filter string="Products" icon="terp-accessories-archiver" domain="['|',('type','=','product'),('type','=','consu')]" help="Both stockable and consumable products"/> <filter string="To Sell" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/> - <filter name="filter_to_purchase" string="To Purchase" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]" /> + <filter name="filter_to_purchase" string="To Purchase" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/> <separator orientation="vertical"/> <field name="categ_id" widget="selection" operator="child_of"/> <group expand="0" string="Context..."> <field name="pricelist_id" widget="selection" context="{'pricelist': self}" groups="product.group_sale_pricelist"/> - <separator orientation="vertical" groups="base.group_multi_company" /> - <field name="company_id" widget="selection" groups="base.group_multi_company" /> + <separator orientation="vertical" groups="base.group_multi_company"/> + <field name="company_id" widget="selection" groups="base.group_multi_company"/> </group> <newline/> <group expand='0' string='Group by...'> <filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'categ_id'}"/> <separator orientation="vertical"/> - <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}" /> + <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}"/> <separator orientation="vertical"/> - <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}" /> + <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/> <separator orientation="vertical" groups="base.group_multi_company"/> - <filter string='Company' icon="terp-go-home" domain="[]" context="{'group_by' : 'company_id'}" groups="base.group_multi_company" /> + <filter string='Company' icon="terp-go-home" domain="[]" context="{'group_by' : 'company_id'}" groups="base.group_multi_company"/> </group> </search> @@ -60,6 +60,7 @@ </tree> </field> </record> + <record id="product_normal_form_view" model="ir.ui.view"> <field name="name">product.normal.form</field> <field name="model">product.product</field> @@ -68,34 +69,34 @@ <field name="arch" type="xml"> <form string="Product" layout="auto" version="7.0"> <sheet> - <field name="product_image" widget="image" class="oe_avatar oe_right" /> + <field name="product_image" widget="image" class="oe_avatar oe_right"/> <div class="oe_title"> <div class="oe_edit_only"> - <label for="name" string="Product Name" /> + <label for="name" string="Product Name"/> </div> <h1> <field name="name"/> </h1> - <label for="categ_id" class="oe_edit_only" /> - <h2><field name="categ_id" /></h2> + <label for="categ_id" class="oe_edit_only"/> + <h2><field name="categ_id"/></h2> </div> <notebook> <page string="Information"> <group> <group> <field name="default_code"/> - <field name="ean13" placeholder="5901234123457" /> - <field groups="product.group_product_variant" name="variants" /> + <field name="ean13" placeholder="5901234123457"/> + <field groups="product.group_product_variant" name="variants"/> </group> - <group> + <group groups="base.group_user"> <field name="sale_ok"/> <field name="purchase_ok"/> </group> <group string="Procurement"> <field name="type"/> <field name="procure_method"/> - <field name="supply_method"/> + <field name="supply_method" groups="base.group_user"/> </group> <group string="Prices"> <field name="list_price"/> @@ -126,7 +127,7 @@ </group> </page> - <page string="Procurement & Locations"> + <page string="Procurement & Locations" groups="base.group_user"> <group> <group name="delay" string="Delays"> <field name="sale_delay" attrs="{'readonly':[('sale_ok','=',0)]}"/> @@ -134,7 +135,7 @@ <field name="warranty"/> </group> <group name="store" string="Storage Localisation"> - <field name="loc_rack" attrs="{'readonly':[('type','=','service')]}" /> + <field name="loc_rack" attrs="{'readonly':[('type','=','service')]}"/> <field name="loc_row" attrs="{'readonly':[('type','=','service')]}"/> <field name="loc_case" attrs="{'readonly':[('type','=','service')]}"/> </group> @@ -145,11 +146,11 @@ </group> </page> - <page string="Suppliers"> + <page string="Suppliers" groups="base.group_user"> <field name="seller_ids" context="{'uom_id': uom_id}"/> </page> - <page string="Descriptions"> - <separator string="Internal Description"/> + <page string="Descriptions" groups="base.group_user"> + <separator string="Description"/> <field name="description"/> <separator string="Sale Description"/> <field name="description_sale" placeholder="This note will be displayed on quotations..."/> @@ -215,7 +216,8 @@ <t t-if="record.type.raw_value != 'service'"> <div>Stock: <field name="qty_available"/> on hand, <field name="virtual_available"/> available</div> <div t-if="record.list_price.raw_value != 0">Public Price: <field name="lst_price"/></div> - <div>Cost : <field name="standard_price"/></div> + <!-- TODO would deserve to be hidden at the field level --> + <div groups="base.group_user">Cost : <field name="standard_price"/></div> </t> <div class="oe_kanban_clear"/> </div> @@ -464,8 +466,8 @@ <field name="arch" type="xml"> <form string="Packaging" version="7.0"> <group> - <field name="name" /> - <field name="type" /> + <field name="name"/> + <field name="type"/> </group> </form> </field> diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 7d3f595e2c5..6662e46c79f 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -93,7 +93,7 @@ <group> <group string="Administration"> <field name="planned_hours" widget="float_time"/> - <field name="effective_hours" widget="float_time" /> + <field name="effective_hours" widget="float_time"/> <field name="resource_calendar_id"/> </group> <group string="Miscellaneous" name="misc"> @@ -136,10 +136,10 @@ </group> <newline /> <group expand="0" string="Group By..."> - <filter string="Manager" name="Manager" icon="terp-personal" domain = "[]" context="{'group_by':'user_id'}"/> - <filter string="Partner" name="Partner" icon="terp-partner" domain = "[]" context="{'group_by':'partner_id'}"/> + <filter string="Manager" name="Manager" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> + <filter string="Partner" name="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/> <separator orientation="vertical"/> - <filter string="Parent" name="Parent" help="Parent" icon="terp-folder-blue" domain = "[]" context="{'group_by':'parent_id'}"/> + <filter string="Parent" name="Parent" help="Parent" icon="terp-folder-blue" domain = "[]" context="{'group_by':'parent_id'}"/> </group> </search> </field> @@ -315,26 +315,28 @@ <field name="arch" type="xml"> <form string="Project" version="7.0"> <header> - <!-- - <button name="do_open" string="Start Task" type="object" - states="draft,pending"/> - <button name="do_draft" string="Draft" type="object" - states="cancel,done"/> - --> - <button name="%(action_project_task_reevaluate)d" string="Reactivate" type="action" - states="done,cancelled" context="{'button_reactivate':True}"/> - <button name="action_close" string="Done" type="object" - states="draft,open,pending"/> - <button name="do_pending" string="Pending" type="object" - states="open"/> - <button name="%(action_project_task_delegate)d" string="Delegate" type="action" - states="pending,open,draft" groups="project.group_delegate_task"/> - <button name="do_cancel" string="Cancel" type="object" - states="draft,open,pending" /> - <button name="stage_previous" string="Previous Stage" type="object" - states="open,pending" icon="gtk-go-back" attrs="{'invisible': [('stage_id','=', False)]}"/> - <button name="stage_next" string="Next Stage" type="object" - states="open,pending" icon="gtk-go-forward" attrs="{'invisible': [('stage_id','=', False)]}"/> + <span groups="base.group_user"> + <!-- + <button name="do_open" string="Start Task" type="object" + states="draft,pending"/> + <button name="do_draft" string="Draft" type="object" + states="cancel,done"/> + --> + <button name="%(action_project_task_reevaluate)d" string="Reactivate" type="action" + states="done,cancelled" context="{'button_reactivate':True}"/> + <button name="action_close" string="Done" type="object" + states="draft,open,pending"/> + <button name="do_pending" string="Pending" type="object" + states="open"/> + <button name="%(action_project_task_delegate)d" string="Delegate" type="action" + states="pending,open,draft" groups="project.group_delegate_task"/> + <button name="do_cancel" string="Cancel" type="object" + states="draft,open,pending"/> + <button name="stage_previous" string="Previous Stage" type="object" + states="open,pending" icon="gtk-go-back" attrs="{'invisible': [('stage_id','=', False)]}"/> + <button name="stage_next" string="Next Stage" type="object" + states="open,pending" icon="gtk-go-forward" attrs="{'invisible': [('stage_id','=', False)]}"/> + </span> <field name="stage_id" widget="statusbar"/> </header> <sheet string="Task"> @@ -363,7 +365,7 @@ </group> <notebook> <page string="Description"> - <field name="description" attrs="{'readonly':[('state','=','done')]}" placeholder="Add a Description..." /> + <field name="description" attrs="{'readonly':[('state','=','done')]}" placeholder="Add a Description..."/> <field name="work_ids" groups="project.group_tasks_work_on_tasks"> <tree string="Task Work" editable="top"> <field name="date"/> @@ -402,9 +404,9 @@ </page> <page string="Extra Info" attrs="{'readonly':[('state','=','done')]}"> <group col="4"> - <field name="priority"/> + <field name="priority" groups="base.group_user"/> <field name="sequence"/> - <field name="partner_id" /> + <field name="partner_id"/> <field name="state" groups="base.group_no_one"/> </group> </page> @@ -425,7 +427,7 @@ <field name="arch" type="xml"> <kanban default_group_by="stage_id" > <field name="color"/> - <field name="priority"/> + <field name="priority" groups="base.group_user"/> <field name="stage_id"/> <field name="user_id"/> <field name="user_email"/> diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 976a706ac54..2aa6d4e1bcd 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -241,7 +241,7 @@ class project_issue(base_stage, osv.osv): 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('object_id.model', '=', 'crm.project.bug')]"), 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority', select=True), 'version_id': fields.many2one('project.issue.version', 'Version'), - 'stage_id': fields.many2one ('project.task.type', 'Stages', + 'stage_id': fields.many2one ('project.task.type', 'Stage', domain="['|', ('project_ids', '=', project_id), ('case_default', '=', True)]"), 'project_id':fields.many2one('project.project', 'Project'), 'duration': fields.float('Duration'), diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml index 8f0f097cb87..34fea22f9b9 100644 --- a/addons/project_issue/project_issue_data.xml +++ b/addons/project_issue/project_issue_data.xml @@ -8,13 +8,13 @@ <record model="crm.case.categ" id="bug_categ"> <field name="name">Maintenance</field> <field name="section_id" ref="crm.section_sales_department"/> - <field name="object_id" search="[('model','=','project.issue')]" model="ir.model"/> + <field name="object_id" search="[('model','=','project.issue')]" model="ir.model"/> </record> <record model="crm.case.categ" id="feature_request_categ"> <field name="name">Feature Requests</field> <field name="section_id" ref="crm.section_sales_department"/> - <field name="object_id" search="[('model','=','project.issue')]" model="ir.model"/> + <field name="object_id" search="[('model','=','project.issue')]" model="ir.model"/> </record> <!-- Case type_id --> diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 0cbde2a2020..016c3f8d9d0 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -55,24 +55,26 @@ <field name="arch" type="xml"> <form version="7.0"> <header> - <button name="case_open" string="Open" type="object" - states="draft,pending"/> - <button name="case_close" string="Done" type="object" - states="draft,open,pending"/> - <button name="case_pending" string="Pending" type="object" - states="draft,open"/> - <button name="case_escalate" string="Escalate" type="object" - states="draft,open,pending"/> - <button name="case_reset" string="Reset to New" type="object" - states="cancelled,done"/> - <button name="stage_previous" string="Previous Stage" type="object" - states="open,pending" icon="gtk-go-back" - attrs="{'invisible': [('stage_id','=', False)]}"/> - <button name="stage_next" string="Next Stage" type="object" - states="open,pending" icon="gtk-go-forward" - attrs="{'invisible': [('stage_id','=', False)]}"/> - <button name="case_cancel" string="Cancel" type="object" - states="draft,open,pending"/> + <span groups="base.group_user"> + <button name="case_open" string="Open" type="object" + states="draft,pending"/> + <button name="case_close" string="Done" type="object" + states="draft,open,pending"/> + <button name="case_pending" string="Pending" type="object" + states="draft,open"/> + <button name="case_escalate" string="Escalate" type="object" + states="draft,open,pending"/> + <button name="case_reset" string="Reset to New" type="object" + states="cancelled,done"/> + <button name="stage_previous" string="Previous Stage" type="object" + states="open,pending" icon="gtk-go-back" + attrs="{'invisible': [('stage_id','=', False)]}"/> + <button name="stage_next" string="Next Stage" type="object" + states="open,pending" icon="gtk-go-forward" + attrs="{'invisible': [('stage_id','=', False)]}"/> + <button name="case_cancel" string="Cancel" type="object" + states="draft,open,pending"/> + </span> <field name="stage_id" widget="statusbar"/> </header> <sheet string="Issue"> @@ -86,7 +88,7 @@ <field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)"/> <field name="email_from"/> </group><group> - <field name="task_id" on_change="onchange_task_id(task_id)" /> + <field name="task_id" on_change="onchange_task_id(task_id)"/> <field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'project.issue')]"/> <field name="version_id" widget="selection"/> <field name="priority"/> @@ -94,7 +96,7 @@ <field name="state" groups="base.group_no_one"/> </group> </group> - <field name="description" placeholder="Add a description..." /> + <field name="description" placeholder="Add a description..."/> <notebook groups="base.group_no_one"> <page string="Extra Info"> @@ -133,8 +135,8 @@ <field name="create_date" groups="base.group_no_one"/> <field name="name"/> <field name="partner_id"/> - <field name="project_id" /> - <field name="priority" string="Priority"/> + <field name="project_id"/> + <field name="priority" string="Priority" groups="base.group_user"/> <field name="version_id" widget="selection"/> <field name="user_id"/> <field name="progress" widget="progressbar" attrs="{'invisible':[('task_id','=',False)]}"/> @@ -168,24 +170,24 @@ <newline/> <group expand="0" string="Group By..." > <filter string="Responsible" icon="terp-personal" - domain="[]" context="{'group_by':'user_id'}" /> + domain="[]" context="{'group_by':'user_id'}"/> <filter string="Partner" icon="terp-partner" domain="[]" - context="{'group_by':'partner_id'}" /> + context="{'group_by':'partner_id'}"/> <separator orientation="vertical"/> <filter string="Project" icon="terp-folder-violet" domain="[]" - context="{'group_by':'project_id'}" /> + context="{'group_by':'project_id'}"/> <filter string="Version" icon="terp-gtk-jump-to-rtl" - domain="[]" context="{'group_by':'version_id'}" /> + domain="[]" context="{'group_by':'version_id'}"/> <separator orientation="vertical"/> <filter string="Category" icon="terp-stock_symbol-selection" domain="[]" - context="{'group_by':'categ_id'}" /> + context="{'group_by':'categ_id'}"/> <filter string="Priority" icon="terp-rating-rated" domain="[]" - context="{'group_by':'priority'}" /> + context="{'group_by':'priority'}"/> <filter string="Stage" icon="terp-stage" domain="[]" - context="{'group_by':'stage_id'}" /> + context="{'group_by':'stage_id'}"/> <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" - context="{'group_by':'state'}" /> - <separator orientation="vertical" /> + context="{'group_by':'state'}"/> + <separator orientation="vertical"/> <filter string="Month" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}" help="Creation Month"/> </group> @@ -217,7 +219,7 @@ <kanban default_group_by="stage_id"> <field name="color"/> <field name="state" groups="base.group_no_one"/> - <field name="priority"/> + <field name="priority" groups="base.group_user"/> <field name="user_email"/> <field name="user_id"/> <templates> diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index 0238f28d4da..b83cd8b8d06 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -103,26 +103,28 @@ <field name="arch" type="xml"> <form string="Sales Order" version="7.0"> <header> - <button name="invoice_recreate" states="invoice_except" string="Recreate Invoice"/> - <button name="invoice_corrected" states="invoice_except" string="Ignore Exception"/> - <button name="ship_recreate" states="shipping_except" string="Recreate Delivery Order"/> - <button name="ship_corrected" states="shipping_except" string="Ignore Exception"/> - <button name="action_quotation_send" string="Send by Mail" type="object" states="draft" class="oe_highlight"/> - <button name="action_quotation_send" string="Send by Mail" type="object" states="sent"/> - <button name="manual_invoice" states="manual" string="Create Final Invoice" type="object" class="oe_highlight"/> - <button name="print_quotation" string="Send by Post" type="object" states="draft" class="oe_highlight"/> - <button name="print_quotation" string="Send by Post" type="object" states="sent"/> - <button name="action_button_confirm" states="draft" string="Confirm" type="object"/> - <button name="action_button_confirm" states="sent" string="Confirm" class="oe_highlight" type="object"/> - <button name="action_view_invoice" string="Open Invoice" type="object" - attrs="{'invisible': ['|','|',('state', '!=','progress'), ('invoiced', '=', True),('order_policy','=','picking')]}"/> - <button name="action_view_delivery" string="Open Delivery Order" type="object" - attrs="{'invisible': ['|','|','|',('picking_ids','=',False),('picking_ids','=',[]), ('state', 'not in', ('progress','manual')),('shipped','=',True)]}"/> - <button name="%(action_view_sale_advance_payment_inv)d" string="Advance Invoice" type="action" states="manual"/> - <button name="cancel" states="draft,sent" string="Cancel"/> - <button name="action_cancel" states="manual,progress" string="Cancel" type="object"/> - <button name="ship_cancel" states="shipping_except" string="Cancel"/> - <button name="invoice_cancel" states="invoice_except" string="Cancel"/> + <span groups="base.group_user"> + <button name="invoice_recreate" states="invoice_except" string="Recreate Invoice"/> + <button name="invoice_corrected" states="invoice_except" string="Ignore Exception"/> + <button name="ship_recreate" states="shipping_except" string="Recreate Delivery Order"/> + <button name="ship_corrected" states="shipping_except" string="Ignore Exception"/> + <button name="action_quotation_send" string="Send by Mail" type="object" states="draft" class="oe_highlight"/> + <button name="action_quotation_send" string="Send by Mail" type="object" states="sent"/> + <button name="manual_invoice" states="manual" string="Create Final Invoice" type="object" class="oe_highlight"/> + <button name="print_quotation" string="Send by Post" type="object" states="draft" class="oe_highlight"/> + <button name="print_quotation" string="Send by Post" type="object" states="sent"/> + <button name="action_button_confirm" states="draft" string="Confirm" type="object"/> + <button name="action_button_confirm" states="sent" string="Confirm" class="oe_highlight" type="object"/> + <button name="action_view_invoice" string="Open Invoice" type="object" + attrs="{'invisible': ['|','|',('state', '!=','progress'), ('invoiced', '=', True),('order_policy','=','picking')]}"/> + <button name="action_view_delivery" string="Open Delivery Order" type="object" + attrs="{'invisible': ['|','|','|',('picking_ids','=',False),('picking_ids','=',[]), ('state', 'not in', ('progress','manual')),('shipped','=',True)]}"/> + <button name="%(action_view_sale_advance_payment_inv)d" string="Advance Invoice" type="action" states="manual"/> + <button name="cancel" states="draft,sent" string="Cancel"/> + <button name="action_cancel" states="manual,progress" string="Cancel" type="object"/> + <button name="ship_cancel" states="shipping_except" string="Cancel"/> + <button name="invoice_cancel" states="invoice_except" string="Cancel"/> + </span> <field name="state" widget="statusbar" statusbar_visible="draft,sent,progress,invoiced,done" statusbar_colors='{"shipping_except":"red","invoice_except":"red","waiting_date":"blue"}'/> </header> <sheet> @@ -133,12 +135,14 @@ </h1> <group> <group> - <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}" /> + <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}"/> <field domain="[('parent_id','=',partner_id)]" name="partner_invoice_id" groups="sale.group_delivery_invoice_address" options='{"quick_create": false}'/> <field domain="[('parent_id','=',partner_id)]" name="partner_shipping_id" groups="sale.group_delivery_invoice_address" options='{"quick_create": false}'/> + <field domain="[('type','=','sale')]" name="pricelist_id" groups="product.group_sale_pricelist" on_change="onchange_pricelist_id(pricelist_id,order_line)"/> <field name="project_id" context="{'partner_id':partner_id, 'pricelist_id':pricelist_id, 'default_name':name}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/> - </group><group> + </group> + <group> <field name="date_order"/> <field name="shop_id" on_change="onchange_shop_id(shop_id)" widget="selection" groups="stock.group_locations"/> <field name="client_order_ref"/> @@ -156,6 +160,7 @@ <group> <field name="product_id" context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}" + groups="base.group_user" on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, True, parent.date_order, product_packaging, parent.fiscal_position, False, context)"/> <field name="name" placeholder="Product/Service characteristics"/> </group> @@ -196,7 +201,7 @@ <field name="address_allotment_id"/> </group> <separator string="Properties" colspan="2"/> - <field name="property_ids" colspan="4" nolabel="1" /> + <field name="property_ids" colspan="4" nolabel="1"/> <field name="notes" groups="base.group_sale_notes_subtotal" placeholder="Add a note on order line..."/> <div groups="base.group_no_one"> <separator colspan="4" string="Invoice Lines"/> @@ -207,7 +212,7 @@ </group> </form> <tree string="Sales Order Lines"> - <field name="sequence" /> + <field name="sequence"/> <field name="name"/> <field name="product_uom_qty" string="Quantity"/> <field name="product_uom" string="Unit of Measure" groups="product.group_uom"/> @@ -226,15 +231,15 @@ <separator string="Notes" class="oe_clear"/> <field name="note" placeholder="Add a global note on the sale order..."/> </page> - <page string="Other Information"> + <page string="Other Information" groups="base.group_user"> <group> <group name="logistics"> - <field name="incoterm" widget="selection"/> + <field name="incoterm" widget="selection" groups="base.group_user"/> <field name="picking_policy" required="True"/> <field name="order_policy" on_change="shipping_policy_change(order_policy)"/> <field name="invoice_quantity" invisible="True"/> </group> - <group> + <group groups="base.group_user"> <field name="user_id"/> <field groups="base.group_no_one" name="origin"/> </group> @@ -253,20 +258,20 @@ <separator string="Invoices"/> <field name="invoice_ids" context="{'form_view_ref':'account.invoice_form'}"> <tree string="Invoices" colors="blue:state == 'draft';black:state in ('proforma','proforma2','open');gray:state == 'cancel'"> - <field name="date_invoice" /> - <field name="number" /> - <field name="partner_id" /> - <field name="user_id" /> - <field name="date_due" /> - <field name="amount_total" /> - <field name="state" /> + <field name="date_invoice"/> + <field name="number"/> + <field name="partner_id"/> + <field name="user_id"/> + <field name="date_due"/> + <field name="amount_total"/> + <field name="state"/> </tree> </field> <separator string="Delivery Orders"/> <field name="picking_ids" context="{'default_type': 'out'}"> <tree colors="blue:state == 'draft';grey:state == 'cancel';red:state not in ('cancel', 'done') and min_date < current_date" string="Delivery Orders"> <field name="name"/> - <field name="partner_id" string="Customer" /> + <field name="partner_id" string="Customer"/> <field name="min_date"/> <field name="state"/> <button name="action_process" states="assigned" string="Deliver" type="object" icon="gtk-go-forward" context="{'default_type': 'out'}"/> @@ -363,7 +368,7 @@ <menuitem id="menu_sale_quotations" action="action_order_tree5" parent="base.menu_sales" - sequence="3" /> + sequence="3"/> <record id="action_order_tree" model="ir.actions.act_window"> <field name="name">Old Quotations</field> @@ -413,9 +418,11 @@ <field name="arch" type="xml"> <form string="Sales Order Lines" version="7.0"> <header> - <button name="button_cancel" string="Cancel" type="object" icon="gtk-cancel" states="confirmed,exception"/> - <button name="%(action_view_sale_order_line_make_invoice)d" string="Create Invoice" type="action" states="done" icon="gtk-go-forward" attrs="{'invisible': [('invoiced', '=', 1)]}"/> - <button name="button_done" string="Done" type="object" states="confirmed,exception" icon="gtk-go-forward"/> + <span groups="base.group_user"> + <button name="button_cancel" string="Cancel" type="object" icon="gtk-cancel" states="confirmed,exception"/> + <button name="%(action_view_sale_order_line_make_invoice)d" string="Create Invoice" type="action" states="done" icon="gtk-go-forward" attrs="{'invisible': [('invoiced', '=', 1)]}"/> + <button name="button_done" string="Done" type="object" states="confirmed,exception" icon="gtk-go-forward"/> + </span> <field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"exception":"red","cancel":"red"}'/> </header> <sheet> @@ -432,7 +439,8 @@ <field name="product_uom_qty" readonly="1" class="oe_inline"/> <field name="product_uom" groups="product.group_uom" class="oe_inline"/> </div> - </group><group> + </group> + <group> <field name="price_unit"/> <field name="discount" groups="sale.group_discount_per_so_line"/> <field name="price_subtotal" groups="base.group_sale_notes_subtotal"/> diff --git a/addons/sale_margin/sale_margin_view.xml b/addons/sale_margin/sale_margin_view.xml index f46b4e56ac7..c45cd228dec 100644 --- a/addons/sale_margin/sale_margin_view.xml +++ b/addons/sale_margin/sale_margin_view.xml @@ -6,7 +6,7 @@ <field name="name">sale.order.margin.view.form</field> <field name="type">form</field> <field name="model">sale.order</field> - <field name="inherit_id" ref="sale.view_order_form" /> + <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//group[@name='sale_total']" position="inside"> <field name="margin"/> @@ -18,10 +18,10 @@ <field name="name">sale.order.line.margin.view.form</field> <field name="type">form</field> <field name="model">sale.order</field> - <field name="inherit_id" ref="sale.view_order_form" /> + <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='order_line']/form//field[@name='price_unit']" position="after"> - <field name="purchase_price"/> + <field name="purchase_price" groups="base.group_user"/> </xpath> </field> </record> @@ -30,10 +30,10 @@ <field name="name">sale.order.line.tree.margin.view.form</field> <field name="type">form</field> <field name="model">sale.order</field> - <field name="inherit_id" ref="sale.view_order_form" /> + <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='order_line']/tree//field[@name='price_unit']" position="after"> - <field name="purchase_price"/> + <field name="purchase_price" groups="base.group_user"/> </xpath> </field> </record> @@ -42,10 +42,10 @@ <field name="name">sale.order.margin.view.tree</field> <field name="type">tree</field> <field name="model">sale.order</field> - <field name="inherit_id" ref="sale.view_order_tree" /> + <field name="inherit_id" ref="sale.view_order_tree"/> <field name="arch" type="xml"> <field name="state" position="after"> - <field name="margin"/> + <field name="margin" groups="base.group_user"/> </field> </field> </record> @@ -54,10 +54,10 @@ <field name="name">sale.order.margin.line.view.tree</field> <field name="type">tree</field> <field name="model">sale.order.line</field> - <field name="inherit_id" ref="sale.view_order_line_tree" /> + <field name="inherit_id" ref="sale.view_order_line_tree"/> <field name="arch" type="xml"> <field name="price_subtotal" position="after"> - <field name="margin"/> + <field name="margin" groups="base.group_user"/> </field> </field> </record> diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml index 09fa784e56a..e28eb0644d0 100644 --- a/addons/stock/product_view.xml +++ b/addons/stock/product_view.xml @@ -61,8 +61,8 @@ <field name="inherit_id" ref="product.product_normal_form_view"/> <field name="arch" type="xml"> <field name="standard_price" position="replace" version="7.0"> - <label string="Cost Price" for="standard_price" align="1.0"/> - <div> + <label string="Cost Price" for="standard_price" align="1.0" groups="base.group_user"/> + <div groups="base.group_user"> <field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}" nolabel="1"/> <button name="%(action_view_change_standard_price)d" string="Update" type="action" icon="gtk-execute" attrs="{'invisible':[('cost_method','<>','average')]}"/> @@ -106,12 +106,12 @@ <group string="Stock and Expected Variations"> <field name="qty_available"/> <field name="incoming_qty"/> - <label for="virtual_available" /> + <label for="virtual_available"/> <div> - <field name="virtual_available" class="oe_inline" /> + <field name="virtual_available" class="oe_inline"/> <button name="%(action_view_change_product_quantity)d" string="Update" attrs="{'invisible': [('type', '=', 'service')]}" - type="action" icon="gtk-execute" groups="stock.group_stock_manager,stock.group_stock_user" class="oe_inline" /> + type="action" icon="gtk-execute" groups="stock.group_stock_manager,stock.group_stock_user" class="oe_inline"/> </div> <field name="outgoing_qty"/> </group> @@ -175,14 +175,17 @@ <li t-if="record.type.raw_value != 'service'">Stock on hand: <field name="qty_available"/> <field name="uom_id"/></li> <li t-if="record.type.raw_value != 'service'">Stock available: <field name="virtual_available"/> <field name="uom_id"/></li> <li>Price: <field name="lst_price"></field></li> - <li>Cost: <field name="standard_price"></field></li> + <!-- TODO the 'groups' attribute doesn't work in kanban views --> + <li groups="base.group_user">Cost: <field name="standard_price"></field></li> </ul> - <a name="%(action_receive_move)d" type="action"> - <t t-if="record.reception_count.value">Receptions(<t t-esc="record.reception_count.value"/>)</t> - </a> - <a name="%(action_deliver_move)d" type="action"> - <t t-if="record.delivery_count.value">Deliveries(<t t-esc="record.delivery_count.value"/>)</t> - </a> + <div groups="base.group_user"> + <a name="%(action_receive_move)d" type="action"> + <t t-if="record.reception_count.value">Receptions(<t t-esc="record.reception_count.value"/>)</t> + </a> + <a name="%(action_deliver_move)d" type="action"> + <t t-if="record.delivery_count.value">Deliveries(<t t-esc="record.delivery_count.value"/>)</t> + </a> + </div> </div> </div> <script> diff --git a/addons/survey/__openerp__.py b/addons/survey/__openerp__.py index e4c83a37eee..90d7c2e469f 100644 --- a/addons/survey/__openerp__.py +++ b/addons/survey/__openerp__.py @@ -53,6 +53,7 @@ Partners are also sent mails with user name and password for the invitation of t 'test/survey_question_type.yml', 'test/survey_report.yml', ], + 'css': ['static/src/css/survey.css'], 'installable': True, 'auto_install': False, 'certificate' : '001131639736864143245', diff --git a/addons/survey/static/src/css/survey.css b/addons/survey/static/src/css/survey.css new file mode 100644 index 00000000000..0102dc1ade6 --- /dev/null +++ b/addons/survey/static/src/css/survey.css @@ -0,0 +1,37 @@ +.oe_module_survey{ + font-size: 12px; + border-style:dotted; + border-radius: 15px; + text-align: left; + height:145px; + width:220px; +} + +.oe_survey_title{ + font-size: 15px; + height: auto; + font-size: 16px; + font-weight:bold; + width: 205px; +} + +.oe_survey_responsible{ + height: auto; + width: 200px; + font-size: 14px; +} + +.oe_survey_start_date{ + height: auto; + width: 200px; + font-size: 14px; +} + +.oe_survey_fill{ + align:right; + padding: 1px 165px; +} + +.oe_survey_rate{ + font-size: 14px; +} diff --git a/addons/survey/survey.py b/addons/survey/survey.py index 71f6686a67f..40f13b226f8 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -142,6 +142,17 @@ class survey(osv.osv): 'nodestroy':True, } return report + + def fill_survey(self, cr, uid, ids, context=None): + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'survey.question.wiz', + 'type': 'ir.actions.act_window', + 'target': 'new', + 'context': {'survey_id': ids[0]} + } + survey() class survey_history(osv.osv): diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml index c50613f466b..b5015d0950b 100644 --- a/addons/survey/survey_view.xml +++ b/addons/survey/survey_view.xml @@ -277,13 +277,53 @@ </search> </field> </record> + + <record model="ir.ui.view" id="view_survey_kanban"> + <field name="name">event.survey.kanban</field> + <field name="model">survey</field> + <field name="type">kanban</field> + <field name="arch" type="xml"> + <kanban> + <field name="title"/> + <field name="date_open"/> + <templates> + <t t-name="kanban-box"> + <div class="oe_module_survey"> + <a class="oe_module_icon"> + <div class="oe_survey_title"><t t-esc="record.title.raw_value.toString()"/></div><br/> + <div class="oe_survey_responsible"> + <t t-if="record.responsible_id.raw_value">By: <field name="responsible_id"/></t> + </div><br/> + <div class="oe_survey_start_date"> + Open From: + <t t-if="record.date_open.raw_value"> + <t t-esc="record.date_open.raw_value.getDate()"/> + <t t-esc="record.date_open.raw_value.toString('MMM')"/>, + <t t-esc="record.date_open.raw_value.getFullYear()"/> + </t> + </div><br/> + <div class="oe_survey_rate"> + Rate: + <div class="oe_survey_fill" > + <button type="object" name="fill_survey" class=""> + <span>Fill</span> + </button> + </div> + </div> + </a> + </div> + </t> + </templates> + </kanban> + </field> + </record> <record model="ir.actions.act_window" id="action_survey_form1"> <field name="name">Surveys</field> <field name="res_model">survey</field> <field name="view_type">form</field> - <field name="view_mode">tree,form</field> - <field name="view_id" ref="survey_tree"></field> + <field name="view_mode">kanban,tree,form</field> + <field name="view_id" ref="view_survey_kanban"></field> <field name="search_view_id" ref="survey_search"/> <field name="help">You can create survey for different purposes: recruitment interviews, employee's periodical evaluations, marketing campaigns, etc. A survey is made of pages containing questions of several types: text, multiple choices, etc. You can edit survey manually or click on the 'Edit Survey' for a WYSIWYG interface.</field> </record> |
