示例#1
0
def view_product(request, pk=None, code=None, group=None):

    product = Product()
    inventory = Inventory.objects.none()

    try:
        product = get_object_or_404(Product, pk=pk)
        inventory = Inventory.objects.filter(product=product)
    except Product.DoesNotExist:
        product = cache.get(code)

    data = prep_list_view(request, group)

    data['product'] = product
    data['inventory'] = inventory
    data['title'] = '%s - %s' % (product.code, product.title)

    # Collect data for Sales/Purchases/Invoices tabs
    results_per_page = 50
    page = request.GET.get('page')

    sales = product.serviceorderitem_set.all().select_related('order')
    sales = sales.order_by('-id')
    data['sales'] = paginate(sales, page, results_per_page)

    purchases = product.purchaseorderitem_set.all().select_related('purchase_order')
    purchases = purchases.order_by('-id')
    data['purchases'] = paginate(purchases, page, results_per_page)

    invoices = product.invoiceitem_set.all().select_related('invoice')
    invoices = invoices.order_by('-id')
    data['invoices'] = paginate(invoices, page, results_per_page)

    return render(request, "products/view.html", data)
示例#2
0
def upload_prices(request):
    """
    Uploads new price data from Excel file
    """
    form = UploadPricesForm()
    action = request.path
    title = _('Upload new price data')

    if request.method == 'POST':
        form = UploadPricesForm(request.POST, request.FILES)

        if form.is_valid():
            import django_excel as excel
            import pyexcel.ext.xls # import it to handle xls file
            import pyexcel.ext.xlsx # import it to handle xlsx file

            counter, errors = 0, 0
            datafile = form.cleaned_data['datafile']
            sheet = datafile.get_sheet()
            del(sheet.row[0]) # skip header row

            for row in sheet:
                if not len(row[0]):
                    continue # skip empty rows

                try:
                    product = Product.objects.get(code=row[0])
                except Product.DoesNotExist:
                    if form.cleaned_data.get('create_new'):
                        product = Product(code=row[0])
                    else:
                        error = _('Error on row %d - product %s not found') % (counter+1, row[0])
                        messages.error(request, error)
                        return redirect(list_products)
                
                product.title = row[1]
                product.description = row[2]
                product.price_sales_exchange = row[3]

                if form.cleaned_data.get('set_fixed'):
                    product.fixed_price = True

                product.save()
                counter += 1

            msg = _('Price info of %d products uploaded successfully') % counter
            messages.success(request, msg)
            return redirect(list_products)

    return render(request, "products/upload_prices.html", locals())
示例#3
0
def edit_product(request, pk=None, code=None, group='all'):
    """
    Edits a Product! :-)
    """
    initial = {}
    product = Product()

    data = prep_list_view(request, group)

    if pk is not None:
        product = get_object_or_404(Product, pk=pk)
        form = ProductForm(instance=product)

    if not group == 'all':
        cat = get_object_or_404(ProductCategory, slug=group)
        initial = {'categories': [cat]}
        data['group'] = cat

    product.update_photo()

    if code is not None:
        product = cache.get(code)

    form = ProductForm(instance=product, initial=initial)
    InventoryFormset = inlineformset_factory(Product,
                                             Inventory,
                                             extra=1,
                                             max_num=1,
                                             exclude=[])

    formset = InventoryFormset(
        instance=product,
        initial=[{'location': request.user.location}]
    )

    if request.method == "POST":

        form = ProductForm(request.POST, request.FILES, instance=product)

        if form.is_valid():

            product = form.save()
            content_type = ContentType.objects.get(model="product")

            for a in request.POST.getlist("attachments"):
                doc = Attachment.objects.get(pk=a)
                product.attachments.add(doc)

            tags = [x for x in request.POST.getlist('tag') if x != '']

            for t in tags:
                tag, created = TaggedItem.objects.get_or_create(
                    content_type=content_type,
                    object_id=product.pk,
                    tag=t)
                tag.save()

            formset = InventoryFormset(request.POST, instance=product)

            if formset.is_valid():
                formset.save()
                messages.success(request, _(u"Product %s saved") % product.code)
                return redirect(product)
            else:
                messages.error(request, _('Error in inventory details'))
        else:
            messages.error(request, _('Error in product info'))

    data['form'] = form
    data['product'] = product
    data['formset'] = formset
    data['title'] = product.title

    return render(request, "products/form.html", data)