docs: def GetListItems(self, viewname=None, fields=None, query=None, rowlimit=0, debug=False):
          """Get Items from current list
             rowlimit defaulted to 0 (unlimited)
          """
  
          # Build Request
          soap_request = soap('GetListItems')
          soap_request.add_parameter('listName', self.listName)
          # Convert Displayed View Name to View ID
          if viewname:
              soap_request.add_parameter('viewName', self.views[viewname]['Name'][1:-1])
  
          # Add viewFields
          if fields:
              # Convert to SharePoint Style Column Names
              for i, val in enumerate(fields):
                  fields[i] = self._disp_cols[val]['name']
              viewfields = fields
              soap_request.add_view_fields(fields)
              # Check for viewname and query
              if [viewname, query] == [None, None]:
                  # Add a query if the viewname and query are not provided
                  # We sort by 'ID' here Ascending is the default
                  soap_request.add_query({'OrderBy': ['ID']})
  
          elif viewname:
              viewfields = self.GetView(viewname)['fields']  ## Might be wrong
          else:
              # No fields or views provided so get everything
              viewfields = [x for x in self._sp_cols]
  
          # Add query
          if query:
  
              if 'Where' in query:
                  where = etree.Element('Where')
  
                  parents = []
                  parents.append(where)
                  for i, field in enumerate(query['Where']):
                      if field == 'And':
                          parents.append(etree.SubElement(parents[-1], 'And'))
                      elif field == 'Or':
                          if parents[-1].tag == 'Or':
                              parents.pop()
                          parents.append(etree.SubElement(parents[-1], 'Or'))
                      else:
                          _type = etree.SubElement(parents[-1], field[0])
                          field_ref = etree.SubElement(_type, 'FieldRef')
                          field_ref.set('Name', self._disp_cols[field[1]]['name'])
                          if len(field) == 3:
                              value = etree.SubElement(_type, 'Value')
                              value.set('Type', self._disp_cols[field[1]]['type'])
                              value.text = self._sp_type(field[1], field[2])
  
                  query['Where'] = where
  
              soap_request.add_query(query)
  
          # Set Row Limit
          soap_request.add_parameter('rowLimit', str(rowlimit))
          self.last_request = str(soap_request)
  
          # Send Request
          response = self._session.post(url=self._url('Lists'),
                                        headers=self._headers('GetListItems'),
                                        data=str(soap_request),
                                        verify=self._verify_ssl,
                                        timeout=self.timeout)
  
          # Parse Response
          if response.status_code == 200:
              envelope = etree.fromstring(response.text.encode('utf-8'), parser=etree.XMLParser(huge_tree=self.huge_tree))
              listitems = envelope[0][0][0][0][0]
              data = []
              for row in listitems:
                  # Strip the 'ows_' from the beginning with key[4:]
                  data.append({key[4:]: value for (key, value) in row.items() if key[4:] in viewfields})
  
              self._convert_to_display(data)
  
              if debug:
                  return response
              else:
                  return data
          else:
              return response