permission for set_load and caching for get_load

This commit is contained in:
Laura Klünder 2024-12-29 20:11:34 +01:00
parent a2f1296bd5
commit 149dbf7b9d
3 changed files with 23 additions and 10 deletions

View file

@ -12,7 +12,7 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='userpermissions', model_name='userpermissions',
name='can_write_laod_data', name='can_write_load_data',
field=models.BooleanField(default=False, verbose_name='write load data'), field=models.BooleanField(default=False, verbose_name='write load data'),
), ),
] ]

View file

@ -45,7 +45,7 @@ class UserPermissions(models.Model):
quests: list[str] = SchemaField(schema=list[str], default=list) quests: list[str] = SchemaField(schema=list[str], default=list)
impolite_quests = models.BooleanField(default=False, verbose_name=_('dont say thanks after completing a quest')) impolite_quests = models.BooleanField(default=False, verbose_name=_('dont say thanks after completing a quest'))
passive_ap_name_scanning = models.BooleanField(default=False, verbose_name=_('passive ap name scanning')) passive_ap_name_scanning = models.BooleanField(default=False, verbose_name=_('passive ap name scanning'))
can_write_laod_data = models.BooleanField(default=False, verbose_name=_('write load data')) can_write_load_data = models.BooleanField(default=False, verbose_name=_('write load data'))
class Meta: class Meta:
verbose_name = _('User Permissions') verbose_name = _('User Permissions')

View file

@ -2,7 +2,9 @@ import json
from typing import Annotated, Union, Optional from typing import Annotated, Union, Optional
from celery import chain from celery import chain
from django.core.cache import cache
from django.core.serializers.json import DjangoJSONEncoder from django.core.serializers.json import DjangoJSONEncoder
from django.db import transaction
from django.db.models import Prefetch, Q from django.db.models import Prefetch, Q
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils import timezone from django.utils import timezone
@ -444,6 +446,10 @@ Room load
@map_api_router.get('/load/', summary="get load group loads", @map_api_router.get('/load/', summary="get load group loads",
response={200: dict[PositiveInt, float], **auth_responses}) response={200: dict[PositiveInt, float], **auth_responses})
def get_load(request): def get_load(request):
result = cache.get('mapdata:get_load', None)
if result is not None:
return result
load_groups = {g.pk: g for g in LoadGroup.objects.all()} load_groups = {g.pk: g for g in LoadGroup.objects.all()}
# per group # per group
@ -484,26 +490,33 @@ def get_load(request):
max_values[load_group_id] += beacon.max_observed_num_clients max_values[load_group_id] += beacon.max_observed_num_clients
current_values[load_group_id] += beacon.num_clients current_values[load_group_id] += beacon.num_clients
return { result = {
pk: (min(1.0, current_values[pk] / (max_value*0.9)) if max_value else 0) pk: (min(1.0, current_values[pk] / (max_value*0.9)) if max_value else 0)
for pk, max_value in max_values.items() for pk, max_value in max_values.items()
} }
cache.set('mapdata:get_load', result, 300)
return result
class ApLoadSchema(BaseSchema): class ApLoadSchema(BaseSchema):
aps: dict[str, int] aps: dict[str, int]
@map_api_router.post('/load/', summary="update current load data", response={204: None, **auth_responses}) @map_api_router.post('/load/', summary="update current load data",
response={204: None, **auth_permission_responses})
def post_load(request, parameters: ApLoadSchema): def post_load(request, parameters: ApLoadSchema):
# TODO: check if user has permission if not request.user_permissions.can_write_load_data:
raise APIPermissionDenied()
names = parameters.aps.keys() names = parameters.aps.keys()
for beacon in RangingBeacon.objects.filter(ap_name__in=names): with transaction.atomic():
beacon.num_clients = parameters.aps[beacon.ap_name] for beacon in RangingBeacon.objects.filter(ap_name__in=names):
if beacon.num_clients > beacon.max_observed_num_clients: beacon.num_clients = parameters.aps[beacon.ap_name]
beacon.max_observed_num_clients = beacon.num_clients if beacon.num_clients > beacon.max_observed_num_clients:
beacon.save() beacon.max_observed_num_clients = beacon.num_clients
beacon.save()
cache.delete('mapdata:get_load')
return 204, None return 204, None