···144144 if not valueset.lookup(code_obj):
145145 raise ValidationError("Invalid code value")
146146147147- pref, created = UserValueSetPreference.objects.get_or_create(
147147+ pref, _ = UserValueSetPreference.objects.get_or_create(
148148 user=user, valueset=valueset, defaults={"favorite_codes": []}
149149 )
150150 favs = pref.favorite_codes
+2-2
care/emr/fhir/resources/base.py
···42424343 def filter(self, *args, **kwargs):
4444 if kwargs:
4545- for key in kwargs:
4545+ for key, value in kwargs.items():
4646 if key in self.allowed_properties:
4747- self._filters[key] = kwargs[key]
4747+ self._filters[key] = value
4848 self.validate_filter()
4949 return self.clone()
5050
···11-from django.conf import settings
22-from django.db import models
33-from django_filters import rest_framework as filters
44-from djqscsv import render_to_csv_response
55-from rest_framework.exceptions import ValidationError
66-77-88-class CSVExportViewSetMixin:
99- """Mixin that adds CSV export functionality to a viewset"""
1010-1111- csv_export_limit = 7
1212- date_range_fields = []
1313-1414- def get_model(self):
1515- """Get model class from viewset's queryset or model attribute"""
1616- if hasattr(self, "queryset"):
1717- return self.queryset.model
1818- if hasattr(self, "model"):
1919- return self.model
2020- msg = (
2121- "Cannot determine model class from viewset, set model or queryset attribute"
2222- )
2323- raise ValueError(msg)
2424-2525- def get_date_range_fields(self):
2626- """Get date range fields from model and filterset"""
2727- if self.date_range_fields:
2828- return self.date_range_fields
2929-3030- model = self.get_model()
3131- date_fields = []
3232-3333- # Get fields from model that are DateField/DateTimeField
3434- for field in model._meta.fields: # noqa: SLF001
3535- if isinstance(field, (models.DateField, models.DateTimeField)):
3636- date_fields.append(field.name)
3737-3838- # Get date range fields from filterset if defined
3939- if hasattr(self, "filterset_class"):
4040- for name, field in self.filterset_class.declared_filters.items():
4141- if isinstance(field, filters.DateFromToRangeFilter):
4242- date_fields.append(name)
4343-4444- return list(set(date_fields))
4545-4646- def get_csv_settings(self):
4747- """Get CSV export configuration from model"""
4848- model = self.get_model()
4949-5050- # Try to get settings from model
5151- annotations = getattr(model, "CSV_ANNOTATE_FIELDS", {})
5252- field_mapping = getattr(model, "CSV_MAPPING", {})
5353- field_serializers = getattr(model, "CSV_MAKE_PRETTY", {})
5454-5555- if not field_mapping:
5656- # Auto-generate field mapping from model fields
5757- field_mapping = {f.name: f.verbose_name.title() for f in model._meta.fields} # noqa: SLF001
5858-5959- fields = list(field_mapping.keys())
6060-6161- return {
6262- "annotations": annotations,
6363- "field_mapping": field_mapping,
6464- "field_serializers": field_serializers,
6565- "fields": fields,
6666- }
6767-6868- def validate_date_ranges(self, request):
6969- """Validates that at least one date range filter is within limits"""
7070- filterset = filters.DjangoFilterBackend().get_filterset(
7171- request, self.queryset, self
7272- )
7373- if not filterset.is_valid():
7474- raise ValidationError(filterset.errors)
7575-7676- within_limits = False
7777- for field in self.get_date_range_fields():
7878- slice_obj = filterset.form.cleaned_data.get(field)
7979- if slice_obj:
8080- if not slice_obj.start or not slice_obj.stop:
8181- raise ValidationError(
8282- {
8383- field: "both starting and ending date must be provided for export"
8484- }
8585- )
8686-8787- days_difference = (
8888- filterset.form.cleaned_data.get(field).stop
8989- - filterset.form.cleaned_data.get(field).start
9090- ).days
9191-9292- if days_difference <= self.csv_export_limit:
9393- within_limits = True
9494- else:
9595- raise ValidationError(
9696- {
9797- field: f"Cannot export more than {self.csv_export_limit} days at a time"
9898- }
9999- )
100100-101101- if not within_limits:
102102- raise ValidationError(
103103- {
104104- "date": f"At least one date field must be filtered to be within {self.csv_export_limit} days"
105105- }
106106- )
107107-108108- def export_as_csv(self, request):
109109- """Exports queryset as CSV"""
110110- self.validate_date_ranges(request)
111111-112112- csv_settings = self.get_csv_settings()
113113- queryset = self.filter_queryset(self.get_queryset())
114114-115115- if csv_settings["annotations"]:
116116- queryset = queryset.annotate(**csv_settings["annotations"])
117117-118118- queryset = queryset.values(*csv_settings["fields"])
119119-120120- return render_to_csv_response(
121121- queryset,
122122- field_header_map=csv_settings["field_mapping"],
123123- field_serializer_map=csv_settings["field_serializers"],
124124- )
125125-126126- def list(self, request, *args, **kwargs):
127127- if settings.CSV_REQUEST_PARAMETER in request.GET:
128128- return self.export_as_csv(request)
129129- return super().list(request, *args, **kwargs)
+2-2
care/utils/models/validators.py
···337337 byte_size = 1024.0
338338 for unit in ["B", "KB"]:
339339 if size < byte_size:
340340- return f"{f"{size:.2f}".rstrip(".0")} {unit}"
340340+ return f"{f'{size:.2f}'.rstrip('.0')} {unit}"
341341 size /= byte_size
342342- return f"{f"{size:.2f}".rstrip(".0")} MB"
342342+ return f"{f'{size:.2f}'.rstrip('.0')} MB"
343343344344345345cover_image_validator = ImageSizeValidator(