Ejemplo n.º 1
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)
Ejemplo n.º 2
0
 def create_sample_subproduct(self, **kwargs):
     """
     Create Subproduct with generic data or given data
     :param data: dict
     :return: products.models.Product
     """
     generic_data = {
         'gtin': '00891980000001',
         'company_organisation': self.company_organisation,
         'gs1_company_prefix': self.prefix.prefix,
         'category': 'Category',
         'label_description_i18n': json.dumps({'en': 'Subproduct Label'}),
         'description_i18n': json.dumps({'en': 'Subproduct Description'}),
         'brand_i18n': json.dumps({'en': 'Brand'}),
         'sub_brand': 'Sub Brand',
         'functional_name_i18n': json.dumps({'en': 'Subproduct Functional name'}),
         'variant': 'Variant 1',
         'is_bunit': False,
         'is_cunit': True,
         'is_dunit': False,
         'is_vunit': True,
         'is_iunit': False,
         'is_ounit': True,
     }
     generic_data.update(kwargs)
     self.prefix.increment_starting_from()
     prefix_service.save(self.prefix)
     product = Product.objects.create(**generic_data)
     return product
Ejemplo n.º 3
0
 def create_sample_product(cls, **kwargs):
     """
     Create Product with generic data or given data
     :param data: dict
     :return: products.models.Product
     """
     generic_data = {
         "gtin": '0' + cls.prefix.starting_from,
         "company_organisation": cls.company_organisation,
         "gs1_company_prefix": cls.prefix.prefix,
         "category": "Category 1",
         "label_description_i18n": json.dumps({"en": "Label 1"}),
         "description_i18n": json.dumps({"en": "Description 1"}),
         "brand_i18n": json.dumps({"en": "Brand 1"}),
         "sub_brand": "Sub Brand 1",
         "functional_name_i18n": json.dumps({"en": "Functional name 1"}),
         "variant": "Variant 1",
         "is_bunit": False,
         "is_cunit": True,
         "is_dunit": False,
         "is_vunit": True,
         "is_iunit": False,
         "is_ounit": True,
         "package_level_id": 70,
     }
     generic_data.update(kwargs)
     cls.prefix.increment_starting_from()
     prefix_service.save(cls.prefix)
     product = Product.objects.create(**generic_data)
     return product
Ejemplo n.º 4
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'))
Ejemplo n.º 5
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)
Ejemplo n.º 6
0
    def create(self, validated_data):
        prefix = validated_data['gs1_company_prefix']
        validated_data['gs1_company_prefix'] = prefix.prefix
        if self._image_upload:
            # don't reset image if there is uploaded file
            validated_data.pop('image_i18n', None)

        product = super(ProductSerializer, self).create(validated_data)
        self.save_image(product, validated_data)

        prefix.increment_starting_from()
        prefix_service.save(prefix)
        return product
Ejemplo n.º 7
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)
Ejemplo n.º 8
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
Ejemplo n.º 10
0
def prefixes_list(request):
    current_user = request.user
    company_organisation = users_service.get_company_organisation(current_user)

    prefixes = prefix_service.all()
    susp_prefixes = prefix_service.find(
        company_organisation=company_organisation, is_suspended=True).all()
    '''
    prefixes = prefix_service.find_all().all()
    result = db.session.query('prefix', 'products'). \
        from_statement(text("select products.gs1_company_prefix as prefix, 
                                    count(*) as products
                             from products
                             where owner_id=%s
                             group by products.gs1_company_prefix" % current_user.id)).all()

    result_locations = db.session.query('prefix', 'locations'). \
        from_statement(text("select locations.gs1_company_prefix as prefix, 
                                    count(*) as locations
                             from locations
                             where owner_id=%s
                             group by locations.gs1_company_prefix" % current_user.id)).all()

    # set products count
    for prefix in prefixes:
        for row in result:
            if prefix.prefix == row[0]:
                setattr(prefix, 'products', row[1])

    # set locations count
    for prefix in prefixes:
        for row in result_locations:
            if prefix.prefix == row[0]:
                setattr(prefix, 'locations', row[1])
    '''

    if request.method == 'POST':
        form = PrefixActionForm(request.POST)
        form.fields['select_prefix'].choices = [(str(p.id), p.prefix)
                                                for p in prefixes]
        if form.is_valid():
            try:
                int_prefix_id = int(form.data['select_prefix'])
            except (ValueError, TypeError):
                flash(request, 'Your selections were not valid!', 'danger')
            else:
                prefix = prefix_service.get(int_prefix_id)
                if not prefix:
                    raise Http404('Prefix not found')

                if prefix.is_special == 'READ-ONLY' and form.data[
                        'prefix_action'] != 'set_this':
                    flash(request,
                          'Read-only prefix, please contact GS1 helpdesk.',
                          'danger')
                else:
                    prefix_service.make_active(prefix.id)

                    prefix_action = form.data['prefix_action']
                    # Enter a new product in selected range
                    if prefix_action == 'new_product':
                        return redirect(
                            reverse('user:products.add_product') + '?prefix=' +
                            str(prefix.prefix))

                    # Set selected range as active and go to My Products
                    elif prefix_action == 'set_this':
                        return redirect(reverse('user:products.products_list'))

                    # Set starting GTIN in selected range manually
                    elif prefix_action == 'starting_gtin':
                        return redirect(
                            reverse('prefixes:prefixes_set_starting',
                                    args=(prefix.id, )))

                    # Set starting GTIN to first available number
                    elif prefix_action == 'first_available':
                        try:
                            prefix.make_starting_from()
                        except Exception as e:
                            return render(request,
                                          'prefixes/prefix_exhausted.html', {
                                              'current_user': current_user,
                                              'prefix': prefix
                                          })
                        prefix_service.save(prefix)
                        flash(
                            request, 'Starting gtin has been set to GTIN-%s' %
                            prefix.starting_from, 'success')
                        return redirect(reverse('prefixes:prefixes_list'))

                    # new location
                    elif prefix_action == 'new_gln':
                        return redirect(
                            reverse('user:locations.add_location') +
                            '?prefix=' + str(prefix.prefix))

                    elif prefix_action == 'first_available_gln':
                        pass
                        '''
                        try:
                            prefix.make_starting_from_gln()
                        except Exception,e:
                            return render_template('prefixes/prefix_exhausted.html', prefix=prefix)
                        prefix_service.save(prefix)
                        return redirect(url_for('.prefixes_list'))
                        '''

                    # Export available GTINs in this range
                    elif prefix_action == 'export_available':
                        try:
                            products = (Product.objects.filter(
                                owner=current_user).filter(
                                    gs1_company_prefix=prefix.prefix).order_by(
                                        'gtin'))
                            prfxs = prefix.get_available_gtins(products)
                            if len(prfxs) > 0:
                                tfile = tempfile.NamedTemporaryFile(
                                    suffix='.xlsx')
                                zfile = tempfile.NamedTemporaryFile(
                                    suffix='.zip')

                                file_xlsx = load_workbook(
                                    settings.PREFIXES_EXCEL_TEMPLATE)
                                ws = file_xlsx.active
                                for index, prfx in enumerate(prfxs):
                                    _ = ws.cell(column=2,
                                                row=index + 5,
                                                value=prfx)
                                file_xlsx.save(filename=tfile.name)

                                with ZipFile(zfile.name, "w") as z:
                                    export_filename = "export_%s_available.xlsx" % (
                                        prefix.prefix, )
                                    attachment_filename = "export_%s_available.%s" % (
                                        prefix.prefix, 'zip')
                                    z.write(tfile.name, export_filename)

                                send_file = open(zfile.name, 'rb')
                                response = HttpResponse(
                                    send_file, content_type='application/zip')
                                response[
                                    'Content-Disposition'] = 'attachment; filename=%s' % attachment_filename
                                return response
                            else:
                                flash(
                                    request,
                                    'There are no available GTIN numbers for current active prefix',
                                    'danger')
                        except Exception as e:
                            flash(request, 'Error: %s' % str(e), 'danger')
        else:
            flash(request, 'You must choose a prefix and an action!', 'danger')

    form = PrefixActionForm()
    form.fields['select_prefix'].choices = [(str(p.id), p.prefix)
                                            for p in prefixes]
    try:
        selected_prefix = int(request.POST['select_prefix'])
        prefix_service.make_active(selected_prefix)
    except:
        selected_prefix = prefix_service.get_active(company_organisation)

    config = {'GS1_GLN_CAPABILITY': settings.GS1_GLN_CAPABILITY}

    context = {
        'current_user': current_user,
        'config': config,
        'prefixes': prefixes,
        'susp_prefixes': susp_prefixes,
        'flashed_messages': flash_get_messages(request),
        'selected_prefix': selected_prefix
    }
    return render(request, 'prefixes/prefixes_list.html', context)
Ejemplo n.º 11
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)
Ejemplo n.º 12
0
def account_create_or_update(request):
    if request.method == 'POST':
        form = AccountCreateOrUpdateForm(request.POST)
        if form.is_valid():
            try:
                # core data
                email = form.data.get('email')
                company_name = form.data.get('company_name')
                try:
                    member_organisation = MemberOrganisation.objects.get(
                        slug=form.cleaned_data.get('member_organisation'))
                except MemberOrganisation.DoesNotExist:
                    member_organisation = None

                # get company
                company_organisation, company_organisation_created = CompanyOrganisation.objects.get_or_create(
                    uuid=form.data.get('uuid'),
                    member_organisation=member_organisation)

                # update company name if any
                if company_name:
                    company_organisation.company = company_name
                    company_organisation.save()

                auth_user, auth_user_created = users_service.get_or_create(
                    email=email,
                    defaults={
                        'username': email,
                        'customer_role': 'gs1ie',
                        'member_organisation': member_organisation,
                        'company_organisation': company_organisation
                    })

                auth_user.save()

                company_organisation = users_service.get_company_organisation(
                    auth_user)

                # user, user_created = users_service.get_or_create(email=email,
                #                                                  defaults={
                #                                                      'username': email,
                #                                                      'customer_role': 'gs1ie',
                #                                                      'organisation': organisation
                #                                                  })

            except Exception as e:
                return jsonify(success=False, message=str(e))

            log_message = 'logging in: ' + str(auth_user.email) + '::' + str(
                company_organisation.company)
            log_extra = {
                'user': auth_user.email,
                'company': company_organisation.company,
                'ip_address': request.environ.get('REMOTE_ADDR')
            }
            logging.getLogger().info(log_message, extra=log_extra)
            logging.getLogger('audit').info(log_message, extra=log_extra)

            # if user's organisation has prefix override, use it
            # if not use prefixes provided by the form
            if not company_organisation.prefix_override:
                form_prefix = form.data.get('company_prefix', '')
            else:
                form_prefix = company_organisation.prefix_override
            form_prefixes = form_prefix.split(',')

            prefixes = prefix_service.find(
                company_organisation=company_organisation,
                member_organisation=member_organisation).all()
            prefixes_list = [p.prefix for p in prefixes]

            # set gln to be first prefix
            if len(prefixes_list) > 0:
                first_prefix = prefixes_list[0]
                derived_gln = normalize("EAN13", first_prefix)
                company_organisation.gln = derived_gln
                company_organisation.save()

            for prfx in form_prefixes:
                if not re.match(settings.GS1_PREFIX_START_REGEX,
                                prfx[:3]) or len(prfx) < 6:
                    if prfx.find(
                            '20'
                    ) == 0:  # we will not complain about variable weight
                        continue
                    else:
                        return jsonify(success=False,
                                       message='Invalid prefix %s' % prfx)
                if prfx not in prefixes_list:
                    try:
                        prefix = prefix_service.create(
                            prefix=prfx,
                            company_organisation=company_organisation,
                            member_organisation=member_organisation)
                    except IntegrityError:
                        return jsonify(
                            success=False,
                            message=
                            'Prefix %s has been allocated for another user' %
                            prfx)
                    try:
                        prefix.make_starting_from()
                    except:
                        prefix.starting_from = None
                    prefix_service.save(prefix)
                else:
                    i = prefixes_list.index(prfx)
                    if prefixes[i].is_suspended:
                        prefixes[i].is_suspended = False
                        prefix_service.save(prefixes[i])

            for prfx in prefixes_list:
                if prfx not in form_prefixes:
                    prefix = prefix_service.find(
                        company_organisation=company_organisation,
                        member_organisation=member_organisation,
                        prefix=prfx).first()
                    prefix.is_suspended = True
                    prefix.is_active = False
                    prefix_service.save(prefix)

            # Check active prefix and set accordingly
            try:
                prefix_service.find(company_organisation=company_organisation,
                                    member_organisation=member_organisation,
                                    is_active=True,
                                    is_suspended=False).first()
            except ObjectDoesNotExist:
                prefix = prefix_service.find(
                    company_organisation=company_organisation,
                    member_organisation=member_organisation,
                    is_active=False,
                    is_suspended=False).order_by('prefix').first()
                if not prefix:
                    return jsonify(success=False,
                                   message='No working prefix found')
                prefix.is_active = True
                prefix_service.save(prefix)
            except MultipleObjectsReturned:
                prefixes = prefix_service.find(
                    company_organisation=company_organisation,
                    member_organisation=member_organisation,
                    is_active=True,
                    is_suspended=False).order_by('prefix').all()
                for prefix in prefixes:
                    prefix.is_active = False
                    prefix_service.save(prefix)
                prefix = prefixes[0]
                prefix.is_active = True
                prefix_service.save(prefix)

            serializer = URLSafeTimedSerializer(settings.SECRET_KEY)
            token = serializer.dumps(
                [auth_user.email, company_organisation.uuid])
            logging.getLogger().debug('Created token: %s' % token)
            return redirect('/API/v1/auth/%s/' % token)
    else:
        form = AccountCreateOrUpdateForm()

    current_user = request.user
    context = {'current_user': current_user, 'active_page': '', 'form': form}
    return render(request, 'gs1ie/AccountCreateOrUpdate.html', context)
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        try:
            member_organisation = MemberOrganisation.objects.get(
                slug=request.data['member_organisation'])
        except:
            return Response({'data': 'Unknown member_organisation'},
                            status=status.HTTP_400_BAD_REQUEST)
        if member_organisation.login_api_auth_only:
            try:
                company_organisation, auth_user = self.perform_login(
                    serializer)
            except Exception:
                return Response({'data': 'Unknown user'},
                                status=status.HTTP_400_BAD_REQUEST)
        else:
            company_organisation, auth_user = self.perform_create(serializer)

        member_organisation = auth_user.profile.member_organisation

        self.push_info_to_logger(auth_user, company_organisation)

        if member_organisation.login_api_secure:
            try:
                token_user = request._auth.user
                assert token_user.profile.member_organisation == auth_user.profile.member_organisation
            except AssertionError as e:
                return Response({'data': 'm2m token mismatch'},
                                status=status.HTTP_400_BAD_REQUEST)

        # return if we are in read-only mode
        if member_organisation.login_api_auth_only:
            return Response(get_api_auth(auth_user.email),
                            status=status.HTTP_200_OK)

        # if user's organisation has prefix override, use it
        # if not use prefixes provided by the form
        if not company_organisation.prefix_override:
            form_prefix = serializer.validated_data.get('company_prefix', None)
        else:
            form_prefix = company_organisation.prefix_override
        if form_prefix is not None:
            form_prefixes = form_prefix.split(',')
        else:
            form_prefixes = []

        prefixes = prefix_service.find(user=auth_user).all()
        prefixes_list = [v for v in prefixes.values_list('prefix', flat=True)]

        # set gln to be first prefix
        if len(prefixes_list) > 0:
            first_prefix = prefixes_list[0]
            derived_gln = normalize("EAN13", first_prefix)
            company_organisation.gln = derived_gln

        # if we are in read-write copy country from MO to the company
        self.set_country_and_save(company_organisation, member_organisation)

        for prfx in form_prefixes:
            if not re.match(member_organisation.gs1_prefix_regex,
                            prfx[:3]) or len(prfx) < 6:
                if prfx.find(
                        '20'
                ) == 0:  # we will not complain about variable weight
                    continue
                else:
                    return Response(status=400, data=f'Invalid prefix {prfx}')

            if prfx not in prefixes_list:
                try:
                    prefix = prefix_service.create(user=auth_user, prefix=prfx)
                except IntegrityError:
                    return Response(
                        status=400,
                        data=
                        f'Prefix {prfx} has been allocated for another user')
                try:
                    prefix.make_starting_from()
                except:
                    prefix.starting_from = None
                prefix_service.save(user=auth_user, prefix=prefix)
            else:
                i = prefixes_list.index(prfx)
                if prefixes[i].is_suspended:
                    prefixes[i].is_suspended = False
                    prefix_service.save(prefixes[i])

        for prfx in prefixes_list:
            if prfx not in form_prefixes:
                prefix = prefix_service.find(user=auth_user,
                                             prefix=prfx).first()
                prefix.is_suspended = True
                prefix_service.save(prefix)

        # Check active prefix and set accordingly
        user_active_prefix = auth_user.profile.product_active_prefix
        if not user_active_prefix:
            prefix = prefix_service.find(
                user=auth_user, is_suspended=False).order_by('prefix').first()

            if prefix:
                prefix_service.make_active(user=auth_user,
                                           prefix=prefix.prefix)
                prefix_service.save(prefix)
            # else:
            #     return Response(status=400, data='No working prefix found')

        return Response(get_api_auth(auth_user.email),
                        status=status.HTTP_201_CREATED)
Ejemplo n.º 15
0
    def handle(self, *args, **options):
        """
        python manage.py load_company_user deployment/deployment-v1-2018-03/mo_users.json
        :return:
        """
        filename = options['filename']

        try:
            with open(filename) as json_data:
                data = json.load(json_data)
        except Exception as e:
            print(
                '\n**************\nUnable to load json file. {0}. \n\n\nException message: '
                .format(filename), e.message)
        else:

            companies_data = data.get('companies')
            if companies_data:
                for company_data in companies_data:

                    if not 'uuid' in company_data:
                        continue
                    try:
                        # expected value: email, company_name, member_organization, uuid, company_prefix
                        email = company_data.get('email')
                        company_name = company_data.get('company_name')
                        try:
                            member_organisation = MemberOrganisation.objects.get(
                                slug=company_data.get('role'))
                        except MemberOrganisation.DoesNotExist:
                            member_organisation = None

                        # get company
                        company_organisation, company_organisation_created = CompanyOrganisation.objects.get_or_create(
                            uuid=company_data.get('uuid'),
                            defaults={
                                'member_organisation': member_organisation,
                                'name': company_data.get('name')
                            })
                        #print("Company  Created:- " if company_organisation_created else "Company Updated:- ",
                        #      u' '.join(
                        #          [company_organisation.uuid]).encode('utf-8').strip())

                        # update company name if any
                        if company_name:
                            company_organisation.company = company_name
                            company_organisation.save()

                        auth_user, auth_user_created = users_service.get_or_create(
                            email=email,
                            defaults={
                                'username': email,
                                'member_organisation': member_organisation,
                                'company_organisation': company_organisation
                            })

                        auth_user.save()
                        # print('Create New User:- ' if auth_user_created else 'Updated User:- ', auth_user.email)
                        company_organisation = users_service.get_company_organisation(
                            auth_user)

                    except Exception as e:
                        print(company_data)
                        print(str(e))
                        continue

                    log_message = 'logging in: ' + str(
                        auth_user.email) + '::' + str(
                            company_organisation.company)
                    log_extra = {
                        'user': auth_user.email,
                        'company': company_organisation.company
                    }
                    logging.getLogger().info(log_message, extra=log_extra)
                    logging.getLogger('audit').info(log_message,
                                                    extra=log_extra)

                    # if user's organisation has prefix override, use it
                    # if not use prefixes provided by the form
                    if company_organisation.prefix_override:
                        form_prefix = company_organisation.prefix_override
                        form_prefixes = form_prefix.split(',')
                    else:
                        form_prefixes = company_data.get('prefixes')

                    prefixes = prefix_service.find(user=auth_user).all()
                    prefixes_list = [p.prefix for p in prefixes]

                    # set gln to be first prefix
                    if len(prefixes_list) > 0:
                        first_prefix = prefixes_list[0]
                        derived_gln = normalize("EAN13", first_prefix)
                        company_organisation.gln = derived_gln
                        company_organisation.save()

                    for prfx in form_prefixes:
                        # if not re.match(settings.GS1_PREFIX_START_REGEX, prfx[:3]) or len(prfx) < 6:
                        #     if prfx.find('20') == 0:  # we will not complain about variable weight
                        #         continue
                        #     else:
                        #         return jsonify(success=False, message='Invalid prefix %s' % prfx)
                        if prfx not in prefixes_list:
                            try:
                                prefix = prefix_service.create(user=auth_user,
                                                               prefix=prfx)
                            except IntegrityError:
                                print(
                                    '\n\n*** ERROR:  Prefix {0} has been allocated for another user\n\n'
                                    .format(prfx))
                                continue
                            try:
                                prefix.make_starting_from()
                            except:
                                prefix.starting_from = None
                            prefix_service.save(prefix)
                        else:
                            i = prefixes_list.index(prfx)
                            if prefixes[i].is_suspended:
                                prefixes[i].is_suspended = False
                                prefix_service.save(prefixes[i])

                    for prfx in prefixes_list:
                        if prfx not in form_prefixes:
                            prefix = prefix_service.find(user=auth_user,
                                                         prefix=prfx).first()
                            prefix.is_suspended = True
                            prefix_service.save(prefix)

                    # Check active prefix and set accordingly
                    user_active_prefix = auth_user.profile.product_active_prefix
                    if not user_active_prefix:
                        prefix = prefix_service.find(
                            user=auth_user,
                            is_suspended=False).order_by('prefix').first()

                        if prefix:
                            prefix_service.make_active(user=auth_user,
                                                       prefix=prefix.prefix)
                            prefix_service.save(prefix)
                        else:
                            print('\n\nERROR: No working prefix found\n\n')
                            continue

                    serializer = URLSafeTimedSerializer(settings.SECRET_KEY)
                    token = serializer.dumps(
                        [auth_user.email, company_organisation.uuid])
                    logging.getLogger().debug('Created token: %s' % token)
Ejemplo n.º 16
0
def account_create_or_update(request):

    auth_only = False

    if request.method == 'POST':
        form = AccountCreateOrUpdateForm(request.POST)
        if form.is_valid():
            try:
                if not request.user.is_anonymous:
                    m2m_token = form.cleaned_data.get('m2m_token', '')
                    if not check_m2m_token(request.user, m2m_token):
                        return redirect(reverse('BCM:login'))

                try:
                    member_organisation = MemberOrganisation.objects.get(
                        slug=form.cleaned_data.get('member_organisation'))
                except MemberOrganisation.DoesNotExist:
                    member_organisation = None

                # core data
                email = form.cleaned_data.get('email')
                company_name = form.cleaned_data.get('company_name')

                # get company
                company_organisation, company_organisation_created = CompanyOrganisation.objects.get_or_create(
                    uuid=form.data.get('uuid'),
                    member_organisation=member_organisation)

                # update company name if any
                if company_name:
                    company_organisation.company = company_name
                    company_organisation.name = company_name
                    company_organisation.save()

                auth_user, auth_user_created = users_service.get_or_create(
                    email=email,
                    defaults={
                        'username': email,
                        'customer_role': 'gs1ie',
                        'member_organisation': member_organisation,
                        'company_organisation': company_organisation
                    })

                auth_user.save()

                company_organisation = users_service.get_company_organisation(
                    auth_user)
            except Exception as e:
                return jsonify(success=False, message=str(e))

            log_message = 'logging in: ' + str(auth_user.email) + '::' + str(
                company_organisation.company)
            log_extra = {
                'user': auth_user.email,
                'company': company_organisation.company,
                'ip_address': request.environ.get('REMOTE_ADDR')
            }
            logging.getLogger().info(log_message, extra=log_extra)
            logging.getLogger('audit').info(log_message, extra=log_extra)

            if form.data.get('company_prefix', '') == 13 * '0':
                auth_only = True

            if not auth_only:
                # if user's organisation has prefix override, use it
                # if not use prefixes provided by the form
                if not company_organisation.prefix_override:
                    form_prefix = form.data.get('company_prefix', '')
                else:
                    form_prefix = company_organisation.prefix_override
                form_prefixes = form_prefix.split(',')

                prefixes = prefix_service.find(user=auth_user).all()
                prefixes_list = list(prefixes.values_list('prefix', flat=True))

                # set gln to be first prefix
                if len(prefixes_list) > 0:
                    first_prefix = prefixes_list[0]
                    derived_gln = normalize("EAN13", first_prefix)
                    company_organisation.gln = derived_gln
                    company_organisation.save()

                for prfx in form_prefixes:
                    if not re.match(member_organisation.gs1_prefix_regex,
                                    prfx[:3]) or len(prfx) < 6:
                        if prfx.find(
                                '20'
                        ) == 0:  # we will not complain about variable weight
                            continue
                        else:
                            return jsonify(success=False,
                                           message='Invalid prefix %s' % prfx)
                    if prfx not in prefixes_list:
                        try:
                            prefix = prefix_service.create(
                                user=auth_user,
                                prefix=prfx,
                                status_id=Prefix.ACTIVE)
                        except IntegrityError:
                            return jsonify(
                                success=False,
                                message=
                                'Prefix %s has been allocated for another user'
                                % prfx)
                        try:
                            prefix.make_starting_from()
                        except:
                            prefix.starting_from = None
                        prefix_service.save(user=auth_user, prefix=prefix)
                    else:
                        i = prefixes_list.index(prfx)
                        if prefixes[i].is_suspended:
                            prefixes[i].is_suspended = False
                            prefix_service.save(prefixes[i])

                for prfx in prefixes_list:
                    if prfx not in form_prefixes:
                        prefix = prefix_service.find(user=auth_user,
                                                     prefix=prfx).first()
                        prefix.is_suspended = True
                        # prefix.is_active = False
                        prefix_service.save(prefix)

                # Check active prefix and set accordingly
                user_active_prefix = auth_user.profile.product_active_prefix
                if not user_active_prefix:
                    prefix = prefix_service.find(
                        user=auth_user,
                        is_suspended=False).order_by('prefix').first()

                    if prefix:
                        prefix_service.make_active(user=auth_user,
                                                   prefix=prefix.prefix)
                        prefix_service.save(prefix)
                    else:
                        return jsonify(success=False,
                                       message='No working prefix found')

            return redirect(get_api_auth(auth_user.email))
    else:
        form = AccountCreateOrUpdateForm()

    try:
        m2m_token_set = request.user.auth_token_set.all()
        m2m_token = m2m_token_set[0].digest
    except Exception:
        m2m_token = ''

    context = {
        'current_user': request.user,
        'm2m_token': m2m_token,
        'active_page': '',
        'form': form
    }
    return render(request, 'activate/AccountCreateOrUpdate.html', context)
Ejemplo n.º 17
0
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,)))