Skip to content

Commit a25717c

Browse files
dodumosutakinbo
authored andcommitted
Feature/submission background processing (#153)
* feat: put submission updates on background queue * fix: change task invocation arguments
1 parent 42716ac commit a25717c

File tree

4 files changed

+31
-19
lines changed

4 files changed

+31
-19
lines changed

apollo/formsframework/forms.py

+4-18
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,18 @@
22
from datetime import datetime
33
from functools import partial
44
from itertools import ifilter
5-
from mongoengine import signals
65
from wtforms import (
7-
Form,
8-
IntegerField, SelectField, SelectMultipleField, StringField,
9-
validators, widgets
10-
)
6+
Form, IntegerField, SelectField, StringField, validators, widgets)
117
from flask import g
128
from flask.ext.mongoengine.wtf import model_form
139
from flask.ext.wtf import Form as SecureForm
1410
from .. import services, models
1511
from ..frontend.helpers import DictDiffer
16-
from ..participants.utils import update_participant_completion_rating
1712
from .custom_fields import IntegerSplitterField
1813
import json
1914
import re
2015

21-
22-
ugly_phone = re.compile('[^\d]*')
16+
ugly_phone = re.compile(r'[^\d]*')
2317

2418

2519
def update_submission_version(sender, document, **kwargs):
@@ -193,15 +187,7 @@ def save(self):
193187
verified=False, last_seen=datetime.utcnow())
194188
participant.update(add_to_set__phones=phone_contact)
195189

196-
with signals.post_save.connected_to(
197-
update_submission_version,
198-
sender=services.submissions.__model__
199-
):
200-
submission.save()
201-
202-
# update completion rating for participant
203-
if submission.form.form_type == 'CHECKLIST':
204-
update_participant_completion_rating(participant)
190+
submission.save(clean=False)
205191
except models.Submission.DoesNotExist:
206192
pass
207193

@@ -261,9 +247,9 @@ def build_questionnaire(form, data=None):
261247

262248
form_class = type('QuestionnaireForm', (BaseQuestionnaireForm,), fields)
263249

264-
265250
return form_class(data)
266251

252+
267253
FormForm = model_form(
268254
models.Form, SecureForm,
269255
only=[

apollo/messaging/helpers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def parse_message(form):
2727

2828
if questionnaire.validate():
2929
submission = questionnaire.save()
30-
30+
3131
# if submission returns empty, then the participant
3232
# was not meant to send this text.
3333
# TODO: add response for no recorded submission

apollo/messaging/views_messaging.py

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from apollo.messaging.forms import KannelForm, TelerivetForm
66
from apollo.messaging.helpers import parse_message
77
from apollo.messaging.utils import parse_text
8+
from apollo.submissions.tasks import update_submission
89
from flask import Blueprint, make_response, request, g, current_app
910
import json
1011
import re
@@ -41,6 +42,7 @@ def lookup_participant(msg, event=None):
4142

4243
def update_datastore(inbound, outbound, submission, had_errors):
4344
if submission:
45+
update_submission.delay(str(submission.pk))
4446
participant = submission.contributor
4547
else:
4648
participant = lookup_participant(inbound)

apollo/submissions/tasks.py

+24
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# -*- coding: utf-8 -*-
2+
from mongoengine import signals
3+
24
from apollo import models
35
from apollo.factory import create_celery_app
6+
from apollo.formsframework.forms import update_submission_version
7+
from apollo.participants.utils import update_participant_completion_rating
48

59

610
celery = create_celery_app()
@@ -20,3 +24,23 @@ def init_submissions(deployment_pk, event_pk, form_pk, role_pk,
2024

2125
models.Submission.init_submissions(deployment, event, form,
2226
role, location_type)
27+
28+
29+
@celery.task
30+
def update_submission(submission_pk):
31+
try:
32+
submission = models.Submission.objects.get(pk=submission_pk)
33+
except models.Submission.DoesNotExist:
34+
return
35+
36+
with signals.post_save.connected_to(
37+
update_submission_version,
38+
models.Submission):
39+
# save with precomputation enabled
40+
submission.save()
41+
42+
# update completion rating for participant
43+
if submission.form.form_type == 'CHECKLIST':
44+
participant = submission.contributor
45+
if participant:
46+
update_participant_completion_rating(participant)

0 commit comments

Comments
 (0)