예제 #1
0
def rm_ctg_val(request, context=None):
    if request.method == 'POST':
        try:
            valueId = request.POST['value_id']

            # Verification
            client = UnoClient.objects.get(client_id=request.session['id'])
            value = CtgValue.objects.get(value_id=valueId)
            spec = CtgSpecification.objects.get(
                specification_id=value.specification_id, active=True)

            redir = reverse('go_spec_config') + '?doc_id=' + \
                str(spec.ctg_doc_id).replace('-', '')

            value.delete()

            store_context_in_session(
                request, addSnackDataToContext(context, 'Enumeration removed'))
            return redirect(redir)
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #2
0
def rm_ctg_spec(request, context=None):
    if request.method == 'POST':
        try:
            flag = request.POST['flag']
            specId = request.POST['specification_id']

            # Verification
            client = UnoClient.objects.get(client_id=request.session['id'])
            spec = CtgSpecification.objects.get(specification_id=specId,
                                                active=True)

            redir = '?doc_id=' + str(spec.parent_ctg_id).replace('-', '')
            if flag == 'PR':
                redir = reverse('go_pr_config') + redir
            else:
                redir = reverse('go_fet_config') + redir

            spec.active = False

            spec.save()
            # Cascade process
            removeSpecCascade(spec.specification_id)
            store_context_in_session(
                request, addSnackDataToContext(context,
                                               'Specification removed'))
            return redirect(redir)
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #3
0
def rm_ctg_fet(request, context=None):
    if request.method == 'POST':
        try:
            fetId = request.POST['feature_id']
            clientId = request.session['id']

            # Verification
            feature = CtgFeature.objects.get(client_id=clientId,
                                             feature_id=fetId,
                                             active=True)
            product = CtgProduct.objects.get(product_id=feature.product_id,
                                             active=True)

            redir = reverse('go_pr_config') + '?doc_id=' + \
                str(product.ctg_doc_id).replace('-', '')

            feature.active = False

            feature.save()
            # Cascade process
            removeFeatureCascade(feature.ctg_doc_id)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Feature removed'))
            return redirect(redir)
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #4
0
def do_enroll(request):
    if request and request.method == 'POST':
        try:
            context = {}

            # Verify client
            client = None
            if request.session:
                client = UnoClient.objects.get(client_id=request.session['id'])

            if not client:
                raise RuntimeError

            # Retrieve form values
            customer_name = request.POST['customer_name']
            contact_email = request.POST['contact_email']
            country = request.POST['country']

            if customer_name and contact_email and country:
                newCustomer = UnoCustomer(client=client,
                                          customer_name=customer_name,
                                          contact_email=contact_email,
                                          country=country)

                newCustomer.save()
                return go_success(
                    HttpRequest(), {
                        'message': get_app_message('enroll_success'),
                        'return_link': reverse('go_client')
                    })
            else:
                store_context_in_session(
                    request, addSnackDataToContext(context,
                                                   'Invalid form data'))
            return redirect('go_login')
        except RuntimeError:
            if hasattr(request, 'session') and request.session:
                request.session.clear()

            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Invalid client session'))
            return redirect('go_login')
        except Exception:
            # traceback.print_exc()
            logError(request)
            return go_error(
                HttpRequest(), {
                    'error': get_app_message('enroll_error'),
                    'message': get_app_message('enroll_error_message')
                })
    else:
        return redirect('go_client')
예제 #5
0
def auth_login(request):
    context = {}

    if request.method == 'POST':
        try:
            username = request.POST['username']
            password = request.POST['password']
            unHash = getSha224Hash(username)
            psHash = getSha224Hash(password)

            if unHash == getAdminCredentials(
            )[0] and psHash == getAdminCredentials()[1]:
                request.session['id'] = getCpAdminId()
                return redirect('go_admin')

            # Get client credentials data
            credObj = UnoCredentials.objects.get(username=username)

            if credObj and credObj.password_hash == getSha384Hash(
                    password + credObj.password_salt):
                client = UnoClient.objects.get(client_id=credObj.client_id)

                if client.active:
                    request.session['id'] = str(credObj.client_id).replace(
                        '-', '')
                    return redirect('go_client')
                else:
                    store_context_in_session(
                        request, addSnackDataToContext(context,
                                                       'Access denied'))
                    return redirect('go_login')
            else:
                request.session.clear()
                store_context_in_session(
                    request,
                    addSnackDataToContext(context, 'Invalid credentials'))
                return redirect('go_login')
        except ObjectDoesNotExist:
            store_context_in_session(
                request, addSnackDataToContext(context, 'User not found'))
            return redirect('go_login')
        except Exception:
            # traceback.print_exc()
            logError(request)
            request.session.clear()
            store_context_in_session(request,
                                     addSnackDataToContext(context, 'ERR01'))
            return redirect('go_login')
    else:
        return redirect('go_login')
예제 #6
0
def add_ctg_val(request, context=None):
    if request.method == 'POST':
        try:
            specificationId = request.POST['specification_id']
            code = request.POST['code']
            translation = request.POST['translation']

            # Verification
            client = UnoClient.objects.get(client_id=request.session['id'])
            specification = CtgSpecification.objects.get(
                specification_id=specificationId, active=True)

            redir = reverse('go_spec_config') + '?doc_id=' + \
                str(specification.ctg_doc_id).replace('-', '')

            # Validation
            if not code or not transaction:
                raise AssertionError
            value = CtgValue.objects.filter(specification=specification,
                                            code=code)
            if value and len(value) > 0:
                raise TabError

            newValue = CtgValue(specification=specification,
                                code=code,
                                translation=translation)

            newValue.save()
            store_context_in_session(
                request, addSnackDataToContext(context, 'Enumeration created'))
            return redirect(redir)
        except AssertionError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Invalid data'))
            return redirect(redir)
        except TabError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Code already exists'))
            return redirect(redir)
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #7
0
def can_oppo(request, context=None):
    if request and request.method == 'POST':
        try:
            if not context:
                context = {}

            client = None
            if request.session:
                client = UnoClient.objects.get(client_id=request.session['id'])

            if not client:
                raise RuntimeError

            opportunity = UnoOpportunity.objects.get(
                opportunity_number=request.POST['oppoNb'])

            if not opportunity.active:
                raise Exception

            opportunity.active = False
            opportunity.save()

            store_context_in_session(
                request, addSnackDataToContext(context,
                                               'Opportunity annulled'))
            return redirect('go_records')
        except RuntimeError:
            if hasattr(request, 'session') and request.session:
                request.session.clear()

            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Invalid client session'))
            return redirect('go_login')
        except Exception:
            # traceback.print_exc()
            logError(request)
            return go_error(
                HttpRequest(), {
                    'error': get_app_message('oppo_can_error'),
                    'message': get_app_message('oppo_can_message')
                })
    else:
        return redirect('go_records')
예제 #8
0
def add_ctg_pr(request, context=None):
    if request.method == 'POST':
        try:
            prCode = request.POST['product_code']
            prName = request.POST['product_name']

            if not prCode or not prName:
                raise AssertionError

            if not isValidPrCode(prCode) or len(prName) > 128:
                raise AssertionError

            client = UnoClient.objects.get(client_id=request.session['id'])

            # Get namespaced code and check for duplicate
            itemcode = getFullCatalogCode(prCode, client)
            tempPr = CtgProduct.objects.filter(itemcode=itemcode)
            if tempPr and len(tempPr) > 0:
                raise TabError

            newProduct = CtgProduct(client=client,
                                    itemcode=itemcode,
                                    name=prName)

            newProduct.save()
            store_context_in_session(
                request, addSnackDataToContext(context, 'Product created'))
            return redirect('go_cat_home')
        except AssertionError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Invalid data'))
            return redirect('go_cat_home')
        except TabError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Code already exists'))
            return redirect('go_cat_home')
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #9
0
def go_cat_home(request, context=None):
    try:
        context = get_context_in_session(request)

        if not context:
            context = {}

        ITEMS_PER_PAGE = 10

        productPage = None
        if request.GET.get('pr_page'):
            productPage = request.GET.get('pr_page')
        else:
            productPage = 1

        client = UnoClient.objects.get(client_id=request.session['id'])
        context['client'] = client
        context['addPrForm'] = AddPrForm()

        # Get all products
        prResult = CtgProduct.objects.filter(client_id=client.client_id,
                                             active=True).order_by(
                                                 '-creation_time', 'itemcode')
        pagedList = Paginator(prResult, ITEMS_PER_PAGE)
        products = pagedList.get_page(productPage)

        for pr in products:
            pr.product_id = str(pr.product_id).replace('-', '')
            pr.itemcode = getDefCatalogCode(pr.itemcode)

        context['products'] = products
        context['prCount'] = len(products)

        return render(request, 'catalog/index.html', context=context)
    except Exception:
        # traceback.print_exc()
        logError(request)
        if request and hasattr(request, 'session'):
            request.session.clear()

        store_context_in_session(
            request, addSnackDataToContext(context, 'Unknown Error'))
        return redirect('go_login')
예제 #10
0
def chg_fet(request, context=None):
    if request.method == 'POST':
        try:
            featureId = request.POST['feature_id']
            newFetName = request.POST['feature_name']
            newLimit = request.POST['limit']
            newExt = request.POST['is_extended']

            # Verification
            clientId = request.session['id']
            feature = CtgFeature.objects.filter(client_id=clientId,
                                                feature_id=featureId,
                                                active=True)
            if not feature or len(feature) < 1:
                raise AssertionError

            feature = feature[0]
            docId = str(feature.ctg_doc_id).replace('-', '')
            redir = reverse('go_fet_config') + '?doc_id=' + docId

            feature.name = newFetName
            if newLimit and isValidQuantity(newLimit):
                feature.limit = newLimit
            feature.extended = newExt

            feature.save()
            store_context_in_session(
                request, addSnackDataToContext(context, 'Feature updated'))
            return redirect(redir)
        except AssertionError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Feature does not exist'))
            return redirect('go_cat_home')
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #11
0
def chg_spec(request, context=None):
    if request.method == 'POST':
        try:
            specificationId = request.POST['specification_id']
            newLabel = request.POST['spec_label']
            newDv = request.POST['default_value']

            # Verification
            client = UnoClient.objects.get(client_id=request.session['id'])
            specification = CtgSpecification.objects.get(
                specification_id=specificationId, active=True)
            dt = specification.data_type

            redir = reverse('go_spec_config') + '?doc_id=' + \
                str(specification.ctg_doc_id).replace('-', '')

            # Validation
            if newLabel and len(newLabel) <= 128:
                specification.label = newLabel
            if newDv:
                if (dt == 'BO' and isValidBoolean(newDv)) or (
                        dt == 'QTY' and isValidQuantity(newDv)):
                    specification.default_value = newDv
                elif dt == 'STR' or dt == 'ENUM':
                    specification.default_value = newDv

            specification.save()
            store_context_in_session(
                request, addSnackDataToContext(context,
                                               'Specification updated'))
            return redirect(redir)
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #12
0
def go_records(request):
    try:
        client = UnoClient.objects.get(client_id=request.session['id'])

        context = get_context_in_session(request)
        if not context:
            context = {}

        context['entity_name'] = client.entity_name

        records = []

        oppoList = UnoOpportunity.objects.filter(client=client)
        if len(oppoList) < 1:
            store_context_in_session(
                request, addSnackDataToContext(context,
                                               'No opportunity found'))
            return redirect('go_client')

        for oppo in oppoList:
            customer = UnoCustomer.objects.get(customer_id=oppo.customer_id)
            records.append(
                (str(oppo.opportunity_number).replace('-', ''),
                 oppo.creation_time, customer.customer_name, oppo.active))

        context['records'] = records

        return render(request, 'core/records.html', context=context)
    except Exception:
        # traceback.print_exc()
        logError(request)
        if request and hasattr(request, 'session'):
            request.session.clear()

        store_context_in_session(
            request, addSnackDataToContext(context, 'Unexpected Error'))
        return redirect('go_login')
예제 #13
0
def rm_ctg_pr(request, context=None):
    if request.method == 'POST':
        try:
            productId = request.POST['product_id']

            # Client session verification
            client = UnoClient.objects.get(client_id=request.session['id'])

            # Product verification
            product = CtgProduct.objects.filter(client_id=client.client_id,
                                                product_id=productId,
                                                active=True)
            if not product or len(product) < 1:
                raise AssertionError

            product = product[0]
            product.active = False

            product.save()
            # Cascade process
            removeProductCascade(product)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Product removed'))
            return redirect('go_cat_home')
        except AssertionError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Product does not exist'))
            return redirect('go_cat_home')
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #14
0
def chg_pr_name(request, context=None):
    if request.method == 'POST':
        try:
            productId = request.POST['product_id']
            newPrName = request.POST['product_name']

            # Verification
            clientId = request.session['id']
            product = CtgProduct.objects.filter(client_id=clientId,
                                                product_id=productId,
                                                active=True)
            if not product or len(product) < 1:
                raise AssertionError

            product = product[0]
            product.name = newPrName
            docId = str(product.ctg_doc_id).replace('-', '')
            redir = reverse('go_pr_config') + '?doc_id=' + docId

            product.save()
            store_context_in_session(
                request, addSnackDataToContext(context, 'Product updated'))
            return redirect(redir)
        except AssertionError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Product does not exist'))
            return redirect('go_cat_home')
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #15
0
def do_oppo(request, context=None):
    if request and request.method == 'POST':
        try:
            if not context:
                context = {}

            client = None
            if request.session:
                client = UnoClient.objects.get(client_id=request.session['id'])

            if not client:
                raise RuntimeError

            # Get opportunity details
            customer_id = request.POST['customer']
            discount_nrc = request.POST['discount_nrc']
            discount_mrc = request.POST['discount_mrc']
            deal_limit = int(request.POST['deal_limit'])

            if deal_limit < 1 or deal_limit > 32:
                raise AssertionError

            customer_id = str(customer_id).replace('-', '')
            customer = UnoCustomer.objects.get(customer_id=customer_id)

            newOpportunity = UnoOpportunity(client=client,
                                            customer=customer,
                                            discount_nrc=discount_nrc,
                                            discount_mrc=discount_mrc,
                                            deal_limit=deal_limit)

            newOpportunity.save()
            return go_success(
                HttpRequest(), {
                    'message': getNewOppoMessage(
                        newOpportunity.opportunity_number),
                    'return_link': reverse('go_client')
                })
        except AssertionError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Invalid data encountered'))
            return redirect('go_client')
        except RuntimeError:
            if hasattr(request, 'session') and request.session:
                request.session.clear()

            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Invalid client session'))
            return redirect('go_login')
        except Exception:
            # traceback.print_exc()
            logError(request)
            return go_error(
                HttpRequest(), {
                    'error': get_app_message('oppo_error'),
                    'message': get_app_message('oppo_error_message')
                })
    else:
        return redirect('go_client')
예제 #16
0
def do_approve(request):
    if request.method == 'POST':
        try:
            if request.session['id'] != getCpAdminId():
                request.session.clear()
                return redirect('go_login')

            # Retrieve form data
            client_id = request.POST['client_id']
            ctg_name = request.POST['ctg_name']
            action = request.POST['action']
            comment = request.POST['message']

            # Get client data
            client = UnoClient.objects.get(client_id=client_id)

            # Validate action
            valid = False
            tempStatus = ''
            if client.status == getClientStates('PE'):
                if action == 'AP' and ctg_name:
                    valid = True
                    tempStatus = getClientStates('AP')
                elif action == 'DE':
                    valid = True
                    tempStatus = getClientStates('DE')
            elif client.status == getClientStates('AP'):
                if action == 'RV':
                    valid = True
                    tempStatus = getClientStates('RV')
            elif client.status == getClientStates('RV'):
                if action == 'RI':
                    valid = True
                    tempStatus = getClientStates('AP')
            else:
                valid = False

            if not valid:
                raise RuntimeError

            # Create approval data
            newApproval = UnoApproval(client=client,
                                      action=action,
                                      message=comment)
            newApproval.save()

            # Update client data
            if (tempStatus == getClientStates('AP')):
                client.active = 1
                client.ctg_name = ctg_name
            else:
                client.active = 0
            client.status = tempStatus
            client.save()

            # Retrieve the current page
            redirectPage = 1
            if 'admin_page' in request.session:
                redirectPage = request.session['admin_page']

            # Success message
            store_context_in_session(
                request,
                addSnackDataToContext({}, 'Your action has been applied'))

            return redirect(
                reverse('go_admin') + '?request_page=' + str(redirectPage))
        except Exception:
            # traceback.print_exc()
            logError(request)
            return go_error(
                HttpRequest(), {
                    'error': get_app_message('approval_error'),
                    'message': get_app_message('approval_error_message')
                })
    else:
        return redirect('go_admin')
예제 #17
0
def do_register(request):
    if request.method == 'POST':
        registerForm = RegisterForm(request.POST, request.FILES)

        # Basic validation
        if registerForm.is_multipart() and registerForm.is_valid():
            # Specific validation
            if isValidRegisterRequest(request.POST):
                entity_name = request.POST['entity_name']
                country = request.POST['country']
                trade_ticker = request.POST['trade_ticker']
                contact_email = request.POST['contact_email']
                contact_phone = request.POST['contact_phone']
                summary = request.POST['summary']
                website = request.POST['website']
                username = request.POST['username']
                password = request.POST['password']
                recovery_email = request.POST['recovery_email']
                pin = request.POST['pin']

                # Obtain binary data (deprecated but doable)
                sl_bin = b''
                try:
                    signature_letter = request.FILES['signature_letter']
                    for chunk in signature_letter.chunks():
                        sl_bin += chunk
                except KeyError:
                    sl_bin = b''
                    pass

                password_salt = getRandomSalt(8)

                if len(trade_ticker) == 0:
                    trade_ticker = None
                if len(summary) == 0:
                    summary = None
                if len(website) == 0:
                    website = None

                try:
                    # Create client object
                    newClient = UnoClient(ctg_name=None,
                                          entity_name=entity_name,
                                          country=country,
                                          trade_ticker=trade_ticker,
                                          contact_email=contact_email,
                                          contact_phone=contact_phone,
                                          signature_letter=sl_bin,
                                          summary=summary,
                                          website=website)

                    # Create credentials object
                    newCredentials = UnoCredentials(
                        client=newClient,
                        username=username,
                        password_salt=password_salt,
                        password_hash=getSha384Hash(password + password_salt),
                        recovery_email=recovery_email,
                        pin=pin)

                    newClient.save()
                    newCredentials.save()
                except Exception:
                    # traceback.print_exc()
                    logError(request)
                    return go_error(
                        HttpRequest(), {
                            'error': get_app_message('register_error'),
                            'message':
                            get_app_message('register_error_message')
                        })

                return go_success(
                    HttpRequest(),
                    {'message': get_app_message('register_success')})
            else:
                return go_error(
                    HttpRequest(), {
                        'error': get_app_message('register_error'),
                        'message': get_app_message('register_error_message')
                    })
        else:
            return go_error(
                HttpRequest(), {
                    'error': get_app_message('register_error'),
                    'message': get_app_message('register_error_message')
                })
    else:
        return redirect('go_register')
예제 #18
0
def save_ctg_res(request, context=None):
    if request.method == 'POST':
        try:
            specificationId = request.POST['specification_id']
            maxVal = request.POST[
                'max_val'] if 'max_val' in request.POST else None
            minVal = request.POST[
                'min_val'] if 'min_val' in request.POST else None
            maxLen = request.POST[
                'max_len'] if 'max_len' in request.POST else None
            minLen = request.POST[
                'min_len'] if 'min_len' in request.POST else None
            alo = request.POST[
                'alpha_only'] if 'alpha_only' in request.POST else 'N'
            numo = request.POST[
                'num_only'] if 'num_only' in request.POST else 'N'
            emlo = request.POST[
                'email_only'] if 'email_only' in request.POST else 'N'
            nn = request.POST['not_null']

            # Verification
            client = UnoClient.objects.get(client_id=request.session['id'])
            specification = CtgSpecification.objects.get(
                specification_id=specificationId, active=True)

            redir = reverse('go_spec_config') + '?doc_id=' + \
                str(specification.ctg_doc_id).replace('-', '')

            dt = specification.data_type
            if dt != 'STR' and dt != 'QTY':
                raise Exception

            # Get restriction data
            rMav = None
            rMiv = None
            rMal = None
            rMiL = None
            rAo = None
            rNo = None
            rEo = None
            rNn = None
            resList = CtgRestriction.objects.filter(
                specification_id=specificationId)
            for res in resList:
                if res.rule_type == 'MAX':
                    rMav = res
                elif res.rule_type == 'MIN':
                    rMiv = res
                elif res.rule_type == 'UPLEN':
                    rMal = res
                elif res.rule_type == 'LOLEN':
                    rMiL = res
                elif res.rule_type == 'AO':
                    rAo = res
                elif res.rule_type == 'NUO':
                    rNo = res
                elif res.rule_type == 'EML':
                    rEo = res
                elif res.rule_type == 'NN':
                    rNn = res

            if dt == 'STR':
                if maxLen and minLen and int(maxLen) < int(minLen):
                    raise AssertionError
                if alo == 'Y' and (numo == 'Y' or emlo == 'Y'):
                    raise AssertionError
                elif numo == 'Y' and (alo == 'Y' or emlo == 'Y'):
                    raise AssertionError
                elif emlo == 'Y' and (alo == 'Y' or numo == 'Y'):
                    raise AssertionError

                if maxLen and isValidQuantity(maxLen) and maxLen != '0':
                    if rMal and rMal.value != maxLen:
                        rMal.value = maxLen
                        rMal.save()
                    elif not rMal:
                        uplenRule = CtgRestriction(specification=specification,
                                                   rule_type='UPLEN',
                                                   value=maxLen)
                        uplenRule.save()
                elif not maxLen and rMal:
                    rMal.delete()
                if minLen and isValidQuantity(minLen) and minLen != '0':
                    if rMiL and rMiL.value != minLen:
                        rMiL.value = minLen
                        rMiL.save()
                    elif not rMiL:
                        lolenRule = CtgRestriction(specification=specification,
                                                   rule_type='LOLEN',
                                                   value=minLen)
                        lolenRule.save()
                elif not minLen and rMiL:
                    rMiL.delete()

                if rAo and rAo.value != alo:
                    rAo.value = alo
                    rAo.save()
                elif not rAo and alo == 'Y':
                    aoRule = CtgRestriction(specification=specification,
                                            rule_type='AO',
                                            value=alo)
                    aoRule.save()
                if rNo and rNo.value != numo:
                    rNo.value = numo
                    rNo.save()
                elif not rNo and numo == 'Y':
                    nuoRule = CtgRestriction(specification=specification,
                                             rule_type='NUO',
                                             value=numo)
                    nuoRule.save()
                if rEo and rEo.value != emlo:
                    rEo.value = emlo
                    rEo.save()
                elif not rEo and emlo == 'Y':
                    emlRule = CtgRestriction(specification=specification,
                                             rule_type='EML',
                                             value=emlo)
                    emlRule.save()

            if dt == 'QTY':
                if maxVal and minVal and int(maxVal) < int(minVal):
                    raise AssertionError

                if maxVal and isValidQuantity(maxVal) and maxVal != '0':
                    if rMav and rMav.value != maxVal:
                        rMav.value = maxVal
                        rMav.save()
                    elif not rMav:
                        maxRule = CtgRestriction(specification=specification,
                                                 rule_type='MAX',
                                                 value=maxVal)
                        maxRule.save()
                elif not maxVal and rMav:
                    rMav.delete()
                if minVal and isValidQuantity(minVal) and minVal != '0':
                    if rMiv and rMiv.value != minVal:
                        rMiv.value = minVal
                        rMiv.save()
                    elif not rMiv:
                        minRule = CtgRestriction(specification=specification,
                                                 rule_type='MIN',
                                                 value=minVal)
                        minRule.save()
                elif not minVal and rMiv:
                    rMiv.delete()

            if rNn:
                if rNn.value != nn:
                    rNn.value = nn
                    rNn.save()
            elif nn == 'Y':
                nnRule = CtgRestriction(specification=specification,
                                        rule_type='NN',
                                        value=nn)
                nnRule.save()

            store_context_in_session(
                request, addSnackDataToContext(context,
                                               'Restrictions updated'))
            return redirect(redir)
        except ValueError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Invalid value encountered'))
            return redirect(redir)
        except AssertionError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Rule conflict'))
            return redirect(redir)
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #19
0
def go_pr_config(request, context=None):
    try:
        context = get_context_in_session(request)

        if not context:
            context = {}

        # Get client and product
        client = UnoClient.objects.get(client_id=request.session['id'])
        product = CtgProduct.objects.get(ctg_doc_id=request.GET.get('doc_id'),
                                         client_id=client.client_id,
                                         active=True)

        product.itemcode = getDefCatalogCode(product.itemcode)
        context['client'] = client
        context['product'] = product

        context['reUrl'] = reverse('go_cat_home')

        # Load specs
        specs = CtgSpecification.objects.filter(
            parent_ctg_id=product.ctg_doc_id,
            active=True).order_by('-creation_time', 'leaf_name')
        context['specs'] = specs
        context['spCount'] = len(specs)

        # Load features
        features = CtgFeature.objects.filter(client=client,
                                             product=product,
                                             active=True).order_by(
                                                 '-creation_time', 'itemcode')
        for fet in features:
            fet.itemcode = getDefCatalogCode(fet.itemcode)
        context['features'] = features
        context['fetCount'] = len(features)

        # Initialize forms
        editPrForm = EditPrForm()
        editPrForm.fields['product_id'].widget.attrs['value'] = str(
            product.product_id).replace('-', '')
        editPrForm.fields['product_code'].widget.attrs[
            'value'] = product.itemcode
        editPrForm.fields['product_name'].widget.attrs['value'] = product.name
        editPrForm.fields['product_name'].widget.attrs[
            'data-name'] = product.name
        context['editPrForm'] = editPrForm

        addSpecForm = AddSpecForm()
        addSpecForm.fields['parent_ctg_id'].widget.attrs[
            'value'] = request.GET.get('doc_id')
        context['addSpecForm'] = addSpecForm

        addFetForm = AddFetForm()
        addFetForm.fields['product_id'].widget.attrs['value'] = str(
            product.product_id).replace('-', '')
        context['addFetForm'] = addFetForm
        context['limit_suffix'] = '(0 for unlimited)'

        return render(request, 'catalog/product.html', context=context)
    except Exception:
        # traceback.print_exc()
        logError(request)
        store_context_in_session(
            request, addSnackDataToContext(context, 'Unknown Error'))
        return redirect('go_cat_home')
예제 #20
0
def add_ctg_spec(request, context=None):
    if request.method == 'POST':
        try:
            docId = request.POST['parent_ctg_id']
            leafName = request.POST['leaf_name']
            specName = request.POST['spec_label']
            dt = request.POST['data_type']
            defVal = request.POST['default_value']

            clientId = request.session['id']

            # Verification
            flag = ''
            parentItem = None
            product = CtgProduct.objects.filter(client_id=clientId,
                                                ctg_doc_id=docId,
                                                active=True)
            if product and len(product) > 0:
                flag = 'PR'
                parentItem = product[0]
            else:
                feature = CtgFeature.objects.filter(client_id=clientId,
                                                    ctg_doc_id=docId,
                                                    active=True)
                if feature and len(feature) > 0:
                    flag = 'FET'
                    parentItem = feature[0]
                else:
                    raise AssertionError

            redir = '?doc_id=' + docId
            if flag == 'PR':
                redir = reverse('go_pr_config') + redir
            else:
                redir = reverse('go_fet_config') + redir

            # Validation
            if not leafName or not specName or not dt or not isValidSpecCode(
                    leafName):
                raise ValueError
            if len(leafName) > 32 or len(specName) > 128:
                raise ValueError
            if defVal:
                if (dt == 'BO' and not isValidBoolean(defVal)) or (
                        dt == 'QTY' and not isValidQuantity(defVal)):
                    raise ValueError

            # Set default values
            if dt == 'BO' and not defVal:
                defVal = 0
            elif dt == 'QTY' and not defVal and defVal != 0:
                defVal = 1

            spec = CtgSpecification.objects.filter(parent_ctg_id=docId,
                                                   leaf_name=leafName)
            if spec and len(spec) > 0:
                raise TabError

            newSpec = CtgSpecification(parent_ctg_id=docId,
                                       leaf_name=leafName,
                                       label=specName,
                                       data_type=dt,
                                       default_value=defVal)

            newSpec.save()
            store_context_in_session(
                request, addSnackDataToContext(context,
                                               'Specification created'))
            return redirect(redir)
        except ValueError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Invalid value encountered'))
            return redirect(redir)
        except TabError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Leaf already exists'))
            return redirect(redir)
        except AssertionError:
            store_context_in_session(
                request,
                addSnackDataToContext(context,
                                      'Product/Feature does not exist'))
            return redirect('go_cat_home')
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #21
0
def add_ctg_fet(request, context=None):
    if request.method == 'POST':
        try:
            productId = request.POST['product_id']
            fetCode = request.POST['feature_code']
            fetName = request.POST['feature_name']
            limit = request.POST['limit']
            extOnly = request.POST['is_extended']

            clientId = request.session['id']

            # Verification
            docId = ''
            pr = None
            product = CtgProduct.objects.filter(client_id=clientId,
                                                product_id=productId,
                                                active=True)
            if not product or len(product) != 1:
                raise AssertionError
            else:
                pr = product[0]
                docId = str(pr.ctg_doc_id).replace('-', '')

            redir = reverse('go_pr_config') + '?doc_id=' + docId

            # Validation
            if not fetCode or not isValidFetCode(fetCode) or not fetName:
                raise ValueError

            fetCode = getFullCatalogCode(fetCode, None, clientId)
            feature = CtgFeature.objects.filter(itemcode=fetCode)
            if (feature and len(feature) > 0):
                raise TabError

            if not limit or not isValidQuantity(limit):
                limit = 0

            newFeature = CtgFeature(product=pr,
                                    client_id=clientId,
                                    itemcode=fetCode,
                                    name=fetName,
                                    limit=limit,
                                    extended=extOnly)

            newFeature.save()
            store_context_in_session(
                request, addSnackDataToContext(context, 'Feature created'))
            return redirect(redir)
        except ValueError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Invalid value encountered'))
            return redirect(redir)
        except TabError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Code already exists'))
            return redirect(redir)
        except AssertionError:
            store_context_in_session(
                request,
                addSnackDataToContext(context, 'Product does not exist'))
            return redirect('go_cat_home')
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')
예제 #22
0
def go_fet_config(request, context=None):
    try:
        context = get_context_in_session(request)

        if not context:
            context = {}

        # Get client and feature
        client = UnoClient.objects.get(client_id=request.session['id'])
        feature = CtgFeature.objects.get(ctg_doc_id=request.GET.get('doc_id'),
                                         client_id=client.client_id,
                                         active=True)

        feature.itemcode = getDefCatalogCode(feature.itemcode)
        context['client'] = client
        context['feature'] = feature

        # Get product URL
        product = CtgProduct.objects.get(product_id=feature.product_id)
        prUrl = reverse('go_pr_config') + '?doc_id=' + \
            str(product.ctg_doc_id).replace('-', '')
        context['reUrl'] = prUrl
        context['pntText'] = getDefCatalogCode(product.itemcode)

        # Load specs
        specs = CtgSpecification.objects.filter(
            parent_ctg_id=feature.ctg_doc_id,
            active=True).order_by('-creation_time', 'leaf_name')
        context['specs'] = specs
        context['spCount'] = len(specs)

        # Initialize forms
        # Edit feature
        editFetForm = EditFetForm()
        editFetForm.fields['feature_id'].widget.attrs['value'] = str(
            feature.feature_id).replace('-', '')
        editFetForm.fields['feature_code'].widget.attrs[
            'value'] = feature.itemcode
        editFetForm.fields['feature_name'].widget.attrs['value'] = feature.name
        editFetForm.fields['feature_name'].widget.attrs[
            'data-name'] = feature.name
        editFetForm.fields['limit'].widget.attrs['value'] = feature.limit
        editFetForm.fields['limit'].widget.attrs['data-value'] = feature.limit
        editFetForm.fields['is_extended'].widget.attrs[
            'value'] = feature.extended
        editFetForm.fields['is_extended'].widget.attrs[
            'data-value'] = feature.extended
        context['editFetForm'] = editFetForm

        addSpecForm = AddSpecForm()
        addSpecForm.fields['parent_ctg_id'].widget.attrs[
            'value'] = request.GET.get('doc_id')
        context['addSpecForm'] = addSpecForm

        return render(request, 'catalog/feature.html', context=context)
    except Exception:
        # traceback.print_exc()
        logError(request)
        store_context_in_session(
            request, addSnackDataToContext(context, 'Unknown Error'))
        return redirect('go_cat_home')
예제 #23
0
def go_spec_config(request, context=None):
    try:
        context = get_context_in_session(request)

        if not context:
            context = {}

        # Load specification
        client = UnoClient.objects.get(client_id=request.session['id'])
        specification = CtgSpecification.objects.get(
            ctg_doc_id=request.GET.get('doc_id'), active=True)

        context['client'] = client
        context['specification'] = specification

        # Get parent URL
        flag = ''
        pntUrl = ''
        pntText = ''
        product = CtgProduct.objects.filter(
            ctg_doc_id=specification.parent_ctg_id, client=client, active=True)
        if product and len(product) > 0:
            flag = 'PR'
            pntText = getDefCatalogCode(product[0].itemcode)
            pntUrl = reverse('go_pr_config') + '?doc_id=' + \
                str(product[0].ctg_doc_id).replace('-', '')
        else:
            feature = CtgFeature.objects.filter(
                ctg_doc_id=specification.parent_ctg_id,
                client=client,
                active=True)
            if feature and len(feature) > 0:
                flag = 'FET'
                pntText = getDefCatalogCode(feature[0].itemcode)
                pntUrl = reverse('go_fet_config') + '?doc_id=' + \
                    str(feature[0].ctg_doc_id).replace('-', '')

        if not flag:
            raise Exception
        context['reUrl'] = pntUrl
        context['pntText'] = pntText

        # Spec config details
        # Values
        values = CtgValue.objects.filter(specification=specification).order_by(
            '-creation_time', 'code')
        context['values'] = values
        context['valCount'] = len(values)

        # Spec edit form
        editSpecForm = EditSpecForm()
        editSpecForm.fields['specification_id'].widget.attrs['value'] = str(
            specification.specification_id).replace('-', '')
        editSpecForm.fields['leaf_name'].widget.attrs[
            'value'] = specification.leaf_name
        editSpecForm.fields['data_type'].widget.attrs[
            'value'] = getGeneralTranslation(specification.data_type)
        editSpecForm.fields['spec_label'].widget.attrs[
            'value'] = specification.label
        editSpecForm.fields['spec_label'].widget.attrs[
            'data-name'] = specification.label
        editSpecForm.fields['default_value'].widget.attrs[
            'value'] = specification.default_value
        editSpecForm.fields['default_value'].widget.attrs[
            'data-value'] = specification.default_value
        context['editSpecForm'] = editSpecForm

        dt = specification.data_type

        # Other config forms
        # Value form
        if dt == 'ENUM':
            addValueForm = AddValueForm()
            addValueForm.fields['specification_id'].widget.attrs[
                'value'] = str(specification.specification_id).replace(
                    '-', '')
            context['addValueForm'] = addValueForm

        # Restriction form
        if dt == 'STR' or dt == 'QTY':
            resForm = RestrictionForm()
            resForm.fields['specification_id'].widget.attrs['value'] = str(
                specification.specification_id).replace('-', '')
            # Retrieve and populate
            resList = CtgRestriction.objects.filter(
                specification=specification)
            for res in resList:
                if res.rule_type == 'MAX':
                    resForm.fields['max_val'].widget.attrs['value'] = res.value
                    resForm.fields['max_val'].widget.attrs[
                        'data-value'] = res.value
                elif res.rule_type == 'MIN':
                    resForm.fields['min_val'].widget.attrs['value'] = res.value
                    resForm.fields['min_val'].widget.attrs[
                        'data-value'] = res.value
                elif res.rule_type == 'UPLEN':
                    resForm.fields['max_len'].widget.attrs['value'] = res.value
                    resForm.fields['max_len'].widget.attrs[
                        'data-value'] = res.value
                elif res.rule_type == 'LOLEN':
                    resForm.fields['min_len'].widget.attrs['value'] = res.value
                    resForm.fields['min_len'].widget.attrs[
                        'data-value'] = res.value
                elif res.rule_type == 'AO':
                    resForm.fields['alpha_only'].widget.attrs[
                        'value'] = res.value
                    resForm.fields['alpha_only'].widget.attrs[
                        'data-value'] = res.value
                elif res.rule_type == 'NUO':
                    resForm.fields['num_only'].widget.attrs[
                        'value'] = res.value
                    resForm.fields['num_only'].widget.attrs[
                        'data-value'] = res.value
                elif res.rule_type == 'EML':
                    resForm.fields['email_only'].widget.attrs[
                        'value'] = res.value
                    resForm.fields['email_only'].widget.attrs[
                        'data-value'] = res.value
                elif res.rule_type == 'NN':
                    resForm.fields['not_null'].widget.attrs[
                        'value'] = res.value
                    resForm.fields['not_null'].widget.attrs[
                        'data-value'] = res.value
            # Disable not applicable rules
            if dt == 'STR':
                resForm.fields['max_val'].widget.attrs['disabled'] = 'true'
                resForm.fields['max_val'].widget.attrs[
                    'class'] = 'form-inp-dis'
                resForm.fields['min_val'].widget.attrs['disabled'] = 'true'
                resForm.fields['min_val'].widget.attrs[
                    'class'] = 'form-inp-dis'
            elif dt == 'QTY':
                resForm.fields['max_len'].widget.attrs['disabled'] = 'true'
                resForm.fields['max_len'].widget.attrs[
                    'class'] = 'form-inp-dis'
                resForm.fields['min_len'].widget.attrs['disabled'] = 'true'
                resForm.fields['min_len'].widget.attrs[
                    'class'] = 'form-inp-dis'
                resForm.fields['alpha_only'].widget.attrs['disabled'] = 'true'
                resForm.fields['alpha_only'].widget.attrs[
                    'class'] = 'form-inp-dis'
                resForm.fields['num_only'].widget.attrs['disabled'] = 'true'
                resForm.fields['num_only'].widget.attrs[
                    'class'] = 'form-inp-dis'
                resForm.fields['email_only'].widget.attrs['disabled'] = 'true'
                resForm.fields['email_only'].widget.attrs[
                    'class'] = 'form-inp-dis'
            context['resForm'] = resForm

        # Price form
        priceForm = PriceForm()
        priceForm.fields['specification_id'].widget.attrs['value'] = str(
            specification.specification_id).replace('-', '')
        # Retrieve data
        priceList = CtgPrice.objects.filter(
            specification=specification).order_by('creation_time')
        # Populate price point(s)
        priceData = {}
        for price in priceList:
            data = (price.mrc, price.nrc, price.unit_mrc, price.unit_nrc)
            if not price.value:
                priceData['$'] = data
            else:
                priceData[price.value.code] = data
        context['priceData'] = priceData if len(priceData) > 0 else None
        # Disable fields
        priceForm.fields['value'].widget.attrs['disabled'] = 'true'
        priceForm.fields['value'].widget.attrs['class'] = 'form-inp-dis'
        if dt == 'QTY':
            priceForm.fields['mrc'].widget.attrs['disabled'] = 'true'
            priceForm.fields['mrc'].widget.attrs['class'] = 'form-inp-dis'
            priceForm.fields['nrc'].widget.attrs['disabled'] = 'true'
            priceForm.fields['nrc'].widget.attrs['class'] = 'form-inp-dis'
        else:
            priceForm.fields['unit_mrc'].widget.attrs['disabled'] = 'true'
            priceForm.fields['unit_mrc'].widget.attrs['class'] = 'form-inp-dis'
            priceForm.fields['unit_nrc'].widget.attrs['disabled'] = 'true'
            priceForm.fields['unit_nrc'].widget.attrs['class'] = 'form-inp-dis'
        if dt == 'ENUM' and len(values) > 0:
            # Populate values
            valueList = []
            for val in values:
                valueList.append((val.code, val.translation))
            priceForm.fields['value'].choices = valueList
            priceForm.fields['value'].widget.attrs.pop('disabled', None)
            priceForm.fields['value'].widget.attrs.pop('class', None)
        context['priceForm'] = priceForm

        return render(request, 'catalog/specification.html', context=context)
    except Exception:
        # traceback.print_exc()
        logError(request)
        store_context_in_session(
            request, addSnackDataToContext(context, 'Unknown Error'))
        return redirect('go_cat_home')
예제 #24
0
def save_ctg_price(request, context=None):
    if request.method == 'POST':
        try:
            specificationId = request.POST['specification_id']
            mrc = request.POST['mrc'] if 'mrc' in request.POST else None
            nrc = request.POST['nrc'] if 'nrc' in request.POST else None
            uMrc = request.POST[
                'unit_mrc'] if 'unit_mrc' in request.POST else None
            uNrc = request.POST[
                'unit_nrc'] if 'unit_nrc' in request.POST else None
            value = request.POST['value'] if 'value' in request.POST else None

            # Verification
            client = UnoClient.objects.get(client_id=request.session['id'])
            specification = CtgSpecification.objects.get(
                specification_id=specificationId, active=True)
            if value:
                value = CtgValue.objects.get(specification=specification,
                                             code=value)

            redir = reverse('go_spec_config') + '?doc_id=' + \
                str(specification.ctg_doc_id).replace('-', '')

            dt = specification.data_type

            # Validation
            try:
                mrc = round(float(mrc), 2) if mrc else None
                nrc = round(float(nrc), 2) if nrc else None
                uMrc = round(float(uMrc), 2) if uMrc else None
                uNrc = round(float(uNrc), 2) if uNrc else None
            except Exception:
                raise AssertionError

            if (mrc and mrc <= 0) or (nrc and nrc <= 0) or (
                    uMrc and uMrc <= 0) or (uNrc and uNrc <= 0):
                raise AssertionError

            # Retrieve price
            price = CtgPrice.objects.filter(specification=specification,
                                            value=value)
            if len(price) > 0:
                price = price[0]
                price.mrc = mrc
                price.nrc = nrc
                price.unit_mrc = uMrc
                price.unit_nrc = uNrc
            else:
                price = CtgPrice(specification=specification,
                                 mrc=mrc,
                                 nrc=nrc,
                                 unit_mrc=uMrc,
                                 unit_nrc=uNrc,
                                 value=value)

            price.save()
            store_context_in_session(
                request, addSnackDataToContext(context, 'Price point saved'))
            return redirect(redir)
        except AssertionError:
            store_context_in_session(
                request, addSnackDataToContext(context, 'Invalid data'))
            return redirect(redir)
        except Exception:
            # traceback.print_exc()
            logError(request)
            store_context_in_session(
                request, addSnackDataToContext(context, 'Unexpected error'))
            return redirect('go_cat_home')
    else:
        return redirect('go_cat_home')