§
    Òåi½!  ã            
       ó®  — d dl mZmZmZmZmZmZ d dlmZ d dl	m
Z
mZ d dlZd dlZd dlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZ ddlmZ  eddg¬¦  «        Z ed¦  «        Zh d£Z ddhZ!dZ"dZ#e $                    dd¬¦  «         dede%dee%         fd„Z&dede
e%e%f         fd„Z'e (                    de¬¦  «         ee¦  «        fdefd„¦   «         Z)e (                    de¬¦  «         ee¦  «         ee¦  «        fded efd!„¦   «         Z*e (                    d"e¬¦  «         ee¦  «         ee¦  «        fde%ded efd#„¦   «         Z+e ,                    d"e¬¦  «         ee¦  «         ee¦  «        fde%d$eded efd%„¦   «         Z-e .                    d&e¬¦  «         ee¦  «         ee¦  «        fd'eded efd(„¦   «         Z/e .                    d)¦  «         ed*¦  «         ee¦  «         ee¦  «        fd+eded efd,„¦   «         Z0e .                    d-¦  «         ed*¦  «         ee¦  «         ee¦  «        fd+eded efd.„¦   «         Z1dS )/é    )Ú	APIRouterÚDependsÚHTTPExceptionÚstatusÚ
UploadFileÚFile)ÚSession)ÚDictÚOptionalN)ÚPathé   )Úget_db)ÚSiteSetting)ÚUser)ÚSiteSettingCreateÚSiteSettingUpdateÚSiteSettingResponseÚSiteSettingsUpdateBulkÚSiteSettingsResponse)Úget_current_admin_userz/api/settingsÚsettings)ÚprefixÚtagszuploads/site>   ú.jpgú.svgú.jpegú.pngz.icor   i    i Ð T)ÚparentsÚexist_okÚdbÚkeyÚreturnc                 ó²   — |                       t          ¦  «                             t          j        |k    ¦  «                             ¦   «         }|r|j        ndS )z"Get a single setting value by key.N)Úqueryr   Úfilterr!   ÚfirstÚvalue)r    r!   Úsettings      ú/app/app/api/settings.pyÚget_settingr*      sE   € à�hŠh•{Ñ#Ô#×*Ò*­;¬?¸cÒ+AÑBÔB×HÒHÑJÔJ€GØ#Ð-ˆ7Œ=ˆ=¨Ð-ó    c                 ór   — |                       t          ¦  «                             ¦   «         }d„ |D ¦   «         S )z!Get all settings as a dictionary.c                 ó,   — i | ]}|j         |j        pd “ŒS )Ú ©r!   r'   )Ú.0Úss     r)   ú
<dictcomp>z)get_all_settings_dict.<locals>.<dictcomp>#   s"   € Ð3Ð3Ð3 QˆAŒE�1”7�=˜bÐ3Ð3Ð3r+   )r$   r   Úall)r    r   s     r)   Úget_all_settings_dictr4       s3   € à�xŠx�Ñ$Ô$×(Ò(Ñ*Ô*€HØ3Ð3¨(Ð3Ñ3Ô3Ð3r+   z/public)Úresponse_modelc           
   ƒ   ó  K  — t          | ¦  «        }t          |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        ¬¦  «        S )	z6Get public site settings (no authentication required).Ú	site_nameÚStreamA2026Úlogo_urlr.   Úfavicon_urlÚheader_textÚ
logo_style©r7   r9   r:   r;   r<   ©r4   r   Úget)r    Úsettings_dicts     r)   Úget_public_settingsrA   &   ó‹   è è € õ *¨"Ñ-Ô-€MÝØ×#Ò# K°Ñ?Ô?Ø×"Ò" :¨rÑ2Ô2Ø!×%Ò% m°RÑ8Ô8Ø!×%Ò% m°]ÑCÔCØ ×$Ò$ \°2Ñ6Ô6ðñ ô ð r+   r.   Úcurrent_userc           
   ƒ   ó  K  — t          | ¦  «        }t          |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        ¬¦  «        S )	z#Get all site settings (admin only).r7   r8   r9   r.   r:   r;   r<   r=   r>   )r    rC   r@   s      r)   Úget_settingsrE   3   rB   r+   z/{key}c              ƒ   óæ   K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|S )z)Get a single setting by key (admin only).ú	Setting 'ú' not found©Ústatus_codeÚdetail)r$   r   r%   r!   r&   r   r   ÚHTTP_404_NOT_FOUND)r!   r    rC   r(   s       r)   Úget_setting_by_keyrM   @   st   è è € ð �hŠh•{Ñ#Ô#×*Ò*­;¬?¸cÒ+AÑBÔB×HÒHÑJÔJ€GØð 
ÝÝÔ1Ø/˜sÐ/Ð/Ð/ð
ñ 
ô 
ð 	
ð €Nr+   Úsetting_updatec              ƒ   óP  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|j        |_        | 	                    ¦   «          | 
                    |¦  «         |S )z%Update a single setting (admin only).rG   rH   rI   )r$   r   r%   r!   r&   r   r   rL   r'   ÚcommitÚrefresh)r!   rN   r    rC   r(   s        r)   Úupdate_settingrR   L   s�   è è € ð �hŠh•{Ñ#Ô#×*Ò*­;¬?¸cÒ+AÑBÔB×HÒHÑJÔJ€GØð 
ÝÝÔ1Ø/˜sÐ/Ð/Ð/ð
ñ 
ô 
ð 	
ð
 #Ô(€G„MØ‡I‚I�K„K€KØ‡J‚JˆwÑÔÐà€Nr+   z/bulkÚsettings_updatec           
   ƒ   ó†  K  — t          |¦  «        }| j        �[|                     t          ¦  «                             t          j        dk    ¦  «                             ¦   «         }|r| j        |_        | j        �[|                     t          ¦  «                             t          j        dk    ¦  «                             ¦   «         }|r| j        |_        | j	        �[|                     t          ¦  «                             t          j        dk    ¦  «                             ¦   «         }|r| j	        |_        | j
        �[|                     t          ¦  «                             t          j        dk    ¦  «                             ¦   «         }|r| j
        |_        | j        �‡|                     t          ¦  «                             t          j        dk    ¦  «                             ¦   «         }|s,t          d| j        ¬¦  «        }|                     |¦  «         n| j        |_        |                     ¦   «          t          |¦  «        }t          |                     dd¦  «        |                     dd	¦  «        |                     dd	¦  «        |                     dd¦  «        |                     dd	¦  «        ¬
¦  «        S )z.Update multiple settings at once (admin only).Nr7   r9   r:   r;   r<   r/   r8   r.   r=   )r4   r7   r$   r   r%   r!   r&   r'   r9   r:   r;   r<   ÚaddrP   r   r?   )rS   r    rC   r@   r(   Úupdated_settingss         r)   Úupdate_bulk_settingsrW   b   sQ  è è € õ *¨"Ñ-Ô-€Mð Ô Ð,Ø—(’(�;Ñ'Ô'×.Ò.­{¬À+Ò/MÑNÔN×TÒTÑVÔVˆØð 	6Ø+Ô5ˆGŒMàÔÐ+Ø—(’(�;Ñ'Ô'×.Ò.­{¬À*Ò/LÑMÔM×SÒSÑUÔUˆØð 	5Ø+Ô4ˆGŒMàÔ"Ð.Ø—(’(�;Ñ'Ô'×.Ò.­{¬À-Ò/OÑPÔP×VÒVÑXÔXˆØð 	8Ø+Ô7ˆGŒMàÔ"Ð.Ø—(’(�;Ñ'Ô'×.Ò.­{¬À-Ò/OÑPÔP×VÒVÑXÔXˆØð 	8Ø+Ô7ˆGŒMàÔ!Ð-Ø—(’(�;Ñ'Ô'×.Ò.­{¬À,Ò/NÑOÔO×UÒUÑWÔWˆØð 	7Ý! l¸/Ô:TÐUÑUÔUˆGØ�FŠF�7‰OŒOˆOˆOà+Ô6ˆGŒMà‡I‚I�K„K€Kõ -¨RÑ0Ô0ÐÝØ"×&Ò& {°MÑBÔBØ!×%Ò% j°"Ñ5Ô5Ø$×(Ò(¨¸Ñ;Ô;Ø$×(Ò(¨¸ÑFÔFØ#×'Ò'¨°bÑ9Ô9ðñ ô ð r+   z/upload-logo.Úfilec              ƒ   óü  K  — t          | j        ¦  «        j                             ¦   «         }|t          vr6t          t          j        dd                     t          ¦  «        › �¬¦  «        ‚|  	                    ¦   «         ƒ d{V —†}t          |¦  «        t          k    r*t          t          j        dt          dz  dz  › d�¬¦  «        ‚dt          j        ¦   «         j        › |› �}t          |z  }t!          |d	¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   |                     t&          ¦  «                             t&          j        d
k    ¦  «                             ¦   «         }|r{|j        rVt          |j        ¦  «        }	|	                     ¦   «         r.|	                     t          ¦  «        r|	                     ¦   «          d|› �|_        |                     ¦   «          d
d|› �iS )zUpload logo image (admin only).úInvalid file type. Allowed: ú, rI   NúFile too large. Maximum size: é   ÚMBÚlogo_Úwbr9   ú/uploads/site/)r   ÚfilenameÚsuffixÚlowerÚALLOWED_LOGO_EXTENSIONSr   r   ÚHTTP_400_BAD_REQUESTÚjoinÚreadÚlenÚMAX_LOGO_SIZEÚuuidÚuuid4ÚhexÚ
UPLOAD_DIRÚopenÚwriter$   r   r%   r!   r&   r'   ÚexistsÚis_relative_toÚunlinkrP   ©
rX   r    rC   Úfile_extÚcontentrb   Ú	file_pathÚfr(   Úold_paths
             r)   Úupload_logorz   •   s'  è è € õ �D”MÑ"Ô"Ô)×/Ò/Ñ1Ô1€HØÕ.Ð.Ð.ÝÝÔ3ØV°$·)²)Õ<SÑ2TÔ2TÐVÐVð
ñ 
ô 
ð 	
ð —I’I‘K”KÐÐÐÐÐÐ€GÝ
ˆ7�|„|•mÒ#Ð#ÝÝÔ3ØSµMÀDÑ4HÈ4Ñ4OÐSÐSÐSð
ñ 
ô 
ð 	
ð 4•t”z‘|”|Ô'Ð3¨Ð3Ð3€HÝ˜XÑ%€Iõ 
ˆi˜Ñ	Ô	ð  !Ø	�Š�ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �hŠh•{Ñ#Ô#×*Ò*­;¬?¸jÒ+HÑIÔI×OÒOÑQÔQ€GØð àŒ=ð 	"Ý˜GœMÑ*Ô*ˆHØ�ŠÑ Ô ð " X×%<Ò%<½ZÑ%HÔ%Hð "Ø—’Ñ!Ô!Ð!à3¨Ð3Ð3ˆŒØ
�	Š	‰ŒˆàÐ3¨Ð3Ð3Ð4Ð4s   Ä D"Ä"D&Ä)D&z/upload-faviconc              ƒ   óö  K  — t          | j        ¦  «        j                             ¦   «         }|t          vr6t          t          j        dd                     t          ¦  «        › �¬¦  «        ‚|  	                    ¦   «         ƒ d{V —†}t          |¦  «        t          k    r't          t          j        dt          dz  › d�¬¦  «        ‚dt          j        ¦   «         j        › |› �}t          |z  }t!          |d	¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   |                     t&          ¦  «                             t&          j        d
k    ¦  «                             ¦   «         }|r{|j        rVt          |j        ¦  «        }	|	                     ¦   «         r.|	                     t          ¦  «        r|	                     ¦   «          d|› �|_        |                     ¦   «          d
d|› �iS )z"Upload favicon image (admin only).rZ   r[   rI   Nr\   r]   ÚKBÚfavicon_r`   r:   ra   )r   rb   rc   rd   ÚALLOWED_FAVICON_EXTENSIONSr   r   rf   rg   rh   ri   ÚMAX_FAVICON_SIZErk   rl   rm   rn   ro   rp   r$   r   r%   r!   r&   r'   rq   rr   rs   rP   rt   s
             r)   Úupload_faviconr€   Ã   s$  è è € õ �D”MÑ"Ô"Ô)×/Ò/Ñ1Ô1€HØÕ1Ð1Ð1ÝÝÔ3ØY°$·)²)Õ<VÑ2WÔ2WÐYÐYð
ñ 
ô 
ð 	
ð —I’I‘K”KÐÐÐÐÐÐ€GÝ
ˆ7�|„|Õ&Ò&Ð&ÝÝÔ3ØOÕ4DÀtÑ4KÐOÐOÐOð
ñ 
ô 
ð 	
ð 7�$œ*™,œ,Ô*Ð6¨HÐ6Ð6€HÝ˜XÑ%€Iõ 
ˆi˜Ñ	Ô	ð  !Ø	�Š�ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �hŠh•{Ñ#Ô#×*Ò*­;¬?¸mÒ+KÑLÔL×RÒRÑTÔT€GØð àŒ=ð 	"Ý˜GœMÑ*Ô*ˆHØ�ŠÑ Ô ð " X×%<Ò%<½ZÑ%HÔ%Hð "Ø—’Ñ!Ô!Ð!à3¨Ð3Ð3ˆŒØ
�	Š	‰ŒˆàÐ6¨HÐ6Ð6Ð7Ð7s   Ã=DÄD#Ä&D#)2Úfastapir   r   r   r   r   r   Úsqlalchemy.ormr	   Útypingr
   r   Úosrk   Úpathlibr   Údatabaser   Úmodels.site_settingr   Úmodels.userr   Úschemas.site_settingr   r   r   r   r   Úauthr   Úrouterrn   re   r~   rj   r   ÚmkdirÚstrr*   r4   r?   rA   rE   rM   ÚputrR   ÚpostrW   rz   r€   © r+   r)   ú<module>r‘      s¶  ðØ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ "Ð "Ð "Ð "Ð "Ð "Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð ð Kð  Kð  Kð  Kð  Kð  Kð  Kð  Kð  Kð  Kð  Kð  Kð  Kð  KØ )Ð )Ð )Ð )Ð )Ð )à	ˆ˜/°°Ð	=Ñ	=Ô	=€ð ˆT�.Ñ!Ô!€
Ø;Ð;Ð;Ð Ø$ fÐ-Ð Ø€ØÐ ð × Ò ˜¨Ð Ñ -Ô -Ð -ð.�Gð . #ð .¨(°3¬-ð .ð .ð .ð .ð4˜gð 4¨$¨s°C¨x¬.ð 4ð 4ð 4ð 4ð ‡‚ˆIÐ&:€Ñ;Ô;Ø,3¨G°F©O¬Oð 	ð 	 'ð 	ð 	ð 	ñ <Ô;ð	ð ‡‚ˆBÐ3€Ñ4Ô4Ø%, W¨V¡_¤_È7È7ÐSiÑKjÔKjð 	ð 	˜7ð 	ÀDð 	ð 	ð 	ñ 5Ô4ð	ð ‡‚ˆHÐ%8€Ñ9Ô9Ø5<°W¸V±_´_Ð[bÐ[bÐcyÑ[zÔ[zð ð  #ð ¨7ð ÐTXð ð ð ñ :Ô9ðð ‡‚ˆHÐ%8€Ñ9Ô9ð �'˜&‘/”/Ø ˜Ð!7Ñ8Ô8ð	ð Ø	ðà%ðð 	ðð ð	ð ð ñ :Ô9ðð* ‡‚ˆWÐ%9€Ñ:Ô:ð �'˜&‘/”/Ø ˜Ð!7Ñ8Ô8ð/ð /Ø+ð/àð/ð ð/ð /ð /ñ ;Ô:ð/ðd ‡‚ˆ^ÑÔà�t˜C‘y”yØ�'˜&‘/”/Ø ˜Ð!7Ñ8Ô8ð*5ð *5Ø
ð*5àð*5ð ð*5ð *5ð *5ñ Ôð*5ðZ ‡‚ÐÑÔà�t˜C‘y”yØ�'˜&‘/”/Ø ˜Ð!7Ñ8Ô8ð*8ð *8Ø
ð*8àð*8ð ð*8ð *8ð *8ñ  Ôð*8ð *8ð *8r+   