Ejemplo n.º 1
0
def handle_report(**kwargs):
    from .models import IGReport

    connection = kwargs['connection']
    report = IGReport.objects.filter(connection=connection).latest('datetime')
    language = report.connection.contact.language
    slug = 'hotline_script_%s' % language

    report_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_complaint')
    accused_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_accused')
    amount_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_amount')
    district_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_district')
    names_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_name')

    progress = kwargs['sender']
    session = ScriptSession.objects.filter(script=progress.script, connection=connection, end_time__isnull=False).latest('end_time')

    response = find_best_response(session, report_poll)
    report.report = response if response else ''
    report.subject = find_best_response(session, accused_poll)
    report.district = find_best_response(session, district_poll)
    report.amount_freeform = find_best_response(session, amount_poll)
    report.names = find_best_response(session, names_poll)
    connection.contact.name = report.names if report.names else connection.identity
    connection.contact.save()
    report.save()
    Message.objects.create(\
        direction='O', \
        status='Q', \
        connection=connection, \
        application='script', \
        text=(translations[connection.contact.language]['CONFIRMATION_MESSAGE'] % {'reference_number':report.reference_number}))
Ejemplo n.º 2
0
    def handle(self, **options):
        try:

            sp=ScriptProgress.objects.values_list('connection',flat=True)
            scriptsessions=ScriptSession.objects.exclude(connection__in=sp)

            for session in scriptsessions:
                connection=session.connection
                script = session.script
                youthgrouppoll = script.steps.get(order=1).poll
                districtpoll = script.steps.get(order=3).poll
                namepoll = script.steps.get(order=5).poll
                agepoll = script.steps.get(order=6).poll
                genderpoll = script.steps.get(order=7).poll
                villagepoll = script.steps.get(order=8).poll
                contact = connection.contact
                name = find_best_response(session, namepoll)
                district = find_best_response(session, districtpoll)
                
                if name:
                    contact.name = name[:100]
                    print "original name" +contact.name
                    print name


                contact.reporting_location = district


                age = find_best_response(session, agepoll)
                if age and age < 100:
                    contact.birthdate = datetime.datetime.now() - datetime.timedelta(days=(365 * int(age)))

                gresps = session.responses.filter(response__poll=genderpoll, response__has_errors=False).order_by('-response__date')
                if gresps.count():
                    gender = gresps[0].response
                    print "original gender"
                    print contact.gender
                    print gender
                    if gender.categories.filter(category__name='male').count():
                        contact.gender = 'M'
                    elif gender.categories.filter(category__name='female').exists():
                        contact.gender = 'F'
                    else:
                        contact.gender=None

                village = find_best_response(session, villagepoll)
                if village:
                    print str(contact.village) + "->" +str(village)
                    contact.village = village


                contact.save()

               

       
        except Exception, exc:
            print traceback.format_exc(exc)
Ejemplo n.º 3
0
def handle_report(**kwargs):
    from .models import Report
    
    connection = kwargs['connection']
    try:
        report = Report.objects.filter(connection=connection).latest('datetime')
    except Exception as err:
        return
    language = report.connection.contact.language
    slug = 'hotline_script_%s' % language

    report_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_complaint')
    accused_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_accused')
    amount_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_amount')
    district_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_district')
    names_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_name')

    progress = kwargs['sender']
    session = ScriptSession.objects.filter(script=progress.script, connection=connection, end_time__isnull=False).latest('end_time')
    
    report.reference_number = util.get_reference_number(report.id)
    response = find_best_response(session, report_poll)
    report.report = response if response else ''
    report.subject = find_best_response(session, accused_poll)
    report.amount_freeform = find_best_response(session, amount_poll)
    if report.amount_freeform and re.search('^[0-9]+$', report.amount_freeform):
        report.amount = float(report.amount_freeform)
    report.names = find_best_response(session, names_poll)
    connection.contact.name = report.names if (report.names and len(report.names)<=100) else connection.identity
    
    district = find_best_response(session, district_poll)
    
    if district:
        if district_poll.type == Poll.TYPE_LOCATION:
            report.district = district
        else:
            report.district_freeform = district
            locations = Location.objects.filter(type='district')
            district_names = locations.values_list('name', flat=True)
            district_names_lower = [d.lower() for d in district_names]
            
            matches = difflib.get_close_matches(district.lower(), district_names_lower)
            if matches:
                district_obj = Location.objects.get(type__slug='district', name__iexact=matches[0].lower())
                report.district = district_obj
    
    connection.contact.save()
    report.save()
    
    if report.report and report.subject:
        from .lib import reports
        reports.accept_report(report.id)
    else:
        # requires manual acceptance
        pass
Ejemplo n.º 4
0
def handle_report(**kwargs):
    from .models import IGReport

    connection = kwargs['connection']
    report = IGReport.objects.filter(connection=connection).latest('datetime')
    language = report.connection.contact.language
    slug = 'hotline_script_%s' % language

    report_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_complaint')
    accused_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_accused')
    amount_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_amount')
    district_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_district')
    names_poll = Poll.objects.get(scriptstep__script__slug=slug, name='hotline_name')

    progress = kwargs['sender']
    session = ScriptSession.objects.filter(script=progress.script, connection=connection, end_time__isnull=False).latest('end_time')
    
    report.reference_number = util.get_reference_number(report.id)
    response = find_best_response(session, report_poll)
    report.report = response if response else ''
    report.subject = find_best_response(session, accused_poll)
    report.amount_freeform = find_best_response(session, amount_poll)
    report.names = find_best_response(session, names_poll)
    connection.contact.name = report.names if (report.names and len(report.names)<=100) else connection.identity
    
    district = find_best_response(session, district_poll)
    
    if district:
        if district_poll.type == Poll.TYPE_LOCATION:
            report.district = district
        else:
            report.district_freeform = district
            locations = Location.objects.filter(type='district')
            district_names = locations.values_list('name', flat=True)
            district_names_lower = [d.lower() for d in district_names]
            
            matches = difflib.get_close_matches(district.lower(), district_names_lower)
            if matches:
                district_obj = Location.objects.get(type__slug='district', name__iexact=matches[0].lower())
                report.district = district_obj
    
    connection.contact.save()
    report.save()
    text = (translations[connection.contact.language]['CONFIRMATION_MESSAGE'] % {'reference_number':report.reference_number})
    text += util.get_tagline(connection)

    Message.objects.create(\
        direction='O', \
        status='Q', \
        connection=connection, \
        application='script', \
        text=text)
Ejemplo n.º 5
0
def do_autoreg(**kwargs):
    ''' 
    Kenya autoreg post registration particulars handling. 
    This method responds to a signal sent by the Script module on completion of the cvs_autoreg script
    '''
    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'autoreg':
        return
    session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by('-end_time')[0]
    script = progress.script

    contact = connection.contact if connection.contact else Contact.objects.create()
    connection.contact = contact
    connection.save()

    name_poll = script.steps.get(poll__name='autoreg_name').poll
    org_poll = script.steps.get(poll__name='autoreg_org').poll
    field_poll = script.steps.get(poll__name='autoreg_field').poll
    division_poll = script.steps.get(poll__name='autoreg_division').poll
    building_poll = script.steps.get(poll__name='autoreg_building').poll

    org = find_best_response(session, org_poll)
    org = find_closest_match(org, Group.objects) if org else None
    contact.groups.add(org or Group.objects.get(name='Other Organizations'))

    field = find_best_response(session, field_poll)
    field = find_closest_match(field, Group.objects) if field else None
    contact.groups.add(field or Group.objects.get(name='Other Fields'))

    contact.name = find_best_response(session, name_poll) or 'Anonymous User'
    contact.name = ' '.join([n.capitalize() for n in contact.name.lower().split()])
    contact.name = contact.name[:100]

    division = find_best_response(session, division_poll)
    schools = School.objects
    facilities = HealthFacility.objects
    if division:
        division = find_closest_match(division, Location.objects.filter(type__name='division'))
        if division:
            contact.reporting_location = division
            schools = School.objects.filter(location__in=division.get_descendants(include_self=True))
            facilities = HealthFacility.objects.filter(catchment_areas__in=division.get_descendants(include_self=True))

    building = find_best_response(session, building_poll)
    if building:
        contact.school = find_closest_match(building, schools)
        contact.health_facility = find_closest_match(building, facilities)

    contact.save()
Ejemplo n.º 6
0
def emis_autoreg_transition(**kwargs):

    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'emis_autoreg':
        return
    script = progress.script
    session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by('-end_time')[0]
    role_poll = script.steps.get(order=1).poll
    role = find_best_response(session, role_poll)
    group = None
    if role:
        group = find_closest_match(role, Group.objects)
    skipsteps = {
        'emis_subcounty':['Teachers', 'Head Teachers', 'SMC', 'GEM'],
        'emis_one_school':['Teachers', 'Head Teachers', 'SMC'],
        'emis_many_school':['GEM'],
    }
    skipped = True
    while group and skipped:
        skipped = False
        for step_name, roles in skipsteps.items():
            if  progress.step.poll and \
                progress.step.poll.name == step_name and group.name not in roles:
                skipped = True
                progress.step = progress.script.steps.get(order=progress.step.order + 1)
                progress.save()
                break
Ejemplo n.º 7
0
def emis_autoreg_transition(**kwargs):

    connection = kwargs["connection"]
    progress = kwargs["sender"]
    if not progress.script.slug == "emis_autoreg":
        return
    script = progress.script
    try:
        session = ScriptSession.objects.filter(script=progress.script, connection=connection, end_time=None).latest(
            "start_time"
        )
    except ScriptSession.DoesNotExist:
        return
    role_poll = script.steps.get(order=1).poll
    role = find_best_response(session, role_poll)
    group = None
    if role:
        group = find_closest_match(role, Group.objects)
    skipsteps = {
        "emis_subcounty": ["Teachers", "Head Teachers", "SMC"],
        "emis_one_school": ["Teachers", "Head Teachers", "SMC"],
        "emis_many_school": ["GEM"],
    }
    skipped = True
    while group and skipped:
        skipped = False
        for step_name, roles in skipsteps.items():
            if progress.step.poll and progress.step.poll.name == step_name and group.name not in roles:
                skipped = True
                progress.step = progress.script.steps.get(order=progress.step.order + 1)
                progress.save()
                break
Ejemplo n.º 8
0
def cvs_autoreg(**kwargs):
    '''
    CVS autoreg post registration particulars handling.
    This method responds to a signal sent by the Script module on completion of the cvs_autoreg script
    '''
    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'cvs_autoreg':
        return
    session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by('-end_time')[0]
    script = progress.script

    rolepoll = script.steps.get(poll__name='cvs_role').poll
    namepoll = script.steps.get(poll__name='cvs_name').poll
    districtpoll = script.steps.get(poll__name='cvs_district').poll
    healthfacilitypoll = script.steps.get(poll__name='cvs_healthfacility').poll
    villagepoll = script.steps.get(poll__name='cvs_village').poll

    role = None
    resps = session.responses.filter(response__poll=rolepoll, response__has_errors=False).order_by('-response__date')
    if resps.count():
        role = resps[0].response

    name = find_best_response(session, namepoll)
    district = find_best_response(session, districtpoll)
    village_name = find_best_response(session, villagepoll)
    village = None
    if village_name:
        if district:
            village = find_closest_match(village_name, district.get_descendants(include_self=True))
        else:
            village = find_closest_match(village_name, Location.objects)

    healthfacility = find_best_response(session, healthfacilitypoll)

    if name:
        name = ' '.join([n.capitalize() for n in name.lower().split()])
        name = name[:100]

    try:
        contact = connection.contact or HealthProvider.objects.get(name=name, \
                                      reporting_location=(village or district), \
                                      village=village, \
                                      village_name=village_name)
    except Contact.DoesNotExist, Contact.MultipleObectsReturned:
        contact = HealthProvider.objects.create()
Ejemplo n.º 9
0
def edtrac_autoreg_transition(**kwargs):

    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'edtrac_autoreg':
        return
    script = progress.script
    try:
        session = ScriptSession.objects.filter(
            script=progress.script,
            connection=connection,
            end_time=None
        ).latest('start_time')
    except ScriptSession.DoesNotExist:
        return
    role_poll = script.steps.get(poll__name="edtrac_role").poll
    role = None
    best_response = find_best_response(session, role_poll)
    if best_response:
        role = best_response
    group = None
    if role:
        logger.info('Role: %s' % role)

    if role:
        group = match_group_response(session, role, role_poll)

        logger.info('Identified group: %s' % group.name)

        skipsteps = {
            'edtrac_class': ['Teachers'],
            'edtrac_gender': ['Head Teachers'],
            'edtrac_subcounty': ['Teachers', 'Head Teachers', 'SMC', 'GEM'],
            'edtrac_school': ['Teachers', 'Head Teachers', 'SMC']
        }
        skipped = True
        while group and skipped:
            skipped = False
            for step_name, roles in skipsteps.items():
                if (
                    progress.step.poll
                    and progress.step.poll.name == step_name
                    and group.name not in roles
                ):

                    logger.info(
                        'SKIPPED! %s -> %s:' % (
                            step_name,
                            progress.step.poll.question
                        )
                    )

                    skipped = True
                    progress.step = progress.script.steps.get(
                        order=progress.step.order + 1
                    )
                    progress.save()
                    break
Ejemplo n.º 10
0
def emis_autoreg(**kwargs):

    connection = kwargs["connection"]
    progress = kwargs["sender"]
    if not progress.script.slug == "emis_autoreg":
        return

    session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by("-end_time")[0]
    script = progress.script

    role_poll = script.steps.get(order=1).poll
    district_poll = script.steps.get(order=2).poll
    subcounty_poll = script.steps.get(order=3).poll
    school_poll = script.steps.get(order=4).poll
    schools_poll = script.steps.get(order=5).poll
    name_poll = script.steps.get(order=6).poll

    name = find_best_response(session, name_poll)
    role = find_best_response(session, role_poll)
    default_group = Group.objects.get(name="Other EMIS Reporters")
    subcounty = find_best_response(session, subcounty_poll)
    district = find_best_response(session, district_poll)

    if name:
        name = " ".join([n.capitalize() for n in name.lower().split()])[:100]

    if subcounty:
        subcounty = find_closest_match(subcounty, Location.objects.filter(type__name="sub_county"))

    grp = find_closest_match(role, Group.objects)
    grp = grp if grp else default_group

    if subcounty:
        rep_location = subcounty
    elif district:
        rep_location = district
    else:
        rep_location = Location.tree.root_nodes()[0]
    try:
        contact = connection.contact or EmisReporter.objects.get(name=name, reporting_location=rep_location, groups=grp)
        if connection.contact:
            contact = EmisReporter.objects.get(pk=connection.contact.pk)
    except EmisReporter.DoesNotExist, EmisReporter.MultipleObectsReturned:
        contact = EmisReporter.objects.create()
Ejemplo n.º 11
0
def edtrac_autoreg(**kwargs):
    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'edtrac_autoreg':
        return
    session = ScriptSession.objects.filter(
        script=progress.script, connection=connection).order_by('-end_time')[0]
    script = progress.script
    role_poll = script.steps.get(poll__name='edtrac_role').poll
    gender_poll = script.steps.get(poll__name='edtrac_gender').poll
    class_poll = script.steps.get(poll__name='edtrac_class').poll
    district_poll = script.steps.get(poll__name='edtrac_district').poll
    subcounty_poll = script.steps.get(poll__name='edtrac_subcounty').poll
    school_poll = script.steps.get(poll__name='edtrac_school').poll
    name_poll = script.steps.get(poll__name='edtrac_name').poll

    name = find_best_response(session, name_poll)
    role = find_best_response(session, role_poll)
    gender = find_best_response(session, gender_poll)
    grade = find_best_response(session, class_poll)
    subcounty = find_best_response(session, subcounty_poll)
    district = find_best_response(session, district_poll)

    if name:
        name = ' '.join([n.capitalize() for n in name.lower().split()])[:100]
    if district:
        district = find_closest_match(district,
                                      Location.objects.filter(type='district'))

    if subcounty:
        if district:
            subcounty = find_closest_match(
                subcounty,
                district.get_descendants().filter(type='sub_county'))
        else:
            subcounty = find_closest_match(
                subcounty, Location.objects.filter(type='sub_county'))

    grp = match_group_response(session, role, role_poll)

    if subcounty:
        rep_location = subcounty
    elif district:
        rep_location = district
    else:
        rep_location = Location.tree.root_nodes()[0]
    try:
        contact = connection.contact or EmisReporter.objects.get(
            name=name,
            reporting_location=rep_location,
            groups=grp,
            connection=connection)
        if connection.contact:
            contact = EmisReporter.objects.get(pk=connection.contact.pk)
    except EmisReporter.DoesNotExist, EmisReporter.MultipleObectsReturned:
        contact = EmisReporter.objects.create()
Ejemplo n.º 12
0
def match_connections():
    script = Script.objects.get(slug='emis_autoreg')
    name_poll = script.steps.get(order=6).poll
    for connection in Connection.objects.all():
        try:
            session = ScriptSession.objects.filter(script=script, connection=connection).order_by('-end_time')[0]
        except IndexError:
            print 'Session for ' + connection.identity + ' does not exist!'
            continue
        try:
            name = find_best_response(session, name_poll)
        except AttributeError:
            import pdb;pdb.set_trace()
            find_best_response(session, name_poll)
        if name:
            name = ' '.join([n.capitalize() for n in name.lower().split(' ')])
            try:
                contact = EmisReporter.objects.get(name=name[:100])
                connection.contact = contact
                connection.save()
            except EmisReporter.MultipleObjectsReturned:
                print name[:100] + ' registered more than once!'
            except EmisReporter.DoesNotExist:
                print name[:100] + ' with connection ' + connection.identity + ' does not exist'
Ejemplo n.º 13
0
def edtrac_autoreg_transition(**kwargs):

    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'edtrac_autoreg':
        return
    script = progress.script
    try:
        session = ScriptSession.objects.filter(
            script=progress.script, connection=connection,
            end_time=None).latest('start_time')
    except ScriptSession.DoesNotExist:
        return
    role_poll = script.steps.get(poll__name="edtrac_role").poll
    role = None
    best_response = find_best_response(session, role_poll)
    if best_response:
        role = best_response
    group = None
    if role:
        logger.info('Role: %s' % role)

    if role:
        group = match_group_response(session, role, role_poll)

        logger.info('Identified group: %s' % group.name)

        skipsteps = {
            'edtrac_class': ['Teachers'],
            'edtrac_gender': ['Head Teachers'],
            'edtrac_subcounty': ['Teachers', 'Head Teachers', 'SMC', 'GEM'],
            'edtrac_school': ['Teachers', 'Head Teachers', 'SMC']
        }
        skipped = True
        while group and skipped:
            skipped = False
            for step_name, roles in skipsteps.items():
                if (progress.step.poll and progress.step.poll.name == step_name
                        and group.name not in roles):

                    logger.info('SKIPPED! %s -> %s:' %
                                (step_name, progress.step.poll.question))

                    skipped = True
                    progress.step = progress.script.steps.get(
                        order=progress.step.order + 1)
                    progress.save()
                    break
Ejemplo n.º 14
0
def check_for_validity(progress):
  try:
    session       = ScriptSession.objects.filter(script = progress.script, connection = progress.connection, end_time = None)[0]
    location_poll = progress.script.steps.get(poll__name='mrs_location').poll
    loc           = find_best_response(session, location_poll)
    if not loc:
        return False
    elif loc.type.name != 'district':
        #find best response is not guaranteed to return a district in case name crashes
        dist_loc=loc.get_ancestors().filter(type="district")
        if dist_loc.exists():
            eav_obj=session.responses.filter(response__poll=location_poll).latest('response__date').response.eav
            eav_obj.poll_location_value=dist_loc[0]
            eav_obj.save()
            return True
    return loc.type.name  == 'district'
  except IndexError:
    pass
  return False
Ejemplo n.º 15
0
def handle_report(**kwargs):
    from .models import IGReport

    connection = kwargs['connection']
    report = IGReport.objects.filter(connection=connection).latest('datetime')
    language = report.connection.contact.language
    slug = 'hotline_script_%s' % language

    report_poll = Poll.objects.get(scriptstep__script__slug=slug,
                                   name='hotline_complaint')
    accused_poll = Poll.objects.get(scriptstep__script__slug=slug,
                                    name='hotline_accused')
    amount_poll = Poll.objects.get(scriptstep__script__slug=slug,
                                   name='hotline_amount')
    district_poll = Poll.objects.get(scriptstep__script__slug=slug,
                                     name='hotline_district')
    names_poll = Poll.objects.get(scriptstep__script__slug=slug,
                                  name='hotline_name')

    progress = kwargs['sender']
    session = ScriptSession.objects.filter(
        script=progress.script, connection=connection,
        end_time__isnull=False).latest('end_time')

    report.reference_number = util.get_reference_number(report.id)
    response = find_best_response(session, report_poll)
    report.report = response if response else ''
    report.subject = find_best_response(session, accused_poll)
    report.amount_freeform = find_best_response(session, amount_poll)
    report.names = find_best_response(session, names_poll)
    connection.contact.name = report.names if (
        report.names and len(report.names) <= 100) else connection.identity

    district = find_best_response(session, district_poll)

    if district:
        if district_poll.type == Poll.TYPE_LOCATION:
            report.district = district
        else:
            report.district_freeform = district
            locations = Location.objects.filter(type='district')
            district_names = locations.values_list('name', flat=True)
            district_names_lower = [d.lower() for d in district_names]

            matches = difflib.get_close_matches(district.lower(),
                                                district_names_lower)
            if matches:
                district_obj = Location.objects.get(
                    type__slug='district', name__iexact=matches[0].lower())
                report.district = district_obj

    connection.contact.save()
    report.save()
    text = (translations[connection.contact.language]['CONFIRMATION_MESSAGE'] %
            {
                'reference_number': report.reference_number
            })
    text += util.get_tagline(connection)

    Message.objects.create(\
        direction='O', \
        status='Q', \
        connection=connection, \
        application='script', \
        text=text)
Ejemplo n.º 16
0
def coffee_autoreg(**kwargs):

    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'coffee_autoreg':
        return

    session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by('-end_time')[0]
    script = progress.script

    name_poll = script.steps.get(order=1).poll
    department_poll = script.steps.get(order=2).poll
    extension_poll = script.steps.get(order=3).poll
    email_poll = script.steps.get(order=4).poll
    coffee_standard_poll = script.steps.get(order=5).poll
    milktype_poll = script.steps.get(order=6).poll
    running_order_poll = script.steps.get(order=7).poll
    own_cup_poll = script.steps.get(order=8).poll
    other_notes_poll = script.steps.get(order=9).poll

    name = find_best_response(session, name_poll)
    extension = find_best_response(session, extension_poll)
    department = find_best_response(session, department_poll)
    email = find_best_response(session, email_poll)
    if name:
        name = ' '.join([n.capitalize() for n in name.lower().split()])

    try:
        existing_contact = Customer.objects.get(name=name[:100], \
                                  extension=extension, \
                                  email=email)
        if connection.contact:
            connection.contact.active = True
        else:
            existing_contact.active = True
            existing_contact.save()
            connection.contact = existing_contact
            connection.save()

    except Customer.MultipleObjectsReturned:
        pass

    except Customer.DoesNotExist:

        connection.contact = Customer.objects.create()
        connection.save()
        contact = connection.contact

        if name:
            name = ' '.join([n.capitalize() for n in name.lower().split(' ')])
            contact.name = name[:100]

        if department:
            group = find_closest_match(department, Group.objects)
            if not group:
                group = Group.objects.get(name='Other Coffee People')
        contact.groups.add(group)

        if extension:
            contact.extension = extension

        if email:
            contact.email = email
        contact.save()

        prefs = contact.preferences
        drink = find_best_response(session, coffee_standard_poll)
        if drink:
            prefs.standard_drink = find_closest_match(drink, MenuItem.objects)

        milktype = find_best_response(session, milktype_poll)
        if milktype:
            milktype = ' '.join([n.capitalize() for n in milktype.lower().split(' ')])
            prefs.milk_type = milktype

        own_cup = find_best_response(session, own_cup_poll)
        if own_cup and own_cup in YES_WORDS:
            prefs.own_cup = True

        notes = find_best_response(session, other_notes_poll)
        if notes:
            notes = ' '.join([n.capitalize() for n in notes.lower().split(' ')])
            prefs.notes = notes
        prefs.save()
Ejemplo n.º 17
0
    if grade:
        grade = parse_grade(grade)
        if grade:
            contact.grade = grade

    if name:
        contact.name = name

    if not contact.name:
        contact.name = 'Anonymous User'
    # activate reporter by default (deactivate when quit)
    contact.active = True
    contact.save()

    reporting_school = None
    school = find_best_response(session, school_poll)
    if school:
        if district:
            reporting_school = School.objects.filter(name__iexact=school)
            if reporting_school.exists():
                reporting_school = reporting_school[0]
            else:
                reporting_school = find_closest_match(
                    school,
                    School.objects.filter(location__name__in=[district],
                                          location__type__name='district'),
                    True)
                contact.has_exact_matched_school = False
                contact.save()
        elif subcounty:
            reporting_school = find_closest_match(
Ejemplo n.º 18
0
def autoreg(**kwargs):
    connection = kwargs['connection']
    progress = kwargs['sender']
    if progress.script.slug in progress.script.slug in ['ureport_autoreg2', 'ureport_autoreg_luo2']:
        connection.contact = Contact.objects.create(name='Anonymous User')
        connection.save()
        session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by('-end_time')[0]
        script = progress.script
        youthgrouppoll = script.steps.get(order=1).poll
        districtpoll = script.steps.get(order=2).poll
        namepoll = script.steps.get(order=3).poll
        agepoll = script.steps.get(order=4).poll
        genderpoll = script.steps.get(order=5).poll
        villagepoll = script.steps.get(order=6).poll
        contact = connection.contact
        word_dict=dict(AutoregGroupRules.objects.exclude(values=None).values_list('group__name','values'))
        name = find_best_response(session, namepoll)
        if name:
            contact.name = name[:100]

        contact.reporting_location = find_best_response(session, districtpoll)

        age = find_best_response(session, agepoll)
        if age and age < 100:
            contact.birthdate = datetime.datetime.now() - datetime.timedelta(days=(365 * int(age)))

        gresps = session.responses.filter(response__poll=genderpoll, response__has_errors=False).order_by('-response__date')
        if gresps.count():
            gender = gresps[0].response
            if gender.categories.filter(category__name='male').count():
                contact.gender = 'M'
            elif gender.categories.filter(category__name='female').exists():
                contact.gender = 'F'

        village = find_best_response(session, villagepoll)
        if village:
            contact.village = village

        group_to_match = find_best_response(session, youthgrouppoll)
        gr_matched=False
        
        #to avoid an attempt to None.split()
        if group_to_match:
            try:
                for group_pk, word_list in word_dict.items():
                    for word in word_list.split(","):
                        if word in group_to_match.split():
                            contact.groups.add(Group.objects.get(pk=group_pk))
                            gr_matched=True
            except AssertionError:
                pass
        default_group = None
        if progress.language:
            contact.language = progress.language
        if Group.objects.filter(name='Other uReporters').count():
            default_group = Group.objects.get(name='Other uReporters')
        if group_to_match and not gr_matched:

            for g in re.findall(r'\w+', group_to_match):
                if g:
                    group = find_closest_match(str(g), Group.objects.exclude(name__in=["MP","CODES Lugazi","delegate","CAO"]))
                    if group:
                        contact.groups.add(group)
                        break

            if default_group:
                contact.groups.add(default_group)
        elif default_group:
            contact.groups.add(default_group)

        if not contact.name:
            contact.name = 'Anonymous User'
        contact.save()

        total_ureporters = Contact.objects.exclude(connection__identity__in=Blacklist.objects.values_list('connection__identity')).count()
        if total_ureporters % getattr(settings, 'USER_MILESTONE', 500) == 0:
            recipients = getattr(settings, 'ADMINS', None)
            if recipients:
                recipients = [email for name, email in recipients]
            mgr = getattr(settings, 'MANAGERS', None)
            if mgr:
                for email in mgr:
                    recipients.append(email)
            send_mail("UReport now %d voices strong!" % total_ureporters, "%s (%s) was the %dth member to finish the sign-up.  Let's welcome them!" % (contact.name, connection.identity, total_ureporters), '*****@*****.**', recipients, fail_silently=True)
Ejemplo n.º 19
0
def emis_autoreg(**kwargs):

    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'emis_autoreg':
        return

    session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by('-end_time')[0]
    script = progress.script

    role_poll = script.steps.get(order=1).poll
    district_poll = script.steps.get(order=2).poll
    subcounty_poll = script.steps.get(order=3).poll
    school_poll = script.steps.get(order=4).poll
    schools_poll = script.steps.get(order=5).poll
    name_poll = script.steps.get(order=6).poll

    if not connection.contact:
#            connection.contact = Contact.objects.create()
            connection.contact = EmisReporter.objects.create()
            connection.save
    contact = connection.contact

    role = find_best_response(session, role_poll)

    group = Group.objects.get(name='Other EMIS Reporters')
    default_group = group
    if role:
        group = find_closest_match(role, Group.objects)
        if not group:
            group = default_group
    contact.groups.add(group)


    subcounty = find_best_response(session, subcounty_poll)
    district = find_best_response(session, district_poll)

    if subcounty:
        subcounty = find_closest_match(subcounty, Location.objects.filter(type__name='sub_county'))

    if subcounty:
        contact.reporting_location = subcounty
    elif district:
        contact.reporting_location = district
    else:
        contact.reporting_location = Location.tree.root_nodes()[0]

    name = find_best_response(session, name_poll)
    if name:
        name = ' '.join([n.capitalize() for n in name.lower().split(' ')])
        contact.name = name[:100]

    if not contact.name:
        contact.name = 'Anonymous User'
    contact.save()

    reporting_school = None
    school = find_best_response(session, school_poll)
    if school:
        if subcounty:
            reporting_school = find_closest_match(school, School.objects.filter(location__name__in=[subcounty], \
                                                                                location__type__name='sub_county'), True)
        elif district:
            reporting_school = find_closest_match(school, School.objects.filter(location__name__in=[district.name], \
                                                                            location__type__name='district'), True)
        else:
            reporting_school = find_closest_match(school, School.objects.filter(location__name=Location.tree.root_nodes()[0].name))
#        e = EmisReporter(pk=contact.pk)
#        e.school = reporting_school
#        e.save()
        contact.school = reporting_school
        contact.save()
    if not getattr(settings, 'TRAINING_MODE', False):
        # Now that you have their roll, they should be signed up for the periodic polling
        _schedule_monthly_script(group, connection, 'emis_abuse', 'last', ['Teachers', 'Head Teachers'])
        _schedule_monthly_script(group, connection, 'emis_meals', 20, ['Teachers', 'Head Teachers'])
        _schedule_monthly_script(group, connection, 'emis_school_administrative', 15, ['Teachers', 'Head Teachers'])

        start_of_term = getattr(settings, 'SCHOOL_TERM_START', datetime.datetime.now())
        if group.name in ['Teachers', 'Head Teachers']:
            sp = ScriptProgress.objects.create(connection=connection, script=Script.objects.get(slug='emis_annual'))
            sp.set_time(start_of_term + datetime.timedelta(14))

        _schedule_monthly_script(group, connection, 'emis_smc_monthly', 28, ['SMC'])

        holidays = getattr(settings, 'SCHOOL_HOLIDAYS', [])
        if group.name in ['SMC']:
            d = datetime.datetime.now()
            # get the date to a wednesday
            d = d + datetime.timedelta((2 - d.weekday()) % 7)
            in_holiday = True
            while in_holiday:
                in_holiday = False
                for start, end in holidays:
                    if d >= start and d <= end:
                        in_holiday = True
                        break
                if in_holiday:
                    d = d + datetime.timedelta(7)
            sp = ScriptProgress.objects.create(connection=connection, script=Script.objects.get(slug='emis_head_teacher_presence'))
            sp.set_time(d)
Ejemplo n.º 20
0
    if subcounty:
        contact.reporting_location = subcounty
    elif district:
        contact.reporting_location = district
    else:
        contact.reporting_location = Location.tree.root_nodes()[0]

    if name:
        contact.name = name

    if not contact.name:
        contact.name = "Anonymous User"
    contact.save()

    reporting_school = None
    school = find_best_response(session, school_poll)
    if school:
        if subcounty:
            reporting_school = find_closest_match(
                school, School.objects.filter(location__name__in=[subcounty], location__type__name="sub_county"), True
            )
        elif district:
            reporting_school = find_closest_match(
                school, School.objects.filter(location__name__in=[district.name], location__type__name="district"), True
            )
        else:
            reporting_school = find_closest_match(
                school, School.objects.filter(location__name=Location.tree.root_nodes()[0].name)
            )
        if reporting_school:
            contact.schools.add(reporting_school)
Ejemplo n.º 21
0
def edtrac_autoreg(**kwargs):
    connection = kwargs['connection']
    progress = kwargs['sender']
    if not progress.script.slug == 'edtrac_autoreg':
        return
    session = ScriptSession.objects.filter(
        script=progress.script,
        connection=connection
    ).order_by('-end_time')[0]
    script = progress.script
    role_poll = script.steps.get(poll__name='edtrac_role').poll
    gender_poll = script.steps.get(poll__name='edtrac_gender').poll
    class_poll = script.steps.get(poll__name='edtrac_class').poll
    district_poll = script.steps.get(poll__name='edtrac_district').poll
    subcounty_poll = script.steps.get(poll__name='edtrac_subcounty').poll
    school_poll = script.steps.get(poll__name='edtrac_school').poll
    name_poll = script.steps.get(poll__name='edtrac_name').poll

    name = find_best_response(session, name_poll)
    role = find_best_response(session, role_poll)
    gender = find_best_response(session, gender_poll)
    grade = find_best_response(session, class_poll)
    subcounty = find_best_response(session, subcounty_poll)
    district = find_best_response(session, district_poll)

    if name:
        name = ' '.join([n.capitalize() for n in name.lower().split()])[:100]
    if district:
        district = find_closest_match(
            district,
            Location.objects.filter(type='district')
        )

    if subcounty:
        if district:
            subcounty = find_closest_match(
                subcounty,
                district.get_descendants().filter(type='sub_county')
            )
        else:
            subcounty = find_closest_match(
                subcounty,
                Location.objects.filter(type='sub_county')
            )

    grp = match_group_response(session, role, role_poll)

    if subcounty:
        rep_location = subcounty
    elif district:
        rep_location = district
    else:
        rep_location = Location.tree.root_nodes()[0]
    try:
        contact = connection.contact or EmisReporter.objects.get(
            name=name,
            reporting_location=rep_location,
            groups=grp,
            connection=connection
        )
        if connection.contact:
            contact = EmisReporter.objects.get(pk=connection.contact.pk)
    except EmisReporter.DoesNotExist, EmisReporter.MultipleObectsReturned:
        contact = EmisReporter.objects.create()
Ejemplo n.º 22
0
def autoreg(**kwargs):
    connection = kwargs['connection']
    progress = kwargs['sender']
    if progress.script.slug and progress.script.slug in [
            'ureport_autoreg2', 'ureport_autoreg_luo2'
    ]:
        connection.contact = Contact.objects.create(name='Anonymous User')
        connection.save()
        session = ScriptSession.objects.filter(
            script=progress.script,
            connection=connection).order_by('-end_time')[0]
        script = progress.script
        youthgrouppoll = script.steps.get(order=1).poll
        districtpoll = script.steps.get(order=2).poll
        agepoll = script.steps.get(order=4).poll
        genderpoll = script.steps.get(order=5).poll
        villagepoll = script.steps.get(order=6).poll
        contact = connection.contact
        word_dict = dict(
            AutoregGroupRules.objects.exclude(values=None).exclude(
                closed=True).values_list('group__name', 'values'))

        contact.reporting_location = find_best_response(session, districtpoll)

        age = find_best_response(session, agepoll)
        if age and age < 100:
            contact.birthdate = datetime.datetime.now() - datetime.timedelta(
                days=(365 * int(age)))

        gresps = session.responses.filter(
            response__poll=genderpoll,
            response__has_errors=False).order_by('-response__date')
        if gresps.exists():
            gender = gresps[0].response
            if gender.categories.filter(category__name='male').exists():
                contact.gender = 'M'
            elif gender.categories.filter(category__name='female').exists():
                contact.gender = 'F'

        village = find_best_response(session, villagepoll)
        if village:
            contact.village_name = check_location_length(village)

        group_to_match = find_best_response(session, youthgrouppoll)
        gr_matched = False

        #to avoid an attempt to None.split()
        if group_to_match:
            try:
                for group_pk, word_list in word_dict.items():
                    for word in word_list.split(","):
                        if word in group_to_match.split():
                            try:
                                contact.groups.add(
                                    Group.objects.get(name=group_pk))
                            except (ValueError, Group.DoesNotExist):
                                try:
                                    contact.groups.add(
                                        Group.objects.get(pk=group_pk))
                                except (ValueError, Group.DoesNotExist):
                                    pass
                            gr_matched = True
            except AssertionError:
                pass
        default_group = None
        if progress.language:
            contact.language = progress.language
        if Group.objects.filter(name='Other uReporters').exists():
            default_group = Group.objects.get(name='Other uReporters')
        if group_to_match and not gr_matched:

            for g in re.findall(r'\w+', group_to_match):
                if g:
                    excluded = AutoregGroupRules.objects.filter(
                        closed=True).values('group__pk')
                    group = find_closest_match(
                        str(g), Group.objects.exclude(pk__in=excluded))
                    if group:
                        contact.groups.add(group)
                        break

            if default_group:
                contact.groups.add(default_group)
        elif default_group:
            contact.groups.add(default_group)

        if not contact.name:
            contact.name = 'Anonymous User'
        contact.save()

        total_ureporters = Contact.objects.exclude(
            connection__identity__in=Blacklist.objects.values_list(
                'connection__identity')).count()
        if total_ureporters % getattr(settings, 'USER_MILESTONE', 500) == 0:
            recipients = getattr(settings, 'ADMINS', None)
            if recipients:
                recipients = [email for name, email in recipients]
            mgr = getattr(settings, 'MANAGERS', None)
            if mgr:
                for email in mgr:
                    recipients.append(email)
            send_mail(
                "UReport now %d voices strong!" % total_ureporters,
                "%s (%s) was the %dth member to finish the sign-up.  Let's welcome them!"
                % (contact.name, connection.identity, total_ureporters),
                '*****@*****.**',
                recipients,
                fail_silently=True)
Ejemplo n.º 23
0
    def handle(self, **options):
        try:

            #get contacts without a connection
            contacts=Contact.objects.filter(connection=None)
            contacts_pks=contacts.values_list('pk')

            #get poll responses which point to these contacts and re align

            responses=Response.objects.filter(contact__pk__in=contacts_pks)

            for response in responses:
                response.contact=response.message.connection.contact
                response.save()

            #get connections without a contact
            
            conns=Connection.objects.filter(contact=None)
            conns_sessions=ScriptSession.objects.filter(connection__in=conns)
            for session in conns_sessions:
                connection=session.connection
                connection.contact = Contact.objects.create(name='Anonymous User')
                connection.save()

                script=session.script

                youthgrouppoll = script.steps.get(order=1).poll
                districtpoll = script.steps.get(order=3).poll
                namepoll = script.steps.get(order=5).poll
                agepoll = script.steps.get(order=6).poll
                genderpoll = script.steps.get(order=7).poll
                villagepoll = script.steps.get(order=8).poll
                contact = connection.contact
                name = find_best_response(session, namepoll)
                if name:
                    contact.name = name[:100]
            
                contact.reporting_location = find_best_response(session, districtpoll)

                age = find_best_response(session, agepoll)
                if age and age < 100:
                    contact.birthdate = datetime.datetime.now() - datetime.timedelta(days=(365 * int(age)))

                gresps = session.responses.filter(response__poll=genderpoll, response__has_errors=False).order_by('-response__date')
                if gresps.count():
                    gender = gresps[0].response
                    if gender.categories.filter(category__name='male').count():
                        contact.gender = 'M'
                    elif gender.categories.filter(category__name='female').exists():
                        contact.gender = 'F'

                village = find_best_response(session, villagepoll)
                if village:
                    contact.village = find_closest_match(village, Location.objects.filter(type__slug="village"))

                group_to_match = find_best_response(session, youthgrouppoll)
                default_group = None

                if Group.objects.filter(name='Other uReporters').count():
                    default_group = Group.objects.get(name='Other uReporters')
                if group_to_match:
                    for g in re.findall(r'\w+', group_to_match):
                        if g:
                            group = find_closest_match(str(g), Group.objects)
                            if group:
                                contact.groups.add(group)
                                break

                    if default_group:
                        contact.groups.add(default_group)
                elif default_group:
                    contact.groups.add(default_group)


                
            conns2=Connection.objects.filter(contact=None)
            #now delete connection less contacts
            Contact.objects.filter(connection=None).delete()
            #go ahead and create contacts for all connections
            for conn in conns2:
                conn.contact = Contact.objects.create(name='Anonymous User')
                conn.save()

            


        except Exception, exc:
            print traceback.format_exc(exc)
Ejemplo n.º 24
0
def autoreg(**kwargs):
    connection = kwargs["connection"]
    progress = kwargs["sender"]
    if progress.script.slug and progress.script.slug in ["ureport_autoreg2", "ureport_autoreg_luo2"]:
        connection.contact = Contact.objects.create(name="Anonymous User")
        connection.save()
        session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by("-end_time")[0]
        script = progress.script
        youthgrouppoll = script.steps.get(order=1).poll
        districtpoll = script.steps.get(order=2).poll
        agepoll = script.steps.get(order=4).poll
        genderpoll = script.steps.get(order=5).poll
        villagepoll = script.steps.get(order=6).poll
        contact = connection.contact
        word_dict = dict(
            AutoregGroupRules.objects.exclude(values=None).exclude(closed=True).values_list("group__name", "values")
        )

        contact.reporting_location = find_best_response(session, districtpoll)

        age = find_best_response(session, agepoll)
        if age and age < 100:
            contact.birthdate = datetime.datetime.now() - datetime.timedelta(days=(365 * int(age)))

        gresps = session.responses.filter(response__poll=genderpoll, response__has_errors=False).order_by(
            "-response__date"
        )
        if gresps.exists():
            gender = gresps[0].response
            if gender.categories.filter(category__name="male").exists():
                contact.gender = "M"
            elif gender.categories.filter(category__name="female").exists():
                contact.gender = "F"

        village = find_best_response(session, villagepoll)
        if village:
            contact.village = village

        group_to_match = find_best_response(session, youthgrouppoll)
        gr_matched = False

        # to avoid an attempt to None.split()
        if group_to_match:
            try:
                for group_pk, word_list in word_dict.items():
                    for word in word_list.split(","):
                        if word in group_to_match.split():
                            try:
                                contact.groups.add(Group.objects.get(name=group_pk))
                            except (ValueError, Group.DoesNotExist):
                                try:
                                    contact.groups.add(Group.objects.get(pk=group_pk))
                                except (ValueError, Group.DoesNotExist):
                                    pass
                            gr_matched = True
            except AssertionError:
                pass
        default_group = None
        if progress.language:
            contact.language = progress.language
        if Group.objects.filter(name="Other uReporters").exists():
            default_group = Group.objects.get(name="Other uReporters")
        if group_to_match and not gr_matched:

            for g in re.findall(r"\w+", group_to_match):
                if g:
                    excluded = AutoregGroupRules.objects.filter(closed=True).values("group__pk")
                    group = find_closest_match(str(g), Group.objects.exclude(pk__in=excluded))
                    if group:
                        contact.groups.add(group)
                        break

            if default_group:
                contact.groups.add(default_group)
        elif default_group:
            contact.groups.add(default_group)

        if not contact.name:
            contact.name = "Anonymous User"
        contact.save()

        total_ureporters = Contact.objects.exclude(
            connection__identity__in=Blacklist.objects.values_list("connection__identity")
        ).count()
        if total_ureporters % getattr(settings, "USER_MILESTONE", 500) == 0:
            recipients = getattr(settings, "ADMINS", None)
            if recipients:
                recipients = [email for name, email in recipients]
            mgr = getattr(settings, "MANAGERS", None)
            if mgr:
                for email in mgr:
                    recipients.append(email)
            send_mail(
                "UReport now %d voices strong!" % total_ureporters,
                "%s (%s) was the %dth member to finish the sign-up.  Let's welcome them!"
                % (contact.name, connection.identity, total_ureporters),
                "*****@*****.**",
                recipients,
                fail_silently=True,
            )
Ejemplo n.º 25
0
def mr_autoreg(**kwargs):
    connection = kwargs['connection']
    progress   = kwargs['sender']
    escargot   = progress.script.slug
    session = ScriptSession.objects.filter(script=progress.script, connection=connection).order_by('-end_time')[0]
    script = progress.script

    if escargot == 'mrs_opt_out':
        # ScriptProgress.objects.get(connection = connection).delete()
        # connection.delete()
        # Connection.objects.get(pk=connection.pk).delete()
        pass
    elif escargot == 'mrs_autoreg':
        location_poll   = script.steps.get(poll__name='mrs_location').poll
        locationcr_poll = script.steps.get(poll__name='mrs_location_corrector').poll
        menses_poll     = script.steps.get(poll__name='mrs_mensesweeks').poll
        visits_poll     = script.steps.get(poll__name='mrs_anc_visits').poll
        contact         = connection.contact
        contact.reporting_location = Location.tree.root_nodes()[0]
        locness = find_best_response(session, location_poll)
        if locness and locness.type.slug == 'district':
          contact.reporting_location = locness
        else:
          locness = find_best_response(session, locationcr_poll)
          if locness and locness.type.slug == 'district':
            contact.reporting_location = locness
          else:
            contact.reporting_location = find_best_response(session, location_poll) or find_best_response(session, locationcr_poll) or Location.tree.root_nodes()[0]
        #   TODO:   What to do for the names?
        last_menses = find_best_response(session, menses_poll)
        if last_menses != None:
            contact.last_menses = datetime.now() - timedelta(weeks = max(last_menses, 1.0))
        contact.anc_visits = find_best_response(session, visits_poll) or 0
        contact.save()
    elif escargot == 'mrs_hw_autoreg':
        district_poll = script.steps.get(poll__name='hw_district').poll
        hc_poll       = script.steps.get(poll__name='hw_healthcentre').poll
        hclevel_poll  = script.steps.get(poll__name='hw_hclevel').poll
        name_poll     = script.steps.get(poll__name='hw_name').poll

        #   TODO: Is this even legal in this country?
        contact, _ = HealthProvider.objects.get_or_create(pk = connection.contact.pk)
        try:
            place = find_best_response(session, district_poll)
            if not place: [][0]
            matching = Location.objects.filter(name__icontains = place,type="district")[0]
            contact.reporting_location = matching
        except IndexError:
            contact.reporting_location = Location.tree.root_nodes[0]
        name = find_best_response(session, name_poll)

        if name:
            name = ' '.join([n.capitalize() for n in name.lower().split(' ')])
            contact.name = name[:100]

        #   TODO: Tell Marcus the dox need to change to reflect this.
        #   Apparently, we need not bother with this.
        #   facility_type = HealthFacilityType()
        facility = HealthFacility(
                    #   TODO: Turn location into a Point.
                    #   location  = contact.reporting_location,
                    #       type  = facility_type,
                        name  = find_best_response(session, hc_poll))
        contact.facility = facility
        contact.save()
    elif escargot == 'mrs_hw_reminder':
        qn1 = script.steps.get(poll__name = 'hw_question_1').poll
        qn2 = script.steps.get(poll__name = 'hw_question_2').poll
        qn3 = script.steps.get(poll__name = 'hw_question_3').poll
        qn4 = script.steps.get(poll__name = 'hw_question_4').poll

        contact     = HealthProvider.objects.get(pk = connection.contact.pk)
        first_anc   = find_best_response(session, qn1)
        fourth_anc  = find_best_response(session, qn2)
        art_treated = find_best_response(session, qn3)
        hiv_diag    = find_best_response(session, qn4)

        questionnaire = Questionnaire(
            health_worker   = contact,
            first_anc_visit = first_anc,
           fourth_anc_visit = fourth_anc,
           art_treated_mums = art_treated,
           six_month_hiv_diag = hiv_diag)
        questionnaire.save()