bulk_ops 0.1.13 → 0.1.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/bulk_ops/relationship.rb +10 -13
- data/lib/bulk_ops/version.rb +1 -1
- data/lib/bulk_ops/work_proxy.rb +39 -40
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27b9b67583cbf4ca808867661196e5bb8a6b95490b3a377dd85d11a91d0a41fb
|
4
|
+
data.tar.gz: 508dbf4a72146f7a893851aec847bb9bb82a399765135dfde6daa6eec0a4d121
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da715c7235ae2044b2354653b382825078a63f466e542642d995c81b6dd3bb8d8336c13ac84dd811ecefbff4e9e2422c45f1dc39e10b0ea1a4119a6736397ee2
|
7
|
+
data.tar.gz: 9bd37e6481170e1da5ba4494888fb16a1cfa65cc9869edcee87353228a1eb78eefe5f32c87bb7c14f4fc2b6e3ead0ad068901273d8c100e3afbce0d5268e4486
|
@@ -10,11 +10,11 @@ class BulkOps::Relationship < ActiveRecord::Base
|
|
10
10
|
|
11
11
|
# Attempt to resolve the relationship immediately
|
12
12
|
# which might work in the case of updates
|
13
|
-
resolve!
|
13
|
+
# resolve!
|
14
14
|
end
|
15
15
|
|
16
16
|
def findObject
|
17
|
-
case identifier_type.downcase
|
17
|
+
case (identifier_type || "").downcase
|
18
18
|
when "id"
|
19
19
|
begin
|
20
20
|
object = ActiveFedora::Base.find(object_identifier)
|
@@ -29,7 +29,7 @@ class BulkOps::Relationship < ActiveRecord::Base
|
|
29
29
|
params: { fq: query, rows: 100})["response"]["docs"]
|
30
30
|
if objects.present?
|
31
31
|
return ActiveFedora::Base.find(objects.first["id"])
|
32
|
-
elsif relationship_type.downcase == "collection"
|
32
|
+
elsif (relationship_type || "").downcase == "collection"
|
33
33
|
return Collection.create(title: [object_identifier])
|
34
34
|
else
|
35
35
|
return false
|
@@ -59,22 +59,22 @@ class BulkOps::Relationship < ActiveRecord::Base
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def insert_among_children(object,new_member)
|
62
|
-
return nil unless ["parent"].include?(relationship_type.downcase)
|
62
|
+
return nil unless ["parent"].include?((relationship_type || "").downcase)
|
63
63
|
prev_sib_id = previous_sibling
|
64
64
|
# This is the id of the WorkProxy associate with the most recent sibling work
|
65
65
|
# that might be fully ingested. If is it not fully ingested, we will move on
|
66
66
|
# to the preceding sibling.
|
67
67
|
while prev_sib_id.present?
|
68
|
-
prev_sib_proxy = BulkOps::WorkProxy.find(
|
68
|
+
prev_sib_proxy = BulkOps::WorkProxy.find(prev_sib_id)
|
69
69
|
# Check if the previous sibling is fully ingested
|
70
70
|
# and get its index among its siblings (if it has been successfully attached to the parent)
|
71
71
|
prev_sib_index = object.ordered_member_ids.index(prev_sib_proxy.work_id) if prev_sib_proxy.work_id.present?
|
72
72
|
# Insert the new member among its siblings if we found the right place
|
73
73
|
return object.ordered_members.to_a.insert(prev_sib_index+1, new_member) if prev_sib_index.present?
|
74
74
|
# Otherwise, pull up the sibling's relationship field to check if it sibling has a sibling before it
|
75
|
-
sib_relationship = prev_sib_proxy.relationships.
|
75
|
+
sib_relationship = prev_sib_proxy.relationships.find{|rel| rel.findObject.id == object.id }
|
76
76
|
# If we can't find an ingested sibling among the ordered members,
|
77
|
-
# make this work the first member.
|
77
|
+
# break this loop and make this work the first member.
|
78
78
|
break unless sib_relationship.present?
|
79
79
|
prev_sib_id = sib_relationship.previous_sibling
|
80
80
|
end
|
@@ -83,9 +83,11 @@ class BulkOps::Relationship < ActiveRecord::Base
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def implement_relationship!(type,subject,object)
|
86
|
-
case type.downcase
|
86
|
+
case (type || "").downcase
|
87
87
|
when "parent"
|
88
88
|
unless object.member_ids.include? subject.id
|
89
|
+
object.reload
|
90
|
+
object.save
|
89
91
|
object.ordered_members = insert_among_children(object, subject)
|
90
92
|
object.save
|
91
93
|
end
|
@@ -95,11 +97,6 @@ class BulkOps::Relationship < ActiveRecord::Base
|
|
95
97
|
subject.ordered_members << object
|
96
98
|
subject.save
|
97
99
|
end
|
98
|
-
when "collection"
|
99
|
-
unless object.member_object_ids.include? subject.id
|
100
|
-
object.add_members([subject.id])
|
101
|
-
object.save
|
102
|
-
end
|
103
100
|
when "order"
|
104
101
|
#TODO - implement this - related to ordering of filesets
|
105
102
|
|
data/lib/bulk_ops/version.rb
CHANGED
data/lib/bulk_ops/work_proxy.rb
CHANGED
@@ -46,7 +46,7 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
46
46
|
metadata.merge! interpret_file_fields(raw_data)
|
47
47
|
metadata.merge! interpret_controlled_fields(raw_data)
|
48
48
|
metadata.merge! interpret_scalar_fields(raw_data)
|
49
|
-
metadata.merge! interpret_relationship_fields(raw_data
|
49
|
+
metadata.merge! interpret_relationship_fields(raw_data)
|
50
50
|
metadata.merge! interpret_option_fields(raw_data)
|
51
51
|
metadata = setAdminSet(metadata)
|
52
52
|
metadata = setMetadataInheritance(metadata)
|
@@ -293,9 +293,9 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
293
293
|
return {}
|
294
294
|
end
|
295
295
|
|
296
|
-
def interpret_relationship_fields
|
296
|
+
def interpret_relationship_fields(raw_data)
|
297
297
|
metadata = {}
|
298
|
-
raw_data do |field,value|
|
298
|
+
raw_data.each do |field,value|
|
299
299
|
next if value.blank? or field.blank?
|
300
300
|
field = field.to_s
|
301
301
|
value = unescape_csv(value)
|
@@ -305,47 +305,49 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
305
305
|
|
306
306
|
if (split = field.split(":")).count == 2
|
307
307
|
identifier_type = split.last
|
308
|
-
|
308
|
+
relationship_type = split.first.to_s
|
309
|
+
else
|
310
|
+
relationship_type = field
|
309
311
|
end
|
310
312
|
|
311
|
-
relationship_type = normalize_relationship_field_name(
|
313
|
+
relationship_type = normalize_relationship_field_name(relationship_type)
|
312
314
|
case relationship_type
|
313
315
|
when "order"
|
314
|
-
# If the field specifies the object's order among siblings
|
316
|
+
# If the field specifies the object's order among siblings
|
315
317
|
update(order: value.to_f)
|
318
|
+
next
|
316
319
|
when "collection"
|
317
320
|
# If the field specifies the name or ID of a collection,
|
318
321
|
# find or create the collection and update the metadata to match
|
319
322
|
col = find_or_create_collection(value)
|
320
323
|
( metadata[:member_of_collection_ids] ||= [] ) << col.id if col
|
324
|
+
next
|
321
325
|
when "parent", "child"
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
if value == interpret_relationship_value(ref_type, previous_value)
|
343
|
-
relationship_parameters[:previous_sibling] = operation.work_proxies.find_by(row_number: row_number-1).id
|
326
|
+
|
327
|
+
# correctly interpret the notation "id:a78C2d81"
|
328
|
+
identifier_type, object_identifier = interpret_relationship_value(identifier_type, value)
|
329
|
+
|
330
|
+
relationship_parameters = { work_proxy_id: id,
|
331
|
+
identifier_type: identifier_type,
|
332
|
+
relationship_type: relationship_type,
|
333
|
+
object_identifier: object_identifier,
|
334
|
+
status: "new"}
|
335
|
+
|
336
|
+
#add previous sibling link if necessary
|
337
|
+
previous_value = operation.final_spreadsheet[row_number-1][field]
|
338
|
+
# Check if this is a parent relationship, and the previous row also has one
|
339
|
+
if previous_value.present? && (relationship_type == "parent")
|
340
|
+
# Check if the previous row has the same parent as this row
|
341
|
+
if object_identifier == interpret_relationship_value(identifier_type, previous_value, field).last
|
342
|
+
# If so, set the previous sibling parameter on the relationshp
|
343
|
+
# to the id for the proxy associated with the previous row
|
344
|
+
relationship_parameters[:previous_sibling] = operation.work_proxies.find_by(row_number: row_number-1).id
|
345
|
+
end
|
344
346
|
end
|
347
|
+
BulkOps::Relationship.create(relationship_parameters)
|
345
348
|
end
|
346
|
-
|
349
|
+
return metadata
|
347
350
|
end
|
348
|
-
return metadata
|
349
351
|
end
|
350
352
|
|
351
353
|
def normalize_relationship_field_name field
|
@@ -353,19 +355,15 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
353
355
|
RELATIONSHIP_FIELDS.find{|field| normfield.include?(field) }
|
354
356
|
end
|
355
357
|
|
356
|
-
def find_previous_parent field
|
358
|
+
def find_previous_parent field="parent"
|
359
|
+
#Return the row number of the most recent preceding row that does
|
360
|
+
# not itself have a parent defined
|
357
361
|
i = 0;
|
358
|
-
while (prev_row = operation.
|
362
|
+
while (prev_row = operation.final_spreadsheet[row_number - i])
|
359
363
|
return (row_number - i) if prev_row[field].blank?
|
360
364
|
end
|
361
365
|
end
|
362
366
|
|
363
|
-
def find_previous_sibling (field,ref_type,object)
|
364
|
-
previous_value = interpret_relationship_value(ref_type,op.metadata[row_number-1][field])
|
365
|
-
return nil unless previous_value == object
|
366
|
-
return
|
367
|
-
end
|
368
|
-
|
369
367
|
def interpret_relationship_value id_type, value, field="parent"
|
370
368
|
#Handle "id:20kj4259" syntax if it hasn't already been handled
|
371
369
|
if (split = value.to_s.split(":")).count == 2
|
@@ -376,12 +374,13 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
376
374
|
if id_type == "row"
|
377
375
|
if value.to_i < 0
|
378
376
|
# if given a negative integer, count backwards from the current row
|
379
|
-
return row_number - value
|
377
|
+
return [id_type,row_number - value]
|
380
378
|
elsif value.to_s.downcase.include?("prev")
|
381
379
|
# if given any variation of the word "previous", get the first preceding row with no parent of its own
|
382
|
-
return find_previous_parent(field)
|
380
|
+
return [id_type,find_previous_parent(field)]
|
383
381
|
end
|
384
382
|
end
|
383
|
+
return [id_type,value]
|
385
384
|
end
|
386
385
|
|
387
386
|
def unescape_csv(value)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bulk_ops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ned Henry, UCSC Library Digital Initiatives
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|