publicpythonsnippets/pythonbookdef.py

210 lines
8.3 KiB
Python
Raw Normal View History

2023-11-22 14:51:39 -06:00
import requests
import datetime
from tabulate import tabulate
import boto3
import json
from json import JSONEncoder
class libaccount(dict):
2023-11-22 11:18:17 -06:00
def __init__(self,name,barcode,pin):
2023-11-22 14:51:39 -06:00
dict.__init__(self,name=name, barcode=barcode, pin=pin)
2023-11-22 11:18:17 -06:00
self.name=name
self.barcode=barcode
self.pin=pin
2023-11-22 14:51:39 -06:00
def toJson(self):
return json.dumps(self,default=lambda o: o.__dict__)
2023-11-22 11:18:17 -06:00
class book():
def __init__(self,itemid,renewalcount,checkoutdate,duedate,vendor,resourceid,resourceinstanceid,title,materialtype,coverurl,person,authsession,renewresult,overdue):
self.id=itemid
self.renewalcount=renewalcount
self.checkoutdate=checkoutdate
self.duedate=duedate
self.vendor=vendor
self.resourceid=resourceid
self.resourceinstanceid=resourceinstanceid
self.title=title
self.materialtype=materialtype
self.coverurl=coverurl
self.person=person
self.authsession=authsession
self.renewresult=renewresult
self.overdue=overdue
#self.ill=ill
def print(self):
print(self.person, self.id, self.title, self.checkoutdate, self.renewalcount, self.duedate, self.materialtype,self.renewresult)
def renew(self):
print("Renewing Book",self.title)
renewuri='https://na2.iiivega.com/api/search-result/patrons/me/checkouts/' + self.id + '/renew'
try:
renewresult = self.authsession.post(renewuri).json()
if renewresult.get('message'):
self.renewresult=renewresult['message']
else:
self.renewalcount=renewresult['renewalCount']
self.duedate=renewresult['dueDate']
self.renewresult="Successfully Renewed"
except requests.exceptions.RequestException as e: # This is the correct syntax
print(e.json())
finally:
pass
2023-11-22 14:51:39 -06:00
#print(renewresult.json())
2023-11-22 11:18:17 -06:00
def sendemail(body,subject):
print("Sending Email")
boto3.setup_default_session(profile_name='hamik')
sesclient=boto3.client('ses',region_name="us-east-2")
CHARSET="UTF-8"
response = sesclient.send_email(
Destination={
"ToAddresses":["dan@hamik.net"]
},
Message= {
"Body": {
"Html": {
"Charset": CHARSET,
"Data": body
}
},
"Subject": {
"Charset": CHARSET,
"Data": subject
},
},
Source='librarynotices@hamik.net'
)
2023-11-22 14:51:39 -06:00
upcomingdays=5
autorenewaldays=3
alwayssendemail=False
returndata=False
recipients=['dan@hamik.net','allisonmhamik@gmail.com','danalli@hamik.net']
uri = "https://auth.na2.iiivega.com/auth/realms/sioux/protocol/openid-connect/token"
checkoutsuri='https://sioux.na2.iiivega.com/api/search-result/patrons/me/checkouts'
with open('libaccounts.json') as accountfile:
accountsjson= json.load(accountfile)
accounts=[]
for account in accountsjson:
accounts.append(
libaccount(
accountsjson[account]['name'],
str(accountsjson[account]['barcode']),
str(accountsjson[account]['pin']))
)
2023-11-22 11:18:17 -06:00
allbooks=[]
mediatypes=[]
for myaccount in accounts:
2023-11-22 14:51:39 -06:00
account=myaccount
2023-11-22 11:18:17 -06:00
print(account.name)
# Create a session
session = requests.Session()
authbody = {
'username':account.barcode,
'password':account.pin,
'client_id':'convergence',
'grant_type':'password',
}
resp=session.post(uri,authbody).json()
authtoken=resp['access_token']
tokentype=resp['token_type']
sessionstate=resp['session_state']
session.headers.update({
'iii-customer-domain':'sioux.na2.iiivega.com',
'Origin':'https://sioux.na2.iiivega.com/',
'Referrer':'https://sioux.na2.iiivega.com/',
'access_token':authtoken,
'Authorization':'Bearer ' + authtoken,
'token_type': tokentype,
'session_state': sessionstate,
'api-version':'1',
'DNT':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
} )
outs = session.get(checkoutsuri)
if len(outs.json()) >=1:
for mybook in outs.json():
if mybook['vendor']=='overdrive':
continue
duedate = datetime.datetime.strptime(mybook['dueDate'].split('T')[0],'%Y-%m-%d').date()
if datetime.date.today() > duedate:
overdue=True
else:
overdue = False
thisbook = book(
mybook['id'],
mybook['renewalCount'],
datetime.datetime.strptime(mybook['checkOutDate'].split('T')[0],'%Y-%m-%d').date(),
duedate,
mybook['vendor'],
mybook['resource']['id'],
mybook['resource']['instanceId'],
mybook['resource']['title'],
mybook['resource']['materialType'],
mybook['resource']['coverUrl']['small'],
account.name,
session,
'None',
overdue
)
if thisbook.materialtype in mediatypes:
pass
else:
mediatypes.append(thisbook.materialtype)
allbooks.append(thisbook)
for book in allbooks:
#print(datetime.date.today(),book.duedate)
if datetime.date.today() > book.duedate:
book.renew()
2023-11-22 14:51:39 -06:00
#sendemail()
tablestart="""
<!DOCTYPE html PUBLIC "-=//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml">
<head> </head>
<body>
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style><table>"""
tableend="</table> </body></html>"
htmltable="Last Updated" + str(datetime.datetime.now())
htmltable+='<br>Click <a href="https://librarynotice.hamik.net">Here</a> to be able to refresh the list.'
htmltable += """<form action="https://librarynotice.hamik.net/refresh.php">
<input type="submit" value="Refresh Items">
</form>
"""
#print(htmltable)
td="</td><td>"
th="</th><th>"
duesoon = [d for d in allbooks if d.duedate < datetime.date.today() + datetime.timedelta(days=10)]
2023-11-22 11:18:17 -06:00
if len(duesoon) >=1:
#print(htmltable)
htmltable += tablestart + "<colgroup><col/><col/></colgroup><tr><th>Name"+th+"Count</th></tr>"
for type in mediatypes:
typecount = sum(b.materialtype == type for b in duesoon)
htmltable += "<tr><td>" + type + td + str(typecount) + "</td></tr>"
2023-11-22 14:51:39 -06:00
htmltable += tableend + "<br>" + tablestart + "<colgroup><col/><col/><col/><col/><col/><col/><col/><col/></colgroup><tr><th>Name"+th+"Type"+th+"Times Renewed"+th+"Checked Out"+th+"Due Date"+th+"Renewal Status" + th + "Title"+ th + "Thumbnail</th></tr>"
2023-11-22 11:18:17 -06:00
for item in duesoon:
htmltable +="<tr>" + td + item.person + td + item.materialtype + td + str(item.renewalcount) + td + str(item.checkoutdate) + td + str(item.duedate) + td + item.renewresult+ td + item.title + td + '<img src="'+ item.coverurl+'">' +"</td></tr>\n"
2023-11-22 14:51:39 -06:00
htmltable += tableend
2023-11-22 11:18:17 -06:00
htmltable += "<br>"
htmltable += tablestart + "<colgroup><col/><col/></colgroup><tr><th>Name"+th+"Count</th></tr>"
for type in mediatypes:
typecount = sum(b.materialtype == type for b in allbooks)
htmltable += "<tr><td>" + type + td + str(typecount) + "</td></tr>"
2023-11-22 14:51:39 -06:00
htmltable += tableend + "<br>"
2023-11-22 11:18:17 -06:00
htmltable += tablestart + "<colgroup><col/><col/><col/><col/><col/><col/><col/></colgroup><tr><th>Name"+th+"Type"+th+"Times Renewed"+th+"Checked Out"+th+"Due Date"+th+"Title" + th + "Thumbnail</th></tr>"
for item in allbooks:
htmltable += "<TR>"+td + item.person + td + item.materialtype + td + str(item.renewalcount) + td + str(item.checkoutdate) + td + str(item.duedate) + td + item.title + td + '<img src="'+ item.coverurl+'">' +"</td></tr>\n"
2023-11-22 14:51:39 -06:00
htmltable += tableend
2023-11-22 11:18:17 -06:00
with open("out.html","w",encoding='utf-8') as outhtml:
outhtml.write(htmltable)
2023-11-22 14:51:39 -06:00
sendemail(htmltable,"Library books due in the next " + str(upcomingdays) + " days " + str(datetime.date.today()))
#for item in duesoon:
# item.print()