def export_gene_items(file_path) :
    genes = Gene.objects.all() # get all lab objects

    if genes: # check if empty
        outfile = open(file_path+'/gene-items.xml', 'w') # open and write to lab-items.xml

        for gene in genes:
            toxoplasma_mutant_list = ToxoplasmaMutant.objects.all().filter(target_gene=gene)
            antibody_list = Antibody.objects.all().filter(target_gene=gene)

            # Only export if there is a related toxoplasma mutant or antibody
            if toxoplasma_mutant_list or antibody_list: 
                outfile.write('<item id="Gene_' + str(gene.id) + '" class="Gene">\n')
                outfile.write('\t<attribute name="primaryIdentifier" value="' + str(gene.gene_id) + '" />\n')
                outfile.write('\t<attribute name="symbol" value="' + str(gene.gene_id) + '" />\n')
                outfile.write('\t<attribute name="name" value="' + str(gene.description) + '" />\n')
                
                if toxoplasma_mutant_list:
                    exporter_utility.write_collection_items(outfile, toxoplasma_mutant_list, 'ToxoplasmaMutant', 'toxoplasmaMutants')
                if antibody_list:
                    exporter_utility.write_collection_items(outfile, antibody_list, 'Antibody', 'antibodies')

                outfile.write('</item>\n')
        
        outfile.close() # close file
def export_protocol_items(file_path) :
    protocols = Protocol.objects.all().filter(current=True) # get all objects
    
    if protocols: # check if empty
        outfile = open(file_path+'/protocol-items.xml', 'w') # open and write to *-items.xml

        for protocol in protocols:
            submission_list = [] # submissions
            applied_protocol_list = AppliedProtocol.objects.all().filter(protocol=protocol)
            for applied_protocol in applied_protocol_list:
                if applied_protocol.submission.publishable == True:
                    submission_list.append(applied_protocol.submission)
            submission_list = list(set(submission_list)) # Get rid of duplicates

            # Only export if there is a related objects
            if submission_list:
                outfile.write('<item id="Protocol_' + str(protocol.id) + '" class="Protocol">\n')
                outfile.write('\t<attribute name="name" value="' + protocol.name + '" />\n')
                outfile.write('\t<attribute name="description" value="' + protocol.description + '" />\n')
                outfile.write('\t<attribute name="type" value="' + protocol.protocol_type.name + '" />\n')
                outfile.write('\t<attribute name="version" value="' + str(protocol.version) + '" />\n')
                exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')

        outfile.close() # close file
def export_persistent_datafile_items(file_path, url) :
    persistent_datafiles = PersistentDataFile.objects.all() # get all objects
    
    if persistent_datafiles: # check if empty
        outfile = open(file_path+'/persistent-datafile-items.xml', 'w') # open and write to *-items.xml

        for persistent_datafile in persistent_datafiles:
            submission_data_list = SubmissionData.objects.all().filter(object_id=persistent_datafile.id)
            
            submission_list = [] # submissions
            for submission_data in submission_data_list:
            
                applied_protocol_list = []
                if submission_data.applied_protocol_input:
                    applied_protocol_list.append(submission_data.applied_protocol_input)
                if submission_data.applied_protocol_output:
                    applied_protocol_list.append(submission_data.applied_protocol_output)                
                
                for applied_protocol in applied_protocol_list:
                    if applied_protocol.submission.publishable == True:
                        submission_list.append(applied_protocol.submission)
            submission_list = list(set(submission_list)) # Get rid of duplicates
            
            # Only export if there is a related objects
            if submission_list:
                outfile.write('<item id="PersistentDataFile_' + str(persistent_datafile.id) + '" class="PersistentDataFile">\n')
                outfile.write('\t<attribute name="name" value="' + persistent_datafile.name + '" />\n')
                outfile.write('\t<attribute name="type" value="' + persistent_datafile.file_type.name + '" />\n')
                outfile.write('\t<attribute name="url" value="' + url + '/persistent/' + persistent_datafile.name + '" />\n')
                exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')

        outfile.close() # close file 
def export_experimental_factor_items(file_path) :
    experimental_factors = ExperimentalFactor.objects.all() # get all objects
    
    if experimental_factors: # check if empty
        outfile = open(file_path+'/experimental-factor-items.xml', 'w') # open and write to *-items.xml

        for experimental_factor in experimental_factors:
            submission_data_list = SubmissionData.objects.all().filter(object_id=experimental_factor.id)

            submission_list = [] # submissions
            for submission_data in submission_data_list:
                applied_protocol_list = []
                if submission_data.applied_protocol_input:
                    applied_protocol_list.append(submission_data.applied_protocol_input)
                if submission_data.applied_protocol_output:
                    applied_protocol_list.append(submission_data.applied_protocol_output)                
                
                for applied_protocol in applied_protocol_list:
                    if applied_protocol.submission.publishable == True:
                        submission_list.append(applied_protocol.submission)

            submission_list = list(set(submission_list)) # Get rid of duplicates

            # Only export if there is a related objects
            if submission_list: 
                outfile.write('<item id="ExperimentalFactor_' + str(experimental_factor.id) + '" class="ExperimentalFactor">\n')
                outfile.write('\t<attribute name="type" value="' + experimental_factor.name.name + '" />\n')
                outfile.write('\t<attribute name="value" value="' + experimental_factor.value + '" />\n')
                exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')

        outfile.close() # close file
def export_submission_datafile_items(file_path, url) :
    
    # create directories if it doesn't exists
    if not os.path.exists(file_path+'/peaks/chromosome'):
        os.makedirs(file_path+'/peaks/chromosome')
    if not os.path.exists(file_path+'/peaks/contig'):
        os.makedirs(file_path+'/peaks/contig')
    if not os.path.exists(file_path+'/peaks/supercontig'):
        os.makedirs(file_path+'/peaks/supercontig')
    if not os.path.exists(file_path+'/gene_list'):
        os.makedirs(file_path+'/gene_list')

    submission_datafiles = SubmissionDataFile.objects.all() # get all objects
    
    gene_list_list = [] # for submission data gene list
    
    if submission_datafiles: # check if empty
        outfile = open(file_path+'/submission-datafile-items.xml', 'w') # open and write to *-items.xml

        for submission_datafile in submission_datafiles:
            submission_data_list = SubmissionData.objects.all().filter(object_id=submission_datafile.id)

            submission_list = [] # submissions
            for submission_data in submission_data_list:
                applied_protocol_list = []
                if submission_data.applied_protocol_input:
                    applied_protocol_list.append(submission_data.applied_protocol_input)
                if submission_data.applied_protocol_output:
                    applied_protocol_list.append(submission_data.applied_protocol_output)                
                
                for applied_protocol in applied_protocol_list:
                    if applied_protocol.submission.publishable == True:
                        submission_list.append(applied_protocol.submission)
            submission_list = list(set(submission_list)) # Get rid of duplicates

            # Only export if there is a related objects
            if submission_list: 
                outfile.write('<item id="SubmissionDataFile_' + str(submission_datafile.id) + '" class="SubmissionDataFile">\n')
                outfile.write('\t<attribute name="name" value="' + submission_datafile.name + '" />\n')
                outfile.write('\t<attribute name="type" value="' + submission_datafile.file_type.name + '" />\n')

                submission_id_list = submission_datafile.name.split('_')
                outfile.write('\t<attribute name="url" value="' + url + '/' + submission_id_list[0] + '/' + submission_datafile.name + '" />\n')

                exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')
                
                if 'peaks' in submission_datafile.name:
                    export_peaks_submission_datafile(submission_datafile.data_file.path, file_path+'/peaks/', submission_datafile.name) # export peaks.gff into one folder

                if 'gene_list' in submission_datafile.name:
                    export_gene_list_submission_datafile(submission_datafile.data_file.path, file_path+'/gene_list/'+submission_datafile.name) # export of gene_list.txt
                    gene_list_list.append(file_path+'/gene_list/'+submission_datafile.name) # append to gene list list

        outfile.close() # close file

    if gene_list_list: # consolidate gene list into one list
        consolidate_gene_list_submission_datafile(file_path, gene_list_list)
def export_organism_items(file_path):
    organisms = Organism.objects.all()  # get all lab objects

    if organisms:  # check if empty
        outfile = open(file_path + "/organism-items.xml", "w")  # open and write to lab-items.xml

        for organism in organisms:
            toxoplasma_mutant_list = ToxoplasmaMutant.objects.all().filter(organism=organism)

            # Only export if there is a related toxoplasma mutant
            if toxoplasma_mutant_list:
                outfile.write('<item id="Organism_' + str(organism.id) + '" class="Organism">\n')
                outfile.write('\t<attribute name="taxonId" value="' + str(organism.taxon_id) + '" />\n')
                exporter_utility.write_collection_items(
                    outfile, toxoplasma_mutant_list, "ToxoplasmaMutant", "toxoplasmaMutants"
                )
                outfile.write("</item>\n")

        outfile.close()  # close file
def export_publication_items(file_path) :
    publications = Publication.objects.all() # get all objects

    if publications: # check if empty
        outfile = open(file_path+'/publication-items.xml', 'w') # open and write to *-items.xml

        for publication in publications:
            dbxrefs_list = publication.dbxrefs.all() # dbxrefs
            for dbxref in dbxrefs_list:
                if dbxref.db.name == 'Pubmed':
                    pubmed_id = dbxref.accession
            
            project_list = Project.objects.all().filter(publications=publication).filter(publishable=True)
            experiment_list = Experiment.objects.all().filter(publications=publication).filter(publishable=True)
            submission_list = Submission.objects.all().filter(publications=publication).filter(publishable=True)
            
            # Only export if there is a related objects
            if pubmed_id and (project_list or experiment_list or submission_list): 
                outfile.write('<item id="Publication_' + str(publication.id) + '" class="Publication">\n')
                outfile.write('\t<attribute name="pubMedId" value="' + str(pubmed_id) + '" />\n')
                outfile.write('\t<attribute name="title" value="' + str(publication.unique_name) + '" />\n')
                if project_list:
                    exporter_utility.write_collection_items(outfile, project_list, 'Project', 'projects')
                if experiment_list:
                    exporter_utility.write_collection_items(outfile, experiment_list, 'Experiment', 'experiments')
                if submission_list:
                    exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')
        
        outfile.close() # close file
def export_microarray_items(file_path):
    microarrays = MicroArray.objects.all()  # get all objects

    if microarrays:  # check if empty
        outfile = open(file_path + "/microarray-items.xml", "w")  # open and write to *-items.xml

        for microarray in microarrays:
            submission_data_list = SubmissionData.objects.all().filter(object_id=microarray.id)

            submission_list = []  # submissions
            for submission_data in submission_data_list:
                applied_protocol_list = []
                if submission_data.applied_protocol_input:
                    applied_protocol_list.append(submission_data.applied_protocol_input)
                if submission_data.applied_protocol_output:
                    applied_protocol_list.append(submission_data.applied_protocol_output)

                for applied_protocol in applied_protocol_list:
                    if applied_protocol.submission.publishable == True:
                        submission_list.append(applied_protocol.submission)

            submission_list = list(set(submission_list))  # Get rid of duplicates

            # Only export if there is a related objects
            if submission_list:
                outfile.write('<item id="MicroArray_' + str(microarray.id) + '" class="MicroArray">\n')
                outfile.write('\t<attribute name="name" value="' + microarray.name + '" />\n')
                outfile.write('\t<attribute name="platform" value="' + microarray.platform.name + '" />\n')
                outfile.write('\t<attribute name="format" value="' + microarray.microarray_format.name + '" />\n')
                outfile.write('\t<attribute name="version" value="' + microarray.version + '" />\n')
                outfile.write('\t<attribute name="genomeName" value="' + microarray.genome_name.name + '" />\n')
                outfile.write('\t<attribute name="genomeVersion" value="' + microarray.genome_version + '" />\n')
                exporter_utility.write_collection_items(outfile, submission_list, "Submission", "submissions")
                outfile.write("</item>\n")

        outfile.close()  # close file
def export_data_analysis_items(file_path):
    data_analyses = DataAnalysis.objects.all()  # get all objects

    if data_analyses:  # check if empty
        outfile = open(file_path + "/data-analysis-items.xml", "w")  # open and write to *-items.xml

        for data_analysis in data_analyses:
            submission_data_list = SubmissionData.objects.all().filter(object_id=data_analysis.id)

            submission_list = []  # submissions
            for submission_data in submission_data_list:
                applied_protocol_list = []
                if submission_data.applied_protocol_input:
                    applied_protocol_list.append(submission_data.applied_protocol_input)
                if submission_data.applied_protocol_output:
                    applied_protocol_list.append(submission_data.applied_protocol_output)

                for applied_protocol in applied_protocol_list:
                    if applied_protocol.submission.publishable == True:
                        submission_list.append(applied_protocol.submission)
            submission_list = list(set(submission_list))  # Get rid of duplicates

            # Only export if there is a related objects
            if submission_data_list or submission_list:
                outfile.write('<item id="DataAnalysis_' + str(data_analysis.id) + '" class="DataAnalysis">\n')
                outfile.write('\t<attribute name="name" value="' + data_analysis.name + '" />\n')
                outfile.write('\t<attribute name="platform" value="' + data_analysis.platform + '" />\n')
                outfile.write('\t<attribute name="version" value="' + data_analysis.version + '" />\n')
                outfile.write('\t<attribute name="module" value="' + data_analysis.module + '" />\n')
                outfile.write('\t<attribute name="parameter" value="' + data_analysis.parameter + '" />\n')
                if data_analysis.data_analysis_type:
                    outfile.write('\t<attribute name="type" value="' + data_analysis.data_analysis_type.name + '" />\n')
                exporter_utility.write_collection_items(outfile, submission_list, "Submission", "submissions")
                outfile.write("</item>\n")

        outfile.close()  # close file
def export_applied_protocol_items(file_path) :
    applied_protocols = AppliedProtocol.objects.all() # get all objects
    
    if applied_protocols: # check if empty
        outfile = open(file_path+'/applied-protocol-items.xml', 'w') # open and write to *-items.xml

        for applied_protocol in applied_protocols:

            input_list = SubmissionData.objects.all().filter(applied_protocol_input=applied_protocol) # submission data
            output_list = SubmissionData.objects.all().filter(applied_protocol_output=applied_protocol) # submission data
            input_list = list(set(input_list)) # Get rid of duplicates
            output_list = list(set(output_list)) # Get rid of duplicates

            outfile.write('<item id="AppliedProtocol_' + str(applied_protocol.id) + '" class="AppliedProtocol">\n')
            outfile.write('\t<attribute name="step" value="' + str(applied_protocol.step) + '" />\n')
            exporter_utility.write_reference_item(outfile, applied_protocol.protocol, 'Protocol', 'protocol')
            exporter_utility.write_reference_item(outfile, applied_protocol.submission, 'Submission', 'submission')
            if input_list:
                exporter_utility.write_collection_items(outfile, input_list, 'SubmissionData', 'inputs')
            if output_list:
                exporter_utility.write_collection_items(outfile, output_list, 'SubmissionData', 'outputs')
            outfile.write('</item>\n')

        outfile.close() # close file
def export_antibody_items(file_path) :
    antibodies = Antibody.objects.all() # get all objects
    
    if antibodies: # check if empty
        outfile = open(file_path+'/antibody-items.xml', 'w') # open and write to *-items.xml

        for antibody in antibodies:
            submission_data_list = SubmissionData.objects.all().filter(object_id=antibody.id)

            submission_list = [] # submissions
            for submission_data in submission_data_list:
                applied_protocol_list = []
                if submission_data.applied_protocol_input:
                    applied_protocol_list.append(submission_data.applied_protocol_input)
                if submission_data.applied_protocol_output:
                    applied_protocol_list.append(submission_data.applied_protocol_output)                
                
                for applied_protocol in applied_protocol_list:
                    if applied_protocol.submission.publishable == True:
                        submission_list.append(applied_protocol.submission)
            submission_list = list(set(submission_list)) # Get rid of duplicates

            experiment_list = [] # experiment
            for submission in submission_list:
                experiment_list.extend(submission.experiments.all().filter(publishable=True)) # experiments
            experiment_list = list(set(experiment_list)) # Get rid of duplicates

            project_list = [] # projects
            for experiment in experiment_list:
                project_list.extend(experiment.projects.all().filter(publishable=True))
            project_list = list(set(project_list)) # Get rid of duplicates

            # Only export if there is a related objects
            if submission_data_list or project_list or experiment_list or submission_list: 
                outfile.write('<item id="Antibody_' + str(antibody.id) + '" class="Antibody">\n')
                outfile.write('\t<attribute name="name" value="' + antibody.name + '" />\n')
                outfile.write('\t<attribute name="targetName" value="' + antibody.target_name + '" />\n')
                outfile.write('\t<attribute name="source" value="' + antibody.source + '" />\n')
                outfile.write('\t<attribute name="epitope" value="' + antibody.epitope + '" />\n')
                if antibody.animal_host:
                    outfile.write('\t<attribute name="hostOrganism" value="' + antibody.animal_host.name + '" />\n')
                else:
                    outfile.write('\t<attribute name="hostOrganism" value="" />\n')

                if antibody.target_gene:
                    exporter_utility.write_reference_item(outfile, antibody.target_gene, 'Gene', 'targetGene')
                if project_list:
                    exporter_utility.write_collection_items(outfile, project_list, 'Project', 'projects')
                if experiment_list:
                    exporter_utility.write_collection_items(outfile, experiment_list, 'Experiment', 'experiments')
                if submission_list:
                    exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')

        outfile.close() # close file
def export_lab_items(file_path) :
    labs = Lab.objects.all() # get all lab objects
    
    if labs: # check if empty
        outfile = open(file_path+'/lab-items.xml', 'w') # open and write to *-items.xml

        for lab in labs:
            lab_members = lab.lab_members.all() # Grab all lab members
            
            project_list = [] # projects
            experiment_list = [] # experiments
            submission_list = [] # submissions
            
            # For each member of the lab
            for lab_member in lab_members:
                tmp_project_list = Project.objects.all().filter(contributors=lab_member).filter(publishable=True)
                if tmp_project_list:
                    project_list.extend(tmp_project_list)
                tmp_experiment_list = Experiment.objects.all().filter(contributors=lab_member).filter(publishable=True)
                if tmp_experiment_list:
                    experiment_list.extend(tmp_experiment_list)                    
                tmp_submission_list = Submission.objects.all().filter(contributors=lab_member).filter(publishable=True)
                if tmp_submission_list:
                    submission_list.extend(tmp_submission_list)                    

            project_list = list(set(project_list)) # Get rid of duplicates
            experiment_list = list(set(experiment_list)) # Get rid of duplicates
            submission_list = list(set(submission_list)) # Get rid of duplicates

            # Only export if there is a related objects
            if project_list or experiment_list or submission_list: 
                outfile.write('<item id="Lab_' + str(lab.id) + '" class="Lab">\n')
                outfile.write('\t<attribute name="name" value="' + lab.name + '" />\n')
                outfile.write('\t<attribute name="piFirstName" value="' + lab.pi_first_name + '" />\n')
                outfile.write('\t<attribute name="piLastName" value="' + lab.pi_last_name + '" />\n')
                outfile.write('\t<attribute name="affiliation" value="' + lab.affiliation + '" />\n')
                if project_list:
                    exporter_utility.write_collection_items(outfile, project_list, 'Project', 'projects')
                if experiment_list:
                    exporter_utility.write_collection_items(outfile, experiment_list, 'Experiment', 'experiments')
                if submission_list:
                    exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')

        outfile.close() # close file
def export_toxoplasma_mutant_items(file_path) :
    toxoplasma_mutants = ToxoplasmaMutant.objects.all() # get all objects
    
    if toxoplasma_mutants: # check if empty
        outfile = open(file_path+'/toxoplasma-mutant-items.xml', 'w') # open and write to *-items.xml

        for toxoplasma_mutant in toxoplasma_mutants:
            submission_data_list = SubmissionData.objects.all().filter(object_id=toxoplasma_mutant.id)

            submission_list = [] # submissions
            for submission_data in submission_data_list:
                applied_protocol_list = []
                if submission_data.applied_protocol_input:
                    applied_protocol_list.append(submission_data.applied_protocol_input)
                if submission_data.applied_protocol_output:
                    applied_protocol_list.append(submission_data.applied_protocol_output)                
                
                for applied_protocol in applied_protocol_list:
                    if applied_protocol.submission.publishable == True:
                        submission_list.append(applied_protocol.submission)
            submission_list = list(set(submission_list)) # Get rid of duplicates

            experiment_list = [] # experiment
            for submission in submission_list:
                experiment_list.extend(submission.experiments.all().filter(publishable=True)) # experiments
            experiment_list = list(set(experiment_list)) # Get rid of duplicates

            project_list = [] # projects
            for experiment in experiment_list:
                project_list.extend(experiment.projects.all().filter(publishable=True))
            project_list = list(set(project_list)) # Get rid of duplicates

            # Only export if there is a related objects
            if submission_data_list or project_list or experiment_list or submission_list: 
                outfile.write('<item id="ToxoplasmaMutant_' + str(toxoplasma_mutant.id) + '" class="ToxoplasmaMutant">\n')
                outfile.write('\t<attribute name="name" value="' + toxoplasma_mutant.name + '" />\n')
                outfile.write('\t<attribute name="targetName" value="' + toxoplasma_mutant.target_name + '" />\n')
                outfile.write('\t<attribute name="mutantSelection" value="' + toxoplasma_mutant.selection.name + '" />\n')
                outfile.write('\t<attribute name="mutantType" value="' + toxoplasma_mutant.mutation_type.name + '" />\n')
                outfile.write('\t<attribute name="mutantBackground" value="' + toxoplasma_mutant.background.name + '" />\n')

                strain = ''
                background = ''

                organism_property_list = OrganismProperty.objects.all().filter(organism=toxoplasma_mutant.organism) # organism property
                for organism_property in organism_property_list:
                    if organism_property.organism_property_type.name == 'organism strain':
                        strain = organism_property.organism_property_value.name
                    if organism_property.organism_property_type.name == 'organism type':
                        background = organism_property.organism_property_value.name

                outfile.write('\t<attribute name="strain" value="' + strain + '" />\n')
                outfile.write('\t<attribute name="background" value="' + background + '" />\n')
    
                if toxoplasma_mutant.target_gene:
                    exporter_utility.write_reference_item(outfile, toxoplasma_mutant.target_gene, 'Gene', 'targetGene')
                if toxoplasma_mutant.organism:
                    exporter_utility.write_reference_item(outfile, toxoplasma_mutant.organism, 'Organism', 'organism')
                if project_list:
                    exporter_utility.write_collection_items(outfile, project_list, 'Project', 'projects')
                if experiment_list:
                    exporter_utility.write_collection_items(outfile, experiment_list, 'Experiment', 'experiments')
                if submission_list:
                    exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                outfile.write('</item>\n')

        outfile.close() # close file
def export_project_items(file_path) :
    projects = Project.objects.all().filter(publishable=True) # get all objects
    
    if projects: # check if empty
        outfile = open(file_path+'/project-items.xml', 'w') # open and write to *-items.xml

        for project in projects:
            publication_list = project.publications.all() # publications

            lab_list = [] # labs
            contributors = project.contributors.all() # Grab all project contributors
            # Grab all the projects by each member of the lab
            for contributor in contributors:
                tmp_list = Lab.objects.all().filter(lab_members=contributor)
                if tmp_list:
                    lab_list.extend(tmp_list)
            lab_list = list(set(lab_list)) # Get rid of duplicates

            experiment_list = Experiment.objects.all().filter(projects=project).filter(publishable=True) # experiments

            submission_list = [] # submissions
            # Grab all the submissions
            for experiment in experiment_list:
                tmp_list = Submission.objects.all().filter(experiments=experiment).filter(publishable=True)
                if tmp_list:
                    submission_list.extend(tmp_list)
            submission_list = list(set(submission_list)) # Get rid of duplicates

            organism_list = [] # organisms
            toxoplasma_mutant_list = [] # toxoplasma mutants
            antibody_list = [] # antibody
            # Grab all the submission data
            for submission in submission_list:                
                applied_protocol_list = AppliedProtocol.objects.all().filter(submission=submission)
                for applied_protocol in applied_protocol_list:
                    submission_data_list = SubmissionData.objects.all().filter(Q(applied_protocol_input=applied_protocol) | Q(applied_protocol_output=applied_protocol))
                    for submission_data in submission_data_list:
                        if submission_data.content_type==ContentType.objects.get_for_model(ToxoplasmaMutant):
                            toxoplasma_mutant_list.append(submission_data.content_object)
                            organism_list.append(submission_data.content_object.organism)
                        if submission_data.content_type==ContentType.objects.get_for_model(Antibody):
                            antibody_list.append(submission_data.content_object)

            organism_list = list(set(organism_list)) # Get rid of duplicates
            toxoplasma_mutant_list = list(set(toxoplasma_mutant_list)) # Get rid of duplicates
            antibody_list = list(set(antibody_list)) # Get rid of duplicates

            # Only export if there is a related objects
            if publication_list or lab_list or experiment_list or submission_list or organism_list or toxoplasma_mutant_list or antibody_list: 
                outfile.write('<item id="Project_' + str(project.id) + '" class="Project">\n')
                outfile.write('\t<attribute name="name" value="' + project.name + '" />\n')
                outfile.write('\t<attribute name="description" value="' + project.description + '" />\n')
                if publication_list:
                    exporter_utility.write_collection_items(outfile, publication_list, 'Publication', 'publications')
                if lab_list:
                    exporter_utility.write_collection_items(outfile, lab_list, 'Lab', 'labs')
                if experiment_list:
                    exporter_utility.write_collection_items(outfile, experiment_list, 'Experiment', 'experiments')
                if submission_list:
                    exporter_utility.write_collection_items(outfile, submission_list, 'Submission', 'submissions')
                if organism_list:
                    exporter_utility.write_collection_items(outfile, organism_list, 'Organism', 'organisms')
                if toxoplasma_mutant_list:
                    exporter_utility.write_collection_items(outfile, toxoplasma_mutant_list, 'ToxoplasmaMutant', 'toxoplasmaMutants')
                if antibody_list:
                    exporter_utility.write_collection_items(outfile, antibody_list, 'Antibody', 'antibodies')
                outfile.write('</item>\n')

        outfile.close() # close file
def export_submission_items(file_path) :
    submissions = Submission.objects.all().filter(publishable=True) # get all objects
    
    if submissions: # check if empty
        outfile = open(file_path+'/submission-items.xml', 'w') # open and write to *-items.xml

        for submission in submissions:
            publication_list = submission.publications.all() # publications

            lab_list = [] # labs
            contributors = submission.contributors.all() # Grab all submission contributors
            # Grab all the submission by each member of the lab
            for contributor in contributors:
                tmp_list = Lab.objects.all().filter(lab_members=contributor)
                if tmp_list:
                    lab_list.extend(tmp_list)
            lab_list = list(set(lab_list)) # Get rid of duplicates

            experiment_list = submission.experiments.all().filter(publishable=True) # experiments

            project_list = [] # projects
            for experiment in experiment_list:
                tmp_list = experiment.projects.all().filter(publishable=True)
                project_list.extend(tmp_list)
            project_list = list(set(project_list)) # Get rid of duplicates

            applied_protocol_list = [] # applied protocols
            protocol_list = [] # protocols
            organism_list = [] # organisms
            toxoplasma_mutant_list = [] # toxoplasma mutants
            antibody_list = [] # antibodies
            experimental_factor_list = [] # experimental factor
            microarray_list = [] # microarray
            sequencing_list = [] # sequencing
            data_analysis_list = [] # data analysis
            persistent_datafile_list = [] # persistent datafile
            submission_datafile_list = [] # submission datafile

            # Grab all the organisms and toxoplasma mutants
            applied_protocol_list = AppliedProtocol.objects.all().filter(submission=submission)
            for applied_protocol in applied_protocol_list:
                protocol_list.append(applied_protocol.protocol) # protocols
                submission_data_list = SubmissionData.objects.all().filter(Q(applied_protocol_input=applied_protocol) | Q(applied_protocol_output=applied_protocol))
                for submission_data in submission_data_list:
                    if submission_data.content_type==ContentType.objects.get_for_model(ToxoplasmaMutant):
                        toxoplasma_mutant_list.append(submission_data.content_object)
                        organism_list.append(submission_data.content_object.organism)
                    if submission_data.content_type==ContentType.objects.get_for_model(Antibody):
                        antibody_list.append(submission_data.content_object)
                    if submission_data.content_type==ContentType.objects.get_for_model(ExperimentalFactor):
                        experimental_factor_list.append(submission_data.content_object)
                    if submission_data.content_type==ContentType.objects.get_for_model(MicroArray):
                        microarray_list.append(submission_data.content_object)
                    if submission_data.content_type==ContentType.objects.get_for_model(Sequencing):
                        sequencing_list.append(submission_data.content_object)
                    if submission_data.content_type==ContentType.objects.get_for_model(DataAnalysis):
                        data_analysis_list.append(submission_data.content_object)                        
                    if submission_data.content_type==ContentType.objects.get_for_model(PersistentDataFile):
                        persistent_datafile_list.append(submission_data.content_object)
                    if submission_data.content_type==ContentType.objects.get_for_model(SubmissionDataFile):
                        submission_datafile_list.append(submission_data.content_object)

            protocol_list = list(set(protocol_list)) # Get rid of duplicates
            organism_list = list(set(organism_list)) # Get rid of duplicates
            toxoplasma_mutant_list = list(set(toxoplasma_mutant_list)) # Get rid of duplicates
            antibody_list = list(set(antibody_list)) # Get rid of duplicates
            experimental_factor_list = list(set(experimental_factor_list)) # Get rid of duplicates
            microarray_list = list(set(microarray_list)) # Get rid of duplicates
            sequencing_list = list(set(sequencing_list)) # Get rid of duplicates
            data_analysis_list = list(set(data_analysis_list)) # Get rid of duplicates
            persistent_datafile_list = list(set(persistent_datafile_list)) # Get rid of duplicates
            submission_datafile_list = list(set(submission_datafile_list)) # Get rid of duplicates

            # Only export if there is a related labs
            if publication_list or lab_list or project_list or experiment_list or applied_protocol_list or protocol_list:

                outfile.write('<item id="Submission_' + str(submission.id) + '" class="Submission">\n')
                outfile.write('\t<attribute name="TCid" value="' + submission.generated_id + '" />\n')
                outfile.write('\t<attribute name="name" value="' + submission.name + '" />\n')
                outfile.write('\t<attribute name="description" value="' + submission.description + '" />\n')
                outfile.write('\t<attribute name="technique" value="' + submission.technique.name + '" />\n')
                outfile.write('\t<attribute name="qualityControl" value="' + submission.quality_control.name + '" />\n')
                outfile.write('\t<attribute name="embargoDate" value="' + str(submission.date_embargo) + '" />\n')
                outfile.write('\t<attribute name="publicReleaseDate" value="' + str(submission.date_created) + '" />\n')
                outfile.write('\t<attribute name="replicateDate" value="' + str(submission.date_replicate) + '" />\n')

                if publication_list:
                    exporter_utility.write_collection_items(outfile, publication_list, 'Publication', 'publications')
                if lab_list:
                    exporter_utility.write_collection_items(outfile, lab_list, 'Lab', 'labs')
                if project_list:
                    exporter_utility.write_collection_items(outfile, project_list, 'Project', 'projects')
                if experiment_list:
                    exporter_utility.write_collection_items(outfile, experiment_list, 'Experiment', 'experiments')

                if applied_protocol_list:
                    exporter_utility.write_collection_items(outfile, applied_protocol_list, 'AppliedProtocol', 'appliedProtocols')                    
                if protocol_list:
                    exporter_utility.write_collection_items(outfile, protocol_list, 'Protocol', 'protocols')  
                if organism_list:
                    exporter_utility.write_collection_items(outfile, organism_list, 'Organism', 'organisms')
                if toxoplasma_mutant_list:
                    exporter_utility.write_collection_items(outfile, toxoplasma_mutant_list, 'ToxoplasmaMutant', 'toxoplasmaMutants')
                if antibody_list:
                    exporter_utility.write_collection_items(outfile, antibody_list, 'Antibody', 'antibodies')
                if experimental_factor_list:
                    exporter_utility.write_collection_items(outfile, experimental_factor_list, 'ExperimentalFactor', 'experimentalFactors')
                if microarray_list:
                    exporter_utility.write_collection_items(outfile, microarray_list, 'MicroArray', 'microArrays')
                if sequencing_list:
                    exporter_utility.write_collection_items(outfile, sequencing_list, 'Sequencing', 'sequencings')
                if data_analysis_list:
                    exporter_utility.write_collection_items(outfile, data_analysis_list, 'DataAnalysis', 'dataAnalyses')
                if persistent_datafile_list:
                    exporter_utility.write_collection_items(outfile, persistent_datafile_list, 'PersistentDataFile', 'persistentDataFiles')
                if submission_datafile_list:
                    exporter_utility.write_collection_items(outfile, submission_datafile_list, 'SubmissionDataFile', 'submissionDataFiles')
                outfile.write('</item>\n')

        outfile.close() # close file