Esempio n. 1
0
 def test_prefix_increase(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     starting_from = prefix.starting_from
     response = self.client.post(self.url, self.valid_data)
     assert response.status_code == 302
     assert response.url == '/products/1/view_summary/'
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert starting_from != prefix.starting_from
Esempio n. 2
0
 def test_increase_active_prefix(self):
     prefix = prefix_service.find_item(user=self.user,
                                       starting_from='5390001100003')
     self.loadSession()
     self.loadProducts()
     response = self.client.post(self.url, self.valid_data)
     assert response.status_code == 302
     assert response.url == '/products/4/view_summary/'
     prefix = prefix_service.find_item(user=self.user, prefix=prefix.prefix)
     assert prefix.starting_from == '5390001100027'
Esempio n. 3
0
 def test_next_number_field(self):
     response = self.client.get(self.url, follow=True)
     assert response.status_code == 200
     # self.assertNotContains(response, '<b>53900011</b><span
     # style="color:#F26334">0002</span>7')
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix.starting_from = '5390001100027'
     prefix.save()
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix.starting_from == '5390001100027'
     response = self.client.get(self.url, follow=True)
     assert response.status_code == 200
Esempio n. 4
0
 def test_ajax(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix.description == ''
     prefix_id = prefix.id
     response = self.client.post('/prefixes/ajax/', {
         'pk': prefix_id,
         'value': 'New description'
     })
     assert response.status_code == 200
     assert response.content == b'{"success": true}'
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix.description == 'New description'
Esempio n. 5
0
 def _test_suspended_prefixes_exist(self):
     response = self.client.get(self.url)
     assert response.status_code == 200
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix.is_suspended = 1
     prefix.save()
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix.is_suspended == 1
     response = self.client.get(self.url)
     assert response.status_code == 200
     self.assertContains(response, 'Suspended prefixes')
     self.assertContains(response, '<td>53900011</td>')
Esempio n. 6
0
 def test_product_delete_set(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     prefix.starting_from = '5390001100010'
     prefix.save()
     url = self.reverse('products:delete_product', product_id=2) + '?set=1'
     response = self.post(url)
     assert response.status_code == 302
     assert response.url == self.reverse('products:products_list')
     response = self.get('products:products_list')
     assert response.status_code == 200
     #self.assertContains(response, 'Product 1')
     self.assertNotContains(response, 'Product 2')
     #self.assertContains(response, 'Product 3')
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.starting_from == '5390001100003'
Esempio n. 7
0
 def setUp_createAccount(self):
     country = Country(slug='BE', name='Belgium')
     country.save()
     member_organisation = MemberOrganisation(name='GS1',
                                              slug='gs1',
                                              is_active=1,
                                              country=country)
     member_organisation.save()
     data = {
         'uuid': '53900011',
         'email': '*****@*****.**',
         'company_prefix': '53900011,53900012',
         'company_name': 'GS1 Ireland',
         'credits': '39:20,43:100,44:100',
         'txn_ref': 'Test_1,Test_3,Test_2',
         'member_organisation': 'gs1'
     }
     url = '/API/v0/AccountCreateOrUpdate/'
     response = self.client.post(url, data=data)
     assert response.status_code == 302
     self.client.get(response.url)
     user = User.objects.get(email='*****@*****.**')
     user.profile.agreed = True
     user.profile.save()
     prefix = prefix_service.find_item(user=user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix_service.make_active(user=user, prefix=prefix.prefix)
     self.user = user
     return user
Esempio n. 8
0
 def setUp(self):
     self.user = self.setUp_createAccount()
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     if prefix == self.user.profile.product_active_prefix:
         self.user.profile.product_active_prefix = None
         self.user.profile.save()
Esempio n. 9
0
 def test_with_active_prefix(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix_service.make_active(user=self.user, prefix=prefix.prefix)
     response = self.client.get(self.url)
     self.assertContains(response, 'New Product')
     self.assertContains(response, 'Packaging Level')
Esempio n. 10
0
 def test_active(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.status_id == Prefix.ACTIVE
     response = self.client.get(self.url)
     assert response.status_code == 200
     self.assertNotContains(response, 'Suspended prefixes')
     self.assertNotContains(response, 'Transferred prefixes')
Esempio n. 11
0
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)
Esempio n. 12
0
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)
Esempio n. 13
0
 def setUp_createAccount(self):
     country, is_created = Country.objects.get_or_create(slug='BE',
                                                         name='Belgium')
     member_organisation, is_created = MemberOrganisation.objects.get_or_create(
         slug='gs1',
         defaults=dict(name='GS1',
                       gs1_enable_advanced_dashboard=1,
                       is_active=1,
                       country=country))
     response = self.client.post(
         '/API/v0/AccountCreateOrUpdate/', {
             'uuid': '53900011',
             'email': '*****@*****.**',
             'company_prefix': '53900011,53900012',
             'company_name': 'GS1 Ireland',
             'credits': '39:20,43:100,44:100',
             'txn_ref': 'Test_1,Test_3,Test_2',
             'member_organisation': 'gs1'
         })
     assert response.status_code == 302
     self.client.get(response.url)
     user = User.objects.get(email='*****@*****.**')
     assert not user is None
     user.profile.agreed = True
     user.profile.save()
     prefix = prefix_service.find_item(user=user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix_service.make_active(user=user, prefix=prefix.prefix)
     return user
Esempio n. 14
0
 def test_frozen(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     prefix.status_id = Prefix.FROZEN
     prefix.save()
     response = self.client.get(self.url)
     assert response.status_code == 200
     self.assertNotContains(response, 'Suspended prefixes')
     self.assertNotContains(response, 'Transferred prefixes')
Esempio n. 15
0
 def test_prefix_rollover_product(self):
     response = self.client.post(self.url, self.valid_data)
     assert response.status_code == 302
     assert response.url == '/products/1/view_summary/'
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix.starting_from = '5390001199991'
     prefix.increment_starting_from()
     assert prefix.starting_from == '5390001100010'
Esempio n. 16
0
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'))
Esempio n. 17
0
 def _add_package_type(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix_service.make_active(user=self.user, prefix=prefix.prefix)
     package_level = PackageLevel(
         id='60',
         level='Consumer Unit (Base Unit/Each) e.g. bottle of beer',
         unit_descriptor='BASE_UNIT_OR_EACH')
     package_level.save()
     response = self.client.post('/products/add/', {'package_level': '60'})
     assert response.status_code == 302
     assert response.url == '/products/add_product_package_type/'
Esempio n. 18
0
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)
Esempio n. 19
0
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)
    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'))

    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'

    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)

    return render(request, 'products_react/product_react_fulledit_form.html', context=context)
Esempio n. 20
0
def add_product_package_type(request):
    """
    package type selector
    :return:
    """
    session = request.session.get('new_product', None)
    if not session:
        raise Http404('Session does not exist')
    gtin = session.get('gtin', None)
    if not gtin:
        raise Http404('No gtin in session')
    prefix = prefix_service.find_item(user=request.user, starting_from=str(gtin))
    if not prefix:
        raise Http404('Starting prefix (%s) not found' % prefix)

    if request.method == 'POST':
        form = PackageTypeForm(request.POST, prefix=prefix)
        if form.is_valid():
            request.session['new_product'].update({
                'package_type': form.cleaned_data['package_type'],
                'bar_placement': form.cleaned_data['bar_placement']
            })
            if session.get('package_level') == '70':
                return redirect(reverse('products:add_product_base_details'))
            else:
                return redirect(reverse('products:subproduct_add_case'))
    else:
        form = PackageTypeForm(prefix=prefix)
        if session.get('package_level') == '70':
            form.initial['bar_placement'] = settings.STATIC_URL + 'products/site/wizard/proddesc/BG.png'
            form.initial['package_type'] = '1'
        else:
            form.initial['bar_placement'] = settings.STATIC_URL + 'products/site/wizard/proddesc/CS.png'
            form.initial['package_type'] = '34'

    if session.get('package_level') == '70':
        package_level = 'Base Unit / Each'
    elif session.get('package_level') == '60':
        package_level = 'Pack or inner pack'
    elif session.get('package_level') == '50':
        package_level = 'Case or mixed case'
    elif session.get('package_level') == '40':
        package_level = 'Display unit'
    else:
        package_level = 'Pallet'  # 30

    context = {
        'form': form,
        'prefix': prefix,
        'package_types': PackageType.service.filter(ui_enabled=True).order_by('id'),
        'package_level': package_level
    }
    return render(request, 'products/package_type_form.html', context=context)
Esempio n. 21
0
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)
Esempio n. 22
0
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
Esempio n. 24
0
def subproduct_add_case_skip(request):
    """
    Clean selection of subproducts to be included into parent
    upper level item (PACK, CASE, ...).
    :return:
    """
    session = request.session.get('new_product', {})
    if not session:
        raise Http404()

    gtin = session.get('gtin', 0)
    prefix = prefix_service.find_item(user=request.user, starting_from=str(gtin))
    if not prefix:
        raise Http404()

    pl = session.get('package_level', None)
    if not pl:
        flash(request, 'Choose a package level', 'danger')
        return redirect(reverse('products:add_product'))

    # we remove subproducts, we move to the next step
    session['sub_products'] = []
    return redirect('/products/js-add/#/details?package_level=%s&package_type=%s' % (session['package_level'], session['package_type']))
Esempio n. 25
0
def view_product_summary(request, product_id):
    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()

    sub_products = sub_product_service.get_associated(product)
    nop = None
    if product.package_level.id == PackageLevel.BASE:
        title = 'New Base Unit / Each (Summary)'
    else:
        title = 'New item (Summary)'
        nop = len(sub_products)

    is_xhr = request.GET.get('xhr', False) and True
    if is_xhr:
        template_name = 'products/product_summary_xhr.html'
    else:
        template_name = 'products/product_summary.html'

    product_fields = []
    product_fields_list = product._meta.get_fields()
    for field in product_fields_list:
        product_fields.append({'name': field.name, 'value': getattr(product, field.name)})

    context = {
        'title': title,
        'prefix': prefix,
        'product': product,
        'product_fields': product_fields,
        'nop': nop,
        'sub_products': sub_products,
        'debug': False
    }
    return render(request, template_name, context=context)
Esempio n. 26
0
 def test_make_active(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix == self.user.profile.product_active_prefix
     prefix1 = prefix.prefix
     prefix = prefix_service.find_item(user=self.user, prefix='53900012')
     assert prefix.prefix == '53900012'
     assert prefix != self.user.profile.product_active_prefix
     prefix2 = prefix.prefix
     prefix_service.make_active(user=self.user, prefix=prefix1)
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix == self.user.profile.product_active_prefix
     prefix = prefix_service.find_item(user=self.user, prefix='53900012')
     assert prefix.prefix == '53900012'
     assert prefix != self.user.profile.product_active_prefix
     prefix_service.make_active(user=self.user, prefix=prefix2)
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix != self.user.profile.product_active_prefix
     prefix = prefix_service.find_item(user=self.user, prefix='53900012')
     assert prefix.prefix == '53900012'
     assert prefix == self.user.profile.product_active_prefix
Esempio n. 27
0
 def test_models_get_active(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     assert prefix == self.user.profile.product_active_prefix
Esempio n. 28
0
 def test_models_make_starting_from(self):
     prefix = prefix_service.find_item(user=self.user, prefix='53900011')
     assert prefix.prefix == '53900011'
     prefix.make_starting_from()
     assert prefix.starting_from == '5390001100003'
Esempio n. 29
0
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)
Esempio n. 30
0
def subproduct_add_case(request):
    """
    Allows for selection of subproducts to be included into
    parent upper level item (PACK, CASE, ...).
    :return:
    """
    session = request.session.get('new_product', {})
    if request.GET.get('gtin', None):
        session['gtin'] = request.GET.get('gtin')
    if request.GET.get('package_level', None):
        session['package_level'] = request.GET.get('package_level')
    if request.GET.get('package_type', None):
        session['package_type'] = request.GET.get('package_type')
    request.session['new_product'] = session

    if not session:
        raise Http404()
    gtin = session.get('gtin', 0)
    prefix = prefix_service.find_item(
        user=request.user,
        starting_from=str(gtin)
    )
    if not prefix:
        raise Http404()
    pl = session.get('package_level', None)
    if not pl:
        flash(request, 'Choose a package level', 'danger')
        return redirect(reverse('products:add_product'))

    try:
        page = int(request.GET.get('page', '1'))
    except (ValueError, TypeError):
        page = 1

    settings_per_page = getattr(settings, 'PRODUCTS_PER_PAGE', 10)
    try:
        per_page = int(request.GET.get('per_page'))
    except (ValueError, TypeError):
        per_page = None
    if per_page:
        session['per_page'] = per_page
    else:
        per_page = session.get('per_page', settings_per_page)

    prefixes = prefix_service.all(user=request.user)
    package_level = package_level_service.get(pl)
    products = Product.service.get_available_subproducts(
        owner=request.user,
        package_level=package_level
    )

    target_markets = gtin_target_market_service.get_by_products_list(products)
    target_market_choices = [['', '']]
    for target_market in target_markets:
        try:
            if target_market_choices[-1][0] == target_market.target_market.code:
                continue
        except Exception:
            pass
        target_market_choices.append([
            target_market.target_market.code,
            target_market.target_market.market
        ])

    filter_data = {}
    form = SubProductsForm()
    filterform = FilterForm()
    if request.method == 'POST':
        form = SubProductsForm(request.POST)
        if form.is_valid():
            if request.POST.get('filtersubmit'):
                filterform = FilterForm(request.POST)
                if filterform.is_valid():
                    products = product_helper.filter_list(products, filterform)
                    session['adding_filter'] = filter_data
            else:
                # form = forms.SubProductsForm(request.form)
                # we no longer use data from form but from session
                sub_products = session.get('sub_products', [])
                sub_products.sort()

                if len(sub_products) > 0:
                    sub_products_data = Product.service.check_subproducts(
                        sub_product_gtins=sub_products,
                        package_level=package_level,
                        owner=request.user
                    )
                    if sub_products_data['is_valid']:
                        # we have subproducts, we move to the next step
                        session['sub_products'] = sub_products
                        # return redirect(reverse('products:subproduct_add_case_details'))
                        return redirect('/products/js-add/#/details?package_level=%s&package_type=%s' % (session['package_level'], session['package_type']))
                    else:
                        # we have incorrect subproducts
                        flash(request, sub_products_data['error'], 'danger')
                        return redirect(reverse('products:subproduct_add_case'))
                else:
                    # we do not have subproducts - we reselect
                    flash(request, 'You must choose products before proceeding to next form', 'danger')
                    return redirect(reverse('products:subproduct_add_case'))
    else:
        session['sub_products'] = []

    if request.GET.get('clear_filter'):
        if session.get('adding_filter'):
            del session['adding_filter']
    if session.get('adding_filter'):
        filter_data = session['adding_filter']
    else:
        filterform = FilterForm()
        filterform.initial['pallet'] = False
        if package_level.id >= PackageLevel.CASE:
            filterform.initial['case'] = False
        if package_level.id >= PackageLevel.PACK:
            filterform.initial['pack'] = False

    # products = ProductFilter(filter_data, queryset=products).qs
    filterform.set_prefixes(prefixes)

    if products:
        paginator = Paginator(products, per_page)
        try:
            paginator_page = paginator.page(page)
        except InvalidPage:
            paginator_page = paginator.page(1)
        object_list = paginator_page.object_list
    else:
        paginator_page = None
        object_list = None

    assoc_products = get_assoc_products_by_products_list(object_list)

    filterform.fields['target_market'].choices = target_market_choices
    filterform.base_fields['target_market'].choices = target_market_choices
    filterform.declared_fields['target_market'].choices = target_market_choices
    context = {
        'products': object_list,
        'assoc_products': assoc_products,
        'prefix': prefix,
        'form': form,
        'filterform': filterform,
        'pagination': paginator_page,
        'per_page': per_page,
        'ppp': settings_per_page,
        'enable_leading': True     # user.profile.enable_leading
    }

    return render(request, 'products/subproduct_add_case.html', context=context)