[MERGE] Merged from the main trunk addons
bzr revid: rme@tinyerp.com-20101021090526-rgbj24qaz2ep3d1t bzr revid: skh@tinyerp.com-20101021121622-z22qqf0armfu0kyj
This commit is contained in:
@@ -182,9 +182,6 @@
|
||||
<field name="amount" sum="Payment"/>
|
||||
</tree>
|
||||
</field>
|
||||
<form string="Payment Information">
|
||||
<label string="Form view not available for Payment Lines"/>
|
||||
</form>
|
||||
<field name="line_cr_ids" colspan="4" nolabel="1" attrs="{'invisible': [('pre_line','=',False)]}" default_get="{'journal_id':journal_id, 'partner_id':partner_id}">
|
||||
<tree string="Credits" editable="bottom">
|
||||
<field name="move_line_id"/>
|
||||
|
||||
@@ -477,7 +477,7 @@ property or property parameter."),
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: True
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.name
|
||||
@@ -555,7 +555,7 @@ property or property parameter."),
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: True
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
for vals in self.browse(cr, uid, ids, context=context):
|
||||
@@ -575,7 +575,7 @@ property or property parameter."),
|
||||
@param ids: List of calendar attendee’s IDs
|
||||
@param *args: Get Tupple value
|
||||
@param context: A standard dictionary for contextual values """
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
return self.write(cr, uid, ids, {'state': 'declined'}, context)
|
||||
|
||||
@@ -587,7 +587,7 @@ property or property parameter."),
|
||||
@param vals: Get Values
|
||||
@param context: A standard dictionary for contextual values """
|
||||
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
if not vals.get("email") and vals.get("cn"):
|
||||
cnval = vals.get("cn").split(':')
|
||||
@@ -641,7 +641,7 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: True
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
alarm_obj = self.pool.get('calendar.alarm')
|
||||
res_alarm_obj = self.pool.get('res.alarm')
|
||||
@@ -713,7 +713,7 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
@param model: Model name for which alarm is to be cleared.
|
||||
@return: True
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
alarm_obj = self.pool.get('calendar.alarm')
|
||||
ir_obj = self.pool.get('ir.model')
|
||||
@@ -781,7 +781,7 @@ class calendar_alarm(osv.osv):
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: new record id for calendar_alarm.
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
event_date = vals.get('event_date', False)
|
||||
if event_date:
|
||||
@@ -808,7 +808,7 @@ class calendar_alarm(osv.osv):
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
return True # XXX FIXME REMOVE THIS AFTER FIXING get_recurrent_dates!!
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
current_datetime = datetime.now()
|
||||
request_obj = self.pool.get('res.request')
|
||||
@@ -943,8 +943,9 @@ class calendar_event(osv.osv):
|
||||
@param end_date: Ending Datee
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
value = {}
|
||||
if not start_date:
|
||||
return value
|
||||
@@ -967,6 +968,14 @@ class calendar_event(osv.osv):
|
||||
elif not end_date:
|
||||
end = start + timedelta(hours=duration)
|
||||
value['date_deadline'] = end.strftime("%Y-%m-%d %H:%M:%S")
|
||||
elif end_date and duration:
|
||||
# we have both, keep them synchronized:
|
||||
# set duration based on end_date (arbitrary decision: this avoid
|
||||
# getting dates like 06:31:48 instead of 06:32:00)
|
||||
end = datetime.strptime(end_date, "%Y-%m-%d %H:%M:%S")
|
||||
diff = end - start
|
||||
duration = float(diff.days)* 24 + (float(diff.seconds) / 3600)
|
||||
value['duration'] = round(duration, 2)
|
||||
|
||||
return {'value': value}
|
||||
|
||||
@@ -975,7 +984,7 @@ class calendar_event(osv.osv):
|
||||
This function deletes event which are linked with the event with recurrent_uid
|
||||
(Removes the events which refers to the same UID value)
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
for event_id in ids:
|
||||
cr.execute("select id from %s where recurrent_uid=%%s" % (self._table), (event_id,))
|
||||
@@ -992,7 +1001,7 @@ class calendar_event(osv.osv):
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: dictionary of rrule value.
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
cr.execute("UPDATE %s set freq='None',interval=0,count=0,end_date=Null,\
|
||||
mo=False,tu=False,we=False,th=False,fr=False,sa=False,su=False,\
|
||||
@@ -1203,7 +1212,7 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Dictionary value which open Crm Meeting form.
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
data_obj = self.pool.get('ir.model.data')
|
||||
@@ -1448,7 +1457,7 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: True
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
if isinstance(ids, (str, int, long)):
|
||||
select = [ids]
|
||||
@@ -1477,14 +1486,23 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
|
||||
if vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'):
|
||||
vals['vtimezone'] = vals['vtimezone'][40:]
|
||||
|
||||
updated_vals = self.onchange_dates(cr, uid, new_ids,
|
||||
vals.get('date', False),
|
||||
vals.get('duration', False),
|
||||
vals.get('date_deadline', False),
|
||||
vals.get('allday', False),
|
||||
context=context)
|
||||
vals.update(updated_vals.get('value', {}))
|
||||
|
||||
if new_ids:
|
||||
res = super(calendar_event, self).write(cr, uid, new_ids, vals, context=context)
|
||||
if (vals.has_key('alarm_id') or vals.has_key('base_calendar_alarm_id'))\
|
||||
or (vals.has_key('date') or vals.has_key('duration') or vals.has_key('date_deadline')):
|
||||
|
||||
if ('alarm_id' in vals or 'base_calendar_alarm_id' in vals)\
|
||||
or ('date' in vals or 'duration' in vals or 'date_deadline' in vals):
|
||||
# change alarm details
|
||||
alarm_obj = self.pool.get('res.alarm')
|
||||
alarm_obj.do_alarm_create(cr, uid, new_ids, self._name, 'date', \
|
||||
context=context)
|
||||
alarm_obj.do_alarm_create(cr, uid, new_ids, self._name, 'date', context=context)
|
||||
return res
|
||||
|
||||
def browse(self, cr, uid, ids, context=None, list_class=None, fields_process=None):
|
||||
@@ -1520,7 +1538,7 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
@return: List of Dictionary of form [{‘name_of_the_field’: value, ...}, ...]
|
||||
"""
|
||||
# FIXME This whole id mangling has to go!
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
if isinstance(ids, (str, int, long)):
|
||||
@@ -1558,7 +1576,7 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Duplicate record id.
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
res = super(calendar_event, self).copy(cr, uid, base_calendar_id2real_id(id), default, context)
|
||||
alarm_obj = self.pool.get('res.alarm')
|
||||
@@ -1607,10 +1625,12 @@ true, it will allow you to hide the event alarm information without removing it.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: new created record id.
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'):
|
||||
vals['vtimezone'] = vals['vtimezone'][40:]
|
||||
|
||||
res = super(calendar_event, self).create(cr, uid, vals, context)
|
||||
alarm_obj = self.pool.get('res.alarm')
|
||||
alarm_obj.do_alarm_create(cr, uid, [res], self._name, 'date', context=context)
|
||||
@@ -1770,7 +1790,7 @@ class ir_values(osv.osv):
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param model: Get The Model
|
||||
"""
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
new_model = []
|
||||
for data in models:
|
||||
@@ -1798,7 +1818,7 @@ class ir_model(osv.osv):
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
new_ids = isinstance(ids, (str, int, long)) and [ids] or ids
|
||||
if not context:
|
||||
if context is None:
|
||||
context = {}
|
||||
data = super(ir_model, self).read(cr, uid, new_ids, fields=fields, \
|
||||
context=context, load=load)
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
OpenERP, Open Source Management Solution
|
||||
Copyright © 2010 OpenERP SA (<http://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 Lice
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
@@ -0,0 +1,2 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import company_pad
|
||||
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': 'Enhanced support for (Ether)Pad attachments',
|
||||
'version': '1.0',
|
||||
'category': 'Generic Modules/Others',
|
||||
'description': """
|
||||
Adds enhanced support for (Ether)Pad attachments in the web client, lets the
|
||||
company customize which Pad installation should be used to link to new pads
|
||||
(by default, pad.openerp.com)
|
||||
""",
|
||||
'author': 'OpenERP SA',
|
||||
'website': 'http://openerp.com',
|
||||
'depends': ['base'],
|
||||
'update_xml': [
|
||||
'company_pad.xml'
|
||||
],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'web': True,
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from osv import fields, osv
|
||||
|
||||
class company_pad(osv.osv):
|
||||
_inherit = 'res.company'
|
||||
_columns = {
|
||||
'pad_index': fields.char('Pad root URL', size=64, required=True,
|
||||
help="The root URL of the company's pad "
|
||||
"instance"),
|
||||
}
|
||||
_defaults = {
|
||||
'pad_index': 'http://pad.openerp.com'
|
||||
}
|
||||
|
||||
company_pad()
|
||||
@@ -0,0 +1,16 @@
|
||||
<openerp>
|
||||
<data>
|
||||
<record id="view_company_form_with_pad" model="ir.ui.view">
|
||||
<field name="name">res.company.form.pad</field>
|
||||
<field name="model">res.company</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="base.view_company_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//page[@string='Configuration']" position="inside">
|
||||
<separator string="Pad" colspan="4"/>
|
||||
<field name="pad_index"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,2 @@
|
||||
import controllers
|
||||
import editors
|
||||
@@ -0,0 +1,34 @@
|
||||
import urlparse
|
||||
|
||||
import cherrypy
|
||||
|
||||
from openobject.tools import expose
|
||||
|
||||
import openerp.controllers
|
||||
from openerp.utils import rpc, TinyDict
|
||||
|
||||
class Piratepad(openerp.controllers.SecuredController):
|
||||
_cp_path = "/piratepad"
|
||||
|
||||
def get_root(self):
|
||||
return rpc.RPCProxy('res.company').read(
|
||||
[rpc.session.company_id], ['pad_index'])[0]['pad_index']
|
||||
|
||||
def make_url(self, pad_name):
|
||||
return urlparse.urljoin(
|
||||
self.get_root(), '-'.join(pad_name.split())
|
||||
)
|
||||
|
||||
@expose('json', methods=('POST',))
|
||||
def link(self, pad_name):
|
||||
params, data = TinyDict.split(cherrypy.session['params'])
|
||||
ctx = dict(rpc.session.context,
|
||||
default_res_model=params.model, default_res_id=params.id,
|
||||
active_id=False, active_ids=[])
|
||||
|
||||
pad_link = self.make_url(pad_name)
|
||||
attachment_id = rpc.RPCProxy('ir.attachment').create({
|
||||
'name': pad_name,
|
||||
'url': pad_link,
|
||||
}, ctx)
|
||||
return {'id': attachment_id, 'name': pad_name, 'url': pad_link}
|
||||
@@ -0,0 +1,46 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import openobject.templating
|
||||
|
||||
class SidebarTemplateEditor(openobject.templating.TemplateEditor):
|
||||
templates = ['/openerp/widgets/templates/sidebar.mako']
|
||||
ADD_ATTACHMENT_BUTTON = u'id="add-attachment"'
|
||||
BINARY_ATTACHMENTS_FORM = u'<form id="attachment-box"'
|
||||
|
||||
def insert_pad_link(self, output):
|
||||
# Insert the link on the line right after the link to open the
|
||||
# attachment form
|
||||
form_opener_insertion = output.index(
|
||||
'\n',
|
||||
output.index(self.ADD_ATTACHMENT_BUTTON)) + 1
|
||||
output = output[:form_opener_insertion] + \
|
||||
'''<a href="#" id="add-pad" class="button-a"
|
||||
style="right: 44px;"
|
||||
>${_("Pad")}</a>\n''' + \
|
||||
output[form_opener_insertion:]
|
||||
return output
|
||||
|
||||
def edit(self, template, template_text):
|
||||
output = super(SidebarTemplateEditor, self).edit(template, template_text)
|
||||
|
||||
output = self.insert_pad_link(output)
|
||||
|
||||
form_insertion_point = output.index(self.BINARY_ATTACHMENTS_FORM)
|
||||
return output[:form_insertion_point] + '''
|
||||
<form id="pad-form" action="/piratepad/link" method="post">
|
||||
<label for="sidebar_pad_datas">${_("Name")}:</label>
|
||||
<input id="sidebar_pad_datas"
|
||||
name="pad_name" size="5" />
|
||||
<button>${_("Ok")}</button>
|
||||
</form>
|
||||
<script type="text/javascript">
|
||||
jQuery(document).ready(function() {
|
||||
var $padForm = jQuery('#pad-form')
|
||||
.hide()
|
||||
.submit(createAttachment);
|
||||
jQuery('#add-pad').click(function(e){
|
||||
$padForm.show();
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
''' + output[form_insertion_point:]
|
||||
@@ -31,6 +31,11 @@ class misc_tools_installer(osv.osv_memory):
|
||||
'idea':fields.boolean('Ideas Box',help='Promote ideas of the employees, votes and discussion on best ideas.'),
|
||||
'share':fields.boolean('Share Data / Portals',help='This module allows you to easily give restricted access of any filtered list of objects to any customer or supplier.' \
|
||||
'Just click on the share icon to give access to your customers on their project\'s tasks, support requests, invoices, etc.'),
|
||||
'pad': fields.boolean('Native pad integration',
|
||||
help="This module creates a tighter integration between a Pad "
|
||||
"instance of your choosing and your OpenERP Web Client by "
|
||||
"letting you easily link pads to OpenERP objects via "
|
||||
"OpenERP attachments."),
|
||||
}
|
||||
_defaults = {
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<field name="idea"/>
|
||||
<field name="survey"/>
|
||||
<field name="subscription" groups="base.group_extended"/>
|
||||
<field name="pad"/>
|
||||
</group>
|
||||
</data>
|
||||
</field>
|
||||
|
||||
Reference in New Issue
Block a user