[MERGE] Merge with lp:openobject-addons

bzr revid: sbh@tinyerp.com-20120524092830-gim1851y6ie58ge4
This commit is contained in:
Sbh (Openerp) 2012-05-24 14:58:30 +05:30
commit 7090589834
128 changed files with 566 additions and 714 deletions

View File

@ -23,7 +23,6 @@
"version" : "1.1",
"author" : "OpenERP SA",
"category": 'Accounting & Finance',
'complexity': "easy",
"description": """
Accounting and Financial Management.
====================================

View File

@ -24,7 +24,6 @@
"author" : "OpenERP SA",
"category": 'Accounting & Finance',
"sequence": 10,
'complexity': "normal",
"description": """
Accounting Access Rights.
=========================

View File

@ -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.
===================================================================================================================

View File

@ -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:
=====================================================================

View File

@ -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.
===================================================================================

View File

@ -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.
=====================================================================================================================

View File

@ -51,7 +51,7 @@
],
"auto_install": False,
"installable": True,
"application": True,
"application": False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -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.
==========================================================================

View File

@ -24,7 +24,6 @@
"version" : "1.1",
"author" : "OpenERP SA",
"category": 'Accounting & Finance',
'complexity': "normal",
"description": """
Allows cancelling accounting entries.
=====================================

View File

@ -24,7 +24,6 @@
"version": '2.1',
"author": 'Noviat',
"category": 'Accounting & Finance',
"complexity": "normal",
"description": '''
Module to import CODA bank statements.
======================================

View File

@ -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.
==========================================================================

View File

@ -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.
=========================================================================

View File

@ -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.
=======================================================

View File

@ -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.
======================================================================

View File

@ -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.
====================================================================================================================================

View File

@ -25,7 +25,6 @@
'name': 'Database Anonymization',
'version': '1.0',
'category': 'Tools',
'complexity': "easy",
'description': """
This module allows you to anonymize a database.
===============================================

View File

@ -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.
==============================================================

View File

@ -23,7 +23,6 @@
"name": "Calendar Layer",
"version": "1.0",
"depends": ["base", "mail"],
'complexity': "easy",
'description': """
This is a full-featured calendar system.
========================================

View File

@ -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
===============================================================

View File

@ -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.
=====================================================================================================================

View File

@ -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.
=========================================================

View File

@ -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.
================================================================================

View File

@ -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 -->

View File

@ -5,7 +5,6 @@
"version": "1.0",
"depends": ["base"],
"category" : "Hidden/Dependency",
'complexity': "easy",
'description': """
Common base for tools modules.
==============================

View File

@ -23,7 +23,6 @@
'name': 'VAT Number Validation',
'version': '1.0',
"category": 'Hidden/Dependency',
'complexity': "easy",
'description': """
VAT validation for Partners' VAT numbers
========================================

View File

@ -23,7 +23,6 @@
'name': 'Dashboards',
'version': '1.0',
'category': 'Hidden',
'complexity': "normal",
'description': """
Lets the user create a custom dashboard.
========================================

View File

@ -23,7 +23,6 @@
{
"name": "Share Calendar using CalDAV",
"version": "1.1",
'complexity': "normal",
"depends": [
"base",
"document_webdav",

View File

@ -25,7 +25,6 @@
'version': '1.0',
'category': 'Customer Relationship Management',
"sequence": 2,
'complexity': "easy",
'description': """
The generic OpenERP Customer Relationship Management.
=====================================================

View File

@ -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>

View File

@ -25,7 +25,6 @@
'name': 'Meetings Synchronization',
'version': '1.1',
'category': 'Customer Relationship Management',
'complexity': "normal",
'description': """
Caldav features in Meeting.
===========================

View File

@ -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.
================================================================================

View File

@ -24,7 +24,6 @@
'category': 'Customer Relationship Management',
'name': 'Fundraising',
'version': '1.0',
'complexity': "easy",
'description': """
Fundraising.
============

View File

@ -24,7 +24,6 @@
'category': 'Customer Relationship Management',
'name': 'Helpdesk',
'version': '1.0',
'complexity': "easy",
'description': """
Helpdesk Management.
====================

View File

@ -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.
======================================================================================================

View File

@ -24,7 +24,6 @@
'name': 'Customer Profiling',
'version': '1.3',
'category': 'Marketing',
'complexity': "easy",
'description': """
This module allows users to perform segmentation within partners.
=================================================================

View File

@ -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.
""",

View File

@ -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',

View File

@ -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.
==============================================================

View File

@ -24,7 +24,6 @@
'name': 'Document Management System',
'version': '2.1',
'category': 'Knowledge Management',
'complexity': "normal",
'description': """
This is a complete document management system.
==============================================

View File

@ -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.
================================================================

View File

@ -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.

View File

@ -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
==============================================================

View File

@ -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)

View File

@ -24,7 +24,6 @@
'name': 'Events Organisation',
'version': '0.1',
'category': 'Tools',
'complexity': "easy",
'description': """
Organization and management of Events.
======================================

View File

@ -24,7 +24,6 @@
'name': 'Event Moodle',
'version': '0.1',
'category': 'Tools',
'complexity': "easy",
'description': """
Configure your moodle server

View File

@ -23,7 +23,6 @@
'name': 'Retro-Planning on Events',
'version': '0.1',
'category': 'Tools',
'complexity': "easy",
'description': """
Organization and management of events.
======================================

View File

@ -24,7 +24,6 @@
'name': 'Events Sales',
'version': '0.1',
'category': 'Tools',
'complexity': "easy",
'description': """
Creating registration with sale orders.
=======================================

View File

@ -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.
""",

View File

@ -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>

View File

@ -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']

View File

@ -0,0 +1 @@
import google_docs

View File

@ -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.'
}

View File

@ -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()

View File

@ -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>

View File

@ -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();
});
})
}
})
}

View File

@ -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

View File

@ -24,7 +24,6 @@
'name': 'Attendances',
'version': '1.1',
'category': 'Human Resources',
'complexity': "easy",
'description': """
This module aims to manage employee's attendances.
==================================================

View File

@ -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.
=============================================================

View File

@ -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"],

View File

@ -25,7 +25,6 @@
'version': '1.0',
'category': 'Human Resources',
"sequence": 30,
'complexity': "easy",
'description': """
This module aims to manage employee's expenses.
===============================================

View File

@ -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.

View File

@ -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:

View File

@ -23,7 +23,6 @@
'name': 'Payroll Accounting',
'version': '1.0',
'category': 'Human Resources',
'complexity': "expert",
'description': """
Generic Payroll system Integrated with Accountings.
===================================================

View File

@ -24,7 +24,6 @@
'version': '1.0',
'category': 'Human Resources',
"sequence": 24,
'complexity': "easy",
'description': """
Manages job positions and the recruitment process.
==================================================

View File

@ -24,7 +24,6 @@
'name': 'Timesheets',
'version': '1.0',
"category": "Human Resources",
'complexity': "easy",
'description': """
This module implements a timesheet system.
==========================================

View File

@ -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.
============================================================================================

View File

@ -26,7 +26,6 @@
"depends" : ["base","base_setup"],
"author" : "OpenERP SA",
'category': 'Hidden/Dependency',
'complexity': "easy",
"description": """
Installer for knowledge-based Hidden.
=====================================

View File

@ -34,7 +34,6 @@ General Chart of Accounts
Provide Templates for Chart of Accounts, Taxes for Uruguay
""",
"complexity": "normal",
"license" : "AGPL-3",
"depends" : [
"account",

View File

@ -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.
=======================================================================================

View File

@ -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
==========================================================

View File

@ -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>

View File

@ -26,7 +26,6 @@
"depends" : ["base", "base_setup"],
"author" : "OpenERP SA",
"category": 'Hidden/Dependency',
'complexity': "expert",
"description": """
Menu for Marketing.
===================

View File

@ -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).
=========================================================================================================================================

View File

@ -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.
==================================================================

View File

@ -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).
=============================================================================================================

View File

@ -24,7 +24,6 @@
'name': 'Multi-Company',
'version': '1.0',
'category': 'Tools',
'complexity': "expert",
'description': """
This module is for managing a multicompany environment.
=======================================================

View File

@ -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.
===================================================================

View File

@ -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
==================================================

View File

@ -24,7 +24,6 @@
'name': 'CRM Plugins',
'version': '1.0',
'category': 'Hidden/Dependency',
'complexity': "easy",
'description': """
The common interface for pugin.
=====================================================

View File

@ -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"],

View File

@ -22,7 +22,6 @@
"version" : "1.0",
"author" : "OpenERP SA",
'category': 'Purchase Management',
'complexity': "easy",
"depends" : ["stock"],
"init_xml" : [],
"demo_xml" : [],

View File

@ -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.
===============================================================================================================

View File

@ -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.
================================================================

View File

@ -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:

View File

@ -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&amp;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&amp;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','&lt;&gt;',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"/>

View File

@ -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;
}

View File

@ -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 );

View File

@ -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});
});
}
}
});

View File

@ -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.
===================================================================================

View File

@ -25,7 +25,6 @@
'version': '1.0',
'category': 'Project Management',
"sequence": 22,
'complexity': "easy",
'description': """
This module provides Issues/Bugs Management in Project.
=======================================================

View File

@ -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>

View File

@ -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>

View File

@ -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": """

View File

@ -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
==========================================================

View File

@ -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.
===============================================

View File

@ -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.
======================================================

View File

@ -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.
=========================================================================================================

View File

@ -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>

View File

@ -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