Skip to content

Commit e6d5e54

Browse files
author
matthias_schaub
committed
Merge branch 'dev' into continuous_deployment
2 parents 5e643d9 + 1e503be commit e6d5e54

File tree

7 files changed

+219
-79
lines changed

7 files changed

+219
-79
lines changed

docs/source/dev_setup.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ There exists a Firebase instance only for Travis.
141141
For the configuration of Travis following environment variables are used:
142142

143143
- FIREBASE_API_KEY
144-
- FIREBASE_DB: test-mapswipe
144+
- FIREBASE_DB
145145
- FIREBASE_TOKEN
146146
- POSTGRES_DB
147147
- POSTGRES_HOST
@@ -153,7 +153,12 @@ For the configuration of Travis following environment variables are used:
153153

154154
Those variables can be definied directly in the repository settings of Travis. For more inofmration refer to: https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-settings
155155

156-
Additionaly a Service Account Key in JSON format is encrypted and added to the GitHub repository using the travis CLI. Read more on that process in the Travis docs: https://docs.travis-ci.com/user/encrypting-files/
156+
Additionaly a Service Account Key in JSON format is encrypted and added to the GitHub repository using the travis CLI. Once Travis runs it will decrypt the Service Account Key. Read more on that process in the Travis docs: https://docs.travis-ci.com/user/encrypting-files/
157+
158+
Once a Travis build succeeds Travis executes an Ansible Playbook to deploy MapSwipe Workers to an already installed and configured server.
159+
For this to work an SSH-Key (with access rights to the server) is also encrypted and added to the GitHub repository. Travis will decrypt the key and Ansible will use it to execute commands defined in the Playbook on the server.
160+
161+
All files encrypted for Travis (Service Account Key, SSH-Key) are stored in the `travis` directory.
157162

158163

159164
## Database Backup

docs/source/tags

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
2+
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
3+
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/
4+
!_TAG_PROGRAM_NAME Exuberant Ctags //
5+
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
6+
!_TAG_PROGRAM_VERSION 5.8 //

firebase/functions/index.js

Lines changed: 58 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -34,62 +34,19 @@ exports.counter = functions.database.ref('/v2/results/{projectId}/{groupId}/{use
3434
const groupRequiredCountRef = admin.database().ref('/v2/groups/'+context.params.projectId+'/'+context.params.groupId+'/requiredCount')
3535
const numberOfTasksRef = admin.database().ref('/v2/groups/'+context.params.projectId+'/'+context.params.groupId+'/numberOfTasks')
3636

37-
const contributorsCountRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/contributorCount')
38-
39-
const taskContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/taskContributionCount')
40-
const groupContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/groupContributionCount')
41-
const projectContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/projectContributionCount')
42-
const contributionsRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId)
43-
const groupContributionsRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId +'/'+context.params.groupId)
44-
const totalTimeSpentMappingRef = admin.database().ref('/v2/users/'+context.params.userId+'/timeSpentMapping')
37+
const taskContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/taskContributionCount')
38+
const groupContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/groupContributionCount')
39+
const projectContributionsRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId)
40+
const groupContributionsRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId +'/'+context.params.groupId)
41+
const projectTaskContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId+'/taskContributionCount')
42+
const projectGroupContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId+'/groupContributionCount')
43+
const totalTimeSpentMappingRef = admin.database().ref('/v2/users/'+context.params.userId+'/timeSpentMapping')
4544

4645
const startTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/startTime')
4746
const endTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/endTime')
4847
const timeSpentMappingRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/timeSpentMappingRef')
4948

50-
// references for project based counters for tasks and groups
51-
const projectTaskContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId+'/taskContributionCount')
52-
const projectGroupContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId+'/groupContributionCount')
53-
54-
// Counter for groups
55-
const groupFinishedCount = groupFinishedCountRef.transaction((currentCount) => {
56-
return currentCount + 1
57-
})
58-
promises.push(groupFinishedCount)
59-
60-
const groupRequiredCount = groupRequiredCountRef.transaction((currentCount) => {
61-
return currentCount - 1
62-
})
63-
promises.push(groupRequiredCount)
64-
65-
// Counter for projects
66-
const contributorsCount = contributionsRef.once('value')
67-
.then((dataSnapshot) => {
68-
if (dataSnapshot.exists()) {
69-
return null
70-
}
71-
else {
72-
return contributorsCountRef.transaction((currentCount) => {
73-
return currentCount + 1
74-
})
75-
}
76-
})
77-
promises.push(contributorsCount)
78-
7949
// Counter for users
80-
const projectContributionCount = contributionsRef.once('value')
81-
.then((dataSnapshot) => {
82-
if (dataSnapshot.exists()) {
83-
return null
84-
}
85-
else {
86-
return projectContributionCountRef.transaction((currentCount) => {
87-
return currentCount + 1
88-
})
89-
}
90-
})
91-
promises.push(projectContributionCount)
92-
9350
const groupContributionCount = groupContributionCountRef.transaction((currentCount) => {
9451
return currentCount + 1
9552
});
@@ -107,22 +64,12 @@ exports.counter = functions.database.ref('/v2/results/{projectId}/{groupId}/{use
10764
})
10865
promises.push(taskContributionCount)
10966

110-
const contributions = groupContributionsRef.once('value')
111-
.then((dataSnapshot) => {
112-
if (dataSnapshot.exists()) {
113-
return null
114-
}
115-
else {
116-
const data = {
117-
'startTime': result['startTime'],
118-
'endTime': result['endTime']
119-
}
120-
return groupContributionsRef.set(data)
121-
}
122-
})
123-
promises.push(contributions)
67+
// Counters for tasks and groups per user and per project
68+
const projectGroupContributionCount = projectGroupContributionCountRef.transaction((currentCount) => {
69+
return currentCount + 1
70+
});
71+
promises.push(projectGroupContributionCount)
12472

125-
// counters for tasks and groups per user and per project
12673
const projectTaskContributionCount = numberOfTasksRef.once('value')
12774
.then((dataSnapshot) => {
12875
const numberOfTasks = dataSnapshot.val()
@@ -135,11 +82,31 @@ exports.counter = functions.database.ref('/v2/results/{projectId}/{groupId}/{use
13582
})
13683
promises.push(projectTaskContributionCount)
13784

85+
const contributions = groupContributionsRef.once('value')
86+
.then((dataSnapshot) => {
87+
if (dataSnapshot.exists()) {
88+
return null
89+
}
90+
else {
91+
const data = {
92+
'startTime': result['startTime'],
93+
'endTime': result['endTime']
94+
}
95+
return groupContributionsRef.set(data)
96+
}
97+
})
98+
promises.push(contributions)
99+
138100
// Counter for groups
139-
const projectGroupContributionCount = projectGroupContributionCountRef.transaction((currentCount) => {
101+
const groupFinishedCount = groupFinishedCountRef.transaction((currentCount) => {
140102
return currentCount + 1
141-
});
142-
promises.push(projectGroupContributionCount)
103+
})
104+
promises.push(groupFinishedCount)
105+
106+
const groupRequiredCount = groupRequiredCountRef.transaction((currentCount) => {
107+
return currentCount - 1
108+
})
109+
promises.push(groupRequiredCount)
143110

144111
// // TODO: Does not work
145112
// const timeSpentMapping = timeSpentMappingRef.set((timeSpentMapping) => {
@@ -163,6 +130,28 @@ exports.counter = functions.database.ref('/v2/results/{projectId}/{groupId}/{use
163130
})
164131

165132

133+
exports.counter_2 = functions.database.ref('/v2/users/{userId}/contributions/{projectId}/').onCreate((snapshot, context) => {
134+
const promises_2 = []
135+
136+
// Firebase Realtime Database references
137+
const contributorCountRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/contributorCount')
138+
const projectContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/projectContributionCount')
139+
140+
const projectContributionCount = projectContributionCountRef.transaction((currentCount) => {
141+
return currentCount + 1
142+
})
143+
promises_2.push(projectContributionCount)
144+
145+
const contributorCount = contributorCountRef.transaction((currentCount) => {
146+
return currentCount + 1
147+
})
148+
promises_2.push(contributorCount)
149+
150+
return Promise.all(promises_2)
151+
})
152+
153+
154+
166155
// Increment project.resultCount by group.numberOfTasks.
167156
// Or (Depending of increase or decrease of group.RequiredCount)
168157
// Increment project.resultCount by group.numberOfTasks
@@ -291,4 +280,4 @@ exports.decProjectProgress = functions.database.ref('/v2/projects/{projectId}/re
291280
})
292281
})
293282
return projectProgress
294-
})
283+
})

mapswipe_workers/mapswipe_workers/project_types/base/project.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,27 @@ def __init__(self, project_draft):
5050
True if successful. False otherwise.
5151
"""
5252

53+
self.contributorCount = 0
5354
self.created = dt.datetime.now()
5455
self.createdBy = project_draft["createdBy"]
55-
self.groups = list()
5656
self.groupMaxSize = project_draft.get("groupMaxSize", 0)
57-
self.resultCount = 0
57+
self.groups = list()
5858
self.image = project_draft["image"]
5959
self.isFeatured = False
6060
self.lookFor = project_draft["lookFor"]
6161
self.name = project_draft["name"]
62-
self.requiredResults = 0
6362
self.progress = 0
6463
self.projectDetails = project_draft["projectDetails"]
6564
self.projectId = project_draft["projectDraftId"]
66-
self.projectType = int(project_draft["projectType"])
67-
self.verificationNumber = project_draft["verificationNumber"]
68-
self.projectTopic = project_draft.get("projectTopic", None)
69-
self.projectRegion = project_draft.get("projectRegion", None)
7065
self.projectNumber = project_draft.get("projectNumber", None)
66+
self.projectRegion = project_draft.get("projectRegion", None)
67+
self.projectTopic = project_draft.get("projectTopic", None)
68+
self.projectType = int(project_draft["projectType"])
7169
self.requestingOrganisation = project_draft.get("requestingOrganisation", None)
70+
self.requiredResults = 0
71+
self.resultCount = 0
7272
self.teamId = project_draft.get("teamId", None)
73+
self.verificationNumber = project_draft["verificationNumber"]
7374
if not self.teamId:
7475
self.status = "inactive" # this is a public project
7576
else:

mapswipe_workers/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ psycopg2-binary==2.8.4
1010
python-dateutil==2.8.1
1111
schedule==0.6.0
1212
sentry-sdk==0.14.0
13+
six==1.15.0
1314
slackclient==2.5.0
1415
xdg==4.0.1

mapswipe_workers/sample_data/build_area/default_build_area_tutorial_screens.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"success": {
1414
"description": "Swipe to the next screen to look for more.",
1515
"icon": "check",
16-
"title": "You found your first area with buildings!"
16+
"title": "You found your first areas with buildings!"
1717
}
1818
},
1919
"2": {
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
{
2+
"1": {
3+
"hint" : {
4+
"description" : "Les voyez-vous? Faites glisser pour en savoir plus.",
5+
"icon" : "swipe-left",
6+
"title" : "Nous avons marqué en vert l'image qui contient des déchets."
7+
},
8+
"instructions" : {
9+
"description" : "Tapez une seule fois sur l'image contenant des déchets.",
10+
"icon" : "tap-1",
11+
"title" : "Il y'a des déchets sur ces images."
12+
},
13+
"success" : {
14+
"description" : "Faites glisser vers l'écran suivant pour continuer.",
15+
"icon" : "check",
16+
"title" : "Vous avez trouvé votre première zone de déchets!"
17+
}
18+
},
19+
"2": {
20+
"hint" : {
21+
"description" : "Tapez deux fois quand vous n'êtes pas sûr.e. Faites glisser pour continuer.",
22+
"icon" : "swipe-left",
23+
"title" : "Jaune signifie qu'il pourrait y avoir des déchets"
24+
},
25+
"instructions" : {
26+
"description" : "Tapez deux fois sur l'image pour la marquer en jaune et indiquer qu'il pourrait y avoir des déchets.",
27+
"icon" : "tap-2",
28+
"title" : "Nous ne sommes pas sûrs si c'est un tas de déchets"
29+
},
30+
"success" : {
31+
"description" : "Faites glisser vers l'écran suivant pour continuer.",
32+
"icon" : "check",
33+
"title" : "Parfait. Faites ceci quand vous avez un doute."
34+
}
35+
},
36+
"3": {
37+
"hint" : {
38+
"description" : "Voyez-vous pourquoi l'image est mauvaise? Faites glisser pour la suite.",
39+
"icon" : "swipe-left",
40+
"title" : "Nous avons marqué l'image incomplète en rouge"
41+
},
42+
"instructions" : {
43+
"description" : "Tapez trois fois sur l'image incomplète pour la marquer en rouge.",
44+
"icon" : "tap-3",
45+
"title" : "Il y'a une image inutilisable"
46+
},
47+
"success" : {
48+
"description" : "Faites glisser pour continuer.",
49+
"icon" : "check",
50+
"title" : "Bon travail!"
51+
}
52+
},
53+
"4": {
54+
"hint" : {
55+
"description" : "Il n'y a pas de déchets sur cet écran, vous pouvez simplement faire glisser pour continuer.",
56+
"icon" : "swipe-left",
57+
"title" : "Pas besoin de taper cette fois-ci"
58+
},
59+
"instructions" : {
60+
"description" : "Pas besoin de taper. Faites simplement glisser vers l'écran suivant.",
61+
"icon" : "swipe-left",
62+
"title" : "Pas de déchets? Pas besoin de taper!"
63+
},
64+
"success" : {
65+
"description" : "Faites glisser pour continuer",
66+
"icon" : "check",
67+
"title" : "Parfait!"
68+
}
69+
},
70+
"5": {
71+
"hint" : {
72+
"description" : "Voyez-vous les déchets que nous avons marqués en vert? Faites glisser pour la suite.",
73+
"icon" : "swipe-left",
74+
"title" : "Nous avons marqué les bonnes réponses"
75+
},
76+
"instructions" : {
77+
"description" : "Pour chaque carré, tapez une fois s'il y'a des déchets, deux fois si vous avez un doute, trois fois si l'image n'est pas claire.",
78+
"icon" : "tap",
79+
"title" : "À votre tour d'utiliser ce que vous venez d'apprendre"
80+
},
81+
"success" : {
82+
"description" : "Faites glisser pour voir un autre exemmple.",
83+
"icon" : "check",
84+
"title" : "Bon travail! Vous avez trouvé tous les déchets!"
85+
}
86+
},
87+
"6": {
88+
"hint" : {
89+
"description" : "Assurez-vous de marquer chaque case contenant des déchets en vert. Faites glisser pour la suite.",
90+
"icon" : "swipe-left",
91+
"title" : "Nous avons marqué les bonnes réponses"
92+
},
93+
"instructions" : {
94+
"description" : "Marquez chaque image contenant des déchets en vert.",
95+
"icon" : "tap",
96+
"title" : "Il y'a beaucoup de déchets ici!"
97+
},
98+
"success" : {
99+
"description" : "Faites glisser pour voir un autre exemmple.",
100+
"icon" : "check",
101+
"title" : "Bien joué! Vous avez tout trouvé!"
102+
}
103+
},
104+
"7": {
105+
"hint" : {
106+
"description" : "Voyez-vous les déchets que nous avons marqués en vert? En aviez-vous manqué? Faites glisser pour continuer.",
107+
"icon" : "swipe-left",
108+
"title" : "Nous avons marqué les bonnes réponses"
109+
},
110+
"instructions" : {
111+
"description" : "Même si les déchets ne sont que dans le coin de l'image, marquez la en vert.",
112+
"icon" : "tap",
113+
"title" : "Marquez bien toutes les images"
114+
},
115+
"success" : {
116+
"description" : "Faites glisser pour voir un autre exemmple.",
117+
"icon" : "check",
118+
"title" : "Bien joué! Vous avez tout trouvé!"
119+
}
120+
},
121+
"8": {
122+
"hint" : {
123+
"description" : "Faire glisser de haut en bas de cette façon peut vous faire économiser beaucoup de temps. Faites glisser pour la suite.",
124+
"icon" : "swipe-left",
125+
"title" : "Toutes les images sont rouges comme elles sont inutilisables"
126+
},
127+
"instructions" : {
128+
"description" : "Quand toutes les images sont mauvaises, faites glisser de haut en bas pour les marquer toutes en rouge.",
129+
"icon" : "swipe-down",
130+
"title" : "Toutes les images sont mauvaises ou manquantes... C'est trop long à taper!"
131+
},
132+
"success" : {
133+
"description" : "Vous pouvez gagner beaucoup de temps ainsi. Faites glisser vers la gauche pour la suite.",
134+
"icon" : "check",
135+
"title" : "Parfait!"
136+
}
137+
}
138+
}

0 commit comments

Comments
 (0)