import re from bs4 import BeautifulSoup from urllib.parse import urlencode from core_notifications.logs import logger def remap_dict(src: dict, mapping: dict, keep_missed: bool = False) -> dict: """Remaps existing dict values to new keys.""" result = {} for key, val in src.items(): new_key = mapping.get(key) if new_key is not None: result[new_key] = val elif keep_missed: result[key] = val return result def safe_strip(value): if value is not None and hasattr(value, "strip"): return value.strip() return value def split_long_lines(text: str, max_line_size: int): new_lines = [] for line in text.splitlines(): if len(line) >= max_line_size: line = "\n".join( re.findall(r".{1," + str(max_line_size) + r"}", line) ) new_lines.append(line) return "\n".join(new_lines) def replace_urls(body, analytic_url, **kwargs): soup = BeautifulSoup(body, "html.parser") if soup.find(): origin_urls = [link.get("href") for link in soup.findAll("a")] else: pattern = ( r"(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]" r"+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()" r"<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]" r"{};:'.,<>?«»“”‘’]))?" ) origin_urls = re.findall(pattern, body) origin_urls = [url for url in set(origin_urls) if url] for origin_url in origin_urls: kwargs["origin"] = origin_url replaced_url = f"{analytic_url}?{urlencode(kwargs)}" body = body.replace( origin_url, replaced_url, ) logger.bind(origin=origin_url, replaced_url=replaced_url).debug( "Replace url" ) return body