Example #1
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
Example #2
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
Example #3
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')
Example #4
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)
 def test_models_get_active(self):
     prefix = prefix_service.find(prefix='53900011').first()
     assert prefix.prefix == '53900011'
     assert not prefix.is_active
     prefix_id = prefix.id
     prefix_organisation = prefix.company_organisation
     active_id = prefix_service.get_active(prefix_organisation)
     assert active_id is None
     prefix_service.make_active(prefix_id)
     active_id = prefix_service.get_active(prefix_organisation)
     assert active_id == prefix_id
Example #6
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/'
Example #7
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
 def test_make_active(self):
     prefix = prefix_service.find(prefix='53900011').first()
     assert prefix.prefix == '53900011'
     assert not prefix.is_active
     id1 = prefix.id
     prefix = prefix_service.find(prefix='53900012').first()
     assert prefix.prefix == '53900012'
     assert not prefix.is_active
     id2 = prefix.id
     prefix_service.make_active(id1)
     prefix = prefix_service.find(prefix='53900011').first()
     assert prefix.prefix == '53900011'
     assert prefix.is_active
     prefix = prefix_service.find(prefix='53900012').first()
     assert prefix.prefix == '53900012'
     assert not prefix.is_active
     prefix_service.make_active(id2)
     prefix = prefix_service.find(prefix='53900011').first()
     assert prefix.prefix == '53900011'
     assert not prefix.is_active
     prefix = prefix_service.find(prefix='53900012').first()
     assert prefix.prefix == '53900012'
     assert prefix.is_active
Example #9
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)
Example #10
0
def js_add_product(request):
    """
    GET/POST for adding a new base or case product
    :return:
    """

    user_active_prefix = request.user.profile.product_active_prefix
    prefix = request.POST.get('prefix', None)
    if prefix is None:
        prefix = request.GET.get('prefix', None)
    if prefix:
        prefix = prefix_service.find_item(user=request.user, prefix=prefix)
        if prefix and prefix != user_active_prefix:
            prefix_service.make_active(user=request.user, prefix=prefix.prefix)
        if request.session.get('new_product', None):
            del request.session['new_product']
    else:
        prefix = user_active_prefix
    if not prefix:
        flash(request, 'You must have an active prefix set to enter new product. Please choose one', 'danger')
        return redirect(reverse('prefixes:prefixes_list'))
    if not prefix.starting_from:
        flash(request, 'You must have a starting number set to enter new product. Please set one', 'danger')
        return redirect(reverse('prefixes:prefixes_list'))
    if prefix.is_special == 'READ-ONLY':
        flash(
            request, 'You can not add a new product in this range. It\'s a suspended read-only range', 'danger'
        )
        return redirect(reverse('products:products_list'))

    # if prefix.is_special != 'NULL':
    #    package_rows = services.package_level_service.find(
    #        id=models.PACKAGE_LEVEL_SPECIAL_ENUM[prefix.is_special]).all()
    # else:
    #    package_rows = package_level_service.all()
    package_rows = PackageLevel.service.all()

    express = True if request.POST.get('express') or request.GET.get('express') else False

    title = _('New Product')

    if express:
        title = 'Express Allocation'

    if request.method == 'POST':
        form = PackageLevelForm(request.POST)
        form.set_package_levels(package_rows)
        if form.is_valid():
            if not request.session.get('new_product', None):
                request.session['new_product'] = {'gtin': str(prefix.starting_from),
                                                  'package_level': form.data['package_level']}
            elif request.session.get('new_product')['gtin'] != str(prefix.starting_from):
                request.session['new_product'] = {'gtin': str(prefix.starting_from),
                                                  'package_level': form.data['package_level']}
            else:
                request.session['new_product']['package_level'] = form.data['package_level']
            if express:
                request.session['new_product'].update({'express': True})
            elif 'express' in request.session['new_product']:
                del request.session['new_product']['express']
            return redirect(reverse('products:add_product_package_type'))
            # if session['new_product']['package_level'] == str(models.BASE_PACKAGE_LEVEL):
            #    if session['new_product'].get('express'):
            #        return redirect(url_for('products.add_product_express'))
            #    else:
            #        return redirect(url_for('products.add_product_package_type'))
            # else:
            #    return redirect(url_for('products.subproduct_add_case'))
        else:
            flash(request, 'You must choose a level to proceed', 'danger')
    else:
        form = PackageLevelForm()
        form.set_package_levels(package_rows)
        if (
            request.session.get('new_product', None) and
            request.session.get('new_product')['gtin'] == str(prefix.starting_from)
        ):
            form.data['package_level'] = request.session.get('new_product')['package_level']

    package_type_list_qs = PackageType.service.filter(ui_enabled=True).order_by('id').all()
    package_type_list = json.loads(serializers.serialize("json", package_type_list_qs))
    context = {
        'title': title,
        'prefix': prefix,
        'flashed_messages': flash_get_messages(request),
        'form_data_json': json.dumps({
            'mo_slug': prefix.member_organisation.slug,
            'package_type_list': package_type_list,
            'gtin': str(prefix.starting_from),
            'gln_of_information_provider': normalize('EAN13', prefix.prefix),
            'language': translation_helpers.get_current_language(),
            'fallback_languages': settings.FALLBACK_LANGUAGES,
        })
    }

    return render(request, 'products/product_add_js.html', context)
Example #11
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)
Example #12
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)
Example #13
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)
Example #14
0
def add_product(request):
    """
    GET/POST for adding a new base or case product
    :return:
    """
    subproduct_helper.subproducts_reset(request.session)  # remove subproducst from session if any
    user_active_prefix = request.user.profile.product_active_prefix
    prefix = request.POST.get('prefix', None)

    if prefix is None:
        prefix = request.GET.get('prefix', None)
    if prefix:
        prefix = prefix_service.find_item(user=request.user, prefix=prefix)
        if prefix and prefix != user_active_prefix:
            prefix_service.make_active(prefix.prefix, request.user)
        if request.session.get('new_product', None):
            del request.session['new_product']
    else:
        prefix = user_active_prefix
    if not prefix:
        flash(request, 'You must have an active prefix set to enter new product. Please choose one', 'danger')
        return redirect(reverse('prefixes:prefixes_list'))
    if not prefix.starting_from:
        flash(request, 'You must have a starting number set to enter new product. Please set one', 'danger')
        return redirect(reverse('prefixes:prefixes_list'))
    if prefix.is_special == 'READ-ONLY':
        flash(request, 'You can not add a new product in this range. It\'s a suspended read-only range', 'danger')
        return redirect(reverse('products:products_list'))

    package_rows = PackageLevel.service.all()
    express = True if request.POST.get('express') or request.GET.get('express') else False

    title = 'New Product'
    if express:
        title = 'Express Allocation'

    if request.method == 'POST':
        form = PackageLevelForm(request.POST)
        form.set_package_levels(package_rows)
        if form.is_valid():
            try:
                prefix.make_starting_from()
            except Exception:
                flash(request, 'not allowed to create products for this prefix.', 'danger')
                return redirect(reverse('prefixes:prefixes_list'))

            if not request.session.get('new_product', None):
                request.session['new_product'] = {
                    'gtin': prefix.starting_from,
                    'package_level': form.data['package_level']
                }
            elif request.session['new_product'].get('gtin') != prefix.starting_from:
                request.session['new_product'] = {
                    'gtin': prefix.starting_from,
                    'package_level': form.data['package_level']
                }
            else:
                request.session['new_product']['package_level'] = form.data['package_level']
            if express:
                request.session['new_product'].update({'express': True})
            elif 'express' in request.session['new_product']:
                del request.session['new_product']['express']
            return redirect(reverse('products:add_product_package_type'))
            # if session['new_product']['package_level'] == str(models.BASE_PACKAGE_LEVEL):
            #    if session['new_product'].get('express'):
            #        return redirect(url_for('products.add_product_express'))
            #    else:
            #        return redirect(url_for('products.add_product_package_type'))
            # else:
            #    return redirect(url_for('products.subproduct_add_case'))
        else:
            flash(request, 'You must choose a level to proceed', 'danger')
    else:
        form = PackageLevelForm()
        form.set_package_levels(package_rows)
        if (request.session.get('new_product', None) and
                request.session['new_product'].get('gtin') == prefix.starting_from):
            form.data['package_level'] = request.session.get('new_product')['package_level']

    templates = ProductTemplate.objects.filter(
        member_organisation=request.user.profile.member_organisation
    ).order_by('order')

    context = {'title': title,
               'prefix': prefix,
               'templates': templates
               }

    return render(request, 'products/package_level_form.html', context)
Example #15
0
def products_list(request):
    user_active_prefix = request.user.profile.product_active_prefix
    if request.GET.get('prefix'):
        prefix = prefix_service.find_item(user=request.user, prefix=request.GET.get('prefix'))
        if prefix and prefix != user_active_prefix:
            prefix_service.make_active(prefix.prefix, user=request.user)
        elif not prefix:
            flash(request, 'Incorrect active prefix. Please choose one', 'danger')
            return redirect(reverse('prefixes:prefixes_list'))
    else:
        prefix = user_active_prefix
        if not prefix:
            flash(request, 'You must have an active prefix to see products. Please choose one', 'danger')
            return redirect(reverse('prefixes:prefixes_list'))

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

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

    all_in_range = Product.objects.filter(
        company_organisation=request.user.profile.company_organisation,
        gs1_company_prefix=prefix.prefix
    )

    target_market_ids = all_in_range.values_list('target_market', flat=True).distinct()
    target_markets = TargetMarket.objects.filter(id__in=target_market_ids)

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

    completeness = product_helper.get_completeness(all_in_range)

    if request.method == 'POST':
        form = FilterForm(request.POST)
        if form.is_valid():
            all_in_range = product_helper.filter_list(all_in_range, form)
            request.session['list_filter'] = product_helper.make_filter(form)
        else:
            logging.getLogger().debug(str(form.errors))
    else:
        if request.GET.get('clear_filter'):
            if request.session.get('list_filter'):
                del request.session['list_filter']
        if request.session.get('list_filter'):
            try:
                form = FilterForm(request.session['list_filter'])
                all_in_range = product_helper.filter_list(all_in_range, form)
            except:
                del request.session['list_filter']
                form = FilterForm()
        else:
            form = FilterForm()

    # if sort arguments are provided in GET we will override them
    # see https://github.com/tbikeev/robot-gs1/issues/30

    if request.GET.get('sort_mode') and request.GET.get('sort_field'):
        form.data['sort_field'] = request.GET.get('sort_field')
        form.data['sort_mode'] = request.GET.get('sort_mode')

    sort_field = form.data.get('sort_field', form.fields['sort_field'].initial)
    sort_mode = form.data.get('sort_mode', form.fields['sort_mode'].initial)
    if sort_mode == 'desc':
        sort_order = '-%s' % sort_field
        sort_mode = 'Descending'
    else:
        sort_order = sort_field
        sort_mode = 'Ascending'
    for key, value in form.fields['sort_field'].choices:
        if sort_field == key:
            sort_field = value
            break

    products = all_in_range.order_by(sort_order)
    paginator = Paginator(products, per_page)
    try:
        paginator_page = paginator.page(page)
    except InvalidPage:
        paginator_page = paginator.page(1)

    form.fields['target_market'].choices = target_market_choices
    form.base_fields['target_market'].choices = target_market_choices
    form.declared_fields['target_market'].choices = target_market_choices

    templates = {}
    for item in ProductTemplate.objects.filter(member_organisation=request.user.profile.member_organisation):
        templates[ item.package_level_id ] = True

    assoc_products = []
    for p in paginator_page.object_list:
        if p.package_level.id != 70:
            subproducts = SubProduct.objects.filter(product=p).all()
            sub_p = []
            for subproduct in subproducts:
                sub_product = subproduct.sub_product
                sub_p.append({'id': sub_product.id,
                              'package_level': {'id': sub_product.package_level_id},
                              'brand': sub_product.brand,
                              'description': sub_product.description,
                              'gtin': sub_product.gtin,
                              'gs1_company_prefix': sub_product.gs1_company_prefix,
                              'bar_type': sub_product.bar_type,
                              'quantity': subproduct.quantity})
            assoc_products.append({'p_id': p.id,
                                   'sub_p': sub_p})

    context = {'prefix': prefix,
               'latest_product_list': paginator_page.object_list,
               'assoc_products': assoc_products,
               'pagination': paginator_page,
               'per_page': per_page,
               'ppp': settings_per_page,
               'sorted': {'field': sort_field, 'mode': sort_mode},
               'form': form,
               'enable_leading': True,      # request.user.enable_leading
               'templates': templates,
               'completeness': completeness}

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