2022-06-05 19:09:40 +04:00
|
|
|
from rest_framework import mixins, status, viewsets
|
|
|
|
|
from rest_framework.decorators import action
|
2022-06-03 23:03:54 +04:00
|
|
|
from rest_framework.permissions import IsAuthenticated
|
2022-06-05 19:09:40 +04:00
|
|
|
from rest_framework.response import Response
|
2022-06-03 23:03:54 +04:00
|
|
|
from rest_framework.views import APIView
|
|
|
|
|
|
2022-11-29 09:41:56 +01:00
|
|
|
from apps.api.permissions import IsOwnerOrHasRBACPermissions, RBACPermission
|
2022-06-03 23:03:54 +04:00
|
|
|
from apps.auth_token.auth import PluginAuthentication
|
2022-06-06 16:02:09 +04:00
|
|
|
from apps.oss_installation.models import CloudConnector, CloudUserIdentity
|
2022-06-05 19:09:40 +04:00
|
|
|
from apps.oss_installation.serializers import CloudUserSerializer
|
2022-06-13 16:29:08 +04:00
|
|
|
from apps.oss_installation.utils import cloud_user_identity_status
|
2022-06-03 23:03:54 +04:00
|
|
|
from apps.user_management.models import User
|
2022-06-05 19:09:40 +04:00
|
|
|
from common.api_helpers.mixins import PublicPrimaryKeyMixin
|
augment API response pagination attributes (#2471)
# What this PR does
This PR:
- adds a few attributes to paginated API responses
- removes channel filter "send demo alert" internal API endpoint + tests
(this endpoint was marked as deprecated + not consumed by the web UI)
With the new paginated API response schema, the web UI will no longer
need to:
- hardcode `ITEMS_PER_PAGE` for each table
- manually calculate total number of pages
(these two things ☝️ will be done in
https://github.com/grafana/oncall/issues/2476)
For `GET /api/internal/v1/alertgroups` the response will now look like
this:
```diff
{
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>
}
```
For all other paginated API responses, the response will now look like:
```diff
{
"count": <int>,
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>,
++ "current_page_number": <int>,
++ "total_pages": <int>
}
```
## TODO
- [x] update public API docs to include these new attributes
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-07-14 17:19:40 +02:00
|
|
|
from common.api_helpers.paginators import HundredPageSizePaginator, PaginatedData
|
2022-11-29 09:41:56 +01:00
|
|
|
|
|
|
|
|
PERMISSIONS = [RBACPermission.Permissions.OTHER_SETTINGS_WRITE]
|
2022-06-03 23:03:54 +04:00
|
|
|
|
|
|
|
|
|
augment API response pagination attributes (#2471)
# What this PR does
This PR:
- adds a few attributes to paginated API responses
- removes channel filter "send demo alert" internal API endpoint + tests
(this endpoint was marked as deprecated + not consumed by the web UI)
With the new paginated API response schema, the web UI will no longer
need to:
- hardcode `ITEMS_PER_PAGE` for each table
- manually calculate total number of pages
(these two things ☝️ will be done in
https://github.com/grafana/oncall/issues/2476)
For `GET /api/internal/v1/alertgroups` the response will now look like
this:
```diff
{
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>
}
```
For all other paginated API responses, the response will now look like:
```diff
{
"count": <int>,
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>,
++ "current_page_number": <int>,
++ "total_pages": <int>
}
```
## TODO
- [x] update public API docs to include these new attributes
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-07-14 17:19:40 +02:00
|
|
|
class CloudUsersPagination(HundredPageSizePaginator):
|
|
|
|
|
# the override ignore here is expected. The parent classes' get_paginated_response method does not
|
|
|
|
|
# take a matched_users_count argument. This is fine in this case
|
|
|
|
|
def get_paginated_response(self, data: PaginatedData, matched_users_count: int) -> Response: # type: ignore[override]
|
2024-01-12 15:11:22 +00:00
|
|
|
response = super().get_paginated_response(data)
|
|
|
|
|
response.data["matched_users_count"] = matched_users_count
|
|
|
|
|
return response
|
augment API response pagination attributes (#2471)
# What this PR does
This PR:
- adds a few attributes to paginated API responses
- removes channel filter "send demo alert" internal API endpoint + tests
(this endpoint was marked as deprecated + not consumed by the web UI)
With the new paginated API response schema, the web UI will no longer
need to:
- hardcode `ITEMS_PER_PAGE` for each table
- manually calculate total number of pages
(these two things ☝️ will be done in
https://github.com/grafana/oncall/issues/2476)
For `GET /api/internal/v1/alertgroups` the response will now look like
this:
```diff
{
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>
}
```
For all other paginated API responses, the response will now look like:
```diff
{
"count": <int>,
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>,
++ "current_page_number": <int>,
++ "total_pages": <int>
}
```
## TODO
- [x] update public API docs to include these new attributes
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-07-14 17:19:40 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class CloudUsersView(CloudUsersPagination, APIView):
|
2022-06-03 23:03:54 +04:00
|
|
|
authentication_classes = (PluginAuthentication,)
|
2022-11-29 09:41:56 +01:00
|
|
|
permission_classes = (IsAuthenticated, RBACPermission)
|
|
|
|
|
|
|
|
|
|
rbac_permissions = {
|
|
|
|
|
"get": PERMISSIONS,
|
|
|
|
|
"post": PERMISSIONS,
|
|
|
|
|
}
|
2022-06-03 23:03:54 +04:00
|
|
|
|
|
|
|
|
def get(self, request):
|
2022-06-05 19:09:40 +04:00
|
|
|
organization = request.user.organization
|
|
|
|
|
|
2024-10-10 15:02:21 -04:00
|
|
|
queryset = User.objects.filter_by_permission(RBACPermission.Permissions.NOTIFICATIONS_READ, organization)
|
2022-06-03 23:03:54 +04:00
|
|
|
|
2022-06-05 19:09:40 +04:00
|
|
|
if request.user.current_team is not None:
|
|
|
|
|
queryset = queryset.filter(teams=request.user.current_team).distinct()
|
2022-06-13 16:29:08 +04:00
|
|
|
emails = list(queryset.values_list("email", flat=True))
|
2022-06-03 23:03:54 +04:00
|
|
|
|
|
|
|
|
results = self.paginate_queryset(queryset, request, view=self)
|
|
|
|
|
|
2022-06-06 16:02:09 +04:00
|
|
|
cloud_identities = list(CloudUserIdentity.objects.filter(email__in=emails))
|
2022-06-03 23:03:54 +04:00
|
|
|
cloud_identities = {cloud_identity.email: cloud_identity for cloud_identity in cloud_identities}
|
|
|
|
|
|
augment API response pagination attributes (#2471)
# What this PR does
This PR:
- adds a few attributes to paginated API responses
- removes channel filter "send demo alert" internal API endpoint + tests
(this endpoint was marked as deprecated + not consumed by the web UI)
With the new paginated API response schema, the web UI will no longer
need to:
- hardcode `ITEMS_PER_PAGE` for each table
- manually calculate total number of pages
(these two things ☝️ will be done in
https://github.com/grafana/oncall/issues/2476)
For `GET /api/internal/v1/alertgroups` the response will now look like
this:
```diff
{
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>
}
```
For all other paginated API responses, the response will now look like:
```diff
{
"count": <int>,
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>,
++ "current_page_number": <int>,
++ "total_pages": <int>
}
```
## TODO
- [x] update public API docs to include these new attributes
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-07-14 17:19:40 +02:00
|
|
|
data = []
|
2022-06-03 23:03:54 +04:00
|
|
|
|
2022-06-06 16:02:09 +04:00
|
|
|
connector = CloudConnector.objects.first()
|
2022-06-05 19:09:40 +04:00
|
|
|
|
2022-06-03 23:03:54 +04:00
|
|
|
for user in results:
|
2022-06-13 16:29:08 +04:00
|
|
|
cloud_identity = cloud_identities.get(user.email, None)
|
2024-10-09 08:55:10 -04:00
|
|
|
status, link = cloud_user_identity_status(organization, connector, cloud_identity)
|
augment API response pagination attributes (#2471)
# What this PR does
This PR:
- adds a few attributes to paginated API responses
- removes channel filter "send demo alert" internal API endpoint + tests
(this endpoint was marked as deprecated + not consumed by the web UI)
With the new paginated API response schema, the web UI will no longer
need to:
- hardcode `ITEMS_PER_PAGE` for each table
- manually calculate total number of pages
(these two things ☝️ will be done in
https://github.com/grafana/oncall/issues/2476)
For `GET /api/internal/v1/alertgroups` the response will now look like
this:
```diff
{
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>
}
```
For all other paginated API responses, the response will now look like:
```diff
{
"count": <int>,
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>,
++ "current_page_number": <int>,
++ "total_pages": <int>
}
```
## TODO
- [x] update public API docs to include these new attributes
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-07-14 17:19:40 +02:00
|
|
|
data.append(
|
2022-06-04 16:49:10 +04:00
|
|
|
{
|
|
|
|
|
"id": user.public_primary_key,
|
|
|
|
|
"email": user.email,
|
|
|
|
|
"username": user.username,
|
|
|
|
|
"cloud_data": {"status": status, "link": link},
|
|
|
|
|
}
|
2022-06-03 23:03:54 +04:00
|
|
|
)
|
|
|
|
|
|
augment API response pagination attributes (#2471)
# What this PR does
This PR:
- adds a few attributes to paginated API responses
- removes channel filter "send demo alert" internal API endpoint + tests
(this endpoint was marked as deprecated + not consumed by the web UI)
With the new paginated API response schema, the web UI will no longer
need to:
- hardcode `ITEMS_PER_PAGE` for each table
- manually calculate total number of pages
(these two things ☝️ will be done in
https://github.com/grafana/oncall/issues/2476)
For `GET /api/internal/v1/alertgroups` the response will now look like
this:
```diff
{
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>
}
```
For all other paginated API responses, the response will now look like:
```diff
{
"count": <int>,
"next": <url> | None,
"previous": <url> | None,
"results": [],
++ "page_size": <int>,
++ "current_page_number": <int>,
++ "total_pages": <int>
}
```
## TODO
- [x] update public API docs to include these new attributes
## Checklist
- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-07-14 17:19:40 +02:00
|
|
|
return self.get_paginated_response(data, len(cloud_identities))
|
2022-06-05 19:09:40 +04:00
|
|
|
|
|
|
|
|
def post(self, request):
|
2022-06-06 16:02:09 +04:00
|
|
|
connector = CloudConnector.objects.first()
|
2022-06-05 19:09:40 +04:00
|
|
|
if connector is not None:
|
|
|
|
|
sync_status, err = connector.sync_users_with_cloud()
|
|
|
|
|
return Response(status=status.HTTP_200_OK, data={"status": sync_status, "error": err})
|
|
|
|
|
else:
|
|
|
|
|
return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail": "Grafana Cloud is not connected"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CloudUserView(
|
|
|
|
|
PublicPrimaryKeyMixin,
|
|
|
|
|
mixins.RetrieveModelMixin,
|
|
|
|
|
viewsets.GenericViewSet,
|
|
|
|
|
):
|
|
|
|
|
authentication_classes = (PluginAuthentication,)
|
2022-11-29 09:41:56 +01:00
|
|
|
permission_classes = (IsAuthenticated, RBACPermission)
|
2022-06-05 19:09:40 +04:00
|
|
|
|
2022-11-29 09:41:56 +01:00
|
|
|
rbac_permissions = {
|
|
|
|
|
"retrieve": PERMISSIONS,
|
|
|
|
|
"sync": PERMISSIONS,
|
2022-06-08 15:04:23 +04:00
|
|
|
}
|
2022-11-29 09:41:56 +01:00
|
|
|
|
|
|
|
|
IsOwnerOrHasUserSettingsAdminPermission = IsOwnerOrHasRBACPermissions(
|
|
|
|
|
[RBACPermission.Permissions.USER_SETTINGS_ADMIN]
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
rbac_object_permissions = {
|
|
|
|
|
IsOwnerOrHasUserSettingsAdminPermission: [
|
|
|
|
|
"retrieve",
|
|
|
|
|
"sync",
|
|
|
|
|
],
|
2022-06-05 19:09:40 +04:00
|
|
|
}
|
2022-11-29 09:41:56 +01:00
|
|
|
|
2022-06-05 19:09:40 +04:00
|
|
|
serializer_class = CloudUserSerializer
|
|
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
|
queryset = User.objects.filter(organization=self.request.user.organization)
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
@action(detail=True, methods=["post"])
|
2022-06-08 15:04:23 +04:00
|
|
|
def sync(self, request, pk):
|
2022-06-05 19:09:40 +04:00
|
|
|
user = self.get_object()
|
2022-06-06 16:02:09 +04:00
|
|
|
connector = CloudConnector.objects.first()
|
2022-06-05 19:09:40 +04:00
|
|
|
if connector is not None:
|
|
|
|
|
sync_status, err = connector.sync_user_with_cloud(user)
|
|
|
|
|
return Response(status=status.HTTP_200_OK, data={"status": sync_status, "error": err})
|
|
|
|
|
else:
|
|
|
|
|
return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail": "Grafana Cloud is not connected"})
|