add dependencies
This commit is contained in:
parent
3795081098
commit
6eaf5397bc
5 changed files with 49 additions and 4 deletions
|
@ -1,13 +1,18 @@
|
||||||
# pyright: reportIncompatibleMethodOverride=false, reportFunctionMemberAccess=false
|
# pyright: reportIncompatibleMethodOverride=false, reportFunctionMemberAccess=false
|
||||||
import copy
|
import copy
|
||||||
|
from base64 import b64decode, b64encode
|
||||||
from datetime import date, datetime
|
from datetime import date, datetime
|
||||||
from functools import partialmethod
|
from functools import partialmethod
|
||||||
|
from hashlib import sha256
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
|
|
||||||
import django
|
import django
|
||||||
|
from cryptography.fernet import Fernet, MultiFernet
|
||||||
|
from django.conf import settings
|
||||||
from django.core.exceptions import FieldError
|
from django.core.exceptions import FieldError
|
||||||
from django.db.models import fields
|
from django.db.models import Value, fields
|
||||||
from django.utils import dateparse, timezone
|
from django.utils import dateparse, timezone
|
||||||
|
from django.utils.encoding import force_bytes
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
# from django.db.models import JSONField as DJANGO_JSONField
|
# from django.db.models import JSONField as DJANGO_JSONField
|
||||||
|
@ -16,6 +21,28 @@ from django.utils.translation import gettext_lazy as _
|
||||||
from django_jsonform.models.fields import ArrayField as DJANGO_ArrayField
|
from django_jsonform.models.fields import ArrayField as DJANGO_ArrayField
|
||||||
from django_jsonform.models.fields import JSONField as DJANGO_JSONField
|
from django_jsonform.models.fields import JSONField as DJANGO_JSONField
|
||||||
|
|
||||||
|
|
||||||
|
def _get_crypter():
|
||||||
|
configured_keys = [settings.SECRET_KEY] + settings.SECRET_KEY_FALLBACKS
|
||||||
|
keys = [Fernet(b64encode(sha256(force_bytes(k)).digest())) for k in configured_keys]
|
||||||
|
if len(keys) == 0:
|
||||||
|
raise ValueError("No keys defined")
|
||||||
|
return MultiFernet(keys)
|
||||||
|
|
||||||
|
|
||||||
|
CRYPTER = _get_crypter()
|
||||||
|
|
||||||
|
|
||||||
|
def encrypt_str(s: str) -> str:
|
||||||
|
# be sure to encode the string to bytes
|
||||||
|
return CRYPTER.encrypt(s.encode("utf-8")).decode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def decrypt_str(t: str) -> str:
|
||||||
|
# be sure to decode the bytes to a string
|
||||||
|
return CRYPTER.decrypt(t.encode("utf-8")).decode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
"BooleanField",
|
"BooleanField",
|
||||||
"CharField",
|
"CharField",
|
||||||
|
@ -29,6 +56,7 @@ __all__ = (
|
||||||
"IPAddressField",
|
"IPAddressField",
|
||||||
"GenericIPAddressField",
|
"GenericIPAddressField",
|
||||||
"NullBooleanField",
|
"NullBooleanField",
|
||||||
|
"EncryptedTextField",
|
||||||
"TextField",
|
"TextField",
|
||||||
"TimeField",
|
"TimeField",
|
||||||
"URLField",
|
"URLField",
|
||||||
|
@ -81,9 +109,6 @@ class JSONFieldDescriptor(object):
|
||||||
setattr(instance, self.field.json_field_name, json_value)
|
setattr(instance, self.field.json_field_name, json_value)
|
||||||
|
|
||||||
|
|
||||||
fields.CharField
|
|
||||||
|
|
||||||
|
|
||||||
class JSONFieldMixin(object):
|
class JSONFieldMixin(object):
|
||||||
"""
|
"""
|
||||||
Override django.db.model.fields.Field.contribute_to_class
|
Override django.db.model.fields.Field.contribute_to_class
|
||||||
|
@ -226,6 +251,16 @@ class TextField(JSONFieldMixin, fields.TextField):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class EncryptedTextField(JSONFieldMixin, fields.TextField):
|
||||||
|
def to_json(self, value):
|
||||||
|
if value:
|
||||||
|
return encrypt_str(str(value))
|
||||||
|
|
||||||
|
def from_json(self, value):
|
||||||
|
if value:
|
||||||
|
return decrypt_str(value)
|
||||||
|
|
||||||
|
|
||||||
class TimeField(JSONFieldMixin, fields.TimeField):
|
class TimeField(JSONFieldMixin, fields.TimeField):
|
||||||
def to_json(self, value):
|
def to_json(self, value):
|
||||||
if value:
|
if value:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from catalog.book.tests import *
|
from catalog.book.tests import *
|
||||||
|
from catalog.common.jsondata import decrypt_str, encrypt_str
|
||||||
from catalog.game.tests import *
|
from catalog.game.tests import *
|
||||||
from catalog.movie.tests import *
|
from catalog.movie.tests import *
|
||||||
from catalog.music.tests import *
|
from catalog.music.tests import *
|
||||||
|
@ -39,3 +40,9 @@ class CatalogCase(TestCase):
|
||||||
self.hyperion_print.merge_to(self.hyperion_ebook)
|
self.hyperion_print.merge_to(self.hyperion_ebook)
|
||||||
resloved = Item.get_by_url(self.hyperion_hardcover.url, True)
|
resloved = Item.get_by_url(self.hyperion_hardcover.url, True)
|
||||||
self.assertEqual(resloved, self.hyperion_ebook)
|
self.assertEqual(resloved, self.hyperion_ebook)
|
||||||
|
|
||||||
|
def test_encypted_field(self):
|
||||||
|
o = "Hello, World!"
|
||||||
|
e = encrypt_str(o)
|
||||||
|
d = decrypt_str(e)
|
||||||
|
self.assertEqual(o, d)
|
||||||
|
|
|
@ -55,6 +55,7 @@ dependencies = [
|
||||||
"urlman",
|
"urlman",
|
||||||
"validators",
|
"validators",
|
||||||
"deepmerge>=1.1.1",
|
"deepmerge>=1.1.1",
|
||||||
|
"django-typed-models>=0.14.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.rye]
|
[tool.rye]
|
||||||
|
|
|
@ -103,6 +103,7 @@ django-slack==5.19.0
|
||||||
django-stubs==5.0.2
|
django-stubs==5.0.2
|
||||||
django-stubs-ext==5.0.2
|
django-stubs-ext==5.0.2
|
||||||
# via django-stubs
|
# via django-stubs
|
||||||
|
django-typed-models==0.14.0
|
||||||
django-tz-detect==0.5.0
|
django-tz-detect==0.5.0
|
||||||
django-user-messages==1.0.0
|
django-user-messages==1.0.0
|
||||||
djlint==1.34.1
|
djlint==1.34.1
|
||||||
|
|
|
@ -82,6 +82,7 @@ django-rq==2.10.2
|
||||||
django-sass-processor==1.4.1
|
django-sass-processor==1.4.1
|
||||||
django-simple-history==3.7.0
|
django-simple-history==3.7.0
|
||||||
django-slack==5.19.0
|
django-slack==5.19.0
|
||||||
|
django-typed-models==0.14.0
|
||||||
django-tz-detect==0.5.0
|
django-tz-detect==0.5.0
|
||||||
django-user-messages==1.0.0
|
django-user-messages==1.0.0
|
||||||
dnspython==2.6.1
|
dnspython==2.6.1
|
||||||
|
|
Loading…
Add table
Reference in a new issue