[MERGE] from lp:~openerp-dev/openobject-addons/trunk-dev-addons2
bzr revid: hmo@tinyerp.com-20100419125311-ra72hatkj9fc67l8
This commit is contained in:
commit
87b2c0825e
|
@ -91,7 +91,7 @@ def real_id2base_calendar_id(real_id, recurrent_date):
|
|||
|
||||
if real_id and recurrent_date:
|
||||
recurrent_date = time.strftime("%Y%m%d%H%M%S", \
|
||||
time.strptime(recurrent_date, "%Y-%m-%d %H:%M:%S"))
|
||||
time.strptime(recurrent_date, "%Y-%m-%d %H:%M:%S"))
|
||||
return '%d-%s' % (real_id, recurrent_date)
|
||||
return real_id
|
||||
|
||||
|
@ -253,7 +253,7 @@ class calendar_attendee(osv.osv):
|
|||
result[id][name] = ''
|
||||
continue
|
||||
else:
|
||||
result[id][name] = self._get_address(attdata.sent_by_uid.name, \
|
||||
result[id][name] = self._get_address(attdata.sent_by_uid.name, \
|
||||
attdata.sent_by_uid.address_id.email)
|
||||
if name == 'cn':
|
||||
if attdata.user_id:
|
||||
|
@ -327,59 +327,60 @@ class calendar_attendee(osv.osv):
|
|||
'cutype': fields.selection([('individual', 'Individual'), \
|
||||
('group', 'Group'), ('resource', 'Resource'), \
|
||||
('room', 'Room'), ('unknown', '') ], \
|
||||
'Invite Type', help="Specify the type of Invitation"),
|
||||
'member': fields.char('Member', size=124,
|
||||
help="Indicate the groups that the attendee belongs to"),
|
||||
'Invite Type', help="Specify the type of Invitation"),
|
||||
'member': fields.char('Member', size=124,
|
||||
help="Indicate the groups that the attendee belongs to"),
|
||||
'role': fields.selection([('req-participant', 'Participation required'), \
|
||||
('chair', 'Chair Person'), \
|
||||
('opt-participant', 'Optional Participation'), \
|
||||
('non-participant', 'For information Purpose')], 'Role', \
|
||||
help='Participation role for the calendar user'),
|
||||
'state': fields.selection([('tentative', 'Tentative'),
|
||||
('needs-action', 'Needs Action'),
|
||||
('accepted', 'Accepted'),
|
||||
('declined', 'Declined'),
|
||||
('delegated', 'Delegated')], 'State', readonly=True,\
|
||||
help="Status of the attendee's participation"),
|
||||
'rsvp': fields.boolean('Required Reply?',
|
||||
help="Indicats whether the favor of a reply is requested"),
|
||||
help='Participation role for the calendar user'),
|
||||
'state': fields.selection([('tentative', 'Tentative'),
|
||||
('needs-action', 'Needs Action'),
|
||||
('accepted', 'Accepted'),
|
||||
('declined', 'Declined'),
|
||||
('delegated', 'Delegated')], 'State', readonly=True, \
|
||||
help="Status of the attendee's participation"),
|
||||
'rsvp': fields.boolean('Required Reply?',
|
||||
help="Indicats whether the favor of a reply is requested"),
|
||||
'delegated_to': fields.function(_compute_data, method=True, \
|
||||
string='Delegated To', type="char", size=124, store=True, \
|
||||
multi='delegated_to', help="The users that the original \
|
||||
request was delegated to"),
|
||||
request was delegated to"),
|
||||
'delegated_from': fields.function(_compute_data, method=True, string=\
|
||||
'Delegated From', type="char", store=True, size=124, multi='delegated_from'),
|
||||
'parent_ids': fields.many2many('calendar.attendee', 'calendar_attendee_parent_rel',\
|
||||
'attendee_id', 'parent_id', 'Delegrated From'),
|
||||
'child_ids': fields.many2many('calendar.attendee', 'calendar_attendee_child_rel',\
|
||||
'attendee_id', 'child_id', 'Delegrated To'),
|
||||
'sent_by': fields.function(_compute_data, method=True, string='Sent By',\
|
||||
type="char", multi='sent_by', store=True, size=124,\
|
||||
help="Specify the user that is acting on behalf of the calendar user"),
|
||||
'sent_by_uid': fields.function(_compute_data, method=True, string='Sent By User',\
|
||||
type="many2one", relation="res.users", multi='sent_by_uid'),
|
||||
'cn': fields.function(_compute_data, method=True, string='Common name',\
|
||||
type="char", size=124, multi='cn', store=True),
|
||||
'Delegated From', type="char", store=True, size=124, multi='delegated_from'),
|
||||
'parent_ids': fields.many2many('calendar.attendee', 'calendar_attendee_parent_rel', \
|
||||
'attendee_id', 'parent_id', 'Delegrated From'),
|
||||
'child_ids': fields.many2many('calendar.attendee', 'calendar_attendee_child_rel', \
|
||||
'attendee_id', 'child_id', 'Delegrated To'),
|
||||
'sent_by': fields.function(_compute_data, method=True, string='Sent By', \
|
||||
type="char", multi='sent_by', store=True, size=124, \
|
||||
help="Specify the user that is acting on behalf of the calendar user"),
|
||||
'sent_by_uid': fields.function(_compute_data, method=True, string='Sent By User', \
|
||||
type="many2one", relation="res.users", multi='sent_by_uid'),
|
||||
'cn': fields.function(_compute_data, method=True, string='Common name', \
|
||||
type="char", size=124, multi='cn', store=True),
|
||||
'dir': fields.char('URI Reference', size=124, help="Reference to the URI\
|
||||
that points to the directory information corresponding to the attendee."),
|
||||
'language': fields.function(_compute_data, method=True, string='Language',\
|
||||
type="selection", selection=_lang_get, multi='language',\
|
||||
store=True, help="To specify the language for text values in a\
|
||||
property or property parameter."),
|
||||
'user_id': fields.many2one('res.users', 'User'),
|
||||
'partner_address_id': fields.many2one('res.partner.address', 'Contact'),
|
||||
'partner_id': fields.related('partner_address_id', 'partner_id', type='many2one',\
|
||||
relation='res.partner', string='Partner', help="Partner related to contact"),
|
||||
'email': fields.char('Email', size=124, help="Email of Invited Person"),
|
||||
'event_date': fields.function(_compute_data, method=True, string='Event Date',\
|
||||
type="datetime", multi='event_date'),
|
||||
'event_end_date': fields.function(_compute_data, method=True, string='Event End Date',\
|
||||
type="datetime", multi='event_end_date'),
|
||||
'ref': fields.reference('Event Ref', selection=_links_get, size=128),
|
||||
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
|
||||
that points to the directory information corresponding to the attendee."),
|
||||
'language': fields.function(_compute_data, method=True, string='Language', \
|
||||
type="selection", selection=_lang_get, multi='language', \
|
||||
store=True, help="To specify the language for text values in a\
|
||||
property or property parameter."),
|
||||
'user_id': fields.many2one('res.users', 'User'),
|
||||
'partner_address_id': fields.many2one('res.partner.address', 'Contact'),
|
||||
'partner_id': fields.related('partner_address_id', 'partner_id', type='many2one', \
|
||||
relation='res.partner', string='Partner', help="Partner related to contact"),
|
||||
'email': fields.char('Email', size=124, help="Email of Invited Person"),
|
||||
'event_date': fields.function(_compute_data, method=True, string='Event Date', \
|
||||
type="datetime", multi='event_date'),
|
||||
'event_end_date': fields.function(_compute_data, method=True, \
|
||||
string='Event End Date', type="datetime", \
|
||||
multi='event_end_date'),
|
||||
'ref': fields.reference('Event Ref', selection=_links_get, size=128),
|
||||
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
|
||||
}
|
||||
_defaults = {
|
||||
'state': lambda *x: 'needs-action',
|
||||
'state': lambda *x: 'needs-action',
|
||||
}
|
||||
|
||||
response_re = re.compile("Are you coming\?.*\n*.*(YES|NO|MAYBE).*", re.UNICODE)
|
||||
|
@ -421,7 +422,7 @@ request was delegated to"),
|
|||
if msg_actions['state'] in ['YES', 'NO', 'MAYBE']:
|
||||
mapping = {'YES': 'accepted', 'NO': 'declined', 'MAYBE': 'tentative'}
|
||||
status = mapping[msg_actions['state']]
|
||||
print 'Got response for invitation id: %s as %s' % (ids, status)
|
||||
print 'Got response for invitation id: %s as %s' % (ids, status)
|
||||
self.write(cr, uid, ids, {'state': status})
|
||||
return True
|
||||
|
||||
|
@ -440,37 +441,37 @@ request was delegated to"),
|
|||
sign = att.sent_by_uid and att.sent_by_uid.signature or ''
|
||||
sign = '<br>'.join(sign and sign.split('\n') or [])
|
||||
res_obj = att.ref
|
||||
sub = '[%s Invitation][%d] %s' % (company, att.id, res_obj.name)
|
||||
sub = '[%s Invitation][%d] %s' % (company, att.id, res_obj.name)
|
||||
att_infos = []
|
||||
other_invitaion_ids = self.search(cr, uid, [('ref','=', att.ref._name + ',' + str(att.ref.id))])
|
||||
other_invitaion_ids = self.search(cr, uid, [('ref', '=', att.ref._name + ',' + str(att.ref.id))])
|
||||
for att2 in self.browse(cr, uid, other_invitaion_ids):
|
||||
att_infos.append(((att2.user_id and att2.user_id.name) or \
|
||||
(att2.partner_id and att2.partner_id.name) or \
|
||||
att2.email) + ' - Status: ' + att2.state.title())
|
||||
body_vals = {'name': res_obj.name,
|
||||
'start_date': res_obj.date,
|
||||
'end_date': res_obj.date_deadline or False,
|
||||
'description': res_obj.description or '-',
|
||||
'location': res_obj.location or '-',
|
||||
'attendees': '<br>'.join(att_infos),
|
||||
'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User',
|
||||
'sign': sign,
|
||||
'company': company
|
||||
att2.email) + ' - Status: ' + att2.state.title())
|
||||
body_vals = {'name': res_obj.name,
|
||||
'start_date': res_obj.date,
|
||||
'end_date': res_obj.date_deadline or False,
|
||||
'description': res_obj.description or '-',
|
||||
'location': res_obj.location or '-',
|
||||
'attendees': '<br>'.join(att_infos),
|
||||
'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User',
|
||||
'sign': sign,
|
||||
'company': company
|
||||
}
|
||||
body = html_invitation % body_vals
|
||||
if mail_to and email_from:
|
||||
tools.email_send(
|
||||
email_from,
|
||||
mail_to,
|
||||
sub,
|
||||
body,
|
||||
subtype='html',
|
||||
reply_to=email_from
|
||||
)
|
||||
email_from,
|
||||
mail_to,
|
||||
sub,
|
||||
body,
|
||||
subtype='html',
|
||||
reply_to=email_from
|
||||
)
|
||||
return True
|
||||
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
|
||||
"""
|
||||
Make entry on email and availbility on change of user_id field.
|
||||
Make entry on email and availbility on change of user_id field.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of calendar attendee’s IDs.
|
||||
|
@ -496,7 +497,7 @@ request was delegated to"),
|
|||
|
||||
def do_accept(self, cr, uid, ids, context=None, *args):
|
||||
"""
|
||||
Update state which value is accepted.
|
||||
Update state which value is accepted.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of calendar attendee’s IDs.
|
||||
|
@ -512,7 +513,7 @@ request was delegated to"),
|
|||
mod_obj = self.pool.get(vals.ref._name)
|
||||
if vals.ref:
|
||||
if vals.ref.user_id.id != user.id:
|
||||
defaults = {'user_id': user.id}
|
||||
defaults = {'user_id': user.id}
|
||||
new_event = mod_obj.copy(cr, uid, vals.ref.id, default=defaults, context=context)
|
||||
self.write(cr, uid, vals.id, {'state': 'accepted'}, context)
|
||||
|
||||
|
@ -539,7 +540,7 @@ request was delegated to"),
|
|||
context = {}
|
||||
if not vals.get("email") and vals.get("cn"):
|
||||
cnval = vals.get("cn").split(':')
|
||||
email = filter(lambda x:x.__contains__('@'), cnval)
|
||||
email = filter(lambda x:x.__contains__('@'), cnval)
|
||||
vals['email'] = email[0]
|
||||
vals['cn'] = vals.get("cn")
|
||||
res = super(calendar_attendee, self).create(cr, uid, vals, context)
|
||||
|
@ -551,26 +552,30 @@ class res_alarm(osv.osv):
|
|||
_name = 'res.alarm'
|
||||
_description = 'Basic Alarm Information'
|
||||
_columns = {
|
||||
'name':fields.char('Name', size=256, required=True),
|
||||
'trigger_occurs': fields.selection([('before', 'Before'), ('after', 'After')], \
|
||||
'Triggers', required=True),
|
||||
'trigger_interval': fields.selection([('minutes', 'Minutes'), ('hours', 'Hours'), \
|
||||
('days', 'Days')], 'Interval', required=True),
|
||||
'trigger_duration': fields.integer('Duration', required=True),
|
||||
'trigger_related': fields.selection([('start', 'The event starts'), ('end', \
|
||||
'The event ends')], 'Related to', required=True),
|
||||
'name':fields.char('Name', size=256, required=True),
|
||||
'trigger_occurs': fields.selection([('before', 'Before'), \
|
||||
('after', 'After')], \
|
||||
'Triggers', required=True),
|
||||
'trigger_interval': fields.selection([('minutes', 'Minutes'), \
|
||||
('hours', 'Hours'), \
|
||||
('days', 'Days')], 'Interval', \
|
||||
required=True),
|
||||
'trigger_duration': fields.integer('Duration', required=True),
|
||||
'trigger_related': fields.selection([('start', 'The event starts'), \
|
||||
('end', 'The event ends')], \
|
||||
'Related to', required=True),
|
||||
'duration': fields.integer('Duration', help="""Duration' and 'Repeat' \
|
||||
are both optional, but if one occurs, so MUST the other"""),
|
||||
'repeat': fields.integer('Repeat'),
|
||||
are both optional, but if one occurs, so MUST the other"""),
|
||||
'repeat': fields.integer('Repeat'),
|
||||
'active': fields.boolean('Active', help="If the active field is set to \
|
||||
true, it will allow you to hide the event alarm information without removing it.")
|
||||
}
|
||||
_defaults = {
|
||||
'trigger_interval': lambda *x: 'minutes',
|
||||
'trigger_duration': lambda *x: 5,
|
||||
'trigger_occurs': lambda *x: 'before',
|
||||
'trigger_related': lambda *x: 'start',
|
||||
'active': lambda *x: 1,
|
||||
'trigger_interval': lambda *x: 'minutes',
|
||||
'trigger_duration': lambda *x: 5,
|
||||
'trigger_occurs': lambda *x: 'before',
|
||||
'trigger_related': lambda *x: 'start',
|
||||
'active': lambda *x: 1,
|
||||
}
|
||||
|
||||
def do_alarm_create(self, cr, uid, ids, model, date, context={}):
|
||||
|
@ -598,20 +603,20 @@ are both optional, but if one occurs, so MUST the other"""),
|
|||
self.do_alarm_unlink(cr, uid, [data.id], model)
|
||||
if basic_alarm:
|
||||
vals = {
|
||||
'action': 'display',
|
||||
'description': data.description,
|
||||
'name': data.name,
|
||||
'attendee_ids': [(6, 0, map(lambda x:x.id, data.attendee_ids))],
|
||||
'trigger_related': basic_alarm.trigger_related,
|
||||
'trigger_duration': basic_alarm.trigger_duration,
|
||||
'trigger_occurs': basic_alarm.trigger_occurs,
|
||||
'trigger_interval': basic_alarm.trigger_interval,
|
||||
'duration': basic_alarm.duration,
|
||||
'repeat': basic_alarm.repeat,
|
||||
'state': 'run',
|
||||
'event_date': data[date],
|
||||
'res_id': data.id,
|
||||
'model_id': model_id,
|
||||
'action': 'display',
|
||||
'description': data.description,
|
||||
'name': data.name,
|
||||
'attendee_ids': [(6, 0, map(lambda x:x.id, data.attendee_ids))],
|
||||
'trigger_related': basic_alarm.trigger_related,
|
||||
'trigger_duration': basic_alarm.trigger_duration,
|
||||
'trigger_occurs': basic_alarm.trigger_occurs,
|
||||
'trigger_interval': basic_alarm.trigger_interval,
|
||||
'duration': basic_alarm.duration,
|
||||
'repeat': basic_alarm.repeat,
|
||||
'state': 'run',
|
||||
'event_date': data[date],
|
||||
'res_id': data.id,
|
||||
'model_id': model_id,
|
||||
'user_id': uid
|
||||
}
|
||||
alarm_id = alarm_obj.create(cr, uid, vals)
|
||||
|
@ -640,7 +645,7 @@ are both optional, but if one occurs, so MUST the other"""),
|
|||
if alarm_ids:
|
||||
alarm_obj.unlink(cr, uid, alarm_ids)
|
||||
cr.execute('Update %s set base_calendar_alarm_id=NULL, alarm_id=NULL\
|
||||
where id=%s' % (model_obj._table, datas.id))
|
||||
where id=%s' % (model_obj._table, datas.id))
|
||||
cr.commit()
|
||||
return True
|
||||
|
||||
|
@ -653,41 +658,40 @@ class calendar_alarm(osv.osv):
|
|||
__attribute__ = {}
|
||||
|
||||
_columns = {
|
||||
'alarm_id': fields.many2one('res.alarm', 'Basic Alarm', ondelete='cascade'),
|
||||
'name': fields.char('Summary', size=124, help="""Contains the text to be \
|
||||
used as the message subject for email \
|
||||
or contains the text to be used for display"""),
|
||||
'action': fields.selection([('audio', 'Audio'), ('display', 'Display'), \
|
||||
('procedure', 'Procedure'), ('email', 'Email') ], 'Action', \
|
||||
required=True, help="Defines the action to be invoked when an alarm is triggered"),
|
||||
'description': fields.text('Description', help='Provides a more complete \
|
||||
description of the calendar component, than that \
|
||||
provided by the "SUMMARY" property'),
|
||||
'attendee_ids': fields.many2many('calendar.attendee', 'alarm_attendee_rel', \
|
||||
'alarm_id', 'attendee_id', 'Attendees', readonly=True),
|
||||
'attach': fields.binary('Attachment', help="""* Points to a sound resource,\
|
||||
which is rendered when the alarm is triggered for audio,
|
||||
* File which is intended to be sent as message attachments for email,
|
||||
* Points to a procedure resource, which is invoked when\
|
||||
the alarm is triggered for procedure."""),
|
||||
'res_id': fields.integer('Resource ID'),
|
||||
'model_id': fields.many2one('ir.model', 'Model'),
|
||||
'user_id': fields.many2one('res.users', 'Owner'),
|
||||
'event_date': fields.datetime('Event Date'),
|
||||
'event_end_date': fields.datetime('Event End Date'),
|
||||
'trigger_date': fields.datetime('Trigger Date', readonly="True"),
|
||||
'state':fields.selection([
|
||||
('draft', 'Draft'),
|
||||
('run', 'Run'),
|
||||
('stop', 'Stop'),
|
||||
('done', 'Done'),
|
||||
], 'State', select=True, readonly=True),
|
||||
}
|
||||
'alarm_id': fields.many2one('res.alarm', 'Basic Alarm', ondelete='cascade'),
|
||||
'name': fields.char('Summary', size=124, help="""Contains the text to be \
|
||||
used as the message subject for email \
|
||||
or contains the text to be used for display"""),
|
||||
'action': fields.selection([('audio', 'Audio'), ('display', 'Display'), \
|
||||
('procedure', 'Procedure'), ('email', 'Email') ], 'Action', \
|
||||
required=True, help="Defines the action to be invoked when an alarm is triggered"),
|
||||
'description': fields.text('Description', help='Provides a more complete \
|
||||
description of the calendar component, than that \
|
||||
provided by the "SUMMARY" property'),
|
||||
'attendee_ids': fields.many2many('calendar.attendee', 'alarm_attendee_rel', \
|
||||
'alarm_id', 'attendee_id', 'Attendees', readonly=True),
|
||||
'attach': fields.binary('Attachment', help="""* Points to a sound resource,\
|
||||
which is rendered when the alarm is triggered for audio,
|
||||
* File which is intended to be sent as message attachments for email,
|
||||
* Points to a procedure resource, which is invoked when\
|
||||
the alarm is triggered for procedure."""),
|
||||
'res_id': fields.integer('Resource ID'),
|
||||
'model_id': fields.many2one('ir.model', 'Model'),
|
||||
'user_id': fields.many2one('res.users', 'Owner'),
|
||||
'event_date': fields.datetime('Event Date'),
|
||||
'event_end_date': fields.datetime('Event End Date'),
|
||||
'trigger_date': fields.datetime('Trigger Date', readonly="True"),
|
||||
'state':fields.selection([('draft', 'Draft'),
|
||||
('run', 'Run'),
|
||||
('stop', 'Stop'),
|
||||
('done', 'Done'),
|
||||
], 'State', select=True, readonly=True),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'action': lambda *x: 'email',
|
||||
'state': lambda *x: 'run',
|
||||
}
|
||||
'action': lambda *x: 'email',
|
||||
'state': lambda *x: 'run',
|
||||
}
|
||||
|
||||
def create(self, cr, uid, vals, context={}):
|
||||
"""
|
||||
|
@ -708,7 +712,7 @@ class calendar_alarm(osv.osv):
|
|||
delta = timedelta(hours=vals['trigger_duration'])
|
||||
if vals['trigger_interval'] == 'minutes':
|
||||
delta = timedelta(minutes=vals['trigger_duration'])
|
||||
trigger_date = dtstart + (vals['trigger_occurs'] == 'after' and delta or -delta)
|
||||
trigger_date = dtstart + (vals['trigger_occurs'] == 'after' and delta or -delta)
|
||||
vals['trigger_date'] = trigger_date
|
||||
res = super(calendar_alarm, self).create(cr, uid, vals, context)
|
||||
return res
|
||||
|
@ -738,12 +742,12 @@ class calendar_alarm(osv.osv):
|
|||
for alarm in self.browse(cr, uid, alarm_ids):
|
||||
if alarm.action == 'display':
|
||||
value = {
|
||||
'name': alarm.name,
|
||||
'act_from': alarm.user_id.id,
|
||||
'act_to': alarm.user_id.id,
|
||||
'body': alarm.description,
|
||||
'trigger_date': alarm.trigger_date,
|
||||
'ref_doc1': '%s,%s' % (alarm.model_id.model, alarm.res_id)
|
||||
'name': alarm.name,
|
||||
'act_from': alarm.user_id.id,
|
||||
'act_to': alarm.user_id.id,
|
||||
'body': alarm.description,
|
||||
'trigger_date': alarm.trigger_date,
|
||||
'ref_doc1': '%s,%s' % (alarm.model_id.model, alarm.res_id)
|
||||
}
|
||||
request_id = request_obj.create(cr, uid, value)
|
||||
request_ids = [request_id]
|
||||
|
@ -755,7 +759,7 @@ class calendar_alarm(osv.osv):
|
|||
request_obj.request_send(cr, uid, request_ids)
|
||||
|
||||
if alarm.action == 'email':
|
||||
sub = '[Openobject Remainder] %s' % (alarm.name)
|
||||
sub = '[Openobject Remainder] %s' % (alarm.name)
|
||||
body = """
|
||||
Name: %s
|
||||
Date: %s
|
||||
|
@ -772,9 +776,9 @@ class calendar_alarm(osv.osv):
|
|||
mail_to.append(att.user_id.address_id.email)
|
||||
if mail_to:
|
||||
tools.email_send(
|
||||
tools.config.get('email_from', False),
|
||||
mail_to,
|
||||
sub,
|
||||
tools.config.get('email_from', False),
|
||||
mail_to,
|
||||
sub,
|
||||
body
|
||||
)
|
||||
self.write(cr, uid, [alarm.id], {'state':'done'})
|
||||
|
@ -813,7 +817,7 @@ class calendar_event(osv.osv):
|
|||
if end_date and not duration:
|
||||
end = datetime.strptime(end_date, "%Y-%m-%d %H:%M:%S")
|
||||
diff = end - start
|
||||
duration = float(diff.days)* 24 + (float(diff.seconds) / 3600)
|
||||
duration = float(diff.days)* 24 + (float(diff.seconds) / 3600)
|
||||
value['duration'] = round(duration, 2)
|
||||
elif not end_date:
|
||||
end = start + timedelta(hours=duration)
|
||||
|
@ -825,15 +829,16 @@ class calendar_event(osv.osv):
|
|||
Set rule string.
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param id: List of calendar event's ids.
|
||||
@param id: List of calendar event's ids.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: dictionary of rrule value.
|
||||
"""
|
||||
cr.execute("UPDATE %s set freq='',interval=0,count=0,end_date=Null,\
|
||||
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,\
|
||||
day=0,select1=False,month_list=0 ,byday=False where id=%s" % (self._table, id))
|
||||
day=0,select1='date',month_list=Null ,byday=Null where id=%s" % (self._table, id))
|
||||
|
||||
if not value:
|
||||
cr.execute("UPDATE %s set rrule_type='none' where id=%s" % (self._table, id))
|
||||
return True
|
||||
val = {}
|
||||
for part in value.split(';'):
|
||||
|
@ -846,7 +851,9 @@ class calendar_event(osv.osv):
|
|||
ans = value.split(';')
|
||||
for i in ans:
|
||||
val[i.split('=')[0].lower()] = i.split('=')[1].lower()
|
||||
if int(val.get('interval')) > 1: #If interval is other than 1 rule is custom
|
||||
if not val.get('interval'):
|
||||
rrule_type = 'custom'
|
||||
elif int(val.get('interval')) > 1: #If interval is other than 1 rule is custom
|
||||
rrule_type = 'custom'
|
||||
|
||||
qry = "UPDATE %(table)s set rrule_type=\'%(rule_type)s\' "
|
||||
|
@ -873,8 +880,12 @@ class calendar_event(osv.osv):
|
|||
|
||||
if val.get('byday'):
|
||||
d = val.get('byday')
|
||||
new_val['byday'] = d[:1]
|
||||
new_val['week_list'] = d[1:].upper()
|
||||
if '-' in d:
|
||||
new_val['byday'] = d[:2]
|
||||
new_val['week_list'] = d[2:4].upper()
|
||||
else:
|
||||
new_val['byday'] = d[:1]
|
||||
new_val['week_list'] = d[1:3].upper()
|
||||
new_val['select1'] = 'day'
|
||||
|
||||
if val.get('bymonth'):
|
||||
|
@ -901,92 +912,100 @@ class calendar_event(osv.osv):
|
|||
Get rule string.
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param id: List of calendar event's ids.
|
||||
@param id: List of calendar event's ids.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: dictionary of rrule value.
|
||||
"""
|
||||
result = {}
|
||||
for datas in self.read(cr, uid, ids):
|
||||
for datas in self.read(cr, uid, ids, context=context):
|
||||
event = datas['id']
|
||||
if datas.get('rrule_type'):
|
||||
if datas.get('rrule_type') == 'none':
|
||||
result[event] = False
|
||||
elif datas.get('rrule_type') == 'custom':
|
||||
rrule_custom = self.compute_rule_string(cr, uid, datas)
|
||||
if datas.get('interval', 0) < 0:
|
||||
raise osv.except_osv('Warning!', 'Interval can not be Negative')
|
||||
if datas.get('count', 0) < 0:
|
||||
raise osv.except_osv('Warning!', 'Count can not be Negative')
|
||||
rrule_custom = self.compute_rule_string(cr, uid, datas,\
|
||||
context=context)
|
||||
result[event] = rrule_custom
|
||||
else:
|
||||
result[event] = self.compute_rule_string(cr, uid, {'freq':\
|
||||
datas.get('rrule_type').upper(), \
|
||||
'interval': 1}, context=context)
|
||||
result[event] = self.compute_rule_string(cr, uid, {'freq': datas.get('rrule_type').upper(), 'interval': 1}, context=context)
|
||||
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'id': fields.integer('ID'),
|
||||
'sequence': fields.integer('Sequence'),
|
||||
'name': fields.char('Description', size=64, required=True),
|
||||
'date': fields.datetime('Date'),
|
||||
'date_deadline': fields.datetime('Deadline'),
|
||||
'create_date': fields.datetime('Created', readonly=True),
|
||||
'duration': fields.float('Duration'),
|
||||
'description': fields.text('Your action'),
|
||||
'id': fields.integer('ID'),
|
||||
'sequence': fields.integer('Sequence'),
|
||||
'name': fields.char('Description', size=64, required=True),
|
||||
'date': fields.datetime('Date'),
|
||||
'date_deadline': fields.datetime('Deadline'),
|
||||
'create_date': fields.datetime('Created', readonly=True),
|
||||
'duration': fields.float('Duration'),
|
||||
'description': fields.text('Your action'),
|
||||
'class': fields.selection([('public', 'Public'), ('private', 'Private'), \
|
||||
('confidential', 'Confidential')], 'Mark as'),
|
||||
'location': fields.char('Location', size=264, help="Location of Event"),
|
||||
'show_as': fields.selection([('free', 'Free'), \
|
||||
('busy', 'Busy')], 'Show as'),
|
||||
'base_calendar_url': fields.char('Caldav URL', size=264),
|
||||
'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], \
|
||||
'Show as'),
|
||||
'base_calendar_url': fields.char('Caldav URL', size=264),
|
||||
'exdate': fields.text('Exception Date/Times', help="This property \
|
||||
defines the list of date/time exceptions for arecurring calendar component."),
|
||||
defines the list of date/time exceptions for arecurring calendar component."),
|
||||
'exrule': fields.char('Exception Rule', size=352, help="defines a \
|
||||
rule or repeating pattern for anexception to a recurrence set"),
|
||||
'rrule': fields.function(_get_rulestring, type='char', size=124, method=True,\
|
||||
string='Recurrent Rule', store=True, fnct_inv=_set_rrulestring),
|
||||
rule or repeating pattern for anexception to a recurrence set"),
|
||||
'rrule': fields.function(_get_rulestring, type='char', size=124, method=True, \
|
||||
string='Recurrent Rule', store=True, \
|
||||
fnct_inv=_set_rrulestring, help='Defines a\
|
||||
rule or repeating pattern for recurring events\n\
|
||||
e.g.: Every other month on the last Sunday of the month for 10 occurrences:\
|
||||
FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU'),
|
||||
'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \
|
||||
('weekly', 'Weekly'), ('monthly', 'Monthly'), \
|
||||
('yearly', 'Yearly'), ('custom', 'Custom')], 'Recurrency'),
|
||||
'alarm_id': fields.many2one('res.alarm', 'Alarm'),
|
||||
'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'),
|
||||
'recurrent_uid': fields.integer('Recurrent ID'),
|
||||
'recurrent_id': fields.datetime('Recurrent ID date'),
|
||||
'vtimezone': fields.related('user_id', 'context_tz', type='char', size=24,\
|
||||
string='Timezone', store=True),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
('weekly', 'Weekly'), ('monthly', 'Monthly'), \
|
||||
('yearly', 'Yearly'), ('custom', 'Custom')], 'Recurrency'),
|
||||
'alarm_id': fields.many2one('res.alarm', 'Alarm'),
|
||||
'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'),
|
||||
'recurrent_uid': fields.integer('Recurrent ID'),
|
||||
'recurrent_id': fields.datetime('Recurrent ID date'),
|
||||
'vtimezone': fields.related('user_id', 'context_tz', type='char', size=24, \
|
||||
string='Timezone', store=True),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
'freq': fields.selection([('None', 'No Repeat'), \
|
||||
('secondly', 'Secondly'), \
|
||||
('minutely', 'Minutely'), \
|
||||
('hourly', 'Hourly'), \
|
||||
('daily', 'Daily'), \
|
||||
('weekly', 'Weekly'), \
|
||||
('monthly', 'Monthly'), \
|
||||
('yearly', 'Yearly')], 'Frequency'),
|
||||
'interval': fields.integer('Interval'),
|
||||
'count': fields.integer('Count'),
|
||||
'mo': fields.boolean('Mon'),
|
||||
'tu': fields.boolean('Tue'),
|
||||
'we': fields.boolean('Wed'),
|
||||
'th': fields.boolean('Thu'),
|
||||
'fr': fields.boolean('Fri'),
|
||||
'sa': fields.boolean('Sat'),
|
||||
'su': fields.boolean('Sun'),
|
||||
('secondly', 'Secondly'), \
|
||||
('minutely', 'Minutely'), \
|
||||
('hourly', 'Hourly'), \
|
||||
('daily', 'Daily'), \
|
||||
('weekly', 'Weekly'), \
|
||||
('monthly', 'Monthly'), \
|
||||
('yearly', 'Yearly')], 'Frequency'),
|
||||
'interval': fields.integer('Interval'),
|
||||
'count': fields.integer('Count'),
|
||||
'mo': fields.boolean('Mon'),
|
||||
'tu': fields.boolean('Tue'),
|
||||
'we': fields.boolean('Wed'),
|
||||
'th': fields.boolean('Thu'),
|
||||
'fr': fields.boolean('Fri'),
|
||||
'sa': fields.boolean('Sat'),
|
||||
'su': fields.boolean('Sun'),
|
||||
'select1': fields.selection([('date', 'Date of month'), \
|
||||
('day', 'Day of month')], 'Option'),
|
||||
'day': fields.integer('Date of month'),
|
||||
('day', 'Day of month')], 'Option'),
|
||||
'day': fields.integer('Date of month'),
|
||||
'week_list': fields.selection([('MO', 'Monday'), ('TU', 'Tuesday'), \
|
||||
('WE', 'Wednesday'), ('TH', 'Thursday'), \
|
||||
('FR', 'Friday'), ('SA', 'Saturday'), \
|
||||
('SU', 'Sunday')], 'Weekday'),
|
||||
('WE', 'Wednesday'), ('TH', 'Thursday'), \
|
||||
('FR', 'Friday'), ('SA', 'Saturday'), \
|
||||
('SU', 'Sunday')], 'Weekday'),
|
||||
'byday': fields.selection([('1', 'First'), ('2', 'Second'), \
|
||||
('3', 'Third'), ('4', 'Fourth'), \
|
||||
('5', 'Fifth'), ('-1', 'Last')], 'By day'),
|
||||
'month_list': fields.selection(months.items(), 'Month'),
|
||||
('3', 'Third'), ('4', 'Fourth'), \
|
||||
('5', 'Fifth'), ('-1', 'Last')], 'By day'),
|
||||
'month_list': fields.selection(months.items(), 'Month'),
|
||||
'end_date': fields.date('Repeat Until')
|
||||
}
|
||||
_defaults = {
|
||||
'class': lambda *a: 'public',
|
||||
'show_as': lambda *a: 'busy',
|
||||
'freq': lambda *x: 'None',
|
||||
'select1': lambda *x: 'date',
|
||||
'interval': lambda *x: 1,
|
||||
'class': lambda *a: 'public',
|
||||
'show_as': lambda *a: 'busy',
|
||||
'freq': lambda *x: 'None',
|
||||
'select1': lambda *x: 'date',
|
||||
'interval': lambda *x: 1,
|
||||
}
|
||||
|
||||
def modify_this(self, cr, uid, event_id, defaults, real_date, context=None, *args):
|
||||
|
@ -1004,11 +1023,11 @@ class calendar_event(osv.osv):
|
|||
event_id = base_calendar_id2real_id(event_id)
|
||||
datas = self.read(cr, uid, event_id, context=context)
|
||||
defaults.update({
|
||||
'recurrent_uid': base_calendar_id2real_id(datas['id']),
|
||||
'recurrent_id': defaults.get('date') or real_date,
|
||||
'rrule_type': 'none',
|
||||
'rrule': ''
|
||||
})
|
||||
'recurrent_uid': base_calendar_id2real_id(datas['id']),
|
||||
'recurrent_id': defaults.get('date') or real_date,
|
||||
'rrule_type': 'none',
|
||||
'rrule': ''
|
||||
})
|
||||
exdate = datas['exdate'] and datas['exdate'].split(',') or []
|
||||
if real_date and defaults.get('date'):
|
||||
exdate.append(real_date)
|
||||
|
@ -1032,7 +1051,7 @@ class calendar_event(osv.osv):
|
|||
defaults.update({'table': self._table})
|
||||
|
||||
qry = "UPDATE %(table)s set name = '%(name)s', \
|
||||
date = '%(date)s', date_deadline = '%(date_deadline)s'"
|
||||
date = '%(date)s', date_deadline = '%(date_deadline)s'"
|
||||
if defaults.get('alarm_id'):
|
||||
qry += ", alarm_id = %(alarm_id)s"
|
||||
if defaults.get('location'):
|
||||
|
@ -1060,7 +1079,7 @@ class calendar_event(osv.osv):
|
|||
result = []
|
||||
if ids and (base_start_date or base_until_date):
|
||||
cr.execute("select m.id, m.rrule, m.date, m.date_deadline, \
|
||||
m.exdate from " + self._table + \
|
||||
m.exdate from " + self._table + \
|
||||
" m where m.id in ("\
|
||||
+ ','.join(map(lambda x: str(x), ids))+")")
|
||||
|
||||
|
@ -1129,7 +1148,7 @@ class calendar_event(osv.osv):
|
|||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param datas: dictionary of freq and interval value.
|
||||
@return: string value which compute FREQILY;INTERVAL
|
||||
@return: string value which compute FREQILY;INTERVAL
|
||||
"""
|
||||
|
||||
weekdays = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
|
||||
|
@ -1141,9 +1160,8 @@ class calendar_event(osv.osv):
|
|||
if freq == 'None':
|
||||
return ''
|
||||
|
||||
if datas.get('interval') < 1:
|
||||
raise osv.except_osv(_('Error!'), ("Please select proper Interval"))
|
||||
|
||||
interval_srting = datas.get('interval') and (';INTERVAL=' + str(datas.get('interval'))) or ''
|
||||
|
||||
if freq == 'weekly':
|
||||
|
||||
byday = map(lambda x: x.upper(), filter(lambda x: datas.get(x) and x in weekdays, datas))
|
||||
|
@ -1159,7 +1177,7 @@ class calendar_event(osv.osv):
|
|||
monthstring = ';BYMONTHDAY=' + str(datas.get('day'))
|
||||
|
||||
elif freq == 'yearly':
|
||||
if datas.get('select1')=='date' and (datas.get('day') < 1 or datas.get('day') > 31):
|
||||
if datas.get('select1')=='date' and (datas.get('day') < 1 or datas.get('day') > 31):
|
||||
raise osv.except_osv(_('Error!'), ("Please select proper Day of month"))
|
||||
bymonth = ';BYMONTH=' + str(datas.get('month_list'))
|
||||
if datas.get('select1')=='day':
|
||||
|
@ -1170,19 +1188,19 @@ class calendar_event(osv.osv):
|
|||
|
||||
if datas.get('end_date'):
|
||||
datas['end_date'] = ''.join((re.compile('\d')).findall(datas.get('end_date'))) + '235959Z'
|
||||
enddate = (datas.get('count') and (';COUNT=' + str(datas.get('count'))) or '') +\
|
||||
enddate = (datas.get('count') and (';COUNT=' + str(datas.get('count'))) or '') +\
|
||||
((datas.get('end_date') and (';UNTIL=' + datas.get('end_date'))) or '')
|
||||
|
||||
rrule_string = 'FREQ=' + freq.upper() + weekstring + ';INTERVAL=' + \
|
||||
str(datas.get('interval')) + enddate + monthstring + yearstring
|
||||
rrule_string = 'FREQ=' + freq.upper() + weekstring + interval_srting \
|
||||
+ enddate + monthstring + yearstring
|
||||
|
||||
return rrule_string
|
||||
|
||||
|
||||
def search(self, cr, uid, args, offset=0, limit=100, order=None,
|
||||
def search(self, cr, uid, args, offset=0, limit=100, order=None,
|
||||
context=None, count=False):
|
||||
"""
|
||||
Overrides orm search method.
|
||||
Overrides orm search method.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param user: the current user’s ID for security checks,
|
||||
@param args: list of tuples of form [(‘name_of_the_field’, ‘operator’, value), ...].
|
||||
|
@ -1248,7 +1266,7 @@ class calendar_event(osv.osv):
|
|||
|
||||
def browse(self, cr, uid, ids, context=None, list_class=None, fields_process={}):
|
||||
"""
|
||||
Overrides orm browse method.
|
||||
Overrides orm browse method.
|
||||
@param self: the object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
|
@ -1269,7 +1287,7 @@ class calendar_event(osv.osv):
|
|||
|
||||
def read(self, cr, uid, ids, fields=None, context={}, load='_classic_read'):
|
||||
"""
|
||||
Overrides orm Read method.Read List of fields for calendar event.
|
||||
Overrides orm Read method.Read List of fields for calendar event.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param user: the current user’s ID for security checks,
|
||||
@param ids: List of calendar event's id.
|
||||
|
@ -1285,8 +1303,7 @@ class calendar_event(osv.osv):
|
|||
if fields and 'date' not in fields:
|
||||
fields.append('date')
|
||||
for base_calendar_id, real_id in select:
|
||||
res = super(calendar_event, self).read(cr, uid, real_id, fields=fields, context=context, \
|
||||
load=load)
|
||||
res = super(calendar_event, self).read(cr, uid, real_id, fields=fields, context=context, load=load)
|
||||
ls = base_calendar_id2real_id(base_calendar_id, with_date=res.get('duration', 0))
|
||||
if not isinstance(ls, (str, int, long)) and len(ls) >= 2:
|
||||
res['date'] = ls[1]
|
||||
|
@ -1328,7 +1345,7 @@ class calendar_event(osv.osv):
|
|||
for record in self.read(cr, uid, [base_calendar_id2real_id(id)], \
|
||||
['date', 'rrule', 'exdate']):
|
||||
if record['rrule']:
|
||||
exdate = (record['exdate'] and (record['exdate'] + ',') or '') + ''.join((re.compile('\d')).findall(date_new)) + 'Z'
|
||||
exdate = (record['exdate'] and (record['exdate'] + ',') or '') + ''.join((re.compile('\d')).findall(date_new)) + 'Z'
|
||||
if record['date'] == date_new:
|
||||
res = self.write(cr, uid, [base_calendar_id2real_id(id)], {'exdate': exdate})
|
||||
else:
|
||||
|
@ -1396,14 +1413,14 @@ class calendar_todo(osv.osv):
|
|||
"""
|
||||
|
||||
event = self.browse(cr, uid, id, context=context)
|
||||
cr.execute("UPDATE %s set date_start='%s' where id=%s" \
|
||||
% (self._table, value, id))
|
||||
cr.execute("UPDATE %s set date_start='%s' where id=%s" \
|
||||
% (self._table, value, id))
|
||||
return True
|
||||
|
||||
_columns = {
|
||||
'date': fields.function(_get_date, method=True, fnct_inv=_set_date, \
|
||||
string='Duration', store=True, type='datetime'),
|
||||
'duration': fields.integer('Duration'),
|
||||
string='Duration', store=True, type='datetime'),
|
||||
'duration': fields.integer('Duration'),
|
||||
}
|
||||
|
||||
__attribute__ = {}
|
||||
|
@ -1429,7 +1446,7 @@ class ir_attachment(osv.osv):
|
|||
args1.append(map(lambda x:str(x).split('-')[0], arg))
|
||||
return super(ir_attachment, self).search_count(cr, user, args1, context)
|
||||
|
||||
def search(self, cr, uid, args, offset=0, limit=None, order=None,
|
||||
def search(self, cr, uid, args, offset=0, limit=None, order=None,
|
||||
context=None, count=False):
|
||||
"""
|
||||
@param self: The object pointer
|
||||
|
@ -1445,8 +1462,8 @@ class ir_attachment(osv.osv):
|
|||
for i, arg in enumerate(new_args):
|
||||
if arg[0] == 'res_id':
|
||||
new_args[i] = (arg[0], arg[1], base_calendar_id2real_id(arg[2]))
|
||||
return super(ir_attachment, self).search(cr, uid, new_args, offset=offset,
|
||||
limit=limit, order=order,
|
||||
return super(ir_attachment, self).search(cr, uid, new_args, offset=offset,
|
||||
limit=limit, order=order,
|
||||
context=context, count=False)
|
||||
ir_attachment()
|
||||
|
||||
|
@ -1497,7 +1514,7 @@ class ir_model(osv.osv):
|
|||
|
||||
_inherit = 'ir.model'
|
||||
|
||||
def read(self, cr, uid, ids, fields=None, context={},
|
||||
def read(self, cr, uid, ids, fields=None, context={},
|
||||
load='_classic_read'):
|
||||
"""
|
||||
Read IR Model
|
||||
|
@ -1557,7 +1574,7 @@ class res_users(osv.osv):
|
|||
res = {}
|
||||
attendee_obj = self.pool.get('calendar.attendee')
|
||||
attendee_ids = attendee_obj.search(cr, uid, [
|
||||
('event_date', '<=', current_datetime), ('event_end_date', '<=', current_datetime),
|
||||
('event_date', '<=', current_datetime), ('event_end_date', '<=', current_datetime),
|
||||
('state', '=', 'accepted'), ('user_id', 'in', ids)
|
||||
])
|
||||
|
||||
|
@ -1589,8 +1606,9 @@ class res_users(osv.osv):
|
|||
_columns = {
|
||||
'availability': fields.function(_get_user_avail_fun, type='selection', \
|
||||
selection=[('free', 'Free'), ('busy', 'Busy')], \
|
||||
string='Free/Busy', method=True),
|
||||
string='Free/Busy', method=True),
|
||||
}
|
||||
res_users()
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -35,7 +35,7 @@ class calendar_event_edit_all(osv.osv_memory):
|
|||
context_id = context and context.get('active_id', False) or False
|
||||
if context_id:
|
||||
if context.get('date'):
|
||||
return context.get('date')
|
||||
return context.get('date')
|
||||
else:
|
||||
model = context.get('model', False)
|
||||
model_obj = self.pool.get(model)
|
||||
|
|
|
@ -47,7 +47,10 @@
|
|||
'base_contact_view.xml',
|
||||
'process/base_contact_process.xml'
|
||||
],
|
||||
'demo_xml': ['base_contact_demo.xml'],
|
||||
'demo_xml': ['base_contact_demo.xml'],
|
||||
'test': [
|
||||
'test/base_contact00.yml',
|
||||
],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '0031287885469',
|
||||
|
|
|
@ -205,12 +205,12 @@ class res_partner_job(osv.osv):
|
|||
self._order = 'sequence_contact'
|
||||
|
||||
contact_obj = self.pool.get('res.partner.contact')
|
||||
search_arg = ['|', ('first_name', 'ilike', arg[2]), ('name', 'ilike', arg[2])]
|
||||
contact_ids = contact_obj.search(cr, user, search_arg, offset=offset, \
|
||||
limit=limit, order=order, context=context, count=count)
|
||||
contacts = contact_obj.browse(cr, user, contact_ids, context=context)
|
||||
for contact in contacts:
|
||||
job_ids.extend([item.id for item in contact.job_ids])
|
||||
if arg[2] and not count:
|
||||
search_arg = ['|', ('first_name', 'ilike', arg[2]), ('name', 'ilike', arg[2])]
|
||||
contact_ids = contact_obj.search(cr, user, search_arg, offset=offset, limit=limit, order=order, context=context, count=count)
|
||||
contacts = contact_obj.browse(cr, user, contact_ids, context=context)
|
||||
for contact in contacts:
|
||||
job_ids.extend([item.id for item in contact.job_ids])
|
||||
|
||||
res = super(res_partner_job,self).search(cr, user, args, offset=offset,\
|
||||
limit=limit, order=order, context=context, count=count)
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
- |
|
||||
I will test base_contact for following cases:
|
||||
*contacts unrelated to a partner,
|
||||
*contacts working at several addresses (possibly for different partners),
|
||||
*contacts with possibly different functions for each of its job's addresses
|
||||
- |
|
||||
In order to assign language to contacts first I will create Language FR
|
||||
(Remove)
|
||||
-
|
||||
!record {model: res.lang, id: res_lang_french0}:
|
||||
code: fr_BE
|
||||
date_format: '%m/%d/%Y'
|
||||
decimal_point: .
|
||||
direction: ltr
|
||||
grouping: '[]'
|
||||
name: French
|
||||
time_format: '%H:%M:%S'
|
||||
- |
|
||||
In order to check contacts first I will create contact unrelated to a partner
|
||||
-
|
||||
!record {model: res.partner.contact, id: res_partner_contact_williams0}:
|
||||
country_id: base.be
|
||||
first_name: Laura
|
||||
job_ids:
|
||||
- email: lwilliams@mydomain.com
|
||||
function_id: base_contact.res_partner_function_privateaddress0
|
||||
phone: (+32).10.45.18.77
|
||||
sequence_contact: 1
|
||||
state: current
|
||||
lang_id: res_lang_french0
|
||||
mobile: (+32).10.45.18.77
|
||||
name: Williams
|
||||
title: Mss
|
||||
- |
|
||||
Now in order to assign this contact to partner I will create one partner assign contact laura to this partner
|
||||
-
|
||||
!record {model: res.partner, id: res_partner_laurascompany0}:
|
||||
address:
|
||||
- city: Namur
|
||||
country_id: base.be
|
||||
phone: (+32).10.45.18.77
|
||||
street: 23, street ways
|
||||
type: default
|
||||
zip: '2324324'
|
||||
job_ids:
|
||||
- address_id: res_partner_address_1
|
||||
function_id: base.function_director
|
||||
contact_id: res_partner_contact_williams0
|
||||
sequence_partner: 2
|
||||
state: current
|
||||
lang: fr_BE
|
||||
name: Laura's Company
|
||||
ref: LC
|
||||
title: ltd
|
||||
- |
|
||||
Now I will check that the new job is assigned properly to contact or not
|
||||
-
|
||||
!assert {model: res.partner.contact, id: res_partner_contact_williams0}:
|
||||
- len(job_ids) > 2
|
||||
- |
|
||||
In order to check contacts working at several addresses for different partners
|
||||
I will create contact with 2 different addresses
|
||||
-
|
||||
!record {model: res.partner.contact, id: res_partner_contact_pauwels0}:
|
||||
country_id: base.be
|
||||
first_name: Nicolas
|
||||
job_ids:
|
||||
- address_id: base.main_address
|
||||
function_id: base.function_it
|
||||
state: current
|
||||
- address_id: base.res_partner_address_3000
|
||||
function_id: base.function_director
|
||||
state: current
|
||||
lang_id: res_lang_french0
|
||||
mobile: (+32).23.44.32.12
|
||||
name: Pauwels
|
||||
title: M.
|
||||
- |
|
||||
In order to check one contact working at one partner with different functions
|
||||
I will create contact with 2 different jobs with different function but the same address
|
||||
-
|
||||
!record {model: res.partner.contact, id: res_partner_contact_mortier0}:
|
||||
country_id: base.be
|
||||
first_name: Christina
|
||||
job_ids:
|
||||
- address_id: base.res_partner_address_1
|
||||
function_id: base.function_director
|
||||
state: past
|
||||
- address_id: base.res_partner_address_1
|
||||
function_id: base.function_it
|
||||
state: current
|
||||
lang_id: base_contact.res_lang_french0
|
||||
mobile: (+32).10.45.18.77
|
||||
name: Mortier
|
||||
title: Mss
|
||||
|
|
@ -32,7 +32,7 @@
|
|||
* Files by Month (graph)
|
||||
""",
|
||||
'author': 'Tiny',
|
||||
'depends': ['board', 'document', 'report_document'],
|
||||
'depends': ['board', 'document'],
|
||||
'update_xml': ['board_document_view.xml'],
|
||||
'demo_xml': ['board_document_demo.xml'],
|
||||
'installable': True,
|
||||
|
|
|
@ -15,24 +15,24 @@
|
|||
<child1>
|
||||
<action
|
||||
string="New Files"
|
||||
name="%(report_document.action_view_all_document_tree1)d"
|
||||
name="%(document.action_view_all_document_tree1)d"
|
||||
view_mode="tree"
|
||||
domain="[('name','=',time.strftime('%%Y-%%m-01'))]"/>
|
||||
domain="[('name','=',time.strftime('%%Y')),('month','=',time.strftime('%%m'))]"/>
|
||||
|
||||
<action
|
||||
string="File Size by Month"
|
||||
name="%(report_document.action_view_size_month)d"
|
||||
name="%(document.action_view_size_month)d"
|
||||
view_mode="graph,tree"/>
|
||||
</child1>
|
||||
<child2>
|
||||
<action
|
||||
string="Files by Resource Type"
|
||||
name="%(report_document.action_view_document_by_resourcetype_graph)d"
|
||||
name="%(document.action_view_document_by_resourcetype_graph)d"
|
||||
view_mode="graph,tree"/>
|
||||
|
||||
<action
|
||||
string="Files by Partner"
|
||||
name="%(report_document.action_view_files_by_partner)d"
|
||||
name="%(document.action_view_files_by_partner)d"
|
||||
view_mode="graph,tree"/>
|
||||
</child2>
|
||||
</hpaned>
|
||||
|
@ -75,19 +75,19 @@
|
|||
<child1>
|
||||
<action
|
||||
string="Wall of Shame"
|
||||
name="%(report_document.action_view_wall)d"
|
||||
name="%(document.action_view_wall)d"
|
||||
view_mode="tree"/>
|
||||
|
||||
</child1>
|
||||
<child2>
|
||||
<action
|
||||
string="Files by Users"
|
||||
name="%(report_document.action_view_user_graph)d"
|
||||
name="%(document.action_view_user_graph)d"
|
||||
view_mode="graph,tree"/>
|
||||
|
||||
<action
|
||||
string="Files by Month"
|
||||
name="%(report_document.action_view_files_by_month_graph)d"
|
||||
name="%(document.action_view_files_by_month_graph)d"
|
||||
view_mode="graph,tree"/>
|
||||
</child2>
|
||||
</hpaned>
|
||||
|
|
|
@ -30,18 +30,18 @@ from tools.translate import _
|
|||
|
||||
MAX_LEVEL = 15
|
||||
AVAILABLE_STATES = [
|
||||
('draft', 'Draft'),
|
||||
('open', 'Open'),
|
||||
('cancel', 'Cancelled'),
|
||||
('done', 'Closed'),
|
||||
('draft', 'Draft'),
|
||||
('open', 'Open'),
|
||||
('cancel', 'Cancelled'),
|
||||
('done', 'Closed'),
|
||||
('pending', 'Pending')
|
||||
]
|
||||
|
||||
AVAILABLE_PRIORITIES = [
|
||||
('5', 'Lowest'),
|
||||
('4', 'Low'),
|
||||
('3', 'Normal'),
|
||||
('2', 'High'),
|
||||
('5', 'Lowest'),
|
||||
('4', 'Low'),
|
||||
('3', 'Normal'),
|
||||
('2', 'High'),
|
||||
('1', 'Highest')
|
||||
]
|
||||
|
||||
|
@ -53,12 +53,12 @@ class crm_case_section(osv.osv):
|
|||
_order = "name"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Sales Team', size=64, required=True, translate=True),
|
||||
'code': fields.char('Code', size=8),
|
||||
'name': fields.char('Sales Team', size=64, required=True, translate=True),
|
||||
'code': fields.char('Code', size=8),
|
||||
'active': fields.boolean('Active', help="If the active field is set to \
|
||||
true, it will allow you to hide the sales team without removing it."),
|
||||
'allow_unlink': fields.boolean('Allow Delete', help="Allows to delete non draft cases"),
|
||||
'user_id': fields.many2one('res.users', 'Responsible User'),
|
||||
true, it will allow you to hide the sales team without removing it."),
|
||||
'allow_unlink': fields.boolean('Allow Delete', help="Allows to delete non draft cases"),
|
||||
'user_id': fields.many2one('res.users', 'Responsible User'),
|
||||
'reply_to': fields.char('Reply-To', size=64, help="The email address put \
|
||||
in the 'Reply-To' of all emails sent by Open ERP about cases in this sales team"),
|
||||
'parent_id': fields.many2one('crm.case.section', 'Parent Team'),
|
||||
|
@ -69,8 +69,8 @@ class crm_case_section(osv.osv):
|
|||
}
|
||||
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'allow_unlink': lambda *a: 1,
|
||||
'active': lambda *a: 1,
|
||||
'allow_unlink': lambda *a: 1,
|
||||
}
|
||||
|
||||
_sql_constraints = [
|
||||
|
@ -100,18 +100,20 @@ class crm_case_section(osv.osv):
|
|||
(_check_recursion, 'Error ! You cannot create recursive sections.', ['parent_id'])
|
||||
]
|
||||
|
||||
def name_get(self, cr, uid, ids, context={}):
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
"""Overrides orm name_get method
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of section ids
|
||||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
if not len(ids):
|
||||
return []
|
||||
reads = self.read(cr, uid, ids, ['name', 'parent_id'], context)
|
||||
res = []
|
||||
if not ids:
|
||||
return res
|
||||
reads = self.read(cr, uid, ids, ['name', 'parent_id'], context)
|
||||
|
||||
for record in reads:
|
||||
name = record['name']
|
||||
|
@ -119,6 +121,7 @@ class crm_case_section(osv.osv):
|
|||
name = record['parent_id'][1] + ' / ' + name
|
||||
res.append((record['id'], name))
|
||||
return res
|
||||
|
||||
crm_case_section()
|
||||
|
||||
|
||||
|
@ -129,13 +132,13 @@ class crm_case_categ(osv.osv):
|
|||
_description = "Category of case"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Case Category Name', size=64, required=True, translate=True),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'object_id': fields.many2one('ir.model', 'Object Name'),
|
||||
'name': fields.char('Case Category Name', size=64, required=True, translate=True),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'object_id': fields.many2one('ir.model', 'Object Name'),
|
||||
}
|
||||
def _find_object_id(self, cr, uid, context=None):
|
||||
|
||||
"""
|
||||
"""Finds id for case object
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
|
@ -149,7 +152,7 @@ class crm_case_categ(osv.osv):
|
|||
_defaults = {
|
||||
'object_id' : _find_object_id
|
||||
}
|
||||
#
|
||||
|
||||
crm_case_categ()
|
||||
|
||||
|
||||
|
@ -161,19 +164,17 @@ class crm_case_resource_type(osv.osv):
|
|||
_rec_name = "name"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Case Resource Type', size=64, required=True, translate=True),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'object_id': fields.many2one('ir.model', 'Object Name'),
|
||||
'name': fields.char('Case Resource Type', size=64, required=True, translate=True),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'object_id': fields.many2one('ir.model', 'Object Name'),
|
||||
}
|
||||
def _find_object_id(self, cr, uid, context=None):
|
||||
"""
|
||||
"""Finds id for case object
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
|
||||
object_id = context and context.get('object_id', False) or False
|
||||
ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', object_id)])
|
||||
return ids and ids[0]
|
||||
|
@ -194,46 +195,44 @@ class crm_case_stage(osv.osv):
|
|||
_order = "sequence"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Stage Name', size=64, required=True, translate=True),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'name': fields.char('Stage Name', size=64, required=True, translate=True),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'sequence': fields.integer('Sequence', help="Gives the sequence order \
|
||||
when displaying a list of case stages."),
|
||||
'object_id': fields.many2one('ir.model', 'Object Name'),
|
||||
'probability': fields.float('Probability (%)', required=True),
|
||||
'on_change': fields.boolean('Change Probability Automatically',\
|
||||
help="Change Probability on next and previous stages."),
|
||||
when displaying a list of case stages."),
|
||||
'object_id': fields.many2one('ir.model', 'Object Name'),
|
||||
'probability': fields.float('Probability (%)', required=True),
|
||||
'on_change': fields.boolean('Change Probability Automatically', \
|
||||
help="Change Probability on next and previous stages."),
|
||||
'requirements': fields.text('Requirements')
|
||||
}
|
||||
def _find_object_id(self, cr, uid, context=None):
|
||||
|
||||
"""
|
||||
"""Finds id for case object
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
object_id = context and context.get('object_id', False) or False
|
||||
ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', object_id)])
|
||||
return ids and ids[0]
|
||||
|
||||
_defaults = {
|
||||
'sequence': lambda *args: 1,
|
||||
'probability': lambda *args: 0.0,
|
||||
'sequence': lambda *args: 1,
|
||||
'probability': lambda *args: 0.0,
|
||||
'object_id' : _find_object_id
|
||||
}
|
||||
|
||||
crm_case_stage()
|
||||
|
||||
def _links_get(self, cr, uid, context={}):
|
||||
def _links_get(self, cr, uid, context=None):
|
||||
"""Gets links value for reference field
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
|
||||
if not context:
|
||||
context = {}
|
||||
obj = self.pool.get('res.request.link')
|
||||
ids = obj.search(cr, uid, [])
|
||||
res = obj.read(cr, uid, ids, ['object', 'name'], context)
|
||||
|
@ -246,16 +245,13 @@ class crm_case(osv.osv):
|
|||
_description = "Case"
|
||||
|
||||
def _email_last(self, cursor, user, ids, name, arg, context=None):
|
||||
|
||||
"""Return History
|
||||
"""Return last email from History
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case’s IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
|
||||
res = {}
|
||||
for case in self.browse(cursor, user, ids):
|
||||
if case.history_line:
|
||||
|
@ -264,30 +260,31 @@ class crm_case(osv.osv):
|
|||
res[case.id] = False
|
||||
return res
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context={}):
|
||||
|
||||
"""
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
"""Overrides orm copy method
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case’s IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
if not context:
|
||||
context = {}
|
||||
if not default:
|
||||
default = {}
|
||||
default.update({'state': 'draft', 'id': False})
|
||||
return super(crm_case, self).copy(cr, uid, id, default, context)
|
||||
|
||||
def _get_log_ids(self, cr, uid, ids, field_names, arg, context={}):
|
||||
|
||||
"""
|
||||
def _get_log_ids(self, cr, uid, ids, field_names, arg, context=None):
|
||||
"""Gets id for case log from history of particular case
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case log’s IDs
|
||||
@param ids: List of Case IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
result = {}
|
||||
history_obj = False
|
||||
|
@ -306,7 +303,7 @@ class crm_case(osv.osv):
|
|||
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
model_ids = model_obj.search(cr, uid, [('model', '=', case._name)])
|
||||
history_ids = history_obj.search(cr, uid, [('model_id', '=', model_ids[0]),\
|
||||
history_ids = history_obj.search(cr, uid, [('model_id', '=', model_ids[0]), \
|
||||
('res_id', '=', case.id)])
|
||||
if history_ids:
|
||||
result[case.id] = {name: history_ids}
|
||||
|
@ -316,64 +313,60 @@ class crm_case(osv.osv):
|
|||
return result
|
||||
|
||||
_columns = {
|
||||
'id': fields.integer('ID', readonly=True),
|
||||
'name': fields.char('Description', size=1024, required=True),
|
||||
'id': fields.integer('ID', readonly=True),
|
||||
'name': fields.char('Description', size=1024, required=True),
|
||||
'active': fields.boolean('Active', help="If the active field is set to\
|
||||
true, it will allow you to hide the case without removing it."),
|
||||
'description': fields.text('Description'),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team',\
|
||||
true, it will allow you to hide the case without removing it."),
|
||||
'description': fields.text('Description'),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
|
||||
select=True, help='Sales team to which Case belongs to.\
|
||||
Define Responsible user and Email account for mail gateway.'),
|
||||
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
||||
Define Responsible user and Email account for mail gateway.'),
|
||||
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
||||
'email_cc': fields.text('Watchers Emails', size=252 , help="These people\
|
||||
will receive a copy of the future" \
|
||||
" communication between partner and users by email"),
|
||||
'probability': fields.float('Probability'),
|
||||
'email_last': fields.function(_email_last, method=True,
|
||||
string='Latest E-Mail', type='text'),
|
||||
'partner_id': fields.many2one('res.partner', 'Partner'),
|
||||
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact',\
|
||||
domain="[('partner_id','=',partner_id)]"),
|
||||
'create_date': fields.datetime('Creation Date' , readonly=True),
|
||||
'write_date': fields.datetime('Update Date' , readonly=True),
|
||||
'date_deadline': fields.date('Deadline'),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
'history_line': fields.function(_get_log_ids, method=True, type='one2many',\
|
||||
multi="history_line", relation="crm.case.history", string="Communication"),
|
||||
'log_ids': fields.function(_get_log_ids, method=True, type='one2many',\
|
||||
multi="log_ids", relation="crm.case.log", string="Logs History"),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage',\
|
||||
" communication between partner and users by email"),
|
||||
'probability': fields.float('Probability'),
|
||||
'email_last': fields.function(_email_last, method=True,
|
||||
string='Latest E-Mail', type='text'),
|
||||
'partner_id': fields.many2one('res.partner', 'Partner'),
|
||||
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
|
||||
domain="[('partner_id','=',partner_id)]"),
|
||||
'create_date': fields.datetime('Creation Date' , readonly=True),
|
||||
'write_date': fields.datetime('Update Date' , readonly=True),
|
||||
'date_deadline': fields.date('Deadline'),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
'history_line': fields.function(_get_log_ids, method=True, type='one2many', \
|
||||
multi="history_line", relation="crm.case.history", string="Communication"),
|
||||
'log_ids': fields.function(_get_log_ids, method=True, type='one2many', \
|
||||
multi="log_ids", relation="crm.case.log", string="Logs History"),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', \
|
||||
domain="[('section_id','=',section_id),\
|
||||
('object_id.model', '=', 'crm.opportunity')]"),
|
||||
'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True,
|
||||
('object_id.model', '=', 'crm.opportunity')]"),
|
||||
'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True,
|
||||
help='The state is set to \'Draft\', when a case is created.\
|
||||
\nIf the case is in progress the state is set to \'Open\'.\
|
||||
\nWhen the case is over, the state is set to \'Done\'.\
|
||||
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
}
|
||||
def _get_default_partner_address(self, cr, uid, context):
|
||||
|
||||
"""
|
||||
"""Gives id of default address for current user
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
if not context.get('portal', False):
|
||||
return False
|
||||
return self.pool.get('res.users').browse(cr, uid, uid, context).address_id.id
|
||||
|
||||
def _get_default_partner(self, cr, uid, context):
|
||||
|
||||
"""
|
||||
"""Gives id of partner for current user
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
if not context.get('portal', False):
|
||||
return False
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid, context)
|
||||
|
@ -382,14 +375,12 @@ class crm_case(osv.osv):
|
|||
return user.address_id.partner_id.id
|
||||
|
||||
def _get_default_email(self, cr, uid, context):
|
||||
|
||||
"""
|
||||
"""Gives default email address for current user
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
if not context.get('portal', False):
|
||||
return False
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid, context)
|
||||
|
@ -398,63 +389,66 @@ class crm_case(osv.osv):
|
|||
return user.address_id.email
|
||||
|
||||
def _get_default_user(self, cr, uid, context):
|
||||
"""
|
||||
"""Gives current user id
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
if context.get('portal', False):
|
||||
return False
|
||||
return uid
|
||||
|
||||
def _get_section(self, cr, uid, context):
|
||||
"""
|
||||
"""Gives section id for current User
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
|
||||
return user.context_section_id.id or False
|
||||
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'user_id': _get_default_user,
|
||||
'partner_id': _get_default_partner,
|
||||
'partner_address_id': _get_default_partner_address,
|
||||
'email_from': _get_default_email,
|
||||
'state': lambda *a: 'draft',
|
||||
'section_id': _get_section,
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
|
||||
'active': lambda *a: 1,
|
||||
'user_id': _get_default_user,
|
||||
'partner_id': _get_default_partner,
|
||||
'partner_address_id': _get_default_partner_address,
|
||||
'email_from': _get_default_email,
|
||||
'state': lambda *a: 'draft',
|
||||
'section_id': _get_section,
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
|
||||
}
|
||||
|
||||
_order = 'date_deadline desc, create_date desc,id desc'
|
||||
|
||||
def unlink(self, cr, uid, ids, context={}):
|
||||
|
||||
"""
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
"""Overrides orm unlink method
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case’s IDs
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
@param ids: List of case IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
if (not case.section_id.allow_unlink) and (case.state <> 'draft'):
|
||||
raise osv.except_osv(_('Warning !'),
|
||||
raise osv.except_osv(_('Warning !'),
|
||||
_('You can not delete this case. You should better cancel it.'))
|
||||
return super(crm_case, self).unlink(cr, uid, ids, context)
|
||||
|
||||
def stage_next(self, cr, uid, ids, context={}):
|
||||
"""
|
||||
def stage_next(self, cr, uid, ids, context=None):
|
||||
"""This function computes next stage for case from its current stage
|
||||
using available stage for that case type
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of stage next’s IDs
|
||||
@param ids: List of case IDs
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
s = self.get_stage_dict(cr, uid, ids, context=context)
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
|
@ -465,15 +459,17 @@ class crm_case(osv.osv):
|
|||
self.write(cr, uid, [case.id], {'stage_id': s[section][st]})
|
||||
return True
|
||||
|
||||
def get_stage_dict(self, cr, uid, ids, context={}):
|
||||
"""
|
||||
def get_stage_dict(self, cr, uid, ids, context=None):
|
||||
"""This function gives dictionary for stage according to stage levels
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of stage dict’s IDs
|
||||
@param ids: List of case IDs
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
sid = self.pool.get('crm.case.stage').search(cr, uid,\
|
||||
sid = self.pool.get('crm.case.stage').search(cr, uid, \
|
||||
[('object_id.model', '=', self._name)], context=context)
|
||||
s = {}
|
||||
previous = {}
|
||||
|
@ -484,20 +480,23 @@ class crm_case(osv.osv):
|
|||
previous[section] = stage.id
|
||||
return s
|
||||
|
||||
def stage_previous(self, cr, uid, ids, context={}):
|
||||
"""
|
||||
def stage_previous(self, cr, uid, ids, context=None):
|
||||
"""This function computes previous stage for case from its current stage
|
||||
using available stage for that case type
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of stage previous’s IDs
|
||||
@param ids: List of case IDs
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
s = self.get_stage_dict(cr, uid, ids, context=context)
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
section = (case.section_id.id or False)
|
||||
|
||||
if section in s:
|
||||
st = case.stage_id.id or False
|
||||
st = case.stage_id.id or False
|
||||
s[section] = dict([(v, k) for (k, v) in s[section].iteritems()])
|
||||
if st in s[section]:
|
||||
self.write(cr, uid, [case.id], {'stage_id': s[section][st]})
|
||||
|
@ -508,12 +507,17 @@ class crm_case(osv.osv):
|
|||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of History’s IDs
|
||||
@param ids: List of Case ids
|
||||
@param keyword: Case action keyword e.g.: If case is closed "Close" keyword is used
|
||||
@param history: Value True/False, If True it makes entry in case History otherwise in Case Log
|
||||
@param email: Email address if any
|
||||
@param details: Details of case history if any
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
model_obj = self.pool.get('ir.model')
|
||||
|
||||
obj = self.pool.get('crm.case.log')
|
||||
for case in cases:
|
||||
model_ids = model_obj.search(cr, uid, [('model', '=', case._name)])
|
||||
data = {
|
||||
|
@ -526,33 +530,31 @@ class crm_case(osv.osv):
|
|||
'message_id':message_id
|
||||
}
|
||||
|
||||
obj = self.pool.get('crm.case.log')
|
||||
if history:
|
||||
obj = self.pool.get('crm.case.history')
|
||||
data['description'] = details or case.description
|
||||
data['email_to'] = email or \
|
||||
(case.section_id and case.section_id.reply_to) or \
|
||||
(case.user_id and case.user_id.address_id and \
|
||||
case.user_id.address_id.email) or tools.config.get('email_from',False)
|
||||
case.user_id.address_id.email) or tools.config.get('email_from', False)
|
||||
data['email_from'] = email_from or \
|
||||
(case.section_id and case.section_id.reply_to) or \
|
||||
(case.user_id and case.user_id.address_id and \
|
||||
case.user_id.address_id.email) or tools.config.get('email_from',False)
|
||||
case.user_id.address_id.email) or tools.config.get('email_from', False)
|
||||
res = obj.create(cr, uid, data, context)
|
||||
return True
|
||||
|
||||
_history = __history
|
||||
history = __history
|
||||
|
||||
def create(self, cr, uid, *args, **argv):
|
||||
|
||||
"""
|
||||
"""Overrides orm create method
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param *args: Give Tuple Value
|
||||
@Paran **args: Give Dictionay of Keyword Value
|
||||
@param *args: Tuple Value for additional Params
|
||||
@param **argv: Dictionay of Keyword Params
|
||||
"""
|
||||
|
||||
res = super(crm_case, self).create(cr, uid, *args, **argv)
|
||||
cases = self.browse(cr, uid, [res])
|
||||
cases[0].state # to fill the browse record cache
|
||||
|
@ -560,97 +562,33 @@ class crm_case(osv.osv):
|
|||
return res
|
||||
|
||||
def add_reply(self, cursor, user, ids, context=None):
|
||||
|
||||
"""
|
||||
"""This function finds last email and gives its description value for reply mail
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param cursor: the current row, from the database cursor,
|
||||
@param user: the current user’s ID for security checks
|
||||
@param ids: List of case IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
for case in self.browse(cursor, user, ids, context=context):
|
||||
if case.email_last:
|
||||
description = case.email_last
|
||||
self.write(cursor, user, case.id, {
|
||||
'description': '> ' + description.replace('\n', '\n> '),
|
||||
'description': '> ' + description.replace('\n', '\n> '),
|
||||
}, context=context)
|
||||
return True
|
||||
|
||||
def case_log(self, cr, uid, ids, context={}, email=False, *args):
|
||||
|
||||
"""
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
@param *args: Give Tuple Value
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
self.__history(cr, uid, cases, _('Historize'), history=True, email=email)
|
||||
return self.write(cr, uid, ids, {'description': False, 'som': False,
|
||||
'canal_id': False})
|
||||
|
||||
def case_log_reply(self, cr, uid, ids, context={}, email=False, *args):
|
||||
|
||||
"""
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
@param *args: Give Tuple Value
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
for case in cases:
|
||||
if not case.email_from:
|
||||
raise osv.except_osv(_('Error!'),
|
||||
_('You must put a Partner eMail to use this action!'))
|
||||
|
||||
if not case.user_id:
|
||||
raise osv.except_osv(_('Error!'),
|
||||
_('You must define a responsible user for this case in order to use this action!'))
|
||||
|
||||
if not case.description:
|
||||
raise osv.except_osv(_('Error!'),
|
||||
_('Can not send mail with empty body,you should have description in the body'))
|
||||
|
||||
self.__history(cr, uid, cases, _('Send'), history=True, email=False)
|
||||
for case in cases:
|
||||
self.write(cr, uid, [case.id], {
|
||||
'description': False,
|
||||
})
|
||||
emails = [case.email_from] + (case.email_cc or '').split(',')
|
||||
emails = filter(None, emails)
|
||||
body = case.description or ''
|
||||
if case.user_id.signature:
|
||||
body += '\n\n%s' % (case.user_id.signature)
|
||||
|
||||
emailfrom = case.user_id.address_id and case.user_id.address_id.email or False
|
||||
if not emailfrom:
|
||||
raise osv.except_osv(_('Error!'),
|
||||
_("No E-Mail ID Found for your Company address!"))
|
||||
|
||||
tools.email_send(
|
||||
emailfrom,
|
||||
emails,
|
||||
'[' + str(case.id) + '] ' + case.name,
|
||||
self.format_body(body),
|
||||
reply_to = case.section_id.reply_to,
|
||||
openobject_id = str(case.id)
|
||||
)
|
||||
self.__history(cr, uid, [case], _('Send'), history=True, email=emails, details=body, email_from=emailfrom)
|
||||
return True
|
||||
|
||||
def onchange_partner_id(self, cr, uid, ids, part, email=False):
|
||||
"""
|
||||
"""This function returns value of partner address based on partner
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case IDs
|
||||
@param part: Partner's id
|
||||
@email: Partner's email ID
|
||||
"""
|
||||
if not part:
|
||||
return {'value': {'partner_address_id': False,
|
||||
'email_from': False,
|
||||
return {'value': {'partner_address_id': False,
|
||||
'email_from': False,
|
||||
}}
|
||||
addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['contact'])
|
||||
data = {'partner_address_id': addr['contact']}
|
||||
|
@ -658,29 +596,27 @@ class crm_case(osv.osv):
|
|||
return {'value': data}
|
||||
|
||||
def onchange_partner_address_id(self, cr, uid, ids, add, email=False):
|
||||
|
||||
"""
|
||||
"""This function returns value of partner email based on Partner Address
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case IDs
|
||||
@param add: Id of Partner's address
|
||||
@email: Partner's email ID
|
||||
"""
|
||||
|
||||
data = {}
|
||||
if not add:
|
||||
return {'value': {'email_from': False}}
|
||||
address = self.pool.get('res.partner.address').browse(cr, uid, add)
|
||||
data['email_from'] = address.email
|
||||
return {'value': data}
|
||||
return {'value': {'email_from': address.email}}
|
||||
|
||||
def case_close(self, cr, uid, ids, *args):
|
||||
"""
|
||||
"""Closes Case
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case's Ids
|
||||
@param *args: Give Tuple Value
|
||||
@param ids: List of case Ids
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
cases[0].state # to fill the browse record cache
|
||||
self.__history(cr, uid, cases, _('Close'))
|
||||
|
@ -692,14 +628,13 @@ class crm_case(osv.osv):
|
|||
return True
|
||||
|
||||
def case_escalate(self, cr, uid, ids, *args):
|
||||
"""
|
||||
"""Escalates case to top level
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case's Ids
|
||||
@param *args: Give Tuple Value
|
||||
@param ids: List of case Ids
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
for case in cases:
|
||||
data = {'active': True, 'user_id': False}
|
||||
|
@ -716,36 +651,33 @@ class crm_case(osv.osv):
|
|||
self._action(cr, uid, cases, 'escalate')
|
||||
return True
|
||||
|
||||
|
||||
def case_open(self, cr, uid, ids, *args):
|
||||
"""
|
||||
"""Opens Case
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case's Ids
|
||||
@param *args: Give Tuple Value
|
||||
@param ids: List of case Ids
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
self.__history(cr, uid, cases, _('Open'))
|
||||
|
||||
for case in cases:
|
||||
data = {'state': 'open', 'active': True}
|
||||
if not case.user_id:
|
||||
data['user_id'] = uid
|
||||
self.write(cr, uid, ids, data)
|
||||
self.write(cr, uid, case.id, data)
|
||||
self._action(cr, uid, cases, 'open')
|
||||
return True
|
||||
|
||||
|
||||
def case_cancel(self, cr, uid, ids, *args):
|
||||
"""
|
||||
"""Cancels Case
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case's Ids
|
||||
@param *args: Give Tuple Value
|
||||
@param ids: List of case Ids
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
cases[0].state # to fill the browse record cache
|
||||
self.__history(cr, uid, cases, _('Cancel'))
|
||||
|
@ -754,15 +686,13 @@ class crm_case(osv.osv):
|
|||
return True
|
||||
|
||||
def case_pending(self, cr, uid, ids, *args):
|
||||
|
||||
"""
|
||||
"""Marks case as pending
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case's Ids
|
||||
@param *args: Give Tuple Value
|
||||
@param ids: List of case Ids
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
cases[0].state # to fill the browse record cache
|
||||
self.__history(cr, uid, cases, _('Pending'))
|
||||
|
@ -771,15 +701,13 @@ class crm_case(osv.osv):
|
|||
return True
|
||||
|
||||
def case_reset(self, cr, uid, ids, *args):
|
||||
|
||||
"""
|
||||
"""Resets case as draft
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case's Ids
|
||||
@param *args: Give Tuple Value
|
||||
@param ids: List of case Ids
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
|
||||
cases = self.browse(cr, uid, ids)
|
||||
cases[0].state # to fill the browse record cache
|
||||
self.__history(cr, uid, cases, _('Draft'))
|
||||
|
@ -797,16 +725,16 @@ class crm_case_log(osv.osv):
|
|||
|
||||
_order = "id desc"
|
||||
_columns = {
|
||||
'name': fields.char('Status', size=64),
|
||||
'date': fields.datetime('Date'),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'user_id': fields.many2one('res.users', 'User Responsible', readonly=True),
|
||||
'model_id': fields.many2one('ir.model', "Model"),
|
||||
'res_id': fields.integer('Resource ID'),
|
||||
'name': fields.char('Status', size=64),
|
||||
'date': fields.datetime('Date'),
|
||||
'section_id': fields.many2one('crm.case.section', 'Section'),
|
||||
'user_id': fields.many2one('res.users', 'User Responsible', readonly=True),
|
||||
'model_id': fields.many2one('ir.model', "Model"),
|
||||
'res_id': fields.integer('Resource ID'),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
}
|
||||
|
||||
crm_case_log()
|
||||
|
@ -820,14 +748,13 @@ class crm_case_history(osv.osv):
|
|||
_inherits = {'crm.case.log': "log_id"}
|
||||
|
||||
def _note_get(self, cursor, user, ids, name, arg, context=None):
|
||||
|
||||
""" @param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case History’s IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
""" Gives case History Description
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case History’s IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
res = {}
|
||||
for hist in self.browse(cursor, user, ids, context or {}):
|
||||
res[hist.id] = (hist.email or '/') + ' (' + str(hist.date) + ')\n'
|
||||
|
@ -850,7 +777,7 @@ class users(osv.osv):
|
|||
_inherit = 'res.users'
|
||||
_description = "Users"
|
||||
_columns = {
|
||||
'context_section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'context_section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
}
|
||||
users()
|
||||
|
||||
|
@ -858,7 +785,7 @@ users()
|
|||
class res_partner(osv.osv):
|
||||
_inherit = 'res.partner'
|
||||
_columns = {
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||
}
|
||||
res_partner()
|
||||
|
||||
|
|
|
@ -88,7 +88,8 @@ class crm_opportunity(osv.osv):
|
|||
resource_id = False
|
||||
if opportunity.user_id:
|
||||
resource_ids = res_obj.search(cr, uid, [('user_id','=',opportunity.user_id.id)])
|
||||
resource_id = len(resource_ids) and resource_ids[0] or False
|
||||
if resource_ids and len(resource_ids):
|
||||
resource_id = resource_ids[0]
|
||||
|
||||
duration = float(ans.days)
|
||||
if opportunity.section_id.resource_calendar_id:
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
<field eval=""open"" name="state"/>
|
||||
<field eval="85000.0" name="planned_revenue"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="time.strftime('%Y-%m-07 10:05:15')" name="date"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor1"/>
|
||||
<field name="stage_id" ref="crm.stage_oppor3"/>
|
||||
<field eval=""CONS TRUST (AZ) 529701 - 1000 units"" name="name"/>
|
||||
|
@ -34,7 +33,6 @@
|
|||
<field eval="45000.0" name="planned_revenue"/>
|
||||
<field eval="50" name="probability"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="time.strftime('%Y-%m-05 12:25:15')" name="date"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor5"/>
|
||||
<field name="stage_id" ref="crm.stage_oppor1"/>
|
||||
<field eval=""3rd Round Funding - 1000 units "" name="name"/>
|
||||
|
@ -51,7 +49,6 @@
|
|||
<field eval="55000.0" name="planned_revenue"/>
|
||||
<field eval="70" name="probability"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="time.strftime('%Y-%m-14 13:55:10')" name="date"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor7"/>
|
||||
<field name="stage_id" ref="crm.stage_oppor5"/>
|
||||
<field eval=""Mediapole - 5000 units"" name="name"/>
|
||||
|
@ -68,7 +65,6 @@
|
|||
<field eval=""open"" name="state"/>
|
||||
<field eval="45000.0" name="planned_revenue"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="time.strftime('%Y-%m-23 16:32:23')" name="date"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor5"/>
|
||||
<field name="stage_id" ref="crm.stage_oppor4"/>
|
||||
<field eval=""ABC FUEL CO 829264 - 1000 units "" name="name"/>
|
||||
|
@ -84,7 +80,6 @@
|
|||
<field eval=""done"" name="state"/>
|
||||
<field eval="42000.0" name="planned_revenue"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="time.strftime('%Y-%m-25 16:05:15')" name="date"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor2"/>
|
||||
<field name="stage_id" ref="crm.stage_oppor6"/>
|
||||
<field eval=""Dirt Mining Ltd 271742 - 1000 units"" name="name"/>
|
||||
|
|
|
@ -53,42 +53,41 @@ class crm_lead2partner(osv.osv_memory):
|
|||
raise osv.except_osv(_('Warning !'),
|
||||
_('A partner is already defined on this lead.'))
|
||||
|
||||
def _select_partner(self, cr, uid, context=None):
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
"""
|
||||
This function Searches for Partner from selected lead.
|
||||
This function gets default values
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param fields: List of fields for default value
|
||||
@param context: A standard dictionary for contextual values
|
||||
|
||||
@return : Partner id if any for selected lead.
|
||||
@return : default values of fields.
|
||||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
lead_obj = self.pool.get('crm.lead')
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
contact_obj = self.pool.get('res.partner.address')
|
||||
rec_ids = context and context.get('active_ids', [])
|
||||
partner_id = False
|
||||
|
||||
for lead in lead_obj.browse(cr, uid, rec_ids, context=context):
|
||||
data = context and context.get('active_ids', []) or []
|
||||
res = super(crm_lead2partner, self).default_get(cr, uid, fields, context=context)
|
||||
|
||||
for lead in lead_obj.browse(cr, uid, data, context=context):
|
||||
partner_ids = partner_obj.search(cr, uid, [('name', '=', lead.partner_name or lead.name)])
|
||||
if not partner_ids and lead.email_from:
|
||||
address_ids = contact_obj.search(cr, uid, [('email', '=', lead.email_from)])
|
||||
if address_ids:
|
||||
addresses = contact_obj.browse(cr, uid, address_ids)
|
||||
partner_ids = addresses and [addresses[0].partner_id.id] or False
|
||||
|
||||
partner_id = partner_ids and partner_ids[0] or False
|
||||
return partner_id
|
||||
|
||||
_defaults = {
|
||||
'action': lambda *a:'exist',
|
||||
'partner_id': _select_partner
|
||||
}
|
||||
|
||||
if 'partner_id' in fields:
|
||||
res.update({'partner_id': partner_id})
|
||||
if 'action' in fields:
|
||||
res.update({'action': partner_id and 'exist' or 'create'})
|
||||
return res
|
||||
|
||||
def open_create_partner(self, cr, uid, ids, context=None):
|
||||
"""
|
||||
This function Opens form of create partner.
|
||||
|
|
|
@ -70,8 +70,8 @@ class crm_send_new_email(osv.osv_memory):
|
|||
|
||||
for data in self.read(cr, uid, ids, context=context):
|
||||
attach = filter(lambda x: x, [data['doc1'], data['doc2'], data['doc3']])
|
||||
attach = map(lambda x: x and ('Attachment'+str(attach.index(x)+1), base64.decodestring(x)), attach)
|
||||
|
||||
attach = map(lambda x: (data['doc' + str(attach.index(x) + 1) \
|
||||
+ '_fname'], base64.decodestring(x)), attach)
|
||||
message_id = None
|
||||
|
||||
case = case_pool.browse(cr, uid, res_id)
|
||||
|
|
|
@ -73,7 +73,7 @@ class document_file(osv.osv):
|
|||
|
||||
_columns = {
|
||||
'user_id': fields.many2one('res.users', 'Owner', select=1),
|
||||
'group_ids': fields.many2many('res.groups', 'document_directory_group_rel', 'item_id', 'group_id', 'Groups'),
|
||||
'group_ids': fields.many2many('res.groups', 'document_group_rel', 'item_id', 'group_id', 'Groups'),
|
||||
# the directory id now is mandatory. It can still be computed automatically.
|
||||
'parent_id': fields.many2one('document.directory', 'Directory', select=1, required=True),
|
||||
'file_size': fields.integer('File Size', required=True),
|
||||
|
|
|
@ -52,7 +52,7 @@ class document_directory(osv.osv):
|
|||
'ressource_type_id': fields.many2one('ir.model', 'Directories Mapped to Objects',
|
||||
help="Select an object here and Open ERP will create a mapping for each of these " \
|
||||
"objects, using the given domain, when browsing through FTP."),
|
||||
'resource_field': fields.char('Name field',size=32,help='Field to be used as name on resource directories. If empty, the "name" will be used.'),
|
||||
'resource_field': fields.many2one('ir.model.fields', 'Name field', help='Field to be used as name on resource directories. If empty, the "name" will be used.'),
|
||||
'ressource_parent_type_id': fields.many2one('ir.model', 'Parent Model',
|
||||
help="If you put an object here, this directory template will appear bellow all of these objects. " \
|
||||
"Don't put a parent directory if you select a parent model."),
|
||||
|
@ -61,10 +61,12 @@ class document_directory(osv.osv):
|
|||
help="Check this if you want to use the same tree structure as the object selected in the system."),
|
||||
'dctx_ids': fields.one2many('document.directory.dctx', 'dir_id', 'Context fields'),
|
||||
}
|
||||
|
||||
|
||||
def _get_root_directory(self, cr,uid, context=None):
|
||||
objid=self.pool.get('ir.model.data')
|
||||
try:
|
||||
mid = objid._get_id(cr, uid, 'document', 'dir_root')
|
||||
mid = objid._get_id(cr, uid, 'document', 'dir_root')
|
||||
if not mid:
|
||||
return False
|
||||
root_id = objid.read(cr, uid, mid, ['res_id'])['res_id']
|
||||
|
|
|
@ -103,7 +103,7 @@ class document_storage(osv.osv):
|
|||
'create_date': fields.datetime('Date Created', readonly=True),
|
||||
'create_uid': fields.many2one('res.users', 'Creator', readonly=True),
|
||||
'user_id': fields.many2one('res.users', 'Owner'),
|
||||
'group_ids': fields.many2many('res.groups', 'document_directory_group_rel', 'item_id', 'group_id', 'Groups'),
|
||||
'group_ids': fields.many2many('res.groups', 'document_storage_group_rel', 'item_id', 'group_id', 'Groups'),
|
||||
'dir_ids': fields.one2many('document.directory', 'parent_id', 'Directories'),
|
||||
'type': fields.selection([('db', 'Database'), ('filestore', 'Internal File storage'),
|
||||
('realstore', 'External file storage'), ('virtual', 'Virtual storage')], 'Type', required=True),
|
||||
|
|
|
@ -13,12 +13,16 @@
|
|||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Storage Media">
|
||||
<field name="name" select="1" colspan="4"/>
|
||||
<field name="user_id"/>
|
||||
<field name="type" />
|
||||
<field name="online" />
|
||||
<field name="readonly" />
|
||||
<field name="path" />
|
||||
<group colspan="4" col="4">
|
||||
<field name="name" select="1" colspan="4"/>
|
||||
<field name="user_id"/>
|
||||
<field name="type"/>
|
||||
<field name="online"/>
|
||||
<field name="readonly"/>
|
||||
</group>
|
||||
<group colspan="2" attrs="{'invisible':[('type','!=','realstore')]}">
|
||||
<field name="path"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -67,13 +71,13 @@
|
|||
<newline/>
|
||||
<field name="domain" attrs="{'required': [('type','=','ressource')], 'readonly': [('type','=','static')]}"/>
|
||||
<field name="ressource_tree"/>
|
||||
<field name="resource_field"/>
|
||||
<field name="ressource_id" readonly="1"/>
|
||||
<field name="resource_field" domain="[('model_id','=',ressource_type_id), ('ttype', 'in', ('char', 'selection', 'date', 'datetime'))]"/>
|
||||
<field name="ressource_id" select="2" readonly="1"/>
|
||||
<field name="ressource_parent_type_id"/>
|
||||
</page>
|
||||
<page string="Generated Files">
|
||||
<label colspan="4" string="For each entry here, virtual files will appear in this folder." />
|
||||
<field name="content_ids" nolabel="1" colspan="4">
|
||||
<field name="content_ids" nolabel="1" colspan="4" attrs="{'readonly': [('ressource_type_id','=',False)]}">
|
||||
<form string="Contents">
|
||||
<field name="name"/>
|
||||
<field name="sequence"/>
|
||||
|
|
|
@ -320,7 +320,7 @@ class node_res_dir(node_class):
|
|||
self.content_length = 0
|
||||
self.res_model = dirr.ressource_type_id and dirr.ressource_type_id.model or False
|
||||
self.resm_id = dirr.ressource_id
|
||||
self.namefield = dirr.resource_field or 'name'
|
||||
self.namefield = dirr.resource_field.name or 'name'
|
||||
self.displayname = dirr.name
|
||||
# Important: the domain is evaluated using the *parent* dctx!
|
||||
self.domain = dirr.domain
|
||||
|
@ -508,7 +508,7 @@ class node_res_obj(node_class):
|
|||
where1 = where + [(obj._parent_name, '=', self.res_id)]
|
||||
resids = obj.search(cr,uid, where1, context=ctx)
|
||||
for bo in obj.browse(cr,uid,resids,context=ctx):
|
||||
namefield = directory.resource_field or 'name'
|
||||
namefield = directory.resource_field.name or 'name'
|
||||
if not bo:
|
||||
continue
|
||||
res_name = getattr(bo, namefield)
|
||||
|
|
|
@ -23,7 +23,6 @@ import StringIO
|
|||
import odt2txt
|
||||
from subprocess import Popen, PIPE
|
||||
from content_index import indexer, cntIndex
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
def _to_unicode(s):
|
||||
try:
|
||||
|
|
|
@ -313,11 +313,13 @@ class hr_evaluation_interview(osv.osv):
|
|||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
record = self.browse(cr, uid, ids, context)
|
||||
record = record and record[0]
|
||||
context.update({'survey_id': record.survey_id.id, 'response_id' : [record.response.id], 'response_no':0,})
|
||||
value = self.pool.get("survey").action_print_survey(cr, uid, ids, context)
|
||||
return value
|
||||
|
||||
hr_evaluation_interview()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:1
|
||||
|
|
|
@ -163,7 +163,6 @@ class hr_applicant(osv.osv):
|
|||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
record = self.browse(cr, uid, ids, context)
|
||||
record = record and record[0]
|
||||
context.update({'survey_id': record.survey.id, 'response_id' : [record.response], 'response_no':0,})
|
||||
|
@ -179,4 +178,4 @@ class hr_job(osv.osv):
|
|||
'survey_id': fields.many2one('survey', 'Survey'),
|
||||
}
|
||||
|
||||
hr_job()
|
||||
hr_job()
|
|
@ -20,6 +20,7 @@
|
|||
##############################################################################
|
||||
|
||||
from osv import fields, osv
|
||||
from tools.translate import _
|
||||
|
||||
class idea_post_vote(osv.osv_memory):
|
||||
""" Post Vote For Idea """
|
||||
|
@ -35,6 +36,27 @@ class idea_post_vote(osv.osv_memory):
|
|||
('75', 'Good'),
|
||||
('100', 'Very Good') ], 'Post Vote', required=True)
|
||||
}
|
||||
|
||||
def view_init(self, cr, uid, fields, context=None):
|
||||
"""
|
||||
This function checks for precondition before wizard executes
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param fields: List of fields for default value
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
idea_obj = self.pool.get('idea.idea')
|
||||
|
||||
for idea in idea_obj.browse(cr, uid, context.get('active_ids', [])):
|
||||
if idea.state in ['draft', 'close', 'cancel']:
|
||||
raise osv.except_osv(_("Warning !"), _("Draft/Accepted/Cancelled \
|
||||
ideas Could not be voted"))
|
||||
if idea.state != 'open':
|
||||
raise osv.except_osv(_('Warning !'), _('idea should be in \
|
||||
\'Open\' state before vote for that idea.'))
|
||||
return False
|
||||
|
||||
|
||||
def do_vote(self, cr, uid, ids, context):
|
||||
|
||||
|
@ -52,6 +74,7 @@ class idea_post_vote(osv.osv_memory):
|
|||
for do_vote_obj in self.read(cr, uid, ids):
|
||||
score = str(do_vote_obj['vote'])
|
||||
dic = {'idea_id': data, 'user_id': uid, 'score': score }
|
||||
|
||||
vote = vote_obj.create(cr, uid, dic)
|
||||
return {}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -230,10 +230,11 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Olap Application">
|
||||
<newline/>
|
||||
<field name="name" select="1" colspan="2"/>
|
||||
<field name="query" select="1" colspan="2"/>
|
||||
<field name="table_ids" select="1" colspan="4" nolabel="1"/>
|
||||
<field name="field_ids" select="1" colspan="4" nolabel="1" rowspan="1"/>
|
||||
<field name="name" select="1" colspan="2"/>
|
||||
<separator colspan="4" string="Application query"/>
|
||||
<field name="query" select="1" colspan="4" nolabel="1"/>
|
||||
<field name="table_ids" select="1" colspan="4" nolabel="1"/>
|
||||
<field name="field_ids" select="1" colspan="4" nolabel="1" rowspan="1"/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -274,8 +275,9 @@
|
|||
<newline/>
|
||||
<field name="name" select="1" colspan="2"/>
|
||||
<field name="table_name" select="1" />
|
||||
<field name="is_hidden" select="1" colspan="2" />
|
||||
<field name="application_id" select="1" />
|
||||
<field name="is_hidden" select="1" colspan="2" />
|
||||
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -320,9 +322,10 @@
|
|||
<field name="name" select="1" colspan="2"/>
|
||||
<field name="field_name" select="1" />
|
||||
<field name="table_name" select="1" />
|
||||
<field name="application_id" select="1" />
|
||||
<newline/>
|
||||
<field name="is_hidden" select="1" colspan="2"/>
|
||||
<field name="application_id" select="1" />
|
||||
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -128,6 +128,7 @@ class survey(osv.osv):
|
|||
'context' : context
|
||||
}
|
||||
else:
|
||||
|
||||
datas['form'] = page_setting
|
||||
datas['model'] = 'survey.print'
|
||||
report = {
|
||||
|
|
|
@ -588,14 +588,15 @@ class survey_question_wiz(osv.osv_memory):
|
|||
self.pool.get(context.get('object',False)).survey_req_done(cr, uid, [int(context.get('cur_id'))], context)
|
||||
else:
|
||||
self.pool.get(context.get('object',False)).write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
|
||||
|
||||
for key,val in sur_name_read['store_ans'].items():
|
||||
for field in vals:
|
||||
if field.split('_')[0] == val['question_id']:
|
||||
click_state = False
|
||||
click_update.append(key)
|
||||
break
|
||||
|
||||
if sur_name_read['store_ans'] and type(sur_name_read['store_ans']) == dict:
|
||||
for key,val in sur_name_read['store_ans'].items():
|
||||
for field in vals:
|
||||
if field.split('_')[0] == val['question_id']:
|
||||
click_state = False
|
||||
click_update.append(key)
|
||||
break
|
||||
else:
|
||||
sur_name_read['store_ans'] = {}
|
||||
if click_state:
|
||||
que_li = []
|
||||
resp_id_list = []
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
'wizard/wizard_view.xml',
|
||||
'wizard/wiki_wiki_page_open_view.xml',
|
||||
'wizard/wiki_create_menu_view.xml',
|
||||
'wizard/wiki_wiki_help_open_view.xml',
|
||||
'wizard/wiki_make_index_view.xml',
|
||||
'wiki_view.xml',
|
||||
'data/wiki_quickstart.xml',
|
||||
|
|
|
@ -8,5 +8,4 @@
|
|||
"wiki_wizard_wiki_history_show_diff","wizard.wiki.history.show_diff","model_wizard_wiki_history_show_diff","base.group_user",1,1,1,1
|
||||
"wiki_wiki_page_open","wiki.wiki.page.open","model_wiki_wiki_page_open","base.group_user",1,1,1,1
|
||||
"wiki_create_menu","wiki.create.menu","model_wiki_create_menu","base.group_user",1,1,1,1
|
||||
"wiki_wiki_help_open","wiki.wiki.help.open","model_wiki_wiki_help_open","base.group_user",1,1,1,1
|
||||
"wiki_make_index","wiki.make.index","model_wiki_make_index","base.group_user",1,1,1,1
|
||||
|
|
|
|
@ -27,6 +27,7 @@
|
|||
##############################################################################
|
||||
|
||||
from osv import fields, osv
|
||||
from tools.translate import _
|
||||
import difflib
|
||||
|
||||
class Wiki(osv.osv):
|
||||
|
@ -44,19 +45,19 @@ class WikiGroup(osv.osv):
|
|||
_order = 'name'
|
||||
|
||||
_columns = {
|
||||
'name':fields.char('Wiki Group', size=256, select=True, required=True),
|
||||
'page_ids':fields.one2many('wiki.wiki', 'group_id', 'Pages'),
|
||||
'notes':fields.text("Description"),
|
||||
'create_date':fields.datetime("Created Date", select=True),
|
||||
'template': fields.text('Wiki Template'),
|
||||
'section': fields.boolean("Make Section ?"),
|
||||
'name':fields.char('Wiki Group', size=256, select=True, required=True),
|
||||
'page_ids':fields.one2many('wiki.wiki', 'group_id', 'Pages'),
|
||||
'notes':fields.text("Description"),
|
||||
'create_date':fields.datetime("Created Date", select=True),
|
||||
'template': fields.text('Wiki Template'),
|
||||
'section': fields.boolean("Make Section ?"),
|
||||
'method':fields.selection([('list', 'List'), ('page', 'Home Page'), \
|
||||
('tree', 'Tree')], 'Display Method'),
|
||||
'home':fields.many2one('wiki.wiki', 'Pages'),
|
||||
('tree', 'Tree')], 'Display Method'),
|
||||
'home':fields.many2one('wiki.wiki', 'Home Page'),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'method': lambda *a: 'page',
|
||||
'method': lambda *a: 'page',
|
||||
}
|
||||
|
||||
WikiGroup()
|
||||
|
@ -70,7 +71,7 @@ class GroupLink(osv.osv):
|
|||
_rec_name = 'action_id'
|
||||
|
||||
_columns = {
|
||||
'group_id': fields.many2one('wiki.groups', 'Parent Group', ondelete='set null'),
|
||||
'group_id': fields.many2one('wiki.groups', 'Parent Group', ondelete='set null'),
|
||||
'action_id': fields.many2one('ir.ui.menu', 'Menu')
|
||||
}
|
||||
|
||||
|
@ -85,22 +86,22 @@ class Wiki(osv.osv):
|
|||
_order = 'section,create_date desc'
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Title', size=256, select=True, required=True),
|
||||
'write_uid': fields.many2one('res.users', "Last Author"),
|
||||
'text_area': fields.text("Content"),
|
||||
'create_uid': fields.many2one('res.users', 'Author', select=True),
|
||||
'create_date': fields.datetime("Created on", select=True),
|
||||
'write_date': fields.datetime("Modification Date", select=True),
|
||||
'tags': fields.char('Tags', size=1024),
|
||||
'history_id': fields.one2many('wiki.wiki.history', 'wiki_id', 'History Lines'),
|
||||
'minor_edit': fields.boolean('Minor edit', select=True),
|
||||
'summary': fields.char('Summary', size=256),
|
||||
'section': fields.char('Sequence', size=32, help="Use page section code like 1.2.1"),
|
||||
'group_id': fields.many2one('wiki.groups', 'Wiki Group', select=1, ondelete='set null'),
|
||||
'toc': fields.boolean('Table of Contents'),
|
||||
'review': fields.boolean('Need Review'),
|
||||
'parent_id': fields.many2one('wiki.wiki', 'Parent Page'),
|
||||
'child_ids': fields.one2many('wiki.wiki', 'parent_id', 'Child Pages'),
|
||||
'name': fields.char('Title', size=256, select=True, required=True),
|
||||
'write_uid': fields.many2one('res.users', "Last Author"),
|
||||
'text_area': fields.text("Content"),
|
||||
'create_uid': fields.many2one('res.users', 'Author', select=True),
|
||||
'create_date': fields.datetime("Created on", select=True),
|
||||
'write_date': fields.datetime("Modification Date", select=True),
|
||||
'tags': fields.char('Tags', size=1024),
|
||||
'history_id': fields.one2many('wiki.wiki.history', 'wiki_id', 'History Lines'),
|
||||
'minor_edit': fields.boolean('Minor edit', select=True),
|
||||
'summary': fields.char('Summary', size=256),
|
||||
'section': fields.char('Sequence', size=32, help="Use page section code like 1.2.1"),
|
||||
'group_id': fields.many2one('wiki.groups', 'Wiki Group', select=1, ondelete='set null'),
|
||||
'toc': fields.boolean('Table of Contents'),
|
||||
'review': fields.boolean('Need Review'),
|
||||
'parent_id': fields.many2one('wiki.wiki', 'Parent Page'),
|
||||
'child_ids': fields.one2many('wiki.wiki', 'parent_id', 'Child Pages'),
|
||||
}
|
||||
|
||||
def onchange_group_id(self, cr, uid, ids, group_id, content, context={}):
|
||||
|
@ -125,7 +126,7 @@ class Wiki(osv.osv):
|
|||
section = '.'.join(s)
|
||||
return {
|
||||
'value':{
|
||||
'text_area': template,
|
||||
'text_area': template,
|
||||
'section': section
|
||||
}
|
||||
}
|
||||
|
@ -147,10 +148,10 @@ class Wiki(osv.osv):
|
|||
history = self.pool.get('wiki.wiki.history')
|
||||
if vals.get('text_area'):
|
||||
res = {
|
||||
'minor_edit': vals.get('minor_edit', True),
|
||||
'text_area': vals.get('text_area', ''),
|
||||
'write_uid': uid,
|
||||
'wiki_id': id,
|
||||
'minor_edit': vals.get('minor_edit', True),
|
||||
'text_area': vals.get('text_area', ''),
|
||||
'write_uid': uid,
|
||||
'wiki_id': id,
|
||||
'summary':vals.get('summary', '')
|
||||
}
|
||||
history.create(cr, uid, res)
|
||||
|
@ -166,15 +167,37 @@ class Wiki(osv.osv):
|
|||
if vals.get('text_area'):
|
||||
for id in ids:
|
||||
res = {
|
||||
'minor_edit': vals.get('minor_edit', True),
|
||||
'text_area': vals.get('text_area', ''),
|
||||
'write_uid': uid,
|
||||
'wiki_id': id,
|
||||
'minor_edit': vals.get('minor_edit', True),
|
||||
'text_area': vals.get('text_area', ''),
|
||||
'write_uid': uid,
|
||||
'wiki_id': id,
|
||||
'summary': vals.get('summary', '')
|
||||
}
|
||||
history.create(cr, uid, res)
|
||||
return result
|
||||
|
||||
def open_wiki_page(self, cr, uid, ids, context):
|
||||
|
||||
""" Opens Wiki Page for Editing
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of wiki page’s IDs
|
||||
|
||||
"""
|
||||
pages = self.pool.get('wiki.wiki').search(cr, uid, [('name', '=', 'Basic Wiki Editing')])
|
||||
if not pages:
|
||||
raise osv.except_osv(_('Warning !'), _("No Help page is defined"))
|
||||
value = {
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'wiki.wiki',
|
||||
'view_id': False,
|
||||
'res_id': pages[0],
|
||||
'type': 'ir.actions.act_window',
|
||||
'nodestroy': True,
|
||||
}
|
||||
return value
|
||||
|
||||
Wiki()
|
||||
|
||||
|
||||
|
@ -187,16 +210,16 @@ class History(osv.osv):
|
|||
_order = 'id DESC'
|
||||
|
||||
_columns = {
|
||||
'create_date': fields.datetime("Date", select=True),
|
||||
'text_area': fields.text("Text area"),
|
||||
'minor_edit': fields.boolean('This is a major edit ?', select=True),
|
||||
'summary': fields.char('Summary', size=256, select=True),
|
||||
'write_uid': fields.many2one('res.users', "Modify By", select=True),
|
||||
'create_date': fields.datetime("Date", select=True),
|
||||
'text_area': fields.text("Text area"),
|
||||
'minor_edit': fields.boolean('This is a major edit ?', select=True),
|
||||
'summary': fields.char('Summary', size=256, select=True),
|
||||
'write_uid': fields.many2one('res.users', "Modify By", select=True),
|
||||
'wiki_id': fields.many2one('wiki.wiki', 'Wiki Id', select=True)
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'write_uid': lambda obj, cr, uid, context: uid,
|
||||
'write_uid': lambda obj, cr, uid, context: uid,
|
||||
}
|
||||
|
||||
def getDiff(self, cr, uid, v1, v2, context={}):
|
||||
|
|
|
@ -124,12 +124,15 @@
|
|||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Wiki">
|
||||
<group col="6" colspan="4">
|
||||
<group col="8" colspan="4">
|
||||
<field name="name" select="1" colspan="6"/>
|
||||
<field name="group_id" select="1" on_change="onchange_group_id(group_id, text_area)"/>
|
||||
<field name="section" invisible="not context.get('section',False)"/>
|
||||
<field name="parent_id"/>
|
||||
<button name="open_wiki_page" type="object"
|
||||
string="Basic Wiki Editing" icon="gtk-ok" />
|
||||
</group>
|
||||
|
||||
<field name="text_area" nolabel="1" colspan="4" select="1" widget="text_wiki"/>
|
||||
<separator colspan="4" string="Modifications"/>
|
||||
<group col="6" colspan="4">
|
||||
|
@ -250,7 +253,7 @@
|
|||
<field name="key2">tree_but_open</field>
|
||||
<field name="model">wiki.groups</field>
|
||||
<field name="name">Search a Page</field>
|
||||
<field eval="'ir.actions.wizard,%d'%action_view_wiki_wiki_page_open" name="value"/>
|
||||
<field eval="'ir.actions.wizard,%d'%action_view_wiki_wiki_page_open" name="value"/>
|
||||
<field eval="True" name="object"/>
|
||||
</record>
|
||||
|
||||
|
|
|
@ -21,8 +21,7 @@
|
|||
|
||||
import wiki_wiki_page_open
|
||||
import wiki_create_menu
|
||||
import wiki_wiki_help_open
|
||||
import wiki_make_index
|
||||
import show_diff
|
||||
import wiki_show_diff
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -12,10 +12,12 @@
|
|||
<form string="Create Menu">
|
||||
<separator string="Menu Information" colspan="4"/>
|
||||
<label string="Want to create a Index on Selected Pages ? "/>
|
||||
<separator string="" colspan="4" />
|
||||
<label string="" colspan="2" />
|
||||
<button special="cancel" string="Cancel" />
|
||||
<button name="wiki_do_index" string="Create Index" type="object"/>
|
||||
<separator string="" colspan="6" />
|
||||
<label string="" colspan="2"/>
|
||||
<group>
|
||||
<button special="cancel" string="Cancel" icon="gtk-cancel" />
|
||||
<button name="wiki_do_index" string="Create Index" type="object" icon="gtk-ok"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -27,14 +27,13 @@ class showdiff(osv.osv_memory):
|
|||
|
||||
_name = 'wizard.wiki.history.show_diff'
|
||||
|
||||
def _get_diff(self, cr, uid, ctx):
|
||||
def get_diff(self, cr, uid, context=None):
|
||||
|
||||
""" @param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
"""
|
||||
|
||||
history = self.pool.get('wiki.wiki.history')
|
||||
ids = ctx.get('active_ids')
|
||||
ids = context.get('active_ids')
|
||||
diff = ""
|
||||
if len(ids) == 2:
|
||||
if ids[0] > ids[1]:
|
||||
|
@ -49,14 +48,15 @@ class showdiff(osv.osv_memory):
|
|||
diff = history.getDiff(cr, uid, ids[0], nids[-1])
|
||||
else:
|
||||
raise osv.except_osv(_('Warning'), _('You need to select minimum 1 or maximum 2 history revision!'))
|
||||
|
||||
return diff
|
||||
|
||||
_columns = {
|
||||
'diff': fields.text('Diff'),
|
||||
'diff': fields.text('Diff'),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'diff': _get_diff
|
||||
'diff': get_diff
|
||||
}
|
||||
|
||||
showdiff()
|
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- Create Index Form view -->
|
||||
|
||||
<record id="view_wiki_show_diff" model="ir.ui.view">
|
||||
<field name="name">Show Difference</field>
|
||||
<field name="model">wizard.wiki.history.show_diff</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Difference">
|
||||
<separator colspan="4" string="Notes"/>
|
||||
<field name="diff" nolabel="1" colspan="4" width="300"/>
|
||||
<label string="" colspan="2" />
|
||||
<group>
|
||||
<button special="cancel" string="OK" icon="gtk-ok" />
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Create Index Action -->
|
||||
|
||||
<record id="action_view_wiki_show_diff" model="ir.actions.act_window">
|
||||
<field name="name">Difference</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">wizard.wiki.history.show_diff</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<!-- Create Index Action Window -->
|
||||
|
||||
<act_window id="action_view_wiki_show_diff_values"
|
||||
key2="client_action_multi" name="Difference"
|
||||
res_model="wizard.wiki.history.show_diff" src_model="wiki.wiki.history"
|
||||
view_mode="form" target="new" view_type="form" />
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -1,54 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
||||
# $Id$
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import fields, osv
|
||||
|
||||
class wiki_wiki_help_open(osv.osv_memory):
|
||||
""" Basic Wiki Editing """
|
||||
_name = "wiki.wiki.help.open"
|
||||
_description = "Basic Wiki Editing"
|
||||
|
||||
def open_wiki_page(self, cr, uid, ids, context):
|
||||
|
||||
""" Opens Wiki Page for Editing
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of wiki page’s IDs
|
||||
|
||||
"""
|
||||
pages = self.pool.get('wiki.wiki').search(cr, uid, [('name', '=', 'Basic Wiki Editing')])
|
||||
|
||||
value = {
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'wiki.wiki',
|
||||
'view_id': False,
|
||||
'res_id': pages[0],
|
||||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
|
||||
return value
|
||||
|
||||
wiki_wiki_help_open()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- Editing Page Form view -->
|
||||
|
||||
<record id="view_wiki_wiki_help_open" model="ir.ui.view">
|
||||
<field name="name">Basic Wiki Editing</field>
|
||||
<field name="model">wiki.wiki.help.open</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Open Help">
|
||||
<separator string="" colspan="6" />
|
||||
<label string="" colspan="2" />
|
||||
<button name="open_wiki_page" string="Basic Wiki Editing" type="object"/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Editing Page Action -->
|
||||
|
||||
<record id="action_view_wiki_wiki_help_open" model="ir.actions.act_window">
|
||||
<field name="name">Basic Wiki Editing</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">wiki.wiki.help.open</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<!-- Editing Page Action window -->
|
||||
|
||||
<act_window id="action_view_wiki_wiki_help_open_vals"
|
||||
key2="client_action_multi" name="Basic Wiki Editing"
|
||||
res_model="wiki.wiki.help.open" src_model="wiki.wiki"
|
||||
view_mode="form" target="new" view_type="form" />
|
||||
</data>
|
||||
</openerp>
|
|
@ -35,18 +35,17 @@ class wiki_wiki_page_open(osv.osv_memory):
|
|||
@param ids: List of open wiki page’s IDs
|
||||
@return: dictionay of open wiki window on give group id
|
||||
"""
|
||||
|
||||
for group in self.pool.get('wiki.groups').browse(cr, uid, ids):
|
||||
|
||||
group_ids = context.get('active_ids', [])
|
||||
for group in self.pool.get('wiki.groups').browse(cr, uid, group_ids):
|
||||
value = {
|
||||
'domain': "[('group_id','=',%d)]" % (group.id),
|
||||
'name': 'Wiki Page',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'wiki.wiki',
|
||||
'view_id': False,
|
||||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
'domain': "[('group_id','=',%d)]" % (group.id),
|
||||
'name': 'Wiki Page',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'wiki.wiki',
|
||||
'view_id': False,
|
||||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
if group.method == 'page':
|
||||
value['res_id'] = group.home.id
|
||||
elif group.method == 'list':
|
||||
|
|
|
@ -11,8 +11,13 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Open Page">
|
||||
<separator string="" colspan="6" />
|
||||
<label string="" colspan="2" />
|
||||
<button name="open_wiki_page" string="Open Wiki Page" type="object"/>
|
||||
<label string="Want to open a wiki page? "/>
|
||||
<separator string="" colspan="6" />
|
||||
<label string="" colspan="2" />
|
||||
<group>
|
||||
<button special="cancel" string="Cancel" icon="gtk-cancel" />
|
||||
<button name="open_wiki_page" string="Open Wiki Page" type="object" icon="gtk-ok"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
Loading…
Reference in New Issue