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()
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)
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()
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()
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()
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)
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()
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)
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()
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()
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()
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)
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()
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()
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)
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()
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()
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)
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())
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()
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)