diff --git a/src/07_mongoengine/service_central/nosql/car.py b/src/07_mongoengine/service_central/nosql/car.py index e8120e0..886b78b 100644 --- a/src/07_mongoengine/service_central/nosql/car.py +++ b/src/07_mongoengine/service_central/nosql/car.py @@ -2,6 +2,7 @@ import uuid import mongoengine from nosql.engine import Engine +from nosql.servicehistory import ServiceHistory class Car(mongoengine.Document): @@ -12,7 +13,8 @@ class Car(mongoengine.Document): vi_number = mongoengine.StringField( default=lambda: str(uuid.uuid4()).replace('-', '')) - engine = mongoengine.EmbeddedDocumentField(Engine, required=True) + engine = mongoengine.EmbeddedDocumentField(Engine) + service_history = mongoengine.EmbeddedDocumentListField(ServiceHistory) meta = { 'db_alias': 'core', diff --git a/src/07_mongoengine/service_central/nosql/servicehistory.py b/src/07_mongoengine/service_central/nosql/servicehistory.py new file mode 100644 index 0000000..5cc41f2 --- /dev/null +++ b/src/07_mongoengine/service_central/nosql/servicehistory.py @@ -0,0 +1,10 @@ +import mongoengine +import datetime + + +class ServiceHistory(mongoengine.EmbeddedDocument): + date = mongoengine.DateTimeField(default=datetime.datetime.now) + description = mongoengine.StringField() + price = mongoengine.FloatField() + customer_rating = mongoengine.IntField(min_value=1, max_value=5) + diff --git a/src/07_mongoengine/service_central/service_app.py b/src/07_mongoengine/service_central/service_app.py index 52b3f8c..3454956 100644 --- a/src/07_mongoengine/service_central/service_app.py +++ b/src/07_mongoengine/service_central/service_app.py @@ -1,14 +1,23 @@ import nosql.mongo_setup as mongo_setup from nosql.car import Car from nosql.engine import Engine +from nosql.servicehistory import ServiceHistory def main(): print_header() config_mongo() + # update_doc_versions() user_loop() +# noinspection PyProtectedMember +# def update_doc_versions(): +# for car in Car.objects(): +# car._mark_as_changed('vi_number') +# car.save() + + def print_header(): print('----------------------------------------------') print('| |') @@ -28,7 +37,7 @@ def user_loop(): print("Available actions:") print(" * [a]dd car") print(" * [l]ist cars") - print(" * [f]ind car") + print(" * [p]oorly serviced") print(" * perform [s]ervice") print(" * e[x]it") print() @@ -37,10 +46,10 @@ def user_loop(): add_car() elif ch == 'l': list_cars() - elif ch == 'f': - find_car() elif ch == 's': service_car() + elif ch == 'p': + show_poorly_serviced_cars() elif not ch or ch == 'x': print("Goodbye") break @@ -48,7 +57,7 @@ def user_loop(): def add_car(): model = input("What is the model? ") - make = 'Ferrari' # input("What is the make? ") + make = 'Ferrari' # input("What is the make? ") year = int(input("Year built? ")) car = Car() @@ -67,7 +76,14 @@ def add_car(): def list_cars(): - print("TODO: list_cars") + cars = Car.objects().order_by("-year") + for car in cars: + print("{} -- {} with vin {} (year {})".format( + car.make, car.model, car.vi_number, car.year)) + print("{} of service records".format(len(car.service_history))) + for s in car.service_history: + print(" * ${:,.0f} {}".format(s.price, s.description)) + print() def find_car(): @@ -75,7 +91,44 @@ def find_car(): def service_car(): - print("TODO: service_car") + # vin = input("What is the VIN of the car to service? ") + # car = Car.objects(vi_number=vin).first() + # if not car: + # print("Car with VIN {} not found!".format(vin)) + # return + # + # service = ServiceHistory() + # service.price = float(input("What is the price? ")) + # service.description = input("What type of service is this? ") + # service.customer_rating = int(input("How happy is our customer? [1-5] ")) + # + # car.service_history.append(service) + # car.save() + + vin = input("What is the VIN of the car to service? ") + service = ServiceHistory() + service.price = float(input("What is the price? ")) + service.description = input("What type of service is this? ") + service.customer_rating = int(input("How happy is our customer? [1-5] ")) + + updated = Car.objects(vi_number=vin).update_one(push__service_history=service) + if updated == 0: + print("Car with VIN {} not found!".format(vin)) + return + + +def show_poorly_serviced_cars(): + level = int(input("What max level of satisfaction are we looking for? [1-5] ")) + # { "service_history.customer_rating": {$lte: level} } + cars = Car.objects(service_history__customer_rating__lte=level) + for car in cars: + print("{} -- {} with vin {} (year {})".format( + car.make, car.model, car.vi_number, car.year)) + print("{} of service records".format(len(car.service_history))) + for s in car.service_history: + print(" * Satisfaction: {} ${:,.0f} {}".format( + s.customer_rating, s.price, s.description)) + print() if __name__ == '__main__':