add dependencies

This commit is contained in:
Your Name 2024-06-29 12:14:46 -04:00 committed by Henri Dickson
parent 3795081098
commit 6eaf5397bc
5 changed files with 49 additions and 4 deletions

View file

@ -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:

View file

@ -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)

View file

@ -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]

View file

@ -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

View file

@ -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