def excel_import_file(request): def validate_file(filename): ALLOWED_EXTENSIONS = {'xls', 'xlsx', 'ods', 'csv'} return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS prefix_prefix = prefix_service.get_active(user=request.user) if prefix_prefix: prefix = prefix_service.find_item(user=request.user, prefix=prefix_prefix) else: flash( request, 'You must have an active prefix to be able to import product data', 'danger') return redirect(reverse('prefixes:prefixes_list')) if request.method == 'POST': imp_file = request.FILES['import_file'] if imp_file and validate_file(imp_file.name): ext = imp_file.name.rsplit('.', 1)[1] tfile = tempfile.NamedTemporaryFile(suffix=".%s" % ext, delete=False) for chunk in imp_file.chunks(): tfile.write(chunk) tfile.close() # try: errors = import_products(prefix, request.user, tfile.name, request) if errors and len(errors) != 0: zfile = tempfile.NamedTemporaryFile(suffix='.zip') with ZipFile(zfile.name, 'w') as z: efile = tempfile.NamedTemporaryFile(suffix='.txt') with open(efile.name, 'w') as error_file: for error in errors: for label, field_errors in error.items(): error_file.write('%s: \r\n' % label) for field, field_error in field_errors.items(): error_file.write('\t%s: %s\r\n' % (field, field_error)) error_file.write('\r\n') z.write(efile.name, 'import_errors.txt') try: prefix.make_starting_from() except Exception as ex: prefix.starting_from = None finally: prefix_service.save(prefix) send_file = open(zfile.name, 'rb') response = HttpResponse(send_file, content_type='application/zip') response[ 'Content-Disposition'] = 'attachment; filename="import_errors.zip"' return response else: flash(request, 'Import completed with no errors', 'success') return redirect(reverse('products:products_list')) form = ImportForm() context = {'prefix': prefix, 'form': form} return render(request, 'excel/import_file.html', context=context)
def create_sample_subproduct(self, **kwargs): """ Create Subproduct with generic data or given data :param data: dict :return: products.models.Product """ generic_data = { 'gtin': '00891980000001', 'company_organisation': self.company_organisation, 'gs1_company_prefix': self.prefix.prefix, 'category': 'Category', 'label_description_i18n': json.dumps({'en': 'Subproduct Label'}), 'description_i18n': json.dumps({'en': 'Subproduct Description'}), 'brand_i18n': json.dumps({'en': 'Brand'}), 'sub_brand': 'Sub Brand', 'functional_name_i18n': json.dumps({'en': 'Subproduct Functional name'}), 'variant': 'Variant 1', 'is_bunit': False, 'is_cunit': True, 'is_dunit': False, 'is_vunit': True, 'is_iunit': False, 'is_ounit': True, } generic_data.update(kwargs) self.prefix.increment_starting_from() prefix_service.save(self.prefix) product = Product.objects.create(**generic_data) return product
def create_sample_product(cls, **kwargs): """ Create Product with generic data or given data :param data: dict :return: products.models.Product """ generic_data = { "gtin": '0' + cls.prefix.starting_from, "company_organisation": cls.company_organisation, "gs1_company_prefix": cls.prefix.prefix, "category": "Category 1", "label_description_i18n": json.dumps({"en": "Label 1"}), "description_i18n": json.dumps({"en": "Description 1"}), "brand_i18n": json.dumps({"en": "Brand 1"}), "sub_brand": "Sub Brand 1", "functional_name_i18n": json.dumps({"en": "Functional name 1"}), "variant": "Variant 1", "is_bunit": False, "is_cunit": True, "is_dunit": False, "is_vunit": True, "is_iunit": False, "is_ounit": True, "package_level_id": 70, } generic_data.update(kwargs) cls.prefix.increment_starting_from() prefix_service.save(cls.prefix) product = Product.objects.create(**generic_data) return product
def delete_product(request, product_id): product = Product.service.get_my_product(request.user, product_id) user_active_prefix = request.user.profile.product_active_prefix prefix = prefix_service.find_item(user=request.user, prefix=product.gs1_company_prefix) if not prefix: raise Http404() if prefix != user_active_prefix: flash(request, 'This product is not in your active prefix', 'danger') return redirect(reverse('products:products_list')) if prefix.is_special == 'READ-ONLY': flash(request, 'This product belongs to read only range', 'danger') return redirect(reverse('products:products_list')) #if product.associated_products: # flash(request, 'This product is part of a container and cannot be deleted', 'danger') # return redirect(request.referrer) gtin = product.gtin if product.image != settings.NO_IMAGE: try: image = os.path.split(product.image)[1] except: image = None else: image = None if image: delete_product_image(image, request.user.id) ''' barcodes = Barcodes.service.find(product_id=product_id, user_id=request.user.id).all() for barcode in barcodes: delete_barcode_images(gtin[1:14], current_user.id) services.barcode_service.delete(barcode) ''' ''' sub_product_entries = services.sub_product_service.find(product_id=product_id).all() try: services.product_service.delete(product) except Exception as e: logging.getLogger().error('Delete product error: ' + str(e)) flash('An error happened while trying to delete this product', 'danger') return redirect(request.referrer) for sbe in sub_product_entries: services.sub_product_service.delete(sbe) ''' extra = '' if request.GET.get('set'): prefix.starting_from = gtin[1:14] prefix_service.save(user=request.user, prefix=prefix) extra = " Prefix's starting number set to deleted product's GTIN" product.delete() flash(request, 'Product deleted successfully.' + extra, 'success') return redirect(reverse('products:products_list'))
def prefixes_ajax(request): if request.method != 'POST': raise Http404() prefix_id = request.POST.get('pk', None) if not prefix_id: raise Http404() prefix = prefix_service.find_item(user=request.user, id=prefix_id) if not prefix: raise Http404() prefix.description = request.POST.get('value', None) prefix_service.save(prefix, user=request.user) return jsonify(success=True)
def create(self, validated_data): prefix = validated_data['gs1_company_prefix'] validated_data['gs1_company_prefix'] = prefix.prefix if self._image_upload: # don't reset image if there is uploaded file validated_data.pop('image_i18n', None) product = super(ProductSerializer, self).create(validated_data) self.save_image(product, validated_data) prefix.increment_starting_from() prefix_service.save(prefix) return product
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 prefixes_ajax(request): if request.method != 'POST': return Http404() current_user = request.user prefix_id = request.POST.get('pk', None) if not prefix_id: return Http404() company_organisation = users_service.get_company_organisation(current_user) prefix = prefix_service.find_item( company_organisation=company_organisation, id=prefix_id) if not prefix: return Http404() prefix.description = request.POST.get('value', None) prefix_service.save(prefix) return jsonify(success=True)
def test_tm_stays_gtin_allocated(self): products_count_old = len(Product.objects.all()) product = Product.objects.get(id=2) product.package_level_id = PackageLevel.BASE product.save() prefix = prefix_service.find_item(user=self.user, prefix=product.gs1_company_prefix) for i in range(0, 3): prefix.increment_starting_from() prefix_service.save(prefix) url = self.reverse( 'products:duplicate_product', product_id=product.id, target_market=product.target_market.code ) response = self.client.get(url) assert response.status_code == 302 assert response.url == '/products/4/fulledit/' assert response.url != self.reverse('products:fulledit', product_id=product.id) products_count_new = len(Product.objects.all()) assert products_count_new == products_count_old + 1 # new product created
def prefixes_list(request): current_user = request.user company_organisation = users_service.get_company_organisation(current_user) prefixes = prefix_service.all() susp_prefixes = prefix_service.find( company_organisation=company_organisation, is_suspended=True).all() ''' prefixes = prefix_service.find_all().all() result = db.session.query('prefix', 'products'). \ from_statement(text("select products.gs1_company_prefix as prefix, count(*) as products from products where owner_id=%s group by products.gs1_company_prefix" % current_user.id)).all() result_locations = db.session.query('prefix', 'locations'). \ from_statement(text("select locations.gs1_company_prefix as prefix, count(*) as locations from locations where owner_id=%s group by locations.gs1_company_prefix" % current_user.id)).all() # set products count for prefix in prefixes: for row in result: if prefix.prefix == row[0]: setattr(prefix, 'products', row[1]) # set locations count for prefix in prefixes: for row in result_locations: if prefix.prefix == row[0]: setattr(prefix, 'locations', row[1]) ''' if request.method == 'POST': form = PrefixActionForm(request.POST) form.fields['select_prefix'].choices = [(str(p.id), p.prefix) for p in prefixes] if form.is_valid(): try: int_prefix_id = int(form.data['select_prefix']) except (ValueError, TypeError): flash(request, 'Your selections were not valid!', 'danger') else: prefix = prefix_service.get(int_prefix_id) if not prefix: raise Http404('Prefix not found') if prefix.is_special == 'READ-ONLY' and form.data[ 'prefix_action'] != 'set_this': flash(request, 'Read-only prefix, please contact GS1 helpdesk.', 'danger') else: prefix_service.make_active(prefix.id) prefix_action = form.data['prefix_action'] # Enter a new product in selected range if prefix_action == 'new_product': return redirect( reverse('user:products.add_product') + '?prefix=' + str(prefix.prefix)) # Set selected range as active and go to My Products elif prefix_action == 'set_this': return redirect(reverse('user:products.products_list')) # Set starting GTIN in selected range manually elif prefix_action == 'starting_gtin': return redirect( reverse('prefixes:prefixes_set_starting', args=(prefix.id, ))) # Set starting GTIN to first available number elif prefix_action == 'first_available': try: prefix.make_starting_from() except Exception as e: return render(request, 'prefixes/prefix_exhausted.html', { 'current_user': current_user, 'prefix': prefix }) prefix_service.save(prefix) flash( request, 'Starting gtin has been set to GTIN-%s' % prefix.starting_from, 'success') return redirect(reverse('prefixes:prefixes_list')) # new location elif prefix_action == 'new_gln': return redirect( reverse('user:locations.add_location') + '?prefix=' + str(prefix.prefix)) elif prefix_action == 'first_available_gln': pass ''' try: prefix.make_starting_from_gln() except Exception,e: return render_template('prefixes/prefix_exhausted.html', prefix=prefix) prefix_service.save(prefix) return redirect(url_for('.prefixes_list')) ''' # Export available GTINs in this range elif prefix_action == 'export_available': try: products = (Product.objects.filter( owner=current_user).filter( gs1_company_prefix=prefix.prefix).order_by( 'gtin')) prfxs = prefix.get_available_gtins(products) if len(prfxs) > 0: tfile = tempfile.NamedTemporaryFile( suffix='.xlsx') zfile = tempfile.NamedTemporaryFile( suffix='.zip') file_xlsx = load_workbook( settings.PREFIXES_EXCEL_TEMPLATE) ws = file_xlsx.active for index, prfx in enumerate(prfxs): _ = ws.cell(column=2, row=index + 5, value=prfx) file_xlsx.save(filename=tfile.name) with ZipFile(zfile.name, "w") as z: export_filename = "export_%s_available.xlsx" % ( prefix.prefix, ) attachment_filename = "export_%s_available.%s" % ( prefix.prefix, 'zip') z.write(tfile.name, export_filename) send_file = open(zfile.name, 'rb') response = HttpResponse( send_file, content_type='application/zip') response[ 'Content-Disposition'] = 'attachment; filename=%s' % attachment_filename return response else: flash( request, 'There are no available GTIN numbers for current active prefix', 'danger') except Exception as e: flash(request, 'Error: %s' % str(e), 'danger') else: flash(request, 'You must choose a prefix and an action!', 'danger') form = PrefixActionForm() form.fields['select_prefix'].choices = [(str(p.id), p.prefix) for p in prefixes] try: selected_prefix = int(request.POST['select_prefix']) prefix_service.make_active(selected_prefix) except: selected_prefix = prefix_service.get_active(company_organisation) config = {'GS1_GLN_CAPABILITY': settings.GS1_GLN_CAPABILITY} context = { 'current_user': current_user, 'config': config, 'prefixes': prefixes, 'susp_prefixes': susp_prefixes, 'flashed_messages': flash_get_messages(request), 'selected_prefix': selected_prefix } return render(request, 'prefixes/prefixes_list.html', 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 account_create_or_update(request): if request.method == 'POST': form = AccountCreateOrUpdateForm(request.POST) if form.is_valid(): try: # core data email = form.data.get('email') company_name = form.data.get('company_name') try: member_organisation = MemberOrganisation.objects.get( slug=form.cleaned_data.get('member_organisation')) except MemberOrganisation.DoesNotExist: member_organisation = None # 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.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) # user, user_created = users_service.get_or_create(email=email, # defaults={ # 'username': email, # 'customer_role': 'gs1ie', # 'organisation': organisation # }) 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 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( company_organisation=company_organisation, member_organisation=member_organisation).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( prefix=prfx, company_organisation=company_organisation, member_organisation=member_organisation) 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(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( company_organisation=company_organisation, member_organisation=member_organisation, prefix=prfx).first() prefix.is_suspended = True prefix.is_active = False prefix_service.save(prefix) # Check active prefix and set accordingly try: prefix_service.find(company_organisation=company_organisation, member_organisation=member_organisation, is_active=True, is_suspended=False).first() except ObjectDoesNotExist: prefix = prefix_service.find( company_organisation=company_organisation, member_organisation=member_organisation, is_active=False, is_suspended=False).order_by('prefix').first() if not prefix: return jsonify(success=False, message='No working prefix found') prefix.is_active = True prefix_service.save(prefix) except MultipleObjectsReturned: prefixes = prefix_service.find( company_organisation=company_organisation, member_organisation=member_organisation, is_active=True, is_suspended=False).order_by('prefix').all() for prefix in prefixes: prefix.is_active = False prefix_service.save(prefix) prefix = prefixes[0] prefix.is_active = True prefix_service.save(prefix) serializer = URLSafeTimedSerializer(settings.SECRET_KEY) token = serializer.dumps( [auth_user.email, company_organisation.uuid]) logging.getLogger().debug('Created token: %s' % token) return redirect('/API/v1/auth/%s/' % token) else: form = AccountCreateOrUpdateForm() current_user = request.user context = {'current_user': current_user, 'active_page': '', 'form': form} return render(request, 'gs1ie/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)
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 duplicate_product(request, product_id, target_market): product = Product.service.get_my_product(request.user, product_id) user_active_prefix = request.user.profile.product_active_prefix prefix = prefix_service.find_item(user=request.user, prefix=product.gs1_company_prefix) if not prefix: raise Http404() if prefix != user_active_prefix: flash(request, 'This product is not in your active prefix', 'danger') return redirect(reverse('products.products_list_js')) if prefix.is_special == 'READ-ONLY': flash(request, 'This product belongs to read only range', 'danger') return redirect(reverse('products.products_list_js')) clone_fl = True target_markets = gtin_target_market_service.get_target_markets_all(product) for item in target_markets: if item.target_market.code == target_market: clone_fl = False break # Add new target market if clone_fl: gtin_target_market_service.add_target_market(product, target_market) target_market_record = target_market_service.find_by_code(target_market) product.target_market = target_market_record product.save() return redirect(reverse('products:fulledit', args=(product_id,))) # Swap target market form <-> others if product.target_market.code != target_market: target_market_record = target_market_service.find_by_code(target_market) product.target_market = target_market_record product.save() return redirect(reverse('products:fulledit', args=(product_id,))) if not prefix.starting_from: flash(request, 'The next available number is not available or you have exhausted this prefix.' ' Product not cloned. To licence an additional company prefix please' ' go to the <a href="http://www.gs1ie.organisation/Members-Area">Members Area</a>' ' of the GS1 Ireland website.', 'danger') return redirect(reverse('products:fulledit', args=(product_id,))) if product.package_level_id != PackageLevel.BASE: flash(request, 'You can only clone base unit/each products', 'danger') return redirect(reverse('products:fulledit', args=(product_id,))) product.id = None product.barcodes = [] product.gtin = product.gtin[0:1] + prefix.starting_from product.description = '[CLONED] ' + product.description try: Product.service.save(product) except Exception as e: logging.getLogger().error('Product clone error: ' + str(e)) flash(request, 'AN error occurred while trying to clone this product', 'danger') return redirect(reverse('products:fulledit', args=(product_id,))) # Update prefix try: prefix.increment_starting_from() prefix_service.save(prefix) except Exception as e: flash(request, str(e), 'danger') product_orig = Product.service.get_my_product(request.user, product_id) gtin_target_market_service.clone_product(product_orig, product) if request.GET.get('fulledit_js'): return redirect(reverse('products:fulledit_js', args=(product.id,))) else: return redirect(reverse('products:fulledit', args=(product.id,)))