def products_list_js(request): user_active_prefix = request.user.profile.product_active_prefix if request.GET.get('prefix'): prefix = prefix_service.find_item(user=request.user, prefix=request.GET.get('prefix')) if prefix and prefix != user_active_prefix: prefix_service.make_active(prefix.prefix, user=request.user) elif not prefix: flash(request, 'Incorrect active prefix. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) else: prefix = user_active_prefix if not prefix: flash(request, 'You must have an active prefix to see products. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) templates = {} for item in ProductTemplate.objects.filter(member_organisation=request.user.profile.member_organisation): templates[item.package_level_id] = True all_in_range = Product.objects.filter( company_organisation=request.user.profile.company_organisation, gs1_company_prefix=prefix.prefix ) completeness = product_helper.get_completeness(all_in_range) context = { 'prefix': prefix, 'templates': templates, 'completeness': completeness } return render(request, 'products/list_js.html', context=context)
def delete_target_market(request, product_id): product = Product.service.get_my_product(request.user, product_id) target_markets = gtin_target_market_service.get_target_markets_other(product) if len(target_markets) <= 0: raise Http404() gtin_target_market_service.delete_target_market(product, product.target_market) product.target_market = target_markets[0].target_market product.save() url = reverse('products:fulledit', args=(product_id,)) target_markets_names_arr = [] for item in target_markets: target_markets_names_arr.append(item.target_market.market) target_markets_names = ', '.join(target_markets_names_arr) flash(request, 'Product <a href="%s" style="text-decoration:underline">%s</a> exist with %s target markets' % (url, product.label_description, target_markets_names), 'success') return redirect(reverse('products:products_list'))
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 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 fulledit_js(request, product_id): """ displays via GET and provides product update mechanics via POST :param product_id: :return: """ product = Product.service.get_my_product(request.user, product_id) prefix = prefix_service.find_item(user=request.user, prefix=product.gs1_company_prefix) if not prefix: raise Http404() if prefix != request.user.profile.product_active_prefix: flash(request, 'This product is not in your active prefix', 'danger') return redirect(reverse('products:products_list')) barcodes = {} # for bc in product.barcodes: # barcodes.update({bc.kind: bc}) if request.GET.get('barcodes'): active_tab = 'barcodes' elif request.GET.get('cloud'): active_tab = 'cloud' else: active_tab = 'details' if prefix.is_upc(): kind = 'UPCA' else: kind = 'EAN13' pp = pprint.PrettyPrinter(indent=4) template_name = 'products/product_fulledit_form_js.html' # dev-ui-vue context = {'product': product, 'barcodes': barcodes, 'active_tab': active_tab, 'product_id': product_id, 'pkg_level': product.package_level_id, 'prefix': prefix, 'agreed': request.user.profile.agreed, 'product_image': product.website_url, 'gtin': product.gtin, 'gtin0': product.gtin[0:1], 'gtin13': product.gtin[1:14], 'product_package_level_id': product.package_level_id, 'advanced_tab': product.owner.profile.advanced_tab, 'kind': kind } # pp.pprint(prefix.__dict__) # ======= # context = {'product': product, # 'barcodes': barcodes, # 'active_tab': active_tab, # 'product_id': product_id, # 'pkg_level': product.package_level_id, # 'prefix': prefix, # 'agreed': request.user.profile.agreed, # 'product_image': product.website_url, # 'gtin': product.gtin, # 'gtin0': product.gtin[0:1], # 'gtin13': product.gtin[1:14], # 'product_package_level_id': product.package_level_id, # 'advanced_tab': product.owner.profile.advanced_tab, # 'kind': kind # } # >>>>>>> integration # if sub_products: # context.update({'nop': product.number_of_products()}) # context['sub_products'] = _get_subprods_from_obj(product) if request.method == 'POST': if product.package_level_id == 70: form = ProductForm(request.POST) else: form = ProductCaseForm(request.POST) form_valid = form.is_valid(request) if request.FILES: upload_image(request, product) ''' _add_field_descriptions(form) sub_prods = _get_subprods_from_form(request.form) context['sub_products'] = sub_prods # if product.package_level_id != 70: # subs_valid = _validate_subprods(sub_prods) # if not subs_valid: form.errors['subProducts'] = ['invalid subproducts'] # FIXME # else: # we allow for packs without children ''' subs_valid = True if form_valid and subs_valid: # form_errors = check_values(template_name, form, **context) form_errors = None if form_errors is not None: return form_errors gtin = form.data.get('gtin', '') context['gtin'] = gtin context['gtin0'] = gtin[0:1] context['gtin13'] = gtin[1:14] if not gtin[1:14].startswith(prefix.prefix): flash(request, 'You entered a non valid GTIN number (error #005)', 'danger') context['form'] = form return render(request, template_name, context=context) form_data = {} for formfield in form.cleaned_data: try: if form.cleaned_data[formfield] != '': form_data[formfield] = form.cleaned_data[formfield] else: pass except Exception as e: pass # validate presence of subproducts # if product.package_level_id != 70 and not sub_prods: # flash('Consider adding sub-products', 'info') ''' form.populate_obj(product) img = request.files.get('upload') if img: try: product.add_image(img) context['product_image'] = product.website_url except Exception as e: logging.getLogger().error('Image add error: ' + str(e)) flash(str(e), 'danger') return render_template(template_name, form=form, **context) ''' try: ### PRODUCT UPDATE UI product = Product.service.update(product=product, owner=request.user, prefix=prefix, **form_data) except Exception as e: flash(request, str(e), 'danger') context['form'] = form return render(request, template_name, context=context) ''' # subproducts -- update for sub_p, quantity, _valid in sub_prods: if int(quantity) > 0: sub_p.quantity = quantity services.sub_product_service.save(sub_p) else: services.sub_product_service.delete(sub_p) flash(_("All changes saved sucessfully"), 'success') return redirect(url_for('.fulledit', product_id=product.id)) ''' else: if product.package_level_id == 70: print('ProductFormOptions, errors:', form.errors) else: print('ProductCaseFormOptions, errors:', form.errors) else: # GET form = ProductForm(product) schema_repr, alpaca_options = DjangoFormToJSONSchema().convert_to_schema(form) form_data = schema_repr['properties'] form_data['gtin']['type'] = 'hidden' form_data['bar_placement']['type'] = 'hidden' form_data['package_level']['type'] = 'hidden' form_data['package_type']['type'] = 'hidden' for field in form: value = field.value() form_data[field.name]['errors'] = field.errors if value is not None: if field.name == 'package_level' and hasattr(value, '__dict__'): value = value.__dict__.copy() value.pop('_state', None) if isinstance(value, Decimal): form_data[field.name]['value'] = str(value) else: form_data[field.name]['value'] = value if 'enum' in form_data[field.name]: form_data[field.name]['enum'] = [] for choice in field.field.widget.choices: form_data[field.name]['enum'].append([choice[0], choice[1]]) form_data[field.name]['required'] = field.field.required context['form'] = form 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)) product_template = ProductTemplate.objects.filter( package_level=product.package_level, member_organisation=product.member_organisation ).first() js_ref_obj = { 'csrf': csrf.get_token(request), 'form_data': form_data, 'advanced_tab': product.owner.profile.advanced_tab, 'active_tab': active_tab, 'enable_leading': False, 'prefix': prefix.prefix, 'prefix_is_special': prefix.is_special, 'mo_slug': prefix.member_organisation.slug, 'kind': kind, 'agreed': request.user.profile.agreed, 'product': serialize_to_dict(product, fields_only=True), 'product_template_id': product_template.id if product_template else None, 'user_company': None, 'barcodes': barcodes, 'package_type_list': package_type_list, 'language': translation_helpers.get_current_language(), 'fallback_languages': settings.FALLBACK_LANGUAGES, } context['form_data_json'] = json.dumps(js_ref_obj) # Hardcode user token into the template for the time being # token = AuthToken.objects.create(request.user) # create knox token for UI # print('created token: %s' % token) # context['auth_token'] = token return render(request, template_name, context=context)
def is_valid(self, show_flash=False): ''' Validation function, we are not using djando validation :return: ''' verified = super(ProductDetailForm, self).is_valid() gtin = '0' + self.data.get('gtin', '') # todo: check this '0' if not barcode_utilities.isValid(gtin) and len(gtin) != 14: if show_flash: flash(show_flash, 'You entered a non valid GTIN number (error #001)', 'danger') self.errors['gtin'] = ( 'You entered a non valid GTIN number (error #001)', ) verified = False # bar_placement # package_level_id = self.data.get('package_level_id', None) # package_type_id = self.data.get('package_type_id', None) # Company Name # company = self.data.get('company', None) # Label Description label_description = self.data.get('label_description', None) if not label_description: if show_flash: flash(show_flash, 'Label description field is required.', 'danger') self.errors['label_description'] = ['This field is required.'] verified = False # Brand brand = self.data.get('brand', None) if not brand: if show_flash: flash(show_flash, 'Brand field is required.', 'danger') self.errors['brand'] = ['This field is required.'] verified = False # Sub brand # sub_brand = self.data.get('sub_brand', None) # Product Type/Functional Name functional_name = self.data.get('functional_name', None) if not functional_name: if show_flash: flash(show_flash, 'Product Type/Functional Name field is required.', 'danger') self.errors['functional_name'] = ['This field is required.'] verified = False # Variant # variant = self.data.get('variant', None) # Product/Trade Item Description description = self.data.get('description', None) if not description: if show_flash: flash(show_flash, 'Product/Trade Item Description field is required.', 'danger') self.errors['description'] = ['This field is required.'] verified = False # Global Product Classification category = self.data.get('category', None) if not category: if show_flash: flash(show_flash, 'Global Product Classification field is required.', 'danger') self.errors['category'] = ['This field is required.'] verified = False # Company/Internal Product Code or SKU # sku = self.data.get('sku', None) # Country Of Origin # country_of_origin = self.data.get('country_of_origin', None) # Target Market # target_market = self.data.get('target_market', None) # Language # language = self.data.get('language', None) # GLN of Information provider # gln_of_information_provider = self.data.get('gln_of_information_provider', None) # The item is a Base Unit # is_bunit = self.data.get('is_bunit', False) # The item is a Consumer Unit is_cunit = True if self.data.get('is_cunit', False) else False # The item is a Dispatch Unit is_dunit = True if self.data.get('is_dunit', False) else False # The item is a Variable Weight Product is_vunit = True if self.data.get('is_vunit', False) else False # The item is an Invoice Unit is_iunit = True if self.data.get('is_iunit', False) else False # The item is an Orderable Unit is_ounit = True if self.data.get('is_ounit', False) else False if not (is_cunit or is_dunit or is_vunit or is_iunit or is_ounit): self.errors['optionalFields'] = [ 'Options: At least one option must be selected.' ] if show_flash: flash(show_flash, 'Options: At least one option must be selected.', 'danger') verified = False # Gross Weight gross_weight = self.data.get('gross_weight', None) gross_weight_uom = self.data.get('gross_weight_uom', '') if gross_weight_uom != '': error_fl = False if gross_weight == '': error_fl = True try: if float(gross_weight) <= 0 or abs( float(gross_weight)) >= 10**6: error_fl = True except (ValueError, TypeError): error_fl = True if error_fl: error_message = 'Gross weight must be a positive number greater than zero and less than 1000000.00' self.errors['gross_weight'] = [error_message] if show_flash: flash(show_flash, error_message, 'danger') verified = False # Net Weight net_weight = self.data.get('net_weight', None) net_weight_uom = self.data.get('net_weight_uom', '') if net_weight_uom != '': error_fl = False if net_weight == '': error_fl = True try: if float(net_weight) <= 0 or abs(float(net_weight)) >= 10**6: error_fl = True except (ValueError, TypeError): error_fl = True if error_fl: error_message = 'Net weight must be a positive number greater than zero and less than 1000000.00' self.errors['net_weight'] = [error_message] if show_flash: flash(show_flash, error_message, 'danger') verified = False # Depth depth = self.data.get('depth', None) depth_uom = self.data.get('depth_uom', '') if depth_uom != '': error_fl = False if depth == '': error_fl = True try: if float(depth) <= 0 or abs(float(depth)) >= 10**6: error_fl = True except (ValueError, TypeError): error_fl = True if error_fl: error_message = 'Depth must be a positive number greater than zero and less than 1000000.00' self.errors['depth'] = [error_message] if show_flash: flash(show_flash, error_message, 'danger') verified = False # Width width = self.data.get('width', None) width_uom = self.data.get('width_uom', '') if width_uom != '': error_fl = False if width == '': error_fl = True try: if float(width) <= 0 or abs(float(width)) >= 10**6: error_fl = True except (ValueError, TypeError): error_fl = True if error_fl: error_message = 'Width must be a positive number greater than zero and less than 1000000.00' self.errors['width'] = [error_message] if show_flash: flash(show_flash, error_message, 'danger') verified = False # Height height = self.data.get('height', None) height_uom = self.data.get('height_uom', '') if height_uom != '': error_fl = False if height == '': error_fl = True try: if float(height) <= 0 or abs(float(height)) >= 10**6: error_fl = True except (ValueError, TypeError): error_fl = True if error_fl: error_message = 'Height must be a positive number greater than zero and less than 1000000.00' self.errors['height'] = [error_message] if show_flash: flash(show_flash, error_message, 'danger') verified = False # External image URL (if hosted) # website_url = self.data.get('website_url', None) ''' (TODO) if form.package_level_id.data == str(PackageLevel.BASE) and hasattr(form, 'net_weight'): if form.net_weight_uom.data and not form.net_weight.data: form.net_weight.errors = [error] found_error = True try: if float(form.net_weight.data) <= 0 or abs(float(form.net_weight.data)) >= 10 ** 6: form.net_weight.errors = [error] found_error = True except (ValueError, TypeError): form.net_weight.data = None if form.package_level_id.data == str( PackageLevel.BASE) and form.net_content_uom.data and not form.net_content.data: form.net_content.errors = [error] found_error = True try: if form.package_level_id.data == str(PackageLevel.BASE) and ( float(form.net_content.data) <= 0 or abs(float(form.net_content.data)) >= 10 ** 6): form.net_content.errors = [error] found_error = True except (ValueError, TypeError): form.net_content.data = None ''' return verified and super().is_valid()
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,)))
def fulledit(request, product_id): """ displays via GET and provides product update mechanics via POST :param product_id: :return: """ product = Product.service.get_my_product(request.user, product_id) if not product: raise Http404() prefix = prefix_service.find_item(user=request.user, prefix=product.gs1_company_prefix) user_active_prefix = request.user.profile.product_active_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')) barcodes = {} # for bc in product.barcodes: # barcodes.update({bc.kind: bc}) if request.GET.get('barcodes'): active_tab = 'barcodes' barcodes['EAN13'] = True elif request.GET.get('cloud'): active_tab = 'cloud' else: active_tab = 'details' if prefix.is_upc(): kind = 'UPCA' else: kind = 'EAN13' template_name = 'products/product_fulledit_form.html' context = { 'product': product, 'barcodes': barcodes, 'active_tab': active_tab, 'product_id': product_id, 'pkg_level': product.package_level_id, 'prefix': prefix, 'agreed': request.user.profile.agreed, 'product_image': product.website_url, 'gtin': product.gtin, 'gtin0': product.gtin[0:1], 'gtin13': product.gtin[1:14], 'product_package_level_id': product.package_level_id, 'advanced_tab': product.owner.profile.advanced_tab, 'kind': kind } # if sub_products: # context.update({'nop': product.number_of_products()}) # context['sub_products'] = _get_subprods_from_obj(product) if request.method == 'POST': if product.package_level_id == 70: form = ProductForm(request.POST) else: form = ProductCaseForm(request.POST) form_valid = form.is_valid(request) if request.FILES: upload_image(request, product) ''' _add_field_descriptions(form) sub_prods = _get_subprods_from_form(request.form) context['sub_products'] = sub_prods # if product.package_level_id != 70: # subs_valid = _validate_subprods(sub_prods) # if not subs_valid: form.errors['subProducts'] = ['invalid subproducts'] # FIXME # else: # we allow for packs without children ''' subs_valid = True if form_valid and subs_valid: # form_errors = check_values(template_name, form, **context) form_errors = None if form_errors is not None: return form_errors gtin = form.data.get('gtin', '') context['gtin'] = gtin context['gtin0'] = gtin[0:1] context['gtin13'] = gtin[1:14] if not gtin[1:14].startswith(prefix.prefix): flash(request, 'You entered a non valid GTIN number (error #005)', 'danger') context['form'] = form return render(request, template_name, context=context) form_data = {} for formfield in form.cleaned_data: try: if form.cleaned_data[formfield] != '': form_data[formfield] = form.cleaned_data[formfield] else: pass except Exception as e: pass # validate presence of subproducts # if product.package_level_id != 70 and not sub_prods: # flash('Consider adding sub-products', 'info') if product.target_market.code != form_data['target_market']: gtin_target_market_service.change_target_market(product, form_data['target_market']) try: ### PRODUCT UPDATE UI product = Product.service.update(product=product, owner=request.user, prefix=prefix, **form_data) except Exception as e: flash(request, str(e), 'danger') context['form'] = form return render(request, template_name, context=context) ''' # subproducts -- update for sub_p, quantity, _valid in sub_prods: if int(quantity) > 0: sub_p.quantity = quantity services.sub_product_service.save(sub_p) else: services.sub_product_service.delete(sub_p) flash(_("All changes saved sucessfully"), 'success') return redirect(url_for('.fulledit', product_id=product.id)) ''' return redirect(reverse('products:products_list')) else: if product.package_level_id == 70: print('ProductForm, errors:', form.errors) else: print('ProductCaseForm, errors:', form.errors) else: # GET form = ProductForm(product) context['form'] = form target_markets = gtin_target_market_service.get_target_markets_other(product) context['target_markets'] = target_markets return render(request, template_name, context=context)
def add_product(request): """ GET/POST for adding a new base or case product :return: """ subproduct_helper.subproducts_reset(request.session) # remove subproducst from session if any 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(prefix.prefix, request.user) 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')) 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(): try: prefix.make_starting_from() except Exception: flash(request, 'not allowed to create products for this prefix.', 'danger') return redirect(reverse('prefixes:prefixes_list')) if not request.session.get('new_product', None): request.session['new_product'] = { 'gtin': prefix.starting_from, 'package_level': form.data['package_level'] } elif request.session['new_product'].get('gtin') != prefix.starting_from: request.session['new_product'] = { 'gtin': 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['new_product'].get('gtin') == prefix.starting_from): form.data['package_level'] = request.session.get('new_product')['package_level'] templates = ProductTemplate.objects.filter( member_organisation=request.user.profile.member_organisation ).order_by('order') context = {'title': title, 'prefix': prefix, 'templates': templates } return render(request, 'products/package_level_form.html', context)
def products_list(request): user_active_prefix = request.user.profile.product_active_prefix if request.GET.get('prefix'): prefix = prefix_service.find_item(user=request.user, prefix=request.GET.get('prefix')) if prefix and prefix != user_active_prefix: prefix_service.make_active(prefix.prefix, user=request.user) elif not prefix: flash(request, 'Incorrect active prefix. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) else: prefix = user_active_prefix if not prefix: flash(request, 'You must have an active prefix to see products. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) try: page = int(request.GET.get('page', '1')) except (ValueError, TypeError): page = 1 try: settings_per_page = settings.PRODUCTS_PER_PAGE except: settings_per_page = 10 try: per_page = int(request.GET.get('per_page')) except (ValueError, TypeError): per_page = None if per_page: request.session['per_page'] = per_page else: per_page = request.session.get('per_page', settings_per_page) all_in_range = Product.objects.filter( company_organisation=request.user.profile.company_organisation, gs1_company_prefix=prefix.prefix ) target_market_ids = all_in_range.values_list('target_market', flat=True).distinct() target_markets = TargetMarket.objects.filter(id__in=target_market_ids) target_market_choices = [['', '']] for target_market in target_markets: try: if target_market_choices[-1][0] == target_market.code: continue except Exception: pass target_market_choices.append([target_market.code, target_market.market]) completeness = product_helper.get_completeness(all_in_range) if request.method == 'POST': form = FilterForm(request.POST) if form.is_valid(): all_in_range = product_helper.filter_list(all_in_range, form) request.session['list_filter'] = product_helper.make_filter(form) else: logging.getLogger().debug(str(form.errors)) else: if request.GET.get('clear_filter'): if request.session.get('list_filter'): del request.session['list_filter'] if request.session.get('list_filter'): try: form = FilterForm(request.session['list_filter']) all_in_range = product_helper.filter_list(all_in_range, form) except: del request.session['list_filter'] form = FilterForm() else: form = FilterForm() # if sort arguments are provided in GET we will override them # see https://github.com/tbikeev/robot-gs1/issues/30 if request.GET.get('sort_mode') and request.GET.get('sort_field'): form.data['sort_field'] = request.GET.get('sort_field') form.data['sort_mode'] = request.GET.get('sort_mode') sort_field = form.data.get('sort_field', form.fields['sort_field'].initial) sort_mode = form.data.get('sort_mode', form.fields['sort_mode'].initial) if sort_mode == 'desc': sort_order = '-%s' % sort_field sort_mode = 'Descending' else: sort_order = sort_field sort_mode = 'Ascending' for key, value in form.fields['sort_field'].choices: if sort_field == key: sort_field = value break products = all_in_range.order_by(sort_order) paginator = Paginator(products, per_page) try: paginator_page = paginator.page(page) except InvalidPage: paginator_page = paginator.page(1) form.fields['target_market'].choices = target_market_choices form.base_fields['target_market'].choices = target_market_choices form.declared_fields['target_market'].choices = target_market_choices templates = {} for item in ProductTemplate.objects.filter(member_organisation=request.user.profile.member_organisation): templates[ item.package_level_id ] = True assoc_products = [] for p in paginator_page.object_list: if p.package_level.id != 70: subproducts = SubProduct.objects.filter(product=p).all() sub_p = [] for subproduct in subproducts: sub_product = subproduct.sub_product sub_p.append({'id': sub_product.id, 'package_level': {'id': sub_product.package_level_id}, 'brand': sub_product.brand, 'description': sub_product.description, 'gtin': sub_product.gtin, 'gs1_company_prefix': sub_product.gs1_company_prefix, 'bar_type': sub_product.bar_type, 'quantity': subproduct.quantity}) assoc_products.append({'p_id': p.id, 'sub_p': sub_p}) context = {'prefix': prefix, 'latest_product_list': paginator_page.object_list, 'assoc_products': assoc_products, 'pagination': paginator_page, 'per_page': per_page, 'ppp': settings_per_page, 'sorted': {'field': sort_field, 'mode': sort_mode}, 'form': form, 'enable_leading': True, # request.user.enable_leading 'templates': templates, 'completeness': completeness} return render(request, 'products/list.html', context=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)