in ForgeTracker/forgetracker/tracker_main.py [0:0]
def _update_ticket(self, post_data):
require_access(self.ticket, 'update')
old_text = self.ticket.description
new_text = post_data.get('description', '')
g.spam_checker.check(post_data.get('summary', '') + '\n' + post_data.get('description', ''),
artifact=self.ticket, user=c.user, content_type='ticket')
changes = changelog()
comment = post_data.pop('comment', None)
labels = post_data.pop('labels', None) or []
changes['labels'] = self.ticket.labels
self.ticket.labels = labels
changes['labels'] = self.ticket.labels
for k in ['summary', 'description', 'status']:
changes[k] = getattr(self.ticket, k)
setattr(self.ticket, k, post_data.pop(k, ''))
changes[k] = getattr(self.ticket, k)
if 'assigned_to' in post_data:
who = post_data['assigned_to']
changes['assigned_to'] = self.ticket.assigned_to
if who:
user = c.project.user_in_project(who)
if user:
self.ticket.assigned_to_id = user._id
else:
self.ticket.assigned_to_id = None
changes['assigned_to'] = self.ticket.assigned_to
# Register a key with the changelog -->
# Update the ticket property from the post_data -->
# Set the value of the changelog key again in case it has changed.
changes['private'] = 'Yes' if self.ticket.private else 'No'
self.ticket.private = post_data.get('private', False)
changes['private'] = 'Yes' if self.ticket.private else 'No'
changes['discussion'] = 'disabled' if self.ticket.discussion_disabled else 'enabled'
self.ticket.discussion_disabled = post_data.get('discussion_disabled', False)
changes['discussion'] = 'disabled' if self.ticket.discussion_disabled else 'enabled'
if 'attachment' in post_data:
attachment = post_data['attachment']
changes['attachments'] = attachments_info(self.ticket.attachments)
self.ticket.add_multiple_attachments(attachment)
# flush new attachments to db
session(self.ticket.attachment_class()).flush()
# self.ticket.attachments is ming's LazyProperty, we need to reset
# it's cache to fetch updated attachments here:
self.ticket.__dict__.pop('attachments')
changes['attachments'] = attachments_info(self.ticket.attachments)
for cf in c.app.globals.custom_fields or []:
if 'custom_fields.' + cf.name in post_data:
value = post_data['custom_fields.' + cf.name]
if cf.type == 'user':
# restrict custom user field values to project members
user = c.project.user_in_project(value)
value = user.username \
if user and user != M.User.anonymous() else ''
elif cf.name == '_milestone' and cf.name in post_data:
value = post_data[cf.name]
# unchecked boolean won't be passed in, so make it False here
elif cf.type == 'boolean':
value = False
else:
value = ''
if cf.type == 'number' and value == '':
value = None
if value is not None:
def cf_val(cf):
return self.ticket.get_custom_user(cf.name) \
if cf.type == 'user' \
else self.ticket.custom_fields.get(cf.name)
changes[cf.label] = cf_val(cf)
self.ticket.custom_fields[cf.name] = value
changes[cf.label] = cf_val(cf)
post_text, notification_text = render_changes(changes, comment)
thread = self.ticket.discussion_thread
if changes.get_changed() or post_text or notification_text:
thread.add_post(text=post_text, is_meta=True,
notification_text=notification_text)
self.ticket.commit()
if comment:
thread.post(text=comment, notify=False)
notification_tasks.send_usermentions_notification.post(self.ticket.index_id(), new_text, old_text)
g.director.create_activity(c.user, 'modified', self.ticket,
related_nodes=[c.project], tags=['ticket'])
c.app.globals.invalidate_bin_counts()
redirect('.')