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 #467

Merged
merged 14 commits into from
Jan 12, 2024
2 changes: 1 addition & 1 deletion api/helpers/db_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def get_class_by_tablename(tablename):
:param tablename: String with name of table.
:return: Class reference or None.
"""
for classObject in db.Model._decl_class_registry.values():
for classObject in db.Model.registry._class_registry.values():
if (
hasattr(classObject, "__tablename__")
and classObject.__tablename__ == tablename
Expand Down
2 changes: 1 addition & 1 deletion api/models/call_log.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 CallLogQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/contact_fields_mapping.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from api import db
from flask_sqlalchemy import BaseQuery
from flask_sqlalchemy.query import Query as BaseQuery
from utils.loggingutils import logger


Expand Down
2 changes: 1 addition & 1 deletion api/models/content.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 ContentQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/content_version.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 ContentVersionQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/ivr_prompt.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 sqlalchemy import desc, and_, func
from flask_sqlalchemy import BaseQuery
from flask_sqlalchemy.query import Query as BaseQuery


class IvrPromptQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/ivr_prompt_mapping.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 IvrPromptMappingQuery(BaseQuery):
Expand Down
5 changes: 4 additions & 1 deletion api/models/ivr_prompt_response.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from api.mixins import TimestampMixin
from api import db
from flask_sqlalchemy import BaseQuery
from flask_sqlalchemy.query import Query as BaseQuery


class IvrPromptResponseQuery(BaseQuery):
def get_by_call_log_id(self, call_log_id):
return self.filter(IvrPromptResponse.call_log_id == call_log_id).all()

def get_latest_prompt(self):
return self.filter().order_by(IvrPromptResponse.id.desc()).first()


class IvrPromptResponse(TimestampMixin, db.Model):
query_class = IvrPromptResponseQuery
Expand Down
2 changes: 1 addition & 1 deletion api/models/language.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 LanguageQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/module_content.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 ModuleContentQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/partner_system_phone.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 PartnerSystemPhoneQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/program_module.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 ProgramModuleQuery(BaseQuery):
Expand Down
2 changes: 1 addition & 1 deletion api/models/program_sequence.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 ProgramSequenceQuery(BaseQuery):
Expand Down
5 changes: 4 additions & 1 deletion api/models/registration.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 RegistrationQuery(BaseQuery):
Expand All @@ -24,6 +24,9 @@ def get_latest_by_phone(self, phone):
.first()
)

def get_latest_record(self):
return self.filter().order_by(Registration.id.desc()).first()


class Registration(TimestampMixin, db.Model):
query_class = RegistrationQuery
Expand Down
2 changes: 1 addition & 1 deletion api/models/system_phone.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 SystemPhoneQuery(BaseQuery):
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_custom_fields.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
from sqlalchemy import and_


Expand Down
2 changes: 1 addition & 1 deletion api/models/user_group.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
from sqlalchemy import desc, and_


Expand Down
2 changes: 1 addition & 1 deletion api/models/user_program.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from api.mixins import TimestampMixin
from api import db, app
from flask_sqlalchemy import BaseQuery
from flask_sqlalchemy.query import Query as BaseQuery
from api.helpers import common_helper, db_helper
from utils.loggingutils import logger

Expand Down
5 changes: 4 additions & 1 deletion api/models/webhook_transaction_log.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 WebhookTransactionLogQuery(BaseQuery):
Expand All @@ -9,6 +9,9 @@ def get_by_id(self, webhook_transaction_log_id):
WebhookTransactionLog.id == webhook_transaction_log_id
).first()

def get_last_record(self):
return self.filter().order_by(WebhookTransactionLog.id.desc()).first()


class WebhookTransactionLog(TimestampMixin, db.Model):
query_class = WebhookTransactionLogQuery
Expand Down
3 changes: 2 additions & 1 deletion api/services/prompt_service.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# This file is treated as service layer
from api import models, db
from api import db
from datetime import datetime
from api.helpers import prompt_helper, common_helper, db_helper
from utils.loggingutils import logger
from api import models


class PromptService:
Expand Down
1 change: 0 additions & 1 deletion config.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
if github_action_db_url:
SQLALCHEMY_DATABASE_URI = github_action_db_url

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

Expand Down
56 changes: 28 additions & 28 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
from api import services, models
from flask import jsonify
from api.helpers import db_helper
from api import app, helpers, services, models
from utils.loggingutils import logger
import json

user_program_service = services.UserProgramService()

### Endpoint for Cloud function
def webhook(request):
try:
if request.method == "POST":
try:
jsonData = request.get_json()
except Exception as e:
logger.warning(
f"[WARN] Could not retrieve JSON data from the request. Error:{e}"
)
return jsonify(message="Something went wrong!"), 400

if jsonData.get("flow_category", None) == "dry_flow":
handle_dry_flow(jsonData)
else:
handle_regular_flow(jsonData)
return jsonify(message="Success"), 200

logger.warning("[WARN] Received a GET request instead of POST")
return (
jsonify(message="Currently, the system does not accept a GET request"),
405,
)
except Exception as e:
logger.error(f"An unexpected error occurred. Error message: {e}")
return jsonify(message="Internal server error"), 500
with app.app_context():
try:
if request.method == "POST":
try:
jsonData = request.get_json()
except Exception as e:
logger.warning(
f"[WARN] Could not retrieve JSON data from the request. Error:{e}"
)
return jsonify(message="Something went wrong!"), 400

if jsonData.get("flow_category", None) == "dry_flow":
handle_dry_flow(jsonData)
else:
handle_regular_flow(jsonData)
return jsonify(message="Success"), 200

logger.warning("[WARN] Received a GET request instead of POST")
return (
jsonify(message="Currently, the system does not accept a GET request"),
405,
)
except Exception as e:
logger.error(f"An unexpected error occurred. Error message: {e}")
return jsonify(message="Internal server error"), 500


def handle_dry_flow(jsonData):
Expand Down Expand Up @@ -77,7 +77,7 @@ def retry_failed_webhook(transaction_log_service):

for log in failed_webhook_logs:
log.attempts += 1
db_helper.save(log)
helpers.db_helper.save(log)

json_data = json.loads(log.payload)
json_data["log_created_on"] = log.created_on
Expand All @@ -86,7 +86,7 @@ def retry_failed_webhook(transaction_log_service):
continue

log.processed = True
db_helper.save(log)
helpers.db_helper.save(log)


def handle_payload(jsonData):
Expand Down
7 changes: 3 additions & 4 deletions manage.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from __future__ import absolute_import
from api import db, app
from api.models import *

from flask_migrate import Migrate
from flask_script import Manager
from flask.cli import FlaskGroup

migrate = Migrate(app, db)
manager = Manager(app)
cli = FlaskGroup(app)

if __name__ == "__main__":
manager.run()
cli()
14 changes: 14 additions & 0 deletions migrations/seeders/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from migrations.seeders.user import *
from migrations.seeders.system_phone import *
from migrations.seeders.partner import *
from migrations.seeders.registration import *
from migrations.seeders.program import *
from migrations.seeders.language import *
from migrations.seeders.content_version import *
from migrations.seeders.content import *
from migrations.seeders.user_program import *
from migrations.seeders.module import *
from migrations.seeders.module_content import *
from migrations.seeders.program_module import *
from migrations.seeders.program_sequence import *
from migrations.seeders.call_log import *
25 changes: 25 additions & 0 deletions migrations/seeders/call_log.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from faker import Faker
from uuid import uuid4
from api.models import CallLog as CallLogInstance
from api import db


class CallLog:
faker = Faker() # Kept for future use

def create_call_log(self, phone_number, content_id, content_version_id):
call_log_record = CallLogInstance()
call_log_record.user_phone_number = phone_number
call_log_record.content_id = content_id
call_log_record.content_version_id = content_version_id
call_log_record.flow_run_uuid = str(uuid4())

db.session.add(call_log_record)
db.session.commit()


if __name__ == "__main__":
seeder = CallLog()
seeder.create_call_log(
phone_number="1234567890", content_id=1, content_version_id=1
)
2 changes: 2 additions & 0 deletions migrations/seeders/content_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ def create_content_version(self, language_id: int, contents: List[ContentModel])
db.session.add_all(content_version_instances)
db.session.commit()

return content_version_instances


if __name__ == "__main__":
seeder = ContentVersion()
Expand Down
23 changes: 23 additions & 0 deletions migrations/seeders/module.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import datetime
from faker import Faker
from api.models import Module as ModuleInstance
from api import db


class Module:
faker = Faker() # Kept for future use

def create_module(self, program_id):
module_instance = ModuleInstance()
module_instance.name = "Test Module"
module_instance.program_id = program_id

db.session.add(module_instance)
db.session.commit()

return module_instance


if __name__ == "__main__":
seeder = Module()
seeder.create_module(program_id=1)
Loading
Loading