def test_GIVEN_model_run_has_parameters_WHEN_get_model_run_by_id_THEN_model_run_has_parameter_values_loaded(self):
        # Add a user and give them a model
        user = self.login()
        model_run = self.create_run_model(0, "MR1", user)
        with session_scope(Session) as session:
            # Add parameter value
            parameter_value = ParameterValue()
            parameter_value.parameter_id = 1
            parameter_value.set_value_from_python(123)

            parameter = Parameter()
            parameter.name = "Param"
            parameter.parameter_values = [parameter_value]

            # Give them a model
            model_run = session.query(ModelRun).filter(ModelRun.id == model_run.id).one()
            model_run.parameter_values = [parameter_value]
            session.add(model_run)
        with session_scope(Session) as session:
            model_run_id = session.query(ModelRun).filter(ModelRun.name == model_run.name).one().id

        # Get the users model runs
        model_run_returned = self.model_run_service.get_model_by_id(user, model_run_id)
        pv = model_run_returned.parameter_values[0]
        assert_that(pv.value, is_('123'))
        assert_that(pv.parameter.name, is_("Param"))
    def run(self, namelist_documentation_file, page_url, code_version):
        """
        Run the parser on the file and return the name list file object
        :param namelist_documentation_file: filename for the name list file documentation
        :param page_url: page url
        :param code_version: the CodeVersion to use for the code version
        :return: the NamelistFile object
        """
        log.info("Parsing %s" % namelist_documentation_file)

        tree = html.parse(namelist_documentation_file)

        namelist_file = NamelistFile()
        namelist_file.filename = str(tree.xpath('//h1/tt/span/text()')[0])

        log.info("Filename: %s" % namelist_file.filename)

        namelist_file.namelists = []
        namelist_index = 0

        for namelist_name in tree.xpath('//h2/tt/span/text()'):
            namelist = Namelist()
            namelist.name = str(namelist_name)
            log.info("    Namelist: %s" % namelist.name)
            namelist_file.namelists.append(namelist)

            namelist.index_in_file = namelist_index
            namelist_index += 1

            #parameters at the bottom level
            parameters = tree.xpath('//div[@id="namelist-{namelist_name}"]/dl'.format(namelist_name=namelist_name))

            if namelist.name.upper() in self._EXTRA_PARAMETERS:
                log.info("Adding extra parameters for %s" % namelist.name)
                namelist.parameters.extend(self._EXTRA_PARAMETERS[namelist.name])
                for parameter in namelist.parameters:
                    parameter.code_versions = [code_version]

            #parameters in optional sections
            parameters.extend(
                tree.xpath('//div[@id="namelist-{namelist_name}"]/div/dl'.format(namelist_name=namelist_name)))
            parameters.extend(
                tree.xpath('//div[@id="namelist-{namelist_name}"]/div/div/dl[@class="member"]'
                           .format(namelist_name=namelist_name)))
            parameters.extend(
                tree.xpath('//div[@id="namelist-{namelist_name}"]/div/div/dl[@class="last member"]'
                           .format(namelist_name=namelist_name)))
            for parameter_elements in parameters:

                parameter_name = str(parameter_elements.xpath("dt")[0].attrib["id"].replace(namelist_name + '::', ''))
                log.info("      Parameter: %s" % parameter_name)
                parameter = Parameter()
                parameter.name = parameter_name
                parameter.default_value = None
                parameter.code_versions = [code_version]
                parameter.url_suffix = page_url + parameter_elements.xpath("dt/a")[0].attrib["href"]
                log.info("          Web page suffix: %s" % parameter.url_suffix)

                possible_description = parameter_elements.xpath("dd/p")
                parameter.description = etree.tostring(possible_description[0]) if len(possible_description) > 0 else ""
                log.info("          Description: %s" % parameter.description.strip())

                for parameter_property in parameter_elements.xpath("dd/table/tbody/tr"):
                    names = parameter_property.xpath("th/text()")
                    if len(names) == 1:
                        td = parameter_property.xpath("td")[0]
                        value = "".join([x for x in td.itertext()])
                        if names[0] == 'Type :':
                            parameter.type = value
                            log.info("          Type: %s" % parameter.type)
                        elif names[0] == 'Default :':
                            self._set_parameter_default(parameter, value)
                            log.info("          Default: %s" % parameter.default_value)
                        elif names[0] == 'Permitted :':
                            self._get_parameter_limits(parameter, value)
                            log.info("          min: %s" % parameter.min)
                            log.info("          max: %s" % parameter.max)

                parameter.required = (parameter.default_value is None)

                namelist.parameters.append(parameter)
        return namelist_file