コード例 #1
0
ファイル: products.py プロジェクト: sai9912/mypyton
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)
コード例 #2
0
ファイル: products.py プロジェクト: sai9912/mypyton
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'))
コード例 #3
0
ファイル: products.py プロジェクト: sai9912/mypyton
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'))
コード例 #4
0
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)
コード例 #5
0
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)
コード例 #6
0
    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()
コード例 #7
0
ファイル: products.py プロジェクト: sai9912/mypyton
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,)))
コード例 #8
0
ファイル: products.py プロジェクト: sai9912/mypyton
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)
コード例 #9
0
ファイル: products.py プロジェクト: sai9912/mypyton
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)
コード例 #10
0
ファイル: products.py プロジェクト: sai9912/mypyton
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)
コード例 #11
0
ファイル: products.py プロジェクト: sai9912/mypyton
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)