Example #1
0
    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)
Example #2
0
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()
Example #3
0
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 ''
Example #4
0
def order_status(key, *args, **kwargs):
    return mark_safe(OrderStatus.render(key))