in ForgeTracker/forgetracker/tracker_main.py [0:0]
def set_custom_fields(self, **post_data):
self.app.globals.open_status_names = post_data['open_status_names']
self.app.globals.closed_status_names = post_data['closed_status_names']
custom_fields = post_data.get('custom_fields', [])
for field in custom_fields:
if 'name' not in field or not field['name']:
field['name'] = '_' + '_'.join([
w for w in NONALNUM_RE.split(field['label'].lower()) if w])
if field['type'] == 'milestone':
field.setdefault('milestones', [])
existing_milestone_fld_names = {
mf.name for mf in self.app.globals.milestone_fields}
posted_milestone_fld_names = {
cf['name'] for cf in custom_fields if cf['type'] == 'milestone'}
deleted_milestone_fld_names = existing_milestone_fld_names -\
posted_milestone_fld_names
added_milestone_fld_names = posted_milestone_fld_names -\
existing_milestone_fld_names
# TODO: make milestone custom fields renameable
for milestone_fld_name in existing_milestone_fld_names |\
posted_milestone_fld_names:
if milestone_fld_name in deleted_milestone_fld_names:
# Milestone field deleted, remove it from tickets
tickets = TM.Ticket.query.find({
'app_config_id': self.app.config._id,
'custom_fields.%s' % milestone_fld_name:
{'$exists': True}}).all()
for t in tickets:
del t.custom_fields[milestone_fld_name]
elif milestone_fld_name in added_milestone_fld_names:
# Milestone field added, sanitize milestone names
milestone_fld = [
cf for cf in custom_fields
if cf['type'] == 'milestone'
and cf['name'] == milestone_fld_name][0]
for milestone in milestone_fld.get('milestones', []):
milestone['name'] = milestone['name'].replace("/", "-")
else:
# Milestone field updated, sanitize milestone names and update
# tickets if milestone names have changed
existing_milestone_fld = [
mf for mf in self.app.globals.milestone_fields
if mf.name == milestone_fld_name][0]
posted_milestone_fld = [
cf for cf in custom_fields
if cf['type'] == 'milestone'
and cf['name'] == milestone_fld_name][0]
existing_milestone_names = {
m.name for m in
existing_milestone_fld.get('milestones', [])}
old_posted_milestone_names = {
m['old_name']
for m in posted_milestone_fld.get('milestones', [])
if m.get('old_name', None)}
deleted_milestone_names = existing_milestone_names -\
old_posted_milestone_names
# Milestone deleted, remove it from tickets
tickets = TM.Ticket.query.find({
'app_config_id': self.app.config._id,
'custom_fields.%s' % milestone_fld_name:
{'$in': list(deleted_milestone_names)}}).all()
for t in tickets:
t.custom_fields[milestone_fld_name] = ''
for milestone in posted_milestone_fld.get('milestones', []):
milestone['name'] = milestone['name'].replace("/", "-")
old_name = milestone.pop('old_name', None)
if old_name and old_name in existing_milestone_names \
and old_name != milestone['name']:
# Milestone name updated, need to update tickets
tickets = TM.Ticket.query.find({
'app_config_id': self.app.config._id,
'custom_fields.%s' % milestone_fld_name:
old_name}).all()
for t in tickets:
t.custom_fields[milestone_fld_name] = \
milestone['name']
self.app.globals.custom_fields = custom_fields
flash('Fields updated')
redirect(six.ensure_text(request.referer or '/'))