scout/server/blueprints/variants/controllers.py
def variant_verification(store, mail, institute_obj, case_obj, user_obj, variant_obj, sender, variant_url, order, comment, url_builder=url_for):
    """Sand a verification email and register the verification in the database

        Args:
            store(scout.adapter.MongoAdapter)
            mail(scout.server.extensions.mail): an instance of flask_mail.Mail
            institute_obj(dict): an institute object
            case_obj(dict): a case object
            user_obj(dict): a user object
            variant_obj(dict): a variant object (snv or sv)
            sender(str): current_app.config['MAIL_USERNAME']
            variant_url(str): the complete url to the variant (snv or sv), a link that works from outside scout domain.
            order(str): False == cancel order, True==order verification
            comment(str): sender's entered comment from form
            url_builder(flask.url_for): for testing purposes, otherwise test verification email fails because out of context
    """

    recipients = institute_obj['sanger_recipients']
    if len(recipients) == 0:
        raise MissingSangerRecipientError()

    view_type = None
    email_subject = None
    category = variant_obj.get('category')
    display_name = None
    chromosome = variant_obj['chromosome']
    end_chrom = variant_obj.get('end_chrom', chromosome)
    breakpoint_1 = ':'.join([chromosome, str(variant_obj['position'])])
    breakpoint_2 = ':'.join([end_chrom, str(variant_obj.get('end'))])
    variant_size = variant_obj.get('length')
    panels = ', '.join(variant_obj.get('panels', []))
    hgnc_symbol = ', '.join(variant_obj['hgnc_symbols'])
    email_subj_gene_symbol = None
    if len(variant_obj['hgnc_symbols']) > 3:
        email_subj_gene_symbol = ' '.join([ str(len(variant_obj['hgnc_symbols'])) + 'genes'])
    else:
        email_subj_gene_symbol = hgnc_symbol

    gtcalls = ["<li>{}: {}</li>".format(sample_obj['display_name'],
                                        sample_obj['genotype_call'])
               for sample_obj in variant_obj['samples']]
    tx_changes = []

    if category == 'snv': #SNV
        view_type = 'variants.variant'
        display_name = variant_obj.get('display_name')
        tx_changes = []

        for gene_obj in variant_obj.get('genes', []):
            for tx_obj in gene_obj['transcripts']:
                parse_transcript(gene_obj, tx_obj)
                # select refseq transcripts as "primary"
                if not tx_obj.get('refseq_id'):
                    continue

                for refseq_id in tx_obj.get('refseq_identifiers'):
                    transcript_line = []
                    if "common" in gene_obj:
                        transcript_line.append(gene_obj['common']['hgnc_symbol'])
                    else:
                        transcript_line.append(gene_obj['hgnc_id'])
                    transcript_line.append('-'.join([refseq_id, tx_obj['transcript_id']]))
                    if "exon" in tx_obj:
                        transcript_line.append(''.join([ "exon", tx_obj["exon"]]))
                    elif "intron" in tx_obj:
                        transcript_line.append(''.join([ "intron", tx_obj["intron"]]))
                    else:
                        transcript_line.append('intergenic')
                    if "coding_sequence_name" in tx_obj:
                        transcript_line.append(urllib.parse.unquote(tx_obj['coding_sequence_name']))
                    else:
                        transcript_line.append('')
                    if "protein_sequence_name" in tx_obj:
                        transcript_line.append(urllib.parse.unquote(tx_obj['protein_sequence_name']))
                    else:
                        transcript_line.append('')

                    tx_changes.append("<li>{}</li>".format(':'.join(transcript_line)))

    else: #SV
        view_type = 'variants.sv_variant'
        display_name = '_'.join([breakpoint_1, variant_obj.get('sub_category').upper()])

    # body of the email
    html = verification_email_body(
        case_name = case_obj['display_name'],
        url = variant_url, #this is the complete url to the variant, accessible when clicking on the email link
        display_name = display_name,
        category = category.upper(),
        subcategory = variant_obj.get('sub_category').upper(),
        breakpoint_1 = breakpoint_1,
        breakpoint_2 = breakpoint_2,
        hgnc_symbol = hgnc_symbol,
        panels = panels,
        gtcalls = ''.join(gtcalls),
        tx_changes = ''.join(tx_changes) or 'Not available',
        name = user_obj['name'].encode('utf-8'),
        comment = comment
    )

    # build a local the link to the variant to be included in the events objects (variant and case) created in the event collection.
    local_link = url_builder(view_type, institute_id=institute_obj['_id'],
                           case_name=case_obj['display_name'],
                           variant_id=variant_obj['_id'])

    if order == 'True': # variant verification should be ordered
        # pin variant if it's not already pinned
        if case_obj.get('suspects') is None or variant_obj['_id'] not in case_obj['suspects']:
            store.pin_variant(institute_obj, case_obj, user_obj, local_link, variant_obj)

        email_subject = "SCOUT: validation of {} variant {}, ({})".format( category.upper(), display_name, email_subj_gene_symbol)
        store.order_verification(institute=institute_obj, case=case_obj, user=user_obj, link=local_link, variant=variant_obj)

    else: # variant verification should be cancelled
        email_subject = "SCOUT: validation of {} variant {}, ({}), was CANCELLED!".format(category.upper(), display_name, email_subj_gene_symbol)
        store.cancel_verification(institute=institute_obj, case=case_obj, user=user_obj, link=local_link, variant=variant_obj)

    kwargs = dict(subject=email_subject, html=html, sender=sender, recipients=recipients,
        # cc the sender of the email for confirmation
        cc=[user_obj['email']])

    message = Message(**kwargs)
    # send email using flask_mail
    mail.send(message)
def variant_verification(store, mail, institute_obj, case_obj, user_obj, variant_obj, sender, variant_url, order, comment, url_builder=url_for):
    """Sand a verification email and register the verification in the database

        Args:
            store(scout.adapter.MongoAdapter)
            mail(scout.server.extensions.mail): an instance of flask_mail.Mail
            institute_obj(dict): an institute object
            case_obj(dict): a case object
            user_obj(dict): a user object
            variant_obj(dict): a variant object (snv or sv)
            sender(str): current_app.config['MAIL_USERNAME']
            variant_url(str): the complete url to the variant (snv or sv), a link that works from outside scout domain.
            order(str): False == cancel order, True==order verification
            comment(str): sender's entered comment from form
            url_builder(flask.url_for): for testing purposes, otherwise test verification email fails because out of context
    """

    recipients = institute_obj['sanger_recipients']
    if len(recipients) == 0:
        raise MissingSangerRecipientError()

    view_type = None
    email_subject = None
    category = variant_obj.get('category')
    display_name = None
    chromosome = variant_obj['chromosome']
    end_chrom = variant_obj.get('end_chrom', chromosome)
    breakpoint_1 = ':'.join([chromosome, str(variant_obj['position'])])
    breakpoint_2 = ':'.join([end_chrom, str(variant_obj.get('end'))])
    variant_size = variant_obj.get('length')
    panels = ', '.join(variant_obj.get('panels', []))
    hgnc_symbol = ', '.join(variant_obj['hgnc_symbols'])
    email_subj_gene_symbol = None
    if len(variant_obj['hgnc_symbols']) > 3:
        email_subj_gene_symbol = ' '.join([ str(len(variant_obj['hgnc_symbols'])) + 'genes'])
    else:
        email_subj_gene_symbol = hgnc_symbol

    gtcalls = ["<li>{}: {}</li>".format(sample_obj['display_name'],
                                        sample_obj['genotype_call'])
               for sample_obj in variant_obj['samples']]
    tx_changes = []

    if category == 'snv': #SNV
        view_type = 'variants.variant'
        display_name = variant_obj.get('display_name')
        tx_changes = []

        for gene_obj in variant_obj.get('genes', []):
            for tx_obj in gene_obj['transcripts']:
                parse_transcript(gene_obj, tx_obj)
                # select refseq transcripts as "primary"
                if not tx_obj.get('refseq_id'):
                    continue

                for refseq_id in tx_obj.get('refseq_identifiers'):
                    transcript_line = []
                    if "common" in gene_obj:
                        transcript_line.append(gene_obj['common']['hgnc_symbol'])
                    else:
                        transcript_line.append(gene_obj['hgnc_id'])
                    transcript_line.append('-'.join([refseq_id, tx_obj['transcript_id']]))
                    if "exon" in tx_obj:
                        transcript_line.append(''.join([ "exon", tx_obj["exon"]]))
                    elif "intron" in tx_obj:
                        transcript_line.append(''.join([ "intron", tx_obj["intron"]]))
                    else:
                        transcript_line.append('intergenic')
                    if "coding_sequence_name" in tx_obj:
                        transcript_line.append(urllib.parse.unquote(tx_obj['coding_sequence_name']))
                    else:
                        transcript_line.append('')
                    if "protein_sequence_name" in tx_obj:
                        transcript_line.append(urllib.parse.unquote(tx_obj['protein_sequence_name']))
                    else:
                        transcript_line.append('')

                    tx_changes.append("<li>{}</li>".format(':'.join(transcript_line)))

    else: #SV
        view_type = 'variants.sv_variant'
        display_name = '_'.join([breakpoint_1, variant_obj.get('sub_category').upper()])

    # body of the email
    html = verification_email_body(
        case_name = case_obj['display_name'],
        url = variant_url, #this is the complete url to the variant, accessible when clicking on the email link
        display_name = display_name,
        category = category.upper(),
        subcategory = variant_obj.get('sub_category').upper(),
        breakpoint_1 = breakpoint_1,
        breakpoint_2 = breakpoint_2,
        hgnc_symbol = hgnc_symbol,
        panels = panels,
        gtcalls = ''.join(gtcalls),
        tx_changes = ''.join(tx_changes) or 'Not available',
        name = user_obj['name'].encode('utf-8'),
        comment = comment
    )

    # build a local the link to the variant to be included in the events objects (variant and case) created in the event collection.
    local_link = url_builder(view_type, institute_id=institute_obj['_id'],
                           case_name=case_obj['display_name'],
                           variant_id=variant_obj['_id'])

    if order == 'True': # variant verification should be ordered
        # pin variant if it's not already pinned
        if case_obj.get('suspects') is None or variant_obj['_id'] not in case_obj['suspects']:
            store.pin_variant(institute_obj, case_obj, user_obj, local_link, variant_obj)

        email_subject = "SCOUT: validation of {} variant {}, ({})".format( category.upper(), display_name, email_subj_gene_symbol)
        store.order_verification(institute=institute_obj, case=case_obj, user=user_obj, link=local_link, variant=variant_obj)

    else: # variant verification should be cancelled
        email_subject = "SCOUT: validation of {} variant {}, ({}), was CANCELLED!".format(category.upper(), display_name, email_subj_gene_symbol)
        store.cancel_verification(institute=institute_obj, case=case_obj, user=user_obj, link=local_link, variant=variant_obj)

    kwargs = dict(subject=email_subject, html=html, sender=sender, recipients=recipients,
        # cc the sender of the email for confirmation
        cc=[user_obj['email']])

    message = Message(**kwargs)
    # send email using flask_mail
    mail.send(message)
def variant_verification ( store , mail , institute_obj , case_obj , user_obj , variant_obj , sender , variant_url , order , comment , url_builder = url_for ) : recipients = institute_obj [ 'sanger_recipients' ] if len ( recipients ) == 0 : raise MissingSangerRecipientError ( ) view_type = None email_subject = None category = variant_obj . get ( 'category' ) display_name = None chromosome = variant_obj [ 'chromosome' ] end_chrom = variant_obj . get ( 'end_chrom' , chromosome ) breakpoint_1 = ':' . join ( [ chromosome , str ( variant_obj [ 'position' ] ) ] ) breakpoint_2 = ':' . join ( [ end_chrom , str ( variant_obj . get ( 'end' ) ) ] ) variant_size = variant_obj . get ( 'length' ) panels = ', ' . join ( variant_obj . get ( 'panels' , [ ] ) ) hgnc_symbol = ', ' . join ( variant_obj [ 'hgnc_symbols' ] ) email_subj_gene_symbol = None if len ( variant_obj [ 'hgnc_symbols' ] ) > 3 : email_subj_gene_symbol = ' ' . join ( [ str ( len ( variant_obj [ 'hgnc_symbols' ] ) ) + 'genes' ] ) else : email_subj_gene_symbol = hgnc_symbol gtcalls = [ "<li>{}: {}</li>" . format ( sample_obj [ 'display_name' ] , sample_obj [ 'genotype_call' ] ) for sample_obj in variant_obj [ 'samples' ] ] tx_changes = [ ] if category == 'snv' : #SNV view_type = 'variants.variant' display_name = variant_obj . get ( 'display_name' ) tx_changes = [ ] for gene_obj in variant_obj . get ( 'genes' , [ ] ) : for tx_obj in gene_obj [ 'transcripts' ] : parse_transcript ( gene_obj , tx_obj ) # select refseq transcripts as "primary" if not tx_obj . get ( 'refseq_id' ) : continue for refseq_id in tx_obj . get ( 'refseq_identifiers' ) : transcript_line = [ ] if "common" in gene_obj : transcript_line . append ( gene_obj [ 'common' ] [ 'hgnc_symbol' ] ) else : transcript_line . append ( gene_obj [ 'hgnc_id' ] ) transcript_line . append ( '-' . join ( [ refseq_id , tx_obj [ 'transcript_id' ] ] ) ) if "exon" in tx_obj : transcript_line . append ( '' . join ( [ "exon" , tx_obj [ "exon" ] ] ) ) elif "intron" in tx_obj : transcript_line . append ( '' . join ( [ "intron" , tx_obj [ "intron" ] ] ) ) else : transcript_line . append ( 'intergenic' ) if "coding_sequence_name" in tx_obj : transcript_line . append ( urllib . parse . unquote ( tx_obj [ 'coding_sequence_name' ] ) ) else : transcript_line . append ( '' ) if "protein_sequence_name" in tx_obj : transcript_line . append ( urllib . parse . unquote ( tx_obj [ 'protein_sequence_name' ] ) ) else : transcript_line . append ( '' ) tx_changes . append ( "<li>{}</li>" . format ( ':' . join ( transcript_line ) ) ) else : #SV view_type = 'variants.sv_variant' display_name = '_' . join ( [ breakpoint_1 , variant_obj . get ( 'sub_category' ) . upper ( ) ] ) # body of the email html = verification_email_body ( case_name = case_obj [ 'display_name' ] , url = variant_url , #this is the complete url to the variant, accessible when clicking on the email link display_name = display_name , category = category . upper ( ) , subcategory = variant_obj . get ( 'sub_category' ) . upper ( ) , breakpoint_1 = breakpoint_1 , breakpoint_2 = breakpoint_2 , hgnc_symbol = hgnc_symbol , panels = panels , gtcalls = '' . join ( gtcalls ) , tx_changes = '' . join ( tx_changes ) or 'Not available' , name = user_obj [ 'name' ] . encode ( 'utf-8' ) , comment = comment ) # build a local the link to the variant to be included in the events objects (variant and case) created in the event collection. local_link = url_builder ( view_type , institute_id = institute_obj [ '_id' ] , case_name = case_obj [ 'display_name' ] , variant_id = variant_obj [ '_id' ] ) if order == 'True' : # variant verification should be ordered # pin variant if it's not already pinned if case_obj . get ( 'suspects' ) is None or variant_obj [ '_id' ] not in case_obj [ 'suspects' ] : store . pin_variant ( institute_obj , case_obj , user_obj , local_link , variant_obj ) email_subject = "SCOUT: validation of {} variant {}, ({})" . format ( category . upper ( ) , display_name , email_subj_gene_symbol ) store . order_verification ( institute = institute_obj , case = case_obj , user = user_obj , link = local_link , variant = variant_obj ) else : # variant verification should be cancelled email_subject = "SCOUT: validation of {} variant {}, ({}), was CANCELLED!" . format ( category . upper ( ) , display_name , email_subj_gene_symbol ) store . cancel_verification ( institute = institute_obj , case = case_obj , user = user_obj , link = local_link , variant = variant_obj ) kwargs = dict ( subject = email_subject , html = html , sender = sender , recipients = recipients , # cc the sender of the email for confirmation cc = [ user_obj [ 'email' ] ] ) message = Message ( * * kwargs ) # send email using flask_mail mail . send ( message )
Sand a verification email and register the verification in the database

        Args:
            store(scout.adapter.MongoAdapter)
            mail(scout.server.extensions.mail): an instance of flask_mail.Mail
            institute_obj(dict): an institute object
            case_obj(dict): a case object
            user_obj(dict): a user object
            variant_obj(dict): a variant object (snv or sv)
            sender(str): current_app.config['MAIL_USERNAME']
            variant_url(str): the complete url to the variant (snv or sv), a link that works from outside scout domain.
            order(str): False == cancel order, True==order verification
            comment(str): sender's entered comment from form
            url_builder(flask.url_for): for testing purposes, otherwise test verification email fails because out of context
Sand a verification email and register the verification in the database