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
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
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')
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
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/'
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
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)
def js_add_product(request): """ GET/POST for adding a new base or case product :return: """ user_active_prefix = request.user.profile.product_active_prefix prefix = request.POST.get('prefix', None) if prefix is None: prefix = request.GET.get('prefix', None) if prefix: prefix = prefix_service.find_item(user=request.user, prefix=prefix) if prefix and prefix != user_active_prefix: prefix_service.make_active(user=request.user, prefix=prefix.prefix) if request.session.get('new_product', None): del request.session['new_product'] else: prefix = user_active_prefix if not prefix: flash(request, 'You must have an active prefix set to enter new product. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) if not prefix.starting_from: flash(request, 'You must have a starting number set to enter new product. Please set one', 'danger') return redirect(reverse('prefixes:prefixes_list')) if prefix.is_special == 'READ-ONLY': flash( request, 'You can not add a new product in this range. It\'s a suspended read-only range', 'danger' ) return redirect(reverse('products:products_list')) # if prefix.is_special != 'NULL': # package_rows = services.package_level_service.find( # id=models.PACKAGE_LEVEL_SPECIAL_ENUM[prefix.is_special]).all() # else: # package_rows = package_level_service.all() package_rows = PackageLevel.service.all() express = True if request.POST.get('express') or request.GET.get('express') else False title = _('New Product') if express: title = 'Express Allocation' if request.method == 'POST': form = PackageLevelForm(request.POST) form.set_package_levels(package_rows) if form.is_valid(): if not request.session.get('new_product', None): request.session['new_product'] = {'gtin': str(prefix.starting_from), 'package_level': form.data['package_level']} elif request.session.get('new_product')['gtin'] != str(prefix.starting_from): request.session['new_product'] = {'gtin': str(prefix.starting_from), 'package_level': form.data['package_level']} else: request.session['new_product']['package_level'] = form.data['package_level'] if express: request.session['new_product'].update({'express': True}) elif 'express' in request.session['new_product']: del request.session['new_product']['express'] return redirect(reverse('products:add_product_package_type')) # if session['new_product']['package_level'] == str(models.BASE_PACKAGE_LEVEL): # if session['new_product'].get('express'): # return redirect(url_for('products.add_product_express')) # else: # return redirect(url_for('products.add_product_package_type')) # else: # return redirect(url_for('products.subproduct_add_case')) else: flash(request, 'You must choose a level to proceed', 'danger') else: form = PackageLevelForm() form.set_package_levels(package_rows) if ( request.session.get('new_product', None) and request.session.get('new_product')['gtin'] == str(prefix.starting_from) ): form.data['package_level'] = request.session.get('new_product')['package_level'] package_type_list_qs = PackageType.service.filter(ui_enabled=True).order_by('id').all() package_type_list = json.loads(serializers.serialize("json", package_type_list_qs)) context = { 'title': title, 'prefix': prefix, 'flashed_messages': flash_get_messages(request), 'form_data_json': json.dumps({ 'mo_slug': prefix.member_organisation.slug, 'package_type_list': package_type_list, 'gtin': str(prefix.starting_from), 'gln_of_information_provider': normalize('EAN13', prefix.prefix), 'language': translation_helpers.get_current_language(), 'fallback_languages': settings.FALLBACK_LANGUAGES, }) } return render(request, 'products/product_add_js.html', context)
def 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)
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)
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)
def add_product(request): """ GET/POST for adding a new base or case product :return: """ subproduct_helper.subproducts_reset(request.session) # remove subproducst from session if any user_active_prefix = request.user.profile.product_active_prefix prefix = request.POST.get('prefix', None) if prefix is None: prefix = request.GET.get('prefix', None) if prefix: prefix = prefix_service.find_item(user=request.user, prefix=prefix) if prefix and prefix != user_active_prefix: prefix_service.make_active(prefix.prefix, request.user) if request.session.get('new_product', None): del request.session['new_product'] else: prefix = user_active_prefix if not prefix: flash(request, 'You must have an active prefix set to enter new product. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) if not prefix.starting_from: flash(request, 'You must have a starting number set to enter new product. Please set one', 'danger') return redirect(reverse('prefixes:prefixes_list')) if prefix.is_special == 'READ-ONLY': flash(request, 'You can not add a new product in this range. It\'s a suspended read-only range', 'danger') return redirect(reverse('products:products_list')) package_rows = PackageLevel.service.all() express = True if request.POST.get('express') or request.GET.get('express') else False title = 'New Product' if express: title = 'Express Allocation' if request.method == 'POST': form = PackageLevelForm(request.POST) form.set_package_levels(package_rows) if form.is_valid(): try: prefix.make_starting_from() except Exception: flash(request, 'not allowed to create products for this prefix.', 'danger') return redirect(reverse('prefixes:prefixes_list')) if not request.session.get('new_product', None): request.session['new_product'] = { 'gtin': prefix.starting_from, 'package_level': form.data['package_level'] } elif request.session['new_product'].get('gtin') != prefix.starting_from: request.session['new_product'] = { 'gtin': prefix.starting_from, 'package_level': form.data['package_level'] } else: request.session['new_product']['package_level'] = form.data['package_level'] if express: request.session['new_product'].update({'express': True}) elif 'express' in request.session['new_product']: del request.session['new_product']['express'] return redirect(reverse('products:add_product_package_type')) # if session['new_product']['package_level'] == str(models.BASE_PACKAGE_LEVEL): # if session['new_product'].get('express'): # return redirect(url_for('products.add_product_express')) # else: # return redirect(url_for('products.add_product_package_type')) # else: # return redirect(url_for('products.subproduct_add_case')) else: flash(request, 'You must choose a level to proceed', 'danger') else: form = PackageLevelForm() form.set_package_levels(package_rows) if (request.session.get('new_product', None) and request.session['new_product'].get('gtin') == prefix.starting_from): form.data['package_level'] = request.session.get('new_product')['package_level'] templates = ProductTemplate.objects.filter( member_organisation=request.user.profile.member_organisation ).order_by('order') context = {'title': title, 'prefix': prefix, 'templates': templates } return render(request, 'products/package_level_form.html', context)
def products_list(request): user_active_prefix = request.user.profile.product_active_prefix if request.GET.get('prefix'): prefix = prefix_service.find_item(user=request.user, prefix=request.GET.get('prefix')) if prefix and prefix != user_active_prefix: prefix_service.make_active(prefix.prefix, user=request.user) elif not prefix: flash(request, 'Incorrect active prefix. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) else: prefix = user_active_prefix if not prefix: flash(request, 'You must have an active prefix to see products. Please choose one', 'danger') return redirect(reverse('prefixes:prefixes_list')) try: page = int(request.GET.get('page', '1')) except (ValueError, TypeError): page = 1 try: settings_per_page = settings.PRODUCTS_PER_PAGE except: settings_per_page = 10 try: per_page = int(request.GET.get('per_page')) except (ValueError, TypeError): per_page = None if per_page: request.session['per_page'] = per_page else: per_page = request.session.get('per_page', settings_per_page) all_in_range = Product.objects.filter( company_organisation=request.user.profile.company_organisation, gs1_company_prefix=prefix.prefix ) target_market_ids = all_in_range.values_list('target_market', flat=True).distinct() target_markets = TargetMarket.objects.filter(id__in=target_market_ids) target_market_choices = [['', '']] for target_market in target_markets: try: if target_market_choices[-1][0] == target_market.code: continue except Exception: pass target_market_choices.append([target_market.code, target_market.market]) completeness = product_helper.get_completeness(all_in_range) if request.method == 'POST': form = FilterForm(request.POST) if form.is_valid(): all_in_range = product_helper.filter_list(all_in_range, form) request.session['list_filter'] = product_helper.make_filter(form) else: logging.getLogger().debug(str(form.errors)) else: if request.GET.get('clear_filter'): if request.session.get('list_filter'): del request.session['list_filter'] if request.session.get('list_filter'): try: form = FilterForm(request.session['list_filter']) all_in_range = product_helper.filter_list(all_in_range, form) except: del request.session['list_filter'] form = FilterForm() else: form = FilterForm() # if sort arguments are provided in GET we will override them # see https://github.com/tbikeev/robot-gs1/issues/30 if request.GET.get('sort_mode') and request.GET.get('sort_field'): form.data['sort_field'] = request.GET.get('sort_field') form.data['sort_mode'] = request.GET.get('sort_mode') sort_field = form.data.get('sort_field', form.fields['sort_field'].initial) sort_mode = form.data.get('sort_mode', form.fields['sort_mode'].initial) if sort_mode == 'desc': sort_order = '-%s' % sort_field sort_mode = 'Descending' else: sort_order = sort_field sort_mode = 'Ascending' for key, value in form.fields['sort_field'].choices: if sort_field == key: sort_field = value break products = all_in_range.order_by(sort_order) paginator = Paginator(products, per_page) try: paginator_page = paginator.page(page) except InvalidPage: paginator_page = paginator.page(1) form.fields['target_market'].choices = target_market_choices form.base_fields['target_market'].choices = target_market_choices form.declared_fields['target_market'].choices = target_market_choices templates = {} for item in ProductTemplate.objects.filter(member_organisation=request.user.profile.member_organisation): templates[ item.package_level_id ] = True assoc_products = [] for p in paginator_page.object_list: if p.package_level.id != 70: subproducts = SubProduct.objects.filter(product=p).all() sub_p = [] for subproduct in subproducts: sub_product = subproduct.sub_product sub_p.append({'id': sub_product.id, 'package_level': {'id': sub_product.package_level_id}, 'brand': sub_product.brand, 'description': sub_product.description, 'gtin': sub_product.gtin, 'gs1_company_prefix': sub_product.gs1_company_prefix, 'bar_type': sub_product.bar_type, 'quantity': subproduct.quantity}) assoc_products.append({'p_id': p.id, 'sub_p': sub_p}) context = {'prefix': prefix, 'latest_product_list': paginator_page.object_list, 'assoc_products': assoc_products, 'pagination': paginator_page, 'per_page': per_page, 'ppp': settings_per_page, 'sorted': {'field': sort_field, 'mode': sort_mode}, 'form': form, 'enable_leading': True, # request.user.enable_leading 'templates': templates, 'completeness': completeness} return render(request, 'products/list.html', context=context)