|
1 | 1 | from django.db import models
|
2 | 2 |
|
3 | 3 | from django_mongodb_backend.fields import (
|
| 4 | + EmbeddedModelField, |
4 | 5 | EncryptedBigIntegerField,
|
5 | 6 | EncryptedBinaryField,
|
6 | 7 | EncryptedBooleanField,
|
|
21 | 22 | EncryptedTimeField,
|
22 | 23 | EncryptedURLField,
|
23 | 24 | )
|
| 25 | +from django_mongodb_backend.models import EmbeddedModel |
24 | 26 |
|
25 |
| -EQUALITY_QUERY = {"queryType": "equality"} |
26 |
| -RANGE_QUERY = {"queryType": "range"} |
27 | 27 |
|
| 28 | +class Billing(EmbeddedModel): |
| 29 | + cc_type = models.CharField(max_length=50) |
| 30 | + cc_number = models.CharField(max_length=20) |
| 31 | + |
| 32 | + |
| 33 | +class PatientRecord(EmbeddedModel): |
| 34 | + ssn = models.CharField(max_length=11) |
| 35 | + billing = EmbeddedModelField(Billing) |
| 36 | + |
| 37 | + |
| 38 | +class Patient(models.Model): |
| 39 | + patient_name = models.CharField(max_length=255) |
| 40 | + patient_id = models.BigIntegerField() |
| 41 | + patient_record = EmbeddedModelField(PatientRecord) |
| 42 | + |
| 43 | + def __str__(self): |
| 44 | + return f"{self.patient_name} ({self.patient_id})" |
| 45 | + |
| 46 | + |
| 47 | +class EncryptedModel(models.Model): |
| 48 | + """ |
| 49 | + Abstract base model for all Encrypted models |
| 50 | + that require the 'supports_queryable_encryption' DB feature. |
| 51 | + """ |
28 | 52 |
|
29 |
| -class QueryableEncryptionModelBase(models.Model): |
30 | 53 | class Meta:
|
31 | 54 | abstract = True
|
32 | 55 | required_db_features = {"supports_queryable_encryption"}
|
33 | 56 |
|
34 | 57 |
|
35 |
| -class Appointment(QueryableEncryptionModelBase): |
36 |
| - start_time = EncryptedTimeField(queries=EQUALITY_QUERY) |
| 58 | +# Equality-queryable fields |
| 59 | +class EncryptedBinaryTest(EncryptedModel): |
| 60 | + value = EncryptedBinaryField(queries={"queryType": "equality"}) |
| 61 | + |
| 62 | + |
| 63 | +class EncryptedBooleanTest(EncryptedModel): |
| 64 | + value = EncryptedBooleanField(queries={"queryType": "equality"}) |
| 65 | + |
| 66 | + |
| 67 | +class EncryptedCharTest(EncryptedModel): |
| 68 | + value = EncryptedCharField(max_length=255, queries={"queryType": "equality"}) |
| 69 | + |
| 70 | + |
| 71 | +class EncryptedEmailTest(EncryptedModel): |
| 72 | + value = EncryptedEmailField(max_length=255, queries={"queryType": "equality"}) |
| 73 | + |
| 74 | + |
| 75 | +class EncryptedGenericIPAddressTest(EncryptedModel): |
| 76 | + value = EncryptedGenericIPAddressField(queries={"queryType": "equality"}) |
| 77 | + |
| 78 | + |
| 79 | +class EncryptedTextTest(EncryptedModel): |
| 80 | + value = EncryptedTextField(queries={"queryType": "equality"}) |
| 81 | + |
| 82 | + |
| 83 | +class EncryptedURLTest(EncryptedModel): |
| 84 | + value = EncryptedURLField(max_length=500, queries={"queryType": "equality"}) |
| 85 | + |
| 86 | + |
| 87 | +# Range-queryable fields (also support equality) |
| 88 | +class EncryptedBigIntegerTest(EncryptedModel): |
| 89 | + value = EncryptedBigIntegerField(queries={"queryType": "range"}) |
| 90 | + |
| 91 | + |
| 92 | +class EncryptedDateTest(EncryptedModel): |
| 93 | + value = EncryptedDateField(queries={"queryType": "range"}) |
| 94 | + |
| 95 | + |
| 96 | +class EncryptedDateTimeTest(EncryptedModel): |
| 97 | + value = EncryptedDateTimeField(queries={"queryType": "range"}) |
| 98 | + |
| 99 | + |
| 100 | +class EncryptedDecimalTest(EncryptedModel): |
| 101 | + value = EncryptedDecimalField(max_digits=10, decimal_places=2, queries={"queryType": "range"}) |
| 102 | + |
| 103 | + |
| 104 | +class EncryptedDurationTest(EncryptedModel): |
| 105 | + value = EncryptedDurationField(queries={"queryType": "range"}) |
| 106 | + |
| 107 | + |
| 108 | +class EncryptedFloatTest(EncryptedModel): |
| 109 | + value = EncryptedFloatField(queries={"queryType": "range"}) |
37 | 110 |
|
38 | 111 |
|
39 |
| -class Billing(QueryableEncryptionModelBase): |
40 |
| - account_balance = EncryptedDecimalField(max_digits=10, decimal_places=2, queries=RANGE_QUERY) |
41 |
| - payment_duration = EncryptedDurationField(queries=RANGE_QUERY) # Duration for billing period |
| 112 | +class EncryptedIntegerTest(EncryptedModel): |
| 113 | + value = EncryptedIntegerField(queries={"queryType": "range"}) |
42 | 114 |
|
43 | 115 |
|
44 |
| -class CreditCard(QueryableEncryptionModelBase): |
45 |
| - card_type = EncryptedCharField(max_length=20, queries=EQUALITY_QUERY) |
46 |
| - card_number = EncryptedIntegerField(queries=EQUALITY_QUERY) |
47 |
| - transaction_reference = EncryptedBigIntegerField( |
48 |
| - queries=EQUALITY_QUERY |
49 |
| - ) # Simulating a long transaction ID |
| 116 | +class EncryptedPositiveBigIntegerTest(EncryptedModel): |
| 117 | + value = EncryptedPositiveBigIntegerField(queries={"queryType": "range"}) |
50 | 118 |
|
51 | 119 |
|
52 |
| -class PatientPortalUser(QueryableEncryptionModelBase): |
53 |
| - last_login_ip = EncryptedGenericIPAddressField(queries=EQUALITY_QUERY) |
54 |
| - profile_url = EncryptedURLField(queries=EQUALITY_QUERY) |
| 120 | +class EncryptedPositiveIntegerTest(EncryptedModel): |
| 121 | + value = EncryptedPositiveIntegerField(queries={"queryType": "range"}) |
55 | 122 |
|
56 | 123 |
|
57 |
| -class PatientRecord(QueryableEncryptionModelBase): |
58 |
| - ssn = EncryptedCharField(max_length=11, queries=EQUALITY_QUERY) |
59 |
| - birth_date = EncryptedDateField(queries=RANGE_QUERY) |
60 |
| - profile_picture_data = EncryptedBinaryField(queries=EQUALITY_QUERY) |
61 |
| - age = EncryptedSmallIntegerField(queries={**RANGE_QUERY, "min": 0, "max": 100}) |
62 |
| - weight = EncryptedFloatField(queries=RANGE_QUERY) |
63 |
| - insurance_policy_number = EncryptedPositiveBigIntegerField(queries=EQUALITY_QUERY) |
64 |
| - emergency_contacts_count = EncryptedPositiveIntegerField(queries=EQUALITY_QUERY) |
65 |
| - completed_visits = EncryptedPositiveSmallIntegerField(queries=EQUALITY_QUERY) |
| 124 | +class EncryptedPositiveSmallIntegerTest(EncryptedModel): |
| 125 | + value = EncryptedPositiveSmallIntegerField(queries={"queryType": "range"}) |
66 | 126 |
|
67 |
| - # TODO: Embed Billing model |
68 |
| - # billing = EncryptedEmbeddedField(Billing) |
69 | 127 |
|
| 128 | +class EncryptedSmallIntegerTest(EncryptedModel): |
| 129 | + value = EncryptedSmallIntegerField(queries={"queryType": "range"}) |
70 | 130 |
|
71 |
| -class Patient(QueryableEncryptionModelBase): |
72 |
| - patient_id = EncryptedIntegerField(queries=EQUALITY_QUERY) |
73 |
| - full_name = EncryptedCharField(max_length=100) |
74 |
| - notes = EncryptedTextField(queries=EQUALITY_QUERY) |
75 |
| - registration_date = EncryptedDateTimeField(queries=EQUALITY_QUERY) |
76 |
| - is_active = EncryptedBooleanField(queries=EQUALITY_QUERY) |
77 |
| - contact_email = EncryptedEmailField(queries=EQUALITY_QUERY) |
78 | 131 |
|
79 |
| - # TODO: Embed PatientRecord model |
80 |
| - # patient_record = EncryptedEmbeddedField(PatientRecord) |
| 132 | +class EncryptedTimeTest(EncryptedModel): |
| 133 | + value = EncryptedTimeField(queries={"queryType": "range"}) |
0 commit comments