from django.http import HttpResponseRedirect, HttpResponse, JsonResponse from django.shortcuts import render, get_object_or_404 from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_http_methods import json import logging import re from account.decorators import login_required from .models import Product, SeasonRegionMaterial from procat2.models import Season, Region log = logging.getLogger(__name__) @csrf_exempt @login_required @require_http_methods(["POST"]) def search_products(request): body = request.body if not body or len(body) < 1: return HttpResponse('Bad request: no data', status=400) data = json.loads(body.decode('utf-8')) text = data.get('text') if not text or len(text) < 1: return HttpResponse('Bad request: no search text', status=400) season_id = data.get('season') if not season_id or len(season_id) < 1: return HttpResponse('Bad request: no season id', status=400) season = Season.objects.get(id=season_id) if not season: return HttpResponse('Bad request: no season found', status=400) region_id = data.get('region') if not region_id or len(region_id) < 1: return HttpResponse('Bad request: no region id', status=400) region = Region.objects.get(id=region_id) if not region: return HttpResponse('Bad request: no region found', status=400) ids = Product.find_sap_ids(text) log.info('found ids %s in %s', ids, text) prods = [] missing = [] if ids: srm = SeasonRegionMaterial.objects.filter(material__in=ids, season=season.id, region=region.id).distinct('material') srm_ids = [x.material for x in srm] search_prods = Product.objects.filter(sap__in=srm_ids).distinct('sap') # fix product order to match input ids and find missing ids prod_dict = dict([(p.sap, p) for p in search_prods]) for i in ids: if prod_dict.get(i): prods.append(prod_dict[i]) else: missing.append(i) out = { 'found': [p.serialize() for p in prods], 'missing': missing, } return JsonResponse(out)