* Add cloud connection statuses on user page * Add fixes for oncall hobby docker-compose installation * Fix for links and for cloud user status at User settings * Delete cloud api token on cloud disconnect * Merge branch 'dev' into cloud_connection_statuses_on_user_page * Fix cloud statuses for users * Fix usagestats service * Fix phone verification message in users table * added request after syncing user * Add endpoint to create CloudHeartbeat and polish code * Fix imports * Check token and heartbeat setting in setup_hertbeat_integration * Add macthed_users_count in cloud users * Sync users on token change * Fix query param * Fix tests * Heartbit button logic, tab width fix, coount users fix * Solve problem of existent cloud heartbeat integration * Solve problem of existent cloud heartbeat integration 2 * Solve problem of existent cloud heartbeat integration 3 * fix build * build fix, styles for env variables description Co-authored-by: Ildar Iskhakov <ildar.iskhakov@grafana.com> Co-authored-by: Yulia Shanyrova <yulia.shanyrova@grafana.com>
86 lines
2.9 KiB
Python
86 lines
2.9 KiB
Python
import logging
|
|
from urllib.parse import urljoin
|
|
|
|
from django.apps import apps
|
|
from django.utils import timezone
|
|
|
|
from apps.oss_installation import constants as oss_constants
|
|
from apps.schedules.ical_utils import list_users_to_notify_from_ical_for_period
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def active_oss_users_count():
|
|
"""
|
|
active_oss_users_count returns count of active users of oss installation.
|
|
"""
|
|
OnCallSchedule = apps.get_model("schedules", "OnCallSchedule")
|
|
AlertGroupLogRecord = apps.get_model("alerts", "AlertGroupLogRecord")
|
|
EscalationPolicy = apps.get_model("alerts", "EscalationPolicy")
|
|
UserNotificationPolicyLogRecord = apps.get_model("base", "UserNotificationPolicyLogRecord")
|
|
|
|
# Take logs for previous 24 hours
|
|
start = timezone.now() - timezone.timedelta(hours=24)
|
|
end = timezone.now()
|
|
|
|
# Take schedules for current month
|
|
schedule_start = timezone.now().replace(day=1, hour=0, minute=0, second=0, microsecond=0)
|
|
schedule_end = (schedule_start + timezone.timedelta(days=32)).replace(day=1)
|
|
|
|
unique_active_users = set()
|
|
|
|
unique_active_users.update(
|
|
list(
|
|
UserNotificationPolicyLogRecord.objects.filter(
|
|
created_at__gte=start, created_at__lt=end, author__isnull=False
|
|
)
|
|
.values_list("author_id", flat=True)
|
|
.distinct()
|
|
)
|
|
)
|
|
|
|
unique_active_users.update(
|
|
list(
|
|
AlertGroupLogRecord.objects.filter(
|
|
type__in=AlertGroupLogRecord.TYPES_FOR_LICENCE_CALCULATION,
|
|
created_at__gte=start,
|
|
created_at__lt=end,
|
|
author__isnull=False,
|
|
)
|
|
.values_list("author_id", flat=True)
|
|
.distinct()
|
|
)
|
|
)
|
|
|
|
# Get active users from notification policies
|
|
unique_active_users.update(
|
|
list(
|
|
EscalationPolicy.objects.filter(notify_to_users_queue__isnull=False).values_list(
|
|
"notify_to_users_queue__id", flat=True
|
|
)
|
|
)
|
|
)
|
|
|
|
for schedule in OnCallSchedule.objects.all():
|
|
users_from_schedule = list_users_to_notify_from_ical_for_period(schedule, schedule_start, schedule_end)
|
|
for user in users_from_schedule:
|
|
unique_active_users.add(user.pk)
|
|
|
|
return len(unique_active_users)
|
|
|
|
|
|
def cloud_user_identity_status(connector, identity):
|
|
link = None
|
|
if connector is None:
|
|
status = oss_constants.CLOUD_NOT_SYNCED
|
|
elif identity is None:
|
|
status = oss_constants.CLOUD_SYNCED_USER_NOT_FOUND
|
|
link = connector.cloud_url
|
|
else:
|
|
if identity.phone_number_verified:
|
|
status = oss_constants.CLOUD_SYNCED_PHONE_VERIFIED
|
|
else:
|
|
status = oss_constants.CLOUD_SYNCED_PHONE_NOT_VERIFIED
|
|
|
|
link = urljoin(connector.cloud_url, f"a/grafana-oncall-app/?page=users&p=1&id={identity.cloud_id}")
|
|
return status, link
|