@hep.over('<STR_LIT>', '<STR_LIT>')<EOL>def dois(self, key, value):
def _get_first_non_curator_source(sources):<EOL><INDENT>sources_without_curator = [el for el in sources if el.upper() != '<STR_LIT>']<EOL>return force_single_element(sources_without_curator)<EOL><DEDENT>def _get_material(value):<EOL><INDENT>MATERIAL_MAP = {<EOL>'<STR_LIT>': '<STR_LIT>',<EOL>}<EOL>q_value = force_single_element(value.get('<STR_LIT:q>', '<STR_LIT>'))<EOL>normalized_q_value = q_value.lower()<EOL>return MATERIAL_MAP.get(normalized_q_value, normalized_q_value)<EOL><DEDENT>def _is_doi(id_, type_):<EOL><INDENT>return (not type_ or type_.upper() == '<STR_LIT>') and is_doi(id_)<EOL><DEDENT>def _is_handle(id_, type_):<EOL><INDENT>return (not type_ or type_.upper() == '<STR_LIT>') and is_handle(id_)<EOL><DEDENT>dois = self.get('<STR_LIT>', [])<EOL>persistent_identifiers = self.get('<STR_LIT>', [])<EOL>values = force_list(value)<EOL>for value in values:<EOL><INDENT>id_ = force_single_element(value.get('<STR_LIT:a>', '<STR_LIT>'))<EOL>material = _get_material(value)<EOL>schema = force_single_element(value.get('<STR_LIT:2>', '<STR_LIT>'))<EOL>sources = force_list(value.get('<STR_LIT>'))<EOL>source = _get_first_non_curator_source(sources)<EOL>if _is_doi(id_, schema):<EOL><INDENT>dois.append({<EOL>'<STR_LIT>': material,<EOL>'<STR_LIT:source>': source,<EOL>'<STR_LIT:value>': normalize_doi(id_),<EOL>})<EOL><DEDENT>else:<EOL><INDENT>schema = '<STR_LIT>' if _is_handle(id_, schema) else schema<EOL>persistent_identifiers.append({<EOL>'<STR_LIT>': material,<EOL>'<STR_LIT>': schema,<EOL>'<STR_LIT:source>': source,<EOL>'<STR_LIT:value>': id_,<EOL>})<EOL><DEDENT><DEDENT>self['<STR_LIT>'] = persistent_identifiers<EOL>return dois<EOL>
Populate the ``dois`` key.

    Also populates the ``persistent_identifiers`` key through side effects.