def element(request, type, id): """ Controller to get element page :param request: HTTP request :param type: element type :param id: element id :return: """ if type == 'scrb' or type == 'pr': transact = DBService.get_transact(id) if not transact: return default_404(request) as_partial = bool(request.GET.get('as_partial', False)) return render_to_response('transact_element_partial.html' if as_partial else 'element_base.html', {'transact': transact, 'type': type}, context_instance=RequestContext(request)) elif type == 'profile': try: profile = User.objects.get(email=id) except ObjectDoesNotExist as e: return default_404(request) return render_to_response('profile.html', {'profile': profile}, context_instance=RequestContext(request)) return HttpResponse(status=200)
def request_callback(user, from_number, to_number): """ Request the callback :param user: user instance :param form: prom number :param to: to number :return: """ method = settings.API_URLS['api']['request_callback'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams({'from': from_number, 'to': to_number}) url = params.get_request_string(method) response = requests.get(url, headers={'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key))}) content = response.content if response.ok: callback = DBService.register_callback(user.userprofile, from_number, to_number) if callback: return json.loads(content) logger = LogService() logger.error(Code.REQUEST_CALLBACK_ERR, data=json.loads(content), status_code=response.status_code) return None
def create_new_user(request, template): """ Create new user controller :param request: HTTP request :param template: html template :return: """ if request.POST: new_user_form = NewUserForm(request.POST) transact_id = request.POST.get('transactId') transact = DBService.get_transact(transact_id) if new_user_form.errors: return JsonResponse({'data': new_user_form.errors}, status=400) result = ProfileService.create_profile(new_user_form.data) if result.is_success: if transact: transact.confirm() message = MailMessage(settings.INFO_EMAIL, 'Данные вашего профиля', 'mail_tmpl_profile_created.html', { 'username': new_user_form.data['userName'], 'password': new_user_form.data['userPassword'] }, new_user_form.data['userEmail']) message.send() return HttpResponse(status=201) logger.error(Code.PCRERR, data=result.data) return HttpResponse(status=500, content=result.data) else: params = {} transact_id = request.GET.get('transact_id') transact = DBService.get_transact(transact_id) if transact: params['transact_id'] = transact.transact_id params['username'] = transact.username params['email'] = transact.email return render_to_response(template, params, context_instance=RequestContext(request))
def new_profile_request(request, template): """ Controller to create new profile request :param request: HTTP request :param template: html template :return: HttpResponse """ profile_request_transact = DBService.create_profile_request_transact(ProfileRequest(request.POST.get('email'), request.POST.get('login'))) if profile_request_transact: return render_to_response(template, {'email': profile_request_transact.email, 'transact_id': profile_request_transact.transact_id}, context_instance=RequestContext(request)) return HttpResponse(status=500)
def incoming_detect(request, user_key): """ Incoming calls information https://github.com/zadarma/user-api-v1/blob/master/examples/callinfo_callback.php :param request: HTTP request :return: """ if 'zd_echo' in request.GET.keys() and ( request.GET.get('zd_echo') and not request.GET.get('zd_echo') == ''): logger.info('ECHO PASSED', zd_echo=request.GET.get('zd_echo')) return HttpResponse(str(request.GET.get('zd_echo'))) if settings.DEBUG: caller_id = request.body.split('\n')[0].split(': ')[1] called_did = request.body.split('\n')[1].split(': ')[1] call_start = request.body.split('\n')[2].split(': ')[1] else: caller_id = request.POST.get('caller_id') called_did = request.POST.get('called_did') call_start = request.POST.get('call_start') logger.info('IC PARMS', params=( caller_id, called_did, call_start, )) if not caller_id or not called_did or not call_start: return HttpResponse(status=400) # TODO: check signature # headers = request.META # # if 'Signature' in headers.keys(): # print('IC Signature', headers.get('Signature')) # logger.info('IC HEDRS', signature=headers.get('Signature')) user_profile = UserProfile.objects.get(user_key=user_key) script = user_profile.widgetscript callee = Callee.objects.filter(user_profile_id=script.user_profile.pk, sip=caller_id) if len(callee) == 0: incoming_info = DBService.create_incoming_info( caller_id, called_did, datetime.datetime.strptime(call_start, settings.DATETIME_FORMAT_ALTER), script.guid) return HttpResponse(status=200)
def pay(request, type): """ Controller to pay :param request: HTTP request :param type: pay type :return: HttpResponse instance """ if request.method == 'GET': return render_to_response('pay_{type}.html'.format(type=type), {'subscription_data': SubscriptionData(), 'payment_data': PaymentData(request.user.userprofile.customer_number)}, context_instance=RequestContext(request)) elif request.method == 'POST' and type == 'subfee': if request.POST: subscr = DBService.create_subscr_transaction(request.user, request.POST) if subscr: return HttpResponse(status=201) return HttpResponse(status=500)
def transact_action(request, action): """ Controller to execute transact action :param request: HTTP request :return: JsonResponse instance """ transact_id = request.POST.get('transactId') transact = DBService.get_transact(transact_id) if not transact: return HttpResponse(status=500) result = transact.__getattribute__(action)(request=request) if result: return JsonResponse({'transactId': transact.transact_id}) return HttpResponse(status=500)
def new_profile_request(request, template): """ Controller to create new profile request :param request: HTTP request :param template: html template :return: HttpResponse """ profile_request_transact = DBService.create_profile_request_transact( ProfileRequest(request.POST.get('email'), request.POST.get('login'))) if profile_request_transact: return render_to_response( template, { 'email': profile_request_transact.email, 'transact_id': profile_request_transact.transact_id }, context_instance=RequestContext(request)) return HttpResponse(status=500)
def update_calls_list_by_type(userprofile, stat, *args): """ Update calls table of each call type :param userprofile: user profile :param stat: existing stat :param args: calls lists :return: """ message = '{row_to_update} row(s) to be inserted. ' update_errors = [] total_rows_to_update = 0 for arg in args: if len(arg) != 0: call_type = arg[0].call_type user_stat = stat.filter(call_type=call_type) row_to_update = len(arg) - len(user_stat) if row_to_update > 0: total_rows_to_update += row_to_update for a in arg: # check if current call already exist stat_record = stat.filter(call_id=a.call_id) # save to db if not if not stat_record: result = DBService.create_call(a, userprofile) if not result.is_success: update_errors.append(( result.data, result.message, )) if len(update_errors) > 0: # Update calls list succeed with errors message = message.format(row_to_update=total_rows_to_update) message += Code.UCLSWE return ServiceResponse(True, data=update_errors, message=message)
def incoming_detect(request, user_key): """ Incoming calls information https://github.com/zadarma/user-api-v1/blob/master/examples/callinfo_callback.php :param request: HTTP request :return: """ if 'zd_echo' in request.GET.keys() and (request.GET.get('zd_echo') and not request.GET.get('zd_echo') == ''): logger.info('ECHO PASSED', zd_echo=request.GET.get('zd_echo')) return HttpResponse(str(request.GET.get('zd_echo'))) if settings.DEBUG: caller_id = request.body.split('\n')[0].split(': ')[1] called_did = request.body.split('\n')[1].split(': ')[1] call_start = request.body.split('\n')[2].split(': ')[1] else: caller_id = request.POST.get('caller_id') called_did = request.POST.get('called_did') call_start = request.POST.get('call_start') logger.info('IC PARMS', params=(caller_id, called_did, call_start,)) if not caller_id or not called_did or not call_start: return HttpResponse(status=400) # TODO: check signature # headers = request.META # # if 'Signature' in headers.keys(): # print('IC Signature', headers.get('Signature')) # logger.info('IC HEDRS', signature=headers.get('Signature')) user_profile = UserProfile.objects.get(user_key=user_key) script = user_profile.widgetscript callee = Callee.objects.filter(user_profile_id=script.user_profile.pk, sip=caller_id) if len(callee) == 0: incoming_info = DBService.create_incoming_info(caller_id, called_did, datetime.datetime.strptime(call_start, settings.DATETIME_FORMAT_ALTER), script.guid) return HttpResponse(status=200)
def pay(request, type): """ Controller to pay :param request: HTTP request :param type: pay type :return: HttpResponse instance """ if request.method == 'GET': return render_to_response('pay_{type}.html'.format(type=type), { 'subscription_data': SubscriptionData(), 'payment_data': PaymentData(request.user.userprofile.customer_number) }, context_instance=RequestContext(request)) elif request.method == 'POST' and type == 'subfee': if request.POST: subscr = DBService.create_subscr_transaction( request.user, request.POST) if subscr: return HttpResponse(status=201) return HttpResponse(status=500)
def update_calls_list_by_type(userprofile, stat, *args): """ Update calls table of each call type :param userprofile: user profile :param stat: existing stat :param args: calls lists :return: """ message = '{row_to_update} row(s) to be inserted. ' update_errors = [] total_rows_to_update = 0 for arg in args: if len(arg) != 0: call_type = arg[0].call_type user_stat = stat.filter(call_type=call_type) row_to_update = len(arg) - len(user_stat) if row_to_update > 0: total_rows_to_update += row_to_update for a in arg: # check if current call already exist stat_record = stat.filter(call_id=a.call_id) # save to db if not if not stat_record: result = DBService.create_call(a, userprofile) if not result.is_success: update_errors.append((result.data, result.message,)) if len(update_errors) > 0: # Update calls list succeed with errors message = message.format(row_to_update=total_rows_to_update) message += Code.UCLSWE return ServiceResponse(True, data=update_errors, message=message)
def get_call_record_filename(call_id, user): """ Get call record filename by call_id :param call_id: id of the call :param user: current user :return: {str} filename """ call = DBService.get_call(call_id=call_id) if not call: return None # check if current user is the master of the call if call.user_profile_id != user.userprofile.pk: return None # check if the record was already loaded filename = call.record_filename if not filename: # load new record filename = PBXDataService.load_call_record_file(call, user) if not filename: return None return filename
def check_incoming_info(request, guid): """ Chech incoming call info :param request: :param guid: :return: """ try: script = WidgetScript.objects.get(guid=guid) except ObjectDoesNotExist as e: return HttpResponse(status=400) incoming_info = DBService.get_incoming_info(script.guid) response = HttpResponse() response['Access-Control-Allow-Origin'] = '*' if not incoming_info: response.status_code = 204 return response response.status_code = 200 response.content = incoming_info.guid return response
def request_callback(user, from_number, to_number): """ Request the callback :param user: user instance :param form: prom number :param to: to number :return: """ method = settings.API_URLS['api']['request_callback'] # WARNING: Creates ApiParams with {start} and {end} params. Needs to be refactored params = ApiParams({'from': from_number, 'to': to_number}) url = params.get_request_string(method) response = requests.get( url, headers={ 'Authorization': '%s:%s' % (user.userprofile.user_key, CommonService.get_sign(params, method, params.api_version, user.userprofile.secret_key)) }) content = response.content if response.ok: callback = DBService.register_callback(user.userprofile, from_number, to_number) if callback: return json.loads(content) logger = LogService() logger.error(Code.REQUEST_CALLBACK_ERR, data=json.loads(content), status_code=response.status_code) return None