Beispiel #1
0
    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