Skip to content
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

Release 12 Jan 2024 v3 #74

Merged
merged 1 commit into from
Jan 12, 2024
Merged
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
10 changes: 10 additions & 0 deletions api/models/call_log_event.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
from api.mixins import TimestampMixin
from api import db
from flask_sqlalchemy.query import Query as BaseQuery


class CallLogEventQuery(BaseQuery):
def call_sid_exist(self, form_data):
return (
self.filter(CallLogEvent.call_sid == form_data["CallSid"]).first()
is not None
)


class CallLogEvent(TimestampMixin, db.Model):
query_class = CallLogEventQuery
__tablename__ = "call_log_event"
id = db.Column(db.Integer, primary_key=True)
call_sid = db.Column(db.String(255))
Expand Down
1 change: 1 addition & 0 deletions api/models/registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class Registration(TimestampMixin, db.Model):
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
partner_id = db.Column(db.Integer, db.ForeignKey("partner.id"))
program_id = db.Column(db.Integer, db.ForeignKey("program.id"))
language_id = db.Column(db.Integer)
district = db.Column(db.String(100), nullable=True)
state = db.Column(db.String(100), nullable=True)
parent_type = db.Column(db.String(100), nullable=True)
Expand Down
12 changes: 12 additions & 0 deletions api/models/system_phone.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
from api.mixins import TimestampMixin
from api import db
from flask_sqlalchemy.query import Query as BaseQuery


class SystemPhoneQuery(BaseQuery):
def system_phone_exists(self, url_decoded_system_phone):
return (
self.filter(
SystemPhone.phone.contains(url_decoded_system_phone[-10:])
).first()
is not None
)


class SystemPhone(TimestampMixin, db.Model):
query_class = SystemPhoneQuery
__tablename__ = "system_phone"
id = db.Column(db.Integer, primary_key=True)
phone = db.Column(db.String(50))
Expand Down
2 changes: 1 addition & 1 deletion api/models/user.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from api.mixins import TimestampMixin
from api import db
from flask_sqlalchemy import BaseQuery
from flask_sqlalchemy.query import Query as BaseQuery


class UserQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/user_program.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from api.mixins import TimestampMixin
from api import db
from api import app, models, helpers
from flask_sqlalchemy import BaseQuery
from flask_sqlalchemy.query import Query as BaseQuery
from api.helpers.common_helper import current_ist_time


Expand Down
3 changes: 1 addition & 2 deletions api/services/call_log_event_service.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# This file is treated as service layer
from flask import request
from api import helpers, models, db
from api import helpers, models
from datetime import datetime
from utils.loggingutils import logger
import traceback
Expand Down
13 changes: 5 additions & 8 deletions api/services/handle_event_service.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import requests
from flask import request
from api import models, db, app
from api import models, app
from . import user_service as user
from . import registration_service as registration
from . import call_log_event_service as call_log_event
Expand All @@ -10,18 +9,16 @@

class HandleEventService:
def handle_event_service(self, form_data):
call_sid_exist = db.session.query(
db.exists().where(models.CallLogEvent.call_sid == form_data["CallSid"])
).scalar()
call_sid_exist = models.CallLogEvent.query.call_sid_exist(form_data)

if call_sid_exist:
return

url_decoded_system_phone = requests.utils.unquote(form_data["To"])

system_phone_exists = db.session.query(
db.exists().where(models.SystemPhone.phone == url_decoded_system_phone)
).scalar()
system_phone_exists = models.SystemPhone.query.system_phone_exists(
url_decoded_system_phone
)

if not system_phone_exists:
return
Expand Down
1 change: 0 additions & 1 deletion config.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
% POSTGRES
)

SQLALCHEMY_TRACK_MODIFICATIONS = True
WTF_CSRF_ENABLED = True
SECRET_KEY = os.environ.get("SECRET_KEY")

Expand Down
73 changes: 36 additions & 37 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,52 +1,52 @@
# from pprint import pprint
from api import models, db, services
from flask import jsonify, request
from api import app, services, helpers
from flask import jsonify
import json
from utils.loggingutils import logger


def callback(request):
json_data = None
form_data = None
with app.app_context():
json_data = None
form_data = None

if request.method == "POST":
content_type = request.headers.get("Content-Type")
if request.method == "POST":
content_type = request.headers.get("Content-Type")

if content_type == "application/json":
json_data = request.get_json()
else:
form_data = request.form
if content_type == "application/json":
json_data = request.get_json()
else:
form_data = request.form

transaction_log_service = services.TransactionLogService()
transaction_log_service = services.TransactionLogService()

try:
if json_data and json_data.get("type", None) == "retry_failed_log":
retry_failed_webhook(transaction_log_service)
return "Success"
try:
if json_data and json_data.get("type", None) == "retry_failed_log":
retry_failed_webhook(transaction_log_service)
return "Success"

ivr_transaction_log = (
transaction_log_service.create_new_ivr_transaction_log(form_data)
)
except Exception as e:
logger.error(
f"Issues with transaction logs creation for form data {form_data}. Error message: {e}"
)
ivr_transaction_log = (
transaction_log_service.create_new_ivr_transaction_log(form_data)
)
except Exception as e:
logger.error(
f"Issues with transaction logs creation for form data {form_data}. Error message: {e}"
)

processed = process_form_data(form_data)
processed = process_form_data(form_data)

if not processed:
return jsonify(message="Something went wrong!"), 400
if not processed:
return jsonify(message="Something went wrong!"), 400

transaction_log_service.mark_ivr_transaction_log_as_processed(
ivr_transaction_log
)
else:
return (
jsonify(message="Currently, the system do not accept a GET request"),
405,
)
transaction_log_service.mark_ivr_transaction_log_as_processed(
ivr_transaction_log
)
else:
return (
jsonify(message="Currently, the system do not accept a GET request"),
405,
)

return "Success"
return "Success"


def retry_failed_webhook(transaction_log_service):
Expand All @@ -57,8 +57,7 @@ def retry_failed_webhook(transaction_log_service):
payload["log_created_on"] = log.created_on
log.processed = process_form_data(payload)
log.attempts += 1
db.session.add(log)
db.session.commit()
helpers.save(log)


def process_form_data(form_data):
Expand Down
2 changes: 1 addition & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Includes dev dependencies on top of requirements.txt
-r requirements.txt
functions-framework==2.1.2
functions-framework==3.5.0
pre-commit==2.11.0
23 changes: 12 additions & 11 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
certifi==2020.12.5
chardet==4.0.0
click==7.1.2
Flask==1.1.2
requests==2.25.1
click==8.1.3
Flask==3.0.0
python-dotenv==0.15.0
Flask-SQLAlchemy==2.1
Flask-SQLAlchemy==3.1.1
functions-framework==3.5.0
idna==2.10
itsdangerous==1.1.0
Jinja2==2.11.3
MarkupSafe==1.1.1
psycopg2==2.8.6
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
psycopg2==2.9.9
python-dotenv==0.15.0
requests==2.25.1
SQLAlchemy==1.3.23
requests==2.31.0
SQLAlchemy==2.0.23
urllib3==1.26.3
Werkzeug==1.0.1
Werkzeug==3.0.0
watchdog==3.0.0
google-cloud-logging==3.5.0
Loading