When an Article is issued, we should verify whether the Library Member has an active membership. We should also check whether the Article is available for Issue. Let's write the code for these validations.
library_transaction.py
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
class LibraryTransaction(Document):
def before_submit(self):
if self.type == 'Issue':
self.validate_issue()
# set the article status to be Issued
article = frappe.get_doc('Article', self.article)
article.status = 'Issued'
article.save()
elif self.type == 'Return':
self.validate_return()
# set the article status to be Available
article = frappe.get_doc('Article', self.article)
article.status = 'Available'
article.save()
def validate_issue(self):
self.validate_membership()
article = frappe.get_doc('Article', self.article)
# article cannot be issued if it is already issued
if article.status == 'Issued':
frappe.throw('Article is already issued by another member')
def validate_return(self):
article = frappe.get_doc('Article', self.article)
# article cannot be returned if it is not issued first
if article.status == 'Available':
frappe.throw('Article cannot be returned without being issued first')
def validate_membership(self):
# check if a valid membership exist for this library member
valid_membership = frappe.db.exists(
'Library Membership',
{
'library_member': self.library_member,
'docstatus': 1,
'from_date': ('<', self.date),
'to_date': ('>', self.date),
},
)
if not valid_membership:
frappe.throw('The member does not have a valid membership')
There is a lot of code here but it should be self explanatory. There are inline code comments for more explanation.
How does one know exactly which frappe method to use when doing their own projects?