def prefixes_set_starting(request, prefix_id): current_user = request.user prefix = prefix_service.find_item(user=current_user, id=prefix_id) if not prefix: raise Http404() sn_length = 12 - len(prefix.prefix) if request.method == 'POST': error = 'Incorrect entry. Please enter a valid number' form = StartingNumberForm(request.POST) if form.is_valid(): if len(form.data['starting_number']) == sn_length: try: int(form.cleaned_data['starting_number']) except (ValueError, TypeError): pass else: starting_number = normalize( 'EAN13', prefix.prefix + form.cleaned_data['starting_number']) products = product_service.filter( gtin="0" + starting_number, owner=current_user).all() if len(products) == 0: prefix.starting_from = starting_number prefix_service.save(prefix) flash( request, 'Starting gtin has been set to GTIN-%s' % prefix.starting_from, 'success') return redirect(reverse('prefixes:prefixes_list')) else: error = 'This number is already assigned. Try another one.' flash(request, error, 'danger') form = StartingNumberForm() if not prefix.starting_from: try: prefix.make_starting_from() except: return render(request, 'prefixes/prefix_exhausted.html', { 'current_user': current_user, 'prefix': prefix }) prefix_service.save(prefix) form.data['starting_number'] = prefix.starting_from[len(prefix.prefix):12] context = { 'current_user': current_user, 'prefix': prefix, 'form': form, 'current': prefix.starting_from, 'sn_length': sn_length, 'flashed_messages': flash_get_messages(request) } return render(request, 'prefixes/set_starting.html', context=context)
def subproduct_add_case_details(request): """ GET / POST for adding a new upper level item (case, pack, pallet) :template_name: products/product_details_form.html :return: """ session = request.session.get('new_product', None) if not session: raise Http404() # Check session and restart if missing, allow for missing sub_products for k in ['sub_products', 'package_level', 'gtin']: if k not in session.keys(): del session['new_product'] flash(request, 'Add new product restarted #011', 'danger') return redirect(reverse('products:add_product')) gtin = session.get('gtin', '0') prefix = None if len(gtin) == 13: prefix = prefix_service.find_item( user=request.user, starting_from=str(gtin) ) elif len(gtin) == 14: # FIXME - dirty hack p_list = [gtin[1:x] for x in range(-6, 0)] # build a list of possible prefixes prefix = prefix_service.find_prefix_from_list(p_list) # select the correct one if not prefix: raise Http404() if prefix.is_upc(): kind = 'UPCA' else: kind = 'EAN13' p_ids = session.get('sub_products', []) if not p_ids: flash(request, 'Choose products for this container', 'danger') return redirect(reverse('products:subproduct_add_case')) if len(p_ids) == 1 and p_ids[0] == '0': arbitrary = True products = [] elif len(p_ids) == 0: arbitrary = False products = [] else: arbitrary = False products = [ (p, 0, True) for p in Product.objects.filter(id__in=p_ids).order_by('gtin').all() ] if len(products) == 0: flash(request, 'Choose products for this container', 'danger') return redirect(reverse('products:subproduct_add_case')) title = 'New item (Step 2 of 2: Details)' readonly = False # if not request.user.enable_leading: # readonly = True context = {'prefix': prefix, 'sub_products': products, 'title': title, 'arbitrary': arbitrary, 'product_package_level_id': int(session.get('package_level', '0')), 'kind': kind, 'readonly': readonly} if len(gtin) == 13: context.update({'gtin0': '0', 'gtin13': session.get('gtin','')}) elif len(gtin) == 14: # readonly = False context.update({'gtin0': gtin[0], 'gtin13': gtin[1:]}) context['leading_gln'] = normalize('EAN13', prefix.prefix) if request.method == 'POST': context['is_new'] = 0 sub_prods = _get_prods_from_form(request) context['sub_products'] = sub_prods form = ProductCaseDetailForm(request.POST) form_valid = form.is_valid(show_flash=request) if not form_valid: for error in form.errors: if error != 'optionalFields': error_message = '%s: %s' % (error, form.errors[error][0]) flash(request, error_message, 'danger') if not sub_prods and not arbitrary: flash(request, 'You must enter the number of products contained (error #006)', 'danger') form_valid = False if not arbitrary: subs_valid = _validate_subprods(request, sub_prods) else: subs_valid = True if not subs_valid: form.errors['subProducts'] = ['invalid subproducts'] if form.data.get('gtin', '')[1:14].startswith(prefix.prefix): gtin_valid = True else: flash(request, 'You entered a non valid GTIN number (error #001)', 'danger') gtin_valid = False if form_valid and subs_valid and gtin_valid: form_data = {} for formfield in form.data: try: if formfield == 'csrfmiddlewaretoken': continue if form.data[formfield] != '': form_data[formfield] = form.data[formfield] else: pass except Exception: pass try: ### PRODUCT CREATE UI (PACK) product = Product.service.create(owner=request.user, company_organisation=prefix.company_organisation, prefix=prefix, **form_data) except Exception as e: flash(request, str(e), 'danger') return redirect(reverse('products:subproduct_add_case_details')) # Load image if request.FILES: upload_image(request, product) # Update prefix try: prefix.increment_starting_from() prefix_service.save(prefix) except Exception as e: flash(request, str(e), 'danger') if not arbitrary: for sub_p in sub_prods: quantity = int(sub_p[1]) if quantity > 0: sub_product_service.create(product_id=product.id, sub_product_id=sub_p[0].id, quantity=sub_p[1]) if request.session.get('new_product'): del request.session['new_product'] return redirect(reverse('products:view_product_summary', args=(product.id,))) else: # GET context['is_new'] = 1 form = ProductCaseDetailForm() #_add_field_descriptions(form) if len(products) > 0: form.initial['brand'] = products[0][0].brand form.initial['sub_brand'] = products[0][0].sub_brand form.initial['functional_name'] = products[0][0].functional_name form.initial['variant'] = products[0][0].variant # copy category from child if there is just one child (issue #147) form.initial['category'] = products[0][0].category # set default GLN form.initial['gln_of_information_provider'] = normalize('EAN13', prefix.prefix) form.initial['company'] = prefix.company_organisation.company form.initial['package_level'] = session.get('package_level', '0') form.initial['package_type'] = session.get('package_type', '0') form.initial['image'] = session.get('image', settings.NO_IMAGE) # if _session['package_level'] in ["4", "70"]: # form.bar_placement.data = settings.STATIC_URL + 'products/site/wizard/proddesc/base.gif' if session.get('package_level', '0') in ['3', '60']: form.initial['bar_placement'] = settings.STATIC_URL + 'products/site/wizard/proddesc/innerpack_PIDS.gif' elif session.get('package_level', '0') in ['2', '50']: form.initial['bar_placement'] = settings.STATIC_URL + 'products/site/wizard/proddesc/case.png' elif session['package_level'] in ['1', '30']: form.initial['bar_placement'] = settings.STATIC_URL + 'products/site/wizard/proddesc/pallet_PIDS.gif' context['form'] = form country = request.user.profile.member_organisation.country country_of_origin = country_of_origin_service.find_by_country(country) if country_of_origin: form.initial['country_of_origin'] = country_of_origin.code target_market = target_market_service.find_by_country(country) if target_market: form.initial['target_market'] = target_market.code language_slug = request.user.profile.language language = language_service.find_by_slug(language_slug) if language: form.initial['language'] = language.slug return render(request, 'products/product_details_form.html', context=context)
def js_add_product(request): """ GET/POST for adding a new base or case product :return: """ user_active_prefix = request.user.profile.product_active_prefix prefix = request.POST.get('prefix', None) if prefix is None: prefix = request.GET.get('prefix', None) if prefix: prefix = prefix_service.find_item(user=request.user, prefix=prefix) if prefix and prefix != user_active_prefix: prefix_service.make_active(user=request.user, prefix=prefix.prefix) if request.session.get('new_product', None): del request.session['new_product'] else: prefix = user_active_prefix if not prefix: flash(request, 'You must have an active prefix set to enter new product. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) if not prefix.starting_from: flash(request, 'You must have a starting number set to enter new product. Please set one', 'danger') return redirect(reverse('prefixes:prefixes_list')) if prefix.is_special == 'READ-ONLY': flash( request, 'You can not add a new product in this range. It\'s a suspended read-only range', 'danger' ) return redirect(reverse('products:products_list')) # if prefix.is_special != 'NULL': # package_rows = services.package_level_service.find( # id=models.PACKAGE_LEVEL_SPECIAL_ENUM[prefix.is_special]).all() # else: # package_rows = package_level_service.all() package_rows = PackageLevel.service.all() express = True if request.POST.get('express') or request.GET.get('express') else False title = _('New Product') if express: title = 'Express Allocation' if request.method == 'POST': form = PackageLevelForm(request.POST) form.set_package_levels(package_rows) if form.is_valid(): if not request.session.get('new_product', None): request.session['new_product'] = {'gtin': str(prefix.starting_from), 'package_level': form.data['package_level']} elif request.session.get('new_product')['gtin'] != str(prefix.starting_from): request.session['new_product'] = {'gtin': str(prefix.starting_from), 'package_level': form.data['package_level']} else: request.session['new_product']['package_level'] = form.data['package_level'] if express: request.session['new_product'].update({'express': True}) elif 'express' in request.session['new_product']: del request.session['new_product']['express'] return redirect(reverse('products:add_product_package_type')) # if session['new_product']['package_level'] == str(models.BASE_PACKAGE_LEVEL): # if session['new_product'].get('express'): # return redirect(url_for('products.add_product_express')) # else: # return redirect(url_for('products.add_product_package_type')) # else: # return redirect(url_for('products.subproduct_add_case')) else: flash(request, 'You must choose a level to proceed', 'danger') else: form = PackageLevelForm() form.set_package_levels(package_rows) if ( request.session.get('new_product', None) and request.session.get('new_product')['gtin'] == str(prefix.starting_from) ): form.data['package_level'] = request.session.get('new_product')['package_level'] package_type_list_qs = PackageType.service.filter(ui_enabled=True).order_by('id').all() package_type_list = json.loads(serializers.serialize("json", package_type_list_qs)) context = { 'title': title, 'prefix': prefix, 'flashed_messages': flash_get_messages(request), 'form_data_json': json.dumps({ 'mo_slug': prefix.member_organisation.slug, 'package_type_list': package_type_list, 'gtin': str(prefix.starting_from), 'gln_of_information_provider': normalize('EAN13', prefix.prefix), 'language': translation_helpers.get_current_language(), 'fallback_languages': settings.FALLBACK_LANGUAGES, }) } return render(request, 'products/product_add_js.html', context)
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) try: member_organisation = MemberOrganisation.objects.get( slug=request.data['member_organisation']) except: return Response({'data': 'Unknown member_organisation'}, status=status.HTTP_400_BAD_REQUEST) if member_organisation.login_api_auth_only: try: company_organisation, auth_user = self.perform_login( serializer) except Exception: return Response({'data': 'Unknown user'}, status=status.HTTP_400_BAD_REQUEST) else: company_organisation, auth_user = self.perform_create(serializer) member_organisation = auth_user.profile.member_organisation self.push_info_to_logger(auth_user, company_organisation) if member_organisation.login_api_secure: try: token_user = request._auth.user assert token_user.profile.member_organisation == auth_user.profile.member_organisation except AssertionError as e: return Response({'data': 'm2m token mismatch'}, status=status.HTTP_400_BAD_REQUEST) # return if we are in read-only mode if member_organisation.login_api_auth_only: return Response(get_api_auth(auth_user.email), status=status.HTTP_200_OK) # if user's organisation has prefix override, use it # if not use prefixes provided by the form if not company_organisation.prefix_override: form_prefix = serializer.validated_data.get('company_prefix', None) else: form_prefix = company_organisation.prefix_override if form_prefix is not None: form_prefixes = form_prefix.split(',') else: form_prefixes = [] prefixes = prefix_service.find(user=auth_user).all() prefixes_list = [v for v in prefixes.values_list('prefix', flat=True)] # set gln to be first prefix if len(prefixes_list) > 0: first_prefix = prefixes_list[0] derived_gln = normalize("EAN13", first_prefix) company_organisation.gln = derived_gln # if we are in read-write copy country from MO to the company self.set_country_and_save(company_organisation, member_organisation) for prfx in form_prefixes: if not re.match(member_organisation.gs1_prefix_regex, prfx[:3]) or len(prfx) < 6: if prfx.find( '20' ) == 0: # we will not complain about variable weight continue else: return Response(status=400, data=f'Invalid prefix {prfx}') if prfx not in prefixes_list: try: prefix = prefix_service.create(user=auth_user, prefix=prfx) except IntegrityError: return Response( status=400, data= f'Prefix {prfx} has been allocated for another user') try: prefix.make_starting_from() except: prefix.starting_from = None prefix_service.save(user=auth_user, prefix=prefix) else: i = prefixes_list.index(prfx) if prefixes[i].is_suspended: prefixes[i].is_suspended = False prefix_service.save(prefixes[i]) for prfx in prefixes_list: if prfx not in form_prefixes: prefix = prefix_service.find(user=auth_user, prefix=prfx).first() prefix.is_suspended = True prefix_service.save(prefix) # Check active prefix and set accordingly user_active_prefix = auth_user.profile.product_active_prefix if not user_active_prefix: prefix = prefix_service.find( user=auth_user, is_suspended=False).order_by('prefix').first() if prefix: prefix_service.make_active(user=auth_user, prefix=prefix.prefix) prefix_service.save(prefix) # else: # return Response(status=400, data='No working prefix found') return Response(get_api_auth(auth_user.email), status=status.HTTP_201_CREATED)
def handle(self, *args, **options): """ python manage.py load_company_user deployment/deployment-v1-2018-03/mo_users.json :return: """ filename = options['filename'] try: with open(filename) as json_data: data = json.load(json_data) except Exception as e: print( '\n**************\nUnable to load json file. {0}. \n\n\nException message: ' .format(filename), e.message) else: companies_data = data.get('companies') if companies_data: for company_data in companies_data: if not 'uuid' in company_data: continue try: # expected value: email, company_name, member_organization, uuid, company_prefix email = company_data.get('email') company_name = company_data.get('company_name') try: member_organisation = MemberOrganisation.objects.get( slug=company_data.get('role')) except MemberOrganisation.DoesNotExist: member_organisation = None # get company company_organisation, company_organisation_created = CompanyOrganisation.objects.get_or_create( uuid=company_data.get('uuid'), defaults={ 'member_organisation': member_organisation, 'name': company_data.get('name') }) #print("Company Created:- " if company_organisation_created else "Company Updated:- ", # u' '.join( # [company_organisation.uuid]).encode('utf-8').strip()) # update company name if any if company_name: company_organisation.company = company_name company_organisation.save() auth_user, auth_user_created = users_service.get_or_create( email=email, defaults={ 'username': email, 'member_organisation': member_organisation, 'company_organisation': company_organisation }) auth_user.save() # print('Create New User:- ' if auth_user_created else 'Updated User:- ', auth_user.email) company_organisation = users_service.get_company_organisation( auth_user) except Exception as e: print(company_data) print(str(e)) continue log_message = 'logging in: ' + str( auth_user.email) + '::' + str( company_organisation.company) log_extra = { 'user': auth_user.email, 'company': company_organisation.company } logging.getLogger().info(log_message, extra=log_extra) logging.getLogger('audit').info(log_message, extra=log_extra) # if user's organisation has prefix override, use it # if not use prefixes provided by the form if company_organisation.prefix_override: form_prefix = company_organisation.prefix_override form_prefixes = form_prefix.split(',') else: form_prefixes = company_data.get('prefixes') prefixes = prefix_service.find(user=auth_user).all() prefixes_list = [p.prefix for p in prefixes] # set gln to be first prefix if len(prefixes_list) > 0: first_prefix = prefixes_list[0] derived_gln = normalize("EAN13", first_prefix) company_organisation.gln = derived_gln company_organisation.save() for prfx in form_prefixes: # if not re.match(settings.GS1_PREFIX_START_REGEX, prfx[:3]) or len(prfx) < 6: # if prfx.find('20') == 0: # we will not complain about variable weight # continue # else: # return jsonify(success=False, message='Invalid prefix %s' % prfx) if prfx not in prefixes_list: try: prefix = prefix_service.create(user=auth_user, prefix=prfx) except IntegrityError: print( '\n\n*** ERROR: Prefix {0} has been allocated for another user\n\n' .format(prfx)) continue try: prefix.make_starting_from() except: prefix.starting_from = None prefix_service.save(prefix) else: i = prefixes_list.index(prfx) if prefixes[i].is_suspended: prefixes[i].is_suspended = False prefix_service.save(prefixes[i]) for prfx in prefixes_list: if prfx not in form_prefixes: prefix = prefix_service.find(user=auth_user, prefix=prfx).first() prefix.is_suspended = True prefix_service.save(prefix) # Check active prefix and set accordingly user_active_prefix = auth_user.profile.product_active_prefix if not user_active_prefix: prefix = prefix_service.find( user=auth_user, is_suspended=False).order_by('prefix').first() if prefix: prefix_service.make_active(user=auth_user, prefix=prefix.prefix) prefix_service.save(prefix) else: print('\n\nERROR: No working prefix found\n\n') continue serializer = URLSafeTimedSerializer(settings.SECRET_KEY) token = serializer.dumps( [auth_user.email, company_organisation.uuid]) logging.getLogger().debug('Created token: %s' % token)
def account_create_or_update(request): auth_only = False if request.method == 'POST': form = AccountCreateOrUpdateForm(request.POST) if form.is_valid(): try: if not request.user.is_anonymous: m2m_token = form.cleaned_data.get('m2m_token', '') if not check_m2m_token(request.user, m2m_token): return redirect(reverse('BCM:login')) try: member_organisation = MemberOrganisation.objects.get( slug=form.cleaned_data.get('member_organisation')) except MemberOrganisation.DoesNotExist: member_organisation = None # core data email = form.cleaned_data.get('email') company_name = form.cleaned_data.get('company_name') # get company company_organisation, company_organisation_created = CompanyOrganisation.objects.get_or_create( uuid=form.data.get('uuid'), member_organisation=member_organisation) # update company name if any if company_name: company_organisation.company = company_name company_organisation.name = company_name company_organisation.save() auth_user, auth_user_created = users_service.get_or_create( email=email, defaults={ 'username': email, 'customer_role': 'gs1ie', 'member_organisation': member_organisation, 'company_organisation': company_organisation }) auth_user.save() company_organisation = users_service.get_company_organisation( auth_user) except Exception as e: return jsonify(success=False, message=str(e)) log_message = 'logging in: ' + str(auth_user.email) + '::' + str( company_organisation.company) log_extra = { 'user': auth_user.email, 'company': company_organisation.company, 'ip_address': request.environ.get('REMOTE_ADDR') } logging.getLogger().info(log_message, extra=log_extra) logging.getLogger('audit').info(log_message, extra=log_extra) if form.data.get('company_prefix', '') == 13 * '0': auth_only = True if not auth_only: # if user's organisation has prefix override, use it # if not use prefixes provided by the form if not company_organisation.prefix_override: form_prefix = form.data.get('company_prefix', '') else: form_prefix = company_organisation.prefix_override form_prefixes = form_prefix.split(',') prefixes = prefix_service.find(user=auth_user).all() prefixes_list = list(prefixes.values_list('prefix', flat=True)) # set gln to be first prefix if len(prefixes_list) > 0: first_prefix = prefixes_list[0] derived_gln = normalize("EAN13", first_prefix) company_organisation.gln = derived_gln company_organisation.save() for prfx in form_prefixes: if not re.match(member_organisation.gs1_prefix_regex, prfx[:3]) or len(prfx) < 6: if prfx.find( '20' ) == 0: # we will not complain about variable weight continue else: return jsonify(success=False, message='Invalid prefix %s' % prfx) if prfx not in prefixes_list: try: prefix = prefix_service.create( user=auth_user, prefix=prfx, status_id=Prefix.ACTIVE) except IntegrityError: return jsonify( success=False, message= 'Prefix %s has been allocated for another user' % prfx) try: prefix.make_starting_from() except: prefix.starting_from = None prefix_service.save(user=auth_user, prefix=prefix) else: i = prefixes_list.index(prfx) if prefixes[i].is_suspended: prefixes[i].is_suspended = False prefix_service.save(prefixes[i]) for prfx in prefixes_list: if prfx not in form_prefixes: prefix = prefix_service.find(user=auth_user, prefix=prfx).first() prefix.is_suspended = True # prefix.is_active = False prefix_service.save(prefix) # Check active prefix and set accordingly user_active_prefix = auth_user.profile.product_active_prefix if not user_active_prefix: prefix = prefix_service.find( user=auth_user, is_suspended=False).order_by('prefix').first() if prefix: prefix_service.make_active(user=auth_user, prefix=prefix.prefix) prefix_service.save(prefix) else: return jsonify(success=False, message='No working prefix found') return redirect(get_api_auth(auth_user.email)) else: form = AccountCreateOrUpdateForm() try: m2m_token_set = request.user.auth_token_set.all() m2m_token = m2m_token_set[0].digest except Exception: m2m_token = '' context = { 'current_user': request.user, 'm2m_token': m2m_token, 'active_page': '', 'form': form } return render(request, 'activate/AccountCreateOrUpdate.html', context)
def add_product_base_details(request): """ -- used for the NEW (Step 2 - EACH) GET / POST for adding a base level item :template_name: products/product_details_form.html :return: """ session = request.session.get('new_product', None) if not session: raise Http404() for k in ['package_type', 'package_level', 'gtin', 'bar_placement']: # Check session and restart if missing if k not in session.keys(): del request.session['new_product'] flash(request, 'Add new product restarted #010', 'danger') return redirect(reverse('products:add_product')) gtin = session.get('gtin', '0') prefix = prefix_service.find_item(user=request.user, starting_from=gtin) if not prefix: raise Http404() if prefix.is_upc(): kind = 'UPCA' else: kind = 'EAN13' if request.method == 'POST': context_is_new = 0 post_data = request.POST.dict() form = ProductDetailForm(data=post_data) verified = True if not form.data.get('gtin', '')[1:14].startswith(prefix.prefix): flash(request, 'You entered a non valid GTIN number (error #001)', 'danger') verified = False if not form.is_valid(request): verified = False if verified: form_data = {} for formfield in form.cleaned_data: try: if formfield == 'csrfmiddlewaretoken': continue if form.data[formfield] != '': form_data[formfield] = form.cleaned_data[formfield] else: pass except Exception as e: pass try: ### PRODUCT CREATE UI with translation.override(form_data.get('language', 'en')): product = Product.service.create( owner=request.user, company_organisation=prefix.company_organisation, prefix=prefix, **form_data ) except Exception as e: flash(request, str(e), 'danger') return redirect(reverse('products:add_product_base_details')) # Load image if request.FILES: upload_image(request, product) # Update prefix try: prefix.increment_starting_from() prefix_service.save(prefix) except Exception as e: flash(request, str(e), 'danger') if request.session.get('new_product'): del request.session['new_product'] return redirect(reverse('products:view_product_summary', args=(product.id,))) else: logging.debug('ProductDetailFormOptions error: %s' % str(form.errors)) else: context_is_new = 1 form = ProductDetailForm() # default values - new product GET form.initial['gln_of_information_provider'] = normalize('EAN13', prefix.prefix) form.initial['is_bunit'] = True form.initial['company'] = prefix.company_organisation.company form.initial['gtin'] = '0' + session.get('gtin') form.initial['bar_placement'] = session.get('bar_placement') form.initial['package_level'] = session.get('package_level') form.initial['package_type'] = session.get('package_type') form.initial['image'] = session.get('image', settings.NO_IMAGE) country = request.user.profile.member_organisation.country country_of_origin = country_of_origin_service.find_by_country(country) if country_of_origin: form.initial['country_of_origin'] = country_of_origin.code target_market = target_market_service.find_by_country(country) if target_market: form.initial['target_market'] = target_market.code language_slug = request.user.profile.language language = language_service.find_by_slug(language_slug) if language: form.initial['language'] = language.slug form.initial['category'] = 'asdfasdf' context = {'title': 'New Base Unit / Each (Step 2 of 2: Details)', 'is_new': context_is_new, 'prefix': prefix, 'gtin0': '0', 'gtin13': session['gtin'], 'kind': kind, 'product_package_level_id': int(session['package_level']), 'leading_gln': normalize('EAN13', prefix.prefix), 'form': form, 'flashed_messages': flash_get_messages(request)} return render(request, 'products/product_details_form.html', context=context)