def find_channel_id_for_rule(project, actions, uuid, rule_id=None, user_id=None, **kwargs): redis_rule_status = RedisRuleStatus(uuid) try: project = Project.objects.get(id=project.id) except Project.DoesNotExist: redis_rule_status.set_value("failed") return user = None if user_id: try: user = User.objects.get(id=user_id) except User.DoesNotExist: pass organization = project.organization integration_id = None channel_name = None # TODO: make work for multiple Slack actions for action in actions: if action.get("workspace") and action.get("channel"): integration_id = action["workspace"] # we need to strip the prefix when searching on the channel name channel_name = strip_channel_name(action["channel"]) break try: integration = Integration.objects.get(provider="slack", organizations=organization, id=integration_id) except Integration.DoesNotExist: redis_rule_status.set_value("failed") return # we dont' know exactly how long it will take to paginate through all of the slack # endpoints but need some time limit imposed. 3 minutes should be more than enough time, # we can always update later try: (prefix, item_id, _timed_out) = get_channel_id_with_timeout(integration, channel_name, 3 * 60) except DuplicateDisplayNameError: # if we find a duplicate display name and nothing else, we # want to set the status to failed. This just lets us skip # over the next block and hit the failed status at the end. item_id = None if item_id: for action in actions: # need to make sure we are adding back the right prefix and also the channel_id if action.get("channel") and strip_channel_name( action.get("channel")) == channel_name: action["channel"] = prefix + channel_name action["channel_id"] = item_id break kwargs["actions"] = actions kwargs["project"] = project if rule_id: rule = Rule.objects.get(id=rule_id) rule = project_rules.Updater.run(rule=rule, pending_save=False, **kwargs) else: rule = project_rules.Creator.run(pending_save=False, **kwargs) if user: RuleActivity.objects.create( rule=rule, user=user, type=RuleActivityType.CREATED.value) redis_rule_status.set_value("success", rule.id) return # if we never find the channel name we failed :( redis_rule_status.set_value("failed")
def find_channel_id_for_rule( name, environment, project, action_match, conditions, actions, frequency, uuid, rule_id=None ): redis_rule_status = RedisRuleStatus(uuid) try: project = Project.objects.get(id=project.id) except Project.DoesNotExist: redis_rule_status.set_value("failed") return organization = project.organization integration_id = None channel_name = None for action in actions: if action.get("workspace") and action.get("channel"): integration_id = action["workspace"] # we need to strip the prefix when searching on the channel name channel_name = strip_channel_name(action["channel"]) break try: integration = Integration.objects.get( provider="slack", organizations=organization, id=integration_id ) except Integration.DoesNotExist: redis_rule_status.set_value("failed") return # we dont' know exactly how long it will take to paginate through all of the slack # endpoints but need some time limit imposed. 3 minutes should be more than enough time, # we can always update later (prefix, item_id, _timed_out) = get_channel_id_with_timeout(integration, channel_name, 3 * 60) if item_id: for action in actions: # need to make sure we are adding back the right prefix and also the channel_id if action.get("channel") and strip_channel_name(action.get("channel")) == channel_name: action["channel"] = prefix + channel_name action["channel_id"] = item_id break kwargs = { "name": name, "environment": environment, "project": project, "action_match": action_match, "conditions": conditions, "actions": actions, "frequency": frequency, } if rule_id: rule = Rule.objects.get(id=rule_id) rule = project_rules.Updater.run(rule=rule, pending_save=False, **kwargs) else: rule = project_rules.Creator.run(pending_save=False, **kwargs) redis_rule_status.set_value("success", rule.id) return # if we never find the channel name we failed :( redis_rule_status.set_value("failed")