Skip to content

Storage changes #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: feature/api
Choose a base branch
from
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
24 changes: 12 additions & 12 deletions servers/tenant/blueprints/event_driven/pieces.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,18 @@

"""

# TODO NOT TESTED
# @pieces_bp.route("/{piece_id}", methods=["GET"])
# @auth_required()
# def pieces_get_history(piece_id):
# filters = request.args.get("filters")
# filters.extend({"piece_id": piece_id})

@pieces_bp.route("/{piece_id}", methods=["GET"])
@auth_required()
def pieces_get_history(piece_id):
filters = request.args.get("filters")
filters.extend({"piece_id": piece_id})
# pieces = pieces_controller._get_latest_event_objects(
# page=1, number_of_res=20, filters=filters
# )

pieces = pieces_controller._get_latest_event_objects(
page=1, number_of_res=20, filters=filters
)
# res = alchemyConverter(pieces)
# response = json.dumps(res, cls=AlchemyEncoder)

res = alchemyConverter(pieces)
response = json.dumps(res, cls=AlchemyEncoder)

return response
# return response
64 changes: 52 additions & 12 deletions servers/tenant/blueprints/event_driven/ticket.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
from pprint import pprint
import json
from datetime import datetime
from wsgiref import validate

from numpy import number
from numpy import imag, number
from flask import make_response, request, jsonify, Blueprint

import sys

sys.path.insert(0, "..") # import parent folder

from controllers.controllerMapper import TicketController, TicketStatusController
from controllers.controllerMapper import (
TicketController,
TicketStatusController,
DeliveryMilestonesController,
)
from controllers.storageController import StorageController
from models.models import TicketEvents
from utils import (
AlchemyEncoder,
Expand All @@ -23,6 +29,9 @@

ticket_controller = TicketController()
ticket_status_controller = TicketStatusController()
delivery_milestone_controller = DeliveryMilestonesController()
storage_controller = StorageController()

PIECES_SEPERATOR = ",+-"
"""
Route expects requests of format:
Expand Down Expand Up @@ -62,8 +71,10 @@ def ticket_get_all_with_status(status): # create ticket

limit = 5000 if "limit" not in request.args else request.args["limit"]
ticket_sql_filters = get_clean_filters_dict(request.args)

tickets = ticket_status_controller._get_tickets_with_status(status, ticket_sql_filters, limit)

tickets = ticket_status_controller._get_tickets_with_status(
status, ticket_sql_filters, limit
)
num_tickets = ticket_status_controller._get_count(ticket_sql_filters)

res = {"tickets": alchemyConverter(tickets), "count": num_tickets}
Expand All @@ -84,13 +95,14 @@ def ticket_post(): # create ticket
# remove ticketId and ticketEventId if present
ticket_dict.pop(ticket_controller.primary_key, None)
ticket_dict.pop(TicketEvents.non_prim_identifying_column_name, None)
#join pieces into single string
ticket_dict["pieces"] = PIECES_SEPERATOR.join(ticket_dict["pieces"])
# join pieces into single string
ticket_dict["pieces"] = PIECES_SEPERATOR.join(ticket_dict["pieces"])
ticket_event = ticket_controller._create_base_event(ticket_dict)

response = {"ticketId": ticket_event.ticketId}
return make_response(json.dumps(response))


# TODO fix primary key issue, ticketeventID needs to be unique for edits
@ticket_bp.route("/<ticket_id>", methods=["POST"])
@auth_required()
Expand All @@ -102,18 +114,20 @@ def ticket_edit(ticket_id): # create ticket
ticket_dict["ticketId"] = ticket_id
# remove ticketId and ticketEventId if present
ticket_dict.pop(ticket_controller.primary_key, None)
#join pieces into single string
ticket_dict["pieces"] = PIECES_SEPERATOR.join(ticket_dict["pieces"])
# join pieces into single string
ticket_dict["pieces"] = PIECES_SEPERATOR.join(ticket_dict["pieces"])
ticket_event = ticket_controller._create_base_event(ticket_dict)

response = {"ticketId": ticket_event.ticketId}
return make_response(json.dumps(response))


# http://127.0.0.1:6767/api/ticket/?start=2022-01-01T00:00:00&end=2022-04-04T00:00:00&shipperName=Eric%20Shea
# curl http://127.0.0.1:6767/api/ticket/?shipperName
# # curl http://127.0.0.1:6767/api/ticket?key=a
# # curl http://127.0.0.1:6767/api/ticket/?start=2022-01-01T00:00:00Z&end=2022-04-04T00:00:00Z


def get_clean_filters_dict(immutable_args):
sql_filters = dict(immutable_args)
if "start" in sql_filters:
Expand Down Expand Up @@ -163,7 +177,9 @@ def ticket_get_all():
res = alchemyConverter(data)
for ticket in res:
ticket["pieces"] = ticket["pieces"].split(PIECES_SEPERATOR)
ticket["ticketStatus"]["currentStatus"] = ticket["ticketStatus"]["currentStatus"].value
ticket["ticketStatus"]["currentStatus"] = ticket["ticketStatus"][
"currentStatus"
].value

return make_response(json.dumps(res, cls=AlchemyEncoder))

Expand All @@ -177,18 +193,43 @@ def get_single(ticket_id):
default_start(), default_end(), filters=sql_filters
)

logger.info("DATA", str(data))
# logger.info("DATA", str(data))

return data[0] if isinstance(data, list) else data


@ticket_bp.route("/<ticket_id>", methods=["GET"])
@auth_required()
# @auth_required()
def ticket_get(ticket_id):
data = get_single(ticket_id)

res = alchemyConverter(data)
# print(res)
res = convert_ticket_with_presigned(res)

return make_response(json.dumps(res, cls=AlchemyEncoder))


def convert_ticket_with_presigned(ticket: str):
ticket_id = ticket["ticketId"]
deliv_ms = delivery_milestone_controller._get(filters={"ticketId": ticket_id})[0]

deliv_ms = alchemyConverter(deliv_ms)
# print(deliv_ms)

image_links = {}
for k in deliv_ms:
if "Link" in k:
presinged_link = storage_controller.generate_presigned_url(deliv_ms[k])
print(k, presinged_link)
if presinged_link:
image_links[k] = presinged_link

ticket.update(image_links)

return ticket


"""
Route expects requests of format:

Expand Down Expand Up @@ -220,4 +261,3 @@ def ticket_get(ticket_id):
}

"""

80 changes: 80 additions & 0 deletions servers/tenant/blueprints/simple/blob_storage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
from flask_cognito_lib.decorators import auth_required
from flask import (
Blueprint,
flash,
request,
redirect,
request,
redirect,
jsonify,
send_file,
)
import urllib.request
import os
from werkzeug.utils import secure_filename
import sys

sys.path.insert(0, "..") # import parent folder

from controllers.storageController import StorageController, FileTypes

blob_storage_bp = Blueprint("blob_storage_bp", __name__, url_prefix="blob_storage")
storage_controller = StorageController()

UPLOAD_FOLDER = "/uploads"
ALLOWED_EXTENSIONS = {"txt", "pdf", "png", "jpg", "jpeg", "gif"}


def allowed_file(filename):
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS


@blob_storage_bp.route("/", methods=["POST"])
# @auth_required()
def file_upload():

if "upload[file]" not in request.files:
res = jsonify({"message": "No file found in request"})
res.status_code = 500
return res
file = request.files["upload[file]"]
if file.filename == "":
res = jsonify({"message": "No image selected for uploading"})
res.status_code = 500
return res
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
# file.save(os.path.join(UPLOAD_FOLDER, filename))
file.save(filename)

s3_path = storage_controller.upload_file(local_file=filename)
if not s3_path:
res = jsonify({"message": "Unable to upload file to S3"})
res.status_code = 500
return res

return s3_path
else:
res = jsonify({"message": "No file found in request"})
res.status_code = 500
return res


# @blob_storage_bp.route("/", methods=["GET"])
# # @auth_required()
# def generate_presigned_url():

# if "uploaded_file_name" not in request.args:
# res = jsonify({"message": 'Missing uploaded file name "uploaded_file_name"'})
# res.status_code = 500
# return res

# uploaded_file_name = request.args.get("uploaded_file_name")
# local_path = storage_controller.download_file(uploaded_file_name)

# if local_path is None:
# res = jsonify({"message": f'Uploaded file: "{uploaded_file_name}", not found.'})
# res.status_code = 404
# return res

# return send_file(local_path)
57 changes: 33 additions & 24 deletions servers/tenant/blueprints/simple/milestones.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,12 @@
DeliveryMilestones: DeliveryMilestonesController(),
}

old_status_exemptions = set([DeliveryMilestones, IncompleteDeliveryMilestones, CreationMilestones])
new_status_exemptions = set([DeliveryMilestones, IncompleteDeliveryMilestones, CreationMilestones])
old_status_exemptions = set(
[DeliveryMilestones, IncompleteDeliveryMilestones, CreationMilestones]
)
new_status_exemptions = set(
[DeliveryMilestones, IncompleteDeliveryMilestones, CreationMilestones]
)

ticket_status_controller = TicketStatusController()

Expand All @@ -50,9 +54,7 @@
@auth_required()
def milestone_get(ticket_id): # create ticket

filters = {
"ticketId" : ticket_id
}
filters = {"ticketId": ticket_id}
all_milestones = []
for cls, milestone_controller in class_to_cntrl_map.items():
data = milestone_controller._get(filters, 1000)
Expand All @@ -65,7 +67,6 @@ def milestone_get(ticket_id): # create ticket
string_milestones = milestone_controller.convert_to_desc(milestones)
all_milestones.extend(string_milestones)


return make_response(json.dumps(all_milestones, cls=AlchemyEncoder))


Expand All @@ -74,33 +75,33 @@ def milestone_get(ticket_id): # create ticket
def milestone_post(milestone_type): # create ticket
milestone_class = getattr(sys.modules[__name__], milestone_type)
milestone_controller = class_to_cntrl_map[milestone_class]

request_dict = json.loads(request.data)
request_dict = request_dict["data"]

if "ticketId" not in request_dict:
message = 'ticketId is required'
message = "ticketId is required"
print(message)
res = jsonify({'message': message})
res = jsonify({"message": message})
res.status_code = 400
return res

# status checking
if milestone_class in old_status_exemptions:
# status checking
if milestone_class in old_status_exemptions:
request_dict["oldStatus"] = str(milestone_class.oldStatus.default).split("'")[1]
else:
if "oldStatus" not in request_dict:
message = 'oldStatus is required'
message = "oldStatus is required"
print(message)
res = jsonify({'message': message})
res = jsonify({"message": message})
res.status_code = 400
return res
if milestone_class in new_status_exemptions:
request_dict["newStatus"] = str(milestone_class.oldStatus.default).split("'")[1]
else:
if "newStatus" not in request_dict:
message = 'newStatus is required'
if "newStatus" not in request_dict:
message = "newStatus is required"
print(message)
res = jsonify({'message': message})
res = jsonify({"message": message})
res.status_code = 400
return res

Expand All @@ -110,19 +111,27 @@ def milestone_post(milestone_type): # create ticket

# ticketId = request_dict["ticketId"]
update_dict = {"currentStatus": request_dict["newStatus"]}
if milestone_class == AssignmentMilestones and request_dict["newStatus"] == Generic_Milestone_Status.assigned.value:
if (
milestone_class == AssignmentMilestones
and request_dict["newStatus"] == Generic_Milestone_Status.assigned.value
):
update_dict["assignedTo"] = request_dict["assignedToUserId"]

if milestone_class == PickupMilestones:
if request_dict["newStatus"] == Generic_Milestone_Status.requested_pickup.value:
if request_dict["newStatus"] == Generic_Milestone_Status.requested_pickup.value:
update_dict["requesterUserId"] = request_dict["assignedToassignedToUserId"]
if request_dict["newStatus"] == Generic_Milestone_Status.declined_pickup.value:
if request_dict["newStatus"] == Generic_Milestone_Status.declined_pickup.value:
update_dict["requesterUserId"] = None

if milestone_class == IncompleteDeliveryMilestones or milestone_class == DeliveryMilestones:
if (
milestone_class == IncompleteDeliveryMilestones
or milestone_class == DeliveryMilestones
):
update_dict["requesterUserId"] = None

ticket_status_controller._modify({"ticketId": request_dict["ticketId"]}, update_dict)

ticket_status_controller._modify(
{"ticketId": request_dict["ticketId"]}, update_dict
)
milestone_controller._create(request_dict)

return make_response("success")
5 changes: 5 additions & 0 deletions servers/tenant/blueprints/simple/test.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<form action="/action_page.php">
<label for="img">Select image:</label>
<input type="file" id="img" name="img" accept="image/*">
<input type="submit">
</form>
1 change: 0 additions & 1 deletion servers/tenant/controllers/controllerMapper.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from statistics import mode

from regex import D
from controllers.baseController import (
BaseController,
BaseTimeSeriesController,
Expand Down
Loading