@@ -109,11 +109,12 @@ def __str__(self) -> str:
109109class EncryptionMixin (models .Model ):
110110 salt = models .CharField (max_length = 32 , editable = False , default = uuid .uuid4 ().hex )
111111
112- def _fernet (self ) -> Fernet :
112+ @classmethod
113+ def _fernet (cls , salt : str ) -> Fernet :
113114 kdf = PBKDF2HMAC (
114115 algorithm = hashes .SHA256 (),
115116 length = 32 ,
116- salt = self . salt .encode (),
117+ salt = salt .encode (),
117118 iterations = 100000 ,
118119 )
119120 try :
@@ -125,12 +126,17 @@ def _fernet(self) -> Fernet:
125126 key = base64 .urlsafe_b64encode (kdf .derive (secret .encode ()))
126127 return Fernet (key )
127128
129+ @classmethod
130+ def encrypted_value (cls , value : str , salt : str ) -> str :
131+ f = cls ._fernet (salt )
132+ return f .encrypt (value .encode ()).decode ()
133+
128134 def _encrypt_password (self , password : str ) -> str :
129- f = self ._fernet ()
135+ f = self ._fernet (self . salt )
130136 return f .encrypt (password .encode ()).decode ()
131137
132138 def decrypt_password (self , encrypted_password : str ) -> str :
133- f = self ._fernet ()
139+ f = self ._fernet (self . salt )
134140 return f .decrypt (encrypted_password .encode ()).decode ()
135141
136142 class Meta :
@@ -698,3 +704,29 @@ def save(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
698704 self .key = self ._encrypt_password (self .key )
699705 self .full_clean ()
700706 super ().save (* args , ** kwargs )
707+
708+
709+ class JobName (StrEnum ):
710+ DELIVER_CONTENTS = "deliver_contents"
711+
712+
713+ class JobStatus (StrEnum ):
714+ RUNNING = "running"
715+ COMPLETED = "completed"
716+
717+
718+ class JobExecution (models .Model ):
719+ job_name = models .CharField (
720+ max_length = 200 , choices = [(job .name , job .value ) for job in JobName ]
721+ )
722+ started_at = models .DateTimeField (auto_now_add = True )
723+ finished_at = models .DateTimeField (null = True , blank = True )
724+ status = models .CharField (
725+ max_length = 50 ,
726+ choices = [(status .name , status .value ) for status in JobStatus ],
727+ )
728+
729+ def __str__ (self ) -> str :
730+ return (
731+ f"Job: { self .job_name } started at { self .started_at } - Status: { self .status } "
732+ )
0 commit comments