def info_to_patrondata(cls, info): """Convert the SIP-specific dictionary obtained from SIPClient.patron_information() to an abstract, authenticator-independent PatronData object. """ if info.get('valid_patron_password') == 'N': # The patron did not authenticate correctly. Don't # return any data. return None # TODO: I'm not 100% convinced that a missing CQ field # always means "we don't have passwords so you're # authenticated," rather than "you didn't provide a # password so we didn't check." patrondata = PatronData() if 'sipserver_internal_id' in info: patrondata.permanent_id = info['sipserver_internal_id'] if 'patron_identifier' in info: patrondata.authorization_identifier = info['patron_identifier'] if 'email_address' in info: patrondata.email_address = info['email_address'] if 'personal_name' in info: patrondata.personal_name = info['personal_name'] if 'fee_amount' in info: fines = info['fee_amount'] else: fines = '0' patrondata.fines = MoneyUtility.parse(fines) if 'sipserver_patron_class' in info: patrondata.external_type = info['sipserver_patron_class'] for expire_field in [ 'sipserver_patron_expiration', 'polaris_patron_expiration' ]: if expire_field in info: value = info.get(expire_field) value = cls.parse_date(value) if value: patrondata.authorization_expires = value break return patrondata
def info_to_patrondata(cls, info): """Convert the SIP-specific dictionary obtained from SIPClient.patron_information() to an abstract, authenticator-independent PatronData object. """ if info.get('valid_patron_password') == 'N': # The patron did not authenticate correctly. Don't # return any data. return None # TODO: I'm not 100% convinced that a missing CQ field # always means "we don't have passwords so you're # authenticated," rather than "you didn't provide a # password so we didn't check." patrondata = PatronData() if 'sipserver_internal_id' in info: patrondata.permanent_id = info['sipserver_internal_id'] if 'patron_identifier' in info: patrondata.authorization_identifier = info['patron_identifier'] if 'email_address' in info: patrondata.email_address = info['email_address'] if 'personal_name' in info: patrondata.personal_name = info['personal_name'] if 'fee_amount' in info: fines = info['fee_amount'] else: fines = '0' patrondata.fines = MoneyUtility.parse(fines) if 'sipserver_patron_class' in info: patrondata.external_type = info['sipserver_patron_class'] for expire_field in [ 'sipserver_patron_expiration', 'polaris_patron_expiration' ]: if expire_field in info: value = info.get(expire_field) value = cls.parse_date(value) if value: patrondata.authorization_expires = value break # A True value in most (but not all) subfields of the # patron_status field will prohibit the patron from borrowing # books. status = info['patron_status_parsed'] block_reason = PatronData.NO_VALUE for field in SIPClient.PATRON_STATUS_FIELDS_THAT_DENY_BORROWING_PRIVILEGES: if status.get(field) is True: block_reason = cls.SPECIFIC_BLOCK_REASONS.get( field, PatronData.UNKNOWN_BLOCK) if block_reason not in (PatronData.NO_VALUE, PatronData.UNKNOWN_BLOCK): # Even if there are multiple problems with this # patron's account, we can now present a specific # error message. There's no need to look through # more fields. break patrondata.block_reason = block_reason # If we can tell by looking at the SIP2 message that the # patron has excessive fines, we can use that as the reason # they're blocked. if 'fee_limit' in info: fee_limit = MoneyUtility.parse(info['fee_limit']).amount if fee_limit and patrondata.fines > fee_limit: patrondata.block_reason = PatronData.EXCESSIVE_FINES return patrondata
def info_to_patrondata(self, info, validate_password=True): """Convert the SIP-specific dictionary obtained from SIPClient.patron_information() to an abstract, authenticator-independent PatronData object. """ if info.get("valid_patron", "N") == "N": # The patron could not be identified as a patron of this # library. Don't return any data. return None if info.get("valid_patron_password") == "N" and validate_password: # The patron did not authenticate correctly. Don't # return any data. return None # TODO: I'm not 100% convinced that a missing CQ field # always means "we don't have passwords so you're # authenticated," rather than "you didn't provide a # password so we didn't check." patrondata = PatronData() if "sipserver_internal_id" in info: patrondata.permanent_id = info["sipserver_internal_id"] if "patron_identifier" in info: patrondata.authorization_identifier = info["patron_identifier"] if "email_address" in info: patrondata.email_address = info["email_address"] if "personal_name" in info: patrondata.personal_name = info["personal_name"] if "fee_amount" in info: fines = info["fee_amount"] else: fines = "0" patrondata.fines = MoneyUtility.parse(fines) if "sipserver_patron_class" in info: patrondata.external_type = info["sipserver_patron_class"] for expire_field in [ "sipserver_patron_expiration", "polaris_patron_expiration", ]: if expire_field in info: value = info.get(expire_field) value = self.parse_date(value) if value: patrondata.authorization_expires = value break # A True value in most (but not all) subfields of the # patron_status field will prohibit the patron from borrowing # books. status = info["patron_status_parsed"] block_reason = PatronData.NO_VALUE for field in self.fields_that_deny_borrowing: if status.get(field) is True: block_reason = self.SPECIFIC_BLOCK_REASONS.get( field, PatronData.UNKNOWN_BLOCK ) if block_reason not in (PatronData.NO_VALUE, PatronData.UNKNOWN_BLOCK): # Even if there are multiple problems with this # patron's account, we can now present a specific # error message. There's no need to look through # more fields. break patrondata.block_reason = block_reason # If we can tell by looking at the SIP2 message that the # patron has excessive fines, we can use that as the reason # they're blocked. if "fee_limit" in info: fee_limit = MoneyUtility.parse(info["fee_limit"]).amount if fee_limit and patrondata.fines > fee_limit: patrondata.block_reason = PatronData.EXCESSIVE_FINES return patrondata