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 orders(request): """ Searches local service orders """ query = request.GET.get("q") if not query or len(query) < 3: messages.error(request, _('Search query is too short')) return redirect(reverse('orders-index')) request.session['search_query'] = query # Redirect Order ID:s to the order try: order = Order.objects.get(code__iexact=query) return redirect(order) except Order.DoesNotExist: pass orders = Order.objects.filter( Q(code=query) | Q(devices__sn__contains=query) | Q(customer__fullname__icontains=query) | Q(customer__phone__contains=query) | Q(repair__confirmation=query) | Q(repair__reference=query)) data = { 'title': _('Orders'), 'subtitle': _(u'%d results for "%s"') % (orders.count(), query) } page = request.GET.get('page') data['orders'] = paginate(orders.distinct(), page, 100) return render(request, "orders/index.html", data)
def find(request): """ Searching for device from devices/find """ title = _("Device search") form = DeviceSearchForm() results = Device.objects.none() if request.method == 'POST': form = DeviceSearchForm(request.POST) if form.is_valid(): fdata = form.cleaned_data results = Device.objects.all() if fdata.get("product_line"): results = results.filter( product_line__in=fdata['product_line']) if fdata.get("warranty_status"): results = results.filter( warranty_status__in=fdata['warranty_status']) if fdata.get("description"): results = results.filter( description__icontains=fdata['description']) if fdata.get("sn"): results = results.filter(sn__icontains=fdata['sn']) if fdata.get("date_start"): results = results.filter( created_at__range=[fdata['date_start'], fdata['date_end']]) page = request.GET.get("page") devices = paginate(results, page, 100) return render(request, "devices/find.html", locals())
def prep_list_view(request, product_line=None, model=None): """ Prepares the basic device list view """ title = _('Devices') search_hint = "devices" all_devices = Device.objects.all() product_lines = gsxws.products.models() if product_line is None: product_line = product_lines.keys()[0] models = model_from_slug(product_line) if model is None: model = models.keys()[0] title = product_lines[product_line]['name'] else: title = models.get(model) if product_line == "OTHER": all_devices = all_devices.filter(product_line=product_line) else: all_devices = all_devices.filter(slug=model) page = request.GET.get('page') devices = paginate(all_devices, page, 50) return locals()
def find(request): """ Searching for device from devices/find """ title = _("Device search") form = DeviceSearchForm() results = Device.objects.none() if request.method == 'POST': form = DeviceSearchForm(request.POST) if form.is_valid(): fdata = form.cleaned_data results = Device.objects.all() if fdata.get("product_line"): results = results.filter(product_line__in=fdata['product_line']) if fdata.get("warranty_status"): results = results.filter(warranty_status__in=fdata['warranty_status']) if fdata.get("description"): results = results.filter(description__icontains=fdata['description']) if fdata.get("sn"): results = results.filter(sn__icontains=fdata['sn']) if fdata.get("date_start"): results = results.filter(created_at__range=[fdata['date_start'], fdata['date_end']]) page = request.GET.get("page") devices = paginate(results, page, 100) return render(request, "devices/find.html", locals())
def prepare_view(request, group='all'): title = _("Customers") customer_list = [] search_hint = "customers" all_customers = Customer.objects.all().order_by('name') customer_count = all_customers.count() if request.session.get("return_to"): del(request.session['return_to']) if request.method == 'POST': q = request.POST.get('query') if q is not None: try: (key, value) = q.split('=') # allow searching customers by arbitrary key/values customer_list = Customer.objects.filter(**{key: value.strip()}) except Exception: customer_list = Customer.objects.filter(name__icontains=q) else: if group == 'all': customer_list = all_customers else: g = CustomerGroup.objects.get(slug=group) customer_list = all_customers.filter(groups=g) title = g.name groups = CustomerGroup.objects.all() page = request.GET.get('page') customers = paginate(customer_list, page, 40) return locals()
def find(request): """ Notes advanced search """ form = NoteSearchForm(request.GET) results = Note.objects.none() if request.GET and form.is_valid(): fdata = form.cleaned_data results = Note.objects.all() if fdata.get('body'): results = results.filter(body__icontains=fdata['body']) if fdata.get('recipient'): results = results.filter(recipient__icontains=fdata['recipient']) if fdata.get('sender'): results = results.filter(sender__icontains=fdata['sender']) if fdata.get('order_code'): results = results.filter( order__code__icontains=fdata['order_code']) results = results.order_by('-created_at') title = _('Message search') notes = paginate(results, request.GET.get('page'), 10) return render(request, "notes/find.html", locals())
def find(request): """ Search from customer advanced search """ results = list() request.session['customer_list'] = list() if request.method == 'POST': form = CustomerSearchForm(request.POST) if form.is_valid(): d = form.cleaned_data checkin_start = d.pop('checked_in_start') checkin_end = d.pop('checked_in_end') if checkin_start and checkin_end: d['orders__created_at__range'] = [checkin_start.isoformat(), checkin_end.isoformat()] results = Customer.objects.filter(**d).distinct() request.session['customer_query'] = d else: form = CustomerSearchForm() title = _('Search for customers') page = request.GET.get('page') customers = paginate(results, page, 50) return render(request, "customers/find.html", locals())
def prep_list_view(request): """ Prepares the list view for incoming parts and products """ from datetime import timedelta now = timezone.now() data = {'can_receive': True} data['counts'] = prep_counts() location = request.user.get_location() ordered_date_range = [now - timedelta(days=30), timezone.now()] received_date_range = [now - timedelta(days=30), timezone.now()] initial = { 'location': location, 'ordered_start_date': ordered_date_range[0], 'ordered_end_date': ordered_date_range[1], } if request.method == 'POST': data['form'] = IncomingSearchForm(request.POST, initial=initial) else: data['form'] = IncomingSearchForm(initial=initial) inventory = PurchaseOrderItem.objects.filter(received_at=None).select_related('purchase_order', 'sales_order') inventory = inventory.exclude(purchase_order__submitted_at=None) if request.method == 'POST': fdata = request.POST loc = fdata.get('location') if loc: inventory = PurchaseOrderItem.objects.filter(purchase_order__location=loc) ordered_sd = fdata.get('ordered_start_date') if ordered_sd: ordered_date_range[0] = ordered_sd inventory = inventory.filter(purchase_order__submitted_at__range=ordered_date_range) received_sd = fdata.get('received_start_date') if received_sd: received_date_range[0] = received_sd inventory = inventory.filter(received_at__range=received_date_range) conf = fdata.get('confirmation') if conf: inventory = PurchaseOrderItem.objects.filter(purchase_order__confirmation=conf) service_order = fdata.get('service_order') if service_order: inventory = PurchaseOrderItem.objects.filter(purchase_order__sales_order__code=service_order) page = request.GET.get("page") inventory = inventory.order_by('-id') data['count'] = inventory.count() data['inventory'] = paginate(inventory, page, 200) data['title'] = _(u"%d incoming products") % data['count'] return data
def prep_list_view(request, kind): """Prepare the view for listing notes/messages.""" data = {'title': _("Messages")} all_notes = Note.objects.all().order_by("-created_at") if kind == "articles": all_notes = Article.objects.all().order_by('-date_created') if kind == "inbox": all_notes = all_notes.filter(order=None).order_by( "is_read", "-created_at") if kind == "sent": all_notes = all_notes.filter(created_by=request.user) if kind == "flagged": all_notes = all_notes.filter(is_flagged=True) if kind == "escalations": all_notes = Note.objects.all().exclude(escalation=None) page = request.GET.get("page") notes = paginate(all_notes, page, 20) data['kind'] = kind data['notes'] = notes data['search_hint'] = "notes" data['inbox_count'] = Note.objects.filter(order=None).count() return data
def find(request): """ Search from customer advanced search """ results = list() request.session['customer_list'] = list() if request.method == 'POST': form = CustomerSearchForm(request.POST) if form.is_valid(): d = form.cleaned_data checkin_start = d.pop('checked_in_start') checkin_end = d.pop('checked_in_end') if checkin_start and checkin_end: d['orders__created_at__range'] = [ checkin_start.isoformat(), checkin_end.isoformat() ] results = Customer.objects.filter(**d).distinct() request.session['customer_query'] = d else: form = CustomerSearchForm() title = _('Search for customers') page = request.GET.get('page') customers = paginate(results, page, 50) return render(request, "customers/find.html", locals())
def prepare_view(request, group='all'): title = _("Customers") customer_list = [] search_hint = "customers" all_customers = Customer.objects.all().order_by('name') customer_count = all_customers.count() if request.session.get("return_to"): del (request.session['return_to']) if request.method == 'POST': q = request.POST.get('query') if q is not None: try: (key, value) = q.split('=') # allow searching customers by arbitrary key/values customer_list = Customer.objects.filter(**{key: value.strip()}) except Exception: customer_list = Customer.objects.filter(name__icontains=q) else: if group == 'all': customer_list = all_customers else: g = CustomerGroup.objects.get(slug=group) customer_list = all_customers.filter(groups=g) title = g.name groups = CustomerGroup.objects.all() page = request.GET.get('page') customers = paginate(customer_list, page, 40) return locals()
def prep_list_view(request, kind): """ Prepares the view for listing notes/messages """ data = {'title': _("Messages")} all_notes = Note.objects.all().order_by("-created_at") if kind == "articles": all_notes = Article.objects.all().order_by('-date_created') if kind == "inbox": all_notes = all_notes.filter(order=None).order_by("is_read", "-created_at") if kind == "sent": all_notes = all_notes.filter(created_by=request.user) if kind == "flagged": all_notes = all_notes.filter(is_flagged=True) if kind == "escalations": all_notes = Note.objects.all().exclude(escalation=None) page = request.GET.get("page") notes = paginate(all_notes, page, 20) data['kind'] = kind data['notes'] = notes data['search_hint'] = "notes" data['inbox_count'] = Note.objects.filter(order=None).count() return data
def find(request): """ Notes advanced search """ form = NoteSearchForm(request.GET) results = Note.objects.none() if request.GET and form.is_valid(): fdata = form.cleaned_data results = Note.objects.all() if fdata.get('body'): results = results.filter(body__icontains=fdata['body']) if fdata.get('recipient'): results = results.filter(recipient__icontains=fdata['recipient']) if fdata.get('sender'): results = results.filter(sender__icontains=fdata['sender']) if fdata.get('order_code'): results = results.filter(order__code__icontains=fdata['order_code']) results = results.order_by('-created_at') title = _('Message search') notes = paginate(results, request.GET.get('page'), 10) return render(request, "notes/find.html", locals())
def updates(request): title = _("Updates") kind = request.GET.get("kind", "note_added") events = request.user.notifications.filter(action=kind) page = request.GET.get("page") events = paginate(events, page, 100) return render(request, "accounts/updates.html", locals())
def updates(request): title = _('Updates') kind = request.GET.get('kind', 'note_added') events = request.user.notifications.filter(action=kind) page = request.GET.get("page") events = paginate(events, page, 100) return render(request, "accounts/updates.html", locals())
def list_bulk_returns(request): from django.db.models import Count title = _("Browse Bulk Returns") returns = Shipment.objects.exclude(dispatched_at=None).annotate(num_parts=Count('servicepart')) page = request.GET.get("page") returns = paginate(returns, page, 50) counts = prep_counts() return render(request, "shipments/list_bulk_returns.html", locals())
def invoices(request): """ Lists invoices, optionally with a search filter """ from datetime import timedelta from django.db.models import Sum data = {'title': _("Invoices")} now = timezone.now() start_date, end_date = now - timedelta(days=30), now initial = {'start_date': start_date, 'end_date': end_date} invoices = Invoice.objects.filter(created_at__range=(start_date, end_date)) form = InvoiceSearchForm(initial=initial) if request.method == 'POST': invoices = Invoice.objects.all() form = InvoiceSearchForm(request.POST, initial=initial) if form.is_valid(): fdata = form.cleaned_data if fdata.get('state') == 'OPEN': invoices = invoices.filter(paid_at=None) if fdata.get('state') == 'PAID': invoices = invoices.exclude(paid_at=None) payment_method = fdata.get('payment_method') if len(payment_method): invoices = invoices.filter(payment__method=payment_method) start_date = fdata.get('start_date', start_date) end_date = fdata.get('end_date', end_date) invoices = invoices.filter(created_at__range=(start_date, end_date)) if fdata.get('status_isnot'): invoices = invoices.exclude(order__status__status=fdata['status_isnot']) if fdata.get('customer_name'): invoices = invoices.filter(customer_name__icontains=fdata['customer_name']) if fdata.get('service_order'): invoices = invoices.filter(order__code__exact=fdata['service_order']) data['total'] = invoices.aggregate(Sum('total_net')) data['total_paid'] = invoices.exclude(paid_at=None).aggregate(Sum('total_net')) pos = PurchaseOrder.objects.filter(created_at__range=[start_date, end_date]) data['total_purchases'] = pos.aggregate(Sum('total')) page = request.GET.get('page') data['form'] = form data['invoices'] = invoices data['invoices'] = paginate(invoices, page, 50) return render(request, "invoices/index.html", data)
def notes(request): """ Searches for local notes """ query = request.GET.get("q") request.session['search_query'] = query results = Note.objects.filter(body__icontains=query).order_by('-created_at') title = _(u'%d search results for "%s"') % (results.count(), query,) notes = paginate(results, request.GET.get('page'), 10) return render(request, "notes/search.html", locals())
def prep_list_view(request, group='all'): """ Prepares the product list view """ title = _("Products") search_hint = "products" all_products = Product.objects.all() categories = ProductCategory.objects.all() if group == 'all': group = ProductCategory(title=_('All'), slug='all') elif group == 'None': group = ProductCategory(title=_('None'), slug='none') all_products = all_products.filter(categories=None) else: group = categories.get(slug=group) all_products = group.get_products() if request.method == 'POST': form = ProductSearchForm(request.POST) if form.is_valid(): fdata = form.cleaned_data description = fdata.get('description') if description: all_products = all_products.filter(description__icontains=description) title = fdata.get('title') if title: all_products = all_products.filter(title__icontains=title) code = fdata.get('code') if code: all_products = all_products.filter(code__icontains=code) tag = fdata.get('tag') if tag: tag = tag.tag title += u" / %s" % tag all_products = all_products.filter(tags__tag=tag) location = fdata.get('location') if location: all_products = all_products.filter(inventory__location=location) else: form = ProductSearchForm() title += u" / %s" % group.title page = request.GET.get("page") products = paginate(all_products.distinct(), page, 25) return locals()
def notes(request): """ Searches for local notes """ query = request.GET.get("q") request.session['search_query'] = query results = Note.objects.filter( body__icontains=query).order_by('-created_at') title = _(u'%d search results for "%s"') % ( results.count(), query, ) notes = paginate(results, request.GET.get('page'), 10) return render(request, "notes/search.html", locals())
def products(request): """ Searches our local inventory """ query = request.GET.get("q") request.session['search_query'] = query results = Product.objects.filter( Q(code__icontains=query) | Q(title__icontains=query) | Q(eee_code__icontains=query) ) page = request.GET.get("page") products = paginate(results, page, 50) title = _(u'Search results for "%s"') % query group = ProductCategory(title=_('All'), slug='all') return render(request, 'products/search.html', locals())
def products(request): """ Searches our local inventory """ query = request.GET.get("q") request.session['search_query'] = query results = Product.objects.filter( Q(code__icontains=query) | Q(title__icontains=query) | Q(eee_code__icontains=query)) page = request.GET.get("page") products = paginate(results, page, 50) title = _(u'Search results for "%s"') % query group = ProductCategory(title=_('All'), slug='all') return render(request, 'products/search.html', locals())
def list_pos(request): from datetime import timedelta from django.utils import timezone from django.db.models import Sum now = timezone.now() data = {'title': _("Purchase Orders")} initial = {'start_date': now - timedelta(days=30), 'end_date': now} all_orders = PurchaseOrder.objects.filter( created_at__range=(initial['start_date'], initial['end_date']) ) form = PurchaseOrderSearchForm(initial=initial) if request.method == 'POST': all_orders = PurchaseOrder.objects.all() form = PurchaseOrderSearchForm(request.POST, initial=initial) if form.is_valid(): fdata = form.cleaned_data reference = fdata.get('reference') if reference: all_orders = all_orders.filter(reference__contains=reference) if fdata.get('state') == 'open': all_orders = all_orders.filter(submitted_at=None) if fdata.get('state') == 'submitted': all_orders = all_orders.exclude(submitted_at=None) if fdata.get('state') == 'received': all_orders = all_orders.exclude(has_arrived=True) s, e = (fdata.get('start_date'), fdata.get('end_date')) if s and e: all_orders = all_orders.filter(created_at__range=(s, e)) created_by = fdata.get('created_by') if created_by: all_orders = all_orders.filter(created_by=created_by) page = request.GET.get("page") orders = paginate(all_orders, page, 50) data['orders'] = orders data['form'] = form data['total'] = all_orders.aggregate(Sum('total')) return render(request, "purchases/list_pos.html", data)
def list_pos(request): from datetime import timedelta from django.utils import timezone from django.db.models import Sum now = timezone.now() data = {'title': _("Purchase Orders")} initial = {'start_date': now - timedelta(days=30), 'end_date': now} all_orders = PurchaseOrder.objects.filter( created_at__range=(initial['start_date'], initial['end_date'])) form = PurchaseOrderSearchForm(initial=initial) if request.method == 'POST': all_orders = PurchaseOrder.objects.all() form = PurchaseOrderSearchForm(request.POST, initial=initial) if form.is_valid(): fdata = form.cleaned_data reference = fdata.get('reference') if reference: all_orders = all_orders.filter(reference__contains=reference) if fdata.get('state') == 'open': all_orders = all_orders.filter(submitted_at=None) if fdata.get('state') == 'submitted': all_orders = all_orders.exclude(submitted_at=None) if fdata.get('state') == 'received': all_orders = all_orders.exclude(has_arrived=True) s, e = (fdata.get('start_date'), fdata.get('end_date')) if s and e: all_orders = all_orders.filter(created_at__range=(s, e)) created_by = fdata.get('created_by') if created_by: all_orders = all_orders.filter(created_by=created_by) page = request.GET.get("page") orders = paginate(all_orders, page, 50) data['orders'] = orders data['form'] = form data['total'] = all_orders.aggregate(Sum('total')) return render(request, "purchases/list_pos.html", data)
def orders(request): """ Searches local service orders """ query = request.GET.get("q") if not query or len(query) < 3: messages.error(request, _('Search query is too short')) return redirect(reverse('orders-index')) request.session['search_query'] = query # Redirect Order ID:s to the order try: order = Order.objects.get(code__iexact=query) return redirect(order) except Order.DoesNotExist: pass orders = Order.objects.filter( Q(code=query) | Q(devices__sn__contains=query) | Q(customer__fullname__icontains=query) | Q(customer__phone__contains=query) | Q(repair__confirmation=query) | Q(repair__reference=query) ) data = { 'title': _('Orders'), 'subtitle': _(u'%d results for "%s"') % (orders.count(), query) } page = request.GET.get('page') data['orders'] = paginate(orders.distinct(), page, 100) return render(request, "orders/index.html", data)
def prepare_list_view(request, args): """ Lists service orders matching specified criteria """ data = {'title': _("Orders")} form = OrderSearchForm(request, args) if request.session.get("current_queue"): del(request.session['current_queue']) if request.session.get("return_to"): del(request.session['return_to']) if request.user.customer: orders = Order.objects.filter(customer=request.user.customer) else: orders = Order.objects.filter(location__in=request.user.locations.all()) if args.get("state"): orders = orders.filter(state__in=args.getlist("state")) start_date = args.get("start_date") if start_date: end_date = args.get('end_date') or timezone.now() orders = orders.filter(created_at__range=[start_date, end_date]) if args.get("status_older_than"): days = int(args.get("status_older_than")) limit = datetime.now() - timedelta(days=days) orders = orders.filter(status_started_at__lt=limit) if args.get("assigned_to"): users = args.getlist("assigned_to") orders = orders.filter(user__in=users) if args.get("followed_by"): users = args.getlist("followed_by") orders = orders.filter(followed_by__in=users) if args.get("created_by"): users = args.getlist("created_by") orders = orders.filter(created_by__in=users) if args.get("customer"): customer = int(args['customer'][0]) if customer == 0: orders = orders.filter(customer__pk=None) else: orders = orders.filter(customer__tree_id=customer) if args.get("spec"): spec = args['spec'][0] if spec is "None": orders = orders.filter(devices=None) else: orders = orders.filter(devices__slug=spec) if args.get("device"): orders = orders.filter(devices__pk=args['device']) if args.get("queue"): queue = args.getlist("queue") orders = orders.filter(queue__in=queue) if args.get("checkin_location"): ci_location = args.getlist("checkin_location") orders = orders.filter(checkin_location__in=ci_location) if args.get("location"): location = args.getlist("location") orders = orders.filter(location__in=location) if args.get("label"): orders = orders.filter(tags__in=args.getlist("label")) if args.get("status"): status = args.getlist("status") if args['status'][0] == 'None': orders = orders.filter(status__pk=None) else: orders = orders.filter(status__status__in=status) if args.get("color"): color = args.getlist("color") now = timezone.now() if "grey" in color: orders = orders.filter(status=None) if "green" in color: orders = orders.filter(status_limit_green__gte=now) if "yellow" in color: orders = orders.filter(status_limit_yellow__gte=now, status_limit_green__lte=now) if "red" in color: orders = orders.filter(status_limit_yellow__lte=now) page = request.GET.get("page") data['form'] = form data['queryset'] = orders data['orders'] = paginate(orders.distinct(), page, 100) data['subtitle'] = _("%d search results") % orders.count() return data
def invoices(request): """ Lists invoices, optionally with a search filter """ from datetime import timedelta from django.db.models import Sum data = {'title': _("Invoices")} now = timezone.now() start_date, end_date = now - timedelta(days=30), now initial = {'start_date': start_date, 'end_date': end_date} invoices = Invoice.objects.filter(created_at__range=(start_date, end_date)) form = InvoiceSearchForm(initial=initial) if request.method == 'POST': invoices = Invoice.objects.all() form = InvoiceSearchForm(request.POST, initial=initial) if form.is_valid(): fdata = form.cleaned_data if fdata.get('state') == 'OPEN': invoices = invoices.filter(paid_at=None) if fdata.get('state') == 'PAID': invoices = invoices.exclude(paid_at=None) payment_method = fdata.get('payment_method') if len(payment_method): invoices = invoices.filter(payment__method=payment_method) start_date = fdata.get('start_date', start_date) end_date = fdata.get('end_date', end_date) invoices = invoices.filter(created_at__range=(start_date, end_date)) if fdata.get('status_isnot'): invoices = invoices.exclude( order__status__status=fdata['status_isnot']) if fdata.get('customer_name'): invoices = invoices.filter( customer_name__icontains=fdata['customer_name']) if fdata.get('service_order'): invoices = invoices.filter( order__code__exact=fdata['service_order']) data['total'] = invoices.aggregate(Sum('total_net')) data['total_paid'] = invoices.exclude(paid_at=None).aggregate( Sum('total_net')) pos = PurchaseOrder.objects.filter( created_at__range=[start_date, end_date]) data['total_purchases'] = pos.aggregate(Sum('total')) page = request.GET.get('page') data['form'] = form data['invoices'] = invoices data['invoices'] = paginate(invoices, page, 50) return render(request, "invoices/index.html", data)