Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 121 additions & 69 deletions app.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
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
from werkzeug.exceptions import NotFound
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')
Expand All @@ -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)
Expand All @@ -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):
Expand Down Expand Up @@ -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')
Expand All @@ -233,6 +282,9 @@ def delete(self, id):
api.add_resource(DeliveryGuyById, '/delivery_guys/<int:id>')
api.add_resource(Couriers, '/couriers')
api.add_resource(CourierById, '/couriers/<int:id>')
api.add_resource(Clients, '/clients')
api.add_resource(ClientById, '/clients/<int:id>')


if __name__ == '__main__':
app.run(port=os.getenv('FLASK_RUN_PORT', 5555), debug=app.config['DEBUG'])
54 changes: 51 additions & 3 deletions models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'<Admin {self.first_name}, city {self.city}>'


class DeliveryGuy(db.Model, SerializerMixin):
__tablename__ = 'delivery_guys'
delivery_guy_id = db.Column(db.Integer, primary_key=True)
Expand All @@ -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'<DeliveryGuy {self.first_name} {self.second_name}, city {self.city}>'
Expand All @@ -60,4 +80,32 @@ def to_dict(self):
'state': self.state,
'phone_number': self.phone_number,
'email': self.email,
}
}


# 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'<Client {self.first_name}, city {self.city}>'

23 changes: 20 additions & 3 deletions seed.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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(
Expand All @@ -26,7 +44,6 @@
)


print("Database seeded successfully!")

c2 = Courier(
name="Rapid Delivery",
Expand Down