Add CloudUsersView

This commit is contained in:
Innokentii Konstantinov 2022-06-03 23:03:54 +04:00
parent f68d3f2146
commit 5e494531eb
6 changed files with 59 additions and 4 deletions

View file

@ -102,7 +102,7 @@ class CloudOrganizationConnector(models.Model):
i.email = cloud_users_identities_to_update[i.cloud_id]["email"]
i.phone_number_verified = cloud_users_identities_to_update[i.cloud_id]["is_phone_number_verified"]
# TODO: Grafana Twilio: check if data validation needed.
# TODO: Grafana CN: check if data validation needed.
CloudUserIdentity.objects.bulk_create(cloud_users_identities_to_create, batch_size=1000)
CloudUserIdentity.objects.bulk_update(
existing_cloud_identities, ["email", "phone_number_verified"], batch_size=1000

View file

@ -10,5 +10,5 @@ class CloudUserIdentity(models.Model):
)
class Meta:
# TODO: Grafana Twilio: Check if this constraint needed
# TODO: Grafana CN: Check if this constraint needed
unique_together = ("cloud_id", "organization")

View file

@ -1,7 +1,8 @@
from common.api_helpers.optional_slash_router import optional_slash_path
from .views import CloudHeartbeatStatusView
from .views import CloudHeartbeatStatusView, CloudUsersView
urlpatterns = [
optional_slash_path("cloud_heartbeat_status", CloudHeartbeatStatusView.as_view(), name="cloud_heartbeat_status"),
optional_slash_path("cloud_users", CloudUsersView.as_view(), name="cloud_users"),
]

View file

@ -1 +1,2 @@
from .cloud_heartbeat_status import CloudHeartbeatStatusView # noqa: F401
from .cloud_users import CloudUsersView # noqa: F401

View file

@ -0,0 +1,53 @@
from urllib.parse import urljoin
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from apps.auth_token.auth import PluginAuthentication
from apps.oss_installation.models import CloudOrganizationConnector, CloudUserIdentity
from apps.user_management.models import User
from common.api_helpers.paginators import HundredPageSizePaginator
class CloudUsersView(HundredPageSizePaginator, APIView):
authentication_classes = (PluginAuthentication,)
# TODO: Grafana CN - permissions, ratelimit
permission_classes = (IsAuthenticated,)
def get(self, request):
queryset = User.objects.filter(organization=self.request.user.organization)
if self.request.user.current_team is not None:
queryset = queryset.filter(teams=self.request.user.current_team).distinct()
results = self.paginate_queryset(queryset, request, view=self)
emails = list(queryset.values_list("email", flat=True))
cloud_identities = list(
CloudUserIdentity.objects.filter(organization=self.request.user.organization, email__in=emails)
)
cloud_identities = {cloud_identity.email: cloud_identity for cloud_identity in cloud_identities}
response = []
connector = CloudOrganizationConnector.objects.first()
for user in results:
cloud_identity = cloud_identities.get(user.email, None)
link = None
status = 0
if cloud_identity:
status = 1
is_phone_verified = cloud_identity.phone_number_verified
if is_phone_verified:
status = 2
link = urljoin(
connector.cloud_url, f"a/grafana-oncall-app/?page=users&p=1&id={cloud_identity.cloud_id}"
)
# TODO: Grafana CN - decide if emails is needed. If yes - don't forget to check that they mustn't be shown to users
response.append(
{"id": user.public_primary_key, "username": user.username, "cloud_sync_status": status, "link": link}
)
return self.get_paginated_response(response)

View file

@ -41,7 +41,7 @@ class SMSMessageManager(models.Manager):
sms_message = sms_message_qs.first()
if sms_message.grafana_cloud_notification:
# If sms was sent via grafana twilio it is don't needed to create logs on it's delivery status.
# If sms was sent via grafana cloud notifications don't create logs on its delivery status.
return
log_record = None