Skip to content

Commit aef1c4b

Browse files
authored
Refactored lookups and mixins (#63)
* Added `__range` lookup for Date / DateTime fields (#59) * Remove compatibility for `Django 1.8, 1.9, and 1.10` (#62) * Improved `setup.py`: * check for Python 3.5+ * updated classifiers * Improved `make` file for release to use `twine` * Added additional shields to `README` * Updated Travis config to include Python 3.5 and 3.6 * Refactored lookups and mixins
1 parent bac2044 commit aef1c4b

File tree

9 files changed

+112
-378
lines changed

9 files changed

+112
-378
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
### 2.3.0
22

33
* Added `__range` lookup for Date / DateTime fields (#59)
4-
* Remove compatibility for `Django 1.8, 1.9, and 1.10`
4+
* Remove compatibility for `Django 1.8, 1.9, and 1.10` (#62)
55
* Improved `setup.py`:
66
* check for Python 3.5+
77
* updated classifiers
88
* Improved `make` file for release to use `twine`
99
* Added additional shields to `README`
1010
* Updated Travis config to include Python 3.5 and 3.6
11+
* Refactored lookups and mixins
1112

1213
## 2.2.0
1314

CONTRIBUTING.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ We welcome contributions in many forms:
1616

1717
## Releasing to PyPI
1818

19-
This section only applies to maintainers
19+
This section only applies to maintainers.
2020

21-
* Run `pip install setuptools twine`
22-
* Run `make release`
21+
In your virtual environment, run
22+
23+
* `pip install pip --upgrade`
24+
* `pip install setuptools wheel twine`
25+
* `make release`

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ encrypt and decrypt data for fields.
1919
pip install django-pgcrypto-fields
2020
```
2121

22+
In your Django `settings.py`, add `pgcrypto` to `INSTALLED_APPS`:
23+
24+
```python
25+
INSTALLED_APPS = (
26+
'pgcrypto',
27+
# Other apps
28+
)
29+
```
30+
2231
## Fields
2332

2433
`django-pgcrypto-fields` has 3 kinds of fields:

pgcrypto/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,8 @@
1717
PGP_PUB_ENCRYPT_SQL = "pgp_pub_encrypt(%s, dearmor('{}'))".format(
1818
settings.PUBLIC_PGP_KEY,
1919
)
20+
PGP_PUB_DECRYPT_SQL = "pgp_pub_decrypt(%s, dearmor('{}'))".format(
21+
settings.PRIVATE_PGP_KEY,
22+
)
2023
PGP_SYM_ENCRYPT_SQL = "pgp_sym_encrypt(%s, '{}')".format(settings.PGCRYPTO_KEY)
24+
PGP_SYM_DECRYPT_SQL = "pgp_sym_decrypt(%s, '{}')".format(settings.PGCRYPTO_KEY)

pgcrypto/aggregates.py

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,26 +46,7 @@ class PGPSymmetricKeySQL:
4646
)
4747

4848

49-
class EncryptionBase(Aggregate):
50-
"""Base class to add a custom aggregate method to a query."""
51-
52-
def add_to_query(self, query, alias, col, source, is_summary):
53-
"""Add the aggregate to the query. This method will be removed in Django 1.10.
54-
55-
`alias` is `{self.lookup}__decrypt` where 'decrypt' is `self.name.lower()`.
56-
57-
`self.lookup` is defined in `models.Aggregate.__init__`.
58-
"""
59-
aggregate = self.sql(
60-
col,
61-
source=source,
62-
is_summary=is_summary,
63-
**self.extra
64-
)
65-
query.aggregates[alias] = aggregate
66-
67-
68-
class PGPPublicKeyAggregate(PGPPublicKeySQL, EncryptionBase):
49+
class PGPPublicKeyAggregate(PGPPublicKeySQL, Aggregate):
6950
"""PGP public key based aggregation.
7051
7152
`pgp_pub_encrypt` and `dearmor` are pgcrypto functions which encrypt
@@ -74,7 +55,7 @@ class PGPPublicKeyAggregate(PGPPublicKeySQL, EncryptionBase):
7455
name = 'decrypted'
7556

7657

77-
class PGPSymmetricKeyAggregate(PGPSymmetricKeySQL, EncryptionBase):
58+
class PGPSymmetricKeyAggregate(PGPSymmetricKeySQL, Aggregate):
7859
"""PGP symmetric key based aggregation.
7960
8061
`pgp_sym_encrypt` is a pgcrypto functions, encrypts the field's value
@@ -83,7 +64,7 @@ class PGPSymmetricKeyAggregate(PGPSymmetricKeySQL, EncryptionBase):
8364
name = 'decrypted'
8465

8566

86-
class DatePGPPublicKeyAggregate(EncryptionBase):
67+
class DatePGPPublicKeyAggregate(Aggregate):
8768
"""PGP public key based aggregation.
8869
8970
`pgp_sym_encrypt` is a pgcrypto functions, encrypts the field's value
@@ -97,7 +78,7 @@ class DatePGPPublicKeyAggregate(EncryptionBase):
9778
)
9879

9980

100-
class DatePGPSymmetricKeyAggregate(EncryptionBase):
81+
class DatePGPSymmetricKeyAggregate(Aggregate):
10182
"""PGP symmetric key based aggregation.
10283
10384
`pgp_sym_encrypt` is a pgcrypto functions, encrypts the field's value
@@ -111,7 +92,7 @@ class DatePGPSymmetricKeyAggregate(EncryptionBase):
11192
)
11293

11394

114-
class DateTimePGPPublicKeyAggregate(EncryptionBase):
95+
class DateTimePGPPublicKeyAggregate(Aggregate):
11596
"""PGP public key based aggregation.
11697
11798
`pgp_sym_encrypt` is a pgcrypto functions, encrypts the field's value
@@ -125,7 +106,7 @@ class DateTimePGPPublicKeyAggregate(EncryptionBase):
125106
)
126107

127108

128-
class DateTimePGPSymmetricKeyAggregate(EncryptionBase):
109+
class DateTimePGPSymmetricKeyAggregate(Aggregate):
129110
"""PGP symmetric key based aggregation.
130111
131112
`pgp_sym_encrypt` is a pgcrypto functions, encrypts the field's value

pgcrypto/fields.py

Lines changed: 33 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,15 @@
55
HMAC_SQL,
66
INTEGER_PGP_PUB_ENCRYPT_SQL,
77
INTEGER_PGP_SYM_ENCRYPT_SQL,
8-
PGP_PUB_ENCRYPT_SQL,
9-
PGP_SYM_ENCRYPT_SQL,
108
)
119
from pgcrypto.lookups import (
12-
DatePGPPublicKeyEXACT,
13-
DatePGPPublicKeyGT,
14-
DatePGPPublicKeyGTE,
15-
DatePGPPublicKeyLT,
16-
DatePGPPublicKeyLTE,
17-
DatePGPPublicKeyRANGE,
18-
DatePGPSymmetricKeyEXACT,
19-
DatePGPSymmetricKeyGT,
20-
DatePGPSymmetricKeyGTE,
21-
DatePGPSymmetricKeyLT,
22-
DatePGPSymmetricKeyLTE,
23-
DatePGPSymmetricKeyRANGE,
24-
DateTimePGPPublicKeyEXACT,
25-
DateTimePGPPublicKeyGT,
26-
DateTimePGPPublicKeyGTE,
27-
DateTimePGPPublicKeyLT,
28-
DateTimePGPPublicKeyLTE,
29-
DateTimePGPPublicKeyRANGE,
30-
DateTimePGPSymmetricKeyEXACT,
31-
DateTimePGPSymmetricKeyGT,
32-
DateTimePGPSymmetricKeyGTE,
33-
DateTimePGPSymmetricKeyLT,
34-
DateTimePGPSymmetricKeyLTE,
35-
DateTimePGPSymmetricKeyRANGE,
36-
DigestLookup,
37-
HMACLookup,
10+
DateTimeExactLookup,
11+
DateTimeGteLookup,
12+
DateTimeGtLookup,
13+
DateTimeLteLookup,
14+
DateTimeLtLookup,
15+
DateTimeRangeLookup,
16+
HashLookup,
3817
)
3918
from pgcrypto.mixins import (
4019
DatePGPPublicKeyFieldMixin,
@@ -54,20 +33,19 @@ class TextDigestField(HashMixin, models.TextField):
5433
encrypt_sql = DIGEST_SQL
5534

5635

57-
TextDigestField.register_lookup(DigestLookup)
36+
TextDigestField.register_lookup(HashLookup)
5837

5938

6039
class TextHMACField(HashMixin, models.TextField):
6140
"""Text HMAC field for postgres."""
6241
encrypt_sql = HMAC_SQL
6342

6443

65-
TextHMACField.register_lookup(HMACLookup)
44+
TextHMACField.register_lookup(HashLookup)
6645

6746

6847
class EmailPGPPublicKeyField(EmailPGPPublicKeyFieldMixin, models.EmailField):
6948
"""Email PGP public key encrypted field."""
70-
encrypt_sql = PGP_PUB_ENCRYPT_SQL
7149

7250

7351
class IntegerPGPPublicKeyField(PGPPublicKeyFieldMixin, models.IntegerField):
@@ -77,40 +55,34 @@ class IntegerPGPPublicKeyField(PGPPublicKeyFieldMixin, models.IntegerField):
7755

7856
class TextPGPPublicKeyField(PGPPublicKeyFieldMixin, models.TextField):
7957
"""Text PGP public key encrypted field."""
80-
encrypt_sql = PGP_PUB_ENCRYPT_SQL
8158

8259

8360
class DatePGPPublicKeyField(DatePGPPublicKeyFieldMixin, models.TextField):
8461
"""Date PGP public key encrypted field for postgres."""
85-
encrypt_sql = PGP_PUB_ENCRYPT_SQL
86-
cast_sql = 'cast(%s as DATE)'
8762

8863

89-
DatePGPPublicKeyField.register_lookup(DatePGPPublicKeyEXACT)
90-
DatePGPPublicKeyField.register_lookup(DatePGPPublicKeyGT)
91-
DatePGPPublicKeyField.register_lookup(DatePGPPublicKeyGTE)
92-
DatePGPPublicKeyField.register_lookup(DatePGPPublicKeyLT)
93-
DatePGPPublicKeyField.register_lookup(DatePGPPublicKeyLTE)
94-
DatePGPPublicKeyField.register_lookup(DatePGPPublicKeyRANGE)
64+
DatePGPPublicKeyField.register_lookup(DateTimeExactLookup)
65+
DatePGPPublicKeyField.register_lookup(DateTimeLtLookup)
66+
DatePGPPublicKeyField.register_lookup(DateTimeLteLookup)
67+
DatePGPPublicKeyField.register_lookup(DateTimeGtLookup)
68+
DatePGPPublicKeyField.register_lookup(DateTimeGteLookup)
69+
DatePGPPublicKeyField.register_lookup(DateTimeRangeLookup)
9570

9671

9772
class DateTimePGPPublicKeyField(DateTimePGPPublicKeyFieldMixin, models.TextField):
9873
"""DateTime PGP public key encrypted field for postgres."""
99-
encrypt_sql = PGP_PUB_ENCRYPT_SQL
100-
cast_sql = 'cast(%s as TIMESTAMP)'
10174

10275

103-
DateTimePGPPublicKeyField.register_lookup(DateTimePGPPublicKeyEXACT)
104-
DateTimePGPPublicKeyField.register_lookup(DateTimePGPPublicKeyGT)
105-
DateTimePGPPublicKeyField.register_lookup(DateTimePGPPublicKeyGTE)
106-
DateTimePGPPublicKeyField.register_lookup(DateTimePGPPublicKeyLT)
107-
DateTimePGPPublicKeyField.register_lookup(DateTimePGPPublicKeyLTE)
108-
DateTimePGPPublicKeyField.register_lookup(DateTimePGPPublicKeyRANGE)
76+
DateTimePGPPublicKeyField.register_lookup(DateTimeExactLookup)
77+
DateTimePGPPublicKeyField.register_lookup(DateTimeLtLookup)
78+
DateTimePGPPublicKeyField.register_lookup(DateTimeLteLookup)
79+
DateTimePGPPublicKeyField.register_lookup(DateTimeGtLookup)
80+
DateTimePGPPublicKeyField.register_lookup(DateTimeGteLookup)
81+
DateTimePGPPublicKeyField.register_lookup(DateTimeRangeLookup)
10982

11083

11184
class EmailPGPSymmetricKeyField(EmailPGPSymmetricKeyFieldMixin, models.EmailField):
11285
"""Email PGP symmetric key encrypted field."""
113-
encrypt_sql = PGP_SYM_ENCRYPT_SQL
11486

11587

11688
class IntegerPGPSymmetricKeyField(PGPSymmetricKeyFieldMixin, models.IntegerField):
@@ -120,32 +92,27 @@ class IntegerPGPSymmetricKeyField(PGPSymmetricKeyFieldMixin, models.IntegerField
12092

12193
class TextPGPSymmetricKeyField(PGPSymmetricKeyFieldMixin, models.TextField):
12294
"""Text PGP symmetric key encrypted field for postgres."""
123-
encrypt_sql = PGP_SYM_ENCRYPT_SQL
12495

12596

12697
class DatePGPSymmetricKeyField(DatePGPSymmetricKeyFieldMixin, models.TextField):
12798
"""Date PGP symmetric key encrypted field for postgres."""
128-
encrypt_sql = PGP_SYM_ENCRYPT_SQL
129-
cast_sql = 'cast(%s as DATE)'
13099

131100

132-
DatePGPSymmetricKeyField.register_lookup(DatePGPSymmetricKeyEXACT)
133-
DatePGPSymmetricKeyField.register_lookup(DatePGPSymmetricKeyGT)
134-
DatePGPSymmetricKeyField.register_lookup(DatePGPSymmetricKeyGTE)
135-
DatePGPSymmetricKeyField.register_lookup(DatePGPSymmetricKeyLT)
136-
DatePGPSymmetricKeyField.register_lookup(DatePGPSymmetricKeyLTE)
137-
DatePGPSymmetricKeyField.register_lookup(DatePGPSymmetricKeyRANGE)
101+
DatePGPSymmetricKeyField.register_lookup(DateTimeExactLookup)
102+
DatePGPSymmetricKeyField.register_lookup(DateTimeLtLookup)
103+
DatePGPSymmetricKeyField.register_lookup(DateTimeLteLookup)
104+
DatePGPSymmetricKeyField.register_lookup(DateTimeGtLookup)
105+
DatePGPSymmetricKeyField.register_lookup(DateTimeGteLookup)
106+
DatePGPSymmetricKeyField.register_lookup(DateTimeRangeLookup)
138107

139108

140109
class DateTimePGPSymmetricKeyField(DateTimePGPSymmetricKeyFieldMixin, models.TextField):
141110
"""DateTime PGP symmetric key encrypted field for postgres."""
142-
encrypt_sql = PGP_SYM_ENCRYPT_SQL
143-
cast_sql = 'cast(%s as TIMESTAMP)'
144111

145112

146-
DateTimePGPSymmetricKeyField.register_lookup(DateTimePGPSymmetricKeyEXACT)
147-
DateTimePGPSymmetricKeyField.register_lookup(DateTimePGPSymmetricKeyGT)
148-
DateTimePGPSymmetricKeyField.register_lookup(DateTimePGPSymmetricKeyGTE)
149-
DateTimePGPSymmetricKeyField.register_lookup(DateTimePGPSymmetricKeyLT)
150-
DateTimePGPSymmetricKeyField.register_lookup(DateTimePGPSymmetricKeyLTE)
151-
DateTimePGPSymmetricKeyField.register_lookup(DateTimePGPSymmetricKeyRANGE)
113+
DateTimePGPSymmetricKeyField.register_lookup(DateTimeExactLookup)
114+
DateTimePGPSymmetricKeyField.register_lookup(DateTimeLtLookup)
115+
DateTimePGPSymmetricKeyField.register_lookup(DateTimeLteLookup)
116+
DateTimePGPSymmetricKeyField.register_lookup(DateTimeGtLookup)
117+
DateTimePGPSymmetricKeyField.register_lookup(DateTimeGteLookup)
118+
DateTimePGPSymmetricKeyField.register_lookup(DateTimeRangeLookup)

0 commit comments

Comments
 (0)