diff --git a/solutions/metaprogramming/json_save/json_save/saveables.py b/solutions/metaprogramming/json_save/json_save/saveables.py index 2cacf2f5..44b516fc 100644 --- a/solutions/metaprogramming/json_save/json_save/saveables.py +++ b/solutions/metaprogramming/json_save/json_save/saveables.py @@ -150,7 +150,7 @@ def to_python(val): obj_type = item["__obj_type"] obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(item) new_list.append(obj) - except TypeError: + except (TypeError, KeyError): new_list.append(item) return new_list diff --git a/students/johnn/mailroom/mailroom/audit.py b/students/johnn/mailroom/mailroom/audit.py index b9522dbf..9fd81ac8 100644 --- a/students/johnn/mailroom/mailroom/audit.py +++ b/students/johnn/mailroom/mailroom/audit.py @@ -3,6 +3,7 @@ """ import datetime +import logging def audit_log(called_function): @@ -32,6 +33,9 @@ def audit_log_inner(self, *args, **kwargs): "action": called_function.__name__, "args": args, "kwargs": kwargs}) + logging.debug("called {}, with {}, {}".format( + user, called_function.__name__, args, kwargs), + extra={ "user": security.user }) result = called_function(self, *args, **kwargs) return result return audit_log_inner diff --git a/students/johnn/mailroom/mailroom/donors.py b/students/johnn/mailroom/mailroom/donors.py index 35700ced..fea3e7e1 100755 --- a/students/johnn/mailroom/mailroom/donors.py +++ b/students/johnn/mailroom/mailroom/donors.py @@ -7,10 +7,12 @@ import uuid import pickle import os +from mailroom import security from mailroom.audit import audit_log +import json_save.json_save_meta as js -class Donors: +class Donors(js.JsonSaveable): """ Class that stores donor records @@ -25,6 +27,9 @@ class Donors: donor did. """ + _donors = js.Dict() + audit = js.List() + def __init__(self, donor=None): self.__name__ = "Donors" @@ -93,7 +98,7 @@ def match_donor(self, query_full_name): return matches -class Donor: +class Donor(js.JsonSaveable): """ Class to store a donor record @@ -171,6 +176,15 @@ class Donor: """ + created = js.String() + audit = js.List() + _did = js.String() + _first_name = js.String() + _last_name = js.String() + _middle_name = js.String() + _suffix = js.String() + _donations = js.List() + def __init__(self, did="", created="", @@ -189,7 +203,7 @@ def __init__(self, if did == "": did = str(uuid.uuid1()) # create a uuid for each record - self._did = did + self.did = did # normally, no timestamp is passed in, so we create one if created == "": @@ -239,6 +253,12 @@ def did(self): """ return the donor did """ return self._did + @did.setter + @audit_log + def did(self, value): + """ set the did """ + self._did = value + @property def donations(self): """ print all donations """ diff --git a/students/johnn/mailroom/mailroom/ui.py b/students/johnn/mailroom/mailroom/ui.py index e419e177..81136b01 100755 --- a/students/johnn/mailroom/mailroom/ui.py +++ b/students/johnn/mailroom/mailroom/ui.py @@ -7,7 +7,14 @@ import sys from mailroom import security from mailroom.donors import Donors, Donor, save_donor_file, load_donor_file +import logging +# 2018-02-11T00:04:31.921864-06:00 +log_level = logging.DEBUG +logging.basicConfig(filename='donor.log', + filemode='a', + format='%(asctime)s %(levelname)s %(module)s %(user)s %(message)s', + level=log_level) def safe_input(prompt=">"): """ Generic input routine. """ @@ -29,11 +36,13 @@ def print_lines(lines=2, dest=sys.stdout): def user_login(): """ stub for user login """ - security.user = input("Enter your username: ") + security.user = safe_input("Enter your username: ") + logging.debug("user logged in", extra={ 'user': security.user}) def user_logout(): """ stub for user logout """ + logging.debug("user logged out", extra={ 'user': security.user}) security.user = None @@ -58,6 +67,7 @@ def list_donors(donors, dest=sys.stdout): donor.total_donations, donor.number_donations, donor.average_donations), file=dest) + logging.debug("listed donors", extra={ 'user': security.user}) def get_donation_amount(donor): @@ -109,6 +119,8 @@ def create_thank_you(donor, hint="wonderful"): letter += "Tux Humboldt\n" letter += "Shark Loss Prevention Institue\n" + logging.debug("created thank you letter for {}".format(donor.full_name), + extra={ 'user': security.user}) return letter.format(donor.full_name, donor.last_name, hint)