Skip to content

Commit a9e7fb5

Browse files
committed
s3 presigned links
1 parent abcc182 commit a9e7fb5

File tree

11 files changed

+19
-533
lines changed

11 files changed

+19
-533
lines changed

.gitignore

-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
*venv*
22
__pycache__/
33
*.pyc
4-
<<<<<<< HEAD
54
.vscode
65
**/.env
76
tmp
8-
=======
9-
.vscode
10-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66

servers/tenant/blueprints/event_driven/ticket.py

+1-145
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,25 @@
44

55
from numpy import number
66
from flask import make_response, request, jsonify, Blueprint
7-
<<<<<<< HEAD
8-
=======
9-
from flask_cors import cross_origin
10-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
117

128
import sys
139

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

16-
<<<<<<< HEAD
1712
from controllers.controllerMapper import TicketController, TicketStatusController
18-
=======
19-
from controllers.controllerMapper import TicketController
20-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
2113
from models.models import TicketEvents
2214
from utils import (
2315
AlchemyEncoder,
2416
alchemyConverter,
2517
)
2618

27-
<<<<<<< HEAD
2819
# from flask_cognito_lib.decorators import auth_required
2920

3021
ticket_bp = Blueprint("ticket_bp", __name__, url_prefix="ticket")
3122

3223
ticket_controller = TicketController()
3324
ticket_status_controller = TicketStatusController()
3425
PIECES_SEPERATOR = ",+-"
35-
=======
36-
ticket_bp = Blueprint("ticket_bp", __name__, url_prefix="ticket")
37-
38-
# TODO: USER BASED AUTH
39-
40-
ticket_controller = TicketController()
41-
42-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
4326
"""
4427
Route expects requests of format:
4528
@@ -97,12 +80,7 @@ def ticket_get_all_with_status(status): # create ticket
9780

9881

9982
@ticket_bp.route("/", methods=["POST"])
100-
<<<<<<< HEAD
10183
#@auth_required()
102-
=======
103-
@cross_origin(supports_credentials=True)
104-
@require_appkey
105-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
10684
def ticket_post(): # create ticket
10785
print("Creating ticket from the following JSON:")
10886
print(request.data)
@@ -132,7 +110,6 @@ def ticket_edit(ticket_id): # create ticket
132110
ticket_dict["pieces"] = PIECES_SEPERATOR.join(ticket_dict["pieces"])
133111
ticket_event = ticket_controller._create_base_event(ticket_dict)
134112

135-
<<<<<<< HEAD
136113
response = {"ticketId": ticket_event.ticketId}
137114
return make_response(json.dumps(response))
138115

@@ -150,46 +127,19 @@ def get_clean_filters_dict(immutable_args):
150127
if "limit" in sql_filters:
151128
del sql_filters["limit"]
152129
return sql_filters
153-
=======
154-
return {"success"}
155-
156-
157-
# http://127.0.0.1:6767/api/ticket/?start=2022-01-01T00:00:00&end=2022-04-04T00:00:00&shipperName=Eric%20Shea
158-
# curl http://127.0.0.1:6767/api/ticket/?shipperName
159-
# # curl http://127.0.0.1:6767/api/ticket?key=a
160-
# # curl http://127.0.0.1:6767/api/ticket/?start=2022-01-01T00:00:00Z&end=2022-04-04T00:00:00Z
161-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
162130

163131
def corsify(resp):
164132
resp = make_response(json.dumps(resp))
165133
resp.headers['Access-Control-Allow-Origin'] = '*'
166134
resp.headers['Access-Control-Allow-Headers'] = ['Origin', 'X-Requested-With', 'Content-Type', 'Accept']
167135
return resp
168136

169-
<<<<<<< HEAD
170137
def validate_date_format(date_text):
171138
try:
172139
return datetime.strptime(date_text, "%Y-%m-%dT%H:%M:%S")
173140
except ValueError:
174141
raise ValueError("Incorrect data format, should be %Y-%m-%dT%H:%M:%S")
175142

176-
=======
177-
def get_clean_filters_dict(immutable_args):
178-
sql_filters = dict(immutable_args)
179-
if "start" in sql_filters:
180-
del sql_filters["start"]
181-
if "end" in sql_filters:
182-
del sql_filters["end"]
183-
if "limit" in sql_filters:
184-
del sql_filters["limit"]
185-
return sql_filters
186-
187-
def validate_date_format(date_text):
188-
try:
189-
return datetime.strptime(date_text, "%Y-%m-%dT%H:%M:%S")
190-
except ValueError:
191-
raise ValueError("Incorrect data format, should be %Y-%m-%dT%H:%M:%S")
192-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
193143

194144
def default_start():
195145
dt_start = validate_date_format("1900-01-01T00:00:00")
@@ -199,7 +149,6 @@ def default_end():
199149
dt_end = validate_date_format("2100-01-01T00:00:00")
200150
return dt_end
201151

202-
<<<<<<< HEAD
203152
def default_end():
204153
dt_end = validate_date_format("2100-01-01T00:00:00")
205154
return dt_end
@@ -227,45 +176,9 @@ def ticket_get_all():
227176
for ticket in res:
228177
ticket["pieces"] = ticket["pieces"].split(PIECES_SEPERATOR)
229178
ticket["ticketStatus"]["currentStatus"] = ticket["ticketStatus"]["currentStatus"].value
230-
=======
231-
@ticket_bp.route("/", methods=["GET"])
232-
@cross_origin(supports_credentials=True)
233-
# @require_appkey
234-
def ticket_get_all():
235-
filters = request.args or {}
236-
sql_filters = get_clean_filters_dict(filters)
237-
limit = 5000 if "limit" not in filters else filters["limit"]
238-
239-
dt_start = validate_date_format(filters["start"]) if "start" in filters else default_start()
240-
dt_end = validate_date_format(filters["end"]) if "end" in filters else default_end()
241-
242-
data = ticket_controller._get_latest_event_objects_in_range(dt_start, dt_end, sql_filters, number_of_res=limit)
243-
244-
res = alchemyConverter(data)
245-
246-
return corsify(res)
247-
248-
249-
@ticket_bp.route("/<ticket_id>", methods=["GET"])
250-
@cross_origin(supports_credentials=True)
251-
# @require_appkey
252-
def ticket_get(ticket_id):
253-
filters = request.args.get("filters") or {}
254-
255-
256-
sql_filters = get_clean_filters_dict(filters)
257-
sql_filters["ticketId"] = ticket_id
258-
data = ticket_controller._get_latest_event_objects_in_range(
259-
default_start(), default_end(), filters=sql_filters
260-
)
261-
262-
res = alchemyConverter(data[0])
263-
return corsify(res)
264-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
265179

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

268-
<<<<<<< HEAD
269182

270183
def get_single(ticket_id):
271184
filters = request.args.get("filters") or {}
@@ -284,38 +197,10 @@ def ticket_get(ticket_id):
284197
data = get_single(ticket_id)
285198
res = alchemyConverter(data)
286199
return make_response(json.dumps(res, cls=AlchemyEncoder))
287-
=======
288-
{
289-
"datetime" : "value",
290-
"filters" : {
291-
"field1": "value1",
292-
"field2": "value2",
293-
....
294-
}
295-
}
296-
297-
"""
298-
299-
300-
301-
# @ticket_bp.route("/attribute/{attribute_name}", methods=["GET"])
302-
# @require_appkey
303-
# def ticket_attribute_get(attribute_name):
304-
305-
# filters.extend({"ticket_id": ticket_id})
306-
307-
# latest_ticket = ticket_controller._get_latest_event_objects(
308-
# number_of_res=number_of_res, filters=filters
309-
# )
310-
311-
# res = alchemyConverter(latest_ticket)
312-
# response = json.dumps(res, cls=AlchemyEncoder)
313-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
314200

315201
# return response
316202

317-
318-
<<<<<<< HEAD
203+
"""
319204
{
320205
"datetime" : "value",
321206
"filters" : {
@@ -326,9 +211,6 @@ def ticket_get(ticket_id):
326211
}
327212
328213
"""
329-
=======
330-
331-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
332214

333215
"""
334216
Route expects requests of format:
@@ -348,29 +230,3 @@ def ticket_get(ticket_id):
348230
349231
"""
350232

351-
<<<<<<< HEAD
352-
=======
353-
354-
@ticket_bp.route("/<ticket_id>", methods=["PUT"])
355-
@cross_origin(supports_credentials=True)
356-
@require_appkey
357-
def ticket_update(ticket_id):
358-
359-
update_dict = request.form["update_dict"]
360-
361-
# remove ticketId and ticketEventId if present
362-
update_dict.pop(ticket_controller.primary_key, None)
363-
update_dict.pop(TicketEvents.non_prim_identifying_column_name, None)
364-
365-
filters = request.form["filters"]
366-
filters.extend({"ticket_id": ticket_id})
367-
368-
updated_object = ticket_controller._modify_latest_object(
369-
update_dict, filters=filters
370-
)
371-
372-
res = alchemyConverter(updated_object)
373-
response = json.dumps(res, cls=AlchemyEncoder)
374-
375-
return response
376-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66

servers/tenant/blueprints/simple/users.py

-4
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,7 @@ def user_post(): # create ticket
3232

3333

3434
@user_bp.route("", methods=["PUT"])
35-
<<<<<<< HEAD
3635
#@auth_required()
37-
=======
38-
@require_appkey
39-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
4036
def user_modify():
4137

4238
userId = request.form["userId"]

servers/tenant/celery_client.py

+17-35
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,14 @@
44
import io
55
from uuid import uuid4
66
import traceback
7-
<<<<<<< HEAD
87
import PyPDF2
98
import extraction.app as ex
109
import extraction.extract as ext
11-
=======
12-
# import tenant.controllers.DocumentController as document_controller
13-
import PyPDF2
14-
import extraction.app as ex
15-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
1610
from celery import group
1711

1812
from tenant.controllers.DocumentController import DocumentController
1913
import boto3
20-
14+
from botocore.client import Config
2115

2216
# def get_file_s3():
2317
# s3_client = boto3.client('s3')
@@ -28,12 +22,14 @@
2822
# download_url = s3_client.generate_presigned_url(
2923
# 'get_object',
3024
# Params={'Bucket': BUCKET, 'Key': OBJECT, 'ResponseContentDisposition': 'attachment'},
31-
# ExpiresIn=600)
25+
# ExpiresIn=3600)
3226

3327
# view_url = s3_client.generate_presigned_url(
3428
# 'get_object',
3529
# Params={'Bucket': BUCKET, 'Key': OBJECT},
36-
# ExpiresIn=600)
30+
# ExpiresIn=3600)
31+
32+
3733
TENANT = "test-tenant1"
3834
BUCKET = f"{TENANT}-bucket"
3935
aws_access_key_id = os.getenv("aws_access_key_id")
@@ -44,24 +40,19 @@
4440
logger = get_logger(__name__)
4541
FAILURE = -1
4642
SUCCESS = 0
47-
<<<<<<< HEAD
4843
PIECES_SEPERATOR = ",+-"
4944
UPLOAD_FOLDER = "/opt/metadata-extraction/uploads"
50-
s3 = boto3.resource('s3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
45+
s3 = boto3.resource('s3', region_name='ca-central-1', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, config=Config(signature_version='s3v4'))
5146
bucket = s3.Bucket(BUCKET)
47+
s3_client = boto3.client('s3', region_name='ca-central-1', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, config=Config(signature_version='s3v4'))
5248

5349
def fan_out(file, documentStatusId):
54-
=======
55-
UPLOAD_FOLDER = "/opt/metadata-extraction/uploads"
56-
57-
58-
def fan_out(file):
59-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
6050
folder_uuid = uuid4()
6151
with io.BytesIO(file.read()) as open_pdf_file:
6252
read_pdf = PyPDF2.PdfFileReader(open_pdf_file)
6353
num_pages = read_pdf.getNumPages()
6454
folder = f"{UPLOAD_FOLDER}/{folder_uuid}"
55+
6556
os.mkdir(folder)
6657
for i in range(num_pages):
6758
output_pdf = PyPDF2.PdfFileWriter()
@@ -71,17 +62,11 @@ def fan_out(file):
7162
os.mkdir(f_dir)
7263
with open(f"{f_dir}/{file_uuid}.pdf", "wb") as f:
7364
output_pdf.write(f)
74-
<<<<<<< HEAD
7565

7666
bucket.upload_file(f"{f_dir}/{file_uuid}.pdf", f"documents/{folder_uuid}/{file_uuid}.pdf")
7767
file.close()
7868
pdf_folders = os.listdir(folder)
7969
return group([work.s(f"{folder}/{pdf_folder}", documentStatusId) for pdf_folder in pdf_folders])
80-
=======
81-
file.close()
82-
pdf_folders = os.listdir(folder)
83-
return group([work.s(f"{folder}/{pdf_folder}") for pdf_folder in pdf_folders])
84-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
8570

8671

8772
def do_all_work(tasks_to_run):
@@ -90,13 +75,18 @@ def do_all_work(tasks_to_run):
9075

9176

9277
@client.task
93-
<<<<<<< HEAD
9478
def work(pdf_folder, documentStatusId):
9579
document_controller = DocumentController()
9680
pdf_file = f"{pdf_folder}.pdf"
81+
OBJECT = f"documents{pdf_file.replace(UPLOAD_FOLDER, '')}"
82+
view_url = s3_client.generate_presigned_url(
83+
'get_object',
84+
Params={'Bucket': BUCKET, 'Key': OBJECT},
85+
ExpiresIn=3600)
9786
try:
9887
doclist = ex.work(pdf_folder)
99-
doclist["orderS3Link"] = f"s3://{BUCKET}/documents/{pdf_file.replace(UPLOAD_FOLDER, '')}"
88+
doclist["orderS3Path"] = f"s3://{BUCKET}/{OBJECT}"
89+
doclist["orderS3Link"] = view_url
10090
doclist["pieces"] = PIECES_SEPERATOR.join(doclist["pieces"])
10191
doclist["documentStatusId"] = documentStatusId
10292
doclist["success"] = True
@@ -105,19 +95,11 @@ def work(pdf_folder, documentStatusId):
10595
logger.info(f"file {pdf_folder}/{pdf_file} error. msg: {str(e)}")
10696
logger.info(traceback.format_exc())
10797
doclist = ext.generate_doclist({})
108-
doclist["orderS3Link"] = f"s3://{BUCKET}/documents/{pdf_file.replace(UPLOAD_FOLDER, '')}"
98+
doclist["orderS3Path"] = f"s3://{BUCKET}/{OBJECT}"
99+
doclist["orderS3Link"] = view_url
109100
doclist["pieces"] = PIECES_SEPERATOR.join(doclist["pieces"])
110101
doclist["documentStatusId"] = documentStatusId
111102
doclist["success"] = False
112103
document_controller._create(doclist)
113-
=======
114-
def work(pdf_folder):
115-
pdf_file = f"{pdf_folder}.pdf"
116-
try:
117-
doclist = ex.work(pdf_folder)
118-
except Exception as e:
119-
logger.info(f"file {pdf_folder}/{pdf_file} error. msg: {str(e)}")
120-
logger.info(traceback.format_exc())
121-
>>>>>>> 32dee55d98864ba43414c8757ab4abe2e4881f66
122104
return {"status": FAILURE, "folder": pdf_folder}
123105
return {"status": SUCCESS, "folder": pdf_folder, "doclist": doclist}

0 commit comments

Comments
 (0)