diff --git a/app.py b/app.py index 9195614..d3e0b10 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,8 @@ import os from dotenv import load_dotenv +from models import db, Admin, DeliveryGuy, Courier, Client from flask import Flask, request, make_response, jsonify +from sqlalchemy import MetaData from flask_sqlalchemy import SQLAlchemy from flask_restful import Api, Resource from flask_migrate import Migrate @@ -8,12 +10,14 @@ from flask_cors import CORS + # Load environment variables load_dotenv() # Initialize Flask app app = Flask(__name__) + # Load configuration if os.getenv('FLASK_ENV') == 'production': app.config.from_object('config.ProductionConfig') @@ -28,8 +32,9 @@ app.config['DEBUG'] = os.getenv('DEBUG', 'False') == 'True' # Initialize SQLAlchemy and Migrate -db = SQLAlchemy(app) + migrate = Migrate(app, db) +db.init_app(app) # Initialize Flask-CORS CORS(app) @@ -38,74 +43,74 @@ api = Api(app) # Models -class Admin(db.Model): - __tablename__ = 'admins' - admin_id = db.Column(db.Integer, primary_key=True) - first_name = db.Column(db.String) - last_name = db.Column(db.String) - city = db.Column(db.String) - state = db.Column(db.String) - branch_code = db.Column(db.String(100)) - profile_pic = db.Column(db.String, nullable=True) - - def to_dict(self): - return { - 'admin_id': self.admin_id, - 'first_name': self.first_name, - 'last_name': self.last_name, - 'city': self.city, - 'state': self.state, - 'branch_code': self.branch_code, - 'profile_pic': self.profile_pic - } - -class DeliveryGuy(db.Model): - __tablename__ = 'delivery_guys' - delivery_guy_id = db.Column(db.Integer, primary_key=True) - first_name = db.Column(db.String, nullable=False) - second_name = db.Column(db.String, nullable=False) - address = db.Column(db.String, nullable=False) - city = db.Column(db.String, nullable=False) - state = db.Column(db.String, nullable=False) - phone_number = db.Column(db.String(15), nullable=False) - mode = db.Column(db.String, nullable=False) - live_location = db.Column(db.String, nullable=True) - profile_picture = db.Column(db.String, nullable=True) - - def to_dict(self): - return { - 'delivery_guy_id': self.delivery_guy_id, - 'first_name': self.first_name, - 'second_name': self.second_name, - 'address': self.address, - 'city': self.city, - 'state': self.state, - 'phone_number': self.phone_number, - 'mode': self.mode, - 'live_location': self.live_location, - 'profile_picture': self.profile_picture - } - -class Courier(db.Model): - __tablename__ = 'couriers' - courier_id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(80), nullable=False) - address = db.Column(db.String(120), nullable=False) - city = db.Column(db.String(50), nullable=False) - state = db.Column(db.String(50), nullable=False) - phone_number = db.Column(db.String(20), nullable=False) - email = db.Column(db.String(120), nullable=False) - - def to_dict(self): - return { - 'courier_id': self.courier_id, - 'name': self.name, - 'address': self.address, - 'city': self.city, - 'state': self.state, - 'phone_number': self.phone_number, - 'email': self.email, - } +# class Admin(db.Model): +# __tablename__ = 'admins' +# admin_id = db.Column(db.Integer, primary_key=True) +# first_name = db.Column(db.String) +# last_name = db.Column(db.String) +# city = db.Column(db.String) +# state = db.Column(db.String) +# branch_code = db.Column(db.String(100)) +# profile_pic = db.Column(db.String, nullable=True) + +# def to_dict(self): +# return { +# 'admin_id': self.admin_id, +# 'first_name': self.first_name, +# 'last_name': self.last_name, +# 'city': self.city, +# 'state': self.state, +# 'branch_code': self.branch_code, +# 'profile_pic': self.profile_pic +# } + +# class DeliveryGuy(db.Model): +# __tablename__ = 'delivery_guys' +# delivery_guy_id = db.Column(db.Integer, primary_key=True) +# first_name = db.Column(db.String, nullable=False) +# second_name = db.Column(db.String, nullable=False) +# address = db.Column(db.String, nullable=False) +# city = db.Column(db.String, nullable=False) +# state = db.Column(db.String, nullable=False) +# phone_number = db.Column(db.String(15), nullable=False) +# mode = db.Column(db.String, nullable=False) +# live_location = db.Column(db.String, nullable=True) +# profile_picture = db.Column(db.String, nullable=True) + +# def to_dict(self): +# return { +# 'delivery_guy_id': self.delivery_guy_id, +# 'first_name': self.first_name, +# 'second_name': self.second_name, +# 'address': self.address, +# 'city': self.city, +# 'state': self.state, +# 'phone_number': self.phone_number, +# 'mode': self.mode, +# 'live_location': self.live_location, +# 'profile_picture': self.profile_picture +# } + +# class Courier(db.Model): +# __tablename__ = 'couriers' +# courier_id = db.Column(db.Integer, primary_key=True) +# name = db.Column(db.String(80), nullable=False) +# address = db.Column(db.String(120), nullable=False) +# city = db.Column(db.String(50), nullable=False) +# state = db.Column(db.String(50), nullable=False) +# phone_number = db.Column(db.String(20), nullable=False) +# email = db.Column(db.String(120), nullable=False) + +# def to_dict(self): +# return { +# 'courier_id': self.courier_id, +# 'name': self.name, +# 'address': self.address, +# 'city': self.city, +# 'state': self.state, +# 'phone_number': self.phone_number, +# 'email': self.email, +# } # Resources class Admins(Resource): @@ -225,6 +230,50 @@ def delete(self, id): db.session.delete(courier) db.session.commit() return make_response({"message": "Courier deleted successfully"}, 200) + + +class Clients(Resource): + def get(self): + clients_dict_list = [client.to_dict() for client in Client.query.all()] + return make_response(clients_dict_list, 200) + + def post(self): + data = request.get_json() + new_client = Client( + first_name=data["first_name"], + last_name=data["last_name"], + city=data["city"], + state=data["state"], + address=data["address"], + email=data["email"], + phone_no=data["phone_no"], + profile_pic=data.get("profile_pic") + ) + db.session.add(new_client) + db.session.commit() + return make_response(new_client.to_dict(), 201) + + +class ClientById(Resource): + def get(self, id): + client = Client.query.get_or_404(id) + return make_response(client.to_dict(), 200) + + def patch(self, id): + client = Client.query.get_or_404(id) + data = request.get_json() + for attr, value in data.items(): + setattr(client, attr, value) + db.session.commit() + return make_response(client.to_dict(), 200) + + def delete(self, id): + client = Client.query.get_or_404(id) + db.session.delete(client) + db.session.commit() + return make_response({"message": "Client deleted successfully"}, 200) + + # Register resources api.add_resource(Admins, '/admins') @@ -233,6 +282,9 @@ def delete(self, id): api.add_resource(DeliveryGuyById, '/delivery_guys/') api.add_resource(Couriers, '/couriers') api.add_resource(CourierById, '/couriers/') +api.add_resource(Clients, '/clients') +api.add_resource(ClientById, '/clients/') + if __name__ == '__main__': app.run(port=os.getenv('FLASK_RUN_PORT', 5555), debug=app.config['DEBUG']) diff --git a/models.py b/models.py index 89ba933..728f87c 100644 --- a/models.py +++ b/models.py @@ -19,11 +19,22 @@ class Admin(db.Model, SerializerMixin): last_name = db.Column(db.String) city = db.Column(db.String) state = db.Column(db.String) - branch_code = db.Column(db.String(100)) + branch_code = db.Column(db.String(20)) profile_pic = db.Column(db.String, nullable=True) + #Relationships + delGuys= db.relationship('DeliveryGuy', back_populates="admin", cascade='all, delete-orphan') + + # add serialization rules + serialize_rules = ('-delGuys.admin',) + + deliveryGuys = association_proxy('delGuys', 'deliveryGuy') + + def __repr__(self): return f'' + + class DeliveryGuy(db.Model, SerializerMixin): __tablename__ = 'delivery_guys' delivery_guy_id = db.Column(db.Integer, primary_key=True) @@ -35,7 +46,16 @@ class DeliveryGuy(db.Model, SerializerMixin): phone_number = db.Column(db.String(20), nullable=False) mode = db.Column(db.String(50), nullable=False) # Updated length live_location = db.Column(db.String(255), nullable=True) - profile_picture = db.Column(db.String(255), nullable=True) + profile_picture = db.Column(db.String, nullable=True) + admin_id = db.Column(db.Integer, db.ForeignKey('admins.admin_id')) + + #Relationships + admin = db.relationship('Admin', back_populates="delGuys") + + # add serialization rules + serialize_rules = ('-admin.deliveryGuy',) + + def __repr__(self): return f'' @@ -60,4 +80,32 @@ def to_dict(self): 'state': self.state, 'phone_number': self.phone_number, 'email': self.email, - } \ No newline at end of file + } + + +# class ParcelStatus(db.Model, SerializerMixin): +# __tablename__ = 'parcelstatuses' +# status_id = db.Column(db.Integer, primary_key=True) +# name = db.Column(db.String) +# cancelled = db.Column(db.Boolean()) +# delivered = db.Column(db.Boolean()) +# posted = db.Column(db.Boolean()) +# en_route = db.Column(db.Boolean()) + + +class Client(db.Model, SerializerMixin): + __tablename__ = 'clients' + client_id = db.Column(db.Integer, primary_key=True) + first_name = db.Column(db.String) + last_name = db.Column(db.String) + city = db.Column(db.String) + state = db.Column(db.String) + address = db.Column(db.String) + email = db.Column(db.String) + phone_no = db.Column(db.String(10)) + profile_pic = db.Column(db.String, nullable=True) + + + def __repr__(self): + return f'' + \ No newline at end of file diff --git a/seed.py b/seed.py index a32bd10..85e2447 100644 --- a/seed.py +++ b/seed.py @@ -1,6 +1,6 @@ from datetime import date from app import app, db -from models import Admin, DeliveryGuy, Courier +from models import Admin, DeliveryGuy, Courier, Client with app.app_context(): # Drop all tables and create them again @@ -11,9 +11,27 @@ ad1 = Admin(first_name="John", last_name="Doe", city="Nairobi", state="Kenya", branch_code="57hg", profile_pic="https://media.istockphoto.com/id/1327592506/vector/default-avatar-photo-placeholder-icon-grey-profile-picture-business-man.jpg?s=1024x1024&w=is&k=20&c=er-yFBCv5wYO_curZ-MILgW0ECSjt0DDg5OlwpsAgZM=") ad2 = Admin(first_name="Jane", last_name="Doe", city="Nairobi", state="Kenya", branch_code="57hg", profile_pic="https://media.istockphoto.com/id/1327592506/vector/default-avatar-photo-placeholder-icon-grey-profile-picture-business-man.jpg?s=1024x1024&w=is&k=20&c=er-yFBCv5wYO_curZ-MILgW0ECSjt0DDg5OlwpsAgZM=") - db.session.add_all([ad1,ad2]) + db.session.add_all([ad1,ad2]) db.session.commit() + + + #Client + cli1 = Client( + first_name="Jane", + last_name="Jan", + city="Washington", + state="America", + address="5th Street", + email="cli@clientSendit.com", + phone_no="0126758937", + profile_pic="https://www.google.com/imgres?q=profile%20images&imgurl=https%3A%2F%2Fi.pinimg.com%2F236x%2F10%2Ffd%2F72%2F10fd72124736cfa1b9840c5ee543b0cf.jpg&imgrefurl=https%3A%2F%2Fid.pinterest.com%2Fstrawberryblushing%2Faesthetic-blank-profile-picture%2F&docid=U2oCIMNEFsGFzM&tbnid=8yDBrfRgez280M&vet=12ahUKEwjZ2LqMmuaHAxVzBtsEHcD-DDwQM3oFCIIBEAA..i&w=236&h=236&hcb=2&ved=2ahUKEwjZ2LqMmuaHAxVzBtsEHcD-DDwQM3oFCIIBEAA" + ) + + db.session.add_all([cli1]) + db.session.commit() + print("Database seeded successfully!") + # Create Couriers c1 = Courier( @@ -26,7 +44,6 @@ ) - print("Database seeded successfully!") c2 = Courier( name="Rapid Delivery",