user5282752
user5282752

Reputation:

how not to do an action when condition met in Django

I have a couple of models named User, Book, Issue. Model Book has a field named remaining which holds the value of the number of available books.

what I want:
When there is zero book available, Issuing a book is closed.

models.py

from django.db import models
from datetime import date, timedelta, datetime

class Book(models.Model):
    name = models.CharField(max_length=30)
    author_name = models.CharField(max_length=30)
    category = models.CharField(max_length=30)
    remaining = models.IntegerField()

    def __str__(self):
        return self.name

class Issue(models.Model):
    issue_id = models.CharField(max_length=10)
    roll = models.ForeignKey(User, on_delete=models.CASCADE)
    book_name = models.ForeignKey(Book, on_delete=models.CASCADE)
    issue_date = models.DateField(auto_now=False, auto_now_add=True)

    def save(self, *args, **kwargs):
        if not self.pk:
            super().save(*args, **kwargs)
            if self.book_name.remaining > 0:
                self.book_name.remaining -= 1
                self.book_name.save()
            elif self.book_name.remaining == 0:
                print('hi')
        else:
            super().save(*args, **kwargs)

admin.py

from django.contrib import admin
from django.contrib.auth.models import Group
from .models import User, Book, Issue

class BookAdmin(admin.ModelAdmin):
    list_display = ('name', 'author_name', 'remaining', 'category')
    list_filter = ('category', 'author_name')
    search_fields = ('name', 'author_name')


class IssueAdmin(admin.ModelAdmin):
    list_display = ('issue_id', 'issue_date', 'return_date', 'fine',)
    list_filter = ('issue_date',)
    search_fields = ('issue_id',)

admin.site.register(Book, BookAdmin)
admin.site.register(Issue, IssueAdmin)

I want to Implement this in Admin Dashboard
Regards

Upvotes: 2

Views: 95

Answers (1)

Maximilian Ballard
Maximilian Ballard

Reputation: 996

On the clean function just check to see if the books are available. And raise validation error if there are not any available.

def clean(self, *args, **kwargs):
    from django.core.exceptions import ValidationError
    super().clean()
    if self.book_name.remaining < 1:
        raise ValidationError("No books available")
    else:
        self.book_name.remaining -= 1
        self.book_name.save()

Upvotes: 1

Related Questions