def list(self, request, *args, **kwargs): queryset = self.get_queryset().prefetch_related('supplier', 'lines') queryset = self.filter_queryset(queryset) # Special filtering for 'status' field if 'status' in request.GET: status = request.GET['status'] # First attempt to filter by integer value try: status = int(status) queryset = queryset.filter(status=status) except ValueError: try: value = OrderStatus.value(status) queryset = queryset.filter(status=value) except ValueError: pass # Attempt to filter by part if 'part' in request.GET: try: part = Part.objects.get(pk=request.GET['part']) queryset = queryset.filter(id__in=[p.id for p in part.purchase_orders()]) except (Part.DoesNotExist, ValueError): pass # Attempt to filter by supplier part if 'supplier_part' in request.GET: try: supplier_part = SupplierPart.objects.get(pk=request.GET['supplier_part']) queryset = queryset.filter(id__in=[p.id for p in supplier_part.purchase_orders()]) except (ValueError, SupplierPart.DoesNotExist): pass data = queryset.values( 'pk', 'supplier', 'supplier__name', 'supplier__image', 'reference', 'description', 'URL', 'status', 'notes', 'creation_date', ) for item in data: order = queryset.get(pk=item['pk']) item['supplier__image'] = os.path.join(settings.MEDIA_URL, item['supplier__image']) item['status_text'] = OrderStatus.label(item['status']) item['lines'] = order.lines.count() return Response(data)
class Order(models.Model): """ Abstract model for an order. Instances of this class: - PuchaseOrder Attributes: reference: Unique order number / reference / code description: Long form description (required) notes: Extra note field (optional) creation_date: Automatic date of order creation created_by: User who created this order (automatically captured) issue_date: Date the order was issued """ ORDER_PREFIX = "" def __str__(self): el = [] if self.ORDER_PREFIX: el.append(self.ORDER_PREFIX) el.append(self.reference) return " ".join(el) class Meta: abstract = True reference = models.CharField(unique=True, max_length=64, blank=False, help_text=_('Order reference')) description = models.CharField(max_length=250, help_text=_('Order description')) URL = models.URLField(blank=True, help_text=_('Link to external page')) creation_date = models.DateField(auto_now=True, editable=False) status = models.PositiveIntegerField(default=OrderStatus.PENDING, choices=OrderStatus.items(), help_text='Order status') created_by = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True, related_name='+' ) issue_date = models.DateField(blank=True, null=True) notes = models.TextField(blank=True, help_text=_('Order notes')) def place_order(self): """ Marks the order as PLACED. Order must be currently PENDING. """ if self.status == OrderStatus.PENDING: self.status = OrderStatus.PLACED self.issue_date = datetime.now().date() self.save()
def load_status_codes(context): """ Make the various StatusCodes available to the page context """ context['order_status_codes'] = OrderStatus.list() context['stock_status_codes'] = StockStatus.list() context['build_status_codes'] = BuildStatus.list() # Need to return something as the result is rendered to the page return ''
def order_status(key, *args, **kwargs): return mark_safe(OrderStatus.render(key))