Exemple #1
0
    def POST(self):
        params = web.input(district="", subcounty="")
        if params.district and params.subcounty:
            if USE_OLD_WEBHOOKS:
                patient_id = get_webhook_msg_old(params, 'patient_id')
                patient_age = get_webhook_msg_old(params, 'patient_age')
                patient_sex = get_webhook_msg_old(params, 'patient_sex')
            else:
                payload = json.loads(web.data())
                patient_id = get_webhook_msg(payload, 'patient_id')
                patient_age = get_webhook_msg(payload, 'patient_age')
                patient_sex = get_webhook_msg(payload, 'patient_sex')

            district_contacts = CARAMAL_RESEARCH_TEAM.get(params.district, '')
            if district_contacts:
                subcounty_team_contacts = district_contacts.get(params.subcounty, '')
                if subcounty_team_contacts:
                    # time to schedule reminder accordingly
                    msg = (
                        "Patient with ID %s, age of %s and sex %s is "
                        "due for follow up 3 days from now." % (
                            patient_id, int(float(patient_age)), patient_sex))
                    sms_params = {'text': msg, 'to': subcounty_team_contacts}

                    current_time = datetime.datetime.now()
                    run_time = current_time + datetime.timedelta(days=25)
                    queue_schedule(db, sms_params, run_time, None, 'sms')
                    return json.dumps({"message": "scheduled successfully"})

        return json.dumps({"message": "success"})
Exemple #2
0
 def POST(self, id):
     params = web.input(to_subcounty="", sms="")
     session = get_session()
     subcounty_reporters = get_location_role_reporters(
         db, params.to_subcounty, config['subcounty_reporters'])
     if not subcounty_reporters:
         return "<h4>No reporters</h4>"
     sms_params = {'text': params.sms, 'to': ' '.join(subcounty_reporters)}
     current_time = datetime.datetime.now()
     sched_time = current_time + datetime.timedelta(minutes=1)
     queue_schedule(db, sms_params, sched_time, session.sesid)
     return "<h4>Successfully sent notification SMS</h4>"
    def POST(self):
        params = web.input(firstname="",
                           lastname="",
                           gender="",
                           telephone="",
                           email="",
                           location="",
                           role="",
                           alt_telephone="",
                           page="1",
                           ed="",
                           d_id="",
                           district="",
                           facility="",
                           code="",
                           date_of_birth="",
                           national_id="",
                           caller="",
                           user="******",
                           districtname="",
                           subcounty="",
                           parish="",
                           subcountyname="",
                           parishname="",
                           villagename="",
                           facilityname="")
        if params.caller != 'api':
            session = get_session()
            username = session.username
            userid = session.sesid
        else:
            rs = db.query(
                "SELECT id, username FROM users WHERE username = '******';" %
                params.user)
            if rs:
                xuser = rs[0]
                userid = xuser['id']
                username = xuser['username']

        allow_edit = False
        try:
            edit_val = int(params.ed)
            allow_edit = True
        except:
            pass
        facilityuid = ""
        rs = db.query("SELECT code FROM healthfacilities WHERE id = %s;" %
                      params.facility)
        if rs:
            facilityuid = rs[0]['code']

        current_time = datetime.datetime.now()
        # Set params to schedule a push_contact to Push reporter to RapidPro
        urns = []
        if params.alt_telephone:
            try:
                alt_telephone = format_msisdn(params.alt_telephone)
                urns.append("tel:" + alt_telephone)
            except:
                alt_telephone = ''
        if params.telephone:
            try:
                telephone = format_msisdn(params.telephone)
                urns.append("tel:" + telephone)
            except:
                telephone = ''
        contact_params = {
            'urns': urns,
            'name': params.firstname + ' ' + params.lastname,
            # 'groups': ['%s' % rolesById[int(params.role)]],
            'fields': {
                # 'email': params.email,
                'gender': params.gender,
                'facility': params.facilityname,
                'village': params.villagename,
                'district': params.districtname,
                'sub_county': params.subcountyname,
                'parish': params.parishname,
                'facilityuid': facilityuid,
                'type': '%s' % rolesById[int(params.role)]
            }
        }

        with db.transaction():
            if params.ed and allow_edit:
                location = params.location if params.location else None
                date_of_birth = params.date_of_birth if params.date_of_birth else None
                r = db.query(
                    "UPDATE reporters SET firstname=$firstname, lastname=$lastname, gender=$gender, "
                    "telephone=$telephone, reporting_location=$location, "
                    "alternate_tel=$alt_tel, district_id = $district_id, facilityid=$facility, "
                    "code=$code, date_of_birth=$date_of_birth, national_id=$national_id "
                    "WHERE id=$id RETURNING id", {
                        'firstname': params.firstname,
                        'lastname': params.lastname,
                        'gender': params.gender,
                        'telephone': params.telephone,
                        'location': location,
                        'id': params.ed,
                        'alt_tel': params.alt_telephone,
                        'district_id': params.district,
                        'code': params.code,
                        'date_of_birth': date_of_birth,
                        'national_id': params.national_id,
                        'facility': params.facility
                    })
                if r:
                    db.query(
                        "UPDATE reporters SET groups = $groups::INTEGER[], "
                        " jparents = $ancestors WHERE id = $id", {
                            'id':
                            params.ed,
                            'groups':
                            str([int(params.role)]).replace('[', '{').replace(
                                ']', '}').replace('\'', '\"'),
                            'ancestors':
                            psycopg2.extras.Json(
                                {
                                    'd': params.district,
                                    's': params.subcounty,
                                    'p': params.parish
                                },
                                dumps=simplejson.dumps)
                        })

                    log_dict = {
                        'logtype':
                        'Web',
                        'action':
                        'Update',
                        'actor':
                        username,
                        'ip':
                        web.ctx['ip'],
                        'descr':
                        'Updated reporter %s:%s (%s)' %
                        (params.ed, params.firstname + ' ' + params.lastname,
                         params.telephone),
                        'user':
                        userid
                    }
                    audit_log(db, log_dict)

                    sync_time = current_time + datetime.timedelta(seconds=60)
                    queue_schedule(db, contact_params, sync_time, userid,
                                   'push_contact', params.ed)
                if params.caller == 'api':
                    web.header("Content-Type",
                               "application/json; charset=utf-8")
                    return json.dumps(
                        {'message': 'Reporter edited successfully.'})

                else:
                    return web.seeother("/reporters")
            else:
                location = params.location if params.location else None
                has_reporter = db.query(
                    "SELECT id FROM reporters WHERE telephone = $tel",
                    {'tel': params.telephone})
                if has_reporter:
                    if params.caller == 'api':
                        web.header("Content-Type",
                                   "application/json; charset=utf-8")
                        return json.dumps({
                            'message':
                            "Reporter with Telephone:%s already registered" %
                            params.telephone
                        })
                    else:
                        session.rdata_err = (
                            "Reporter with Telephone:%s already registered" %
                            params.telephone)
                        return web.seeother("/reporters")
                if params.caller != 'api':
                    session.rdata_err = ""
                r = db.query(
                    "INSERT INTO reporters (firstname, lastname, gender, telephone, "
                    " reporting_location, alternate_tel, "
                    " district_id, code, date_of_birth, national_id, facilityid) VALUES "
                    " ($firstname, $lastname, $gender, $telephone, $location, "
                    " $alt_tel, $district_id, $code, $date_of_birth, $national_id, $facilityid) RETURNING id",
                    {
                        'firstname':
                        params.firstname,
                        'lastname':
                        params.lastname,
                        'gender':
                        params.gender,
                        'telephone':
                        params.telephone,
                        'location':
                        location,
                        'alt_tel':
                        params.alt_telephone,
                        'district_id':
                        params.district,
                        'code':
                        params.code,
                        'date_of_birth':
                        params.date_of_birth if params.date_of_birth else None,
                        'national_id':
                        params.national_id,
                        'facilityid':
                        params.facility
                    })
                if r:
                    reporter_id = r[0]['id']

                    db.query(
                        "UPDATE reporters SET groups = $groups::INTEGER[], "
                        " jparents = $ancestors WHERE id = $id", {
                            'id':
                            reporter_id,
                            'groups':
                            str([int(params.role)]).replace('[', '{').replace(
                                ']', '}').replace('\'', '\"'),
                            'ancestors':
                            psycopg2.extras.Json(
                                {
                                    'd': params.district,
                                    's': params.subcounty,
                                    'p': params.parish
                                },
                                dumps=simplejson.dumps)
                        })

                    log_dict = {
                        'logtype':
                        'Web',
                        'action':
                        'Create',
                        'actor':
                        username,
                        'ip':
                        web.ctx['ip'],
                        'descr':
                        'Created reporter %s:%s (%s)' %
                        (reporter_id, params.firstname + ' ' + params.lastname,
                         params.telephone),
                        'user':
                        userid
                    }

                    audit_log(db, log_dict)

                    sync_time = current_time + datetime.timedelta(seconds=60)
                    queue_schedule(db, contact_params, sync_time, userid,
                                   'push_contact', reporter_id)
                if params.caller == 'api':
                    web.header("Content-Type",
                               "application/json; charset=utf-8")
                    return json.dumps({'message': 'success'})
                else:
                    return web.seeother("/reporters?show=true")

        l = locals()
        del l['self']
        if params.caller == 'api':
            pass
        else:
            return render.reporters(**l)
Exemple #4
0
    def POST(self):
        params = web.input(firstname="",
                           lastname="",
                           gender="",
                           telephone="",
                           email="",
                           location="",
                           role=[],
                           alt_telephone="",
                           page="1",
                           ed="",
                           d_id="",
                           district="",
                           facility="",
                           code="",
                           date_of_birth="",
                           caller="",
                           user="******")
        if params.caller != 'api':
            session = get_session()
            username = session.username
            userid = session.sesid
        else:
            rs = db.query(
                "SELECT id, username FROM users WHERE username = '******';" %
                params.user)
            if rs:
                xuser = rs[0]
                userid = xuser['id']
                username = xuser['username']

        allow_edit = False
        try:
            edit_val = int(params.ed)
            allow_edit = True
        except:
            pass
        current_time = datetime.datetime.now()
        # Set params to schedule a push_contact to Push reporter to RapidPro
        urns = []
        if params.alt_telephone:
            try:
                alt_telephone = format_msisdn(params.alt_telephone)
                urns.append("tel:" + alt_telephone)
            except:
                alt_telephone = ''
        if params.telephone:
            try:
                telephone = format_msisdn(params.telephone)
                urns.append("tel:" + telephone)
            except:
                telephone = ''
        groups = ['%s' % rolesById[int(i)] for i in params.role]
        contact_params = {
            'urns': urns,
            'name': params.firstname + ' ' + params.lastname,
            'groups': groups,
            'fields': {
                # 'email': params.email,
                'type': 'VHT' if 'VHT' in groups else 'HC'
            }
        }

        with db.transaction():
            if params.ed and allow_edit:
                location = params.location if params.location else None
                r = db.query(
                    "UPDATE reporters SET firstname=$firstname, lastname=$lastname, "
                    "telephone=$telephone, reporting_location=$location, "
                    "alternate_tel=$alt_tel, district_id = $district_id "
                    "WHERE id=$id RETURNING id", {
                        'firstname': params.firstname,
                        'lastname': params.lastname,
                        'gender': params.gender,
                        'telephone': params.telephone,
                        'location': location,
                        'id': params.ed,
                        'alt_tel': params.alt_telephone,
                        'district_id': params.district
                    })
                if r:
                    for group_id in params.role:
                        rx = db.query(
                            "SELECT id FROM reporter_groups_reporters "
                            "WHERE reporter_id = $id AND group_id =$gid ", {
                                'gid': group_id,
                                'id': params.ed
                            })
                        if not rx:
                            db.query(
                                "INSERT INTO reporter_groups_reporters (group_id, reporter_id) "
                                " VALUES ($group_id, $reporter_id)", {
                                    'group_id': group_id,
                                    'reporter_id': params.ed
                                })
                    # delete other groups
                    db.query(
                        "DELETE FROM reporter_groups_reporters WHERE "
                        "reporter_id=$id AND group_id NOT IN $roles", {
                            'id': params.ed,
                            'roles': params.role
                        })

                    log_dict = {
                        'logtype':
                        'Web',
                        'action':
                        'Update',
                        'actor':
                        username,
                        'ip':
                        web.ctx['ip'],
                        'descr':
                        'Updated reporter %s:%s (%s)' %
                        (params.ed, params.firstname + ' ' + params.lastname,
                         params.telephone),
                        'user':
                        userid
                    }
                    audit_log(db, log_dict)

                    sync_time = current_time + datetime.timedelta(seconds=60)
                    if urns:  # only queue if we have numbers
                        queue_schedule(db, contact_params, sync_time, userid,
                                       'contact_push')
                return web.seeother("/reporters")
            else:
                location = params.location if params.location else None
                has_reporter = db.query(
                    "SELECT id FROM reporters WHERE telephone = $tel",
                    {'tel': params.telephone})
                if has_reporter:
                    reporterid = has_reporter[0]["id"]
                    rx = db.query(
                        "UPDATE reporters SET firstname=$firstname, lastname=$lastname, "
                        "telephone=$telephone, reporting_location=$location, "
                        "alternate_tel=$alt_tel, district_id = $district_id "
                        "WHERE id=$id RETURNING id", {
                            'firstname': params.firstname,
                            'lastname': params.lastname,
                            'gender': params.gender,
                            'telephone': params.telephone,
                            'location': location,
                            'id': reporterid,
                            'alt_tel': params.alt_telephone,
                            'district_id': params.district
                        })
                    if params.caller == 'api':
                        return json.dumps({
                            'message':
                            "Reporter with Telephone:%s already registered" %
                            params.telephone
                        })
                    else:
                        session.rdata_err = (
                            "Reporter with Telephone:%s already registered" %
                            params.telephone)
                        return web.seeother("/reporters")
                if params.caller != 'api':
                    session.rdata_err = ""
                r = db.query(
                    "INSERT INTO reporters (firstname, lastname, telephone, "
                    " reporting_location, alternate_tel, "
                    " district_id) VALUES "
                    " ($firstname, $lastname, $telephone, $location, "
                    " $alt_tel, $district_id) RETURNING id", {
                        'firstname': params.firstname,
                        'lastname': params.lastname,
                        'telephone': params.telephone,
                        'location': location,
                        'alt_tel': params.alt_telephone,
                        'district_id': params.district,
                    })
                if r:
                    reporter_id = r[0]['id']
                    db.query(
                        "INSERT INTO reporter_healthfacility (reporter_id, facility_id) "
                        "VALUES($reporter_id, $facility_id)", {
                            'reporter_id': reporter_id,
                            'facility_id': params.facility
                        })
                    for group_id in params.role:
                        db.query(
                            "INSERT INTO reporter_groups_reporters (group_id, reporter_id) "
                            " VALUES ($role, $reporter_id)", {
                                'role': group_id,
                                'reporter_id': reporter_id
                            })
                    log_dict = {
                        'logtype':
                        'Web',
                        'action':
                        'Create',
                        'actor':
                        username,
                        'ip':
                        web.ctx['ip'],
                        'descr':
                        'Created reporter %s:%s (%s)' %
                        (reporter_id, params.firstname + ' ' + params.lastname,
                         params.telephone),
                        'user':
                        userid
                    }
                    audit_log(db, log_dict)

                    sync_time = current_time + datetime.timedelta(seconds=60)
                    if contact_params['urns']:
                        queue_schedule(db, contact_params, sync_time, userid,
                                       'contact_push')
                if params.caller == 'api':
                    return json.dumps({'message': 'success'})
                else:
                    return web.seeother("/reporters?show=true")

        l = locals()
        del l['self']
        if params.caller == 'api':
            pass
        else:
            return render.reporters(**l)
Exemple #5
0
                'firstname': _firstname,
                'lastname': _lastname,
                'telephone': telephone,
                'alternate_tel': alt_telephone
            })
        if res:
            reporter_id = res[0]['id']

    contact_params = {
        'urns': urns,
        'name': _firstname + ' ' + _lastname,
        'fields': {
            # 'email': params.email,
            'gender': _gender,
            'registered_by': 'CHWR',
            'type': _role,
            'facility': _fac,
            'facilityuid': _facility_code,
            'district': _district,
            'sub_county': _subcounty,
            'parish': _parish,
            'village': _village,
        }
    }

    sync_time = current_time + datetime.timedelta(seconds=60)
    queue_schedule(db, contact_params, sync_time, None, 'push_contact',
                   reporter_id)

conn.close()
Exemple #6
0
    def POST(self):
        params = web.input(ed="",
                           d_id="",
                           district="",
                           subcounty="",
                           release_order="",
                           waybill="",
                           quantity_bales="",
                           warehouse="",
                           warehouse_branch="",
                           departure_date="",
                           departure_time="",
                           driver="",
                           driver_tel="",
                           remarks="",
                           track_no_plate="",
                           quantity_bales_old=0,
                           parish="")
        session = get_session()
        current_time = datetime.datetime.now()
        allow_edit = False
        try:
            edit_val = int(params.ed)
            allow_edit = True
        except ValueError:
            pass

        with db.transaction():
            if params.ed and allow_edit:
                q = db.query(
                    "SELECT id FROM reporters WHERE "
                    "replace(telephone, '+', '') = $tel OR "
                    "replace(alternate_tel, '+', '') = $tel",
                    {'tel': params.driver_tel.replace('+', '')})
                if q:
                    driver_id = q[0]['id']
                else:
                    q = db.query(
                        "INSERT INTO reporters (firstname, telephone, reporting_location) "
                        " VALUES ($name, $tel, 1) RETURNING id", {
                            'name': params.driver,
                            'tel': params.driver_tel
                        })
                    driver_id = q[0]['id']
                    db.query(
                        "INSERT INTO reporter_groups_reporters (group_id, reporter_id) "
                        "VALUES ((SELECT id FROM reporter_groups WHERE name = 'Driver'), $reporter_id)",
                        {'reporter_id': driver_id})

                    # Schedule a push_contact to Push driver to RapidPro
                    contact_params = {
                        'phone': params.driver_tel,
                        'name': params.driver,
                        'groups': ['Driver']
                    }

                    sync_time = current_time + datetime.timedelta(
                        seconds=5
                    )  # XXX consider making the seconds configurable
                    queue_schedule(db, contact_params, sync_time,
                                   session.sesid, 'push_contact')

                # check if new quantities leave us in a consistent state
                old_quantity = int(params.quantity_bales_old)
                quantity_bales = int(params.quantity_bales)
                if not can_still_distribute(db, quantity_bales, old_quantity):
                    session.ddata_err = (
                        "You cannot distribute more than is available for distribution!"
                    )
                    return web.seeother("/dispatch")
                session.ddata_err = ""
                r = db.query(
                    "UPDATE distribution_log SET release_order=$release_order, "
                    "destination=$destination, waybill=$waybill, warehouse_branch = $branch, "
                    "departure_date=$ddate, departure_time=$dtime, remarks=$remarks, "
                    "quantity_bales=$quantity_bales, quantity_nets=$quantity_nets, "
                    " district_id=$district, "
                    "delivered_by=$delivered_by WHERE id = $id RETURNING id", {
                        'release_order':
                        params.release_order,
                        'destination':
                        params.subcounty,
                        'waybill':
                        params.waybill,
                        'branch':
                        params.warehouse_branch,
                        'ddate':
                        params.departure_date,
                        'dtime':
                        params.departure_time,
                        'remarks':
                        params.remarks,
                        'quantity_bales':
                        params.quantity_bales,
                        'quantity_nets':
                        (QUANTITY_PER_BALE * int(params.quantity_bales)),
                        'delivered_by':
                        driver_id,
                        'district':
                        params.district,
                        'id':
                        params.ed
                    })

                if r:
                    data_id = r[0]['id']
                    subcounty = ""
                    district = ""
                    parish = ""
                    # get subcounty name to use in SMS
                    sc = db.query(
                        "SELECT get_location_name($subcounty) as name;",
                        {'subcounty': params.subcounty})
                    if sc:
                        subcounty = sc[0]['name']

                    # get parish name if available
                    par = db.query(
                        "SELECT get_location_name($parish) as name;",
                        {'parish': params.parish})
                    if par:
                        parish = par[0]['name']
                        db.query(
                            "UPDATE distribution_log SET dest_parish = $parish "
                            "WHERE id = $id", {
                                'parish': params.parish,
                                'id': data_id
                            })

                    # get district name to use in SMS
                    dist = db.query(
                        "SELECT get_location_name($district) as name;",
                        {'district': params.district})
                    if dist:
                        district = dist[0]['name']

                    # sched_time = time to send SMS
                    sched_time = current_time + datetime.timedelta(
                        minutes=SMS_OFFSET_TIME)

                    # appropriately edit scheduled messages
                    sms_args = {
                        'parish': parish,
                        'subcounty': subcounty,
                        'district': district,
                        'waybill': params.waybill,
                        'quantity': quantity_bales,
                        'shortcode': config.get('shortcode', '6400')
                    }
                    national_reporters = get_location_role_reporters(
                        db, 1, config['national_reporters'])
                    district_reporters = get_location_role_reporters(
                        db, params.district, config['district_reporters'])
                    district_reporters += get_location_role_reporters(
                        db, params.subcounty, ['Subcounty Supervisor'])
                    subcounty_reporters = get_location_role_reporters(
                        db, params.subcounty, config['subcounty_reporters'])
                    parish_reporters = get_location_role_reporters(
                        db, params.parish, config['parish_reporters'])

                    scheduled_msgs = db.query(
                        "SELECT a.schedule_id, a.level, a.triggered_by FROM distribution_log_schedules a, "
                        " schedules b WHERE a.distribution_log_id = $log_id AND "
                        " b.id = a.schedule_id AND b.status = 'ready' "
                        " AND a.triggered_by = 1",
                        {'log_id': data_id})  # XXX 'ready'
                    if scheduled_msgs:  # we still have ready schedules
                        for s in scheduled_msgs:
                            sched = db.query(
                                "SELECT id FROM schedules WHERE id = $sched_id "
                                "FOR UPDATE NOWAIT",
                                {'sched_id': s['schedule_id']})

                            # build SMS to send to notifying parties
                            sms_text = ""
                            if parish:
                                sms_text = config[
                                    'parish_nets_sms_prefix_template'] % sms_args
                            sms_text += config[
                                'national_sms_template'] % sms_args
                            if s['level'] == 'national':
                                sms_params = {
                                    'text': sms_text,
                                    'to': ' '.join(national_reporters)
                                }
                                update_queued_sms(db, s['schedule_id'],
                                                  sms_params, sched_time,
                                                  session.sesid)

                            elif s['level'] == 'district':
                                sms_params = {
                                    'text': sms_text,
                                    'to': ' '.join(district_reporters)
                                }
                                update_queued_sms(db, s['schedule_id'],
                                                  sms_params, sched_time,
                                                  session.sesid)

                            elif s['level'] == 'subcounty':
                                if subcounty_reporters and not parish:
                                    sms_text += (
                                        '\n Once received / offloaded, please send '
                                        '"REC %(waybill)s %(quantity)s" to %(shortcode)s'
                                        % sms_args)
                                sms_params = {
                                    'text': sms_text,
                                    'to': ' '.join(subcounty_reporters)
                                }
                                update_queued_sms(db, s['schedule_id'],
                                                  sms_params, sched_time,
                                                  session.sesid)
                            elif s['level'] == 'parish':
                                if parish_reporters:
                                    sms_text += (
                                        '\n Once received / offloaded, please send '
                                        '"REC %(waybill)s %(quantity)s" to %(shortcode)s'
                                        % sms_args)
                                    sms_params = {
                                        'text': sms_text,
                                        'to': ' '.join(parish_reporters)
                                    }
                                    update_queued_sms(db, s['schedule_id'],
                                                      sms_params, sched_time,
                                                      session.sesid)

                            elif s['level'] == 'driver':
                                if parish:
                                    driver_sms_text = config[
                                        'driver_parish_sms_template'] % sms_args
                                else:
                                    driver_sms_text = config[
                                        'driver_sms_template'] % sms_args
                                sms_params = {
                                    'text': driver_sms_text,
                                    'to': params.driver_tel
                                }
                                update_queued_sms(db, s['schedule_id'],
                                                  sms_params, sched_time,
                                                  session.sesid)
                    else:  # no ready schedules were found
                        sms_text = config['national_sms_template'] % sms_args
                        sms_params = {
                            'text': sms_text,
                            'to': ' '.join(district_reporters)
                        }
                        sched_id = queue_schedule(db, sms_params, sched_time,
                                                  session.sesid)
                        log_schedule(db, data_id, sched_id, 'district')
                        # print "+=======+=======+===>", district_reporters

                        sms_params = {
                            'text': sms_text,
                            'to': ' '.join(national_reporters)
                        }
                        sched_id = queue_schedule(db, sms_params, sched_time,
                                                  session.sesid)
                        log_schedule(db, data_id, sched_id, 'national')
                        # print "*=======*=======*===>", national_reporters
                        if subcounty_reporters and not parish:
                            sms_text += (
                                '\n Once received / offloaded, please send '
                                '"REC %(waybill)s %(quantity)s" to %(shortcode)s'
                                % sms_args)
                        sms_params = {
                            'text': sms_text,
                            'to': ' '.join(subcounty_reporters)
                        }
                        sched_id = queue_schedule(db, sms_params, sched_time,
                                                  session.sesid)
                        log_schedule(db, data_id, sched_id, 'subcounty')
                        # print "@=======@=======@===>", subcounty_reporters

                        if parish_reporters:
                            sms_text += (
                                '\n Once received / offloaded, please send '
                                '"REC %(waybill)s %(quantity)s" to %(shortcode)s'
                                % sms_args)
                            sms_params = {
                                'text': sms_text,
                                'to': ' '.join(parish_reporters)
                            }
                            sched_id = queue_schedule(db, sms_params,
                                                      sched_time,
                                                      session.sesid)
                            log_schedule(db, data_id, sched_id, 'parish')
                        # print "@=======@=======@===>", parish_reporters

                        # for the driver
                        if parish:
                            driver_sms_text = config[
                                'driver_parish_sms_template'] % sms_args
                        else:
                            driver_sms_text = config[
                                'driver_sms_template'] % sms_args

                        sms_params = {
                            'text': driver_sms_text,
                            'to': params.driver_tel
                        }
                        sched_id = queue_schedule(db, sms_params, sched_time,
                                                  session.sesid)
                        log_schedule(db, data_id, sched_id, 'driver')

                    log_dict = {
                        'logtype':
                        'Distribution',
                        'action':
                        'Update',
                        'actor':
                        session.username,
                        'ip':
                        web.ctx['ip'],
                        'descr':
                        'Updated distribution data id:%s, Waybill:%s, Qty (bales):%s'
                        % (data_id, params.waybill, params.quantity_bales),
                        'user':
                        session.sesid
                    }
                    audit_log(db, log_dict)
                return web.seeother("/dispatch")
            else:
                # check whether what we want to distribute is available in stock
                quantity_bales = int(params.quantity_bales)
                if not can_still_distribute(db, quantity_bales):
                    session.ddata_err = (
                        "You cannot distribute more than is available for distribution!"
                    )
                    return web.seeother("/dispatch")
                session.ddata_err = ""

                has_entry = db.query(
                    "SELECT id FROM distribution_log WHERE waybill=$waybill",
                    {'waybill': params.waybill})
                if has_entry:
                    session.ddata_err = (
                        "Entry with Waybill: %s already entered!" %
                        params.waybill)
                    return web.seeother("/dispatch")
                session.ddata_err = ""
                q = db.query("SELECT id FROM reporters WHERE telephone = $tel",
                             {'tel': params.driver_tel})
                if q:
                    driver_id = q[0]['id']
                else:
                    q = db.query(
                        "INSERT INTO reporters (firstname, telephone, reporting_location) "
                        " VALUES ($name, $tel, 1) RETURNING id", {
                            'name': params.driver,
                            'tel': params.driver_tel
                        })
                    driver_id = q[0]['id']
                    db.query(
                        "INSERT INTO reporter_groups_reporters (group_id, reporter_id) "
                        "VALUES ((SELECT id FROM reporter_groups WHERE name = 'Driver'), $reporter_id)",
                        {'reporter_id': driver_id})
                    # Schedule a push_contact to Push driver to RapidPro
                    contact_params = {
                        'phone': params.driver_tel,
                        'name': params.driver,
                        'groups': ['Driver'],
                    }

                    sync_time = current_time + datetime.timedelta(
                        seconds=10
                    )  # XXX consider making the seconds configurable
                    queue_schedule(db, contact_params, sync_time,
                                   session.sesid, 'push_contact')

                r = db.query(
                    "INSERT INTO distribution_log (source, dest, release_order, waybill, "
                    " quantity_bales, quantity_nets, remarks, warehouse_branch, "
                    " departure_date, departure_time, destination, delivered_by, created_by, "
                    " district_id, track_no_plate) "
                    "VALUES('national', 'subcounty', $release_order, $waybill, $quantity_bales, "
                    "$quantity_nets, $remarks, $branch, $ddate, $dtime, $destination, "
                    "$delivered_by, $user, $district, $noplate) "
                    "RETURNING id", {
                        'release_order':
                        params.release_order,
                        'waybill':
                        params.waybill,
                        'quantity_bales':
                        params.quantity_bales,
                        'quantity_nets':
                        (QUANTITY_PER_BALE * int(params.quantity_bales)),
                        'remarks':
                        params.remarks,
                        'branch':
                        params.warehouse_branch,
                        'ddate':
                        params.departure_date,
                        'dtime':
                        params.departure_time,
                        'destination':
                        params.subcounty,
                        'delivered_by':
                        driver_id,
                        'user':
                        session.sesid,
                        'noplate':
                        params.track_no_plate,
                        'district':
                        params.district
                    })
                if r:
                    log_id = r[0]['id']
                    subcounty = ""
                    district = ""
                    parish = ""
                    # get subcounty name to use in SMS
                    sc = db.query(
                        "SELECT get_location_name($subcounty) as name;",
                        {'subcounty': params.subcounty})
                    if sc:
                        subcounty = sc[0]['name']
                    # get parish name if available
                    par = db.query(
                        "SELECT get_location_name($parish) as name;",
                        {'parish': params.parish})
                    if par:
                        parish = par[0]['name']
                        db.query(
                            "UPDATE distribution_log SET dest_parish = $parish "
                            "WHERE id = $id", {
                                'parish': params.parish,
                                'id': log_id
                            })

                    # get district name to use in SMS
                    dist = db.query(
                        "SELECT get_location_name($district) as name;",
                        {'district': params.district})
                    if dist:
                        district = dist[0]['name']

                    # sched_time allows to give distribution_log edits sometime #SMS_OFFSET_TIME
                    sched_time = current_time + datetime.timedelta(
                        minutes=SMS_OFFSET_TIME)

                    # build SMS to send to notifying parties
                    sms_args = {
                        'parish': parish,
                        'subcounty': subcounty,
                        'district': district,
                        'waybill': params.waybill,
                        'quantity': quantity_bales,
                        'shortcode': config.get('shortcode', '6400')
                    }
                    sms_text = ""
                    if parish:
                        sms_text = config[
                            'parish_nets_sms_prefix_template'] % sms_args

                    sms_text += config['national_sms_template'] % sms_args

                    district_reporters = get_location_role_reporters(
                        db, params.district, config['district_reporters'])
                    district_reporters += get_location_role_reporters(
                        db, params.subcounty, ['Subcounty Supervisor'])
                    sms_params = {
                        'text': sms_text,
                        'to': ' '.join(district_reporters)
                    }
                    sched_id = queue_schedule(db, sms_params, sched_time,
                                              session.sesid)
                    log_schedule(db, log_id, sched_id, 'district')
                    # print "+=======+=======+===>", district_reporters

                    national_reporters = get_location_role_reporters(
                        db, 1, config['national_reporters'])
                    sms_params = {
                        'text': sms_text,
                        'to': ' '.join(national_reporters)
                    }
                    sched_id = queue_schedule(db, sms_params, sched_time,
                                              session.sesid)
                    log_schedule(db, log_id, sched_id, 'national')
                    # print "*=======*=======*===>", national_reporters

                    subcounty_reporters = get_location_role_reporters(
                        db, params.subcounty, config['subcounty_reporters'])
                    parish_reporters = get_location_role_reporters(
                        db, params.parish, config['parish_reporters'])

                    if subcounty_reporters and not parish:
                        sms_text += (
                            '\n Once received / offloaded, please send '
                            '"REC %(waybill)s %(quantity)s" to %(shortcode)s' %
                            sms_args)
                    sms_params = {
                        'text': sms_text,
                        'to': ' '.join(subcounty_reporters)
                    }
                    sched_id = queue_schedule(db, sms_params, sched_time,
                                              session.sesid)
                    log_schedule(db, log_id, sched_id, 'subcounty')
                    # print "@=======@=======@===>", subcounty_reporters

                    if parish_reporters:
                        sms_text += (
                            '\n Once received / offloaded, please send '
                            '"REC %(waybill)s %(quantity)s" to %(shortcode)s' %
                            sms_args)
                        sms_params = {
                            'text': sms_text,
                            'to': ' '.join(parish_reporters)
                        }
                        sched_id = queue_schedule(db, sms_params, sched_time,
                                                  session.sesid)
                        log_schedule(db, log_id, sched_id, 'parish')
                    # print "@=======@=======@===>", parish_reporters

                    # for the driver
                    if parish:
                        driver_sms_text = config[
                            'driver_parish_sms_template'] % sms_args
                    else:
                        driver_sms_text = config[
                            'driver_sms_template'] % sms_args
                    sms_params = {
                        'text': driver_sms_text,
                        'to': params.driver_tel
                    }
                    sched_id = queue_schedule(db, sms_params, sched_time,
                                              session.sesid)
                    log_schedule(db, log_id, sched_id, 'driver')

                    log_dict = {
                        'logtype':
                        'Distribution',
                        'action':
                        'Create',
                        'actor':
                        session.username,
                        'ip':
                        web.ctx['ip'],
                        'descr':
                        'Added distribution entry id:%s, Waybill:%s, Qty (bales):%s'
                        % (log_id, params.waybill, params.quantity_bales),
                        'user':
                        session.sesid
                    }
                    audit_log(db, log_dict)

                return web.seeother("/dispatch")

        l = locals()
        del l['self']
        return render.dispatch(**l)