def get_remote_device(request, sn): try: apple_sn_validator(sn) except ValidationError: return Device(sn=sn, image_url='https://static.servoapp.com/images/na.gif') get_gsx_connection(request) return Device.from_gsx(sn)
def search_gsx(request, what, param, query): """ The first phase of a GSX search """ title = _(u'Search results for "%s"') % query try: act = request.session.get("gsx_account") act = None if act is None: GsxAccount.default(user=request.user) else: act.connect(request.user) except gsxws.GsxError as message: return render(request, "devices/search_gsx_error.html", locals()) if request.is_ajax(): if what == "parts": 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()) return get_gsx_search_results(request, what, param, query) return render(request, "devices/search_gsx.html", locals())
def choose(request, order_id): """ Choosing a device from within an SRO Does GSX lookup in case device is not found locally """ context = {'order': order_id} if request.method == "POST": query = request.POST.get('q').upper() results = Device.objects.filter(Q(sn__iexact=query) | Q(imei=query)) if len(results) < 1: try: current_order = request.session.get("current_order_id") current_order = Order.objects.get(pk=current_order) if current_order and current_order.queue: GsxAccount.default(request.user, current_order.queue) else: GsxAccount.default(request.user) results = [Device.from_gsx(query)] except Exception as e: context['error'] = e return render(request, "devices/choose-error.html", context) context['results'] = results return render(request, "devices/choose-list.html", context) return render(request, "devices/choose.html", context)
def add_device(request, pk, device_id=None, sn=None): """ Adds a device to a service order using device_id with existing devices or sn for new devices (which should have gone through GSX search) """ order = get_object_or_404(Order, pk=pk) if device_id is not None: device = Device.objects.get(pk=device_id) if sn is not None: sn = sn.upper() # not using get() since SNs are not unique device = Device.objects.filter(sn=sn).first() if device is None: try: device = Device.from_gsx(sn) device.save() except Exception as e: messages.error(request, e) return redirect(order) try: event = order.add_device(device, request.user) messages.success(request, event) except Exception as e: messages.error(request, e) return redirect(order) if order.customer: order.customer.devices.add(device) return redirect(order)
def get_device(request, sn): if len(sn) < 1: return Device(sn=sn) key = 'checkin-device-%s' % sn device = cache.get(key, get_local_device(request, sn)) set_cache_device(device) return device
def find_device(request): device = Device(sn=request.GET['sn']) device.description = _('Other Device') device_form = DeviceForm(instance=device) try: apple_sn_validator(device.sn) except Exception as e: # not an Apple serial number return render(request, "checkin/device_form.html", locals()) try: device = get_device(request, device.sn) device_form = DeviceForm(instance=device) except GsxError as e: error = e return render(request, "checkin/device_form.html", locals())
def prep_detail_view(request, pk, product_line=None, model=None): if pk is None: device = Device() else: device = get_object_or_404(Device, pk=pk) data = prep_list_view(request, product_line, model) data['device'] = device data['title'] = device.description return data
def upload_devices(request): """ User uploads device DB as tab-delimited CSV file SN USERNAME PASSWORD NOTES """ gsx_account = None form = DeviceUploadForm() if request.method == "POST": form = DeviceUploadForm(request.POST, request.FILES) if form.is_valid(): i = 0 df = form.cleaned_data['datafile'].read() if form.cleaned_data.get('do_warranty_check'): gsx_account = GsxAccount.default(request.user) for l in df.split("\r"): l = l.decode("latin-1").encode("utf-8") row = l.strip().split("\t") if gsx_account: try: device = Device.from_gsx(row[0]) except Exception, e: messages.error(request, e) break else: device = Device.objects.get_or_create(sn=row[0])[0] try: device.username = row[1] device.password = row[2] device.notes = row[3] except IndexError: pass device.save() i += 1 if form.cleaned_data.get("customer"): customer = form.cleaned_data['customer'] customer.devices.add(device) messages.success(request, _("%d devices imported") % i) return redirect(index)
def device_from_product(request, pk, item_id): """ Turns a SOI into a device and attaches it to this order """ order = get_object_or_404(Order, pk=pk) soi = ServiceOrderItem.objects.get(pk=item_id) try: GsxAccount.default(request.user, order.queue) device = Device.from_gsx(soi.sn, user=request.user) device.save() event = order.add_device(device, request.user) messages.success(request, event) except Exception as e: messages.error(request, e) return redirect(order)
def edit_device(request, pk=None, product_line=None, model=None): """ Edits an existing device or adds a new one """ device = Device() device.sn = request.GET.get('sn', '') if product_line is not None: device.product_line = product_line if model is not None: device.product_line = product_line device.description = model_from_slug(product_line, model) if pk is not None: device = get_object_or_404(Device, pk=pk) form = DeviceForm(instance=device) if request.method == "POST": form = DeviceForm(request.POST, request.FILES, instance=device) if form.is_valid(): device = form.save() messages.success(request, _(u"%s saved") % device.description) device.add_tags(request.POST.getlist('tag')) return redirect(view_device, pk=device.pk, product_line=device.product_line, model=device.slug) else: messages.error(request, form.errors) data = prep_detail_view(request, pk, product_line, model) data['form'] = form return render(request, 'devices/form.html', data)
def index(request): if request.method == 'GET': reset_session(request) title = _('Service Order Check-In') dcat = request.GET.get('d', 'mac') dmap = { 'mac' : _('Mac'), 'iphone' : _('iPhone'), 'ipad' : _('iPad'), 'ipod' : _('iPod'), 'acc' : _('Apple Accessory'), 'beats' : _('Beats Products'), 'other' : _('Other Devices'), } issue_form = IssueForm() device = Device(description=dmap[dcat]) if dcat in ('mac', 'iphone', 'ipad', 'ipod'): sn_form = AppleSerialNumberForm() else: sn_form = SerialNumberForm() tags = Tag.objects.filter(type="order") device_form = DeviceForm(instance=device) customer_form = CustomerForm(request) if request.method == 'POST': sn_form = SerialNumberForm(request.POST) issue_form = IssueForm(request.POST, request.FILES) customer_form = CustomerForm(request, request.POST) device_form = DeviceForm(request.POST, request.FILES) if device_form.is_valid() and issue_form.is_valid() and customer_form.is_valid(): user = User.objects.get(pk=request.session['checkin_user']) idata = issue_form.cleaned_data ddata = device_form.cleaned_data cdata = customer_form.cleaned_data customer_id = request.session.get('checkin_customer') if customer_id: customer = Customer.objects.get(pk=customer_id) else: customer = Customer() name = u'{0} {1}'.format(cdata['fname'], cdata['lname']) if len(cdata['company']): name += ', ' + cdata['company'] customer.name = name customer.city = cdata['city'] customer.phone = cdata['phone'] customer.email = cdata['email'] customer.phone = cdata['phone'] customer.zip_code = cdata['postal_code'] customer.street_address = cdata['address'] customer.save() order = Order(customer=customer, created_by=user) order.location_id = request.session['checkin_location'] order.checkin_location = cdata['checkin_location'] order.checkout_location = cdata['checkout_location'] order.save() order.check_in(user) try: device = get_device(request, ddata['sn']) except GsxError as e: pass device.username = ddata['username'] device.password = ddata['password'] device.description = ddata['description'] device.purchased_on = ddata['purchased_on'] device.purchase_country = ddata['purchase_country'] device.save() order.add_device(device, user) note = Note(created_by=user, body=idata['issue_description']) note.is_reported = True note.order = order note.save() # Proof of purchase was supplied if ddata.get('pop'): f = {'content_type': Attachment.get_content_type('note').pk} f['object_id'] = note.pk a = AttachmentForm(f, {'content': ddata['pop']}) a.save() if request.POST.get('tags'): order.set_tags(request.POST.getlist('tags'), request.user) # Check checklists early for validation answers = [] # @FIXME: should try to move this to a formset... for k, v in request.POST.items(): if k.startswith('__cl__'): answers.append('- **' + k[6:] + '**: ' + v) if len(answers) > 0: note = Note(created_by=user, body="\r\n".join(answers)) if Configuration.true('checkin_report_checklist'): note.is_reported = True note.order = order note.save() # mark down internal notes (only if logged in) if len(idata.get('notes')): note = Note(created_by=user, body=idata['notes']) note.is_reported = False note.order = order note.save() # mark down condition of device if len(ddata.get('condition')): note = Note(created_by=user, body=ddata['condition']) note.is_reported = True note.order = order note.save() # mark down supplied accessories if len(ddata.get('accessories')): accs = ddata['accessories'].strip().split("\n") order.set_accessories(accs, device) redirect_to = thanks """ if request.user.is_authenticated(): if request.user.autoprint: redirect_to = print_confirmation """ return redirect(redirect_to, order.url_code) try: pk = Configuration.conf('checkin_checklist') questions = ChecklistItem.objects.filter(checklist_id=pk) except ValueError: # Checklists probably not configured pass if request.GET.get('phone'): if not request.user.is_authenticated(): return results = [] for c in Customer.objects.filter(phone=request.GET['phone']): title = '%s - %s' % (c.phone, c.name) results.append({'id': c.pk, 'name': c.name, 'title': title}) return HttpResponse(json.dumps(results), content_type='application/json') if request.GET.get('sn'): device = Device(sn=request.GET['sn']) device.description = _('Other Device') device_form = DeviceForm(instance=device) try: apple_sn_validator(device.sn) except Exception as e: # not an Apple serial number return render(request, "checkin/device_form.html", locals()) try: device = get_device(request, device.sn) device_form = DeviceForm(instance=device) except GsxError as e: error = e return render(request, "checkin/device_form.html", locals()) return render(request, "checkin/newindex.html", 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 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 index(request): """ Render the checkin homepage. @FIXME: would be nice to break this into smaller chunks... """ if request.method == 'GET': try: init_session(request) except ConfigurationError as e: error = {'message': e} return render(request, 'checkin/error.html', error) title = _('Service Order Check-In') dcat = request.GET.get('d', 'mac') dmap = { 'mac': _('Mac'), 'iphone': _('iPhone'), 'ipad': _('iPad'), 'ipod': _('iPod'), 'acc': _('Apple Accessory'), 'beats': _('Beats Products'), 'other': _('Other Devices'), } issue_form = IssueForm() device = Device(description=dmap[dcat]) if dcat in ('mac', 'iphone', 'ipad', 'ipod'): sn_form = AppleSerialNumberForm() else: sn_form = SerialNumberForm() tags = Tag.objects.filter(type="order") device_form = DeviceForm(instance=device) customer_form = CustomerForm(request) if request.method == 'POST': if not request.session.test_cookie_worked(): error = { 'message': _('Please enable cookies to use this application.') } return render(request, 'checkin/error.html', error) else: request.session.delete_test_cookie() sn_form = SerialNumberForm(request.POST) issue_form = IssueForm(request.POST, request.FILES) customer_form = CustomerForm(request, request.POST) device_form = DeviceForm(request.POST, request.FILES) if device_form.is_valid() and issue_form.is_valid( ) and customer_form.is_valid(): user = get_object_or_404(User, pk=request.session['checkin_user']) idata = issue_form.cleaned_data ddata = device_form.cleaned_data cdata = customer_form.cleaned_data customer_id = request.session.get('checkin_customer') if customer_id: customer = get_object_or_404(Customer, pk=customer_id) else: customer = Customer() name = u'{0} {1}'.format(cdata['fname'], cdata['lname']) if len(cdata['company']): name += ', ' + cdata['company'] customer.name = name customer.city = cdata['city'] customer.phone = cdata['phone'] customer.email = cdata['email'] customer.phone = cdata['phone'] customer.zip_code = cdata['postal_code'] customer.street_address = cdata['address'] customer.save() order = Order(customer=customer, created_by=user) order.location_id = request.session['checkin_location'] order.checkin_location = cdata['checkin_location'] order.checkout_location = cdata['checkout_location'] order.save() order.check_in(user) try: device = get_device(request, ddata['sn']) except GsxError as e: pass device.username = ddata['username'] device.password = ddata['password'] device.description = ddata['description'] device.purchased_on = ddata['purchased_on'] device.purchase_country = ddata['purchase_country'] device.save() order.add_device(device, user) note = Note(created_by=user, body=idata['issue_description']) note.is_reported = True note.order = order note.save() # Proof of purchase was supplied if ddata.get('pop'): f = {'content_type': Attachment.get_content_type('note').pk} f['object_id'] = note.pk a = AttachmentForm(f, {'content': ddata['pop']}) a.save() if request.POST.get('tags'): order.set_tags(request.POST.getlist('tags'), request.user) # Check checklists early for validation answers = [] # @FIXME: should try to move this to a formset... for k, v in request.POST.items(): if k.startswith('__cl__'): answers.append('- **' + k[6:] + '**: ' + v) if len(answers) > 0: note = Note(created_by=user, body="\r\n".join(answers)) if Configuration.true('checkin_report_checklist'): note.is_reported = True note.order = order note.save() # mark down internal notes (only if logged in) if len(idata.get('notes')): note = Note(created_by=user, body=idata['notes']) note.is_reported = False note.order = order note.save() # mark down condition of device if len(ddata.get('condition')): note = Note(created_by=user, body=ddata['condition']) note.is_reported = True note.order = order note.save() # mark down supplied accessories if len(ddata.get('accessories')): accs = ddata['accessories'].strip().split("\n") order.set_accessories(accs, device) redirect_to = thanks """ if request.user.is_authenticated(): if request.user.autoprint: redirect_to = print_confirmation """ return redirect(redirect_to, order.url_code) try: pk = Configuration.conf('checkin_checklist') questions = ChecklistItem.objects.filter(checklist_id=pk) except ValueError: # Checklists probably not configured pass if request.GET.get('phone'): return find_customer(request, request.GET['phone']) if request.GET.get('sn'): return find_device(request) return render(request, "checkin/newindex.html", locals())
def upload_devices(request): """ User uploads device DB as tab-delimited CSV file SN USERNAME PASSWORD NOTES """ gsx_account = None form = DeviceUploadForm() title = _('Upload devices') if request.GET.get('c'): customer = Customer.objects.get(pk=request.GET['c']) title = _('Upload devices for %s') % customer.name form.fields['customer'].initial = request.GET['c'] if request.method == "POST": form = DeviceUploadForm(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() if sheet.row[0][0] == 'SN': del(sheet.row[0]) # skip header row if form.cleaned_data.get('do_warranty_check'): gsx_account = GsxAccount.default(request.user) for row in sheet: if not len(row[0]): continue # skip empty rows if gsx_account: try: device = Device.from_gsx(row[0]) except Exception as e: messages.error(request, e) break else: device = Device.objects.get_or_create(sn=row[0])[0] device.username = row[1] device.password = row[2] device.notes = row[3] device.save() counter += 1 if form.cleaned_data.get("customer"): cid = form.cleaned_data['customer'] customer = Customer.objects.get(pk=cid) customer.devices.add(device) messages.success(request, _("%d devices imported") % counter) return redirect(index) data = {'form': form, 'action': request.path, 'title': title} return render(request, "devices/upload_devices.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 upload_devices(request): """ User uploads device DB as tab-delimited CSV file SN USERNAME PASSWORD NOTES """ gsx_account = None form = DeviceUploadForm() title = _('Upload devices') if request.GET.get('c'): customer = Customer.objects.get(pk=request.GET['c']) title = _('Upload devices for %s') % customer.name form.fields['customer'].initial = request.GET['c'] if request.method == "POST": form = DeviceUploadForm(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() if sheet.row[0][0] == 'SN': del (sheet.row[0]) # skip header row if form.cleaned_data.get('do_warranty_check'): gsx_account = GsxAccount.default(request.user) for row in sheet: if not len(row[0]): continue # skip empty rows if gsx_account: try: device = Device.from_gsx(row[0]) except Exception as e: messages.error(request, e) break else: device = Device.objects.get_or_create(sn=row[0])[0] device.username = row[1] device.password = row[2] device.notes = row[3] device.save() counter += 1 if form.cleaned_data.get("customer"): cid = form.cleaned_data['customer'] customer = Customer.objects.get(pk=cid) customer.devices.add(device) messages.success(request, _("%d devices imported") % counter) return redirect(index) data = {'form': form, 'action': request.path, 'title': title} return render(request, "devices/upload_devices.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 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})