fighting malnutrition with sms and django
TRANSCRIPT
Fighting Malnutrition with SMS and Django
Andy McKayclearwind consulting
[email protected]@clearwind
clearwind consulting
Lots of Plone sitesWrote book
clearwind consulting
Prinicpal of ClearwindBeen doing Python for about 9 yearsco-founder of Enfold Systems
clearwind consulting
clearwind consulting
existing project
clearwind consulting
rapidsms
clearwind consulting
Schuyler ErleMatt Berg
Adam McKaigand others...
clearwind consulting
deployment help?
clearwind consulting
4 days, 32 hours flight...
clearwind consulting
clearwind consulting
and yes this area is home to a certain famous family....
clearwind consulting
health care workers
for community health care workers in the field
large number of children to look after
in village (not in clinics)
clearwind consulting
clearwind consulting
identify and helpsometimes not easy to spot malnurished kids
maybe no records
let other people know the kid needs help
parents sometimes have enough trouble feeding rest of the family
clearwind consulting
disclaimerI am not a health careworked or related to development
i know the techy bits
can't speak about efficiency of the program
clearwind consulting
Robbed of vital nutrients as children, they grow up stunted and sickly, weaklings in a land that still runs on manual labor.
http://www.nytimes.com/2006/12/28/world/africa/28malnutrition.html
clearwind consulting
muacmid upper arm circumfrence
Matt Berg
children
muac
clearwind consulting
worker
django
sms
clearwind consulting
children worker
muac
clinic
sms
clearwind consulting
django
sms
children worker
muac
clearwind consulting
spomskyd
serial
clearwind consulting
spomskyd
django route
http
serial
clearwind consulting
clearwind consulting
since then spomskyd has been replaced by pygsm
pygsm do a lot of work sorting out all those sms quirks
pygsm
django route
http
serial
clearwind consulting
custom ui
pygsm
django route
http
serialworkers
django runserver
clearwind consulting
Note: test data
clearwind consulting
Note: test data
clearwind consulting
Note: test data
clearwind consulting
admins
admincustom ui
workers
django runserver
pygsm
django route
http
serial
clearwind consulting
7654321 > +26 105 d v f
child 26 MUAC 105diarrheoavomitingfever
clearwind consulting
7654321 > +26 105 d v f
7654321 < MUAC> SAM+ Patient requires IMMEDIATE inpatient care. +26 MADISON, M, F/4 (Sally). MUAC 105 mm, Diarrhea, Fever, Vomiting
clearwind consulting
7654321 > +26 105 d v f
7654321 < MUAC> SAM+ Patient requires IMMEDIATE inpatient care. +26 MADISON, M, F/4 (Sally). MUAC 105 mm, Diarrhea, Fever, Vomiting
7654322 < @jdoe reports +26: SAM+, MUAC 105 mm, Diarrhea, Fever, Vomiting
clearwind consulting
malaria
clearwind consulting
7654321 > mrdt +34 y n f
malaria rapid diagnosis
child 34y has malarin has no bednetf has a fever
clearwind consulting
7654321 > mrdt +34 y n f
7654321 < MRDT> Child +34, MADISON, Molly, F/12m has MALARIA. Child is less than 3. Please provide 1 tab of Coartem (ACT) twice a day for 3 days
clearwind consulting
Matt Berg
clearwind consulting
flew back
clearwind consulting
sleptmoved houseslept, slept
http://www.flickr.com/photos/chris_gin/2388032929/sizes/l/
clearwind consulting
technical details
some of these are based on later work for Malawi
talk about a few of the bits i worked on
interesting
clearwind consulting
rapidsms
clearwind consulting
from rapidsms.message import Message
message.text
message.person
message.send()
message.respond(text)
message.forward(identity, text=None)
rapidsms api
clearwind consulting
decorator for routing
clearwind consulting
# Register a new patient
@keyword(r'new (\S+) (\S+) ([MF]) ([\d\-]+)( \D+)?( \d+)?( z\d+)?')
@authenticated
def new_case (self, message,...[snip]):
# Do something with the new patient
clearwind consulting
i like urls.py
clearwind consulting
1. see what's going where2. route to different
its a django standard, more friendly for other users
easier to change sms without having to change the code
clearwind consulting
urlpatterns = patterns('',
(r'^new (.*)', "apps.mctc.views.joining.new_case"),
)despite the name, url patterns can be used for more than just urls
clearwind consulting
try:
callback, args, kwargs = resolver.resolve(message.text.lower())
except Resolver404:
message.respond(_("Unknown command: %(msg)s...) % {"msg":message.text[:10]})
clearwind consulting
form handling
clearwind consulting
full of checkingcode, views were full of checking and validation
in django this is done by forms
clearwind consulting
parse string into form
clearwind consulting
# NEW 70 1201 M 19102008 123124124
class NewForm(Form):
child = StringField(valid="(\d+)")
gmc = StringField(valid="(\d+)")
sex = GenderField()
dob = DateField(format="%m%d%Y")
contact = StringField(valid="(\d+)", required=False)
clearwind consulting
class based viewshttp://www.slideshare.net/simon/classbased-views-with-django
clearwind consulting
class based view that does repetitive work→ validate form→ process form→ what to do if it goes wrongsubclassed for different country (eg. Malawi)
clearwind consulting
class MalawiNew(New): @authenticated def post_init(self): self.form = NewForm def pre_process(self): # malawi specific request years, months = years_months(self.form.clean.dob.data.strftime.data) if years > 5: raise FormFailed, "You have attempted to register child #%s. However, "\ "the date of birth entered is %s. The age of this "\ "child is above 5 years. Please resend SMS with corrected "\ "age." % (self.form.clean.child.data, self.form.clean.dob.data.strftime("%m.%d.%Y")) def post_process(self): if self.form.clean.contact.data: self.data.case.mobile = self.form.clean.contact def error_already_exists(self): # malawi specific code return "You have attempted to register child #%s in %s GMC. However, this child already exists. If this is an error, please resend SMS with correct information. If this patient is new or a replacement, please use the EXIT command first, then re-register." % (self.form.clean.child.data, self.data.provider.clinic.name)
clearwind consulting
testing
clearwind consulting
tests really matter
clearwind consulting
test_05_cancelling = """
1234567 > REPORT 70 25.2 95.5 13.5 N Y
1234567 < Thank you Mariam Coulibaly for reporting child #70, weight = 25.2 kg, height = 95.5 cm, MUAC = 13.5 cm, no oedema, yes diarrhea...[snip]
1234567 > CANCEL 70
1234567 < Report for 70 cancelcel...[snip]"""
brillianty done format
allows easy reading bynon technical users
clearwind consulting
reusable tablehttp://github.com/andymckay/django-reusable-tables/tree/master
clearwind consulting
Note: test data
clearwind consulting
liking it less
clearwind consulting
register("case", Case, [ ["Id", "ref_id", "{{object.ref_id}}"], ["Name", "last_name", "{{object.first_name}} {{object.last_name}}"],...[snip]
])
clearwind consulting
what challenges?
clearwind consulting
another framework?
designed for a non-technical audience
as a techy that can be annoying, eg settings.py
if you just want to speak to SMS and nothing else, maybe better way to go
clearwind consulting
not enough timeschuyler, adam, matt
clearwind consulting
infrastructure
this is the pavement in the main street
clearwind consulting
We have over 5000 kids in the system now and counting. It's been used to catch over 100 kids with malnutrition and about 400 with malaria.
Matt Berg
clearwind consulting
thank you, django
clearwind consulting
volunteers wanted
5-10Hour projects we would love volunteer help with
clearwind consulting
more infowww.rapidsms.org/rapidresponse