def test_get_election0_xlsx(self):
        response = self.client.get(
            reverse('results-export'),
            { 'election': str(Election.objects.get(name='Election 0').id) }
        )

        self.assertEqual(response.status_code, 200)        

        self.assertEqual(
            response['Content-Disposition'],
            'attachment; filename="Election 0 Results.xlsx"'
        )

        wb = openpyxl.load_workbook(io.BytesIO(response.content))

        self.assertEqual(len(wb.worksheets), 1)

        # Check first worksheet.
        ws = wb.worksheets[0]

        self.assertEqual(wb.sheetnames[0], 'Election 0')

        row_count = ws.max_row
        col_count = ws.max_column
        self.assertEqual(row_count, 25)
        self.assertEqual(col_count, 5)

        self.assertEqual(str(ws.cell(1, 1).value), 'Election 0 Results')

        self.assertEqual(str(ws.cell(2, 1).value), 'Candidates')

        cellContents = [
            'Position 0',
            'Party 0',
            '0, 0',
            'Party 1',
            '3, 3',
            'Party 2',
            'None',
            'Position 1',
            'Party 0',
            '1, 1',
            'Party 1',
            '4, 4',
            'Party 2',
            'None',
            'Position 2',
            'Party 0',
            '2, 2',
            'Party 1',
            '5, 5',
            'Party 2',
            'None'
        ]
        for cellIndex, content in enumerate(cellContents, 5):
            self.assertEqual(str(ws.cell(cellIndex, 1).value), content) 

        self.assertEqual(str(ws.cell(2, 2).value), 'Number of Votes')

        self.assertEqual(str(ws.cell(3, 2).value), '0')

        self.assertEqual(str(ws.cell(4, 2).value), '0') # Section

        self.assertEqual(str(ws.cell(7, 2).value), '1')
        self.assertEqual(str(ws.cell(9, 2).value), '0')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 2).value), '2')
        self.assertEqual(str(ws.cell(16, 2).value), '0')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 2).value), '0')
        self.assertEqual(str(ws.cell(23, 2).value), '0')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')

        self.assertEqual(str(ws.cell(4, 3).value), '1') # Section

        self.assertEqual(str(ws.cell(7, 3).value), '0')
        self.assertEqual(str(ws.cell(9, 3).value), '1')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 3).value), '0')
        self.assertEqual(str(ws.cell(16, 3).value), '0')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 3).value), '1')
        self.assertEqual(str(ws.cell(23, 3).value), '0')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')

        self.assertEqual(str(ws.cell(3, 4).value), '1')

        self.assertEqual(str(ws.cell(4, 4).value), '2') # Section

        self.assertEqual(str(ws.cell(7, 4).value), '0')
        self.assertEqual(str(ws.cell(9, 4).value), '0')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 4).value), '0')
        self.assertEqual(str(ws.cell(16, 4).value), '1')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 4).value), '0')
        self.assertEqual(str(ws.cell(23, 4).value), '1')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')

        self.assertEqual(str(ws.cell(3, 5).value), 'Total Votes')
        self.assertEqual(str(ws.cell(7, 5).value), '1')
        self.assertEqual(str(ws.cell(9, 5).value), '1')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 5).value), '2')
        self.assertEqual(str(ws.cell(16, 5).value), '1')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 5).value), '1')
        self.assertEqual(str(ws.cell(23, 5).value), '1')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')
def _subset_sounding_data(
        example_dict, netcdf_dataset_object, example_indices_to_keep,
        field_names_to_keep, heights_to_keep_m_agl):
    """Subsets sounding data by field and height.

    :param example_dict: See doc for `_subset_radar_data`.
    :param netcdf_dataset_object: Same.
    :param example_indices_to_keep: Same.
    :param field_names_to_keep: 1-D list of field names to keep.  If None, will
        keep all fields.
    :param heights_to_keep_m_agl: 1-D numpy array of heights to keep.  If None,
        will keep all heights.
    :return: example_dict: Same as input but with the following exceptions.

    [1] Keys "sounding_field_names" and "sounding_heights_m_agl" may have
        different values.
    [2] Key "sounding_matrix" has been added.
    """

    if field_names_to_keep is None:
        field_names_to_keep = copy.deepcopy(example_dict[SOUNDING_FIELDS_KEY])
    if heights_to_keep_m_agl is None:
        heights_to_keep_m_agl = example_dict[SOUNDING_HEIGHTS_KEY] + 0

    error_checking.assert_is_numpy_array(
        numpy.array(field_names_to_keep), num_dimensions=1
    )

    heights_to_keep_m_agl = numpy.round(heights_to_keep_m_agl).astype(int)
    error_checking.assert_is_numpy_array(
        heights_to_keep_m_agl, num_dimensions=1)

    sounding_matrix = numpy.array(
        netcdf_dataset_object.variables[SOUNDING_MATRIX_KEY][
            example_indices_to_keep, ...
        ],
        dtype=float
    )

    # TODO(thunderhoser): This is a HACK.
    spfh_index = example_dict[SOUNDING_FIELDS_KEY].index(
        soundings.SPECIFIC_HUMIDITY_NAME)
    temp_index = example_dict[SOUNDING_FIELDS_KEY].index(
        soundings.TEMPERATURE_NAME)
    pressure_index = example_dict[SOUNDING_FIELDS_KEY].index(
        soundings.PRESSURE_NAME)
    theta_v_index = example_dict[SOUNDING_FIELDS_KEY].index(
        soundings.VIRTUAL_POTENTIAL_TEMPERATURE_NAME)

    sounding_matrix[..., spfh_index][
        numpy.isnan(sounding_matrix[..., spfh_index])
    ] = 0.

    nan_example_indices, nan_height_indices = numpy.where(numpy.isnan(
        sounding_matrix[..., theta_v_index]
    ))

    if len(nan_example_indices) > 0:
        this_temp_matrix_kelvins = sounding_matrix[..., temp_index][
            nan_example_indices, nan_height_indices]

        this_pressure_matrix_pa = sounding_matrix[..., pressure_index][
            nan_example_indices, nan_height_indices]

        this_thetav_matrix_kelvins = (
            temp_conversion.temperatures_to_potential_temperatures(
                temperatures_kelvins=this_temp_matrix_kelvins,
                total_pressures_pascals=this_pressure_matrix_pa)
        )

        sounding_matrix[..., theta_v_index][
            nan_example_indices, nan_height_indices
        ] = this_thetav_matrix_kelvins

    these_indices = numpy.array([
        example_dict[SOUNDING_FIELDS_KEY].index(f)
        for f in field_names_to_keep
    ], dtype=int)

    sounding_matrix = sounding_matrix[..., these_indices]

    these_indices = numpy.array([
        numpy.where(example_dict[SOUNDING_HEIGHTS_KEY] == h)[0][0]
        for h in heights_to_keep_m_agl
    ], dtype=int)

    sounding_matrix = sounding_matrix[..., these_indices, :]

    example_dict[SOUNDING_FIELDS_KEY] = field_names_to_keep
    example_dict[SOUNDING_HEIGHTS_KEY] = heights_to_keep_m_agl
    example_dict[SOUNDING_MATRIX_KEY] = sounding_matrix

    return example_dict