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}))
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)
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
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)
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()
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
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
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()
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
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()
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()
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'
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
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
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)
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()
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(
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)
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)
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)
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()
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)
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)
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, )
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()