Skip to content
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
Empty file.
6 changes: 6 additions & 0 deletions apps/organization_monitoring/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class MonitoringConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "apps.organization_monitoring"
5 changes: 5 additions & 0 deletions apps/organization_monitoring/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.db import models


class MonitoringType(models.TextChoices):
WATER_LEVEL = "water_level"
55 changes: 55 additions & 0 deletions apps/organization_monitoring/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import uuid

from django.db import migrations, models

from apps.organization_monitoring.constants import MonitoringType


class Migration(migrations.Migration):
initial = True
dependencies = [
("organization", "0001_initial"),
]

operations = [
migrations.CreateModel(
name="OrganizationMonitoring",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
unique=True,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("cell_size", models.FloatField(default=50.0)),
(
"type",
models.CharField(default=MonitoringType.WATER_LEVEL, max_length=50),
),
("thresholds", models.JSONField(blank=True, default=dict)),
("colors", models.JSONField(blank=True, default=dict)),
("display_settings", models.JSONField(blank=True, default=dict)),
(
"organization",
models.ForeignKey(
on_delete=models.deletion.CASCADE,
related_name="monitoring_settings",
to="organization.Organization",
),
),
],
options={"db_table": "organization_monitoring"},
),
migrations.AddConstraint(
model_name="organizationmonitoring",
constraint=models.UniqueConstraint(
fields=["organization", "type"], name="unique_monitoring_type_per_org"
),
),
]
Empty file.
31 changes: 31 additions & 0 deletions apps/organization_monitoring/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from common.models.base_model import BaseModel
from django.db import models

from apps.organization.models import Organization
from apps.organization_monitoring.constants import MonitoringType


class OrganizationMonitoring(BaseModel):
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE,
related_name="monitoring_settings",
)
cell_size = models.FloatField(default=50.0)
type = models.CharField(
max_length=50,
default=MonitoringType.WATER_LEVEL,
choices=MonitoringType.choices,
)
thresholds = models.JSONField(default=dict, blank=True)
colors = models.JSONField(default=dict, blank=True)
display_settings = models.JSONField(default=dict, blank=True)

class Meta:
db_table = "organization_monitoring"
constraints = [
models.UniqueConstraint(
fields=["organization", "type"],
name="unique_monitoring_type_per_org",
)
]
23 changes: 23 additions & 0 deletions apps/organization_monitoring/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from rest_framework import serializers

from apps.organization_monitoring.models import OrganizationMonitoring


class OrganizationMonitoringSerializer(serializers.ModelSerializer):
class Meta:
model = OrganizationMonitoring
fields = [
"id",
"cell_size",
"type",
"thresholds",
"colors",
"display_settings",
"created_at",
"updated_at",
]
extra_kwargs = {
"id": {"read_only": True},
"created_at": {"read_only": True},
"updated_at": {"read_only": True},
}
23 changes: 23 additions & 0 deletions apps/organization_monitoring/services.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from apps.organization.models import Organization
from apps.organization_monitoring.constants import MonitoringType
from apps.organization_monitoring.models import OrganizationMonitoring

DEFAULT_MONITORING_VALUES = {
"cell_size": 50.0,
"thresholds": {"safe": 0.1, "caution": 0.3, "warning": 0.6},
"colors": {
"safe": "#08B94E",
"caution": "#EBA622",
"warning": "#FD6665",
"danger": "#E5372B",
},
"display_settings": {"device_icons": True, "water_column": True, "coverage": True},
}


def create_default_organization_monitoring(organization: Organization):
return OrganizationMonitoring.objects.get_or_create(
organization=organization,
type=MonitoringType.WATER_LEVEL,
defaults=DEFAULT_MONITORING_VALUES,
)
21 changes: 21 additions & 0 deletions apps/organization_monitoring/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from django.urls import path

from apps.organization_monitoring.views import (
OrganizationMonitoringDetailView,
OrganizationMonitoringListCreateView,
)

app_name = "organization_monitoring"

urlpatterns = [
path(
"organizations/monitoring",
OrganizationMonitoringListCreateView.as_view(),
name="organization-monitoring-list",
),
path(
"organizations/monitoring/<uuid:pk>",
OrganizationMonitoringDetailView.as_view(),
name="organization-monitoring-detail",
),
]
20 changes: 20 additions & 0 deletions apps/organization_monitoring/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from apps.organization_monitoring.models import OrganizationMonitoring
from apps.organization_monitoring.serializers import OrganizationMonitoringSerializer
from utils.views import (
OrganizationListCreateAPIView,
OrganizationRetrieveUpdateDestroyAPIView,
)


class OrganizationMonitoringListCreateView(OrganizationListCreateAPIView):
model = OrganizationMonitoring
serializer_class = OrganizationMonitoringSerializer
queryset = OrganizationMonitoring.objects.select_related("organization")
organization_field = "organization"


class OrganizationMonitoringDetailView(OrganizationRetrieveUpdateDestroyAPIView):
model = OrganizationMonitoring
serializer_class = OrganizationMonitoringSerializer
queryset = OrganizationMonitoring.objects.select_related("organization")
organization_field = "organization"
2 changes: 2 additions & 0 deletions bootstrap_service/management/commands/init_organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from apps.custom_email.service import create_default_organization_email
from apps.custom_page.service import create_default_pages
from apps.organization.models import Organization
from apps.organization_monitoring.services import create_default_organization_monitoring
from apps.organization_roles.constants import OrganizationRoleType
from apps.organization_roles.models import OrganizationRoleUser
from apps.organization_roles.services import (
Expand Down Expand Up @@ -125,6 +126,7 @@ def _create_organization_with_roles(self, org_id, org_name, org_slug, result):
create_default_pages(organization)
create_default_organization_email(organization)
create_default_organization_setting(organization)
create_default_organization_monitoring(organization)
create_default_subscription(organization)
self.stdout.write(self.style.SUCCESS("Created default policies"))

Expand Down
1 change: 1 addition & 0 deletions bootstrap_service/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
"apps.custom_page",
"apps.custom_email",
"apps.organization_setting",
"apps.organization_monitoring",
"apps.billing",
"apps.contact_sales",
"apps.organization_roles",
Expand Down
1 change: 1 addition & 0 deletions bootstrap_service/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ def health_check(_):
path("api/", include("apps.custom_page.urls")),
path("api/", include("apps.custom_email.urls")),
path("api/", include("apps.organization_setting.urls")),
path("api/", include("apps.organization_monitoring.urls")),
path("api/", include("apps.billing.urls")),
path("api/", include("apps.contact_sales.urls")),
path("api/", include("apps.organization.urls")),
Expand Down
Loading