
    +j2,                     N   S SK r S SKJr  S SKJrJr  S SKJr  S SKJ	r	J
r
JrJrJrJr   " S S\5      r " S S	\5      r\ " S
 S5      5       r " S S\	5      r " S S\	5      r " S S\	5      r " S S\	5      r " S S\	5      r " S S\	5      r " S S\5      r " S S\	5      rg)    N)	dataclass)AnyLiteralvalidate_blake3_hash)	BaseModel
ConfigDictFieldconintfield_validatormodel_validatorc                   <   ^  \ rS rSrSrS\S\S\4U 4S jjrSrU =r	$ )UploadError   z6Error during upload parsing with HTTP status and code.statuscodemessagec                 H   > [         TU ]  U5        Xl        X l        X0l        g N)super__init__r   r   r   )selfr   r   r   	__class__s       9/home/wildlama/comfy/ComfyUI/app/assets/api/schemas_in.pyr   UploadError.__init__   s    !	    )r   r   r   )
__name__
__module____qualname____firstlineno____doc__intstrr   __static_attributes____classcell__r   s   @r   r   r      s%    @s #   r   r   c                   8   ^  \ rS rSrSrS\S\4U 4S jjrSrU =r$ )AssetValidationError   zDValidation error in asset processing (invalid tags, metadata, etc.).r   r   c                 <   > [         TU ]  U5        Xl        X l        g r   )r   r   r   r   )r   r   r   r   s      r   r   AssetValidationError.__init__   s    !	r   )r   r   )	r   r   r   r    r!   r#   r   r$   r%   r&   s   @r   r(   r(      s    NS 3  r   r(   c                       \ rS rSr% Sr\\S'   \\S'   \S-  \S'   \S-  \S'   \	\   \S'   \S-  \S	'   \S-  \S
'   \S-  \S'   \S-  \S'   Sr
\S-  \S'   Sr\S-  \S'   Srg)ParsedUpload#   z-Result of parsing a multipart upload request.file_presentfile_writtenNfile_client_nametmp_pathtags_rawprovided_nameuser_metadata_rawprovided_hashprovided_hash_existsprovided_mime_typeprovided_preview_id )r   r   r   r    r!   bool__annotations__r"   r#   listr8   r9   r$   r:   r   r   r-   r-   #   su    7Dj Dj3i:Tz!:+%%)d
)&*t*r   r-   c                   4   \ rS rSr% \" \S9r\\   \S'   \" \S9r	\\   \S'   Sr
\S-  \S'   Sr\\\4   S-  \S'   Sr\" S	S
S9\S'   Sr\" SS9\S'   Sr\S-  \S'   Sr\S   \S'   Sr\S   \S'   \" SSSS9\S 5       5       r\" SSS9\S 5       5       rSrg)ListAssetsQuery4   default_factoryinclude_tagsexclude_tagsNname_containsmetadata_filter      i  gelelimitr   )rJ   offsetafter
created_at)namerO   
updated_atsizelast_access_timesortdesc)ascrU   orderbeforemodec                    Uc  / $ [        U[        5      (       aF  UR                  S5       Vs/ s H)  o"R                  5       (       d  M  UR                  5       PM+     sn$ [        U[        5      (       ay  / nU Ho  n[        U[        5      (       d  M  UR                  UR                  S5       Vs/ s H)  o"R                  5       (       d  M  UR                  5       PM+     sn5        Mq     U$ U$ s  snf s  snf N,
isinstancer#   splitstripr=   extendclsvtoutitems        r   _split_csv_tagsListAssetsQuery._split_csv_tagsI   s     9Ia'(wws|A|!wwyIAGGI|AAaCdC((JJ4::c?P?aggi		?PQ  J B
  Q   C1
C12C6
C6
c                 @   Ub  [        U[        5      (       a  U$ [        U[        5      (       aN  UR                  5       (       a9   [        R
                  " U5      n[        U[        5      (       d  [        S5      eU$ g ! [         a  n[        SU 35      UeS nAff = fNzmetadata_filter must be JSON: z%metadata_filter must be a JSON objectr_   dictr#   ra   jsonloads	Exception
ValueErrorrd   re   parsedes       r   _parse_metadata_json$ListAssetsQuery._parse_metadata_jsonY        9
1d++Ha!''))NA fd++ !HIIM  N #A!!EFAMN   A? ?
B	BBr:   )r   r   r   r    r
   r=   rC   r#   r<   rD   rE   rF   ro   r   rL   r   rM   rN   rT   r   rW   r   classmethodri   rw   r$   r:   r   r   r?   r?   4   s    #D9L$s)9#D9L$s)9 $M3:$ .2OT#s(^d*1"$E6Q3$FFaL
 E3: 	 	'P
Q  %+E7=!*^^(C  D &X6  7r   r?   c                   t    \ rS rSr% Sr\S-  \S'   Sr\\\	4   S-  \S'   Sr
\S-  \S'   \" SS9S 5       rS	rg)
UpdateAssetBodyi   NrP   user_metadata
preview_idrN   rY   c                     [        S U R                  U R                  U R                  4 5       5      (       a  [	        S5      eU $ )Nc              3   *   #    U  H	  nUS L v   M     g 7fr   r:   ).0re   s     r   	<genexpr>?UpdateAssetBody._validate_at_least_one_field.<locals>.<genexpr>p   s      
E IEs   z9Provide at least one of: name, user_metadata, preview_id.)allrP   r   r   rs   )r   s    r   _validate_at_least_one_field,UpdateAssetBody._validate_at_least_one_fieldn   sJ     
ii!3!3T__E
 
 
 K  r   r:   )r   r   r   r    rP   r#   r<   r   ro   r   r   r   r   r$   r:   r   r   r}   r}   i   sL    D#*+/M4S>D(/!Jd
!'" #r   r}   c                       \ rS rSr% \" SSS9r\\S'   Sr\S-  \S'   \	" \
S9r\
\   \S	'   \	" \S9r\\\4   \S
'   Sr\S-  \S'   Sr\S-  \S'   \" S5      \S 5       5       r\" S	SS9\S 5       5       rSrg)CreateFromHashBodyz   ignoreTextrastr_strip_whitespacehashNrP   rA   tagsr   	mime_typer   c                 *    [        U=(       d    S5      $ )N r   rd   re   s     r   _require_blake3"CreateFromHashBody._require_blake3   s     $AG,,r   rX   rY   c                 N   Uc  / $ [        U[        5      (       a  U Vs/ s HJ  n[        U5      R                  5       (       d  M#  [        U5      R                  5       R	                  5       PML     nn[        5       n/ nU H,  nX$;  d  M
  UR                  U5        UR                  U5        M.     U$ [        U[        5      (       aT  UR                  S5       Vs/ s H7  o"R                  5       (       d  M  UR                  5       R	                  5       PM9     sn$ / $ s  snf s  snf r\   )	r_   r=   r#   ra   lowersetaddappendr`   )rd   re   rf   rg   seendedups         r   _normalize_tags_field(CreateFromHashBody._normalize_tags_field   s     9Ia34G1aA)3q6<<>'')1CG5DE=HHQKLLO  La/0wws|I|!wwy%AGGIOO%|II	 H Js   "D+DD"6"D"r:   )r   r   r   r    r	   model_configr#   r<   rP   r
   r=   r   ro   r   r   r   r   r   r{   r   r   r$   r:   r   r   r   r   z   s    H4HL
ID#*D1D$s)1$)$$?M4S>? IsTz !Jd
!V-  - V(+  ,r   r   c                       \ rS rSr% \" \S9r\\   \S'   \" \S9r	\\   \S'   Sr
\S-  \S'   Sr\\\4   S-  \S'   Sr\" S	S
S9\S'   \" SSSS9\S 5       5       r\" SSS9\S 5       5       rSrg)TagsRefineQuery   rA   rC   rD   NrE   rF   d   rH     rI   rL   rX   rY   c                    Uc  / $ [        U[        5      (       aF  UR                  S5       Vs/ s H)  o"R                  5       (       d  M  UR                  5       PM+     sn$ [        U[        5      (       ay  / nU Ho  n[        U[        5      (       d  M  UR                  UR                  S5       Vs/ s H)  o"R                  5       (       d  M  UR                  5       PM+     sn5        Mq     U$ U$ s  snf s  snf r\   r^   rc   s        r   ri   TagsRefineQuery._split_csv_tags   s     9Ia'(wws|A|!wwyIAGGI|AAaCdC((JJ4::c?P?aggi		?PQ  J B
  Qrk   c                 @   Ub  [        U[        5      (       a  U$ [        U[        5      (       aN  UR                  5       (       a9   [        R
                  " U5      n[        U[        5      (       d  [        S5      eU$ g ! [         a  n[        SU 35      UeS nAff = frm   rn   rt   s       r   rw   $TagsRefineQuery._parse_metadata_json   ry   rz   r:   )r   r   r   r    r
   r=   rC   r#   r<   rD   rE   rF   ro   r   rL   r   r   r{   ri   rw   r$   r:   r   r   r   r      s    #D9L$s)9#D9L$s)9 $M3:$-1OT#s(^d*1#&E6Q4 &^^(C  D &X6  7r   r   c                       \ rS rSr% \" SSS9r\" SSSS9r\S-  \	S	'   \" S
SSS9r
\\	S'   \" SSSS9r\\	S'   Sr\S   \	S'   Sr\\	S'   \" S	5      \S\S-  S\S-  4S j5       5       rSrg)TagsListQuery   r   Tr   NrH      )
min_length
max_lengthprefixr   r   rI   rL   r   i rM   
count_desc)r   name_ascrW   include_zerore   returnc                 ^    Uc  U$ UR                  5       nUR                  5       =(       d    S $ r   )ra   r   r   s     r   normalize_prefixTagsListQuery.normalize_prefix   s*     9HGGIwwy D r   r:   )r   r   r   r    r	   r   r
   r   r#   r<   rL   r"   rM   rW   r   r   r;   r   r{   r   r$   r:   r   r   r   r      s    H4HLtcBFC$JBsqT*E3*aJ/FC//;E7+,;L$X!t !d
 !  !r   r   c                   ~    \ rS rSr% \" SS9r\" SSS9r\\	   \
S'   \" S5      \S\\	   S	\\	   4S
 j5       5       rSrg)TagsAdd   r   )r   .rH   )r   r   re   r   c                 H   / nU H[  n[        U[        5      (       d  [        S5      eUR                  5       R	                  5       nU(       d  MJ  UR                  U5        M]     [        5       n/ nU H,  nXu;  d  M
  UR                  U5        UR                  U5        M.     U$ )Nztags must be strings)r_   r#   	TypeErrorra   r   r   r   r   )rd   re   rg   rf   tnormr   deduplicatedxs           r   normalize_tagsTagsAdd.normalize_tags   s     Aa%% 677GGIOO%Eu

5!  uA}##A&  r   r:   N)r   r   r   r    r	   r   r
   r   r=   r#   r<   r   r{   r   r$   r:   r   r   r   r      sV    H-LCA.D$s).VtCy T#Y   r   r   c                       \ rS rSrSrg)
TagsRemove   r:   N)r   r   r   r    r$   r:   r   r   r   r      s    r   r   c                   \   \ rS rSr% Sr\" SSS9r\" \S9r	\\
   \S'   \" SS	S
S9r\
S-  \S'   \" \S9r\\
\4   \S'   \" SS9r\
S-  \S'   \" SS9r\
S-  \S'   \" SS9r\
S-  \S'   \" SSS9\S 5       5       r\" SSS9\S 5       5       r\" SSS9\S 5       5       r\" SS9S 5       rSrg)UploadAssetSpec   a  Upload Asset operation.

- tags: optional list; if provided, first is root ('models'|'input'|'output');
        if root == 'models', second must be a valid category
- name: display name
- user_metadata: arbitrary JSON object (optional)
- hash: optional canonical 'blake3:<hex>' for validation / fast-path
- mime_type: optional MIME type override
- preview_id: optional asset_reference ID for preview

Files are stored using the content hash as filename stem.
r   Tr   rA   r   Ni   zDisplay Name)defaultr   descriptionrP   r   )r   r   r   r   rX   rY   c                 b    Uc  g [        U5      R                  5       nU(       d  g [        U5      $ r   )r#   ra   r   )rd   re   ss      r   _parse_hashUploadAssetSpec._parse_hash  s,     9FLLN#A&&r   c                 "   / nUc  / $ [        U[        5      (       a  U/n[        U[        5      (       a  U H  nUc  M  [        U5      R                  5       nU(       d  M*  UR	                  S5      (       aG   [
        R                  " U5      n[        U[        5      (       a  UR                  S U 5       5        M   UR                  UR                  S5       Vs/ s H  ofR                  5       (       d  M  UPM     sn5        M     O/ $ / n[        5       nU H\  n	[        U	5      R                  5       R                  5       n
U
(       d  M3  X;  d  M:  UR                  U
5        UR                  U
5        M^     U$ ! [         a     Nf = fs  snf )a  
Accepts a list of strings (possibly multiple form fields),
where each string can be:
  - JSON array (e.g., '["models","loras","foo"]')
  - comma-separated ('models, loras, foo')
  - single token ('models')
Returns a normalized, deduplicated, ordered list.
[c              3   8   #    U  H  n[        U5      v   M     g 7fr   )r#   )r   r   s     r   r   .UploadAssetSpec._parse_tags.<locals>.<genexpr>,  s     (=AQs   r]   )r_   r#   r=   ra   
startswithrp   rq   rb   rr   r`   r   r   r   r   )rd   re   itemsrh   r   arrpnormr   rf   r   s              r   _parse_tagsUploadAssetSpec._parse_tags  sD    9IaAa<IOO%<<$$"jjm%c400!LL(=(==$ 1
 CAaCD   I uAFLLN((*Eu*E"	 
  % Cs   8AE<F
8F
<
F	F	c                 \   Ub  [        U[        5      (       a  U=(       d    0 $ [        U[        5      (       aR  UR                  5       nU(       d  0 $  [        R
                  " U5      n[        U[        5      (       d  [        S5      eU$ 0 $ ! [         a  n[        SU 35      UeS nAff = f)Nzuser_metadata must be JSON: z#user_metadata must be a JSON objectrn   )rd   re   r   ru   rv   s        r   rw   $UploadAssetSpec._parse_metadata_json>  s     9
1d++7Na	A	LA fd++ !FGGM	  L #?s!CD!KLs   B 
B+B&&B+rN   c                     U R                   (       d  [        S5      eU R                   S   nUS;  a  [        S5      eUS:X  a$  [        U R                   5      S:  a  [        S5      eU $ )Nz(at least one tag is required for uploadsr   >   inputmodelsoutputz/first tag must be one of: models, input, outputr      z7models uploads require a category tag as the second tag)r   rs   len)r   roots     r   _validate_orderUploadAssetSpec._validate_orderP  sf    yyGHHyy|44NOO8499~! M  r   r:   )r   r   r   r    r!   r	   r   r
   r=   r   r#   r<   rP   ro   r   r   r   r   r   r   r{   r   r   rw   r   r   r$   r:   r   r   r   r      s    H4HLD1D$s)1Tc~VD#*V$)$$?M4S>?T*D#**!$/IsTz/"40Jd
0V(+'  ,' V(+*  ,*X _84  5  '" #r   r   )rp   dataclassesr   typingr   r   app.assets.helpersr   pydanticr   r	   r
   r   r   r   rr   r   r(   r-   r?   r}   r   r   r   r   r   r   r:   r   r   <module>r      s     !  3 ) 9  + + + 2i 2ji " D#i #L!I !$i .	 	mi mr   