def parse_line(self, line): columns = line.split(self.ING_COL_DELIMITER) # Check to see whether we have anything to work with if columns[self.ING_COL_ID] == '': return True # Skip empty lines # Set total columns number if not set # and get the H-Reference IDs if self.total_cols == 0: self.total_cols = len(columns) h_cols_count = self.total_cols - self.ING_COL_COUNT if h_cols_count <= 0: self.error = 'Number of columns are fewer then expected, must at least be %d' % ( self.ING_COL_COUNT + 1) return False else: for col_number in range(self.ING_COL_COUNT, (self.ING_COL_COUNT + h_cols_count)): hreference_id = columns[col_number].strip() if hreference_id != '': self.h_references.append(hreference_id) # First line is not further read return True # Check columns count if len(columns) != self.total_cols: self.error = 'Number of columns are not consistent, expected %d columns but got %d' % ( self.total_cols, len(columns)) return False # Retrieve/Create the ingredient ID = int(columns[self.ING_COL_ID].strip()) if ID > 0: ing = Ingredient.load(ID) else: self.error = 'The ID must be a positive integer instead got %d' % ID return False # INCI Names if columns[self.ING_COL_INCI].strip() != '': inci_names = columns[self.ING_COL_INCI].strip().split( self.ING_IN_COL_DELIMITER) for name in inci_names: name = name.strip().lower() if name != '' and name not in ing.inci_names: ing.inci_names.append(name) # CAS Numbers if columns[self.ING_COL_CAS].strip() != '': cas_numbers = columns[self.ING_COL_CAS].strip().split( self.ING_IN_COL_DELIMITER) for number in cas_numbers: number = number.strip() if number != '' and number not in ing.cas_numbers: ing.cas_numbers.append(number) # EC Numbers if columns[self.ING_COL_EC].strip() != '': ec_numbers = columns[self.ING_COL_EC].strip().split( self.ING_IN_COL_DELIMITER) for number in ec_numbers: number = number.strip() if number != '' and number not in ing.ec_numbers: ing.ec_numbers.append(number) # IUPAC Names if columns[self.ING_COL_IUPAC].strip() != '': iupac_names = columns[self.ING_COL_IUPAC].strip().split( self.ING_IN_COL_DELIMITER) for name in iupac_names: name = name.strip().lower() if name != '' and name not in ing.iupac_names: ing.iupac_names.append(name) # Aliases if columns[self.ING_COL_ALIAS].strip() != '': aliases = columns[self.ING_COL_ALIAS].strip().split( self.ING_IN_COL_DELIMITER) for alias in aliases: alias = alias.strip().lower() if alias != '' and alias not in ing.aliases: ing.aliases.append(alias) # E Numbers if columns[self.ING_COL_E].strip() != '': e_numbers = columns[self.ING_COL_E].strip().split( self.ING_IN_COL_DELIMITER) for e_no in e_numbers: e_no = e_no.strip() if e_no != '' and e_no not in ing.e_numbers: ing.e_numbers.append(e_no) h_cols_count = self.total_cols - self.ING_COL_COUNT ref_idx = 0 for col_number in range(self.ING_COL_COUNT, (self.ING_COL_COUNT + h_cols_count)): if ref_idx >= len(self.h_references): continue if not self.parse_hstatements(columns[col_number].strip(), ing, self.h_references[ref_idx]): return False ref_idx = ref_idx + 1 ing.creator = self.user.key ing.put() return True