U SW.@sBz ddlZWnek r(ddlZYnXddlZddlZejddkZzddlmZWn<ek rejddkrddlmZn ddl mZYnXz ddl Z Wnek rdZ YnXz ddl Z Wnek rdZ YnXzddl m Z ddlmZWnek rdZ ZYnXzddlmZmZWnek rPdZZYnXddlTddlmZdd lmZdd lmZdd lmZdd lmZererGd ddeZGdddeZGdddeZGdddeZGdddeZ GdddeZ!GdddeZ"GdddeZ#e r>er>GdddeZ$dS)N)StringIO)AES)Random)hashpwgensalt)*)binary_construct)Field)FieldDescriptor) SelectQuery) unicode_typec@seZdZddZdS) PasswordHashcCs|d}t|||kSNutf-8)encoder)selfZpasswordr /fields.pycheck_password1s zPasswordHash.check_passwordN)__name__ __module__ __qualname__rrrrrr0srcs.eZdZdfdd ZddZddZZS) PasswordField cs6dttfkrtd||_d|_tt|j||dS)Nz2Missing library required for PasswordField: bcrypt)rr ValueErrorbcrypt_iterationsZ raw_passwordsuperr__init__)rZ iterationsargskwargs __class__rrr7s  zPasswordField.__init__cCsFt|trt|St|tr&|d}t|j}|dkr<|St||S)z5Convert the python value for storage in the database.rN) isinstancerbytesr rrrr)rvalueZsaltrrrdb_value>s     zPasswordField.db_valuecCst|tr|d}t|S)z/Convert the database value to a pythonic value.r)r#r rrrr%rrr python_valueHs  zPasswordField.python_value)r)rrrrr&r( __classcell__rrr!rr6s rc@seZdZddZddZdS)DeferredThroughModelcCs||_||_||_dSN) model_classfieldname)rr,r-r.rrr set_fieldPszDeferredThroughModel.set_fieldcCs||j_|j|j|jdSr+)r-_through_model add_to_classr,r.)r through_modelrrr set_modelUszDeferredThroughModel.set_modelN)rrrr/r3rrrrr*Osr*c@s6eZdZd ddZddZddZd d Zd d ZdS)ManyToManyFieldNFcCsP|dk r(t|ttfs(t|ts(td||_||_||_||_ d|_ d|_ dS)Nz[Unexpected value for `through_model`. Expected `Model`, `Proxy` or `DeferredThroughModel`.F) r#Proxyr* issubclassModel TypeError rel_model _related_namer0 _is_backref primary_key verbose_name)rr9 related_namer2r;rrrrZs zManyToManyField.__init__cCst|Sr+)ManyToManyFieldDescriptorrrrr_get_descriptorhszManyToManyField._get_descriptorcstjtr,fdd}j|dStjtrLjdS__jsrt dd _t  jstjjdd}jpjjd}|j|dS)Ncs|_dSr+)r0r1)r2r,r.rrrcallbackmsz.ManyToManyField.add_to_class..callbackz_+ T)r2r;s)r#r0r5Zattach_callbackr*r/r.r,r=resubtitlesetattrrAr;r4r:_metar1r9)rr,r.rCZbackrefr>rrBrr1ks(   zManyToManyField.add_to_classcCs(ddt|j|jf|j |jffDS)NcSsg|] \}}|qSrr).0_modelrrr sz.ManyToManyField.get_models..)sortedr;r,r9r@rrr get_modelss  zManyToManyField.get_modelscsjs\ddfDGfddd}jjtdjjtdi}||d<tdjjftf|_jS)NcSsg|] }|jjqSr)rJdb_table)rKrMrrrrNsz5ManyToManyField.get_through_model..cs<eZdZjjjZdeZjjjjfdffZ dZ dS)z/ManyToManyField.get_through_model..Metaz %s_%s_throughTFN) rrrr,rJdatabasetuplerQr.ZindexesZvalidate_backrefsrZlhsZrhsrZtablesrrMetas  rU)r9z %s%sThrough)r0rPrJr.ZForeignKeyFieldtyperr7)rrUZattrsrrTrget_through_models   z!ManyToManyField.get_through_model)NNF)rrrrrAr1rPrWrrrrr4Ys r4cs.eZdZfddZdddZddZZS) r?csRtt|||j|_|j|_||_|jj|j|_ |jj|j|_ dSr+) rr?rr,r9rWr2rJZ rel_for_modelsrc_fkdest_fk)rr-r!rrrs  z"ManyToManyFieldDescriptor.__init__NcCs<|dk r6t|||j|j|j|j|kS|jSr+) ManyToManyQueryr9selectjoinr2r,whererXr-)rinstanceZ instance_typerrr__get__sz!ManyToManyFieldDescriptor.__get__cCs||}|j|dddS)NT)clear_existing)r_add)rr^r%queryrrr__set__s z!ManyToManyFieldDescriptor.__set__)N)rrrrr_rcr)rrr!rr?s  r?csFeZdZfddZddZddZddd Zd d Zd d ZZ S)rZcs"||_||_tt|j||dSr+) _instance_field_descriptorrrZr)rr^Zfield_descriptorrr r!rrrszManyToManyQuery.__init__cCs(t||j|j|j}|j|_||Sr+)rVrdrer,rRZ_clone_attributes)rrbrrrcloneszManyToManyQuery.clonecCs t|dtrdd|DS|S)NrcSsg|] }|qSr)get_id)rKobjrrrrNsz,ManyToManyQuery._id_list..)r#r7)rZmodel_or_id_listrrr_id_listszManyToManyQuery._id_listFcs|r jt|trZ|ttjj j j }j j jjg|dnFt|ttfsn|g}|svdSfdd|D}j |dS)N)Zfieldsrbcs&g|]}jjjjj|iqSr)rXr.rdrgrY)rKZrel_idfdrrrrNs z'ManyToManyQuery.add..)clearrer#r r[ZSQLstrrdrgr9rJr<r2Z insert_fromrXrYexecutelistrSriZ insert_many)rr%r`rbZinsertsrrjrras(    zManyToManyQuery.addcCs|j}t|trJ||jjj}|j |j |>|j |j k@St|ttfs^|g}|sfdS|j |j ||>|j |j k@SdSr+)rer#r r[r,rJr<r2deleter]rYrXrdrgrnrorSri)rr%rkZsubqueryrrrremoves"   zManyToManyQuery.removecCs |jj|jj|jkSr+)rer2rpr]rXrdrnr@rrrrls  zManyToManyQuery.clear)F) rrrrrfrirarqrlr)rrr!rrZs   rZcs\eZdZdZdZeeeeiZdeffdd Ze rDddZ dd Z nd dZ d d Z Z S) CompressedFieldzlibbz2csf||_||jkrtd||j|}|dkr:td|||_|j|_|j|_tt|j||dS)NzUnrecognized algorithm %sz Missing library required for %s.) compression_levelalgorithm_to_importr algorithmcompress decompressrrrr)rrvrxrr Zcompress_moduler!rrr s    zCompressedField.__init__cCs|dk rt|||jSdSr+)r ryrvr'rrrr&s zCompressedField.db_valuecCs|dk r||SdSr+)rzr'rrrr(szCompressedField.python_valuecCs|dk r|t||jSdSr+)ryr rvr'rrrr&!s cCs|dk r||dSdSr)rzdecoder'rrrr(&s) rrrZZLIBZBZ2rsrtrwrPY2r&r(r)rrr!rrrs rrc@seZdZddZddZdS) PickledFieldcCs|dk rt|SdSr+)pickledumpsr'rrrr&,szPickledField.db_valuecCs*|dk r&t|tr|d}t|SdS)NZraw_unicode_escape)r#r rr~loadsr'rrrr(0s  zPickledField.python_valueN)rrrr&r(rrrrr}+sr}csZeZdZfddZddZddZddZerBd d Zd d Z nd d Zdd Z Z S)AESEncryptedFieldcs||_tt|j||dSr+)keyrrr)rrrr r!rrr9szAESEncryptedField.__init__cCs8t|dkrtd|ddt|}t|tj|S)N z"Key length cannot exceed 32 bytes.rD)lenrrnewZMODE_CFB)rrivrrr get_cipher=s zAESEncryptedField.get_ciphercCs(ttj}||j|}|||Sr+)rZget_random_bytesr block_sizerrencryptrr%rZcipherrrrrCs zAESEncryptedField.encryptcCs0|dtj}||j|}||tjdSr+)rrrrdecryptrrrrrHszAESEncryptedField.decryptcCs|dk rt||SdSr+)r rr'rrrr&NszAESEncryptedField.db_valuecCs|dk r||SdSr+rr'rrrr(RszAESEncryptedField.python_valuecCs|dk r||SdSr+)rr'rrrr&VscCs|dk r||SdSr+rr'rrrr(Zs) rrrrrrrr|r&r(r)rrr!rr8s  r)%ZcPickler~ ImportErrorrFsys version_infor|Z cStringIOriortrsZ Crypto.CipherrZCryptorZbcryptrrZpeeweer r r r r r$rZ BlobFieldrobjectr*r4r?rZrrr}rrrrrs\             JG*