-
Notifications
You must be signed in to change notification settings - Fork 340
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improved asset bed relations for camera preset (#2387)
* Adds camera preset model * Migration to backfill and soft delete duplicate asset bed records * Delete assed bed records that has no asset class * rebase migrations * stash * rebase migrations * rebase migrations and fix issues * fix accidentally creating preset in update preset * remove boundary preset support * optimize preset name valdiation check --------- Co-authored-by: Aakash Singh <mail@singhaakash.dev> * refactor viewsets * make asset, bed, assetbed get_queryset reusable based on user * prevent accidentally attempting to evaluate queryset early * migration: skip purging data, handle exceptions; add tests --------- Co-authored-by: Aakash Singh <mail@singhaakash.dev> Co-authored-by: Mohammed Nihal <57055998+nihal467@users.noreply.github.com>
- Loading branch information
1 parent
0fc5260
commit 14d3ef9
Showing
13 changed files
with
600 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
from rest_framework import serializers | ||
from rest_framework.exceptions import ValidationError | ||
|
||
from care.facility.api.serializers.bed import AssetBedSerializer | ||
from care.facility.models import CameraPreset | ||
from care.users.api.serializers.user import UserBaseMinimumSerializer | ||
|
||
|
||
class CameraPresetSerializer(serializers.ModelSerializer): | ||
id = serializers.UUIDField(source="external_id", read_only=True) | ||
created_by = UserBaseMinimumSerializer(read_only=True) | ||
updated_by = UserBaseMinimumSerializer(read_only=True) | ||
asset_bed = AssetBedSerializer(read_only=True) | ||
|
||
class Meta: | ||
model = CameraPreset | ||
exclude = ( | ||
"external_id", | ||
"deleted", | ||
) | ||
read_only_fields = ( | ||
"created_date", | ||
"modified_date", | ||
"is_migrated", | ||
"created_by", | ||
"updated_by", | ||
) | ||
|
||
def get_asset_bed_obj(self): | ||
return ( | ||
self.instance.asset_bed if self.instance else self.context.get("asset_bed") | ||
) | ||
|
||
def validate_name(self, value): | ||
if CameraPreset.objects.filter( | ||
asset_bed__bed_id=self.get_asset_bed_obj().bed_id, name=value | ||
).exists(): | ||
msg = "Name should be unique. Another preset related to this bed already uses the same name." | ||
raise ValidationError(msg) | ||
return value | ||
|
||
def create(self, validated_data): | ||
validated_data["created_by"] = self.context["request"].user | ||
validated_data["asset_bed"] = self.get_asset_bed_obj() | ||
return super().create(validated_data) | ||
|
||
def update(self, instance, validated_data): | ||
validated_data["updated_by"] = self.context["request"].user | ||
return super().update(instance, validated_data) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
from django.shortcuts import get_object_or_404 | ||
from rest_framework.exceptions import NotFound | ||
from rest_framework.mixins import ListModelMixin | ||
from rest_framework.permissions import IsAuthenticated | ||
from rest_framework.viewsets import GenericViewSet, ModelViewSet | ||
|
||
from care.facility.api.serializers.camera_preset import CameraPresetSerializer | ||
from care.facility.models import CameraPreset | ||
from care.utils.queryset.asset_bed import ( | ||
get_asset_bed_queryset, | ||
get_asset_queryset, | ||
get_bed_queryset, | ||
) | ||
|
||
|
||
class AssetBedCameraPresetViewSet(ModelViewSet): | ||
serializer_class = CameraPresetSerializer | ||
queryset = CameraPreset.objects.all().select_related( | ||
"asset_bed", "created_by", "updated_by" | ||
) | ||
lookup_field = "external_id" | ||
permission_classes = (IsAuthenticated,) | ||
|
||
def get_asset_bed_obj(self): | ||
queryset = get_asset_bed_queryset(self.request.user).filter( | ||
external_id=self.kwargs["assetbed_external_id"] | ||
) | ||
return get_object_or_404(queryset) | ||
|
||
def get_queryset(self): | ||
return super().get_queryset().filter(asset_bed=self.get_asset_bed_obj()) | ||
|
||
def get_serializer_context(self): | ||
context = super().get_serializer_context() | ||
context["asset_bed"] = self.get_asset_bed_obj() | ||
return context | ||
|
||
|
||
class CameraPresetViewSet(GenericViewSet, ListModelMixin): | ||
serializer_class = CameraPresetSerializer | ||
queryset = CameraPreset.objects.all().select_related( | ||
"asset_bed", "created_by", "updated_by" | ||
) | ||
lookup_field = "external_id" | ||
permission_classes = (IsAuthenticated,) | ||
|
||
def get_bed_obj(self, external_id: str): | ||
queryset = get_bed_queryset(self.request.user).filter(external_id=external_id) | ||
return get_object_or_404(queryset) | ||
|
||
def get_asset_obj(self, external_id: str): | ||
queryset = get_asset_queryset(self.request.user).filter(external_id=external_id) | ||
return get_object_or_404(queryset) | ||
|
||
def get_queryset(self): | ||
queryset = super().get_queryset() | ||
if asset_external_id := self.kwargs.get("asset_external_id"): | ||
return queryset.filter( | ||
asset_bed__asset=self.get_asset_obj(asset_external_id) | ||
) | ||
if bed_external_id := self.kwargs.get("bed_external_id"): | ||
return queryset.filter(asset_bed__bed=self.get_bed_obj(bed_external_id)) | ||
raise NotFound |
Oops, something went wrong.