Skip to content

Commit f097f8d

Browse files
authored
Merge pull request #69 from shawat94/CooperativeChallenge
Cooperative Work Model
2 parents 3a6ab0c + 218d60a commit f097f8d

20 files changed

Lines changed: 552 additions & 121 deletions

docs/index.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ Welcome to MapRoulette's documentation!
1717
usage/models/project
1818
usage/models/challenge
1919
usage/models/task
20+
usage/models/cooperative_work
21+
usage/models/parent_operation
22+
usage/models/child_operation
2023
usage/models/priority_rule
2124
usage/exceptions
2225

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Child Operation Model
2+
=====================================================
3+
4+
.. automodule:: maproulette.models.child_operation
5+
:members:
6+
:undoc-members:
7+
:inherited-members:
8+
:show-inheritance:
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Cooperative Work Model
2+
=====================================================
3+
4+
.. automodule:: maproulette.models.cooperative_work
5+
:members:
6+
:undoc-members:
7+
:inherited-members:
8+
:show-inheritance:

docs/usage/models/enums.rst

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
Enums
2+
=====================================================
3+
4+
.. autoclass:: maproulette.models.enums.Conditions
5+
:members:
6+
7+
.. autoclass:: maproulette.models.enums.Types
8+
:members:
9+
:undoc-members:
10+
11+
.. autoclass:: maproulette.models.enums.StringOperators
12+
:members:
13+
:undoc-members:
14+
15+
.. autoclass:: maproulette.models.enums.NumericOperators
16+
:members:
17+
:undoc-members:
18+
19+
.. autoclass:: maproulette.models.enums.OSMObjects
20+
:members:
21+
:undoc-members:
22+
23+
.. autoclass:: maproulette.models.enums.OperationTypes
24+
:members:
25+
:undoc-members:
26+
27+
.. autoclass:: maproulette.models.enums.Operations
28+
:members:
29+
:undoc-members:
30+
31+
.. autoclass:: maproulette.models.enums.CooperativeWorkTypes
32+
:members:
33+
:undoc-members:
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Parent Operation Model
2+
=====================================================
3+
4+
.. automodule:: maproulette.models.parent_operation
5+
:members:
6+
:undoc-members:
7+
:inherited-members:
8+
:show-inheritance:

docs/usage/models/priority_rule.rst

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,3 @@ Priority Rule Model
66

77
.. autoclass:: maproulette.models.priority_rule.PriorityRuleModel
88
:members:
9-
10-
.. autoclass:: maproulette.models.priority_rule.Conditions
11-
:members:
12-
13-
.. autoclass:: maproulette.models.priority_rule.Types
14-
:members:
15-
:undoc-members:
16-
17-
.. autoclass:: maproulette.models.priority_rule.Conditions
18-
:members:
19-
:undoc-members:
20-
21-
.. autoclass:: maproulette.models.priority_rule.StringOperators
22-
:members:
23-
:undoc-members:
24-
25-
.. autoclass:: maproulette.models.priority_rule.NumericOperators
26-
:members:
27-
:undoc-members:
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import maproulette
2+
import json
3+
import base64
4+
5+
# Create a configuration object for MapRoulette using your API key:
6+
config = maproulette.Configuration(api_key="API_KEY")
7+
8+
# Create an API objects with the above config object:
9+
api = maproulette.Task(config)
10+
11+
# Setting a challenge ID in which we'll place our cooperative task
12+
challenge_id = 14452
13+
14+
# We'll start by creating some 'child' operations to apply to the target objects add them to a list:
15+
child_operations_list = [maproulette.ChildOperationModel(operation="setTags",
16+
data={"test_tag_1": "True",
17+
"test_tag_2": "True",
18+
"test_tag_3": "True"}).to_dict(),
19+
maproulette.ChildOperationModel(operation="setTags",
20+
data={"test_tag_4": "True"}).to_dict(),
21+
maproulette.ChildOperationModel(operation="setTags",
22+
data={"test_tag_5": "True"}).to_dict()]
23+
24+
# Now we'll pass these operations into a 'parent' operation list to specify the objects to which the changes
25+
# will be applied:
26+
test_parent_relation = [maproulette.ParentOperationModel(operation_type="modifyElement",
27+
element_type="way",
28+
osm_id="175208404",
29+
child_operations=child_operations_list).to_dict()]
30+
31+
# The below flags error when handling is in the constructor, but not when in the setter:
32+
test_2 = maproulette.ParentOperationModel(operation_type="modifyElement",
33+
element_type="way",
34+
osm_id="175208404",
35+
child_operations=child_operations_list)
36+
37+
38+
# Now that we have a Parent Operation containing the Child Operations we'd like to implement, we
39+
# can pass this into our Cooperative Work model:
40+
41+
test_cooperative_work = maproulette.CooperativeWorkModel(version=2,
42+
type=1,
43+
parent_operations=test_parent_relation).to_dict()
44+
45+
# Now we can create a basic task to apply these suggested changes to:
46+
with open('data/Example_Geometry.geojson', 'r') as data_file:
47+
data = json.loads(data_file.read())
48+
49+
test_task = maproulette.TaskModel(name="Test_Coop_Task_Kastellet",
50+
parent=challenge_id,
51+
geometries=data,
52+
cooperative_work=test_cooperative_work).to_dict()
53+
54+
55+
# Finally, we'll pass our task object to into the create_task method to call the /task
56+
# endpoint, creating this new task with our cooperative work model applied
57+
print(json.dumps(api.create_task(test_task), indent=4, sort_keys=True))
58+
59+
60+
# Alternatively, cooperative work can be populated as in-progress edits via an OSM changefile (osc file)
61+
# as 'type 2' cooperative work:
62+
with open('data/ExampleChangefile.osc', 'rb') as data_file:
63+
osc_file = base64.b64encode(data_file.read()).decode('ascii')
64+
65+
test_osc_cooperative_work = maproulette.CooperativeWorkModel(type=2,
66+
content=osc_file).to_dict()
67+
68+
test_osc_task = maproulette.TaskModel(name="Test_Coop_Task_Kastellet_OSC_2",
69+
parent=challenge_id,
70+
geometries=data,
71+
cooperative_work=test_osc_cooperative_work).to_dict()
72+
73+
print(json.dumps(api.create_task(test_osc_task), indent=4, sort_keys=True))
74+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<osmChange version="0.6" generator="acme osm editor">
2+
<create>
3+
<node id="-1" changeset="-1" version="1" lat="55.69378277487475" lon="12.593096457148427" />
4+
<node id="-2" changeset="-1" version="1" lat="55.689697320811575" lon="12.597881450158676" />
5+
<way id="-3" changeset="-1" version="1">
6+
<nd ref="-1"/>
7+
<nd ref="-2"/>
8+
</way>
9+
</create>
10+
</osmChange>

maproulette/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
from .models.challenge import ChallengeModel
99
from .models.task import TaskModel
1010
from .models.priority_rule import PriorityRule, PriorityRuleModel
11+
from .models.child_operation import ChildOperationModel
12+
from .models.parent_operation import ParentOperationModel
13+
from .models.cooperative_work import CooperativeWorkModel
1114
from .models import priority_rule
1215
from .api.project import Project
1316
from .api.challenge import Challenge

maproulette/api/task.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ def get_task_history(self, task_id):
3030
endpoint=f"/task/{task_id}/history")
3131
return response
3232

33+
def create_task(self, data):
34+
"""Method to create a single task using an input JSON of task details.
35+
36+
:param data: a JSON input containing task details
37+
:returns: the API response from the POST request
38+
"""
39+
response = self.post(
40+
endpoint="/task",
41+
body=data)
42+
return response
43+
3344
def create_tasks(self, data, batch_size=5000):
3445
"""Method to create a batch of tasks using the specified batch_size.
3546

0 commit comments

Comments
 (0)