Skip to content

Commit 2867ab9

Browse files
authored
Merge pull request #578 from ddbj/bioproject
BioProject submission
2 parents 993e577 + acc814e commit 2867ab9

File tree

3 files changed

+681
-48
lines changed

3 files changed

+681
-48
lines changed

api/app/models/database/bioproject.rb

Lines changed: 216 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,21 +74,7 @@ def submit(submission)
7474
)
7575
end
7676

77-
{
78-
first_name: user.first_name,
79-
last_name: user.last_name,
80-
email: user.email,
81-
organization_name: [ user.department, user.organization ].compact_blank.join(", "),
82-
organization_url: user.organization_url
83-
}.each.with_index 1 do |(key, value), i|
84-
Dway.bioproject[:submission_data].insert(
85-
submission_id:,
86-
data_name: key.to_s,
87-
data_value: value.to_s,
88-
form_name: "submitter",
89-
t_order: i
90-
)
91-
end
77+
Dway.bioproject[:submission_data].multi_insert submission_data_attrs(submission, submission_id, doc)
9278
end
9379
end
9480

@@ -121,5 +107,220 @@ def modify_xml(doc, project_id, is_public)
121107

122108
doc
123109
end
110+
111+
def submission_data_attrs(submission, submission_id, doc)
112+
user = submission.validation.user
113+
114+
[
115+
doc.at("/PackageSet/Package/Project/Project/ProjectDescr/Title").then {
116+
[ "general_info", "project_title", _1&.text ]
117+
},
118+
119+
doc.at("/PackageSet/Package/Project/Project/ProjectDescr/Description").then {
120+
[ "general_info", "public_description", _1&.text ]
121+
},
122+
123+
*doc.xpath("/PackageSet/Package/Project/Project/ProjectDescr/ExternalLink").flat_map.with_index(1) { |link, i|
124+
url = link.at("URL")
125+
126+
[
127+
[ "general_info", "link_url.#{i}", url&.text ],
128+
[ "general_info", "link_description.#{i}", link[:label] ]
129+
]
130+
},
131+
132+
*doc.xpath("/PackageSet/Package/Project/Project/ProjectDescr/Grant").flat_map.with_index(1) { |grant, i|
133+
title = grant.at("Title")
134+
agency = grant.at("Agency")
135+
abbr = grant.at("Agency/@abbr")
136+
137+
[
138+
[ "general_info", "grant_id.#{i}", grant[:GrantId] ],
139+
[ "general_info", "grant_title.#{i}", title&.text ],
140+
[ "general_info", "agency.#{i}", agency&.text ],
141+
[ "general_info", "agency_abbreviation.#{i}", abbr&.text ]
142+
]
143+
},
144+
145+
*doc.xpath("/PackageSet/Package/Project/Project/ProjectDescr/Publication").map.with_index(1) { |publication, i|
146+
case publication.at("Reference/DbType")&.text
147+
when "ePubmed"
148+
[ "publication", "pubmed_id.#{i}", publication[:id] ]
149+
when "eDOI"
150+
[ "publication", "doi.#{i}", publication[:id] ]
151+
else
152+
raise "Unsupported publication type"
153+
end
154+
},
155+
156+
doc.at("/PackageSet/Package/Project/Project/ProjectDescr/Relevance").then {
157+
next nil unless _1
158+
159+
if other = _1.at("Other")
160+
[ "general_info", "relevance_description", other.text ]
161+
else
162+
[ "general_info", "relevance", _1.childeren.first.name ]
163+
end
164+
},
165+
166+
doc.at("/PackageSet/Package/Project/Project/ProjectDescr/LocusTagPrefix").then {
167+
[ "project_type", "locus_tag", _1&.text ]
168+
},
169+
170+
*doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target").then {
171+
[
172+
[ "project_type", "sample_code", _1&.[](:sample_scope) ],
173+
[ "project_type", "material", _1&.[](:material) ],
174+
[ "project_type", "capture", _1&.[](:capture) ]
175+
]
176+
},
177+
178+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism").then {
179+
tax_id = _1&.[](:taxID)
180+
181+
[ "target", "taxonomy_id", tax_id == "0" ? nil : tax_id ]
182+
},
183+
184+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/OrganismName").then {
185+
[ "target", "organism_name", _1&.text ]
186+
},
187+
188+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/Label").then {
189+
[ "target", "isolate_name_or_label", _1&.text ]
190+
},
191+
192+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/Strain").then {
193+
[ "target", "strain_breed_cultivar", _1&.text ]
194+
},
195+
196+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Morphology/Gram").then {
197+
[ "target", "prokaryote_gram", _1&.text ]
198+
},
199+
200+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Morphology/Enveloped").then {
201+
[ "target", "prokaryote_enveloped", _1&.text ]
202+
},
203+
204+
*doc.xpath("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Morphology/Shape").map.with_index(1) { |shape, i|
205+
[ "target", "prokaryote_shape.#{i}", shape.text ]
206+
},
207+
208+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Morphology/Endospores").then {
209+
[ "target", "prokaryote_endospores", _1&.text ]
210+
},
211+
212+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Morphology/Motility").then {
213+
[ "target", "prokaryote_motility", _1&.text ]
214+
},
215+
216+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Environment/Salinity").then {
217+
[ "target", "environment_salinity", _1&.text ]
218+
},
219+
220+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Environment/OxygenReq").then {
221+
[ "target", "environment_oxygen_requirement", _1&.text ]
222+
},
223+
224+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Environment/OptimumTemperature").then {
225+
[ "target", "environment_optimum_temperature", _1&.text ]
226+
},
227+
228+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Environment/TemperatureRange").then {
229+
[ "target", "environment_temperature_range", _1&.text ]
230+
},
231+
232+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Environment/Habitat").then {
233+
[ "target", "environment_habitat", _1&.text ]
234+
},
235+
236+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Phenotype/BioticRelationship").then {
237+
[ "target", "phenotype_biotic_relationship", _1&.text ]
238+
},
239+
240+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Phenotype/TrophicLevel").then {
241+
[ "target", "phenotype_trophic_level", _1&.text ]
242+
},
243+
244+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/BiologicalProperties/Phenotype/Disease").then {
245+
[ "target", "phenotype_disease", _1&.text ]
246+
},
247+
248+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/Organization").then {
249+
[ "target", "cellularity", _1&.text ]
250+
},
251+
252+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/Reproduction").then {
253+
[ "target", "reproduction", _1&.text ]
254+
},
255+
256+
*doc.xpath("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/RepliconSet/Replicon").flat_map.with_index(1) { |replicon, i|
257+
type = replicon.at("Type")
258+
name = replicon.at("Name")
259+
size = replicon.at("Size")
260+
description = replicon.at("Description")
261+
262+
[
263+
[ "target", "replicons_order.#{i}", replicon[:order] ],
264+
[ "target", "replicons_location.#{i}", type&.[](:location) ],
265+
[ "target", "replicons_type_description.#{i}", type&.[](:typeOtherDescr) ],
266+
[ "target", "replicons_location_description.#{i}", type&.[](:locationOtherDescr) ],
267+
[ "target", "replicons_type.#{i}", type&.text ],
268+
[ "target", "replicons_name.#{i}", name&.text ],
269+
[ "target", "replicons_size_unit.#{i}", size&.[](:units) ],
270+
[ "target", "replicons_size.#{i}", size&.text ],
271+
[ "target", "replicons_description.#{i}", description&.text ]
272+
]
273+
},
274+
275+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/RepliconSet/Ploidy").then {
276+
[ "target", "ploidy", _1&.[](:type) ]
277+
},
278+
279+
*doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Organism/GenomeSize").then {
280+
[
281+
[ "target", "haploid_genome_size_unit", _1&.[](:units) ],
282+
[ "target", "haploid_genome_size", _1&.text ]
283+
]
284+
},
285+
286+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Provider").then {
287+
[ "general_info", "biomaterial_provider", _1&.text ]
288+
},
289+
290+
doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Target/Description").then {
291+
[ "target", "label_description", _1&.text ]
292+
},
293+
294+
*doc.at("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Method").then {
295+
method_type = _1&.[](:method_type)
296+
297+
[
298+
[ "project_type", "methodology", method_type ],
299+
[ "project_type", "methodology_description", method_type == "eOther" ? _1&.text : nil ]
300+
]
301+
},
302+
303+
*doc.xpath("/PackageSet/Package/Project/Project/ProjectType/ProjectTypeSubmission/Objectives").map.with_index(1) { |objectives, i|
304+
data = objectives.at("Data")
305+
306+
[ "project_type", "objective.#{i}", data&.[](:data_type) ]
307+
},
308+
309+
[ "submitter", "first_name", user.first_name ],
310+
[ "submitter", "last_name", user.last_name ],
311+
[ "submitter", "email", user.email ],
312+
[ "submitter", "organization_name", [ user.department, user.organization ].compact_blank.join(", ") ],
313+
[ "submitter", "organization_url", user.organization_url ],
314+
[ "submitter", "data_release", submission.visibility_public? ? "hup" : nil ]
315+
].compact.map.with_index(1) { |(form_name, data_name, data_value), i|
316+
{
317+
submission_id:,
318+
form_name:,
319+
data_name:,
320+
data_value:,
321+
t_order: i
322+
}
323+
}
324+
end
124325
end
125326
end
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<PackageSet>
4+
<Package>
5+
<Project>
6+
<Project>
7+
<ProjectID>
8+
<ArchiveID />
9+
</ProjectID>
10+
11+
<ProjectDescr>
12+
<Title>general_info.project_title</Title>
13+
<Description>general_info.public_description</Description>
14+
15+
<ExternalLink label="general_info.link_description.1">
16+
<URL>general_info.link_uri.1</URL>
17+
</ExternalLink>
18+
19+
<ExternalLink label="general_info.link_description.2">
20+
<URL>general_info.link_uri.2</URL>
21+
</ExternalLink>
22+
23+
<Grant GrantId="general_info.grant_id.1">
24+
<Title>general_info.grant_title.1</Title>
25+
<Agency abbr="general_info.agency_abbreviation.1">general_info.agency.1</Agency>
26+
</Grant>
27+
28+
<Publication id="publication.pubmed_id.1">
29+
<Reference>
30+
<DbType>ePubmed</DbType>
31+
</Reference>
32+
</Publication>
33+
34+
<Publication id="publication.doi.2">
35+
<Reference>
36+
<DbType>eDOI</DbType>
37+
</Reference>
38+
</Publication>
39+
40+
<Relevance>
41+
<!-- general_info.relevance == 'Other' -->
42+
<Other>general_info.relevance_description</Other>
43+
<!-- else -->
44+
<general_info.relevance>yes</general_info.relevance>
45+
</Relevance>
46+
47+
<LocusTagPrefix>project_type.locus_tag</LocusTagPrefix>
48+
</ProjectDescr>
49+
50+
<ProjectType>
51+
<ProjectTypeSubmission>
52+
<Target sample_scope="project_type.sample_code" material="project_type.material" capture="project_type.capture">
53+
<Organism taxID="target.taxonomy_id || 0">
54+
<OrganismName>target.organism_name</OrganismName>
55+
<Label>target.isolate_name_or_label?</Label>
56+
<Strain>target.strain_breed_cultivar</Strain>
57+
58+
<BiologicalProperties>
59+
<Morphology>
60+
<Gram>target.prokaryote_gram?</Gram>
61+
<Enveloped>target.prokaryote_enveloped?</Enveloped>
62+
<Shape>target.prokaryote_shape.1*</Shape>
63+
<Endospores>target.prokaryote_endospores?</Endospores>
64+
<Motility>target.prokaryote_motility?</Motility>
65+
</Morphology>
66+
67+
<Environment>
68+
<Salinity>target.environment_salinity?</Salinity>
69+
<OxygenReq>target.environment_oxygen_requirement?</OxygenReq>
70+
<OptimumTemperature>target.environment_optimum_temperature?</OptimumTemperature>
71+
<TemperatureRange>target.environment_temperature_range?</TemperatureRange>
72+
<Habitat>target.environment_habitat?</Habitat>
73+
</Environment>
74+
75+
<Phenotype>
76+
<BioticRelationship>target.phenotype_biotic_relationship?</BioticRelationship>
77+
<TrophicLevel>target.phenotype_trophic_level?</TrophicLevel>
78+
<Disease>target.phenotype_disease?</Disease>
79+
</Phenotype>
80+
</BiologicalProperties>
81+
82+
<Organization>target.cellularity?</Organization>
83+
<Reproduction>target.reproduction?</Reproduction>
84+
85+
<RepliconSet>
86+
<Replicon order="target.replicons_order.1?">
87+
<Type location="target.replicons_location.1?" isSingle="target.replicons_type.1 == 'eChromesome' &amp;&amp; target.replicons_location.1 == 'eMitochondrion'" typeOtherDescr="target.replicons_type_description.1?" locationOtherDescr="target.replicons_location_description.1?">target.replicons_type.1</Type>
88+
89+
<Name>target.replicons_name.1</Name>
90+
<Size units="target.replicons_size_unit.1">target.replicons_size.1?</Size>
91+
<Description>target.replicons_description.1?</Description>
92+
</Replicon>
93+
94+
<Ploidy type="target.ploidy?" />
95+
<Count repliconType="target.replicons_name.1*">(count of target.replicons_name.1)</Count>
96+
</RepliconSet>
97+
98+
<GenomeSize units="target.haploid_genome_size_unit">target.haploid_genome_size?</GenomeSize>
99+
</Organism>
100+
101+
<Provider>general_info.biomaterial_provider?</Provider>
102+
<Description>target.label_description?</Description>
103+
</Target>
104+
105+
<Method method_type="project_type.methodology">
106+
<!-- if project_type.methodology == 'eOther' -->
107+
project_type.methodology_description?
108+
</Method>
109+
110+
<Objectives>
111+
<Data data_type="project_type.objective.1*" />
112+
</Objectives>
113+
114+
<ProjectDataTypeSet>
115+
<DataType>
116+
<!-- if project_type.project_data_type.1 == 'other' -->
117+
project_type.project_data_type_description
118+
<!-- else if BpNameUtil.getProjectDataTypeSummary(project_type.project_data_type.1) -->
119+
BpNameUtil.getProjectDataTypeSummary(project_type.project_data_type.1)
120+
<!-- else -->
121+
project_type.project_data_type.1
122+
</DataType>
123+
</ProjectDataTypeSet>
124+
</ProjectTypeSubmission>
125+
</ProjectType>
126+
</Project>
127+
</Project>
128+
129+
<Submission>
130+
<Submission sumitted="Date.current.iso8601">
131+
<Description>
132+
<Organization type="center" role="owner" url="submitter.organization_url?">
133+
<Name>submitter.organization_name</Name>
134+
135+
<Contact email="submitter.email.1?">
136+
<Name>
137+
<First>submitter.first_name?</First>
138+
<Last>submitter.last_name</Last>
139+
</Name>
140+
</Contact>
141+
</Organization>
142+
143+
<!-- if submitter.data_release == 'hup' -->
144+
<Hold release_date="2030-01-01" />
145+
<!-- end -->
146+
</Description>
147+
</Submission>
148+
</Submission>
149+
</Package>
150+
</PackageSet>

0 commit comments

Comments
 (0)