Skip to content

Commit 0dcf80c

Browse files
authored
Merge pull request #8 from andersinno/mpz-11-enqueue-objects-by-ids
deferred-enqueue-objects: Add support for object-ids parameter
2 parents e9190e5 + fb209cd commit 0dcf80c

File tree

4 files changed

+61
-10
lines changed

4 files changed

+61
-10
lines changed

src/passari_workflow/jobs/enqueue_objects.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
enqueue_objects as do_enqueue_objects
33

44

5-
def enqueue_objects(object_count):
5+
def enqueue_objects(object_count=None, object_ids=None):
66
"""
77
Enqueue objects using a background RQ job. This is used in when we don't
88
want the user action to block.
99
"""
10-
do_enqueue_objects(object_count)
10+
do_enqueue_objects(object_count, object_ids)

src/passari_workflow/scripts/deferred_enqueue_objects.py

+32-7
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,51 @@
1010
from passari_workflow.jobs.enqueue_objects import enqueue_objects
1111

1212

13-
def deferred_enqueue_objects(object_count):
13+
def deferred_enqueue_objects(object_count=None, object_ids=None):
1414
"""
1515
Enqueue given number of objects to the preservation workflow using a
1616
background RQ job
1717
1818
:param int object_count: How many objects to enqueue at most
19+
:param list object_ids: Specific object IDs to enqueue
1920
"""
2021
queue = get_queue(QueueType.ENQUEUE_OBJECTS)
21-
queue.enqueue(enqueue_objects, kwargs={"object_count": object_count})
2222

23-
print(f"{object_count} object(s) will be enqueued")
23+
if object_ids:
24+
queue.enqueue(enqueue_objects, kwargs={"object_ids": object_ids})
25+
print(f"{len(object_ids)} object(s) with IDs {object_ids} will be enqueued")
26+
else:
27+
queue.enqueue(enqueue_objects, kwargs={"object_count": object_count})
28+
print(f"{object_count} object(s) will be enqueued")
2429

25-
return object_count
30+
return object_count or len(object_ids)
2631

2732

2833
@click.command()
2934
@click.option(
30-
"--object-count", default=10, help="How many objects to enqueue")
31-
def cli(object_count):
32-
deferred_enqueue_objects(object_count)
35+
"--object-count", type=int, default=None,
36+
help="How many objects to enqueue"
37+
)
38+
@click.option(
39+
"--object-ids", type=str, default=None,
40+
help="Comma-separated list of specific object IDs to enqueue, e.g., '1,2,3,4'"
41+
)
42+
def cli(object_count, object_ids):
43+
if object_count and object_ids:
44+
raise click.UsageError(
45+
"You cannot use both --object-count and --object-ids at the same time."
46+
)
47+
48+
if not object_count and not object_ids:
49+
raise click.UsageError(
50+
"You must provide either --object-count or --object-ids."
51+
)
52+
53+
object_ids_list = object_ids.split(",") if object_ids else None
54+
deferred_enqueue_objects(
55+
object_count=object_count,
56+
object_ids=object_ids_list
57+
)
3358

3459

3560
if __name__ == "__name__":

src/passari_workflow/scripts/enqueue_objects.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def enqueue_object(object_id):
3030
)
3131

3232

33-
def enqueue_objects(object_count, random=False, object_ids=None):
33+
def enqueue_objects(object_count, object_ids=None, random=False):
3434
"""
3535
Enqueue given number of objects to the preservation workflow.
3636

tests/scripts/test_deferred_enqueue_objects.py

+26
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,29 @@ def test_deferred_enqueue_objects(
3737
# 5 objects should now be enqueued
3838
queue = get_queue(QueueType.DOWNLOAD_OBJECT)
3939
assert len(queue.job_ids) == 5
40+
41+
42+
def test_deferred_enqueue_objects_by_ids(
43+
redis, session, deferred_enqueue_objects, museum_object_factory):
44+
"""
45+
Enqueue 3 objects by providing their ids
46+
"""
47+
for i in range(0, 20):
48+
museum_object_factory(
49+
id=i, preserved=False,
50+
metadata_hash="", attachment_metadata_hash=""
51+
)
52+
53+
result = deferred_enqueue_objects(["--object-ids", "1,2,3"])
54+
assert "3 object(s) with IDs ['1', '2', '3'] will be enqueued" in result.stdout
55+
56+
queue = get_queue(QueueType.ENQUEUE_OBJECTS)
57+
# One job is enqueued
58+
assert len(queue.job_ids) == 1
59+
60+
# Finish the job
61+
SimpleWorker([queue], connection=queue.connection).work(burst=True)
62+
63+
# 3 objects should now be enqueued
64+
queue = get_queue(QueueType.DOWNLOAD_OBJECT)
65+
assert len(queue.job_ids) == 3

0 commit comments

Comments
 (0)