示例#1
0
def set_begin(request):
    param = json.loads(request.body)

    days = param.get('days')
    target = set(param.get('target', []))

    if days is None or type(days) is not int:
        return util.res_json(EXTEND_EXPIRE_NO_DAYS)

    if len(target) == 0:
        return util.res_json(EXTEND_EXPIRE_NO_TARGET)

    if SwatchDeviceInfo.objects.filter(
            deveui__in=target).count() != len(target):
        return util.res_json(EXTEND_EXPIRE_INVALID_TARGET)

    with transaction.atomic():
        for device_id in target:
            device = SwatchDeviceInfo.objects.get(deveui=device_id)

            now = datetime.datetime.now()
            now += datetime.timedelta(days=days)

            device.begin_date = now

            device.save(update_fields=['begin_date'])

    return util.res_json()
示例#2
0
def get_device_info(request):
    params = json.loads(request.body)
    deveui = params.get('device_id', '')

    try:
        o = SwatchDeviceInfo.objects.get(deveui=deveui)
    except ObjectDoesNotExist:
        return util.res_json(-1)

    rs = SwatchDeviceUser.objects.select_related('user').filter(
        device_id=deveui)
    guardian_list = []
    for row in rs:
        if request.user.id != row.user.id and row.user.is_admin is True:
            continue

        guardian_list.append({
            'phone_no': row.user.phone_no,
            'name': row.user.name,
        })

    data = {
        'now': int(datetime.datetime.now().timestamp()),
        # 'photo_url': SwatchDeviceUser.objects.filter(device_id=deveui, user_id=request.user.id)[0].photo_url,
        'battery_level': o.battery_level,
        'expire_date': o.expire_date,
        'last_location_time': o.get_last_location_time(),
        'gw_latitude': o.get_gw_latitude(),
        'gw_longitude': o.get_gw_longitude(),
        'gw_location_time': o.get_last_uplink_time(),
        'guardian_list': guardian_list,
    }

    return util.res_json(data=data)
示例#3
0
def change_lora_period(request):
    param = json.loads(request.body)

    lora_period = param.get('lora_period')
    target = set(param.get('target', []))

    if lora_period is None or type(lora_period) is not int or lora_period <= 0:
        return util.res_json(CHANGE_LORA_PERIOD_NO_PERIOD)

    if len(target) == 0:
        return util.res_json(CHANGE_NO_TARGET)

    if SwatchDeviceInfo.objects.filter(
            deveui__in=target).count() != len(target):
        return util.res_json(CHANGE_INVALID_TARGET)

    with transaction.atomic():
        for device_id in target:
            device = SwatchDeviceInfo.objects.get(deveui=device_id)

            device.lora_period_min = lora_period

            device.save(update_fields=['lora_period_min'])

    return util.res_json()
示例#4
0
def atility_token(request):
    if request.method == 'GET':
        rs = NcsThingPlugInfo.objects.filter(
            Q(tp_id__startswith='Atility')
            | Q(tp_id='TELCO')).order_by('tp_id').using('ncs')
        this_list = []
        for row in rs:
            this_list.append({
                'tp_id': row.tp_id,
                'token': row.tp_ukey.split(' ')[-1],
            })

        ctx = {
            'this_list': this_list,
        }

        return render(request, 'device/atility_token.html', context=ctx)

    # POST request
    param = json.loads(request.body)

    tp_id = param.get('tp_id', '').strip()
    token = param.get('token', '').strip()
    print(tp_id, token)

    if tp_id == '' or token == '':
        return util.res_json(PARAM_ERROR)

    kwargs = {'tp_ukey': f'Bearer {token}'}
    NcsThingPlugInfo.objects.filter(tp_id=tp_id).using('ncs').update(**kwargs)

    return util.res_json()
示例#5
0
def change_fw_mode(request):
    param = json.loads(request.body)

    fw_mode = param.get('fw_mode')
    target = set(param.get('target', []))

    if fw_mode is None or type(fw_mode) is not int or fw_mode not in (0, 1, 2,
                                                                      3, 4, 5,
                                                                      8):
        return util.res_json(CHANGE_FW_MODE_NO_MODE)

    if len(target) == 0:
        return util.res_json(CHANGE_NO_TARGET)

    if SwatchDeviceInfo.objects.filter(
            deveui__in=target).count() != len(target):
        return util.res_json(CHANGE_INVALID_TARGET)

    with transaction.atomic():
        for device_id in target:
            device = SwatchDeviceInfo.objects.get(deveui=device_id)

            device.fw_mode = fw_mode

            device.save(update_fields=['fw_mode'])

    return util.res_json()
示例#6
0
def ya(request):
    param = request.body_param

    phone_num = param.get('apns_phone_num', '')
    location_url = param.get('ya_msg', '')
    sender_phone_num = param.get('sender', '')
    is_service = param.get('is_service', False)
    proc_date = param.get('proc_date', '')
    phone_cc = param.get('apns_phone_cc', '')

    phone_num = normalize_phone_num(phone_num)

    rs = ApnsMaster.objects.filter(phone_num=phone_num).order_by('-id')[0:1]
    if len(rs) == 0:
        return util.res_json(QLIQ_NO_PHONE_NUM)
    o = rs[0]

    # did 가 존재하지 않을 경우 아무것도 하지 않는다.
    if o.get_did() == '':
        pass
        # return util.res_json(QLIQ_NO_DID)

    if o.os_type == 'iOS':
        hey = f'Hey!\r\n{_FCM_MESSAGE.get(phone_cc, "en").get(random.randint(1, 25))}'
        print(hey)
        msg = f'{hey} from {sender_phone_num}'

        custom_data = {
            'id': '20',
            'value': hey,
            'temp': sender_phone_num,
            'date': proc_date,
        }
        apns.send(o.get_did(), 'qliq', ('dev', 'prd')[is_service], msg,
                  'hey_push.caf', custom_data)

        ret = ERROR_OK
    else:
        json_data = {
            'to': o.get_did(),
            'data': {
                'id': '20',
                'value': location_url,
                'temp': sender_phone_num,
                'date': proc_date,
            }
        }

        ret = fcm.send(json_data)

    return util.res_json(ret)
示例#7
0
def remove_history(request):
    param = json.loads(request.body)
    target = set(param.get('target', []))

    if len(target) == 0:
        return util.res_json(DELIVER_NO_TARGET)

    with transaction.atomic():
        for deveui in target:
            o = SwatchDeviceInfo.objects.get(deveui=deveui)

            o.trace_id = 0
            o.trace_req_user_id = 0
            o.battery_level = 0

            o.begin_date = datetime.datetime.now()

            o.latitude = None
            o.longitude = None
            o.height = 0.0

            o.gw_latitude = None
            o.gw_longitude = None
            o.last_location_time = None
            o.last_uplink_time = None

            o.owner_id = 0
            o.owner_latitude = 0
            o.owner_longitude = 0
            o.owner_height = 0
            o.owner_location_time = None

            o.save()

            SwatchAttendance.objects.filter(device_id=deveui).delete()
            SwatchDeviceUser.objects.filter(device_id=deveui,
                                            user__is_admin=False).delete()
            SwatchDeviceUserPush.objects.filter(device_id=deveui,
                                                user__is_admin=False).delete()
            SwatchLocationReservation.objects.filter(
                device_id=deveui, user__is_admin=False).delete()
            SwatchMovement.objects.filter(device_id=deveui).delete()
            SwatchMovementStat1d.objects.filter(device_id=deveui).delete()
            SwatchMovementPattern.objects.filter(device_id=deveui).delete()
            SwatchTraceHist.objects.filter(device_id=deveui).delete()
            SwatchTraceSummary.objects.filter(device_id=deveui).delete()

    return util.res_json()
示例#8
0
def stop_trace(request, deveui):
    try:
        device = SwatchDeviceInfo.objects.get(deveui=deveui)
    except ObjectDoesNotExist:
        return util.res_json(PARAM_ERROR)

    if device.trace_type == 'N':
        return util.res_json(data={
            'not_available': True,
        })

    url = f'{settings.SW_REST_URL}/safewatch/device/{deveui}/trace/stop'
    res = requests.post(url, json={'session_key': request.user.session_key})
    print(res.status_code, res.text)

    return util.res_json(0)
示例#9
0
def extend_expire(request):
    param = json.loads(request.body)

    days = param.get('days')
    target = set(param.get('target', []))
    is_extend = param.get('is_extend', True)

    if days is None or type(days) is not int:
        return util.res_json(EXTEND_EXPIRE_NO_DAYS)

    if len(target) == 0:
        return util.res_json(EXTEND_EXPIRE_NO_TARGET)

    if SwatchDeviceInfo.objects.filter(
            deveui__in=target).count() != len(target):
        return util.res_json(EXTEND_EXPIRE_INVALID_TARGET)

    with transaction.atomic():
        for device_id in target:
            device = SwatchDeviceInfo.objects.get(deveui=device_id)
            prev_expire_date = device.expire_date

            if is_extend is True:
                device.expire_date += datetime.timedelta(days=days)
            else:
                now = datetime.datetime.now()
                now += datetime.timedelta(days=days)

                device.expire_date = now

            device.save(update_fields=['expire_date'])

            #
            o = SwatchDeviceExtendHistory()

            o.deveui = device_id
            o.is_extend = is_extend
            o.days = days
            o.prev_expire_date = prev_expire_date
            o.expire_date = device.expire_date

            o.save()

    return util.res_json()
示例#10
0
def do_login(request):
    if is_login(request):
        return redirect('monitor.index')

    if request.method == 'GET':
        return render(request, 'monitor/login.html')
    else:
        params = json.loads(request.body)

        phone_no = params.get('login_id', '')
        password = params.get('login_password', '')

        user = authenticate(request, phone_no=phone_no, password=password)
        if user is not None:
            login(request, user)
        else:
            return util.res_json(error_code=LOGIN_FAIL)

        return util.res_json()
示例#11
0
def sos_voice(request):
    param = request.body_param

    phone_num = param.get('apns_phone_num', '')
    voice = param.get('voice', '')
    sender_phone_num = param.get('sender', '')
    is_service = param.get('is_service', False)
    proc_date = param.get('proc_date', '')
    phone_cc = param.get('apns_phone_cc', '')
    sender_cust_no = param.get('sender_cust_no', '')
    picture_type = param.get('picture_type', False)

    phone_num = normalize_phone_num(phone_num)

    rs = ApnsMaster.objects.filter(phone_num=phone_num).order_by('-id')[0:1]
    if len(rs) == 0:
        return util.res_json(QLIQ_NO_PHONE_NUM)
    o = rs[0]

    # did 가 존재하지 않을 경우 아무것도 하지 않는다.
    if o.get_did() == '':
        pass
        # return util.res_json(QLIQ_NO_DID)

    # iOS 일 경우, 녹음이 되지 않아 아무 것도 할 수가 없다.
    if o.os_type == 'iOS':
        pass
    else:
        json_data = {
            'to': o.get_did(),
            'data': {
                'id': ('8', '6')[picture_type is True],
                'value': voice,
                'temp': sender_phone_num,
                'date': proc_date,
                'custno': sender_cust_no,
            }
        }
        fcm.send(json_data, FCM_QLIQ)
        fcm.send(json_data, FCM_CARA)

    return util.res_json()
示例#12
0
def get_trace_list(request, deveui):
    try:
        device = SwatchDeviceInfo.objects.get(deveui=deveui)
    except ObjectDoesNotExist:
        return util.res_json(PARAM_ERROR)

    if device.trace_type == 'N':
        return util.res_json(-1)

    rs = SwatchTraceDetail.objects.filter(trace_id=device.trace_id)
    rs = rs.order_by('trace_detail_id')

    trace_list = []
    for row in rs:
        latitude = row.get_latitude()
        longitude = row.get_longitude()

        if latitude == 0.0 and longitude == 0.0:
            continue

        # latitude += random.random() - 0.5
        # longitude += random.random() - 0.5

        trace_list.append({
            'latitude':
            latitude,
            'longitude':
            longitude,
            'create_time':
            row.create_time.strftime("%Y-%m-%d %H:%M:%S"),
            'create_timestamp':
            int(row.create_time.timestamp()),
        })

    data = {
        'trace_list': trace_list,
    }

    return util.res_json(data=data)
示例#13
0
def sos_voice_upload(request):
    if request.method == 'GET':
        return render(request, 'qliq/sos_upload.html')

    # POST
    cust_no = request.POST.get('custNo', '0')

    if 'fileData' not in request.FILES:
        return util.res_json(PARAM_ERROR)

    sos_voice_file = request.FILES['fileData']
    if sos_voice_file:
        upload_dir = os.path.join(settings.MEDIA_ROOT, 'qliq/sos/voice')
        file_name = f'{cust_no}.mp3'

        fs = FileSystemStorage(location=upload_dir)
        if fs.exists(file_name):
            fs.delete(file_name)
        file_path = fs.save(file_name, sos_voice_file)
        print(file_path)

    return util.res_json()
示例#14
0
def manage_callback_remove(request):
    # POST request
    param = json.loads(request.body)
    deveui = param.get('deveui', '')

    print(deveui)
    rs = NcsDeviceInfo.objects.filter(deveui=deveui).using('ncs')
    if len(rs) == 0:
        return util.res_json(-1)
    ncs_device_info = rs[0]

    ncs_tp_info = NcsThingPlugInfo.objects.filter(
        tp_id=ncs_device_info.tp_id).using('ncs')[0]
    lt_id = ncs_device_info.appeui[-8:] + deveui

    conn = requests.session()
    conn.headers.update({
        'X-M2M-RI': lt_id,
        'X-M2M-Origin': 'Origin',
        'uKey': ncs_tp_info.tp_ukey,
    })

    url = f'http://{ncs_tp_info.tp_domain}:{ncs_tp_info.tp_port}/{ncs_device_info.appeui}/v1_0/remoteCSE-{lt_id}/container-LoRa/subscription-uplink'
    res = conn.delete(url=url)
    print(res.text)

    if res.status_code != requests.codes.ok:
        print(url, res.status_code)
        return util.res_json(-1)

    ncs_device_info.tp_subs_ul_yn = 'N'

    try:
        ncs_device_info.save(update_fields=['tp_subs_ul_yn'])
    except:
        return util.res_json(DB_ERROR)

    return util.res_json()
示例#15
0
def register(request):
    param = request.body_param

    did = param.get('apns_did', '')
    phone_num: str = param.get('apns_phone_num', '')
    os_type: str = param.get('apns_os_type', '')
    is_service: bool = param.get('is_service', False)
    phone_cc: str = param.get('apns_phone_cc', '')
    device_type: str = param.get('device_type', 'qliq')

    phone_num = normalize_phone_num(phone_num)

    rs = ApnsMaster.objects.filter(did=did, phone_num=phone_num)
    if phone_cc != '':
        rs = rs.filter(phone_cc=phone_cc)

    if len(rs) == 0:
        try:
            o = ApnsMaster()

            o.did = did
            o.phone_num = phone_num
            o.os_type = os_type
            o.is_service = is_service
            o.phone_cc = phone_cc
            o.device_type = device_type

            o.save()
        except DatabaseError:
            result = DB_ERROR
        else:
            result = 0
    else:
        result = 0

    return util.res_json(result)
示例#16
0
def manage_callback_add(request):
    # POST request
    param = json.loads(request.body)
    deveui = param.get('deveui', '')

    print(deveui)
    rs = NcsDeviceInfo.objects.filter(deveui=deveui).using('ncs')
    if len(rs) == 0:
        return util.res_json(-1)
    ncs_device_info = rs[0]

    ncs_tp_info = NcsThingPlugInfo.objects.filter(
        tp_id=ncs_device_info.tp_id).using('ncs')[0]
    lt_id = ncs_device_info.appeui[-8:] + deveui

    try:
        ns_m2m = 'http://www.onem2m.org/xml/protocols'
        namespaces = {
            'm2m': ns_m2m,
            'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
        }

        doc = etree.Element('{%s}sub' % ns_m2m, nsmap=namespaces)

        elm_enc = etree.SubElement(doc, 'enc')
        elm_rss = etree.SubElement(elm_enc, 'rss')
        elm_rss.text = '1'

        cb_url = f'https://tpi.dnx.kr:443/cb/thingplug/uplink/{deveui}'
        elm_nu = etree.SubElement(doc, 'nu')
        elm_nu.text = f'HTTP|{cb_url}'

        elm_pn = etree.SubElement(doc, 'pn')
        elm_pn.text = '1'

        elm_nct = etree.SubElement(doc, 'nct')
        elm_nct.text = '2'

        # print(etree.tostring(doc, pretty_print=True).decode())

    except Exception as e:
        print(e)

    xml_body = etree.tostring(doc)

    conn = requests.session()
    my_header = {
        'Accept': 'application/xml',
        'X-M2M-RI': lt_id,
        'X-M2M-Origin': 'Origin',
        'X-M2M-NM': 'uplink',
        'Content-Type': 'application/vnd.onem2m-res+xml;ty=23',
        # 'Content-Length': f'{len(xml_body)}',
        'locale': 'en',
        'uKey': ncs_tp_info.tp_ukey,
    }
    conn.headers.update(my_header)

    url = f'http://{ncs_tp_info.tp_domain}:{ncs_tp_info.tp_port}/{ncs_device_info.appeui}/v1_0/remoteCSE-{lt_id}/container-LoRa'
    res = conn.post(url,
                    data=etree.tostring(doc,
                                        encoding='UTF-8',
                                        xml_declaration=True,
                                        standalone=True).decode())
    # res = conn.send(prepare_request, stream=etree.tostring(doc))
    # print(res.request.url)
    # print(res.request.headers)
    # print(res.request.body)
    print(res.status_code, res.text)

    if res.status_code == 201:
        try:
            ncs_device_info.tp_subs_ul_yn = 'Y'
            ncs_device_info.save(force_update=True,
                                 update_fields=('tp_subs_ul_yn', ))
        except:
            return util.res_json(DB_ERROR)
    else:
        print(res.status_code, res.text)

    return util.res_json()
示例#17
0
def new_virtual_device(request):
    if request.method == 'GET':
        search_deveui = request.GET.get('device', '')

        rs = SwatchDeviceSn.objects.filter(deveui__startswith='vv')
        if search_deveui != '':
            rs = rs.filter(deveui__contains=search_deveui)
        rs = rs.order_by('deveui')

        device_list = []
        for row in rs:
            device_list.append({
                'deveui':
                row.deveui,
                'product_key':
                row.serial_no,
                'product_key2':
                '-'.join(re.findall('.{4}', row.serial_no)),
            })

        ctx = {
            'search_device': search_deveui,
            'this_list': device_list,
        }

        return render(request, 'device/virtual.html', context=ctx)

    # POST request
    today = datetime.datetime.now()
    yyyymm = today.strftime('%Y%m')
    this_prefix = f'vv{yyyymm}cafe'

    rs = SwatchDeviceInfo.objects.filter(
        deveui__startswith=this_prefix).order_by('-deveui')[0:1]
    if len(rs) == 0:
        seq = 1
    else:
        seq = int(rs[0].deveui[-4:], 16) + 1 % 0xFFFF

    product_key = make_product_key()
    deveui = f'{this_prefix}{seq:04x}'
    try:
        with transaction.atomic():
            # t_swatch_device_sn
            o = SwatchDeviceSn()

            o.deveui = deveui
            o.serial_no = product_key

            o.save(force_insert=True)

            # t_swatch_device_info
            # with connection.cursor() as cursor:
            #     cursor.execute("INSERT INTO swatch.t_swatch_device_info (deveui, appeui) VALUES ('%s', '%s') " % (deveui, '0'))

            o = SwatchDeviceInfo()

            o.deveui = deveui

            o.appeui = '0'
            o.trace_type = SwatchDeviceInfo.TRACE_TYPE_NONE
            o.power_yn = 'N'

            o.fw_mode = 0
            o.lora_period_min = 0
            o.expire_date = today

            o.save(force_insert=True)
    except:
        traceback.print_exc()
        return util.res_json(NEW_DEVICE_FAIL)

    return util.res_json()
示例#18
0
def new_device(request):
    rs = NcsThingPlugInfo.objects.all().values_list('tp_id',
                                                    flat=True).using('ncs')
    rs = rs.order_by('tp_id')
    tp_id_list = list(rs)

    def make_app_key():
        return ''.join([f'{random.randint(1, 255):02x}' for _ in range(16)])

    if request.method == 'GET':
        search_deveui = request.GET.get('device', '')
        country_code = request.GET.get('country_code', '')

        rs = SwatchDeviceSn.objects.filter(deveui__startswith='5357')
        if search_deveui != '':
            rs = rs.filter(deveui__contains=search_deveui)
        rs = rs.order_by('deveui')

        device_list = []
        for row in rs:
            row.country_code = bytes.fromhex(row.deveui[4:8]).decode()
            if country_code != '' and country_code != row.country_code:
                continue
            row.appkey = row.appkey or ''

            device_list.append({
                'country_code':
                row.country_code,
                'deveui':
                row.deveui,
                'product_key':
                row.serial_no,
                'product_key2':
                '-'.join(re.findall('.{4}', row.serial_no)),
                'app_key':
                row.appkey,
                'app_key2':
                '-'.join(re.findall('.{2}', row.appkey))
            })

        ctx = {
            'search_device': search_deveui,
            'this_list': device_list,
            'tp_list': tp_id_list,
            'country_code': country_code,
        }

        return render(request, 'device/new.html', context=ctx)

    # POST request
    param = json.loads(request.body)
    tp_id = param.get('tp_id', '').strip()
    country_code = param.get('country_code', '').upper()

    if tp_id not in tp_id_list:
        return util.res_json(NEW_DEVICE_INVALID_TP_ID)

    if len(country_code) != 2:
        return util.res_json(NEW_DEVICE_WRONG_COUNTRY_CODE)

    # make S W K R 1809####
    now = datetime.datetime.now()
    this_prefix = f'SW{country_code}'.encode().hex()

    rs = SwatchDeviceSn.objects.filter(
        deveui__startswith=this_prefix).order_by('-deveui')[:1]
    if len(rs) == 0:
        seq = 1
    else:
        seq = int(rs[0].deveui[-4:], 16) + 1 % 0xFFFF

    app_key = make_app_key()
    product_key = make_product_key()
    deveui = f'{this_prefix}{now.strftime("%y%m")}{seq:04x}'

    try:
        with transaction.atomic():
            # t_swatch_device_sn
            o = SwatchDeviceSn()

            o.deveui = deveui
            o.serial_no = product_key
            o.appkey = app_key

            o.save()

            # t_swatch_device_info
            with connection.cursor() as cursor:
                cursor.execute(
                    "INSERT INTO swatch.t_swatch_device_info (deveui, appeui) VALUES ('%s', '%s') "
                    % (deveui, '0'))

            # t_ncs_device_info
            o = NcsDeviceInfo()

            o.deveui = deveui
            o.appeui = '0'
            o.if_type = (tp_id[0:1], 'T')[tp_id in ('DNX', 'NABLE')]
            o.tp_id = tp_id

            o.save(using='ncs')
    except:
        traceback.print_exc()
        return util.res_json(NEW_DEVICE_FAIL)

    rs = NcsDeviceRange.objects.all().using('ncs')
    for row in rs:
        if row.deveui_from <= deveui <= row.deveui_to:
            valid_range = True
            break
    else:
        valid_range = False

    data = {
        'deveui': deveui,
        'product_key': product_key,
        'app_key': app_key,
        'valid_range': valid_range,
    }

    return util.res_json(data=data)
示例#19
0
def get_device_list(request):
    if not is_login(request):
        if request.method == 'GET':
            return redirect('monitor.login')
        else:
            return util.res_json(LOGIN_REQUIRED)

    def make_context():
        rs = SwatchDeviceUser.objects.filter(
            user_id=request.user.id).select_related('device')
        rs = rs.order_by('nickname')

        this_list = []
        emergency_list = []
        center_lat = 0.0
        center_lng = 0.0
        last_location_time = None
        for row in rs:
            lat = row.device.get_latitude()
            lng = row.device.get_longitude()

            if lat != 0.0 and lng != 0.0:
                if last_location_time is None or last_location_time < row.device.last_location_time:
                    last_location_time = row.device.last_location_time
                    center_lat = lat
                    center_lng = lng

            if row.device.battery_level is None:
                row.device.battery_level = 0

            # if row.device_id == '70b3d5f5cafe02c4':
            #     row.device.trace_type = 'E'

            info = {
                'device_id': row.device_id,
                'nickname': row.nickname,
                'photo_url': row.photo_url,
                'trace_type': row.device.trace_type,
                'latitude': lat,
                'longitude': lng,
                # 'last_location_time': row.device.get_last_location_time(),
                'is_valid': row.device.is_valid(),
                'is_sleep': row.device.is_sleep(),
                'is_poweroff': row.device.is_poweroff(),
            }

            if not info['is_valid']:
                info['marker'] = _marker % 'orange'
            elif info['is_sleep'] or info['is_poweroff']:
                info['marker'] = _marker % 'gray'
            else:
                if info['trace_type'] == 'E':
                    info['marker'] = '/static/images/icon/siren.gif'
                elif info['trace_type'] == 'S':
                    info['marker'] = _marker % 'purple'
                elif info['trace_type'] == 'R':
                    info['marker'] = _marker % 'blue'
                else:
                    info['marker'] = _marker % 'green'

            this_list.append(info)
            if info['trace_type'] == 'E':
                emergency_list.append(info)

        _ctx = {
            'center_latitude': center_lat,
            'center_longitude': center_lng,
            'this_list': this_list,
            'emergency_list': emergency_list,
        }

        return _ctx

    if request.method == 'GET':
        ctx = make_context()
        ctx['range'] = range(1, 31)

        return render(request, 'monitor/device/list.html', context=ctx)
    else:
        return util.res_json(data=make_context())
示例#20
0
def deliver_start(request):
    param = json.loads(request.body)
    expire_days = param.get('expire_days')
    start_date = param.get('start_date', '').replace('-', '')
    target = set(param.get('target', []))

    if len(target) == 0:
        return util.res_json(DELIVER_NO_TARGET)

    if expire_days <= 0:
        return util.res_json(DELIVER_WRONG_EXPIRE_DAYS)

    today = datetime.datetime.today().date()
    try:
        start_date = datetime.datetime.strptime(start_date, '%Y%m%d').date()
        if start_date <= today:
            return util.res_json(DELIVER_MORE_START_DATE)
    except ValueError:
        return util.res_json(DELIVER_WRONG_START_DATE)

    rs = SwatchDeviceDelivery.objects.exclude(
        status=SwatchDeviceDelivery.STATUS_HOME).filter(device_id__in=target)
    use_device_list = rs.values_list('device_id',
                                     flat=True).order_by('device_id')
    print('DELIVERY DEVICE LIST: ', use_device_list)
    if len(use_device_list) > 0:
        return util.res_json(DELIVER_ALREADY_USE)

    rs = SwatchDeviceInfo.objects.filter(deveui__in=target,
                                         expire_date__gte=today)
    valid_device_list = rs.values_list('deveui', flat=True).order_by('deveui')
    print('VALID DEVICE LIST: ', valid_device_list)
    if len(valid_device_list) > 0:
        return util.res_json(DELIVER_NOT_EXPIRE)

    with transaction.atomic():
        for deveui in target:
            o = SwatchDeviceInfo.objects.get(deveui=deveui)

            o.trace_id = 0
            o.trace_req_user_id = 0

            o.owner_id = 0
            o.owner_latitude = 0
            o.owner_longitude = 0
            o.owner_height = 0
            o.owner_location_time = None

            o.save()

            SwatchAttendance.objects.filter(device_id=deveui).delete()
            SwatchDeviceUser.objects.filter(device_id=deveui,
                                            user__is_admin=False).delete()
            SwatchDeviceUserPush.objects.filter(device_id=deveui,
                                                user__is_admin=False).delete()
            SwatchLocationReservation.objects.filter(
                device_id=deveui, user__is_admin=False).delete()
            SwatchMovement.objects.filter(device_id=deveui).delete()
            SwatchMovementStat1d.objects.filter(device_id=deveui).delete()
            SwatchMovementPattern.objects.filter(device_id=deveui).delete()
            SwatchTraceHist.objects.filter(device_id=deveui).delete()

            # 배달 기록 입력
            o = SwatchDeviceDelivery()

            o.device_id = deveui
            o.status = SwatchDeviceDelivery.STATUS_DELIVER
            o.days = expire_days
            o.start_date = start_date

            o.save(force_insert=True)

    return util.res_json()
示例#21
0
def sos(request, is_sos):
    param = request.body_param

    phone_num = param.get('apns_phone_num', '')
    location_url = param.get('location_url', '')
    sender_phone_num = param.get('sender', '')
    is_service = param.get('is_service', False)
    proc_date = param.get('proc_date', '')
    phone_cc = param.get('apns_phone_cc', '')
    sender_cust_no = param.get('sender_cust_no', '')
    altitude = param.get('altitude', '')

    phone_num = normalize_phone_num(phone_num)

    rs = ApnsMaster.objects.filter(
        phone_num=phone_num).order_by('-create_time')[0:1]
    if len(rs) == 0:
        return util.res_json(QLIQ_NO_PHONE_NUM)
    o = rs[0]

    # did 가 존재하지 않을 경우 아무것도 하지 않는다.
    if o.get_did() == '':
        pass
        # return util.res_json(QLIQ_NO_DID)

    if o.os_type == 'iOS':
        msg = (f"I'm here received. ({sender_phone_num})",
               f'SOS received. ({sender_phone_num})')[is_sos]

        custom_data = {
            'id': ('2', '3')[is_sos],
            'value': location_url,
            'temp': sender_phone_num,
            'date': proc_date,
            'custno': sender_cust_no,
            'altitude': altitude,
        }

        # qliq
        apns.send(o.get_did(), 'qliq', ('dev', 'prd')[is_service], msg,
                  'rang_push2.caf', custom_data)

        # rang TODO: 나중에 개발 + 인증서 갱신도 필요함.
        apns.send(o.get_did(), 'rang', ('dev', 'prd')[is_service], msg,
                  'rang_push2.caf', custom_data)

        ret = ERROR_OK
    else:
        json_data = {
            'to': o.get_did(),
            'data': {
                'id': ('2', '3')[is_sos],
                'value': location_url,
                'temp': sender_phone_num,
                'date': proc_date,
                'custno': sender_cust_no,
                'altitude': altitude,
            }
        }
        ret = fcm.send_all(json_data)

    return util.res_json(ret)