about summary refs log tree commit diff
diff options
context:
space:
mode:
authorzsloan2020-08-25 15:53:29 -0500
committerGitHub2020-08-25 15:53:29 -0500
commit726179fc7f772246c4017fde4526f46bd1125270 (patch)
treefc311c5df3caf3e57c150e04fe8fddbbec4e2e89
parent82d169adce491011ae65839515cfb6b5400155fe (diff)
parentd18f24281a30759f4fbafe3e50d383438f38e2de (diff)
downloadgenenetwork2-726179fc7f772246c4017fde4526f46bd1125270.tar.gz
Merge pull request #425 from BonfaceKilz/refactor/extract-htmlgen-methods-to-wrapper-class
Refactor/extract htmlgen methods to wrapper class
-rw-r--r--wqflask/tests/wqflask/api/test_gen_menu.py6
-rw-r--r--wqflask/tests/wqflask/marker_regression/test_display_mapping_results.py151
-rw-r--r--wqflask/tests/wqflask/marker_regression/test_display_marking_results.py9
-rw-r--r--wqflask/utility/Plot.py10
-rw-r--r--wqflask/wqflask/marker_regression/display_mapping_results.py281
5 files changed, 364 insertions, 93 deletions
diff --git a/wqflask/tests/wqflask/api/test_gen_menu.py b/wqflask/tests/wqflask/api/test_gen_menu.py
index 79c77fec..239484aa 100644
--- a/wqflask/tests/wqflask/api/test_gen_menu.py
+++ b/wqflask/tests/wqflask/api/test_gen_menu.py
@@ -255,9 +255,9 @@ class TestGenMenu(unittest.TestCase):
             ('Mouse Tissue'), ('Human Tissue'), ('Rat Tissue')
         )
         self.assertEqual(build_types('mouse', 'random group'),
-                         [['M', 'M', 'Molecular Trait Datasets'],
-                          ['H', 'H', 'Molecular Trait Datasets'],
-                          ['R', 'R', 'Molecular Trait Datasets']])
+                         [['M', 'M', 'Molecular Traits'],
+                          ['H', 'H', 'Molecular Traits'],
+                          ['R', 'R', 'Molecular Traits']])
         db_mock.db.execute.assert_called_once_with(
             "SELECT DISTINCT Tissue.Name " +
             "FROM ProbeFreeze, ProbeSetFreeze, InbredSet, " +
diff --git a/wqflask/tests/wqflask/marker_regression/test_display_mapping_results.py b/wqflask/tests/wqflask/marker_regression/test_display_mapping_results.py
new file mode 100644
index 00000000..6f791df1
--- /dev/null
+++ b/wqflask/tests/wqflask/marker_regression/test_display_mapping_results.py
@@ -0,0 +1,151 @@
+import unittest
+
+from htmlgen import HTMLgen2 as HT
+from wqflask.marker_regression.display_mapping_results import (
+    DisplayMappingResults,
+    HtmlGenWrapper
+)
+
+
+class TestDisplayMappingResults(unittest.TestCase):
+    """Basic Methods to test Mapping Results"""
+    def test_pil_colors(self):
+        """Test that colors use PILLOW color format"""
+        self.assertEqual(DisplayMappingResults.CLICKABLE_WEBQTL_REGION_COLOR,
+                         (245, 211, 211))
+
+
+class TestHtmlGenWrapper(unittest.TestCase):
+    """Test Wrapper around HTMLGen"""
+    def test_create_image(self):
+        """Test HT.Image method"""
+        self.assertEqual(
+            str(HtmlGenWrapper.create_image_tag(src="test.png",
+                                                alt="random",
+                                                border="0",
+                                                width="10",
+                                                height="13",
+                                                usemap="#webqtlmap")),
+            ("""<IMG src="test.png" height="13" width="10" """
+             """alt="random" border="0" """
+             """usemap="#webqtlmap">""")
+        )
+
+    def test_create_form(self):
+        """Test HT.Form method"""
+        test_form = HtmlGenWrapper.create_form_tag(
+            cgi="/testing/",
+            enctype='multipart/form-data',
+            name="formName",
+            submit=HT.Input(type='hidden')
+        )
+        test_image = HtmlGenWrapper.create_image_tag(
+            src="test.png",
+            alt="random",
+            border="0",
+            width="10",
+            height="13",
+            usemap="#webqtlmap"
+        )
+        self.assertEqual(
+            str(test_form).replace("\n", ""),
+            ("""<FORM METHOD="POST" ACTION="/testing/" """
+             """ENCTYPE="multipart/form-data" """
+             """NAME="formName"><INPUT TYPE="hidden" """
+             """NAME="Default_Name"></FORM>"""))
+        hddn = {
+            'FormID': 'showDatabase',
+            'ProbeSetID': '_',
+            'database': "TestGeno",
+            'CellID': '_',
+            'RISet': "Test",
+            'incparentsf1': 'ON'
+        }
+        for key in hddn.keys():
+            test_form.append(HT.Input(name=key, value=hddn[key],
+                                      type='hidden'))
+        test_form.append(test_image)
+        self.assertEqual(str(test_form).replace("\n", ""), (
+            """<FORM METHOD="POST" ACTION="/testing/" """
+            """ENCTYPE="multipart/form-data" NAME="formName">"""
+            """<INPUT TYPE="hidden" NAME="database" VALUE="TestGeno">"""
+            """<INPUT TYPE="hidden" NAME="incparentsf1" VALUE="ON">"""
+            """<INPUT TYPE="hidden" NAME="FormID" VALUE="showDatabase">"""
+            """<INPUT TYPE="hidden" NAME="ProbeSetID" VALUE="_">"""
+            """<INPUT TYPE="hidden" NAME="RISet" VALUE="Test">"""
+            """<INPUT TYPE="hidden" NAME="CellID" VALUE="_">"""
+            """<IMG src="test.png" height="13" width="10" alt="random" """
+            """border="0" usemap="#webqtlmap">"""
+            """<INPUT TYPE="hidden" NAME="Default_Name"></FORM>"""))
+
+    def test_create_paragraph(self):
+        """Test HT.Paragraph method"""
+        test_p_element = HtmlGenWrapper.create_p_tag(id="smallSize")
+        par_text = (
+            "Mapping using genotype data as "
+            "a trait will result in infinity LRS at one locus. "
+            "In order to display the result properly, all LRSs "
+            "higher than 100 are capped at 100."
+        )
+        self.assertEqual(
+            str(test_p_element),
+            """<P id="smallSize"></P>"""
+        )
+        test_p_element.append(HT.BR())
+        test_p_element.append(par_text)
+        self.assertEqual(
+            str(test_p_element),
+            """<P id="smallSize"><BR>{}</P>""".format(par_text)
+        )
+
+    def test_create_br_tag(self):
+        """Test HT.BR() method"""
+        self.assertEqual(str(HtmlGenWrapper.create_br_tag()),
+                         "<BR>")
+
+    def test_create_input_tag(self):
+        """Test HT.Input method"""
+        self.assertEqual(
+            str(HtmlGenWrapper.create_input_tag(
+                type="hidden",
+                name="name",
+                value="key",
+                Class="trait trait_")).replace("\n", ""),
+            ("""<INPUT TYPE="hidden" NAME="name" """
+             """class="trait trait_" VALUE="key">"""))
+
+    def test_create_map_tag(self):
+        """Test HT.Map method"""
+        self.assertEqual(str(HtmlGenWrapper.create_map_tag(
+            name="WebqTLImageMap")).replace("\n", ""),
+            """<MAP NAME="WebqTLImageMap"></MAP>""")
+        gifmap = HtmlGenWrapper.create_map_tag(areas=[])
+        gifmap.areas.append(HT.Area(shape="rect",
+                                    coords='1 2 3', href='#area1'))
+        gifmap.areas.append(HT.Area(shape="rect",
+                                    coords='1 2 3', href='#area2'))
+        self.assertEqual(
+            str(gifmap).replace("\n", ""),
+            ("""<MAP NAME="">"""
+             """<AREA coords="1 2 3" """
+             """href="#area1" shape="rect">"""
+             """<AREA coords="1 2 3" href="#area2" shape="rect">"""
+             """</MAP>"""))
+
+    def test_create_area_tag(self):
+        """Test HT.Area method"""
+        self.assertEqual(
+            str(HtmlGenWrapper.create_area_tag(
+                shape="rect",
+                coords="1 2",
+                href="http://test.com",
+                title="Some Title")).replace("\n", ""),
+            ("""<AREA coords="1 2" href="http://test.com" """
+             """shape="rect" title="Some Title">"""))
+
+    def test_create_link_tag(self):
+        """Test HT.HREF method"""
+        self.assertEqual(
+            str(HtmlGenWrapper.create_link_tag(
+                "www.test.com", "test", target="_blank")).replace("\n", ""),
+            """<A HREF="www.test.com" TARGET="_blank">test</A>""")
diff --git a/wqflask/tests/wqflask/marker_regression/test_display_marking_results.py b/wqflask/tests/wqflask/marker_regression/test_display_marking_results.py
deleted file mode 100644
index 67da508b..00000000
--- a/wqflask/tests/wqflask/marker_regression/test_display_marking_results.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import unittest
-
-from wqflask.marker_regression.display_mapping_results import DisplayMappingResults
-
-class TestDisplayMappingResults(unittest.TestCase):
-    def test_pil_colors(self):
-        """Test that colors use PILLOW color format"""
-        self.assertEqual(DisplayMappingResults.CLICKABLE_WEBQTL_REGION_COLOR,
-                         (245, 211, 211))
diff --git a/wqflask/utility/Plot.py b/wqflask/utility/Plot.py
index d4373412..b9b71129 100644
--- a/wqflask/utility/Plot.py
+++ b/wqflask/utility/Plot.py
@@ -26,16 +26,12 @@
 
 from __future__ import print_function
 
-from PIL import (Image, ImageColor, ImageDraw, ImageFont)
-from pprint import pformat as pf
+from PIL import ImageColor
+from PIL import ImageDraw
+from PIL import ImageFont
 
 from math import *
-import random
-import sys, os
-from numarray import linear_algebra as la
-from numarray import ones, array, dot, swapaxes
 
-import webqtlUtil
 import corestats
 from base import webqtlConfig
 from utility.pillow_utils import draw_rotated_text
diff --git a/wqflask/wqflask/marker_regression/display_mapping_results.py b/wqflask/wqflask/marker_regression/display_mapping_results.py
index 3943a401..a92adb90 100644
--- a/wqflask/wqflask/marker_regression/display_mapping_results.py
+++ b/wqflask/wqflask/marker_regression/display_mapping_results.py
@@ -24,13 +24,13 @@
 #
 # Last updated by Zach 12/14/2010
 
-import datetime
 import string
 from math import *
-from PIL import (Image,ImageDraw,ImageFont,ImageColor)
-import sys,os
-import cPickle
-import httplib
+from PIL import Image
+from PIL import ImageDraw
+from PIL import ImageFont
+from PIL import ImageColor
+import os
 import json
 
 from flask import Flask, g
@@ -40,15 +40,14 @@ from htmlgen import HTMLgen2 as HT
 from base import webqtlConfig
 from base.GeneralObject import GeneralObject
 from utility import webqtlUtil
-from utility import helper_functions
 from utility import Plot
 from utility.benchmark import Bench
 from wqflask.interval_analyst import GeneUtil
-from base.webqtlConfig import GENERATED_TEXT_DIR, GENERATED_IMAGE_DIR
+from base.webqtlConfig import GENERATED_IMAGE_DIR
 from utility.pillow_utils import draw_rotated_text, draw_open_polygon
 
 import utility.logger
-logger = utility.logger.getLogger(__name__ )
+logger = utility.logger.getLogger(__name__)
 
 RED = ImageColor.getrgb("red")
 BLUE = ImageColor.getrgb("blue")
@@ -80,22 +79,53 @@ ARIAL_FILE = "./wqflask/static/fonts/arial.ttf"
 
 assert(os.path.isfile(VERDANA_FILE))
 
-# ---- END: FONT FILES ---- #
 
-#########################################
-#      Inteval Mapping Plot Page
-#########################################
+class HtmlGenWrapper:
+    """Wrapper Methods for HTML gen"""
+    @staticmethod
+    def create_image_tag(**kwargs):
+        return HT.Image(**kwargs)
+
+    @staticmethod
+    def create_form_tag(**kwargs):
+        return HT.Form(**kwargs)
+
+    @staticmethod
+    def create_p_tag(**kwargs):
+        return HT.Paragraph(**kwargs)
+
+    @staticmethod
+    def create_br_tag():
+        return HT.BR()
+
+    @staticmethod
+    def create_input_tag(**kwargs):
+        return HT.Input(**kwargs)
+
+    @staticmethod
+    def create_area_tag(**kwargs):
+        return HT.Area(**kwargs)
+
+    @staticmethod
+    def create_link_tag(href, content, **kwargs):
+        return HT.Href(href, content, **kwargs)
+
+    @staticmethod
+    def create_map_tag(**kwargs):
+        return HT.Map(**kwargs)
+
+
 class DisplayMappingResults(object):
+    """Inteval Mapping Plot Page"""
     cMGraphInterval = 5
     GRAPH_MIN_WIDTH = 900
-    GRAPH_MAX_WIDTH = 10000 # Don't set this too high
+    GRAPH_MAX_WIDTH = 10000  # Don't set this too high
     GRAPH_DEFAULT_WIDTH = 1280
     MULT_GRAPH_DEFAULT_WIDTH = 2000
     MULT_GRAPH_MIN_WIDTH = 1400
     MULT_GRAPH_DEFAULT_WIDTH = 1600
     GRAPH_DEFAULT_HEIGHT = 600
 
-
     # Display order:
     # UCSC BAND =========
     # ENSEMBL BAND -=-=-=
@@ -106,22 +136,27 @@ class DisplayMappingResults(object):
     BAND_HEIGHT = 10
     BAND_HEIGHT = 10
 
-    NUM_GENE_ROWS       = 10
-    EACH_GENE_HEIGHT    = 6  # number of pixels tall, for each gene to display
+    NUM_GENE_ROWS = 10
+    EACH_GENE_HEIGHT = 6  # number of pixels tall, for each gene to display
     EACH_GENE_ARROW_WIDTH = 5
     EACH_GENE_ARROW_SPACING = 14
     DRAW_DETAIL_MB = 4
     DRAW_UTR_LABELS_MB = 4
 
-    qmarkImg = HT.Image('/images/qmarkBoxBlue.gif', width=10, height=13, border=0, alt='Glossary')
-    # Note that "qmark.gif" is a similar, smaller, rounded-edges question mark. It doesn't look
-    # like the ones on the image, though, which is why we don't use it here.
+    qmarkImg = HtmlGenWrapper.create_image_tag(
+        src='/images/qmarkBoxBlue.gif',
+        width="10", height="13", border="0", alt='Glossary'
+    )
+
+    # Note that "qmark.gif" is a similar, smaller, rounded-edges
+    # question mark. It doesn't look like the ones on the image,
+    # though, which is why we don't use it here.
 
     HELP_WINDOW_NAME = 'helpWind'
 
-    ## BEGIN HaplotypeAnalyst
+    # BEGIN HaplotypeAnalyst
     NR_INDIVIDUALS = 0
-    ## END HaplotypeAnalyst
+    # END HaplotypeAnalyst
 
     ALEX_DEBUG_BOOL_PRINT_GENE_LIST = 1
 
@@ -129,13 +164,13 @@ class DisplayMappingResults(object):
 
     LODFACTOR = 4.61
 
-    SNP_COLOR           = ORANGE # Color for the SNP "seismograph"
+    SNP_COLOR = ORANGE  # Color for the SNP "seismograph"
     TRANSCRIPT_LOCATION_COLOR = MEDIUMPURPLE
 
     BOOTSTRAP_BOX_COLOR = YELLOW
-    LRS_COLOR           = ImageColor.getrgb("#0000FF")
-    SIGNIFICANT_COLOR   = ImageColor.getrgb("#EBC7C7")
-    SUGGESTIVE_COLOR    = GAINSBORO
+    LRS_COLOR = ImageColor.getrgb("#0000FF")
+    SIGNIFICANT_COLOR = ImageColor.getrgb("#EBC7C7")
+    SUGGESTIVE_COLOR = GAINSBORO
     SIGNIFICANT_WIDTH = 5
     SUGGESTIVE_WIDTH = 5
     ADDITIVE_COLOR_POSITIVE = GREEN
@@ -143,33 +178,33 @@ class DisplayMappingResults(object):
     DOMINANCE_COLOR_POSITIVE = DARKVIOLET
     DOMINANCE_COLOR_NEGATIVE = RED
 
-    ## BEGIN HaplotypeAnalyst
+    # BEGIN HaplotypeAnalyst
     HAPLOTYPE_POSITIVE = GREEN
     HAPLOTYPE_NEGATIVE = RED
     HAPLOTYPE_HETEROZYGOUS = BLUE
     HAPLOTYPE_RECOMBINATION = DARKGRAY
-    ## END HaplotypeAnalyst
+    # END HaplotypeAnalyst
 
     TOP_RIGHT_INFO_COLOR = BLACK
 
-    CLICKABLE_WEBQTL_REGION_COLOR     = ImageColor.getrgb("#F5D3D3")
+    CLICKABLE_WEBQTL_REGION_COLOR = ImageColor.getrgb("#F5D3D3")
     CLICKABLE_WEBQTL_REGION_OUTLINE_COLOR = ImageColor.getrgb("#FCE9E9")
-    CLICKABLE_WEBQTL_TEXT_COLOR       = ImageColor.getrgb("#912828")
+    CLICKABLE_WEBQTL_TEXT_COLOR = ImageColor.getrgb("#912828")
 
-    CLICKABLE_PHENOGEN_REGION_COLOR   = ImageColor.getrgb("#A2FB94")
+    CLICKABLE_PHENOGEN_REGION_COLOR = ImageColor.getrgb("#A2FB94")
     CLICKABLE_PHENOGEN_REGION_OUTLINE_COLOR = ImageColor.getrgb("#CEFEC7")
-    CLICKABLE_PHENOGEN_TEXT_COLOR     = ImageColor.getrgb("#1FD504")
+    CLICKABLE_PHENOGEN_TEXT_COLOR = ImageColor.getrgb("#1FD504")
 
-    CLICKABLE_UCSC_REGION_COLOR     = ImageColor.getrgb("#DDDDEE")
+    CLICKABLE_UCSC_REGION_COLOR = ImageColor.getrgb("#DDDDEE")
     CLICKABLE_UCSC_REGION_OUTLINE_COLOR = ImageColor.getrgb("#EDEDFF")
-    CLICKABLE_UCSC_TEXT_COLOR       = ImageColor.getrgb("#333366")
+    CLICKABLE_UCSC_TEXT_COLOR = ImageColor.getrgb("#333366")
 
-    CLICKABLE_ENSEMBL_REGION_COLOR  = ImageColor.getrgb("#EEEEDD")
+    CLICKABLE_ENSEMBL_REGION_COLOR = ImageColor.getrgb("#EEEEDD")
     CLICKABLE_ENSEMBL_REGION_OUTLINE_COLOR = ImageColor.getrgb("#FEFEEE")
-    CLICKABLE_ENSEMBL_TEXT_COLOR    = ImageColor.getrgb("#555500")
+    CLICKABLE_ENSEMBL_TEXT_COLOR = ImageColor.getrgb("#555500")
 
     GRAPH_BACK_LIGHT_COLOR = ImageColor.getrgb("#FBFBFF")
-    GRAPH_BACK_DARK_COLOR  = ImageColor.getrgb("#F1F1F9")
+    GRAPH_BACK_DARK_COLOR = ImageColor.getrgb("#F1F1F9")
 
     HELP_PAGE_REF = '/glossary.html'
 
@@ -196,7 +231,8 @@ class DisplayMappingResults(object):
             self.temp_trait = "True"
             self.group = start_vars['group']
 
-        #Needing for form submission when doing single chr mapping or remapping after changing options
+        # Needing for form submission when doing single chr
+        # mapping or remapping after changing options
         self.samples = start_vars['samples']
         self.vals = start_vars['vals']
         self.transform = start_vars['transform']
@@ -207,9 +243,9 @@ class DisplayMappingResults(object):
             self.mapmodel_rqtl_geno = start_vars['model']
             self.pair_scan = start_vars['pair_scan']
 
-        #if self.mapping_method != "gemma" and self.mapping_method != "plink":
         self.js_data = start_vars['js_data']
-        self.trimmed_markers = start_vars['trimmed_markers'] #Top markers to display in table
+        # Top markers to display in table
+        self.trimmed_markers = start_vars['trimmed_markers']
 
         if self.dataset.group.species == "rat":
             self._ucscDb = "rn6"
@@ -221,7 +257,7 @@ class DisplayMappingResults(object):
         #####################################
         # Options
         #####################################
-        #Mapping options
+        # Mapping options
         if start_vars['mapping_scale'] != "":
             self.plotScale = start_vars['mapping_scale']
         else:
@@ -510,7 +546,11 @@ class DisplayMappingResults(object):
             "{}.png".format(
                 os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename)),
             format='png')
-        intImg=HT.Image('/image/'+self.filename+'.png', border=0, usemap='#WebQTLImageMap')
+        intImg = HtmlGenWrapper.create_image_tag(
+            src="/image/{}.png".format(self.filename),
+            border="0", usemap='#WebQTLImageMap'
+        )
+        self.intImg = intImg
 
         #Scales plot differently for high resolution
         if self.draw2X:
@@ -527,11 +567,16 @@ class DisplayMappingResults(object):
         ################################################################
         #this form is used for opening Locus page or trait page, only available for genetic mapping
         if showLocusForm:
-            showLocusForm = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data',
-                name=showLocusForm, submit=HT.Input(type='hidden'))
+            showLocusForm = HtmlGenWrapper.create_form_tag(
+                cgi=os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE),
+                enctype='multipart/form-data',
+                name=showLocusForm,
+                submit=HtmlGenWrapper.create_input_tag(type='hidden'))
+
             hddn = {'FormID':'showDatabase', 'ProbeSetID':'_','database':fd.RISet+"Geno",'CellID':'_', 'RISet':fd.RISet, 'incparentsf1':'ON'}
             for key in hddn.keys():
-                showLocusForm.append(HT.Input(name=key, value=hddn[key], type='hidden'))
+                showLocusForm.append(HtmlGenWrapper.create_input_tag(
+                    name=key, value=hddn[key], type='hidden'))
             showLocusForm.append(intImg)
         else:
             showLocusForm = intImg
@@ -542,10 +587,12 @@ class DisplayMappingResults(object):
         ################################################################
         # footnote goes here
         ################################################################
-        btminfo = HT.Paragraph(Id="smallsize") #Small('More information about this graph is available here.')
+        # Small('More information about this graph is available here.')
+        btminfo = HtmlGenWrapper.create_p_tag(id="smallsize")
 
         if self.traitList and self.traitList[0].dataset and self.traitList[0].dataset.type == 'Geno':
-            btminfo.append(HT.BR(), 'Mapping using genotype data as a trait will result in infinity LRS at one locus. In order to display the result properly, all LRSs higher than 100 are capped at 100.')
+            btminfo.append(HtmlGenWrapper.create_br_tag())
+            btminfo.append('Mapping using genotype data as a trait will result in infinity LRS at one locus. In order to display the result properly, all LRSs higher than 100 are capped at 100.')
 
     def plotIntMapping(self, canvas, offset= (80, 120, 20, 100), zoom = 1, startMb = None, endMb = None, showLocusForm = ""):
         im_drawer = ImageDraw.Draw(canvas)
@@ -601,8 +648,8 @@ class DisplayMappingResults(object):
         if zoom == 2:
             drawAreaHeight -= 60
 
-        #Image map
-        gifmap = HT.Map(name = "WebQTLImageMap")
+        # Image map
+        gifmap = HtmlGenWrapper.create_map_tag(name="WebQTLImageMap")
 
         newoffset = (xLeftOffset, xRightOffset, yTopOffset, yBottomOffset)
         # Draw the alternating-color background first and get plotXScale
@@ -950,8 +997,8 @@ class DisplayMappingResults(object):
             if thisTrait.db:
                 COORDS = "%d,%d,%d,%d" %(rectWidth+2+rightShift,yPaddingTop+kstep*15,rectWidth+2+rightShift+nameWidth,yPaddingTop+10+kstep*15,)
                 HREF= "javascript:showDatabase3('%s','%s','%s','');" % (showLocusForm, thisTrait.db.name, thisTrait.name)
-                Areas = HT.Area(shape='rect',coords=COORDS,href=HREF)
-                gifmap.areas.append(Areas)
+                Areas = HtmlGenWrapper.create_area_tag(shape='rect',coords=COORDS,href=HREF)
+                gifmap.areas.append(Areas) ### TODO
 
     def drawLegendPanel(self, canvas, offset= (40, 120, 80, 10), zoom = 1):
         im_drawer = ImageDraw.Draw(canvas)
@@ -1353,7 +1400,13 @@ class DisplayMappingResults(object):
 
             COORDS = "%d, %d, %d, %d" %(geneStartPix, geneYLocation, geneEndPix, (geneYLocation + self.EACH_GENE_HEIGHT))
             # NL: 06-02-2011 Rob required to display NCBI info in a new window
-            gifmap.areas.append(HT.Area(shape='rect',coords=COORDS,href=HREF, title=TITLE,target="_blank"))
+            gifmap.areas.append(
+                HtmlGenWrapper.create_area_tag(
+                    shape='rect',
+                    coords=COORDS,
+                    href=HREF,
+                    title=TITLE,
+                    target="_blank"))
 
 ## BEGIN HaplotypeAnalyst
     def drawHaplotypeBand(self, canvas, gifmap, plotXScale, offset= (40, 120, 80, 10), zoom = 1, startMb = None, endMb = None):
@@ -1521,7 +1574,12 @@ class DisplayMappingResults(object):
                                     COORDS = "%d, %d, %d, %d" %(geneStartPix, geneYLocation+ind*self.EACH_GENE_HEIGHT, geneEndPix+1, (geneYLocation + ind*self.EACH_GENE_HEIGHT))
                                     TITLE = "Strain: %s, marker (%s) \n Position  %2.3f Mb." % (samplelist[k], _chr[j].name, float(txStart))
                                     HREF = ''
-                                    gifmap.areas.append(HT.Area(shape='rect',coords=COORDS,href=HREF, title=TITLE))
+                                    gifmap.areas.append(
+                                        HtmlGenWrapper.create_area_tag(
+                                            shape='rect',
+                                            coords=COORDS,
+                                            href=HREF,
+                                            title=TITLE))
 
                                     # if there are no more markers in a chromosome, the plotRight value calculated above will be before the plotWidth
                                     # resulting in some empty space on the right side of the plot area. This draws an "unknown" bar from plotRight to the edge.
@@ -1640,7 +1698,12 @@ class DisplayMappingResults(object):
                 WEBQTL_HREF = "javascript:rangeView('%s', %f, %f)" % (self.selectedChr - 1, max(0, (calBase-webqtlZoomWidth))/1000000.0, (calBase+webqtlZoomWidth)/1000000.0)
 
                 WEBQTL_TITLE = "Click to view this section of the genome in WebQTL"
-                gifmap.areas.append(HT.Area(shape='rect',coords=WEBQTL_COORDS,href=WEBQTL_HREF, title=WEBQTL_TITLE))
+                gifmap.areas.append(
+                    HtmlGenWrapper.create_area_tag(
+                        shape='rect',
+                        coords=WEBQTL_COORDS,
+                        href=WEBQTL_HREF,
+                        title=WEBQTL_TITLE))
                 im_drawer.rectangle(
                     xy=((xBrowse1, paddingTop),
                         (xBrowse2, (paddingTop + self.BAND_HEIGHT))),
@@ -1657,7 +1720,12 @@ class DisplayMappingResults(object):
                     else:
                         PHENOGEN_HREF = "https://phenogen.org/gene.jsp?speciesCB=Mm&auto=Y&geneTxt=chr%s:%d-%d&genomeVer=mm10" % (self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
                     PHENOGEN_TITLE = "Click to view this section of the genome in PhenoGen"
-                    gifmap.areas.append(HT.Area(shape='rect',coords=PHENOGEN_COORDS,href=PHENOGEN_HREF, title=PHENOGEN_TITLE))
+                    gifmap.areas.append(
+                        HtmlGenWrapper.create_area_tag(
+                            shape='rect',
+                            coords=PHENOGEN_COORDS,
+                            href=PHENOGEN_HREF,
+                            title=PHENOGEN_TITLE))
                     im_drawer.rectangle(
                         xy=((xBrowse1, phenogenPaddingTop),
                             (xBrowse2, (phenogenPaddingTop+self.BAND_HEIGHT))),
@@ -1673,7 +1741,12 @@ class DisplayMappingResults(object):
                 else:
                     UCSC_HREF = "http://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=chr%s:%d-%d" % (self._ucscDb, self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
                 UCSC_TITLE = "Click to view this section of the genome in the UCSC Genome Browser"
-                gifmap.areas.append(HT.Area(shape='rect',coords=UCSC_COORDS,href=UCSC_HREF, title=UCSC_TITLE))
+                gifmap.areas.append(
+                    HtmlGenWrapper.create_area_tag(
+                        shape='rect',
+                        coords=UCSC_COORDS,
+                        href=UCSC_HREF,
+                        title=UCSC_TITLE))
                 im_drawer.rectangle(
                     xy=((xBrowse1, ucscPaddingTop),
                         (xBrowse2, (ucscPaddingTop+self.BAND_HEIGHT))),
@@ -1690,7 +1763,11 @@ class DisplayMappingResults(object):
                 else:
                     ENSEMBL_HREF = "http://www.ensembl.org/Rattus_norvegicus/contigview?chr=%s&start=%d&end=%d" % (self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
                 ENSEMBL_TITLE = "Click to view this section of the genome in the Ensembl Genome Browser"
-                gifmap.areas.append(HT.Area(shape='rect',coords=ENSEMBL_COORDS,href=ENSEMBL_HREF, title=ENSEMBL_TITLE))
+                gifmap.areas.append(HtmlGenWrapper.create_area_tag(
+                    shape='rect',
+                    coords=ENSEMBL_COORDS,
+                    href=ENSEMBL_HREF,
+                    title=ENSEMBL_TITLE))
                 im_drawer.rectangle(
                     xy=((xBrowse1, ensemblPaddingTop),
                         (xBrowse2, (ensemblPaddingTop+self.BAND_HEIGHT))),
@@ -1922,9 +1999,14 @@ class DisplayMappingResults(object):
                         outline=rectColor,fill=rectColor,width = 0)
                     COORDS="%d,%d,%d,%d"%(xLeftOffset+offsetA-LRectHeight, yZero+40+Zorder*(LRectWidth+3),\
                             xLeftOffset+offsetA,yZero+40+Zorder*(LRectWidth+3)+LRectWidth)
-                    HREF="/show_trait?trait_id=%s&dataset=%s" % (Lname, self.dataset.group.name+"Geno")
+                    HREF = "/show_trait?trait_id=%s&dataset=%s" % (Lname, self.dataset.group.name+"Geno")
                     #HREF="javascript:showDatabase3('%s','%s','%s','');" % (showLocusForm,fd.RISet+"Geno", Lname)
-                    Areas=HT.Area(shape='rect', coords=COORDS, href=HREF, target="_blank", title="Locus : " + Lname)
+                    Areas = HtmlGenWrapper.create_area_tag(
+                        shape='rect',
+                        coords=COORDS,
+                        href=HREF,
+                        target="_blank",
+                        title="Locus : {}".format(Lname))
                     gifmap.areas.append(Areas)
                 ##piddle bug
                 if j == 0:
@@ -2133,8 +2215,14 @@ class DisplayMappingResults(object):
                 else:
                     sugg_title = "Suggestive LOD = %0.2f" % (self.suggestive/4.61)
                     sig_title = "Significant LOD = %0.2f" % (self.significant/4.61)
-                Areas1 = HT.Area(shape='rect',coords=sugg_coords,title=sugg_title)
-                Areas2 = HT.Area(shape='rect',coords=sig_coords,title=sig_title)
+                Areas1 = HtmlGenWrapper.create_area_tag(
+                    shape='rect',
+                    coords=sugg_coords,
+                    title=sugg_title)
+                Areas2 = HtmlGenWrapper.create_area_tag(
+                    shape='rect',
+                    coords=sig_coords,
+                    title=sig_title)
                 gifmap.areas.append(Areas1)
                 gifmap.areas.append(Areas2)
 
@@ -2586,7 +2674,10 @@ class DisplayMappingResults(object):
                 #add by NL 09-03-2010
                 HREF = "javascript:chrView(%d,%s);" % (i,self.ChrLengthMbList)
                 #HREF = "javascript:changeView(%d,%s);" % (i,self.ChrLengthMbList)
-                Areas = HT.Area(shape='rect', coords=COORDS, href=HREF)
+                Areas = HtmlGenWrapper.create_area_tag(
+                    shape='rect',
+                    coords=COORDS,
+                    href=HREF)
                 gifmap.areas.append(Areas)
                 startPosX +=  (self.ChrLengthDistList[i]+self.GraphInterval)*plotXScale
 
@@ -2672,7 +2763,11 @@ class DisplayMappingResults(object):
                 tableIterationsCnt = tableIterationsCnt + 1
 
                 this_row = [] #container for the cells of each row
-                selectCheck = HT.Input(type="checkbox", name="selectCheck", value=theGO["GeneSymbol"], Class="checkbox trait_checkbox") #checkbox for each row
+                selectCheck = HtmlGenWrapper.create_input_tag(
+                    type="checkbox",
+                    name="selectCheck",
+                    value=theGO["GeneSymbol"],
+                    Class="checkbox trait_checkbox")  # checkbox for each row
 
                 geneLength = (theGO["TxEnd"] - theGO["TxStart"])*1000.0
                 tenPercentLength = geneLength*0.0001
@@ -2730,41 +2825,77 @@ class DisplayMappingResults(object):
 
                         this_row = [selectCheck.__str__(),
                                     str(tableIterationsCnt),
-                                    HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank").__str__(),
-                                    HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank").__str__(),
-                                    HT.Href("javascript:rangeView('%s', %f, %f)" % (str(chr_as_int), txStart-tenPercentLength, txEnd+tenPercentLength), "%0.3f" % geneLength).__str__(),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        geneIdString,
+                                        theGO["GeneSymbol"],
+                                        target="_blank")
+                                    ),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        mouseStartString,
+                                        "{:.6f}".format(txStart),
+                                        target="_blank")
+                                    ),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        "javascript:rangeView('{}', {:f}, {:f})".format(
+                                            str(chr_as_int),
+                                            txStart-tenPercentLength,
+                                            txEnd+tenPercentLength),
+                                        "{:.3f}".format(geneLength))),
                                     snpString,
                                     snpDensityStr,
                                     avgExpr,
                                     humanChr,
-                                    HT.Href(humanStartString, humanStartDisplay, target="_blank").__str__(),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        humanStartString,
+                                        humanStartDisplay,
+                                        target="_blank")),
                                     literatureCorrelationString,
                                     geneDescription]
                     else:
                         this_row = [selectCheck.__str__(),
                                     str(tableIterationsCnt),
-                                    HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank").__str__(),
-                                    HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank").__str__(),
-                                    HT.Href("javascript:rangeView('%s', %f, %f)" % (str(chr_as_int), txStart-tenPercentLength, txEnd+tenPercentLength), "%0.3f" % geneLength).__str__(),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        geneIdString, theGO["GeneSymbol"],
+                                        target="_blank")),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        mouseStartString,
+                                        "{:.6f}".format(txStart),
+                                        target="_blank")),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        "javascript:rangeView('{}', {:f}, {:f})".format(
+                                            str(chr_as_int),
+                                            txStart-tenPercentLength,
+                                            txEnd+tenPercentLength),
+                                        "{:.3f}".format(geneLength))),
                                     snpString,
                                     snpDensityStr,
                                     avgExpr,
                                     humanChr,
-                                    HT.Href(humanStartString, humanStartDisplay, target="_blank").__str__(),
+                                    str(HtmlGenWrapper.create_link_tag(
+                                        humanStartString,
+                                        humanStartDisplay,
+                                        target="_blank")),
                                     geneDescription]
 
                 gene_table_body.append(this_row)
 
         elif self.dataset.group.species == 'rat':
             for gIndex, theGO in enumerate(geneCol):
-                this_row = [] #container for the cells of each row
-                selectCheck = HT.Input(type="checkbox", name="selectCheck", Class="checkbox trait_checkbox").__str__() #checkbox for each row
+                this_row = []  # container for the cells of each row
+                selectCheck = str(HtmlGenWrapper.create_input_tag(
+                    type="checkbox",
+                    name="selectCheck",
+                    Class="checkbox trait_checkbox"))  # checkbox for each row
 
                 #ZS: May want to get this working again later
                 #webqtlSearch = HT.Href(os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE)+"?cmd=sch&gene=%s&alias=1&species=rat" % theGO["GeneSymbol"], ">>", target="_blank").__str__()
 
                 if theGO["GeneID"] != "":
-                    geneSymbolNCBI = HT.Href("http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids=%s" % theGO["GeneID"], theGO["GeneSymbol"], Class="normalsize", target="_blank").__str__()
+                    geneSymbolNCBI = str(HtmlGenWrapper.create_link_tag(
+                        "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids={}".format(theGO["GeneID"]),
+                        theGO["GeneSymbol"],
+                        Class="normalsize",
+                        target="_blank"))
                 else:
                     geneSymbolNCBI = theGO["GeneSymbol"]
 
@@ -2804,7 +2935,9 @@ class DisplayMappingResults(object):
                             str(gIndex+1),
                             geneSymbolNCBI,
                             "%0.6f" % theGO["TxStart"],
-                            HT.Href(geneLengthURL, "%0.3f" % (geneLength*1000.0)).__str__(),
+                            str(HtmlGenWrapper.create_link_tag(
+                                geneLengthURL,
+                                "{:.3f}".format(geneLength*1000.0))),
                             avgExprVal,
                             mouseChr,
                             mouseTxStart,