Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lazy strings fixed #2668

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open

Conversation

Harsh-D-2004
Copy link
Contributor

@Harsh-D-2004 Harsh-D-2004 commented Dec 21, 2024

Proposed Changes

Added Lazy translations to various strings in help_text , berbose name and validation errors

Associated Issue

#2482
Wrapped string in _()

Merge Checklist

  • Tests added/fixed
  • Update docs in /docs
  • Linting Complete
  • Any other necessary step

Only PR's with test cases included and passing lint and test pipelines will be reviewed

@ohcnetwork/care-backend-maintainers @ohcnetwork/care-backend-admins

Summary by CodeRabbit

  • New Features

    • Added internationalization support for various model fields, enhancing multilingual capabilities.
    • Introduced new models for managing assets, beds, and notifications, improving inventory and resource management.
    • Added multiple fields to existing models for better tracking of patient information and health status.
  • Bug Fixes

    • Updated field definitions to ensure proper data validation and integrity.
  • Documentation

    • Improved help texts and verbose names for better clarity and localization.
  • Refactor

    • Enhanced existing models with new relationships and constraints for better data management.

@Harsh-D-2004 Harsh-D-2004 requested a review from a team as a code owner December 21, 2024 09:57
Copy link

coderabbitai bot commented Dec 21, 2024

📝 Walkthrough

Walkthrough

These migrations represent a comprehensive enhancement of the Django application's data models, focusing on internationalization, data integrity, and expanded functionality. The changes span multiple domains including patient registration, facility management, asset tracking, and consultation workflows. By introducing translation support, adding new models, and refining existing schemas, the migrations demonstrate a systematic approach to evolving the application's data structure.

Changes

File Change Summary
care/contrib/sites/migrations/ Updated Site model's verbose names for internationalization
care/facility/api/serializers/patient_consultation.py Enhanced validation and internationalization for patient consultation serializers
care/facility/migrations/ Multiple migrations adding new models like MedibaseMedicine, AssetAvailabilityRecord, ConsultationBedAsset, and refining existing models

Poem

🏥 Migrations dance, code takes flight
Translations bloom in soft daylight
Models evolve with graceful might
Schemas whisper their delight
Internationalization's bright 🌍

Tip

CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command @coderabbitai generate docstrings to have CodeRabbit automatically generate docstrings for your pull request. We would love to hear your feedback on Discord.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🔭 Outside diff range comments (29)
care/facility/migrations/0458_facilityflag_facilityflag_unique_facility_flag.py (1)

Line range hint 46-59: Almost perfect with the translations...

Since we're implementing lazy translations throughout the codebase, we probably shouldn't forget about the verbose_name in the Meta options.

             options={
-                "verbose_name": "Facility Flag",
+                "verbose_name": _("Facility Flag"),
             },
care/facility/migrations/0462_facilityhubspoke.py (1)

Migration 0462 is not the latest one... which could be a tiny problem

I see migrations up to 0468 in the facility app. This means your migration (0462) should be rebased on top of the latest migration to avoid any potential conflicts that might make everyone's day just a little more interesting.

  • Latest migration is 0468_alter_facilitypatientstatshistory_unique_together_and_more.py
  • Your migration 0462_facilityhubspoke.py should be updated to depend on migration 0468
  • You'll need to modify the dependencies list accordingly
🔗 Analysis chain

Line range hint 11-13: Just checking our migration ordering...

The dependency on migration 0461 looks correct, but let's make sure this is still the latest migration number to avoid any... unfortunate conflicts.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for any other migrations that might conflict
fd -e py . | grep -i "facility/migrations/04.*\.py$" | sort -V

Length of output: 6219

care/facility/migrations_old/0039_auto_20200328_1657.py (1)

Oh dear, someone might want to check on that data... 🙃

After a thorough investigation of the migrations, it appears that migration 0039 removes the medical history fields from PatientRegistration and creates a new MedicalHistory model, but surprisingly doesn't include any data migration strategy. This could lead to the loss of existing patient medical history data, which I'm sure wasn't the intention.

  • The fields medical_history and medical_history_details are removed from PatientRegistration
  • A new MedicalHistory model is created with a foreign key to PatientRegistration
  • No data migration is present to transfer existing data to the new model
🔗 Analysis chain

Line range hint 1-11: Hmm... Where's the data migration plan?

While the migration setup is correct, I notice there's no accompanying data migration to handle existing medical history data. This might lead to data loss when removing the fields from PatientRegistration.

Let's check if there are any other migrations handling this:


The initial results don't show migrations from the relevant time period (0039), and we need to see the complete migration file to understand what fields are being removed and verify if a data migration is truly needed. Let's examine the actual migration content and surrounding migrations.


I see the migration removes medical history fields and creates a new model, but let's verify if there's a data migration nearby or any code that handles the data transfer. The slightly concerning part is that we're removing fields without an obvious data preservation strategy.


I notice there's no obvious data migration in 0039, but let's check the surrounding migrations and tests to be absolutely certain before suggesting that someone might have forgotten about existing patient data. 🙃

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for related data migrations
rg -l "def migrate|PatientRegistration.*medical_history" care/facility/migrations/

Length of output: 518


Script:

#!/bin/bash
# Let's check the content of the migration file to understand the field removal better
cat care/facility/migrations_old/0039_auto_20200328_1657.py

# Also check if there are any data migrations in the same timeframe
fd "00[3-4][0-9].*\.py" care/facility/migrations_old/ --exec cat {}

Length of output: 69330


Script:

#!/bin/bash
# Let's check if there's a data migration in migration 0040 or nearby
fd "00[34][0-9].*\.py" care/facility/migrations_old/ --exec grep -l "def migrate_from_model\|PatientRegistration.*medical_history" {}

# Also check if there are any model instances at the time of migration
ast-grep --pattern 'PatientRegistration.objects.all()'

Length of output: 2021


Script:

#!/bin/bash
# Let's check migration 0040 and surrounding migrations for any data handling
fd "00[34][0-9].*\.py" care/facility/migrations_old/ -x cat {} | grep -A 10 -B 10 "RunPython\|data_migration\|def forward"

# Also check if there are any tests related to this migration
rg "MedicalHistory.*migrate|test.*medical.*history" care/facility/tests/

Length of output: 2405

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0039_auto_20200328_1657'

(N999)

care/facility/migrations_old/0144_patientmobileotp.py (1)

Line range hint 37-47: That phone regex looks... ambitious

While the phone number validation is thorough, it might be too India-specific (^((\\+91|91|0)[\\- ]{0,1})?[456789]\\d{9}$). Consider using a more internationally friendly phone number validation library like django-phonenumber-field if this system might be used globally.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0144_patientmobileotp'

(N999)

care/facility/migrations/0381_merge_ip_op_no.py (1)

Line range hint 8-28: The pagination is nice, but where's the error handling?

While the pagination approach is commendable for handling large datasets, it might be worth adding some basic error handling and progress logging. You know, just in case something goes wrong during those late-night deployments.

Consider adding:

 def merge_ip_op_no(apps, schema_editor):
+    from django.db import transaction
+    from django.db.utils import DataError
     PatientConsultation = apps.get_model("facility", "PatientConsultation")
+    logger = schema_editor.connection.schema_editor().logger

     patients = (
         PatientConsultation.objects.filter(Q(op_no__isnull=False))
         .exclude(op_no="")
         .only("op_no", "patient_no")
         .order_by("id")
     )

     paginator = Paginator(patients, 1000)
     for page_number in paginator.page_range:
-        bulk = []
-        for patient in paginator.page(page_number).object_list:
-            if not patient.op_no.strip():
-                continue
-            if patient.patient_no:
-                patient.patient_no = f"{patient.patient_no} | {patient.op_no}"
-            else:
-                patient.patient_no = patient.op_no
-            bulk.append(patient)
-
-        PatientConsultation.objects.bulk_update(bulk, ["patient_no"])
+        try:
+            with transaction.atomic():
+                bulk = []
+                for patient in paginator.page(page_number).object_list:
+                    if not patient.op_no.strip():
+                        continue
+                    if patient.patient_no:
+                        patient.patient_no = f"{patient.patient_no} | {patient.op_no}"
+                    else:
+                        patient.patient_no = patient.op_no
+                    bulk.append(patient)
+
+                PatientConsultation.objects.bulk_update(bulk, ["patient_no"])
+                logger.info(f"Processed page {page_number}/{paginator.num_pages}")
+        except (DataError, Exception) as e:
+            logger.error(f"Error processing page {page_number}: {str(e)}")
+            raise
care/facility/migrations/0372_assetavailabilityrecord.py (1)

Line range hint 41-53: Status choices should be translatable

I see we're being selective about what gets translated... The status choices could really use some internationalization love too. After all, if we're translating "ID", shouldn't we also translate user-facing strings like "Not Monitored" and "Under Maintenance"?

 status = models.CharField(
     choices=[
-        ("Not Monitored", "Not Monitored"),
-        ("Operational", "Operational"),
-        ("Down", "Down"),
-        ("Under Maintenance", "Under Maintenance"),
+        ("Not Monitored", _("Not Monitored")),
+        ("Operational", _("Operational")),
+        ("Down", _("Down")),
+        ("Under Maintenance", _("Under Maintenance")),
     ],
     default="Not Monitored",
     max_length=20,
+    verbose_name=_("Status"),
 )
care/facility/migrations_old/0074_auto_20200404_2352.py (1)

Line range hint 17-32: Those choice fields are looking a bit... monolingual

The additional_symptoms choices contain hardcoded English strings. These should probably be wrapped with gettext_lazy for internationalization consistency.

 choices=[
-    (1, "ASYMPTOMATIC"),
-    (2, "FEVER"),
-    (3, "SORE THROAT"),
+    (1, _("ASYMPTOMATIC")),
+    (2, _("FEVER")),
+    (3, _("SORE THROAT")),
     # ... other choices
 ],
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0074_auto_20200404_2352'

(N999)

care/facility/migrations_old/0222_auto_20210427_0002.py (1)

Line range hint 56-67: Redundant indexing alert

You're creating both an explicit index and unique_together constraint on (facility, item). Since unique_together creates an implicit index, the explicit index is redundant.

Remove the explicit index since unique_together will handle it:

-        migrations.AddIndex(
-            model_name="facilityinventoryburnrate",
-            index=models.Index(
-                fields=["facility", "item"], name="facility_fa_facilit_e2046a_idx"
-            ),
-        ),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0222_auto_20210427_0002'

(N999)

care/facility/migrations/0408_patientnotesedit.py (1)

Line range hint 9-27: Data migration looks good, but let's be extra careful

The pagination approach is thoughtful, but we might want to add some error handling for robustness. What if something goes wrong mid-migration?

Consider updating the data migration function to handle errors gracefully:

 def create_initial_patient_notes_edit_record(apps, schema_editor):
     PatientNotes = apps.get_model("facility", "PatientNotes")
     PatientNotesEdit = apps.get_model("facility", "PatientNotesEdit")
+    failed_records = []
 
     notes_without_edits = PatientNotes.objects.all().order_by("pk")
     paginator = Paginator(notes_without_edits, 1000)
     for page_number in paginator.page_range:
         edit_records = []
         for patient_note in paginator.page(page_number).object_list:
-            edit_record = PatientNotesEdit(
-                patient_note=patient_note,
-                edited_date=patient_note.created_date,
-                edited_by=patient_note.created_by,
-                note=patient_note.note,
-            )
-            edit_records.append(edit_record)
+            try:
+                edit_record = PatientNotesEdit(
+                    patient_note=patient_note,
+                    edited_date=patient_note.created_date,
+                    edited_by=patient_note.created_by,
+                    note=patient_note.note,
+                )
+                edit_records.append(edit_record)
+            except Exception as e:
+                failed_records.append((patient_note.pk, str(e)))
 
-        PatientNotesEdit.objects.bulk_create(edit_records)
+        try:
+            PatientNotesEdit.objects.bulk_create(edit_records)
+        except Exception as e:
+            failed_records.extend([(r.patient_note.pk, str(e)) for r in edit_records])
+
+    if failed_records:
+        print(f"Failed to migrate {len(failed_records)} records:")
+        for pk, error in failed_records:
+            print(f"PatientNote ID {pk}: {error}")
care/facility/migrations_old/0187_patientexternaltest.py (1)

Line range hint 35-45: Patient data fields could use some additional validation.

Several fields containing sensitive patient information could benefit from additional constraints:

  • mobile_number could use a validator for proper phone number format
  • age could use MinValueValidator
  • gender could use choices instead of free-form CharField

Would you like me to provide the implementation for these validators?

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0187_patientexternaltest'

(N999)

care/facility/migrations_old/0206_notification.py (1)

Line range hint 53-53: caused_object_external_id with default=None seems a bit... interesting.

Using default=None on a TextField might not behave as expected. Consider using null=True, blank=True instead if the field is optional.

-"caused_object_external_id", models.TextField(default=None)),
+"caused_object_external_id", models.TextField(null=True, blank=True)),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0206_notification'

(N999)

care/facility/migrations_old/0003_auto_20200319_1739.py (2)

Line range hint 14-22: Removing fields without data migration? How brave.

The removal of bed_capacity, icu_capacity, and district fields should be accompanied by a data migration to preserve existing data in the new structure.

Would you like me to help create a data migration script to transfer the existing capacity data to the new FacilityCapacity model?

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0003_auto_20200319_1739'

(N999)


Line range hint 27-45: Those district names are looking quite... monolingual.

The district choices should be wrapped in _() for internationalization support, especially since this is a user-facing field.

choices=[
-   (1, "Thiruvananthapuram"),
-   (2, "Kollam"),
+   (1, _("Thiruvananthapuram")),
+   (2, _("Kollam")),
    # ... other districts
]
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0003_auto_20200319_1739'

(N999)

care/facility/migrations_old/0035_auto_20200328_0442.py (1)

Line range hint 26-33: Those choices could use some translation love too, you know...

The suggestion field's choices should also be wrapped with _() for consistency with our internationalization efforts.

 choices=[
-    ("HI", "HOME ISOLATION"),
-    ("A", "ADMISSION"),
-    ("R", "REFERRAL"),
+    ("HI", _("HOME ISOLATION")),
+    ("A", _("ADMISSION")),
+    ("R", _("REFERRAL")),
 ],
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0035_auto_20200328_0442'

(N999)

care/facility/migrations_old/0139_shiftingrequest.py (1)

Line range hint 47-58: Oh dear, more untranslated choices. How unexpected.

The status field's choices should be wrapped with _() for internationalization support.

 choices=[
-    (10, "PENDING"),
-    (20, "APPROVED"),
-    (30, "REJECTED"),
-    (40, "DESTINATION APPROVED"),
-    (50, "DESTINATION REJECTED"),
-    (60, "AWAITING TRANSPORTATION"),
-    (70, "TRANSFER IN PROGRESS"),
-    (80, "COMPLETED"),
+    (10, _("PENDING")),
+    (20, _("APPROVED")),
+    (30, _("REJECTED")),
+    (40, _("DESTINATION APPROVED")),
+    (50, _("DESTINATION REJECTED")),
+    (60, _("AWAITING TRANSPORTATION")),
+    (70, _("TRANSFER IN PROGRESS")),
+    (80, _("COMPLETED")),
 ],
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0139_shiftingrequest'

(N999)

care/facility/migrations_old/0156_auto_20200808_2205.py (1)

Line range hint 44-52: More untranslated choices. I'm sensing a pattern here.

Both scheme and status fields' choices should be wrapped with _() for internationalization support.

 choices=[
-    (10, "GOVERNMENT_SUPPLY"),
-    (30, "DONATION"),
-    (40, "PAID_BY_PATIENT"),
+    (10, _("GOVERNMENT_SUPPLY")),
+    (30, _("DONATION")),
+    (40, _("PAID_BY_PATIENT")),
 ],

 choices=[
-    (10, "PENDING"),
-    (30, "INITIATED"),
-    (40, "COMPLETED"),
-    (50, "DEFERRED"),
+    (10, _("PENDING")),
+    (30, _("INITIATED")),
+    (40, _("COMPLETED")),
+    (50, _("DEFERRED")),
 ],

Also applies to: 54-63

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0156_auto_20200808_2205'

(N999)

care/facility/migrations_old/0044_patientsample_patientsampleflow.py (1)

Line range hint 31-41: Oh, those choice fields could use some translation love

The choice field options are hardcoded strings that would be displayed to users. It would be wonderful if these were translatable.

Consider wrapping the choice strings in _():

 choices=[
-    (1, "REQUEST_SUBMITTED"),
-    (2, "APPROVED"),
-    (3, "DENIED"),
+    (1, _("REQUEST_SUBMITTED")),
+    (2, _("APPROVED")),
+    (3, _("DENIED")),
     # ... other choices
 ]

Also applies to: 47-54

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0044_patientsample_patientsampleflow'

(N999)

care/facility/migrations_old/0258_auto_20210623_1742.py (1)

Line range hint 21-35: Those room types look awfully... untranslatable

The room type choices contain user-facing descriptions that should be translatable, especially considering they represent different types of medical facilities.

Consider wrapping the room type descriptions in _():

 choices=[
-    (0, "Total"),
-    (2, "Hostel"),
-    (3, "Single Room with Attached Bathroom"),
+    (0, _("Total")),
+    (2, _("Hostel")),
+    (3, _("Single Room with Attached Bathroom")),
     # ... other choices
 ]

This change should be applied to all three instances of the room_type choices (facilitycapacity, historicalfacilitycapacity, and room models).

Also applies to: 39-53, 57-71

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0258_auto_20210623_1742'

(N999)

care/facility/migrations_old/0030_auto_20200327_0619.py (1)

Line range hint 171-182: The constraint condition might not behave as intended.

The current condition:

condition=models.Q(
    ("local_body__isnull", False),
    ("district__isnull", False),
    _connector="OR",
)

requires at least one field to be NOT NULL. However, based on the model structure and field definitions, it seems the intention was to prevent both fields from being NULL simultaneously.

Consider updating the condition to:

condition=models.Q(
-   ("local_body__isnull", False),
-   ("district__isnull", False),
+   models.Q(local_body__isnull=False) | models.Q(district__isnull=False),
    _connector="OR",
)
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0030_auto_20200327_0619'

(N999)

care/facility/migrations_old/0048_auto_20200330_0433.py (1)

Line range hint 41-45: Those gender choices look awfully untranslated.

The gender choices are hardcoded strings that should probably be marked for translation:

 "gender",
 models.IntegerField(
     choices=[
-        (1, "Male"),
-        (2, "Female"),
-        (3, "Non-binary")
+        (1, _("Male")),
+        (2, _("Female")),
+        (3, _("Non-binary"))
     ],
 ),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0048_auto_20200330_0433'

(N999)

care/facility/migrations_old/0067_auto_20200402_1841.py (2)

Line range hint 54-65: Oh, look who decided to use the same value for both 'RECOVERED' and 'EXPIRED' states.

There's a critical issue in the disease_status choices where both 'RECOVERED' and 'EXPIRED' use the value 5. This would make it impossible to distinguish between these two very different patient states.

Apply this fix to both PatientRegistration and HistoricalPatientRegistration models:

 choices=[
     (1, "SUSPECTED"),
     (2, "POSITIVE"),
     (3, "NEGATIVE"),
     (4, "RECOVERY"),
     (5, "RECOVERED"),
-    (5, "EXPIRED"),
+    (6, "EXPIRED"),
 ],

Also applies to: 134-145


Line range hint 54-65: While we're at it, these disease status labels could use some translation love too.

The disease status choices should be marked for translation to maintain consistency with other translated strings.

 choices=[
-    (1, "SUSPECTED"),
-    (2, "POSITIVE"),
-    (3, "NEGATIVE"),
-    (4, "RECOVERY"),
-    (5, "RECOVERED"),
-    (6, "EXPIRED"),
+    (1, _("SUSPECTED")),
+    (2, _("POSITIVE")),
+    (3, _("NEGATIVE")),
+    (4, _("RECOVERY")),
+    (5, _("RECOVERED")),
+    (6, _("EXPIRED")),
 ],

Also applies to: 134-145

care/facility/migrations_old/0217_investigationsession_investigationvalue_patientinvestigation_patientinvestigationgroup.py (1)

Line range hint 94-104: Interesting choice of field types there

The PatientInvestigation model allows for "String" and "Choice" investigation types, but InvestigationValue.value is strictly a FloatField. I'm sure there's a perfectly good explanation for this, but perhaps we should consider making the value field more... flexible?

Consider using a TextField with validation instead:

-value = models.FloatField(blank=True, default=None, null=True)
+value = models.TextField(blank=True, default=None, null=True)

Also applies to: 122-134

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0217_investigationsession_investigationvalue_patientinvestigation_patientinvestigationgroup'

(N999)

care/facility/migrations/0466_camera_presets.py (1)

Line range hint 35-39: That bare except clause is... interesting.

The silent error handling in the position parsing could mask important migration failures. Consider logging these errors or at least counting them.

-                    except:
-                        pass
+                    except Exception as e:
+                        print(f"Failed to migrate preset for asset_bed {asset_bed.id}: {str(e)}")
care/facility/migrations_old/0018_ambulance_ambulancedriver.py (1)

Line range hint 124-126: Those hardcoded years will age like milk.

The insurance_valid_till_year choices are hardcoded to 2020-2022, which is... not ideal for long-term maintenance.

Consider using a dynamic range based on the current year:

def get_year_choices():
    current_year = datetime.datetime.now().year
    return [(year, year) for year in range(current_year, current_year + 3)]
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0018_ambulance_ambulancedriver'

(N999)

care/facility/migrations_old/0115_auto_20200611_1336.py (1)

Line range hint 77-82: Add validation for the multiplier field

The multiplier field in FacilityInventoryUnitConverter should probably have some validation to prevent zero or negative values. You wouldn't want someone converting units with a multiplier of zero, would you? 😏

-    multiplier = models.FloatField()
+    multiplier = models.FloatField(
+        validators=[
+            models.validators.MinValueValidator(
+                limit_value=0.0001,
+                message=_("Multiplier must be greater than 0")
+            )
+        ]
+    )
care/facility/migrations_old/0255_asset_assetlocation_assettransaction_facilitydefaultassetlocation_userdefaultassetlocation.py (2)

Line range hint 208-246: Fix the is_working field definition

A BooleanField with default=None is quite... unique. Perhaps we should make this more explicit?

-    is_working = models.BooleanField(default=None)
+    is_working = models.BooleanField(null=True, default=None)

Or better yet:

-    is_working = models.BooleanField(default=None)
+    status = models.CharField(
+        max_length=20,
+        choices=[
+            ('WORKING', _('Working')),
+            ('NOT_WORKING', _('Not Working')),
+            ('UNDER_MAINTENANCE', _('Under Maintenance')),
+        ],
+        default='WORKING'
+    )

Line range hint 155-190: Add validation for asset transaction locations

The model allows setting the same location for both from_location and to_location. I'm sure no one would do that intentionally, but...

Consider adding a model-level validation:

def clean(self):
    if self.from_location_id == self.to_location_id:
        raise ValidationError(
            _('Source and destination locations cannot be the same')
        )
care/facility/migrations_old/0071_auto_20200404_1737.py (1)

Line range hint 17-26: Looks like someone forgot about the choice strings...

While you've nicely translated the verbose_name, the choice strings ("SUSPECTED", "POSITIVE", etc.) are still hardcoded. These should probably be wrapped in _() for consistency, unless there's some mysterious reason they shouldn't be?

 choices=[
-    (1, "SUSPECTED"),
-    (2, "POSITIVE"),
-    (3, "NEGATIVE"),
-    (4, "RECOVERY"),
-    (5, "RECOVERED"),
-    (6, "EXPIRED"),
+    (1, _("SUSPECTED")),
+    (2, _("POSITIVE")),
+    (3, _("NEGATIVE")),
+    (4, _("RECOVERY")),
+    (5, _("RECOVERED")),
+    (6, _("EXPIRED")),
 ],

Also applies to: 34-43

🧹 Nitpick comments (61)
care/facility/migrations/0439_encounter_symptoms.py (2)

151-151: Consider using a more descriptive verbose name.

While lazy translation of "ID" is valid, you might want to use a more user-focused label. "ID" is typically not user-facing in many UIs, and if it is displayed, a more friendly or domain-specific wording (e.g. "Encounter ID") could be helpful to end users.


255-255: Revisit the wording in the help text.

You've properly wrapped the help text with gettext_lazy for translation, which is commendable. However, the phrase "This field is to throw caution to data..." might feel slightly confusing or unclear, especially for non-native speakers or new contributors. Consider rephrasing it to something more straightforward to enhance usability.

care/facility/migrations_old/0167_auto_20200830_1121.py (1)

17-17: Consider optimizing the ward field configuration.

While the translation implementation is correct, there might be room for improvement in the field configuration:

  1. An empty string default might not be the most semantic choice for a ward identifier
  2. The max_length of 255 seems... generous for a ward name
  3. Consider adding db_index=True if this field will be frequently searched

Perhaps something like this might be more appropriate:

field=models.CharField(
-    default="", max_length=255, verbose_name=_("Ward of Patient")
+    default=None, max_length=100, verbose_name=_("Ward of Patient"),
+    db_index=True, null=True, blank=True
)

Also applies to: 24-24

care/facility/migrations_old/0050_dailyround.py (1)

1-1: Consider extending translations to other user-facing fields... if you don't mind.

While you've nicely added translation for the ID field, perhaps we could also wrap other user-facing strings in _() for consistency? Fields like temperature, physical_examination_info, and other_details might benefit from translated verbose_names and help_text.

                ("temperature", models.DecimalField(decimal_places=2, max_digits=5)),
+               ("temperature", models.DecimalField(
+                   decimal_places=2,
+                   max_digits=5,
+                   verbose_name=_("Temperature"),
+                   help_text=_("Patient's body temperature")
+               )),

Also applies to: 23-23

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0050_dailyround'

(N999)

care/facility/migrations/0458_facilityflag_facilityflag_unique_facility_flag.py (1)

Line range hint 1-13: I see we're being a bit casual with our import organization...

While it works, it would be slightly more elegant to group the gettext_lazy import with other Django imports. Just saying.

-from django.utils.translation import gettext_lazy as _
# Generated by Django 4.2.10 on 2024-09-19 12:58

import uuid

import django.db.models.deletion
from django.db import migrations, models
+from django.utils.translation import gettext_lazy as _
care/facility/migrations_old/0274_auto_20210910_1647.py (1)

17-17: The verbose_name could use a tiny improvement... if you don't mind.

While the translation implementation is correct, the text could be more polished:

  • There's an unnecessary space before the question mark
  • The capitalization is inconsistent
  • The text could be more concise

Consider this slightly better version:

-verbose_name=_("Does the patient require Prenatal Care ?")
+verbose_name=_("Does Patient Need Prenatal Care?")

Also applies to: 24-24

care/facility/migrations_old/0134_auto_20200713_1756.py (1)

Line range hint 14-32: Perhaps consider making the choices a bit more... user-friendly?

While the implementation is correct, the display values for blood groups could be more readable. For instance, "UNKNOWN" could be more user-friendly as "Unknown".

Consider this minor enhancement:

                 choices=[
                     ("A+", "A+"),
                     ("A-", "A-"),
                     ("B+", "B+"),
                     ("B-", "B-"),
                     ("AB+", "AB+"),
                     ("AB-", "AB-"),
                     ("O+", "O+"),
                     ("O-", "O-"),
-                    ("UNK", "UNKNOWN"),
+                    ("UNK", _("Unknown")),
                 ],
care/facility/migrations/0462_facilityhubspoke.py (2)

1-1: Oh, I see we're selectively choosing what to translate...

While it's great that we're translating the "ID" verbose name, perhaps we could also consider translating the relationship choices ("Regular Hub", "Tele ICU Hub") since we're already importing gettext_lazy? Just a thought... 💭

                    "relationship",
                    models.IntegerField(
-                       choices=[(1, "Regular Hub"), (2, "Tele ICU Hub")], default=1
+                       choices=[(1, _("Regular Hub")), (2, _("Tele ICU Hub"))], default=1
                    ),

Also applies to: 26-26


Line range hint 28-42: The field configuration looks almost perfect...

Excellent use of indexes and proper field configurations. The timestamps, UUID, and boolean fields are all set up correctly. I'm sure you were just about to add some docstrings to document what these relationship types mean, right?

Consider adding a docstring to the model class to explain the relationship types and their use cases.

care/facility/migrations_old/0039_auto_20200328_1657.py (3)

Line range hint 36-43: Those choices look a bit... rigid

The hardcoded disease choices might be better placed in a separate choices class or enum. Also, "NO" as a disease choice seems a bit peculiar, doesn't it? 🤔

Consider moving these choices to a separate class in models.py:

class DiseaseChoices(models.TextChoices):
    NONE = "NONE", _("None")
    DIABETES = "DIABETES", _("Diabetes")
    HEART_DISEASE = "HEART", _("Heart Disease")
    HYPERTENSION = "HYPERTENSION", _("Hypertension")
    KIDNEY_DISEASE = "KIDNEY", _("Kidney Diseases")
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0039_auto_20200328_1657'

(N999)


31-31: LGTM on the translation, but...

The ID field translation looks good, aligning with the PR's objective of implementing lazy translations.

While we're at it, shouldn't we also wrap those disease choices in _() for consistency? Just saying... 😊


Line range hint 44-54: The relationship setup looks solid

The ForeignKey relationship with CASCADE deletion is properly configured. However, you might want to consider adding an index to improve query performance since this will likely be frequently accessed.

Consider adding db_index=True to the patient field:

     "patient",
     models.ForeignKey(
         on_delete=django.db.models.deletion.CASCADE,
         related_name="medical_history",
+        db_index=True,
         to="facility.PatientRegistration",
     ),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0039_auto_20200328_1657'

(N999)

care/facility/migrations_old/0126_auto_20200626_0156.py (1)

17-17: Perhaps consider rewording the translation string?

The current translation string "Patient's Known Allergies" uses a possessive form which might be challenging to translate correctly in some languages. Consider using "Known Patient Allergies" instead for better internationalization support.

Also applies to: 24-24

care/facility/migrations_old/0173_auto_20200903_1625.py (1)

17-17: The verbose_name could be more concise

The current translation string "Is Patient a Migrant Worker" could be shortened to "Migrant Worker" since it's already clear this is a boolean field about the patient. This would make translations simpler and more maintainable.

Also applies to: 24-24

care/facility/migrations_old/0073_auto_20200404_2303.py (2)

17-17: Another verbose translation string that could be simplified

Following the same pattern as the previous file, "Is the Patient a Medical Worker" could be shortened to "Medical Worker". Also, maintaining consistency with the migrant worker field's format would be lovely.

Also applies to: 24-24


1-1: Consider creating translation string guidelines

I notice we're implementing lazy translations across multiple migrations, which is great! However, the verbose_name formats are a bit inconsistent. Perhaps we could establish some guidelines for translation string formats? Just a thought...

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0073_auto_20200404_2303'

(N999)

care/facility/migrations_old/0130_auto_20200706_1946.py (2)

17-17: That space before the question mark is... unique

While the translation implementation is correct, there's an unnecessary space before the question mark in the verbose_name. In English, question marks don't have preceding spaces.

Consider this minor improvement:

-                default=False, verbose_name=_("Does the patient require Prenatal Care ?")
+                default=False, verbose_name=_("Does the patient require Prenatal Care?")

Also applies to: 24-24


Line range hint 28-35: Shouldn't these choices be translatable too?

The choices for s_type field aren't wrapped in translation calls. If we're going for internationalization, might as well be thorough about it.

Consider updating the choices like this:

                 choices=[
-                    ("FacilityCapacity", "FacilityCapacity"),
-                    ("PatientSummary", "PatientSummary"),
+                    ("FacilityCapacity", _("FacilityCapacity")),
+                    ("PatientSummary", _("PatientSummary")),
                 ],
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0130_auto_20200706_1946'

(N999)

care/facility/migrations_old/0174_auto_20200903_1836.py (1)

17-17: Inconsistent capitalization in verbose names

The verbose names have inconsistent capitalization - "Is Patient" vs "Blood". While the translations are properly implemented, it would be slightly more professional to maintain consistent capitalization.

Consider updating to:

-verbose_name=_("Is Patient fit for donating Blood")
+verbose_name=_("Is patient fit for donating blood")
-verbose_name=_("Is Patient Willing to donate Blood")
+verbose_name=_("Is patient willing to donate blood")

Also applies to: 24-24, 31-31, 38-38

care/facility/migrations/0408_historicalpatientregistration_date_of_delivery_and_more.py (1)

17-17: Consider adding date validation constraints

While the internationalization is implemented correctly, it might be helpful to add some basic date validation. For instance, date_of_delivery should probably not be in the past for new registrations, and last_menstruation_start_date should have a reasonable date range.

Consider adding validators to the model fields:

from django.core.validators import MinValueValidator
from datetime import date

# Add to field definition:
validators=[MinValueValidator(limit_value=date(2020, 1, 1))]

Also applies to: 24-24, 31-31, 38-38

care/contrib/sites/migrations/0001_initial.py (1)

Line range hint 33-39: Model options could use translations too

While you've thoughtfully added translations for field verbose names, the model options still contain untranslated strings. Though this is a Django core migration, since we're already modifying it...

Consider updating the options:

options={
    "ordering": ("domain",),
    "db_table": "django_site",
-   "verbose_name": "site",
-   "verbose_name_plural": "sites",
+   "verbose_name": _("site"),
+   "verbose_name_plural": _("sites"),
},
care/facility/migrations_old/0215_auto_20210130_2236.py (1)

17-17: The verbose name could be a tad more concise, don't you think?

While the translation is properly implemented, "Is the Patient Vaccinated Against COVID-19" is quite verbose. Consider something shorter like "COVID-19 Vaccination Status" which would be more consistent with other field names.

Also applies to: 24-24

care/facility/migrations_old/0066_auto_20200402_1806.py (1)

18-18: Oh look, more delightfully long verbose names

The translations are implemented correctly, but these verbose names are quite... verbose. Consider:

  • "Number of people aged above 60 living with the patient" → "Senior Dependents (60+)"
  • "Number of people who have chronic diseases living with the patient" → "Chronically Ill Dependents"

Not that the current ones are wrong, they're just... enthusiastically descriptive.

Also applies to: 26-26, 34-34, 42-42

care/facility/migrations_old/0034_facilitypatientstatshistory.py (1)

Line range hint 26-39: Consider adding help_text for these numeric fields

While the field names are clear enough, adding translated help_text might be helpful for explaining:

  • What counts as a "visit"
  • The criteria for "home quarantine" vs "isolation"
  • The referral process

Not that users would read it anyway, but it's good practice.

care/facility/migrations/0415_consultationclinician_and_more.py (1)

Line range hint 1-47: The migration structure looks solid, I suppose

The ConsultationClinician model and its relationships are well-designed:

  • PROTECT on delete (prevents orphaned records)
  • Proper M2M relationship through the intermediate model
  • Appropriate related_name for reverse lookups

Though, you might want to consider adding indexes for performance, since this will likely be queried frequently.

care/facility/migrations_old/0144_patientmobileotp.py (1)

Line range hint 48-48: The OTP field could use some constraints

The OTP field is defined rather loosely. Consider adding:

  • Min/max length validation
  • Numeric-only validation
  • Perhaps even encryption for sensitive data
-("otp", models.CharField(max_length=10)),
+("otp", models.CharField(
+    max_length=6,
+    validators=[
+        django.core.validators.MinLengthValidator(6),
+        django.core.validators.RegexValidator(
+            regex='^[0-9]+$',
+            message='OTP must contain only numbers'
+        )
+    ]
+)),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0144_patientmobileotp'

(N999)

care/facility/migrations_old/0155_auto_20200805_2312.py (1)

Line range hint 15-28: Those choices look awfully... untranslated

While you've made a commendable effort to translate the verbose names, you might want to consider translating the choice labels as well. Also, these choices would be more maintainable as an Enum class.

Consider something like:

choices=[
-    (10, "PENDING"),
-    (30, "SPECIALIST_REQUIRED"),
+    (10, _("PENDING")),
+    (30, _("SPECIALIST_REQUIRED")),
     # ... other choices
]

Also applies to: 38-51

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0155_auto_20200805_2312'

(N999)

care/facility/migrations_old/0086_auto_20200412_1313.py (1)

Line range hint 16-49: The model structure looks good, but...

The FacilityUser model and its relationships are well-defined. Though, it wouldn't hurt to add some class-level documentation explaining the purpose of this through model... you know, for those who come after us.

Consider adding:

class FacilityUser:
    """Through model managing the many-to-many relationship between facilities and users."""
care/facility/migrations/0378_consultationbedasset_consultationbed_assets.py (1)

Line range hint 41-52: Consider adding verbose names for relationship fields

While you're in the internationalization mood, perhaps consider adding translated verbose names for the asset and consultation_bed foreign key fields? It would make the admin interface slightly more... professional.

 asset = models.ForeignKey(
     on_delete=django.db.models.deletion.PROTECT,
-    to="facility.asset"
+    to="facility.asset",
+    verbose_name=_("Asset")
 )
care/facility/migrations_old/0254_patientnotes.py (1)

Line range hint 40-41: Consider translating the note field attributes

While we're making things internationalization-friendly, perhaps the note field could use some attention too?

-note = models.TextField(blank=True, default="")
+note = models.TextField(
+    verbose_name=_("Note"),
+    help_text=_("Patient-related notes and observations"),
+    blank=True,
+    default=""
+)
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0254_patientnotes'

(N999)

care/facility/migrations_old/0118_auto_20200616_1051.py (1)

28-28: Nice attempt at internationalization, but let's be thorough

While you've internationalized the ID field's verbose name, there might be other user-facing strings in this model that could benefit from translation.

care/facility/migrations_old/0222_auto_20210427_0002.py (1)

Line range hint 35-36: Float fields for inventory tracking

Using FloatField for burn_rate and current_stock might lead to precision issues. Consider using DecimalField for more accurate inventory tracking.

-                ("burn_rate", models.FloatField(default=0)),
-                ("current_stock", models.FloatField(default=0)),
+                ("burn_rate", models.DecimalField(max_digits=10, decimal_places=2, default=0)),
+                ("current_stock", models.DecimalField(max_digits=10, decimal_places=2, default=0)),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0222_auto_20210427_0002'

(N999)

care/facility/migrations_old/0184_auto_20200925_2353.py (1)

19-19: Lovely start with the translations, but let's not forget our test_type choices

While you've diligently added lazy translations for the verbose names (which is great!), I couldn't help but notice that the test_type choices are still using hardcoded strings. Perhaps we should make those translatable too?

Consider updating the test_type choices like this:

     field=models.IntegerField(
         choices=[
-            (10, "UNK"),
-            (20, "ANTIGEN"),
-            (30, "RTPCR"),
-            (40, "CBNAAT"),
-            (50, "TRUENAT"),
+            (10, _("UNK")),
+            (20, _("ANTIGEN")),
+            (30, _("RTPCR")),
+            (40, _("CBNAAT")),
+            (50, _("TRUENAT")),
         ],
         default=10,
     ),

Also applies to: 42-42, 51-51, 74-74

care/facility/migrations/0366_medibasemedicine_and_more.py (1)

24-24: Oh, those medicine type choices could use some translation love too

While the ID field is properly translated, the medicine type choices seem to be feeling a bit left out of the internationalization party. Also, might want to consider using uppercase for the display values to match the enum-like nature of the choices.

Consider updating the type field choices like this:

     type=models.CharField(
         choices=[
-            ("BRAND", "brand"),
-            ("GENERIC", "generic")
+            ("BRAND", _("BRAND")),
+            ("GENERIC", _("GENERIC"))
         ],
         db_index=True,
         max_length=16,
     ),

Also applies to: 41-46

care/facility/migrations/0408_patientnotesedit.py (1)

48-48: The model structure looks solid, but...

The model fields and relationships are well-defined, but I notice we're using PROTECT for edited_by and CASCADE for patient_note. While this is probably intentional, it might be worth documenting why we chose different deletion strategies.

Consider adding a comment explaining the deletion strategy choices:

     edited_by = models.ForeignKey(
         on_delete=django.db.models.deletion.PROTECT,  # Prevent user deletion to maintain edit history
         to=settings.AUTH_USER_MODEL,
     )
     patient_note = models.ForeignKey(
         on_delete=django.db.models.deletion.CASCADE,  # Remove edits when the original note is deleted
         related_name="edits",
         to="facility.patientnotes",
     )

Also applies to: 51-67

care/facility/migrations_old/0212_auto_20201223_1617.py (1)

Line range hint 18-29: Perhaps consider using an Enum class for event choices?

While the current implementation works just fine, using an IntegerField with magic numbers isn't exactly... elegant. A proper Enum class would make the code more maintainable and type-safe.

from enum import IntEnum

class NotificationEvent(IntEnum):
    MESSAGE = 0
    PATIENT_CREATED = 20
    PATIENT_UPDATED = 30
    # ... and so on
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0212_auto_20201223_1617'

(N999)

care/facility/migrations_old/0187_patientexternaltest.py (1)

26-26: Looks good, though I suppose we're doing the bare minimum with translations here.

The verbose_name=_("ID") implementation is correct, but there are other user-facing strings in this model that could benefit from translation support.

Consider wrapping other user-facing strings in _(), such as field choices and error messages, if any are added later.

care/facility/migrations_old/0206_notification.py (1)

27-27: The ID translation is there, but what about all those lovely event choices?

While verbose_name=_("ID") is implemented correctly, the event type and event choices should also be wrapped in _() for proper internationalization.

Consider updating the choices to include translations:

event_type = models.IntegerField(
    choices=[
        (50, _("SYSTEM_GENERATED")),
        (100, _("CUSTOM_MESSAGE"))
    ],
    default=50,
)
care/facility/migrations_old/0003_auto_20200319_1739.py (1)

Line range hint 71-75: Room types could use some translation love too.

The room type choices should also be wrapped in _() for consistency with our internationalization efforts.

choices=[
-   (1, "Normal"),
-   (10, "ICU"),
-   (20, "ICCU")
+   (1, _("Normal")),
+   (10, _("ICU")),
+   (20, _("ICCU"))
]
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0003_auto_20200319_1739'

(N999)

care/facility/migrations_old/0156_auto_20200808_2205.py (1)

Line range hint 19-22: A JSONField with a default dict... interesting choice.

While using default=dict works, it's worth noting that this might lead to shared state issues in certain scenarios. Consider using a callable instead:

-    field=django.contrib.postgres.fields.jsonb.JSONField(default=dict),
+    field=django.contrib.postgres.fields.jsonb.JSONField(default=dict),

Though in this case, since it's a migration file and the default is only used during migration, it's acceptable as is.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0156_auto_20200808_2205'

(N999)

care/facility/migrations_old/0022_patientregistration_patientteleconsultation.py (1)

26-26: Translations implemented correctly, though some terms could use standardization

The translation implementations for ID fields and medical-related fields are technically correct. However, I notice we're using different forms of "Covid19" (sometimes with a space, sometimes without) across the codebase. Perhaps we could be a tiny bit more consistent?

Consider standardizing "Covid19" to "COVID-19" across all translations:

-verbose_name=_("Contact with a Covid19 carrier")
+verbose_name=_("Contact with a COVID-19 carrier")

Also applies to: 46-46, 67-67, 93-93

care/facility/migrations_old/0058_auto_20200401_1820.py (2)

31-31: Translations and encryption look good, though some strings are... interesting

The implementation of translations and encrypted fields is correct. However, I notice a few things that could use some attention:

  1. The verbose name "Travelled to Any Foreign Countries in the last 28 Days" is quite... verbose. Perhaps we could make it more concise?
  2. "SARI" is in all caps but isn't marked as an acronym in the translation string. I'm sure future translators will totally know what it means.

Consider these improvements:

-verbose_name=_("Travelled to Any Foreign Countries in the last 28 Days")
+verbose_name=_("Foreign travel in past 28 days")

-verbose_name=_("Does the Patient Suffer from SARI")
+verbose_name=_("Does the patient have Severe Acute Respiratory Infection (SARI)")

Also applies to: 38-38, 55-55, 63-63, 80-80, 87-87, 104-104, 112-112


1-1: Ensure translation strings are documented

While we're adding all these lovely translations, it might be slightly helpful to add a comment explaining what SARI means in the code. You know, for those rare moments when someone actually reads the code.

Add a comment above the SARI-related fields:

# SARI: Severe Acute Respiratory Infection - A condition monitored for COVID-19 surveillance
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0058_auto_20200401_1820'

(N999)

care/facility/migrations_old/0260_auto_20210710_1742.py (1)

Line range hint 83-106: JSON Schema strings should probably be translatable too

The JSON schema contains user-facing strings that should be translatable.

Consider defining the schema with translatable strings:

 {
     "$schema": "http://json-schema.org/draft-07/schema#",
     "items": [
         {
             "properties": {
-                "site": {"type": "string"},
+                "site": {
+                    "type": "string",
+                    "title": _("Site Location")
+                },
                 "start_date": {
                     "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)((-(\\d{2}):(\\d{2})|Z)?)$",
-                    "type": "string"
+                    "type": "string",
+                    "title": _("Start Date")
                 },
             },
         }
     ],
 }
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0260_auto_20210710_1742'

(N999)

care/facility/migrations_old/0001_initial.py (1)

Line range hint 67-86: Wouldn't it be nice if the district names were translatable too?

While you've done a lovely job adding translations for the ID fields, the district choices are still hardcoded strings. Consider wrapping these in _() for consistency.

 choices=[
-    (1, "Thiruvananthapuram"),
-    (2, "Kollam"),
+    (1, _("Thiruvananthapuram")),
+    (2, _("Kollam")),
     # ... other districts
 ]
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0001_initial'

(N999)

care/facility/migrations_old/0279_auto_20211122_1138.py (2)

Line range hint 89-101: Oh, look who forgot to translate the bed types...

For consistency with other internationalization efforts, the bed_type choices should also be translatable.

 choices=[
-    (1, "ISOLATION"),
-    (2, "ICU"),
+    (1, _("ISOLATION")),
+    (2, _("ICU")),
     # ... other bed types
 ]
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0279_auto_20211122_1138'

(N999)


Line range hint 52-55: The location types could use some translation love too

The location_type choices should be translatable for consistency.

-choices=[(1, "OTHER"), (10, "ICU")], default=1
+choices=[(1, _("OTHER")), (10, _("ICU"))], default=1
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0279_auto_20211122_1138'

(N999)

care/facility/migrations/0413_eventtype_patientconsultationevent_and_more.py (2)

Line range hint 82-92: Someone missed a spot with the translations...

The change_type choices should be translatable for consistency with other internationalization efforts.

 choices=[
-    ("CREATED", "Created"),
-    ("UPDATED", "Updated"),
-    ("DELETED", "Deleted"),
+    ("CREATED", _("Created")),
+    ("UPDATED", _("Updated")),
+    ("DELETED", _("Deleted")),
 ]

Line range hint 146-152: That index name could be a bit more descriptive

The current index name facility_pa_consult_7b22fe_idx is auto-generated and not very descriptive. Consider using a more meaningful name that indicates its purpose.

-name="facility_pa_consult_7b22fe_idx",
+name="idx_patient_consultation_latest",
care/facility/migrations_old/0217_investigationsession_investigationvalue_patientinvestigation_patientinvestigationgroup.py (1)

Line range hint 31-31: Missing db_index on timestamp fields

The created_date and modified_date fields don't have db_index=True. Not a huge deal, but these fields are often used for filtering and sorting, so indexing them might be helpful. Just saying.

-"created_date", models.DateTimeField(auto_now_add=True, null=True)),
+"created_date", models.DateTimeField(auto_now_add=True, db_index=True, null=True)),
-"modified_date", models.DateTimeField(auto_now=True, null=True)),
+"modified_date", models.DateTimeField(auto_now=True, db_index=True, null=True)),

Also applies to: 57-57, 83-83

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0217_investigationsession_investigationvalue_patientinvestigation_patientinvestigationgroup'

(N999)

care/facility/migrations/0466_camera_presets.py (1)

Line range hint 101-124: The JSON schema could be a bit more... precise.

While the schema validates the basic structure, it might be worth adding some constraints on the numeric values (min/max bounds for zoom, coordinate ranges).

     "properties": {
-        "x": {"type": "number"},
-        "y": {"type": "number"},
-        "zoom": {"type": "number"},
+        "x": {"type": "number", "minimum": -180, "maximum": 180},
+        "y": {"type": "number", "minimum": -90, "maximum": 90},
+        "zoom": {"type": "number", "minimum": 0, "maximum": 100},
     },
care/facility/migrations_old/0085_auto_20200412_0116.py (1)

154-159: The help text could be a bit more... eloquent.

While the translations are properly implemented, the help text "While in contact, did the patient showing symptoms" has a grammatical error.

-                        help_text=_("While in contact, did the patient showing symptoms")
+                        help_text=_("Was the patient showing symptoms during contact?")
care/facility/migrations_old/0018_ambulance_ambulancedriver.py (1)

Line range hint 33-43: The vehicle number validation message could be more helpful.

While the regex pattern is correct, the error message could provide more examples for better user guidance.

-                                message="Please Enter the vehicle number in all uppercase without spaces, eg: KL13AB1234",
+                                message="Please enter the vehicle number in uppercase without spaces (e.g., KL13AB1234, MH02CD5678)",
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0018_ambulance_ambulancedriver'

(N999)

care/facility/migrations_old/0115_auto_20200611_1336.py (1)

Line range hint 150-159: Add a default value for is_incoming field

The is_incoming field lacks a default value. I mean, I'm sure you have your reasons, but it might be nice to have a default value to prevent confusion. 🤔

-    is_incoming = models.BooleanField()
+    is_incoming = models.BooleanField(default=False)
care/facility/migrations_old/0241_auto_20210519_0115.py (2)

Line range hint 47-57: Consider making phone number validation more flexible

The phone number validation regex seems a bit... specific to India. Not that there's anything wrong with that, but maybe we should consider making it more internationally friendly?

-                regex="^((\\+91|91|0)[\\- ]{0,1})?[456789]\\d{9}$",
+                regex="^\\+?[1-9]\\d{1,14}$",  # E.164 format
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0241_auto_20210519_0115'

(N999)


Line range hint 58-71: Consider using Django's TextChoices for status field

Those magic numbers for status choices are... interesting. Perhaps we could make them a bit more maintainable?

class ResourceRequestStatus(models.TextChoices):
    PENDING = 'PENDING', _('Pending')
    ON_HOLD = 'ON_HOLD', _('On Hold')
    APPROVED = 'APPROVED', _('Approved')
    # ... other statuses

Then use it like:

-    status = models.IntegerField(
-        choices=[
-            (10, "PENDING"),
-            (15, "ON HOLD"),
-            # ...
-        ],
-        default=10,
-    )
+    status = models.CharField(
+        max_length=20,
+        choices=ResourceRequestStatus.choices,
+        default=ResourceRequestStatus.PENDING,
+    )
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0241_auto_20210519_0115'

(N999)

care/facility/migrations_old/0186_auto_20200926_0001.py (1)

19-19: Perhaps consider a more concise field label?

While the translation implementation is correct, "Is Patient fit for donating Blood" is a bit wordy. Something like "Eligible Blood Donor" might be more elegant... but I suppose it works as is.

-verbose_name=_("Is Patient fit for donating Blood"),
+verbose_name=_("Eligible Blood Donor"),

Also applies to: 28-28

care/facility/migrations_old/0100_auto_20200418_2315.py (1)

19-19: Identical labels for different fields might be a tad confusing...

Using the same verbose_name "_("Countries Patient has Travelled to")" for both the new JSONField and the old TextField might be slightly confusing for administrators. Perhaps the old field's label could indicate its deprecated status?

-verbose_name=_("Countries Patient has Travelled to"),
+verbose_name=_("Countries Patient has Travelled to (Legacy)"),

Also applies to: 26-26, 36-36, 46-46

care/facility/migrations_old/0178_auto_20200916_1534.py (2)

Line range hint 23-24: Looks like someone forgot to translate the srf_id field's verbose_name

I couldn't help but notice that while other fields have their verbose_name translated, the srf_id field seems to have been... overlooked?

 field=models.CharField(
-    blank=True, default="", max_length=200
+    blank=True, default="", max_length=200, verbose_name=_("SRF ID")
 ),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0178_auto_20200916_1534'

(N999)


Line range hint 28-37: Consider using TextChoices for test types

Since Django 3.0, we have a more elegant way to define choices using TextChoices enum class. Just saying...

class TestType(models.TextChoices):
    UNKNOWN = '10', _('UNK')
    ANTIGEN = '20', _('ANTIGEN')
    RTPCR = '30', _('RTPCR')
    CBNAT = '40', _('CBNAT')
    TRUNAT = '50', _('TRUNAT')
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0178_auto_20200916_1534'

(N999)

care/facility/migrations_old/0194_auto_20201009_1936.py (1)

35-35: Three-state boolean field might cause confusion

Using null=True with default=None for a boolean field creates a three-state boolean (True/False/None). While this might be intentional, it could lead to some... interesting... conditions in your code.

Consider either:

  1. Using a regular boolean with a clear default:
-    default=None, null=True, verbose_name=_("Is Patient Declared Positive")
+    default=False, verbose_name=_("Is Patient Declared Positive")
  1. Or using choices to be more explicit about the states:
class PositiveStatus(models.TextChoices):
    UNKNOWN = 'U', _('Unknown')
    POSITIVE = 'P', _('Positive')
    NEGATIVE = 'N', _('Negative')

Also applies to: 60-60

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fbf76d7 and eff6b0d.

📒 Files selected for processing (82)
  • care/contrib/sites/migrations/0001_initial.py (3 hunks)
  • care/contrib/sites/migrations/0002_alter_domain_unique.py (2 hunks)
  • care/facility/api/serializers/patient_consultation.py (2 hunks)
  • care/facility/migrations/0004_alter_historicalfacilitycapacity_options_and_more.py (16 hunks)
  • care/facility/migrations/0366_medibasemedicine_and_more.py (2 hunks)
  • care/facility/migrations/0372_assetavailabilityrecord.py (2 hunks)
  • care/facility/migrations/0378_consultationbedasset_consultationbed_assets.py (2 hunks)
  • care/facility/migrations/0381_merge_ip_op_no.py (2 hunks)
  • care/facility/migrations/0382_assetservice_remove_asset_last_serviced_on_and_more.py (3 hunks)
  • care/facility/migrations/0388_goal_goalentry_goalproperty_goalpropertyentry.py (5 hunks)
  • care/facility/migrations/0393_rename_diagnosis_patientconsultation_deprecated_diagnosis_and_more.py (3 hunks)
  • care/facility/migrations/0408_historicalpatientregistration_date_of_delivery_and_more.py (2 hunks)
  • care/facility/migrations/0408_patientnotesedit.py (2 hunks)
  • care/facility/migrations/0410_availabilityrecord_delete_assetavailabilityrecord_and_more.py (2 hunks)
  • care/facility/migrations/0413_eventtype_patientconsultationevent_and_more.py (3 hunks)
  • care/facility/migrations/0415_consultationclinician_and_more.py (2 hunks)
  • care/facility/migrations/0419_alter_patientconsultation_patient_no.py (2 hunks)
  • care/facility/migrations/0439_encounter_symptoms.py (3 hunks)
  • care/facility/migrations/0443_remove_patientconsultation_consent_records_and_more.py (3 hunks)
  • care/facility/migrations/0458_facilityflag_facilityflag_unique_facility_flag.py (2 hunks)
  • care/facility/migrations/0462_facilityhubspoke.py (2 hunks)
  • care/facility/migrations/0466_camera_presets.py (2 hunks)
  • care/facility/migrations_old/0001_initial.py (5 hunks)
  • care/facility/migrations_old/0002_auto_20200319_1244.py (7 hunks)
  • care/facility/migrations_old/0003_auto_20200319_1739.py (2 hunks)
  • care/facility/migrations_old/0006_auto_20200320_1616.py (2 hunks)
  • care/facility/migrations_old/0018_ambulance_ambulancedriver.py (3 hunks)
  • care/facility/migrations_old/0022_patientregistration_patientteleconsultation.py (5 hunks)
  • care/facility/migrations_old/0024_auto_20200325_0311.py (2 hunks)
  • care/facility/migrations_old/0030_auto_20200327_0619.py (2 hunks)
  • care/facility/migrations_old/0034_facilitypatientstatshistory.py (2 hunks)
  • care/facility/migrations_old/0035_auto_20200328_0442.py (2 hunks)
  • care/facility/migrations_old/0035_historicalfacilitycapacity.py (2 hunks)
  • care/facility/migrations_old/0039_auto_20200328_1657.py (2 hunks)
  • care/facility/migrations_old/0044_patientsample_patientsampleflow.py (3 hunks)
  • care/facility/migrations_old/0048_auto_20200330_0433.py (3 hunks)
  • care/facility/migrations_old/0050_dailyround.py (2 hunks)
  • care/facility/migrations_old/0058_auto_20200401_1820.py (5 hunks)
  • care/facility/migrations_old/0066_auto_20200402_1806.py (2 hunks)
  • care/facility/migrations_old/0067_auto_20200402_1841.py (13 hunks)
  • care/facility/migrations_old/0068_auto_20200403_1611.py (3 hunks)
  • care/facility/migrations_old/0071_auto_20200404_1737.py (3 hunks)
  • care/facility/migrations_old/0073_auto_20200404_2303.py (2 hunks)
  • care/facility/migrations_old/0074_auto_20200404_2352.py (2 hunks)
  • care/facility/migrations_old/0078_auto_20200409_0436.py (4 hunks)
  • care/facility/migrations_old/0081_auto_20200409_1201.py (3 hunks)
  • care/facility/migrations_old/0085_auto_20200412_0116.py (4 hunks)
  • care/facility/migrations_old/0086_auto_20200412_1313.py (2 hunks)
  • care/facility/migrations_old/0097_auto_20200417_1404.py (2 hunks)
  • care/facility/migrations_old/0100_auto_20200418_2315.py (4 hunks)
  • care/facility/migrations_old/0115_auto_20200611_1336.py (7 hunks)
  • care/facility/migrations_old/0118_auto_20200616_1051.py (2 hunks)
  • care/facility/migrations_old/0126_auto_20200626_0156.py (2 hunks)
  • care/facility/migrations_old/0130_auto_20200706_1946.py (2 hunks)
  • care/facility/migrations_old/0134_auto_20200713_1756.py (3 hunks)
  • care/facility/migrations_old/0139_shiftingrequest.py (2 hunks)
  • care/facility/migrations_old/0144_patientmobileotp.py (2 hunks)
  • care/facility/migrations_old/0155_auto_20200805_2312.py (3 hunks)
  • care/facility/migrations_old/0156_auto_20200808_2205.py (2 hunks)
  • care/facility/migrations_old/0167_auto_20200830_1121.py (2 hunks)
  • care/facility/migrations_old/0173_auto_20200903_1625.py (2 hunks)
  • care/facility/migrations_old/0174_auto_20200903_1836.py (2 hunks)
  • care/facility/migrations_old/0178_auto_20200916_1534.py (3 hunks)
  • care/facility/migrations_old/0184_auto_20200925_2353.py (5 hunks)
  • care/facility/migrations_old/0186_auto_20200926_0001.py (3 hunks)
  • care/facility/migrations_old/0187_patientexternaltest.py (2 hunks)
  • care/facility/migrations_old/0189_auto_20200929_1258.py (17 hunks)
  • care/facility/migrations_old/0194_auto_20201009_1936.py (3 hunks)
  • care/facility/migrations_old/0206_notification.py (2 hunks)
  • care/facility/migrations_old/0212_auto_20201223_1617.py (2 hunks)
  • care/facility/migrations_old/0215_auto_20210130_2236.py (4 hunks)
  • care/facility/migrations_old/0217_investigationsession_investigationvalue_patientinvestigation_patientinvestigationgroup.py (5 hunks)
  • care/facility/migrations_old/0222_auto_20210427_0002.py (2 hunks)
  • care/facility/migrations_old/0241_auto_20210519_0115.py (3 hunks)
  • care/facility/migrations_old/0251_auto_20210607_2009.py (2 hunks)
  • care/facility/migrations_old/0254_patientnotes.py (2 hunks)
  • care/facility/migrations_old/0255_asset_assetlocation_assettransaction_facilitydefaultassetlocation_userdefaultassetlocation.py (6 hunks)
  • care/facility/migrations_old/0258_auto_20210623_1742.py (2 hunks)
  • care/facility/migrations_old/0260_auto_20210710_1742.py (6 hunks)
  • care/facility/migrations_old/0261_auto_20210710_2305.py (3 hunks)
  • care/facility/migrations_old/0274_auto_20210910_1647.py (2 hunks)
  • care/facility/migrations_old/0279_auto_20211122_1138.py (3 hunks)
⛔ Files not processed due to max files limit (21)
  • care/facility/migrations_old/0284_patientconsultation_hba1c.py
  • care/facility/migrations_old/0287_auto_20220415_1932.py
  • care/facility/migrations_old/0353_auto_20230429_2026.py
  • care/facility/models/daily_round.py
  • care/facility/models/encounter_symptom.py
  • care/facility/models/facility_flag.py
  • care/facility/models/icd11_diagnosis.py
  • care/security/migrations/0001_initial.py
  • care/users/migrations/0001_initial_squashed.py
  • care/users/migrations/0004_alter_district_id_alter_localbody_id_alter_skill_id_and_more.py
  • care/users/migrations/0009_userfacilityallocation.py
  • care/users/migrations/0014_alter_user_username.py
  • care/users/migrations/0017_userflag.py
  • care/users/migrations/0020_plugconfig.py
  • care/users/migrations_old/0001_initial.py
  • care/users/migrations_old/0009_auto_20200325_1908.py
  • care/users/migrations_old/0029_ward.py
  • care/users/migrations_old/0035_auto_20210511_2105.py
  • care/users/migrations_old/0039_auto_20210616_1634.py
  • care/users/models.py
  • care/users/reset_password_views.py
🧰 Additional context used
🪛 Ruff (0.8.2)
care/facility/migrations_old/0050_dailyround.py

1-1: Invalid module name: '0050_dailyround'

(N999)

care/facility/migrations_old/0035_historicalfacilitycapacity.py

1-1: Invalid module name: '0035_historicalfacilitycapacity'

(N999)

care/facility/migrations_old/0134_auto_20200713_1756.py

1-1: Invalid module name: '0134_auto_20200713_1756'

(N999)

care/facility/migrations_old/0251_auto_20210607_2009.py

1-1: Invalid module name: '0251_auto_20210607_2009'

(N999)

care/facility/migrations_old/0126_auto_20200626_0156.py

1-1: Invalid module name: '0126_auto_20200626_0156'

(N999)

care/facility/migrations_old/0073_auto_20200404_2303.py

1-1: Invalid module name: '0073_auto_20200404_2303'

(N999)

care/facility/migrations_old/0130_auto_20200706_1946.py

1-1: Invalid module name: '0130_auto_20200706_1946'

(N999)

care/facility/migrations_old/0187_patientexternaltest.py

1-1: Invalid module name: '0187_patientexternaltest'

(N999)

care/facility/migrations_old/0044_patientsample_patientsampleflow.py

1-1: Invalid module name: '0044_patientsample_patientsampleflow'

(N999)

care/facility/migrations_old/0097_auto_20200417_1404.py

1-1: Invalid module name: '0097_auto_20200417_1404'

(N999)

care/facility/migrations_old/0173_auto_20200903_1625.py

1-1: Invalid module name: '0173_auto_20200903_1625'

(N999)

care/facility/migrations_old/0167_auto_20200830_1121.py

1-1: Invalid module name: '0167_auto_20200830_1121'

(N999)

care/facility/migrations_old/0215_auto_20210130_2236.py

1-1: Invalid module name: '0215_auto_20210130_2236'

(N999)

care/facility/migrations_old/0006_auto_20200320_1616.py

1-1: Invalid module name: '0006_auto_20200320_1616'

(N999)

care/facility/migrations_old/0144_patientmobileotp.py

1-1: Invalid module name: '0144_patientmobileotp'

(N999)

care/facility/migrations_old/0206_notification.py

1-1: Invalid module name: '0206_notification'

(N999)

care/facility/migrations_old/0217_investigationsession_investigationvalue_patientinvestigation_patientinvestigationgroup.py

1-1: Invalid module name: '0217_investigationsession_investigationvalue_patientinvestigation_patientinvestigationgroup'

(N999)

care/facility/migrations_old/0279_auto_20211122_1138.py

1-1: Invalid module name: '0279_auto_20211122_1138'

(N999)

care/facility/migrations_old/0018_ambulance_ambulancedriver.py

1-1: Invalid module name: '0018_ambulance_ambulancedriver'

(N999)

care/facility/migrations_old/0258_auto_20210623_1742.py

1-1: Invalid module name: '0258_auto_20210623_1742'

(N999)

care/facility/migrations_old/0155_auto_20200805_2312.py

1-1: Invalid module name: '0155_auto_20200805_2312'

(N999)

care/facility/migrations_old/0039_auto_20200328_1657.py

1-1: Invalid module name: '0039_auto_20200328_1657'

(N999)

care/facility/migrations_old/0024_auto_20200325_0311.py

1-1: Invalid module name: '0024_auto_20200325_0311'

(N999)

care/facility/migrations_old/0184_auto_20200925_2353.py

1-1: Invalid module name: '0184_auto_20200925_2353'

(N999)

care/facility/migrations_old/0074_auto_20200404_2352.py

1-1: Invalid module name: '0074_auto_20200404_2352'

(N999)

care/facility/migrations_old/0035_auto_20200328_0442.py

1-1: Invalid module name: '0035_auto_20200328_0442'

(N999)

care/facility/migrations_old/0048_auto_20200330_0433.py

1-1: Invalid module name: '0048_auto_20200330_0433'

(N999)

care/facility/migrations_old/0086_auto_20200412_1313.py

1-1: Invalid module name: '0086_auto_20200412_1313'

(N999)

care/facility/migrations_old/0003_auto_20200319_1739.py

1-1: Invalid module name: '0003_auto_20200319_1739'

(N999)

care/facility/migrations_old/0255_asset_assetlocation_assettransaction_facilitydefaultassetlocation_userdefaultassetlocation.py

1-1: Invalid module name: '0255_asset_assetlocation_assettransaction_facilitydefaultassetlocation_userdefaultassetlocation'

(N999)

care/facility/migrations_old/0001_initial.py

1-1: Invalid module name: '0001_initial'

(N999)

care/facility/migrations_old/0260_auto_20210710_1742.py

1-1: Invalid module name: '0260_auto_20210710_1742'

(N999)

care/facility/migrations_old/0115_auto_20200611_1336.py

1-1: Invalid module name: '0115_auto_20200611_1336'

(N999)

care/facility/migrations_old/0067_auto_20200402_1841.py

1-1: Invalid module name: '0067_auto_20200402_1841'

(N999)

care/facility/migrations_old/0118_auto_20200616_1051.py

1-1: Invalid module name: '0118_auto_20200616_1051'

(N999)

care/facility/migrations_old/0030_auto_20200327_0619.py

1-1: Invalid module name: '0030_auto_20200327_0619'

(N999)

care/facility/migrations_old/0085_auto_20200412_0116.py

1-1: Invalid module name: '0085_auto_20200412_0116'

(N999)

care/facility/migrations_old/0254_patientnotes.py

1-1: Invalid module name: '0254_patientnotes'

(N999)

care/facility/migrations_old/0022_patientregistration_patientteleconsultation.py

1-1: Invalid module name: '0022_patientregistration_patientteleconsultation'

(N999)

care/facility/migrations_old/0139_shiftingrequest.py

1-1: Invalid module name: '0139_shiftingrequest'

(N999)

care/facility/migrations_old/0174_auto_20200903_1836.py

1-1: Invalid module name: '0174_auto_20200903_1836'

(N999)

care/facility/migrations_old/0241_auto_20210519_0115.py

1-1: Invalid module name: '0241_auto_20210519_0115'

(N999)

care/facility/migrations_old/0058_auto_20200401_1820.py

1-1: Invalid module name: '0058_auto_20200401_1820'

(N999)

care/facility/migrations_old/0212_auto_20201223_1617.py

1-1: Invalid module name: '0212_auto_20201223_1617'

(N999)

care/facility/migrations_old/0156_auto_20200808_2205.py

1-1: Invalid module name: '0156_auto_20200808_2205'

(N999)

care/facility/migrations_old/0034_facilitypatientstatshistory.py

1-1: Invalid module name: '0034_facilitypatientstatshistory'

(N999)

care/facility/migrations_old/0002_auto_20200319_1244.py

1-1: Invalid module name: '0002_auto_20200319_1244'

(N999)

care/facility/migrations_old/0081_auto_20200409_1201.py

1-1: Invalid module name: '0081_auto_20200409_1201'

(N999)

care/facility/migrations_old/0189_auto_20200929_1258.py

1-1: Invalid module name: '0189_auto_20200929_1258'

(N999)

care/facility/migrations_old/0222_auto_20210427_0002.py

1-1: Invalid module name: '0222_auto_20210427_0002'

(N999)

care/facility/migrations_old/0066_auto_20200402_1806.py

1-1: Invalid module name: '0066_auto_20200402_1806'

(N999)

care/facility/migrations_old/0261_auto_20210710_2305.py

1-1: Invalid module name: '0261_auto_20210710_2305'

(N999)

care/facility/migrations_old/0068_auto_20200403_1611.py

1-1: Invalid module name: '0068_auto_20200403_1611'

(N999)

care/facility/migrations_old/0071_auto_20200404_1737.py

1-1: Invalid module name: '0071_auto_20200404_1737'

(N999)

care/facility/migrations_old/0078_auto_20200409_0436.py

1-1: Invalid module name: '0078_auto_20200409_0436'

(N999)

care/facility/migrations_old/0100_auto_20200418_2315.py

1-1: Invalid module name: '0100_auto_20200418_2315'

(N999)

care/facility/migrations_old/0178_auto_20200916_1534.py

1-1: Invalid module name: '0178_auto_20200916_1534'

(N999)

care/facility/migrations_old/0186_auto_20200926_0001.py

1-1: Invalid module name: '0186_auto_20200926_0001'

(N999)

care/facility/migrations_old/0194_auto_20201009_1936.py

1-1: Invalid module name: '0194_auto_20201009_1936'

(N999)

care/facility/migrations_old/0274_auto_20210910_1647.py

1-1: Invalid module name: '0274_auto_20210910_1647'

(N999)

🔇 Additional comments (66)
care/facility/migrations/0439_encounter_symptoms.py (1)

1-1: Great job exhibiting best practices with lazy translations at import.

The import of "gettext_lazy" as "_" is perfectly aligned with Django's lazy translations feature. This ensures that any wrapped strings are translated only on demand, which is more efficient.

care/facility/migrations_old/0167_auto_20200830_1121.py (2)

1-1: LGTM! Proper import for internationalization.

The gettext_lazy import is correctly implemented for lazy string translations.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0167_auto_20200830_1121'

(N999)


Line range hint 1-26: Verify the migration dependencies.

The migration depends on "0166_auto_20200815_1930". Let's ensure this dependency is correct and the migration will apply cleanly.

✅ Verification successful

Migration dependency chain looks perfectly fine, I suppose

The dependent migration 0166_auto_20200815_1930.py exists and is properly structured. It has its own dependency on 0165_facilitypatientstatshistory_num_patient_confirmed_positive, and performs a valid field alteration operation. The migration sequence appears to be in order, though one could always double-check the entire chain if they're feeling particularly thorough.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify migration dependencies
# Check if the dependent migration exists and its content
fd --type f "0166_auto_20200815_1930.py" care/facility/migrations_old/ --exec cat {}

Length of output: 1777

care/facility/migrations_old/0050_dailyround.py (1)

Line range hint 30-36: Well done on the consultation relationship!

The PROTECT on_delete constraint and meaningful related_name show thoughtful database design. This will prevent accidental deletion of consultation records that have associated daily rounds.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0050_dailyround'

(N999)

care/facility/migrations/0458_facilityflag_facilityflag_unique_facility_flag.py (2)

26-26: Nice to see the ID translation being implemented!

The verbose_name translation looks good. This aligns perfectly with the PR objectives for implementing lazy translations.


Line range hint 29-45: That's quite a generous max_length for the flag field...

A 1024-character limit for a flag seems... interesting. Would you mind sharing the reasoning behind this specific length? Also, it might be helpful to add some help_text to explain what kind of flags are expected here.

Consider adding help_text to clarify the flag field's purpose:

-                ("flag", models.CharField(max_length=1024)),
+                ("flag", models.CharField(
+                    max_length=1024,
+                    help_text=_("Identifier or category flag for the facility")
+                )),
✅ Verification successful

Oh, I see what's happening here... the 1024 max_length is actually consistent across the codebase

Looking at the results, this appears to be a deliberate pattern. The same max_length=1024 for flag fields is used in:

  • BaseFlag model in care/utils/models/base.py
  • UserFlag model in the users app
  • FacilityFlag model in the facility app

Since this is clearly an established pattern derived from the base model, and consistently applied across flag-related models, the length choice seems intentional rather than arbitrary. Though I still think some help_text would be... nice to have.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if there are any existing flag-like fields in the codebase for consistency
rg -g '*.py' --type py -B 2 -A 2 'flag.*CharField.*max_length'

Length of output: 1313

care/facility/migrations_old/0274_auto_20210910_1647.py (2)

1-1: LGTM! Proper import for lazy translations.

The import of gettext_lazy as _ follows Django's internationalization best practices.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0274_auto_20210910_1647'

(N999)


17-18: BooleanField with default=None might cause confusion.

A BooleanField with default=None could lead to three possible states (True, False, None), which might not be the intended behavior. If a nullable boolean is needed, consider using NullBooleanField (Django <4.0) or BooleanField(null=True) (Django ≥4.0).

Let's check if this field is actually used with null values:

Would you like assistance in adjusting the field definition to better match Django's recommended practices?

Also applies to: 24-25

care/facility/migrations_old/0134_auto_20200713_1756.py (3)

Line range hint 1-13: LGTM! Migration setup looks fine.

The import of gettext_lazy and migration configuration follow Django best practices.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0134_auto_20200713_1756'

(N999)


Line range hint 33-52: Verify blood group choices consistency across models.

The field configuration matches between patientregistration and historicalpatientregistration, which is good. However, it might be worth checking if these choices are consistent across other related models in the codebase.

✅ Verification successful

Blood group choices are perfectly consistent across the codebase

The blood group choices in the migration match exactly with the centralized BLOOD_GROUP_CHOICES definition in patient_base.py, which is properly imported and used throughout the codebase. It's almost as if someone actually thought this through.

  • The choices are defined once in care/facility/models/patient_base.py
  • Used in the patient model via the imported choices
  • Referenced in serializers using the same constant
  • Migration file maintains the exact same values
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for other blood group field definitions to ensure consistency
rg -A 10 'blood_group.*CharField' --type py

Length of output: 729


Script:

#!/bin/bash
# Let's check if there are any blood group choices defined as constants
rg -B 5 'BLOOD_GROUP_CHOICES.*=' --type py

Length of output: 1361


Script:

#!/bin/bash
# Let's see what these blood group choices actually contain, shall we?
cat care/facility/models/patient_base.py | grep -A 10 "BLOOD_GROUP_CHOICES.*="

Length of output: 867


Line range hint 1-52: Verify complete translation coverage.

Since this PR aims to implement lazy translations, let's ensure we haven't missed any translatable strings in this migration.

✅ Verification successful

Actually, the translation implementation looks perfectly fine

The migration file has properly implemented lazy translations where it matters. The only non-translated strings are:

  • Blood type codes ("A+", "B-", etc.) which are standardized medical notations that shouldn't be translated
  • The migration dependency path and model names which are internal Django references
  • The field name "blood_group" which is a database identifier

The verbose_name field, which is the only user-facing string, is already properly wrapped with gettext_lazy as _("Blood Group of Patient"). I suppose we could say this is a rare instance of getting it right the first time.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Look for potential untranslated strings in migration files
rg -g '*/migrations/*.py' '"[^"]+"\s*,' --type py | grep -v '_(' 

Length of output: 215


Script:

#!/bin/bash
# Let's try a more reliable approach to find potential untranslated strings in this specific migration
rg --type py -l 'class Migration' care/facility/migrations_old/0134_auto_20200713_1756.py | xargs rg -p '"[^"]*"' | grep -v '_(' || true

# Also check for any other string literals that might need translation
ast-grep --pattern 'models.CharField(
  $$$
  choices=[
    $$$
  ],
  $$$
)' care/facility/migrations_old/0134_auto_20200713_1756.py

Length of output: 4123

care/facility/migrations/0462_facilityhubspoke.py (1)

Line range hint 65-82: Interesting constraint setup, but...

The constraints for preventing self-referential relationships and ensuring uniqueness are well implemented. However, I couldn't help but notice that there's no constraint on the relationship types. What's stopping a facility from being both a Regular Hub and a Tele ICU Hub to the same spoke? Not that anyone would do that... right? 🤔

Let's check if this is handled elsewhere in the codebase:

care/facility/migrations/0382_assetservice_remove_asset_last_serviced_on_and_more.py (3)

1-1: **Add _ Alias for Translations **
Good job adding the gettext_lazy alias at the top. Please keep in mind to confirm that all translatable strings are wrapped to maintain consistency throughout the module—no biggie though.


49-49: **Translated Verbose Name for ID Field **
This slight tweak to make the ID field translatable is nice. It's a small detail that can help ensure better localization support in the future.


81-81: **Ensuring Consistent Verbose Names **
Repeating the translation pattern for the new model is appreciated. Always a relief when everything stays consistent, right?

care/facility/migrations/0410_availabilityrecord_delete_assetavailabilityrecord_and_more.py (2)

1-1: **Import gettext_lazy Early **
Nice to see the translation import at the start. Next time, maybe keep a keen eye out for any other places that need lazy translation, though this works for now.


86-86: **Translated Verbose Name for ID **
Looks good to me. This aligns with the existing convention of marking field labels for translations. It’s helpful for multi-language support.

care/facility/migrations/0393_rename_diagnosis_patientconsultation_deprecated_diagnosis_and_more.py (3)

1-1: **Using gettext_lazy for Migrations **
The import is correct and is a standard approach for Django i18n. It's always nice to see you folks employing best practices without me having to mention it…maybe once in a while, read the docs, but we're good here.


91-91: **Translating Primary Key Label **
Explicitly specifying the translatable verbose_name for the primary key ensures consistent language coverage. Good work.


126-126: **Localizing Help Text **
Making help text translatable is a solid move. It's a small yet meaningful detail that can improve the user’s experience across different locales.

care/facility/migrations/0443_remove_patientconsultation_consent_records_and_more.py (3)

1-1: **gettext_lazy Import **
Smooth import—this file is shaping up nicely to support lazy-loaded translations. Keep it up!


92-92: **Translated Verbose Name for ID in PatientConsent **
Good attention to detail by ensuring that the ID field’s label is now translatable. One wonders what took so long, but hey, better late than never.


165-165: **Localizing the is_migrated Help Text **
Making your help text translatable here is helpful for admins in various locales. No complaints—this is straightforward.

care/facility/migrations_old/0261_auto_20210710_2305.py (3)

1-1: Importing lazy translation is consistent with the PR objective
Kudos for aligning with the lazy translations requirement by importing gettext_lazy. This should help ensure all new or updated fields can be readily translated.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0261_auto_20210710_2305'

(N999)


330-330: Excellent use of lazy translation for 'verbose_name'
Integrating lazy translation with _("Left Pupil Size") ensures i18n readiness. Keep it up!


587-587: Maintaining consistency in translation
Right pupil size now also benefits from an i18n-friendly verbose name. This is consistent with the rest of the codebase.

care/facility/migrations/0004_alter_historicalfacilitycapacity_options_and_more.py (2)

1-1: Implementation of lazy translation import
This import ensures i18n readiness for all subsequent (and possibly extensive) field translations.


38-38: Refined verbose_name for ID fields throughout
Nice job systematically replacing the literal "ID" with _("ID"). This unifies your internationalization approach across numerous models. Although it’s a broad stroke, it’s effective for consistent user-facing labels. This level of thoroughness is appreciated—though it does feel like a lot of lines for a single PR, you’re covering all models in one sweep.

Also applies to: 45-45, 52-52, 123-123, 135-135, 142-142, 149-149, 161-161, 168-168, 228-228, 451-451, 463-463, 470-470, 477-477, 484-484, 491-491, 498-498, 505-505, 512-512, 519-519, 526-526, 533-533, 540-540, 547-547, 559-559, 566-566, 573-573, 580-580, 592-592, 599-599, 611-611, 618-618, 625-625, 632-632, 639-639, 646-646, 653-653, 665-665, 677-677, 721-721, 753-753, 760-760, 767-767, 774-774, 781-781, 788-788, 795-795, 802-802, 809-809, 816-816, 823-823, 830-830, 837-837, 849-849, 856-856, 863-863, 870-870, 877-877, 884-884, 891-891, 898-898

care/contrib/sites/migrations/0002_alter_domain_unique.py (1)

17-17: Domain name goes multilingual
Using _("domain name") for the verbose_name ensures better UX for international audiences. This is solid i18n progress.

care/facility/migrations/0419_alter_patientconsultation_patient_no.py (1)

19-19: Help text translation looks good
Wrapping the help text with gettext_lazy underscores the seriousness about localization. This minor tweak has a substantial impact on user clarity.

care/facility/migrations_old/0097_auto_20200417_1404.py (1)

1-1: The internationalization changes look fine, I suppose...

The translation wrapper for "Countries Patient has Travelled to" has been properly implemented. Though, I can't help but notice we're maintaining the same string in two different models. Not that it's wrong, just... interesting.

Also applies to: 17-17, 24-24

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0097_auto_20200417_1404'

(N999)

care/facility/migrations_old/0251_auto_20210607_2009.py (1)

17-17: Well, at least the translations are consistent

The implementation of the translated verbose_name for the last_vaccinated_date field is correct and consistently applied across both models. The field configuration with blank=True and null=True is appropriate for an optional date field.

Also applies to: 24-24

care/facility/migrations_old/0215_auto_20210130_2236.py (1)

35-35: LGTM, but let's be consistent with COVID-19 naming

The translation implementation looks good. Though I notice you're using "COVID-19" here but "COVID-19" in other places. Not that it matters much, but consistency is nice to have... when we feel like it.

Also applies to: 46-46

care/facility/migrations_old/0034_facilitypatientstatshistory.py (2)

23-23: At least someone kept this verbose name short

The translation of "ID" is properly implemented. It's refreshingly concise compared to some other field names we've seen today.


Line range hint 41-43: The unique constraint looks good, though...

The unique constraint on facility and entry_date is well thought out. We definitely wouldn't want duplicate stats for the same facility on the same day. That would be... unfortunate.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0034_facilitypatientstatshistory'

(N999)

care/facility/migrations/0415_consultationclinician_and_more.py (1)

25-25: Oh look, someone remembered to internationalize the ID field

The translation implementation for the verbose_name is correct. It's nice to see consistency in internationalization efforts.

care/facility/migrations_old/0006_auto_20200320_1616.py (2)

Line range hint 51-53: Unique constraint implementation looks fine

The unique_together constraint for facility and area is properly implemented, though in newer Django versions, you might want to consider using UniqueConstraint with the constraints option for more flexibility.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0006_auto_20200320_1616'

(N999)


Line range hint 19-24: Those facility type choices seem... interesting

The facility_type choices appear quite limited. Consider whether three options ("Educational Inst", "Hospital", "Other") are sufficient for your use case. Also, these strings should probably be internationalized since we're on an i18n spree.

Consider wrapping the choice strings in gettext_lazy:

 field=models.IntegerField(
-    choices=[(1, "Educational Inst"), (2, "Hospital"), (3, "Other")],
+    choices=[(1, _("Educational Inst")), (2, _("Hospital")), (3, _("Other"))],
     default=1,
 ),
🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0006_auto_20200320_1616'

(N999)

care/facility/migrations_old/0144_patientmobileotp.py (1)

Line range hint 29-30: UUID implementation looks decent enough

Good choice using UUID for external_id with db_index and uniqueness constraints. Though, you might want to consider using version 7 UUIDs when they become available in Python 3.12+ for better database performance.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0144_patientmobileotp'

(N999)

care/facility/migrations_old/0155_auto_20200805_2312.py (1)

1-1: LGTM on the gettext_lazy import!

The import is correctly placed at the top of the file.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0155_auto_20200805_2312'

(N999)

care/facility/migrations/0381_merge_ip_op_no.py (1)

56-56: Nice job on translating the help text!

The help text translation is properly implemented using gettext_lazy.

care/facility/migrations/0378_consultationbedasset_consultationbed_assets.py (1)

25-25: Nice job implementing lazy translation for the ID field!

The verbose_name=_("ID") implementation aligns perfectly with the PR objectives. Though I can't help but notice you're being quite thorough with just this one string... there might be a few other strings in the model that could use some translation love too? Just saying...

care/facility/migrations/0372_assetavailabilityrecord.py (1)

25-25: Another well-implemented lazy translation for the ID field!

The verbose_name=_("ID") implementation is consistent with the other migrations. Consistency is key, isn't it?

care/facility/migrations_old/0254_patientnotes.py (2)

27-27: Consistent implementation of lazy translation for the ID field

The verbose_name=_("ID") implementation maintains consistency across migrations. Though I must say, it's interesting how we're giving special treatment to just the ID field...


1-1: Verify translation string usage across the codebase

Let's ensure we're being consistent with our translation implementation across similar model fields.

Also applies to: 27-27, 40-41

✅ Verification successful

Translation strings are consistently used across model fields

After analyzing the codebase, I notice that the fields in the migrations are auto-generated from model definitions, and the verbose_name translations are properly handled at the model level. The import of gettext_lazy in this migration file is part of Django's standard practice for internationalization.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for inconsistent usage of translations in model fields

# Look for TextField and CharField definitions without translations
echo "Fields potentially missing translations:"
rg -U 'models\.(Text|Char)Field\([^)]*\)' | rg -v '_\('

# Look for verbose_name usage without translations
echo "\nverbose_name usage without translations:"
rg -U 'verbose_name\s*=\s*[^_]'

Length of output: 73641

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0254_patientnotes'

(N999)

care/facility/migrations_old/0118_auto_20200616_1051.py (1)

Line range hint 41-47: Cascade delete on facility might need reconsideration

The CASCADE delete on facility relationship means all inventory minimum quantities will be deleted when a facility is removed. While this might be intended, it could lead to data loss if not carefully managed.

Consider using SET_NULL instead if historical inventory data needs to be preserved.

✅ Verification successful

The previous search might have been too specific. Let's broaden our search to catch all facility-related foreign keys and their deletion behaviors, shall we?


CASCADE deletion strategy seems... interestingly consistent with the codebase design

After examining the codebase, the CASCADE deletion on facility relationships appears to be an intentional architectural decision. The facility model serves as a hub in hub-spoke relationships and maintains user associations, all using CASCADE deletion. Even the patient model, which could have been concerning, thoughtfully uses SET_NULL instead.

Key findings:

  • Hub-spoke relationships use CASCADE (facility.py): hub = models.ForeignKey(Facility, on_delete=models.CASCADE)
  • Patient records safely use SET_NULL (patient.py): facility = models.ForeignKey("Facility", on_delete=models.SET_NULL, null=True)
  • Facility-user associations use CASCADE (facility.py): facility = models.ForeignKey(Facility, on_delete=models.CASCADE)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for other models that might be affected by facility deletion
rg "models\.ForeignKey.*facility\.Facility.*CASCADE" -A 2

Length of output: 59


Script:

#!/bin/bash
# Let's try a more comprehensive search for facility-related foreign keys
rg "ForeignKey.*Facility" -A 2

# Also search for facility-related models and their relationships
ast-grep --pattern 'class $_ (models.Model) {
  $$$
  facility = $$$
  $$$
}'

# And check for any migration files mentioning facility relationships
fd ".*migrations.*\.py$" --exec rg "field.*Facility" -A 2

Length of output: 1107

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0118_auto_20200616_1051'

(N999)

care/facility/migrations_old/0074_auto_20200404_2352.py (1)

74-74: At least one field got the translation memo

Good job internationalizing the verbose_name for recommend_discharge. Now, if we could just get the same treatment for all the other user-facing strings...

care/facility/migrations_old/0222_auto_20210427_0002.py (1)

27-27: Another ID field gets its translation papers

The ID field's verbose_name is properly internationalized. Though I can't help but notice a pattern of selective translation across these migrations...

care/facility/migrations/0366_medibasemedicine_and_more.py (1)

Line range hint 28-31: Verify the impact of external_id uniqueness

The external_id field is set as unique, which is good for data integrity. However, let's make sure this won't cause any issues with existing data during migration.

✅ Verification successful

Well, actually, the external_id uniqueness is perfectly fine here

This is a new table creation (CreateModel for MedibaseMedicine), so there's no existing data to worry about. The UUID field's uniqueness constraint is not only safe but rather... expected, one might say. The pattern is consistently used across the codebase, as evidenced by similar implementations in other models.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if there are any duplicate UUIDs in existing data that might conflict
rg -A 2 "external_id.*uuid" | grep -i "unique.*true"

Length of output: 936


Script:

#!/bin/bash
# Let's check if this is a new table creation or altering existing table
rg -B 5 -A 5 "class Migration" care/facility/migrations/0366_medibasemedicine_and_more.py

# Also check if there are any existing migrations that might have data in this table
fd ".*migrations.*" care/facility | grep -i "medibase"

Length of output: 338


Script:

#!/bin/bash
# Let's see what operations are being performed in this migration
rg -A 15 "operations = \[" care/facility/migrations/0366_medibasemedicine_and_more.py

# And check if this table existed before
fd --type f ".*migrations.*" care/facility | xargs rg "MedibaseMedicine" -l

Length of output: 1093

care/facility/migrations_old/0212_auto_20201223_1617.py (1)

43-43: Oh look, someone remembered to internationalize the ID field!

Nice job using gettext_lazy for the ID field's verbose name. It's refreshing to see consistency in internationalization.

care/facility/migrations_old/0024_auto_20200325_0311.py (2)

27-27: Finally, a properly internationalized help text!

The help text for is_active uses gettext_lazy correctly. It's almost as if someone read the Django documentation.


Line range hint 63-73: That phone number regex looks... interesting

The phone number validation regex seems quite India-specific. Perhaps we should consider using a more flexible approach for international phone numbers?

Let's check if this might cause issues for international numbers:

Consider using a library like django-phonenumber-field for more robust phone number validation.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0024_auto_20200325_0311'

(N999)

care/facility/migrations_old/0081_auto_20200409_1201.py (2)

23-23: More internationalized fields, how... consistent

Nice to see gettext_lazy being used consistently for verbose names and help texts. Almost makes one forget about all the non-internationalized strings in the codebase.

Also applies to: 59-59


Line range hint 67-82: Those indexes look carefully thought out

The composite indexes will definitely help with search performance. Though I can't help but wonder if we really need both indexes since one is a subset of the other?

Let's check if these indexes are actually being used:

Consider monitoring query performance to verify if both indexes are necessary, as the three-column index might suffice for both query patterns.

✅ Verification successful

The previous search might have been too specific. Let's broaden our search to find any filtering patterns using these fields and understand the model structure better.


The previous searches didn't reveal the complete picture. Let's look specifically for PatientSearch related queries and its model definition to understand how these indexes are being utilized.


Both indexes are actually necessary for optimal query performance

While one index might seem redundant at first glance (how observant of you to notice), they actually serve different query patterns. The three-column index (year_of_birth, date_of_birth, phone_number) supports precise patient lookups using all three fields, while the two-column index (year_of_birth, phone_number) optimizes the more common partial lookup scenario where date_of_birth isn't provided.

From the migration code, we can see that PatientSearch is a dedicated search model that's carefully designed for efficient patient lookups. The presence of both indexes suggests that the application handles both:

  • Complete patient record matching (using all three fields)
  • Partial matching (using just year and phone)

I mean, you could try to use just the three-column index for both cases, but that wouldn't be as efficient for the partial queries. But you probably knew that already.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for queries that might use these indexes
rg -A 3 "filter.*year_of_birth.*phone_number|filter.*date_of_birth"

Length of output: 69


Script:

#!/bin/bash
# Let's try a more comprehensive search for these fields in filter conditions
rg -l "year_of_birth|phone_number|date_of_birth" | xargs rg "filter\(" -A 5 -B 2

# Also search for any direct field access patterns
ast-grep --pattern 'filter($$$year_of_birth$$$)'

# And let's check the model definition to understand the search patterns
fd -e py "patientsearch.py|models.py" | xargs cat

Length of output: 69454


Script:

#!/bin/bash
# Let's search for actual query patterns in the codebase
rg -l "PatientSearch" | xargs rg "filter.*year_of_birth|filter.*phone_number|filter.*date_of_birth" -B 2 -A 3

# And let's look at the model definition and any search-related code
fd -e py "search.py|patientsearch.py" | xargs cat

Length of output: 3108

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0081_auto_20200409_1201'

(N999)

care/facility/migrations_old/0003_auto_20200319_1739.py (1)

65-65: At least the ID is properly translated.

The verbose_name=_("ID") implementation is correct.

care/facility/migrations_old/0035_auto_20200328_0442.py (1)

21-21: Ah, I see you've added lazy translation for the ID field. How... thoughtful.

The implementation of verbose_name=_("ID") is correct and aligns with Django's internationalization best practices.

care/facility/migrations_old/0139_shiftingrequest.py (1)

25-25: Look who remembered to translate the ID field...

The implementation of verbose_name=_("ID") is correct.

care/facility/migrations_old/0156_auto_20200808_2205.py (1)

33-33: At least the ID translation is consistent...

The implementation of verbose_name=_("ID") is correct.

care/facility/migrations_old/0035_historicalfacilitycapacity.py (1)

24-24: Translation implementation looks fine, I suppose

The change to use _("ID") for translation is correct, though it's worth noting that "ID" is typically left untranslated in most applications... but who am I to judge?

care/facility/migrations/0413_eventtype_patientconsultationevent_and_more.py (1)

Line range hint 93-108: Verify the impact of the new event tracking system

The introduction of EventType and PatientConsultationEvent models represents a significant change in how events are tracked.

care/facility/migrations/0388_goal_goalentry_goalproperty_goalpropertyentry.py (1)

Line range hint 1-180: Well-structured models with proper relationships

The model hierarchy and relationships are well thought out. Nice touch with the indexed fields and proper deletion behaviors.

care/facility/migrations/0466_camera_presets.py (1)

86-86: Nice job on implementing translations!

The verbose_name is properly wrapped with gettext_lazy.

care/facility/migrations_old/0002_auto_20200319_1244.py (1)

26-26: LGTM! Translation implementation looks good.

The use of gettext_lazy for the ID field's verbose name follows Django's best practices for internationalization.

care/facility/api/serializers/patient_consultation.py (1)

163-163: Translations look good, I suppose...

The help_text fields are correctly wrapped with gettext_lazy, which is... exactly what we wanted.

Also applies to: 170-170

care/facility/migrations_old/0100_auto_20200418_2315.py (1)

1-1: Verify completeness of internationalization effort

Let's check if there are any other strings that need translation in related files.

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0100_auto_20200418_2315'

(N999)

care/facility/migrations_old/0078_auto_20200409_0436.py (1)

17-17: Consider adding validation constraints for identification fields

While the internationalization implementation looks fine, storing sensitive identification numbers like Aadhar and passport numbers without proper validation might not be the best approach. You might want to add some basic validation patterns.

Consider:

  • Adding regex validators for Aadhar numbers (12 digits)
  • Adding passport number format validation
  • Implementing field encryption for sensitive data

Also applies to: 24-24, 33-33, 40-40, 47-47, 56-56

@@ -19,7 +20,7 @@ class Migration(migrations.Migration):
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
verbose_name=_("ID"),
),
),
("temperature", models.DecimalField(decimal_places=2, max_digits=5)),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

The temperature field could use some validation... just saying.

A DecimalField without validators could allow physiologically impossible temperature values. Maybe we should add some reasonable bounds?

-               ("temperature", models.DecimalField(decimal_places=2, max_digits=5)),
+               ("temperature", models.DecimalField(
+                   decimal_places=2,
+                   max_digits=5,
+                   validators=[
+                       MinValueValidator(35.0, message=_("Temperature is too low")),
+                       MaxValueValidator(45.0, message=_("Temperature is too high"))
+                   ]
+               )),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
("temperature", models.DecimalField(decimal_places=2, max_digits=5)),
("temperature", models.DecimalField(
decimal_places=2,
max_digits=5,
validators=[
MinValueValidator(35.0, message=_("Temperature is too low")),
MaxValueValidator(45.0, message=_("Temperature is too high"))
]
)),

@@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Translation strings seem mostly consistent, with a slight inconsistency

I couldn't help but notice a tiny discrepancy in the medical worker string:

  • Model uses: "Is the Patient a Medical Worker"
  • Migration 0073 uses: "Is the Patient a Medical Worker" _(correctly wrapped in ())
  • Migration 0173 uses: "Is Patient a Migrant Worker" (different text altogether)

Perhaps someone got a bit creative with the string variations? The other strings are perfectly consistent though, which is... nice.

🔗 Analysis chain

Verify translation string usage

Let's ensure these new translation strings are used consistently across the codebase.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for usage of these translation strings
echo "Searching for translation string usage patterns..."
rg -l "Patient's Known Allergies|Is Patient a Migrant Worker|Is the Patient a Medical Worker" \
  --type py \
  --glob '!**/migrations/**'

Length of output: 446


Script:

#!/bin/bash
# Let's see how these strings are actually used in the model and migrations
echo "=== Checking patient.py usage ==="
rg "Patient's Known Allergies|Is Patient a Migrant Worker|Is the Patient a Medical Worker" care/facility/models/patient.py -A 2

echo -e "\n=== Checking migrations usage ==="
rg "Patient's Known Allergies|Is Patient a Migrant Worker|Is the Patient a Medical Worker" care/facility/migrations_old/0073_auto_20200404_2303.py -A 2
rg "Patient's Known Allergies|Is Patient a Migrant Worker|Is the Patient a Medical Worker" care/facility/migrations_old/0126_auto_20200626_0156.py -A 2
rg "Patient's Known Allergies|Is Patient a Migrant Worker|Is the Patient a Medical Worker" care/facility/migrations_old/0173_auto_20200903_1625.py -A 2

Length of output: 1634

🧰 Tools
🪛 Ruff (0.8.2)

1-1: Invalid module name: '0073_auto_20200404_2303'

(N999)

@@ -23,7 +24,7 @@ class Migration(migrations.Migration):
django.core.validators.MinValueValidator(0),
django.core.validators.MaxValueValidator(100),
],
verbose_name="Patient's CPK/MB",
verbose_name=_("Patient's CPK/MB"),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Translations look good, I suppose... but what about validation messages?

While you've diligently wrapped the verbose_name attributes in _(), the validation error messages from MinValueValidator and MaxValueValidator are still hardcoded. These messages would appear to users when validation fails.

Consider wrapping the validator messages in _(). For example:

 validators=[
-    django.core.validators.MinValueValidator(0),
-    django.core.validators.MaxValueValidator(100),
+    django.core.validators.MinValueValidator(0, message=_("Value must be greater than or equal to 0")),
+    django.core.validators.MaxValueValidator(100, message=_("Value must be less than or equal to 100")),
 ],

Also applies to: 37-37, 50-50, 60-60, 119-119

@@ -91,7 +92,7 @@ class Migration(migrations.Migration):
default=None,
max_length=255,
null=True,
verbose_name="Vilalge Name of Patient (IDSP Req)",
verbose_name=_("Vilalge Name of Patient (IDSP Req)"),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Those typos in verbose_name are just... charming

There's a slight typo in the verbose name: "Vilalge" should be "Village". I mean, who doesn't love a good typo in production, right?

-verbose_name=_("Vilalge Name of Patient (IDSP Req)"),
+verbose_name=_("Village Name of Patient (IDSP Req)"),

Also applies to: 180-180

@@ -49,7 +50,7 @@ class Migration(migrations.Migration):
default=None,
max_length=255,
null=True,
verbose_name="Institution of Healtcare Worker (IDSP Req)",
verbose_name=_("Institution of Healtcare Worker (IDSP Req)"),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Another typo spotted in verbose_name

There's a typo in "Healtcare" which should be "Healthcare". These things happen to the best of us, I suppose.

-verbose_name=_("Institution of Healtcare Worker (IDSP Req)"),
+verbose_name=_("Institution of Healthcare Worker (IDSP Req)"),

Also applies to: 138-138

@@ -15,7 +16,7 @@ class Migration(migrations.Migration):
field=models.TextField(
blank=True,
default="",
verbose_name="Already pescribed medication if any",
verbose_name=_("Already pescribed medication if any"),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Oh, look what we have here... a tiny typo.

While the translation implementation is correct, there's a small spelling error in both instances: "pescribed" should be "prescribed". I mean, who doesn't love a good spell check, right?

Apply this fix to both instances:

-                verbose_name=_("Already pescribed medication if any"),
+                verbose_name=_("Already prescribed medication if any"),

Also applies to: 28-28

),
),
migrations.AddField(
model_name="historicalpatientregistration",
name="date_declared_positive",
field=models.DateTimeField(
blank=True, null=True, verbose_name="Date Patient is Declared Positive"
blank=True, null=True, verbose_name=_("Date Patient is Declared Positive")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider adding validation for date_declared_positive

The date_declared_positive should probably not be in the future, unless we're dealing with time travelers here.

Consider adding a validator to ensure the date is not in the future:

from django.core.validators import MaxValueValidator
from django.utils import timezone

field=models.DateTimeField(
    blank=True, 
    null=True,
    validators=[MaxValueValidator(timezone.now)],
    verbose_name=_("Date Patient is Declared Positive")
)

Also applies to: 53-53

@vigneshhari
Copy link
Member

Remove every change that involves a migration file. We will not edit anything in a migration.

@Harsh-D-2004
Copy link
Contributor Author

Yes will update the migration files and anywhere else u want me to make changes except verbose name and help text ??
@vigneshhari

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants