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

Turn Alerts Proof of concept #203

Merged
merged 15 commits into from
Jan 22, 2025
Merged
Show file tree
Hide file tree
Changes from 6 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
1 change: 1 addition & 0 deletions config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"rp_yal",
"randomisation",
"msisdn_utils",
"turn_alerts",
]

MIDDLEWARE = [
Expand Down
1 change: 1 addition & 0 deletions config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@
path("randomisation/", include("randomisation.urls")),
path("yal/", include("rp_yal.urls"), name="rp_yal"),
path("msisdn_utils/", include("msisdn_utils.urls")),
path("turnalerts/", include("turn_alerts.urls"), name="turn_alerts"),
]
Empty file added turn_alerts/__init__.py
Empty file.
5 changes: 5 additions & 0 deletions turn_alerts/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.contrib import admin

from .models import TurnActions

admin.site.register(TurnActions)
5 changes: 5 additions & 0 deletions turn_alerts/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class TurnAlertsConfig(AppConfig):
name = "turn_alerts"
54 changes: 54 additions & 0 deletions turn_alerts/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Generated by Django 4.2.16 on 2025-01-09 05:41

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
("sidekick", "0014_organization_contentrepo_token_and_more"),
]

operations = [
migrations.CreateModel(
name="TurnAlerts",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"hmac_secret",
models.CharField(
blank=True,
help_text="The secret for the Turn Journey",
max_length=255,
),
),
(
"journey_id",
models.CharField(
default="00000",
help_text="The id of the Turn journey",
max_length=255,
),
),
(
"org",
models.ForeignKey(
default=100,
on_delete=django.db.models.deletion.CASCADE,
to="sidekick.organization",
),
),
],
),
]
17 changes: 17 additions & 0 deletions turn_alerts/migrations/0002_remove_turnalerts_hmac_secret.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.16 on 2025-01-09 11:57

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("turn_alerts", "0001_initial"),
]

operations = [
migrations.RemoveField(
model_name="turnalerts",
name="hmac_secret",
),
]
17 changes: 17 additions & 0 deletions turn_alerts/migrations/0003_remove_turnalerts_org.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.16 on 2025-01-09 12:37

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("turn_alerts", "0002_remove_turnalerts_hmac_secret"),
]

operations = [
migrations.RemoveField(
model_name="turnalerts",
name="org",
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.2.16 on 2025-01-09 12:57

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("sidekick", "0014_organization_contentrepo_token_and_more"),
("turn_alerts", "0003_remove_turnalerts_org"),
]

operations = [
migrations.AddField(
model_name="turnalerts",
name="error_code",
field=models.CharField(
default="00000",
help_text="The error code that starts an event",
max_length=255,
),
),
migrations.AddField(
model_name="turnalerts",
name="org",
field=models.ForeignKey(
default=100,
on_delete=django.db.models.deletion.CASCADE,
to="sidekick.organization",
),
),
]
22 changes: 22 additions & 0 deletions turn_alerts/migrations/0005_alter_turnalerts_error_code.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.2.16 on 2025-01-12 18:07

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("turn_alerts", "0004_turnalerts_error_code_turnalerts_org"),
]

operations = [
migrations.AlterField(
model_name="turnalerts",
name="error_code",
field=models.IntegerField(
default="00000",
help_text="The error code that starts an event",
max_length=255,
),
),
]
18 changes: 18 additions & 0 deletions turn_alerts/migrations/0006_rename_turnalerts_turnactions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.16 on 2025-01-13 05:23

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("sidekick", "0014_organization_contentrepo_token_and_more"),
("turn_alerts", "0005_alter_turnalerts_error_code"),
]

operations = [
migrations.RenameModel(
old_name="TurnAlerts",
new_name="TurnActions",
),
]
Empty file.
19 changes: 19 additions & 0 deletions turn_alerts/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from django.db import models

from sidekick.models import Organization


class TurnActions(models.Model):
org = models.ForeignKey(Organization, default=100, on_delete=models.CASCADE)
journey_id = models.CharField(
max_length=255,
null=False,
default="00000",
help_text="The id of the Turn journey",
)
error_code = models.IntegerField(
max_length=255,
null=False,
default="00000",
help_text="The error code that starts an event",
)
183 changes: 183 additions & 0 deletions turn_alerts/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
from rest_framework import serializers

"""
Serializer for delivery failure status payload
"""


class ErrorSerializer(serializers.Serializer):
code = serializers.IntegerField()
message = serializers.CharField()
title = serializers.CharField()


class StatusErrorSerializer(serializers.Serializer):
id = serializers.CharField()
recipient_id = serializers.CharField()
status = serializers.CharField()
timestamp = serializers.IntegerField()
errors = ErrorSerializer(many=True, required=False)


class Status_ErrorPayloadSerializer(serializers.Serializer):
statuses = StatusErrorSerializer(many=True)

def get_error_code(self):
error_code = self.validated_data["statuses"][0]["errors"][0]["code"]
return error_code

def get_message_status(self):
status = self.validated_data["statuses"][0]["status"]
return status

def get_recipient_id(self):
recipient_id = self.validated_data["statuses"][0]["recipient_id"]
return recipient_id


"""
Serializer for delivered messages status payload
"""


class OriginSerializer(serializers.Serializer):
type = serializers.CharField()


class PricingSerializer(serializers.Serializer):
billable = serializers.BooleanField()
category = serializers.CharField()
pricing_model = serializers.CharField()


class ConversationSerializer(serializers.Serializer):
expiration_timestamp = serializers.IntegerField()
id = serializers.CharField()
origin = OriginSerializer()


class StatusSerializer(serializers.Serializer):
conversation = ConversationSerializer()
id = serializers.CharField()
recipient_id = serializers.CharField()
status = serializers.CharField()
timestamp = serializers.IntegerField()


class StatusPayloadSerializer(serializers.Serializer):
statuses = StatusSerializer(many=True)

def get_recipient_id(self):
recipient_id = self.validated_data["statuses"][0]["recipient_id"]
return recipient_id

def get_conversation_type(self):
conversation_type = self.validated_data["statuses"][0]["conversation"][
"origin"
]["type"]
return conversation_type

def get_conversation_id(self):
conversation_id = self.validated_data["statuses"][0]["conversation"]["id"]
return conversation_id

def get_message_status(self):
status = self.validated_data["statuses"][0]["status"]
return status


"""
Serializer for vendor messages payload
"""


class VendorAuthorSerializer(serializers.Serializer):
id = serializers.CharField()
name = serializers.CharField()
request_id = serializers.CharField()
type = serializers.CharField()


class VendorAssignedToSerializer(serializers.Serializer):
id = serializers.CharField()
name = serializers.CharField()
type = serializers.CharField()


class V1Serializer(serializers.Serializer):
author = VendorAuthorSerializer()
direction = serializers.CharField()
on_fallback_channel = serializers.BooleanField()
rendered_content = serializers.CharField(allow_null=True)


class VendorSerializer(serializers.Serializer):
v1 = V1Serializer()


class VendorPayloadSerializer(serializers.Serializer):
_vnd = VendorSerializer()
type = serializers.CharField()

def get_message_type(self):
message_type = self.validated_data["type"]
return message_type

def get_direction(self):
direction = self.validated_data["_vnd"]["v1"]["direction"]
return direction

def get_fallback_channel(self):
fallback_channel = self.validated_data["_vnd"]["v1"]["on_fallback_channel"]
return fallback_channel


"""
Serializer for contacts payload
"""


class ProfileSerializer(serializers.Serializer):
name = serializers.CharField()


class AuthorSerializer(serializers.Serializer):
type = serializers.CharField()


class AssignedToSerializer(serializers.Serializer):
type = serializers.CharField()


class V1Serializer(serializers.Serializer):
author = AuthorSerializer()
direction = serializers.CharField()
on_fallback_channel = serializers.BooleanField()


class VndSerializer(serializers.Serializer):
v1 = V1Serializer()


class MessageSerializer(serializers.Serializer):
_vnd = VndSerializer()

type = serializers.CharField()


class ContactsPayloadSerializer(serializers.Serializer):
messages = MessageSerializer(many=True)

def get_message_type(self):
message_type = self.validated_data["messages"][0]["type"]
return message_type

def get_direction(self):
direction = self.validated_data["messages"][0]["_vnd"]["v1"]["direction"]
return direction

def get_fallback_channel(self):
fallback_channel = self.validated_data["messages"][0]["_vnd"]["v1"][
"on_fallback_channel"
]
return fallback_channel
Loading
Loading