Browse Source

Add support for styler pandas object, convert to inline css stylizing for wider email client support

Ethan 3 years ago
parent
commit
a2abb96b6a
2 changed files with 11 additions and 1 deletions
  1. 9 0
      redmail/email/body.py
  2. 2 1
      requirements.txt

+ 9 - 0
redmail/email/body.py

@@ -4,6 +4,7 @@ from io import BytesIO
 from pathlib import Path
 from pathlib import Path
 from typing import TYPE_CHECKING, Dict, Union, ByteString
 from typing import TYPE_CHECKING, Dict, Union, ByteString
 from pathlib import Path
 from pathlib import Path
+from premailer import transform
 
 
 
 
 from redmail.utils import is_bytes
 from redmail.utils import is_bytes
@@ -15,6 +16,8 @@ from jinja2.environment import Template, Environment
 
 
 from markupsafe import Markup
 from markupsafe import Markup
 
 
+from pandas.io.formats.style import Styler
+
 # We try to import matplotlib and PIL but if fails, they will be None
 # We try to import matplotlib and PIL but if fails, they will be None
 from .utils import PIL, plt, pd
 from .utils import PIL, plt, pd
 
 
@@ -63,6 +66,12 @@ class Body:
             raise ImportError("Missing package 'pandas'. Prettifying tables requires Pandas.")
             raise ImportError("Missing package 'pandas'. Prettifying tables requires Pandas.")
         
         
         extra = {} if extra is None else extra
         extra = {} if extra is None else extra
+
+        # Allow for pandas styler object, convert to inline CSS for email client rendering
+        # https://pandas.pydata.org/docs/reference/api/pandas.io.formats.style.Styler.html
+        if isinstance(tbl, Styler):
+            return transform(tbl.to_html())
+
         df = pd.DataFrame(tbl)
         df = pd.DataFrame(tbl)
 
 
         tbl_html = self.table_template.render({"df": df, **extra})
         tbl_html = self.table_template.render({"df": df, **extra})

+ 2 - 1
requirements.txt

@@ -5,4 +5,5 @@ jinja2
 pandas
 pandas
 matplotlib
 matplotlib
 Pillow
 Pillow
-openpyxl
+openpyxl
+premailer