def add_gsx_part(self, part): """ Adds a part that has been added manually in GSX web UI """ # part has been added to the order, but not the GSX repair try: oi = self.order.products.get(code=part.partNumber) except ServiceOrderItem.DoesNotExist: new_part = ServicePart(part_number=part.partNumber) try: p = Product.objects.get(code=part.partNumber) except Product.DoesNotExist: p = Product.from_gsx(new_part.lookup()) p.save() oi = self.order.add_product(p, 1, self.created_by) oi.comptia_code = part.comptiaCode or "" oi.comptia_modifier = part.comptiaModifier or "" oi.save() sp = ServicePart.from_soi(self, oi) sp.set_part_details(part) sp.order(self.created_by) sp.save()
def add_gsx_part(self, part): """ Adds a part that has been added manually in GSX web UI """ # part has been added to the order, but not the GSX repair try: oi = self.order.products.get(code=part.partNumber) except ServiceOrderItem.DoesNotExist: new_part = ServicePart(part_number=part.partNumber) try: p = Product.objects.get(code=part.partNumber) except Product.DoesNotExist: p = Product.from_gsx(new_part.lookup()) p.save() oi = self.order.add_product(p, 1, self.created_by) oi.comptia_code = part.comptiaCode or '' oi.comptia_modifier = part.comptiaModifier or '' oi.save() sp = ServicePart.from_soi(self, oi) sp.set_part_details(part) sp.order(self.created_by) sp.save()
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 get_parts(self): """ Returns GSX parts for a product with this device's serialNumber """ results = {} cache_key = "%s_parts" % self.sn for p in gsxws.Product(self.sn).parts(): product = Product.from_gsx(p) results[product.code] = product cache.set_many(results) cache.set(cache_key, results.values()) return results.values()
def get_gsx_search_results(request, what, param, query): """ The second phase of a GSX search. There should be an active GSX session open at this stage. """ data = {} results = [] query = query.upper() device = Device(sn=query) error_template = "search/results/gsx_error.html" # @TODO: this isn't a GSX search. Move it somewhere else. if what == "orders": try: if param == 'serialNumber': device = Device.objects.get(sn__exact=query) if param == 'alternateDeviceId': device = Device.objects.get(imei__exact=query) except ( Device.DoesNotExist, ValueError, ): return render(request, "search/results/gsx_notfound.html") orders = device.order_set.all() return render(request, "orders/list.html", locals()) if what == "warranty": # Update wty info if device has been serviced before try: device = Device.objects.get(sn__exact=query) device.update_gsx_details() except Exception: try: device = Device.from_gsx(query, user=request.user) except Exception as e: return render(request, error_template, {'message': e}) results.append(device) # maybe it's a device we've already replaced... try: soi = ServiceOrderItem.objects.get(sn__iexact=query) results[0].repeat_service = soi.order except ServiceOrderItem.DoesNotExist: pass if what == "parts": # looking for parts if param == "partNumber": # ... with a part number part = gsxws.Part(partNumber=query) try: partinfo = part.lookup() except gsxws.GsxError as e: return render(request, error_template, {'message': e}) product = Product.from_gsx(partinfo) cache.set(query, product) results.append(product) if param == "serialNumber": try: dev = Device.from_gsx(query) products = dev.get_parts() return render(request, "devices/parts.html", locals()) except gsxws.GsxError as message: return render(request, "search/results/gsx_error.html", locals()) if param == "productName": product = gsxws.Product(productName=query) parts = product.parts() for p in parts: results.append(Product.from_gsx(p)) if what == "repairs": # Looking for GSX repairs if param == "serialNumber": # ... with a serial number try: device = gsxws.Product(query) #results = device.repairs() for i, p in enumerate(device.repairs()): d = {'purchaseOrderNumber': p.purchaseOrderNumber} d['repairConfirmationNumber'] = p.repairConfirmationNumber d['createdOn'] = p.createdOn # @TODO: move the encoding hack to py-gsxws d['customerName'] = p.customerName.encode('utf-8') d['repairStatus'] = p.repairStatus results.append(d) except gsxws.GsxError as e: return render(request, "search/results/gsx_notfound.html") elif param == "dispatchId": # ... with a repair confirmation number repair = gsxws.Repair(number=query) try: results = repair.lookup() except gsxws.GsxError as message: return render(request, error_template, locals()) return render(request, "devices/search_gsx_%s.html" % what, 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)
def get_gsx_search_results(request, what, param, query): """ The second phase of a GSX search. There should be an active GSX session open at this stage. """ data = {} results = [] query = query.upper() device = Device(sn=query) error_template = "search/results/gsx_error.html" # @TODO: this isn't a GSX search. Move it somewhere else. if what == "orders": try: if param == 'serialNumber': device = Device.objects.get(sn__exact=query) if param == 'alternateDeviceId': device = Device.objects.get(imei__exact=query) except (Device.DoesNotExist, ValueError,): return render(request, "search/results/gsx_notfound.html") orders = device.order_set.all() return render(request, "orders/list.html", locals()) if what == "warranty": # Update wty info if device has been serviced before try: device = Device.objects.get(sn__exact=query) device.update_gsx_details() except Exception: try: device = Device.from_gsx(query, user=request.user) except Exception as e: return render(request, error_template, {'message': e}) results.append(device) # maybe it's a device we've already replaced... try: soi = ServiceOrderItem.objects.get(sn__iexact=query) results[0].repeat_service = soi.order except ServiceOrderItem.DoesNotExist: pass if what == "parts": # looking for parts if param == "partNumber": # ... with a part number part = gsxws.Part(partNumber=query) try: partinfo = part.lookup() except gsxws.GsxError as e: return render(request, error_template, {'message': e}) product = Product.from_gsx(partinfo) cache.set(query, product) results.append(product) if param == "serialNumber": try: dev = Device.from_gsx(query) products = dev.get_parts() return render(request, "devices/parts.html", locals()) except gsxws.GsxError as message: return render(request, "search/results/gsx_error.html", locals()) if param == "productName": product = gsxws.Product(productName=query) parts = product.parts() for p in parts: results.append(Product.from_gsx(p)) if what == "repairs": # Looking for GSX repairs if param == "serialNumber": # ... with a serial number try: device = gsxws.Product(query) #results = device.repairs() for i, p in enumerate(device.repairs()): d = {'purchaseOrderNumber': p.purchaseOrderNumber} d['repairConfirmationNumber'] = p.repairConfirmationNumber d['createdOn'] = p.createdOn # @TODO: move the encoding hack to py-gsxws d['customerName'] = p.customerName.encode('utf-8') d['repairStatus'] = p.repairStatus results.append(d) except gsxws.GsxError as e: return render(request, "search/results/gsx_notfound.html") elif param == "dispatchId": # ... with a repair confirmation number repair = gsxws.Repair(number=query) try: results = repair.lookup() except gsxws.GsxError as message: return render(request, error_template, locals()) return render(request, "devices/search_gsx_%s.html" % what, locals())
def get_gsx_search_results(request, what, param, query): """ The second phase of a GSX search. There should be an active GSX session open at this stage. """ data = {} results = [] query = query.upper() device = Device(sn=query) error_template = "search/results/gsx_error.html" # @TODO: this isn't a GSX search. Move it somewhere else. if what == "orders": try: if param == 'serialNumber': device = Device.objects.get(sn__exact=query) if param == 'alternateDeviceId': device = Device.objects.get(imei__exact=query) except (Device.DoesNotExist, ValueError,): return render(request, "search/results/gsx_notfound.html") orders = device.order_set.all() return render(request, "orders/list.html", locals()) if what == "warranty": # Update wty info if been here before try: device = Device.objects.get(sn__exact=query) device.update_gsx_details() except Exception: try: device = Device.from_gsx(query) except Exception as e: return render(request, error_template, {'message': e}) results.append(device) # maybe it's a device we've already replaced... try: soi = ServiceOrderItem.objects.get(sn__iexact=query) results[0].repeat_service = soi.order except ServiceOrderItem.DoesNotExist: pass if what == "parts": # looking for parts if param == "partNumber": # ... with a part number part = gsxws.Part(partNumber=query) try: partinfo = part.lookup() except gsxws.GsxError, e: return render(request, error_template, {'message': e}) product = Product.from_gsx(partinfo) cache.set(query, product) results.append(product) if param == "serialNumber": # ... with a serial number try: results = device.get_parts() data['device'] = device except Exception, e: return render(request, error_template, {'message': e})
cache.set(query, product) results.append(product) if param == "serialNumber": # ... with a serial number try: results = device.get_parts() data['device'] = device except Exception, e: return render(request, error_template, {'message': e}) if param == "productName": product = gsxws.Product(productName=query) parts = product.parts() for p in parts: results.append(Product.from_gsx(p)) if what == "repairs": # Looking for GSX repairs if param == "serialNumber": # ... with a serial number try: device = gsxws.Product(query) #results = device.repairs() # @TODO: move the encoding hack to py-gsxws for i, p in enumerate(device.repairs()): d = {'purchaseOrderNumber': p.purchaseOrderNumber} d['repairConfirmationNumber'] = p.repairConfirmationNumber d['createdOn'] = p.createdOn d['customerName'] = p.customerName.encode('utf-8') d['repairStatus'] = p.repairStatus