def total_spending(request, format=None): codes = utils.param_to_list(request.query_params.get('code', [])) codes = utils.get_bnf_codes_from_number_str(codes) subdivide = request.GET.get('subdivide', None) if subdivide: if codes: if len(codes) > 1: err = 'Error: You can only subdivide a single code' return Response(err, status=400) elif len(codes[0]) > 11: err = 'Error: Code to subdivide must be 11 characters or fewer' return Response(err, status=400) spending_type = utils.get_spending_type(codes) if spending_type is False: err = 'Error: Codes must all be the same length' return Response(err, status=400) if subdivide: query = _get_query_for_total_spending_with_subdivide(codes) else: query = _get_query_for_total_spending(codes) if spending_type != 'presentation': codes = [c + '%' for c in codes] data = utils.execute_query(query, [codes]) return Response(data)
def spending_by_org(request, format=None, org_type=None): codes = utils.param_to_list(request.query_params.get('code', [])) codes = utils.get_bnf_codes_from_number_str(codes) org_ids = utils.param_to_list(request.query_params.get('org', [])) org_type = request.query_params.get('org_type', org_type) date = request.query_params.get('date', None) # Accept both cases of CCG (better to fix this specific string rather than # make the whole API case-insensitive) if org_type == 'CCG': org_type = 'ccg' # Some special case handling for practices if org_type == 'practice': # Translate any CCG codes into the codes of all practices in that CCG org_ids = utils.get_practice_ids_from_org(org_ids) # Due to the number of practices we only return data for all practices # if a single date is specified if not date and not org_ids: return Response( 'Error: You must supply either a list of practice IDs or a date ' 'parameter, e.g. date=2015-04-01', status=400) # We don't (yet?) have a "proper" code field for STPs so we're using their # ONS code code_field = 'code' if org_type != 'stp' else 'ons_code' if org_type == 'practice': orgs = Practice.objects.all() elif org_type == 'ccg': orgs = PCT.objects.filter(org_type='CCG') elif org_type == 'stp': orgs = STP.objects.all() elif org_type == 'regional_team': orgs = RegionalTeam.objects.all() else: return Response('Error: unrecognised org_type parameter', status=400) # Filter and sort if org_ids: orgs = orgs.filter(**{code_field + '__in': org_ids}) orgs = orgs.order_by(code_field) # For most orgs we just want the code and name but for practices we want # the entire object because, for compatibility with the existing API, we # return extra data for practices if org_type != 'practice': orgs = orgs.only(code_field, 'name') data = _get_prescribing_entries(codes, orgs, org_type, date=date) return Response(list(data))
def total_spending(request, format=None): codes = utils.param_to_list(request.query_params.get('code', [])) codes = utils.get_bnf_codes_from_number_str(codes) spending_type = utils.get_spending_type(codes) if spending_type is False: err = CODE_LENGTH_ERROR return Response(err, status=400) query = _get_query_for_total_spending(codes) if spending_type != 'presentation': codes = [c + '%' for c in codes] data = utils.execute_query(query, [codes]) return Response(data)
def spending_by_practice(request, format=None): codes = utils.param_to_list(request.query_params.get('code', [])) codes = utils.get_bnf_codes_from_number_str(codes) orgs = utils.param_to_list(request.query_params.get('org', [])) date = request.query_params.get('date', None) spending_type = utils.get_spending_type(codes) if spending_type is False: err = 'Error: Codes must all be the same length' return Response(err, status=400) if spending_type == 'bnf-section' or spending_type == 'product': codes = [c + '%' for c in codes] if not date and not orgs: err = 'Error: You must supply either ' err += 'a list of practice IDs or a date parameter, e.g. ' err += 'date=2015-04-01' return Response(err, status=400) org_for_param = None if not spending_type or spending_type == 'bnf-section' \ or spending_type == 'chemical': # We can do presentation queries indexed by PCT ID, which is faster. # We have yet to update the *_by_practice matviews with PCT ID. # So for these queries, expand the CCG ID to a list of practice IDs. expanded_orgs = utils.get_practice_ids_from_org(orgs) if codes: query = _get_chemicals_or_sections_by_practice(codes, expanded_orgs, spending_type, date) org_for_param = expanded_orgs else: query = _get_total_spending_by_practice(expanded_orgs, date) org_for_param = expanded_orgs else: query = _get_presentations_by_practice(codes, orgs, date) org_for_param = orgs data = utils.execute_query( query, [codes, org_for_param, [date] if date else []]) return Response(data)
def spending_by_ccg(request, format=None): codes = utils.param_to_list(request.query_params.get('code', [])) codes = utils.get_bnf_codes_from_number_str(codes) orgs = utils.param_to_list(request.query_params.get('org', [])) spending_type = utils.get_spending_type(codes) if spending_type is False: err = CODE_LENGTH_ERROR return Response(err, status=400) if not spending_type or spending_type == 'bnf-section' \ or spending_type == 'chemical': query = _get_query_for_chemicals_or_sections_by_ccg(codes, orgs, spending_type) else: query = _get_query_for_presentations_by_ccg(codes, orgs) if spending_type == 'bnf-section' or spending_type == 'product': codes = [c + '%' for c in codes] data = utils.execute_query(query, [codes, orgs]) return Response(data)
def spending_by_ccg(request, format=None): codes = utils.param_to_list(request.query_params.get('code', [])) codes = utils.get_bnf_codes_from_number_str(codes) orgs = utils.param_to_list(request.query_params.get('org', [])) spending_type = utils.get_spending_type(codes) if spending_type is False: err = 'Error: Codes must all be the same length' return Response(err, status=400) if not spending_type or spending_type == 'bnf-section' \ or spending_type == 'chemical': query = _get_query_for_chemicals_or_sections_by_ccg(codes, orgs, spending_type) else: query = _get_query_for_presentations_by_ccg(codes, orgs) if spending_type == 'bnf-section' or spending_type == 'product': codes = [c + '%' for c in codes] data = utils.execute_query(query, [codes, orgs]) return Response(data)
def total_spending(request, format=None): codes = utils.param_to_list(request.query_params.get('code', [])) codes = utils.get_bnf_codes_from_number_str(codes) data = _get_total_prescribing_entries(codes) return Response(list(data))