[MERGE] Merge with lp:openobject-addons
bzr revid: sbh@tinyerp.com-20120524092830-gim1851y6ie58ge4
This commit is contained in:
commit
7090589834
|
@ -23,7 +23,6 @@
|
|||
"version" : "1.1",
|
||||
"author" : "OpenERP SA",
|
||||
"category": 'Accounting & Finance',
|
||||
'complexity': "easy",
|
||||
"description": """
|
||||
Accounting and Financial Management.
|
||||
====================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
"author" : "OpenERP SA",
|
||||
"category": 'Accounting & Finance',
|
||||
"sequence": 10,
|
||||
'complexity': "normal",
|
||||
"description": """
|
||||
Accounting Access Rights.
|
||||
=========================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Contracts Management',
|
||||
'version': '1.1',
|
||||
'category': 'Sales Management',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This module is for modifying account analytic view to show important data to project manager of services companies.
|
||||
===================================================================================================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name' : 'Account Analytic Defaults',
|
||||
'version' : '1.0',
|
||||
"category": 'Accounting & Finance',
|
||||
'complexity': "normal",
|
||||
'description': """Set default values for your analytic accounts
|
||||
Allows to automatically select analytic accounts based on criterions:
|
||||
=====================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Multiple Analytic Plans',
|
||||
'version': '1.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This module allows to use several analytic plans, according to the general journal.
|
||||
===================================================================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
"version": "1.2",
|
||||
"author": "OpenERP SA, Veritos",
|
||||
"website": "http://tinyerp.com - http://veritos.nl",
|
||||
'complexity': "normal",
|
||||
"description": """
|
||||
This module supports the Anglo-Saxon accounting methodology by changing the accounting logic with stock transactions.
|
||||
=====================================================================================================================
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
],
|
||||
"auto_install": False,
|
||||
"installable": True,
|
||||
"application": True,
|
||||
"application": False,
|
||||
}
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Budgets Management',
|
||||
'version': '1.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This module allows accountants to manage analytic and crossovered budgets.
|
||||
==========================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
"version" : "1.1",
|
||||
"author" : "OpenERP SA",
|
||||
"category": 'Accounting & Finance',
|
||||
'complexity': "normal",
|
||||
"description": """
|
||||
Allows cancelling accounting entries.
|
||||
=====================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
"version": '2.1',
|
||||
"author": 'Noviat',
|
||||
"category": 'Accounting & Finance',
|
||||
"complexity": "normal",
|
||||
"description": '''
|
||||
Module to import CODA bank statements.
|
||||
======================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Followup Management',
|
||||
'version': '1.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
Module to automate letters for unpaid invoices, with multi-level recalls.
|
||||
==========================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Invoice Layouts',
|
||||
'version': '1.0',
|
||||
"category": 'Accounting & Finance',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module provides some features to improve the layout of the invoices.
|
||||
=========================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
"version": "1.1",
|
||||
"author": "OpenERP SA",
|
||||
"category": "Accounting & Finance",
|
||||
'complexity': "easy",
|
||||
"description": """
|
||||
Module to manage the payment of your supplier invoices.
|
||||
=======================================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Entries Sequence Numbering',
|
||||
'version': '1.1',
|
||||
"category": 'Accounting & Finance',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module maintains internal sequence number for accounting entries.
|
||||
======================================================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
"name" : "eInvoicing & Payments",
|
||||
"version" : "1.0",
|
||||
"author" : 'OpenERP SA',
|
||||
'complexity': "normal",
|
||||
"description": """
|
||||
Account Voucher module includes all the basic requirements of Voucher Entries for Bank, Cash, Sales, Purchase, Expanse, Contra, etc.
|
||||
====================================================================================================================================
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
'name': 'Database Anonymization',
|
||||
'version': '1.0',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module allows you to anonymize a database.
|
||||
===============================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Associations Management',
|
||||
'version': '0.1',
|
||||
'category': 'Specific Industry Applications',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This module is to configure modules related to an association.
|
||||
==============================================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
"name": "Calendar Layer",
|
||||
"version": "1.0",
|
||||
"depends": ["base", "mail"],
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This is a full-featured calendar system.
|
||||
========================================
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
"maintainer" : "OpenERP SA",
|
||||
"website" : "http://www.openerp.com",
|
||||
"category" : "Tools",
|
||||
'complexity': "easy",
|
||||
"description": """
|
||||
Replaces cleartext passwords in the database with a secure hash
|
||||
===============================================================
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
'name': 'IBAN Bank Accounts',
|
||||
'version': '1.0',
|
||||
"category": 'Hidden/Dependency',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module installs the base for IBAN (International Bank Account Number) bank accounts and checks for its validity.
|
||||
=====================================================================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'OpenOffice Report Designer',
|
||||
'version': '0.1',
|
||||
'category': 'Reporting',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This module is used along with OpenERP OpenOffice Plugin.
|
||||
=========================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Initial Setup Tools',
|
||||
'version': '1.0',
|
||||
'category': 'Hidden',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module helps to configure the system at the installation of a new database.
|
||||
================================================================================
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<menuitem id="synch_config" name="Synchronization" parent="base.menu_config" sequence="60"/>
|
||||
<record id="view_transfer_line_tree" model="ir.ui.view">
|
||||
<field name="name">base.synchro.obj.line.tree</field>
|
||||
<field name="model">base.synchro.obj.line</field>
|
||||
|
@ -197,7 +196,7 @@
|
|||
<field name="view_type">form</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="action_base_synchro_server_tree" id="synchro_server_tree_menu_id" parent="base_synchro.synch_config"/>
|
||||
<menuitem action="action_base_synchro_server_tree" id="synchro_server_tree_menu_id" parent="base_synchro.next_id_62"/>
|
||||
|
||||
<!--view_base_synchro_server end -->
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
"version": "1.0",
|
||||
"depends": ["base"],
|
||||
"category" : "Hidden/Dependency",
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Common base for tools modules.
|
||||
==============================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'VAT Number Validation',
|
||||
'version': '1.0',
|
||||
"category": 'Hidden/Dependency',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
VAT validation for Partners' VAT numbers
|
||||
========================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Dashboards',
|
||||
'version': '1.0',
|
||||
'category': 'Hidden',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
Lets the user create a custom dashboard.
|
||||
========================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
{
|
||||
"name": "Share Calendar using CalDAV",
|
||||
"version": "1.1",
|
||||
'complexity': "normal",
|
||||
"depends": [
|
||||
"base",
|
||||
"document_webdav",
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
'version': '1.0',
|
||||
'category': 'Customer Relationship Management',
|
||||
"sequence": 2,
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
The generic OpenERP Customer Relationship Management.
|
||||
=====================================================
|
||||
|
|
|
@ -252,65 +252,63 @@
|
|||
</ul>
|
||||
</t>
|
||||
<t t-name="kanban-box">
|
||||
<t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="border">oe_kanban_color_red</t>
|
||||
<div t-attf-class="#{kanban_color(record.color.raw_value)} #{border || ''}">
|
||||
<div class="oe_kanban_box oe_kanban_color_border">
|
||||
<table class="oe_kanban_table oe_kanban_box_header oe_kanban_color_bgdark oe_kanban_color_border oe_kanban_draghandle">
|
||||
<tr>
|
||||
<td align="left" valign="middle" width="16">
|
||||
<a t-if="record.priority.raw_value == 1" icon="star-on" type="object" name="set_normal_priority"/>
|
||||
<a t-if="record.priority.raw_value != 1" icon="star-off" type="object" name="set_high_priority" style="opacity:0.6; filter:alpha(opacity=60);"/>
|
||||
</td>
|
||||
<td align="left" valign="middle" class="oe_kanban_title" tooltip="lead_details">
|
||||
<field name="partner_id"/>
|
||||
<t t-if="record.planned_revenue.raw_value">
|
||||
- <t t-esc="Math.round(record.planned_revenue.value)"/>
|
||||
<field name="company_currency"/>
|
||||
</t>
|
||||
</td>
|
||||
<td valign="top" width="22">
|
||||
<img t-att-src="kanban_image('res.users', 'avatar', record.user_id.raw_value[0])" t-att-title="record.user_id.value"
|
||||
width="22" height="22" class="oe_kanban_gravatar"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="oe_kanban_box_content oe_kanban_color_bglight oe_kanban_box_show_onclick_trigger">
|
||||
<div>
|
||||
<b>
|
||||
<a t-if="record.partner_address_email.raw_value" t-attf-href="mailto:#{record.partner_address_email.raw_value}">
|
||||
<field name="partner_address_name"/>
|
||||
</a>
|
||||
<field t-if="!record.partner_address_email.raw_value" name="partner_address_name"/>
|
||||
</b>
|
||||
</div>
|
||||
<div>
|
||||
<field name="name"/>
|
||||
</div>
|
||||
<div style="padding-left: 0.5em">
|
||||
<i><field name="date_action"/><t t-if="record.date_action.raw_value"> : </t><field name="title_action"/></i>
|
||||
</div>
|
||||
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card">
|
||||
<a class="oe_kanban_menuaction oe_i">B</a>
|
||||
<ul class="oe_kanban_menu">
|
||||
<li><a type="edit" >Edit...</a></li>
|
||||
<li><a type="delete">Delete</a></li>
|
||||
<li><a name="%(mail.action_email_compose_message_wizard)d" type="action">Send New Email</a></li>
|
||||
<li><a name="%(opportunity2phonecall_act)d" type="action">Log Call</a></li>
|
||||
<li><a name="action_makeMeeting" type="object">Schedule Meeting</a></li>
|
||||
<li><a name="%(crm.action_crm_add_note)d" context="{'model': 'crm.lead' }" type="action">Add Internal Note</a></li>
|
||||
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
|
||||
</ul>
|
||||
<div class="oe_kanban_content">
|
||||
<a type="edit"><h3>
|
||||
<field name="partner_id"/>
|
||||
<t t-if="record.planned_revenue.raw_value">
|
||||
- <t t-esc="Math.round(record.planned_revenue.value)"/>
|
||||
<field name="company_currency"/>
|
||||
</t>
|
||||
</h3></a>
|
||||
<div>
|
||||
<b> <field name="partner_address_name"/> </b>
|
||||
</div>
|
||||
|
||||
<div class="oe_kanban_buttons_set oe_kanban_color_border oe_kanban_color_bglight oe_kanban_box_show_onclick">
|
||||
<div class="oe_kanban_left">
|
||||
<a string="Edit" icon="gtk-edit" type="edit"/>
|
||||
<a string="Change Color" icon="color-picker" type="color" name="color"/>
|
||||
<a string="Send New Email" name="%(mail.action_email_compose_message_wizard)d" icon="terp-mail-message-new" type="action"/>
|
||||
<a string="Log Call" name="%(opportunity2phonecall_act)d" icon="terp-call-start" type="action"/>
|
||||
<a string="Schedule Meeting" name="action_makeMeeting" type="object" icon="stock_calendar"/>
|
||||
<a string="Add Internal Note" name="%(crm.action_crm_add_note)d" context="{'model': 'crm.lead' }" icon="terp-document-new" type="action"/>
|
||||
</div>
|
||||
<div class="oe_kanban_right">
|
||||
<a name="case_mark_lost" string="Mark Lost" states="open,pending" type="object" icon="kanban-stop" />
|
||||
<a name="case_pending" string="Pending" states="draft,open" type="object" icon="kanban-pause" />
|
||||
<a name="case_open" string="Open" states="pending" type="object" icon="gtk-media-play" />
|
||||
<a name="case_mark_won" string="Mark Won" states="open,pending" type="object" icon="kanban-apply" />
|
||||
</div>
|
||||
<br class="oe_kanban_clear"/>
|
||||
<div>
|
||||
<field name="name"/>
|
||||
</div>
|
||||
<div style="padding-left: 0.5em">
|
||||
<i>
|
||||
<t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t>
|
||||
<span t-attf-class="#{red || ''}">
|
||||
<field name="date_action"/>
|
||||
</span>
|
||||
<t t-if="record.date_action.raw_value"> : </t>
|
||||
<field name="title_action"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="oe_right">
|
||||
<a t-if="record.priority.raw_value == 1" icon="star-on" type="object" name="set_normal_priority"/>
|
||||
<a t-if="record.priority.raw_value != 1" icon="star-off" type="object" name="set_high_priority" style="opacity:0.7; filter:alpha(opacity=70);"/>
|
||||
<!--
|
||||
<t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="red">oe_kaban_status_red</t>
|
||||
<span t-attf-class="oe_kanban_status #{red}"> </span>
|
||||
-->
|
||||
<img t-att-src="kanban_image('res.users', 'avatar', record.user_id.raw_value[0])" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
|
||||
</div>
|
||||
<div class="oe_kanban_footer_left">
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_clear"></div>
|
||||
</div>
|
||||
<!--
|
||||
<div class="oe_kanban_right">
|
||||
<a name="case_mark_lost" string="Mark Lost" states="open,pending" type="object" icon="kanban-stop" />
|
||||
<a name="case_pending" string="Pending" states="draft,open" type="object" icon="kanban-pause" />
|
||||
<a name="case_open" string="Open" states="pending" type="object" icon="gtk-media-play" />
|
||||
<a name="case_mark_won" string="Mark Won" states="open,pending" type="object" icon="kanban-apply" />
|
||||
</div>
|
||||
-->
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
'name': 'Meetings Synchronization',
|
||||
'version': '1.1',
|
||||
'category': 'Customer Relationship Management',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
Caldav features in Meeting.
|
||||
===========================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Claims Management',
|
||||
'version': '1.0',
|
||||
'category': 'Customer Relationship Management',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This modules allows you to track your customers/suppliers claims and grievances.
|
||||
================================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'category': 'Customer Relationship Management',
|
||||
'name': 'Fundraising',
|
||||
'version': '1.0',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Fundraising.
|
||||
============
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'category': 'Customer Relationship Management',
|
||||
'name': 'Helpdesk',
|
||||
'version': '1.0',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Helpdesk Management.
|
||||
====================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Partners Geo-Localization',
|
||||
'version': '1.0',
|
||||
'category': 'Customer Relationship Management',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This is the module used by OpenERP SA to redirect customers to its partners, based on geolocalization.
|
||||
======================================================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Customer Profiling',
|
||||
'version': '1.3',
|
||||
'category': 'Marketing',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module allows users to perform segmentation within partners.
|
||||
=================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Tasks on CRM',
|
||||
'version': '1.0',
|
||||
"category": 'Customer Relationship Management',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Todo list for CRM leads and opportunities.
|
||||
""",
|
||||
|
|
|
@ -31,7 +31,6 @@ The decimal precision is configured per company.
|
|||
"version": "0.1",
|
||||
"depends": ["base"],
|
||||
"category" : "Hidden/Dependency",
|
||||
'complexity': "easy",
|
||||
"init_xml": [],
|
||||
"update_xml": [
|
||||
'decimal_precision_view.xml',
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Delivery Costs',
|
||||
'version': '1.0',
|
||||
'category': 'Sales Management',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
Allows you to add delivery methods in sale orders and picking.
|
||||
==============================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Document Management System',
|
||||
'version': '2.1',
|
||||
'category': 'Knowledge Management',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This is a complete document management system.
|
||||
==============================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Shared Repositories (FTP)',
|
||||
'version': '1.99',
|
||||
'category': 'Knowledge Management',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This is a support FTP Interface with document management system.
|
||||
================================================================
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
"version" : "2.3",
|
||||
"author" : "OpenERP SA",
|
||||
"category" : "Knowledge Management",
|
||||
'complexity': "normal",
|
||||
"website": "http://www.openerp.com",
|
||||
"description": """
|
||||
With this module, the WebDAV server for documents is activated.
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
'name': 'Electronic Data Interchange (EDI)',
|
||||
'version': '1.0',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Provides a common EDI platform that other Applications can use
|
||||
==============================================================
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
"author" : "OpenERP,OpenLabs",
|
||||
"website" : "http://openerp.com",
|
||||
"category" : "Marketing",
|
||||
'complexity': "expert",
|
||||
"depends" : ['mail'],
|
||||
"description": """
|
||||
Email Templating (simplified version of the original Power Email by Openlabs)
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Events Organisation',
|
||||
'version': '0.1',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Organization and management of Events.
|
||||
======================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Event Moodle',
|
||||
'version': '0.1',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Configure your moodle server
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Retro-Planning on Events',
|
||||
'version': '0.1',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Organization and management of events.
|
||||
======================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Events Sales',
|
||||
'version': '0.1',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Creating registration with sale orders.
|
||||
=======================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Events Sales layout',
|
||||
'version': '0.1',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module ensures the compatibility of the changes made on the sale.order.line form view in event_sale with the sale_layout module (that is replacing the whole field in the view by another one). Its installation is automatically triggered when both modules are installed.
|
||||
""",
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record id="view_users_gogole_form" model="ir.ui.view">
|
||||
<field name="name">res.users.google.form1</field>
|
||||
<field name="model">res.users</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="base.view_users_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//notebook[last()]" position="inside">
|
||||
<page string=" Synchronization ">
|
||||
<separator string="Google Account" colspan="4" />
|
||||
<field name="gmail_user"/>
|
||||
<field name="gmail_password" password="True"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_users_gogole_form" model="ir.ui.view">
|
||||
<field name="name">res.users.google.form1</field>
|
||||
<field name="model">res.users</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="base.view_users_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//notebook[last()]" position="inside">
|
||||
<page string=" Synchronization ">
|
||||
<separator string="Google Account" colspan="4"/>
|
||||
<field name="gmail_user"/>
|
||||
<field name="gmail_password" password="True"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -37,16 +37,18 @@ class google_login(osv.osv_memory):
|
|||
}
|
||||
|
||||
def google_login(self, user, password, type='', context=None):
|
||||
if type == 'group':
|
||||
if type == 'group':
|
||||
gd_client = gdata.contacts.client.ContactsClient(source='OpenERP')
|
||||
if type == 'contact' :
|
||||
if type == 'contact':
|
||||
gd_client = gdata.contacts.service.ContactsService()
|
||||
if type == 'calendar':
|
||||
gd_client = gdata.calendar.service.CalendarService()
|
||||
if type =='docs_client':
|
||||
gd_client = gdata.docs.client.DocsClient()
|
||||
else:
|
||||
gd_client = gdata.contacts.service.ContactsService()
|
||||
try:
|
||||
gd_client.ClientLogin(user, password,gd_client.source)
|
||||
gd_client = gdata.contacts.service.ContactsService()
|
||||
try:
|
||||
gd_client.ClientLogin(user, password, gd_client.source)
|
||||
except Exception:
|
||||
return False
|
||||
return gd_client
|
||||
|
@ -60,7 +62,7 @@ class google_login(osv.osv_memory):
|
|||
if 'password' in fields:
|
||||
res.update({'password': user_obj.gmail_password})
|
||||
return res
|
||||
|
||||
|
||||
def login(self, cr, uid, ids, context=None):
|
||||
data = self.read(cr, uid, ids)[0]
|
||||
user = data['user']
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
import google_docs
|
|
@ -0,0 +1,37 @@
|
|||
# -*- 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': 'Google Docs integration',
|
||||
'version': '0.2',
|
||||
'author': 'OpenERP SA',
|
||||
'website': 'http://openerp.com',
|
||||
'category': 'Tools',
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
'web': True,
|
||||
'js': ['static/src/js/gdocs.js'],
|
||||
'update_xml': [
|
||||
'res_config_user_view.xml'
|
||||
],
|
||||
'depends': ['google_base_account'],
|
||||
'description': 'Module to attach a google document to any model.'
|
||||
}
|
|
@ -0,0 +1,152 @@
|
|||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2012 OpenERP SA (<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/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import osv, fields
|
||||
from tools.translate import _
|
||||
try:
|
||||
import gdata.docs.data
|
||||
import gdata.docs.client
|
||||
from gdata.client import RequestError
|
||||
from gdata.docs.service import DOCUMENT_LABEL
|
||||
import gdata.auth
|
||||
except ImportError:
|
||||
raise osv.except_osv(_('Google Docs Error!'), _('Please install gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list'))
|
||||
|
||||
class google_docs_ir_attachment(osv.osv):
|
||||
_inherit = 'ir.attachment'
|
||||
|
||||
def _auth(self, cr, uid, context=None):
|
||||
'''
|
||||
Connexion with google base account
|
||||
@return client object for connexion
|
||||
'''
|
||||
#pool the google.login in google_base_account
|
||||
google_pool = self.pool.get('google.login')
|
||||
#get gmail password and login. We use default_get() instead of a create() followed by a read() on the
|
||||
# google.login object, because it is easier. The keys 'user' and 'password' ahve to be passed in the dict
|
||||
# but the values will be replaced by the user gmail password and login.
|
||||
user_config = google_pool.default_get( cr, uid, {'user' : '' , 'password' : ''}, context=context)
|
||||
#login gmail account
|
||||
client = google_pool.google_login( user_config['user'], user_config['password'], type='docs_client', context=context)
|
||||
if not client:
|
||||
raise osv.except_osv( _('Google Docs Error!'), _("Check your google configuration in users/synchronization"))
|
||||
return client
|
||||
|
||||
def create_empty_google_doc(self, cr, uid, res_model, res_id, context=None):
|
||||
'''Create a new google document, empty and with a default type (txt)
|
||||
:param res_model: the object for which the google doc is created
|
||||
:param res_id: the Id of the object for which the google doc is created
|
||||
:return: the ID of the google document object created
|
||||
'''
|
||||
#login with the base account google module
|
||||
client = self._auth(cr, uid, context=context)
|
||||
# create the document in google docs
|
||||
local_resource = gdata.docs.data.Resource(gdata.docs.data.DOCUMENT_LABEL)
|
||||
#create a new doc in Google Docs
|
||||
gdocs_resource = client.post(entry=local_resource, uri='https://docs.google.com/feeds/default/private/full/')
|
||||
# create an ir.attachment into the db
|
||||
self.create(cr, uid, {
|
||||
'res_model': res_model,
|
||||
'res_id': res_id,
|
||||
'type': 'url',
|
||||
'name': _('Google Doc'),
|
||||
'url': gdocs_resource.get_alternate_link().href,
|
||||
}, context=context)
|
||||
return gdocs_resource.resource_id.text
|
||||
|
||||
def copy_gdoc(self, cr, uid, res_model, res_id, name_gdocs, gdoc_template_id, context=None):
|
||||
'''
|
||||
copy an existing document in google docs
|
||||
:param res_model: the object for which the google doc is created
|
||||
:param res_id: the Id of the object for which the google doc is created
|
||||
:param name_gdocs: the name of the future ir.attachment that will be created. Based on the google doc template foun.
|
||||
:param gdoc_template_id: the id of the google doc document to copy
|
||||
:return: the ID of the google document object created
|
||||
'''
|
||||
#login with the base account google module
|
||||
client = self._auth(cr, uid)
|
||||
# fetch and copy the original document
|
||||
try:
|
||||
original_resource = client.get_resource_by_id(gdoc_template_id)
|
||||
#copy the document you choose in the configuration
|
||||
copy_resource = client.copy_resource(original_resource, 'copy_%s' % original_resource.title.text)
|
||||
except:
|
||||
raise osv.except_osv(_('Google Docs Error!'), _("Your resource id is not correct. You can find the id in the google docs URL"))
|
||||
# create an ir.attachment
|
||||
self.create(cr, uid, {
|
||||
'res_model': res_model,
|
||||
'res_id': res_id,
|
||||
'type': 'url',
|
||||
'name': name_gdocs,
|
||||
'url': copy_resource.get_alternate_link().href
|
||||
}, context=context)
|
||||
return copy_resource.resource_id.text
|
||||
|
||||
def google_doc_get(self, cr, uid, res_model, ids, context=None):
|
||||
'''
|
||||
Function called by the js, when no google doc are yet associated with a record, with the aim to create one. It
|
||||
will first seek for a google.docs.config associated with the model `res_model` to find out what's the template
|
||||
of google doc to copy (this is usefull if you want to start with a non-empty document, a type or a name
|
||||
different than the default values). If no config is associated with the `res_model`, then a blank text document
|
||||
with a default name is created.
|
||||
:param res_model: the object for which the google doc is created
|
||||
:param ids: the list of ids of the objects for which the google doc is created. This list is supposed to have
|
||||
a length of 1 element only (batch processing is not supported in the code, though nothing really prevent it)
|
||||
:return: the google document object created
|
||||
'''
|
||||
assert len(ids) == 1, 'Creating google docs may only be done by one at a time'
|
||||
res_id = ids[0]
|
||||
pool_ir_attachment = self.pool.get('ir.attachment')
|
||||
pool_gdoc_config = self.pool.get('google.docs.config')
|
||||
name_gdocs = ''
|
||||
model_fields_dic = self.pool.get(res_model).read(cr, uid, res_id, [], context=context)
|
||||
|
||||
# check if a model is configured with a template
|
||||
google_docs_config = pool_gdoc_config.search(cr, uid, [('model_id', '=', res_model)], context=context)
|
||||
if google_docs_config:
|
||||
name_gdocs = pool_gdoc_config.browse(cr, uid, google_docs_config, context=context)[0].name_template
|
||||
name_gdocs = name_gdocs % model_fields_dic
|
||||
google_template_id = pool_gdoc_config.browse(cr, uid, google_docs_config[0], context=context).gdocs_resource_id
|
||||
google_document = pool_ir_attachment.copy_gdoc(cr, uid, res_model, res_id, name_gdocs, google_template_id, context=context)
|
||||
else:
|
||||
google_document = pool_ir_attachment.create_empty_google_doc(cr, uid, res_model, res_id, context=context)
|
||||
return google_document
|
||||
|
||||
class config(osv.osv):
|
||||
_name = 'google.docs.config'
|
||||
_description = "Google Docs templates config"
|
||||
|
||||
_columns = {
|
||||
'model_id': fields.many2one('ir.model', 'Model'),
|
||||
'gdocs_resource_id': fields.char('Google resource ID', size=64,help='''
|
||||
This is the id of the template document, on google side. You can find it thanks to its URL:
|
||||
*for a text document with url like `https://docs.google.com/a/openerp.com/document/d/123456789/edit`, the ID is `document:123456789`
|
||||
*for a spreadsheet document with url like `https://docs.google.com/a/openerp.com/spreadsheet/ccc?key=123456789#gid=0`, the ID is `spreadsheet:123456789`
|
||||
*for a presentation (slide show) document with url like `https://docs.google.com/a/openerp.com/presentation/d/123456789/edit#slide=id.p`, the ID is `presentation:123456789`
|
||||
*for a drawing document with url like `https://docs.google.com/a/openerp.com/drawings/d/123456789/edit`, the ID is `drawings:123456789`
|
||||
...
|
||||
'''),
|
||||
'name_template': fields.char('GDoc name template ', size=64, help='This is the name which appears on google side'),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'name_template': 'gdoc_%(name)s',
|
||||
}
|
||||
config()
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- add google docs config field in user form -->
|
||||
|
||||
<record model="ir.ui.view" id="view_google_docs_config_tree">
|
||||
<field name="name">google_docs.config.tree</field>
|
||||
<field name="model">google.docs.config</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<group name="default_filters" position="inside">
|
||||
<field name="model_id"/>
|
||||
</group>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_google_docs_config_form">
|
||||
<field name="name">google_docs.config.form</field>
|
||||
<field name="model">google.docs.config</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<group colspan='4'>
|
||||
<field name="model_id"/>
|
||||
<field name='gdocs_resource_id'/>
|
||||
<field name='name_template'/>
|
||||
</group>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='action_google_docs_users_config'>
|
||||
<field name='name'>Models configuration</field>
|
||||
<field name='res_model'>google.docs.config</field>
|
||||
<field name='type'>ir.actions.act_window</field>
|
||||
<field name='view_type'>form</field>
|
||||
<field name='view_id' ref='view_google_docs_config_tree'/>
|
||||
</record>
|
||||
<menuitem name='Google Docs configuration' id='menu_gdocs_config' parent='base.menu_administration'/>
|
||||
<menuitem name='Models configuration' id='menu_gdocs_model_config' parent='menu_gdocs_config' action='action_google_docs_users_config'/>
|
||||
</data>
|
||||
</openerp>
|
|
@ -0,0 +1,41 @@
|
|||
openerp.google_docs = function(instance, m) {
|
||||
var _t = instance.web._t;
|
||||
|
||||
instance.web.Sidebar = instance.web.Sidebar.extend({
|
||||
on_attachments_loaded: function(attachments) {
|
||||
self = this
|
||||
self._super(attachments);
|
||||
// if attachment contains a google doc url do nothing
|
||||
// else display a button to create a google doc
|
||||
var flag = false;
|
||||
_.each(attachments, function(i) {
|
||||
if (i.url && i.url.match('/docs.google.com/')) { flag = true; }
|
||||
});
|
||||
if (! flag) {
|
||||
this.add_items('files', [
|
||||
{ label: _t('Google Doc'), callback: self.on_google_doc },
|
||||
]);
|
||||
}
|
||||
},
|
||||
on_google_doc: function() {
|
||||
var self = this;
|
||||
var form = self.getParent();
|
||||
form.sidebar_context().then(function (context) {
|
||||
var ds = new instance.web.DataSet(this, 'ir.attachment', context);
|
||||
ds.call('google_doc_get', [form.dataset.model, [form.datarecord.id], context], function(r) {
|
||||
if (r == 'False') {
|
||||
var params = {
|
||||
error: response,
|
||||
message: _t("The user google credentials are not set yet. Contact your administrator for help.")
|
||||
}
|
||||
$(openerp.web.qweb.render("DialogWarning", params)).dialog({
|
||||
title: _t("User Google credentials are not yet set."),
|
||||
modal: true,
|
||||
});
|
||||
}
|
||||
form.reload();
|
||||
});
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
|
@ -25,7 +25,6 @@
|
|||
"author": "OpenERP SA",
|
||||
"category": "Human Resources",
|
||||
"sequence": 12,
|
||||
'complexity': "easy",
|
||||
"website": "http://www.openerp.com",
|
||||
"description": """
|
||||
Module for human resource management.
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -24,7 +24,6 @@
|
|||
'name': 'Attendances',
|
||||
'version': '1.1',
|
||||
'category': 'Human Resources',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module aims to manage employee's attendances.
|
||||
==================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': "Employee Contracts",
|
||||
'version': '1.0',
|
||||
'category': 'Human Resources',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Add all information on the employee form to manage contracts.
|
||||
=============================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
"version": "0.1",
|
||||
"author": "OpenERP SA",
|
||||
"category": "Human Resources",
|
||||
'complexity': "easy",
|
||||
"website": "http://www.openerp.com",
|
||||
"images": ["images/hr_evaluation_analysis.jpeg","images/hr_evaluation.jpeg"],
|
||||
"depends": ["hr","base_calendar","survey"],
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
'version': '1.0',
|
||||
'category': 'Human Resources',
|
||||
"sequence": 30,
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module aims to manage employee's expenses.
|
||||
===============================================
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
"author": "OpenERP SA",
|
||||
"category": "Human Resources",
|
||||
"sequence": 28,
|
||||
'complexity': "easy",
|
||||
"website": "http://www.openerp.com",
|
||||
"description": """
|
||||
This module allows you to manage leaves and leaves' requests.
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'version': '1.0',
|
||||
'category': 'Human Resources',
|
||||
"sequence": 38,
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
Generic Payroll system.
|
||||
=======================
|
||||
|
@ -73,7 +72,7 @@ Generic Payroll system.
|
|||
'installable': True,
|
||||
'auto_install': False,
|
||||
'certificate' : '001046261404562128861',
|
||||
'application': True,
|
||||
'application': False,
|
||||
}
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Payroll Accounting',
|
||||
'version': '1.0',
|
||||
'category': 'Human Resources',
|
||||
'complexity': "expert",
|
||||
'description': """
|
||||
Generic Payroll system Integrated with Accountings.
|
||||
===================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'version': '1.0',
|
||||
'category': 'Human Resources',
|
||||
"sequence": 24,
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Manages job positions and the recruitment process.
|
||||
==================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Timesheets',
|
||||
'version': '1.0',
|
||||
"category": "Human Resources",
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module implements a timesheet system.
|
||||
==========================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Ideas',
|
||||
'version': '0.1',
|
||||
'category': 'Tools',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module allows your user to easily and efficiently participate in enterprise innovation.
|
||||
============================================================================================
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
"depends" : ["base","base_setup"],
|
||||
"author" : "OpenERP SA",
|
||||
'category': 'Hidden/Dependency',
|
||||
'complexity': "easy",
|
||||
"description": """
|
||||
Installer for knowledge-based Hidden.
|
||||
=====================================
|
||||
|
|
|
@ -34,7 +34,6 @@ General Chart of Accounts
|
|||
Provide Templates for Chart of Accounts, Taxes for Uruguay
|
||||
|
||||
""",
|
||||
"complexity": "normal",
|
||||
"license" : "AGPL-3",
|
||||
"depends" : [
|
||||
"account",
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
{
|
||||
"name": "Lunch Orders",
|
||||
"author": "OpenERP SA",
|
||||
'complexity': "easy",
|
||||
"Description": """
|
||||
The lunch module is for keeping a record of the order placed and payment of the orders.
|
||||
=======================================================================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Emails Management',
|
||||
'version': '1.0',
|
||||
'category': 'Hidden/Dependency',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
A generic email subsystem with message storage and queuing
|
||||
==========================================================
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
</table>
|
||||
<div class="oe_mail_wall_left">
|
||||
<div class="oe_mail_wall_act">
|
||||
<textarea class="oe_mail oe_mail_wall_action_textarea" placeholder="Add a personnal message here..."/>
|
||||
<textarea class="oe_mail oe_mail_wall_action_textarea" placeholder="What are you working on?"/>
|
||||
<button class="oe_right oe_mail_wall_button_comment" type="button">Post comment</button>
|
||||
</div>
|
||||
<div class="oe_clear"></div>
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
"depends" : ["base", "base_setup"],
|
||||
"author" : "OpenERP SA",
|
||||
"category": 'Hidden/Dependency',
|
||||
'complexity': "expert",
|
||||
"description": """
|
||||
Menu for Marketing.
|
||||
===================
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
],
|
||||
"author" : "OpenERP SA",
|
||||
"category": 'Marketing',
|
||||
'complexity': "expert",
|
||||
"description": """
|
||||
This module provides leads automation through marketing campaigns (campaigns can in fact be defined on any resource, not just CRM Leads).
|
||||
=========================================================================================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Just In Time Scheduling',
|
||||
'version': '1.0',
|
||||
'category': 'Manufacturing',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module allows Just In Time computation of procurement orders.
|
||||
==================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Manufacturing Operations',
|
||||
'version': '1.0',
|
||||
'category': 'Manufacturing',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module adds state, date_start,date_stop in production order operation lines (in the "Work Centers" tab).
|
||||
=============================================================================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Multi-Company',
|
||||
'version': '1.0',
|
||||
'category': 'Tools',
|
||||
'complexity': "expert",
|
||||
'description': """
|
||||
This module is for managing a multicompany environment.
|
||||
=======================================================
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
'name': 'Collaborative Pads',
|
||||
'version': '2.0',
|
||||
"category": "Project Management",
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Adds enhanced support for (Ether)Pad attachments in the web client.
|
||||
===================================================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Specifications on PADs',
|
||||
'version': '1.0',
|
||||
"category": "Project Management",
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module adds a PAD in all project kanban views
|
||||
==================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'CRM Plugins',
|
||||
'version': '1.0',
|
||||
'category': 'Hidden/Dependency',
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
The common interface for pugin.
|
||||
=====================================================
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"version" : "1.0",
|
||||
"author" : "OpenERP SA",
|
||||
"category" : "Specific Industry Applications",
|
||||
'complexity': "easy",
|
||||
"depends" : ["stock"],
|
||||
"init_xml" : [],
|
||||
"demo_xml" : ["product_expiry_demo.xml"],
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"version" : "1.0",
|
||||
"author" : "OpenERP SA",
|
||||
'category': 'Purchase Management',
|
||||
'complexity': "easy",
|
||||
"depends" : ["stock"],
|
||||
"init_xml" : [],
|
||||
"demo_xml" : [],
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"version": "1.0",
|
||||
"author": "OpenERP SA",
|
||||
'category': 'Sales Management',
|
||||
'complexity': "easy",
|
||||
"description": """
|
||||
This module lets you calculate discounts on Sale Order lines and Invoice lines base on the partner's pricelist.
|
||||
===============================================================================================================
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
"depends" : ["base", "base_setup"],
|
||||
"author" : "OpenERP SA",
|
||||
"category" : "Hidden/Dependency",
|
||||
'complexity': "easy",
|
||||
"description": """
|
||||
Installer for extra Hidden like lunch, survey, idea, share, etc.
|
||||
================================================================
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
"website": "http://www.openerp.com",
|
||||
"category": "Project Management",
|
||||
"sequence": 8,
|
||||
'complexity': "easy",
|
||||
"images": ["images/gantt.png", "images/project_dashboard.jpeg","images/project_task_tree.jpeg","images/project_task.jpeg","images/project.jpeg","images/task_analysis.jpeg"],
|
||||
"depends": ["base_setup", "product", "analytic", "board", "mail", "resource","web_kanban"],
|
||||
"description": """
|
||||
|
@ -71,7 +70,7 @@ Dashboard for project members that includes:
|
|||
'auto_install': False,
|
||||
'application': True,
|
||||
'css': ['static/src/css/project.css'],
|
||||
'js': ['static/src/js/dropdown.js','static/src/js/project.js'],
|
||||
'js': ['static/src/js/project.js'],
|
||||
'certificate': '0075116868317',
|
||||
}
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -188,61 +188,39 @@
|
|||
<field name="task_count"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div class="project_vignettes">
|
||||
<li t-attf-class="#{kanban_color(record.color.raw_value)} oe_project_kanban_vignette" id="oe_project_kanban_vignette">
|
||||
<a href="#" class="oe_project_kanban_action dropdown-toggle"><span class="oe_i">B</span></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li ><a type="edit" >Edit...</a></li>
|
||||
<li ><a type="delete">Delete</a></li>
|
||||
<li>
|
||||
<ul class="color-chooser">
|
||||
<li><a t-att-id="record.id.value" class="bgcolor"><span class="oe_kanban_color_0 square"></span></a></li>
|
||||
<li><a t-att-id="record.id.value" class="bgcolor"><span class="oe_kanban_color_1 square"></span></a></li>
|
||||
<li><a t-att-id="record.id.value" class="bgcolor"><span class="oe_kanban_color_2 square"></span></a></li>
|
||||
<li><a t-att-id="record.id.value" class="bgcolor"><span class="oe_kanban_color_3 square"></span></a></li>
|
||||
<li><a t-att-id="record.id.value" class="bgcolor"><span class="oe_kanban_color_4 square"></span></a></li>
|
||||
<li><a t-att-id="record.id.value" class="bgcolor"><span class="oe_kanban_color_5 square"></span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h4><t t-esc="record.name.value.substr(0,33)"/><t t-if="record.name.value.length > 33">...</t></h4>
|
||||
<div id="list">
|
||||
<a t-if="record.use_tasks.raw_value" class="oe_project_buttons"
|
||||
id="1" name="%(act_project_project_2_project_task_all)d" type="action">
|
||||
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_project oe_kanban_auto_height">
|
||||
<a class="oe_kanban_menuaction oe_i">B</a>
|
||||
<ul class="oe_kanban_menu">
|
||||
<li><a type="edit">Edit...</a></li>
|
||||
<li><a type="delete">Delete</a></li>
|
||||
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
|
||||
</ul>
|
||||
<div class="oe_kanban_content">
|
||||
<a type="edit"><h3 class="oe_kanban_ellipsis"><field name="name"/></h3></a>
|
||||
|
||||
<div class="oe_kanban_project_list">
|
||||
<a t-if="record.use_tasks.raw_value"
|
||||
name="%(act_project_project_2_project_task_all)d" type="action">
|
||||
Tasks(<field name="task_count"/>)</a>
|
||||
</div>
|
||||
<br/>
|
||||
<button class="click_button" name="dummy" type="object">
|
||||
<table class="project_fields">
|
||||
<tr id="deadline" t-if="record.date.raw_value">
|
||||
<th align="left">Deadline</th>
|
||||
<td align="left"><field name="date"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="left" width="70px">Progress</th>
|
||||
<td align="left">
|
||||
<t t-esc="Math.round(record.effective_hours.raw_value)"/> / <t t-esc="Math.round(record.planned_hours.raw_value)"/> <field name="company_uom_id"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br/>
|
||||
|
||||
<div class="oe_kanban_project_fields oe_kanban_project_deadline" t-if="record.date.raw_value">
|
||||
<div>Deadline</div>
|
||||
<div><field name="date"/></div>
|
||||
</div>
|
||||
|
||||
<div class="oe_kanban_project_fields oe_kanban_project_progress">
|
||||
<div>Progress</div>
|
||||
<div><t t-esc="Math.round(record.effective_hours.raw_value)"/> / <t t-esc="Math.round(record.planned_hours.raw_value)"/> <field name="company_uom_id"/></div>
|
||||
</div>
|
||||
|
||||
<div class="oe_kanban_project_avatars">
|
||||
<t t-foreach="record.members.raw_value" t-as="member">
|
||||
<img t-att-src="kanban_image('res.users', 'avatar', member)" t-att-id="member" class="project_avatar"/>
|
||||
<img t-att-src="kanban_image('res.users', 'avatar', member)" t-att-data-member_id="member"/>
|
||||
</t>
|
||||
</button>
|
||||
</li>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
//open dropdwon when click on the icon.
|
||||
$('.dropdown-toggle').dropdown();
|
||||
|
||||
//show and hide the dropdown icon when mouseover and mouseour.
|
||||
$('.oe_project_kanban_vignette').mouseover(function() {
|
||||
return $(this).find('.oe_project_kanban_action').show();
|
||||
}).mouseout(function() {
|
||||
return $(this).find('.oe_project_kanban_action').hide();
|
||||
});
|
||||
</script>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
|
@ -268,10 +246,17 @@
|
|||
<field name="view_id" ref="view_project_kanban"/>
|
||||
<field name="search_view_id" ref="view_project_project_filter"/>
|
||||
<field name="context">{}</field>
|
||||
<field name="help" type="xml"><p>You have no projects.</p>
|
||||
<p>Projects are used to organize your activities; plan tasks, track issues, invoice timesheets. You can define internal projects (R&D, Improve Sales Process), private projects (My Todos) or customer ones.</p>
|
||||
<p>Click <i>'create'</i> to start a new project.</p>
|
||||
</field>
|
||||
<field name="help" type="xml">
|
||||
<p>Click <i>'Create'</i> to <b>start a new project</b>.</p>
|
||||
<p>Projects are used to organize your activities; plan tasks,
|
||||
track issues, invoice timesheets. You can define internal
|
||||
projects (R&D, Improve Sales Process), private projects (My
|
||||
Todos) or customer ones.</p>
|
||||
<p>
|
||||
You will be able collaborate with internal users on
|
||||
projects or invite customers to share your activities.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="open_view_template_project" model="ir.actions.act_window">
|
||||
|
@ -592,12 +577,10 @@
|
|||
<filter string="Deadlines" context="{'deadline_visible': False}" domain="[('date_deadline','<>',False)]" help="Show only tasks having a deadline" icon="terp-gnome-cpu-frequency-applet+"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="name"/>
|
||||
<field name="project_id" context="{'project_id':self}">
|
||||
<filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-personal"/>
|
||||
</field>
|
||||
<filter name="project" string="Project" domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-check"/>
|
||||
<field name="user_id">
|
||||
<filter domain="[('user_id','=',uid)]" help="My Tasks" icon="terp-personal" />
|
||||
<filter domain="[('user_id','=',False)]" help="Unassigned Tasks" icon="terp-personal-" />
|
||||
<filter string="My Tasks" domain="[('user_id','=',uid)]" help="My Tasks" icon="terp-personal" />
|
||||
<filter string="Unassigned Tasks" domain="[('user_id','=',False)]" help="Unassigned Tasks" icon="terp-personal-" />
|
||||
</field>
|
||||
</group>
|
||||
<newline/>
|
||||
|
@ -627,7 +610,7 @@
|
|||
<field name="view_id" eval="False"/>
|
||||
<field name="context">{}</field>
|
||||
<field name="search_view_id" ref="view_task_search_form"/>
|
||||
<field name="help">A task represents a work that has to be done. Each user works in his own list of tasks where he can record his task work in hours. He can work and close the task itself or delegate it to another user. If you delegate a task to another user, you get a new task in pending state, which will be reopened when you have to review the work achieved. If you install the project_timesheet module, task work can be invoiced based on the project configuration. With the project_mrp module, sales orders can create tasks automatically when they are confirmed.</field>
|
||||
<field name="help">Tasks allow you to organize your work into a project. Click on button "Create" to create a new task.</field>
|
||||
</record>
|
||||
<record id="open_view_task_list_kanban" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="0"/>
|
||||
|
|
|
@ -1,246 +1,41 @@
|
|||
.project_fields {
|
||||
margin-top: 1px;
|
||||
margin-bottom: 1px;
|
||||
font-size: 11px;
|
||||
padding-left: 0px;
|
||||
.oe_kanban_project {
|
||||
width: 300px;
|
||||
}
|
||||
.project_fields td {
|
||||
border: none;
|
||||
padding: 2px 0 2px 8px;
|
||||
.oe_kanban_project_list {
|
||||
margin: 8px 0 8px 0;
|
||||
}
|
||||
.project_fields th {
|
||||
padding: 0;
|
||||
/*.oe_kanban_project_list a:not(:first-child):before {
|
||||
content: ' - ';
|
||||
}*/
|
||||
.oe_kanban_project_fields div {
|
||||
display: inline-block;
|
||||
width: 49%;
|
||||
box-sizing: border-box;
|
||||
padding: 2px 0 2px 0;
|
||||
}
|
||||
.oe_kanban_project_fields div:nth-child(odd) {
|
||||
border-right: 1px solid #dddddd;
|
||||
vertical-align: top;
|
||||
margin-right: 8px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
.project_vignettes{
|
||||
padding: 4px !important;
|
||||
.oe_kanban_project_fields div:nth-child(even) {
|
||||
padding-left: 8px;
|
||||
color: #888888;
|
||||
}
|
||||
.project_vignettes li {
|
||||
float: left;
|
||||
|
||||
.oe_kanban_project_avatars {
|
||||
padding-top: 1em;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.project_vignettes .project_avatar {
|
||||
.oe_kanban_project_avatars img {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
.project_vignettes .project_fields {
|
||||
width: 100%;
|
||||
}
|
||||
.project_vignettes .project_fields th {
|
||||
width: 120px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.project_vignettes .project_fields td {
|
||||
color: #888888;
|
||||
}
|
||||
.project_vignettes h4 a {
|
||||
color: #4c4c4c;
|
||||
}
|
||||
.project_vignettes > li h4 {
|
||||
margin-bottom: 2px;
|
||||
padding-left: 2px;
|
||||
}
|
||||
.oe_project_buttons {
|
||||
padding: 2px 2px !important;
|
||||
background: none !important;
|
||||
background-color: transparent !important;
|
||||
border: hidden !important;
|
||||
color: #8A89BA !important;
|
||||
}
|
||||
.oe_project_buttons:hover {
|
||||
cursor: pointer;
|
||||
color: #0000FF;
|
||||
}
|
||||
.project_avatar {
|
||||
-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
.click_button {
|
||||
background: none !important;
|
||||
background-color: transparent !important;
|
||||
border: hidden !important;
|
||||
min-height: 155px;
|
||||
min-width: 265px;
|
||||
border: hidden;
|
||||
/*margin-left: 6px !important;*/
|
||||
margin-top: 3px !important;
|
||||
text-align: left;
|
||||
vertical-align: super;
|
||||
font-size: 11px;
|
||||
-webkit-box-align: baseline;
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.click_button:hover {
|
||||
cursor: default !important;
|
||||
}
|
||||
.dropdown-menu {
|
||||
display: none;
|
||||
position: absolute;
|
||||
}
|
||||
.dropdown {
|
||||
position: relative;
|
||||
}
|
||||
.dropdown-toggle:after {
|
||||
width: 0;
|
||||
height: 0;
|
||||
display: inline-block;
|
||||
content: "&darr";
|
||||
text-indent: -99999px;
|
||||
vertical-align: top;
|
||||
margin-top: 8px;
|
||||
margin-left: 4px;
|
||||
border-left: 4px solid transparent;
|
||||
border-right: 4px solid transparent;
|
||||
border-top: 4px solid white;
|
||||
filter: alpha(opacity=50);
|
||||
-khtml-opacity: 0.5;
|
||||
-moz-opacity: 0.5;
|
||||
opacity: 0.5;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu .color-chooser {
|
||||
padding: 0 3px;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu .color-chooser li {
|
||||
float: left;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu .color-chooser li a {
|
||||
padding: 2px;
|
||||
}
|
||||
a.oe_project_kanban_action {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
display: none;
|
||||
}
|
||||
a.oe_project_kanban_action:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
a.oe_project_kanban_action .oe_i {
|
||||
color: #4c4c4c;
|
||||
}
|
||||
|
||||
.square {
|
||||
display: inline-block;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border:1px solid grey;
|
||||
}
|
||||
.oe_kanban_color_0 {
|
||||
background: white;
|
||||
}
|
||||
.oe_kanban_color_1 {
|
||||
background: #B1DCFE;
|
||||
}
|
||||
.oe_kanban_color_2 {
|
||||
background: #FF8E8E;
|
||||
}
|
||||
.oe_kanban_color_3 {
|
||||
background: khaki;
|
||||
}
|
||||
.oe_kanban_color_4 {
|
||||
background: thistle;
|
||||
}
|
||||
.oe_kanban_color_5 {
|
||||
background: orange;
|
||||
}
|
||||
|
||||
.open {
|
||||
display: block;
|
||||
}
|
||||
.open .dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
a.oe_project_kanban_action {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
a.oe_project_kanban_action:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
a.oe_project_kanban_action .eo_i {
|
||||
color: #4c4c4c;
|
||||
}
|
||||
|
||||
.oe_project_kanban_vignette {
|
||||
position: relative;
|
||||
min-height: 50px;
|
||||
/*background: white;*/
|
||||
border: 1px solid #d8d8d8;
|
||||
border-bottom-color: #b9b9b9;
|
||||
padding: 6px;
|
||||
margin: 6px 0;
|
||||
display: inline-block;
|
||||
-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.oe_project_kanban_vignette:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.oe_project_kanban_vignette:hover {
|
||||
-moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6);
|
||||
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6);
|
||||
-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
.oe_project_kanban_vignette h4 {
|
||||
margin: 0 0 2px;
|
||||
}
|
||||
|
||||
.oe_project_kanban_vignette .dropdown-menu {
|
||||
top: 30px;
|
||||
right: -140px;
|
||||
padding: 4px;
|
||||
border: 1px solid #afafb6;
|
||||
width: 160px;
|
||||
overflow-x: hidden;
|
||||
z-index: 900;
|
||||
background: white;
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
|
||||
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
|
||||
-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu p {
|
||||
margin-left: 12px;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu li {
|
||||
float: none;
|
||||
display: block;
|
||||
background-color: none;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu li a {
|
||||
display: block;
|
||||
padding: 3px 6px;
|
||||
clear: both;
|
||||
font-weight: normal;
|
||||
line-height: 14px;
|
||||
color: #4c4c4c;
|
||||
text-decoration: none;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu li a:hover {
|
||||
background: #f0f0fa;
|
||||
background: -moz-linear-gradient(#f0f0fa, #eeeef6);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
|
||||
background: -webkit-linear-gradient(#f0f0fa, #eeeef6);
|
||||
-moz-box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
-box-shadow: none;
|
||||
}
|
||||
|
||||
.oe_project_kanban_vignette .dropdown-menu .color-chooser {
|
||||
padding: 0 3px;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu .color-chooser li {
|
||||
float: left;
|
||||
}
|
||||
.oe_project_kanban_vignette .dropdown-menu .color-chooser li a {
|
||||
padding: 2px;
|
||||
}
|
||||
|
|
|
@ -1,92 +0,0 @@
|
|||
/* ============================================================
|
||||
* bootstrap-dropdown.js v2.0.2
|
||||
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
|
||||
* ============================================================
|
||||
* Copyright 2012 Twitter, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* ============================================================ */
|
||||
|
||||
|
||||
!function( $ ){
|
||||
|
||||
"use strict"
|
||||
|
||||
/* DROPDOWN CLASS DEFINITION
|
||||
* ========================= */
|
||||
|
||||
var toggle = '[data-toggle="dropdown"]'
|
||||
, Dropdown = function ( element ) {
|
||||
var $el = $(element).on('click.dropdown.data-api', this.toggle)
|
||||
$('html').on('click.dropdown.data-api', function () {
|
||||
$el.parent().removeClass('open')
|
||||
})
|
||||
}
|
||||
|
||||
Dropdown.prototype = {
|
||||
|
||||
constructor: Dropdown
|
||||
|
||||
, toggle: function ( e ) {
|
||||
var $this = $(this)
|
||||
, selector = $this.attr('data-target')
|
||||
, $parent
|
||||
, isActive
|
||||
|
||||
if (!selector) {
|
||||
selector = $this.attr('href')
|
||||
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
||||
}
|
||||
|
||||
$parent = $(selector)
|
||||
$parent.length || ($parent = $this.parent())
|
||||
|
||||
isActive = $parent.hasClass('open')
|
||||
|
||||
clearMenus()
|
||||
!isActive && $parent.toggleClass('open')
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function clearMenus() {
|
||||
$(toggle).parent().removeClass('open')
|
||||
}
|
||||
|
||||
|
||||
/* DROPDOWN PLUGIN DEFINITION
|
||||
* ========================== */
|
||||
|
||||
$.fn.dropdown = function ( option ) {
|
||||
return this.each(function () {
|
||||
var $this = $(this)
|
||||
, data = $this.data('dropdown')
|
||||
if (!data) $this.data('dropdown', (data = new Dropdown(this)))
|
||||
if (typeof option == 'string') data[option].call($this)
|
||||
})
|
||||
}
|
||||
|
||||
$.fn.dropdown.Constructor = Dropdown
|
||||
|
||||
|
||||
/* APPLY TO STANDARD DROPDOWN ELEMENTS
|
||||
* =================================== */
|
||||
|
||||
$(function () {
|
||||
$('html').on('click.dropdown.data-api', clearMenus)
|
||||
$('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
|
||||
})
|
||||
|
||||
}( window.jQuery );
|
|
@ -1,46 +1,25 @@
|
|||
openerp.project = function(openerp) {
|
||||
openerp.web_kanban.ProjectKanban = openerp.web_kanban.KanbanRecord.include({
|
||||
bind_events: function() {
|
||||
openerp.web_kanban.KanbanView.include({
|
||||
on_groups_started: function() {
|
||||
var self = this;
|
||||
self._super();
|
||||
if (this.view.dataset.model == 'project.project') {
|
||||
/*set avatar title for members.
|
||||
In many2many fields, returns only list of ids.
|
||||
we can implement return value of m2m fields like [(1,"Adminstration"),...].
|
||||
self._super.apply(this, arguments);
|
||||
if (this.dataset.model === 'project.project') {
|
||||
/* Set avatar title for members.
|
||||
In many2many fields, returns only list of ids.
|
||||
we can implement return value of m2m fields like [(1,"Adminstration"),...].
|
||||
*/
|
||||
_.each($(this.$element).find('.project_avatar'), function(avatar) {
|
||||
var dataset = new openerp.web.DataSetSearch(this, 'res.users', self.session.context, [['id','=',avatar.id]]);
|
||||
dataset.read_slice(['name']).then(function(result) {
|
||||
avatar.setAttribute("title",result[0].name);
|
||||
var members_ids = [];
|
||||
this.$element.find('.oe_kanban_project_avatars img').each(function() {
|
||||
members_ids.push($(this).data('member_id'));
|
||||
});
|
||||
var dataset = new openerp.web.DataSetSearch(this, 'res.users', self.session.context, [['id', 'in', _.uniq(members_ids)]]);
|
||||
dataset.read_slice(['id', 'name']).then(function(result) {
|
||||
_.each(result, function(v, k) {
|
||||
self.$element.find('.oe_kanban_project_avatars img[data-member_id=' + v.id + ']').attr('title', v.name).tipsy({
|
||||
offset: 10
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// set sequence like Tasks,Issues,Timesheets and Phases
|
||||
var my_list = $("#list a");
|
||||
my_list.sort(function (a, b) {
|
||||
var aValue = parseInt(a.id, 10);
|
||||
var bValue = parseInt(b.id, 10);
|
||||
return aValue == bValue ? 0 : aValue < bValue ? -1 : 1;
|
||||
});
|
||||
$('#list').replaceWith(my_list);
|
||||
|
||||
// when vignette is clicked, it opens the first action in sequence
|
||||
if (my_list.length !== 0) {
|
||||
var click_button = $(this.$element).find('.click_button');
|
||||
click_button.attr('data-name', my_list[0].getAttribute('data-name'));
|
||||
click_button.attr('data-type', "action");
|
||||
}
|
||||
|
||||
/* set background color.
|
||||
we can do other way to implement new widget.
|
||||
because we need to rpc call for that.
|
||||
*/
|
||||
this.$element.find('.bgcolor').click(function() {
|
||||
var color = parseInt($(this).find('span').attr('class').split(' ')[0].substring(16), 10);
|
||||
var color_class = $(this).find('span').attr('class').split(' ')[0];
|
||||
$(this).closest('#oe_project_kanban_vignette').removeClass().addClass(color_class + ' oe_project_kanban_vignette');
|
||||
self.view.dataset.write(parseInt(this.id, 10), {color:color});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
'version': '1.0',
|
||||
'category': 'Project Management',
|
||||
"sequence": 20,
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module implements all concepts defined by the Getting Things Done methodology.
|
||||
===================================================================================
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
'version': '1.0',
|
||||
'category': 'Project Management',
|
||||
"sequence": 22,
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
This module provides Issues/Bugs Management in Project.
|
||||
=======================================================
|
||||
|
|
|
@ -380,9 +380,9 @@
|
|||
<field name="use_issues"/>
|
||||
<field name="issue_count" invisible="1"/>
|
||||
</field>
|
||||
<xpath expr="//div[@id='list']" position="inside">
|
||||
<a t-if="record.use_issues.raw_value" class="oe_project_buttons"
|
||||
id="2" name="%(act_project_project_2_project_issue_all)d" type="action">
|
||||
<xpath expr="//div[contains(@class, 'oe_kanban_project_list')]" position="inside">
|
||||
<a t-if="record.use_issues.raw_value"
|
||||
name="%(act_project_project_2_project_issue_all)d" type="action">
|
||||
Issues(<field name="issue_count"/>)</a>
|
||||
</xpath>
|
||||
</field>
|
||||
|
|
|
@ -129,9 +129,9 @@
|
|||
<field name="use_phases"/>
|
||||
<field name="phase_count"/>
|
||||
</field>
|
||||
<xpath expr="//div[@id='list']" position="inside">
|
||||
<a t-if="record.use_phases.raw_value" class="oe_project_buttons"
|
||||
id="4" name="%(act_project_phases)d" type="action">Phases(<field name="phase_count"/>)</a>
|
||||
<xpath expr="//div[contains(@class, 'oe_kanban_project_list')]" position="inside">
|
||||
<a t-if="record.use_phases.raw_value"
|
||||
name="%(act_project_phases)d" type="action">Phases(<field name="phase_count"/>)</a>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
"author": "OpenERP SA",
|
||||
"website": "http://www.openerp.com",
|
||||
"category": "Project Management",
|
||||
'complexity': "easy",
|
||||
"images": ["images/project_mailgate_task.jpeg"],
|
||||
"depends": ["project", "mail"],
|
||||
"description": """
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Create Tasks on SO',
|
||||
'version': '1.0',
|
||||
"category": "Project Management",
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Automatically creates project tasks from procurement lines
|
||||
==========================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Resources Planing',
|
||||
'version': '1.0',
|
||||
"category": "Project Management",
|
||||
'complexity': "expert",
|
||||
'description': """Keep track of your planning
|
||||
This module helps you to manage your plannings.
|
||||
===============================================
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
'name': 'Project Retro-planning',
|
||||
'version': '0.1',
|
||||
'category': 'Project Management',
|
||||
'complexity': "expert",
|
||||
'description': """
|
||||
Changes dates according to change in project End Date.
|
||||
======================================================
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
'name': 'Methodology: SCRUM',
|
||||
'version': '1.0',
|
||||
'category': 'Project Management',
|
||||
'complexity': "normal",
|
||||
'description': """
|
||||
This module implements all concepts defined by the scrum project management methodology for IT companies.
|
||||
=========================================================================================================
|
||||
|
|
|
@ -36,25 +36,17 @@
|
|||
<field name="currency_id"/>
|
||||
<field name="partner_id"/>
|
||||
</field>
|
||||
<xpath expr="//div[@id='list']" position="inside">
|
||||
<a t-if="record.use_timesheets.raw_value" class="oe_project_buttons"
|
||||
id="3" name="open_timesheets" type="object">Timesheets(<field name="timesheet_count"/>)</a>
|
||||
<xpath expr="//div[contains(@class, 'oe_kanban_project_list')]" position="inside">
|
||||
<a t-if="record.use_timesheets.raw_value"
|
||||
name="open_timesheets" type="object">Timesheets(<field name="timesheet_count"/>)</a>
|
||||
</xpath>
|
||||
<xpath expr="//tr[@id='deadline']" position="before">
|
||||
<t t-if="record.partner_id.raw_value">
|
||||
<tr>
|
||||
<th align="left">Amount to invoice</th>
|
||||
<td align="left">
|
||||
<field name="amount_to_invoice"/> <t t-esc="record.currency_id.raw_value[1].split(' ')[1][1]"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="left">Time to Invoice</th>
|
||||
<td align="left">
|
||||
<field name="time_to_invoice"/> <field name="company_uom_id"/>
|
||||
</td>
|
||||
</tr>
|
||||
</t>
|
||||
<xpath expr="//div[contains(@class, 'oe_kanban_project_deadline')]" position="before">
|
||||
<div class="oe_kanban_project_fields oe_kanban_project_invoice" t-if="record.partner_id.raw_value">
|
||||
<div>Amount to invoice</div>
|
||||
<div><field name="amount_to_invoice"/> <t t-esc="record.currency_id.raw_value[1].split(' ')[1][1]"/></div>
|
||||
<div>Time to Invoice</div>
|
||||
<div><field name="time_to_invoice"/> <field name="company_uom_id"/></div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
'version': '1.1',
|
||||
'category': 'Purchase Management',
|
||||
"sequence": 19,
|
||||
'complexity': "easy",
|
||||
'description': """
|
||||
Purchase module is for generating a purchase order for purchase of goods from a supplier.
|
||||
=========================================================================================
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue