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)
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())
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)