Content Types ============= Compared with FeinCMS content types, pennyblack content types can provide further functionality Additional hooks **************** - replace_links This method if it exists is called before the newsletter is sent. It should replace all links with a newly generated link to be able to track every link click: :: HREF_RE = re.compile(r'href\="((\{\{[^}]+\}\}|[^"><])+)"') def replace_links(self, job): """ Replaces all links and inserts pingback links """ offset = 0 for match in HREF_RE.finditer(self.text): link = match.group(1) if check_if_redirect_url(link): continue # don't replace links to proxy view if u'link_url' in link: continue replacelink = job.add_link(link) self.text = ''.join((self.text[:match.start(1)+offset], replacelink, self.text[match.end(1)+offset:])) offset += len(replacelink) - len(match.group(1)) - prepare_to_send Is meant to add some additional style informations into the content. Because email clients often only accept inline style information. :: def prepare_to_send(self): """ insert link_style into all a tags """ self.text = re.sub(r"