Ë
    %„!j 4  ã                   ó´   — d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZ  ej&                  e«      Zd	Z G d
„ d«      Zy)z0Publish blog articles to Shopify Admin REST API.é    N)ÚAny)Útimezone)ÚBlogArticleÚBlogGenerationLogÚBlogSettings)ÚBlogImageStorage)ÚBlogImageService)ÚShopifyAdminClient))ÚglobalÚ	title_tag)r   Údescription_tagc                   óº  — e Zd ZeZedeeef   fd„«       Zedefd„«       Z	edefd„«       Z
edeeeef      fd„«       Zed#dededeeeef      fd„«       Zededefd	„«       Zedefd
„«       Zed$dededefd„«       Zedefd„«       Zededeeef   dz  fd„«       Zed%dededz  defd„«       Zedededeeef   dej2                  fd„«       Zed$dededeeef   fd„«       Zededdfd„«       Zedededefd„«       Zedededeeeef      fd„«       Zededededededeeeef   ef   ddfd „«       Z ededefd!„«       Z!ed%dededz  ddfd"„«       Z"y)&ÚShopifyBlogServiceÚreturnc                 ó6   — | j                   j                  «       S ©N)Ú_clientÚheaders©Úclss    úI/var/www/html/shopify_to_digistore/blogs/services/shopify_blog_service.pyÚ_headerszShopifyBlogService._headers   s   € à�{‰{×"Ñ"Ó$Ð$ó    c                 ó6   — | j                   j                  «       S r   )r   Úbase_urlr   s    r   Ú	_base_urlzShopifyBlogService._base_url   s   € à�{‰{×#Ñ#Ó%Ð%r   c                 ó6   — | j                   j                  «       S r   )r   Úapi_versionr   s    r   Ú_api_versionzShopifyBlogService._api_version#   s   € à�{‰{×&Ñ&Ó(Ð(r   c                 óæ   — t        j                  | j                  j                  d«      | j	                  «       d¬«      }|j                  «        |j                  «       j                  d«      xs g S )Nz
blogs.jsoné   ©r   ÚtimeoutÚblogs©ÚrequestsÚgetr   Ú	admin_urlr   Úraise_for_statusÚjson)r   Úresps     r   Ú
list_blogszShopifyBlogService.list_blogs'   sV   € ä�|‰|Ø�K‰K×!Ñ! ,Ó/Ø—L‘L“NØô
ˆð
 	×ÑÔØ�y‰y‹{�‰˜wÓ'Ò-¨2Ð-r   Úblog_idÚlimitc                 óò   — t        j                  | j                  j                  d|› d|› �«      | j	                  «       d¬«      }|j                  «        |j                  «       j                  d«      xs g S )Núblogs/z/articles.json?limit=r!   r"   Úarticlesr%   )r   r-   r.   r+   s       r   Úlist_articlesz ShopifyBlogService.list_articles1   sd   € ä�|‰|Ø�K‰K×!Ñ! F¨7¨)Ð3HÈÈÐ"PÓQØ—L‘L“NØô
ˆð
 	×ÑÔØ�y‰y‹{�‰˜zÓ*Ò0¨bÐ0r   c                 ó¦   — t        j                  | j                  j                  d|› d�«      | j	                  «       d¬«      }|j
                  dk(  S )Nr0   z/articles.json?limit=1r!   r"   éÈ   )r&   r'   r   r(   r   Ústatus_code)r   r-   r+   s      r   Útest_connectionz"ShopifyBlogService.test_connection;   sK   € ä�|‰|Ø�K‰K×!Ñ! F¨7¨)Ð3IÐ"JÓKØ—L‘L“NØô
ˆð
 ×Ñ 3Ñ&Ð&r   c                 ó†   — t        j                  «       }|j                  xs |j                  xs dj	                  «       }|S )NÚ )r   ÚloadÚblog_author_nameÚ
store_nameÚstrip)r   ÚsettingsÚauthors      r   Ú_shopify_author_namez'ShopifyBlogService._shopify_author_nameD   s9   € ä×$Ñ$Ó&ˆØ×+Ñ+ÒH¨x×/BÑ/BÒHÀb×OÑOÓQˆØˆr   ÚarticleÚ	publishedc                 ó6  — |j                   xs g }t        |t        «      rdj                  d„ |D «       «      n
t	        |«      }dd|j
                  xs |j                  ddœdd|j                  xs dddœg}|j                  r |j                  d	d
|j                  ddœ«       |j                  |j                  |j                  |||j                  rd|j                  › d�nd|dœ}| j                  «       }|r||d<   | j                  |«      }|r||d<   d|iS )Nz, c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   )Ústr)Ú.0Úts     r   Ú	<genexpr>z<ShopifyBlogService._build_article_payload.<locals>.<genexpr>M   s   è ø€ Ð2©T¨œS ŸV©Tùs   ‚ÚseoÚtitleÚsingle_line_text_field©Ú	namespaceÚkeyÚvalueÚtypeÚdescriptionr8   ÚcustomÚtarget_keywordz<p>z</p>)rI   Ú	body_htmlÚhandleÚtagsrA   Úsummary_htmlÚ
metafieldsr>   Úimager@   )rU   Ú
isinstanceÚlistÚjoinrD   Ú
meta_titlerI   Úmeta_descriptionrR   ÚappendÚcontentÚslugr?   Ú_featured_image_payload)	r   r@   rA   rU   Útags_strrW   Úpayloadr>   Úfeatureds	            r   Ú_build_article_payloadz)ShopifyBlogService._build_article_payloadJ   s7  € à�|‰|Ò!˜rˆÜ6@ÀÄtÔ6L�4—9‘9Ñ2©TÓ2Ô2ÔRUÐVZÓR[ˆð #ØØ ×+Ñ+Ò<¨w¯}©}Ø0ñ	ð #Ø$Ø ×1Ñ1Ò7°RØ0ñ	ð
ˆ
ð ×!Ò!Ø×Ñà!)Ø+Ø$×3Ñ3Ø4ñ	ôð —]‘]Ø Ÿ™Ø—l‘lØØ"à8?×8PÒ8P�#�g×.Ñ.Ð/¨tÑ4ÐVXà$ñ
#
ˆð ×)Ñ)Ó+ˆÙØ &ˆG�HÑØ×.Ñ.¨wÓ7ˆÙØ'ˆG�GÑØ˜7Ð#Ð#r   c                 óX   — |j                   j                  dd¬«      j                  «       S )NÚheaderÚ	completed)ÚpositionÚgeneration_status)ÚimagesÚfilterÚfirst)r   r@   s     r   Ú_header_imagez ShopifyBlogService._header_imagez   s*   € à�~‰~×$Ñ$Ø°ð %ó 
ç
‰%‹'ð	r   Nc                 óö  — | j                  |«      }|r[|j                  rO	 t        j                  t	        j
                  |j                  «      «      j                  d«      |j                  dœS |j                  xs dj                  «       }|s |r|j                  xs dj                  «       }|r||j                  dœS y # t        $ r. t        j                  d|j                  |j                  «       Y Œˆw xY w)NÚascii)Ú
attachmentÚaltz,Staged header missing for article=%s path=%sr8   )Úsrcrr   )rn   Ú
local_fileÚbase64Ú	b64encoder   Ú
read_bytesÚdecoderI   ÚFileNotFoundErrorÚloggerÚwarningÚpkÚfeatured_image_urlr<   Ú	image_url)r   r@   rg   Úurls       r   ra   z*ShopifyBlogService._featured_image_payload€   sÜ   € à×"Ñ" 7Ó+ˆÙ�f×'Ò'ðä"(×"2Ñ"2Ü(×3Ñ3°F×4EÑ4EÓFó#ç‘f˜W“oØ"Ÿ=™=ñ	ð ð ×)Ñ)Ò/¨R×6Ñ6Ó8ˆÙ‘vØ×#Ñ#Ò) r×0Ñ0Ó2ˆCÙØ w§}¡}Ñ5Ð5Øøô %ò Ü—‘ØBØ—J‘JØ×%Ñ%öðús   ¡AC Ã4C8Ã7C8Úshopify_article_idc                 ó\   — d|› d�}|r|› d|› �}| j                   j                  |› d�«      S )Nr0   z	/articlesÚ/ú.json©r   r(   )r   r-   r€   Úpaths       r   Ú_articles_urlz ShopifyBlogService._articles_url™   s@   € à˜�y 	Ð*ˆÙØ�V˜1Ð/Ð0Ð1ˆDØ�{‰{×$Ñ$¨ v¨U ^Ó4Ð4r   Úmethodr   Úbodyc                 óP  — t        j                  ||| j                  «       |d¬«      }|j                  dk\  rn|j	                  di «      j	                  d«      rMdt        |d   «      i}|d   j                  dd «       t        j                  ||| j                  «       |d¬«      }|S )Néx   ©r   r*   r#   é�  r@   rW   )r&   Úrequestr   r5   r'   ÚdictÚpop)r   r‡   r   rˆ   r+   Úbody_no_metas         r   Ú_send_article_requestz(ShopifyBlogService._send_article_request    sž   € ô ×ÑØ�C §¡£°dÀCô
ˆð ×Ñ˜sÒ" t§x¡x°	¸2Ó'>×'BÑ'BÀ<Ô'PØ%¤t¨D°©OÓ'<Ð=ˆLØ˜Ñ#×'Ñ'¨°dÔ;Ü×#Ñ#Ø˜ S§\¡\£^¸,ÐPSôˆDð ˆr   Ú
article_idc           
      óø  — t         j                  j                  |¬«      }t        j                  «       }|j
                  xs dj                  «       }|st        d«      ‚t        j                  j                  |ddi ¬«       t         j                  |_        |j                  ddg¬	«       |j                  r%t        j                  |«       |j!                  «        |j"                  xs dj                  «       }t%        |«      }| j'                  ||xs d «      }| j)                  ||¬
«      }	|rdnd}
	 | j+                  |
||	«      }|j-                  «        |j/                  «       j                  d«      xs i }|s t1        |j                  dd«      «      |_        |j                  d«      xs |j2                  }t5        j6                  d«      xs | j9                  «       j                  «       }|j;                  d«      sd|› �}|j=                  d«      › d|› �|_        |	d   j                  dg «      |_         t         jB                  |_        tE        jF                  «       |_$        d|_%        |j                  «        | jM                  ||«       | jO                  |«       t        j                  j                  |ddd|j"                  i¬«       |j"                  |j>                  dœS # tP        $ rƒ}tR        jU                  d|«       t         jV                  |_        t1        |«      |_%        |j                  g d¢¬	«       t        j                  j                  |dddt1        |«      i¬«       ‚ d }~ww xY w)N)r|   r8   ú/shopify_blog_id not configured in Blog settingsÚpostingÚstarted)r@   ÚstepÚstatusÚdetailsr˜   Ú
updated_at©Úupdate_fields)rA   ÚPUTÚPOSTr@   ÚidrT   Ú	STORE_URLÚhttpzhttps://r‚   z/blogs/news/rW   rh   r€   )r€   Úshopify_article_urlz$Shopify publish failed article_id=%s)r˜   Úgeneration_errorrš   ÚfailedÚerror),r   Úobjectsr'   r   r9   Úshopify_blog_idr<   ÚRuntimeErrorr   ÚcreateÚSTATUS_PUBLISHINGr˜   ÚsaveÚinclude_imagesr	   Úupload_staged_images_to_shopifyÚrefresh_from_dbr€   Úboolr†   re   r‘   r)   r*   rD   r`   ÚosÚgetenvr   Ú
startswithÚrstripr¢   Úshopify_metafieldsÚSTATUS_PUBLISHEDr   ÚnowÚ	posted_atr£   Úsync_article_seoÚ_cleanup_staged_imagesÚ	Exceptionrz   Ú	exceptionÚSTATUS_FAILED)r   r’   rA   r@   Úblog_settingsr-   r€   Ú	is_updater   rˆ   r‡   r+   Úshopify_articlerT   Ú	store_urlÚexcs                   r   Úpublish_articlez"ShopifyBlogService.publish_article²   s  € ä×%Ñ%×)Ñ)¨ZÐ)Ó8ˆÜ$×)Ñ)Ó+ˆØ ×0Ñ0Ò6°B×=Ñ=Ó?ˆÙÜÐPÓQÐQä×!Ñ!×(Ñ(Ø )°IÀrð 	)ô 	
ô %×6Ñ6ˆŒØ�‰ H¨lÐ#;ˆÔ<à×'Ò'Ü×<Ñ<¸WÔEØ×#Ñ#Ô%à%×8Ñ8Ò>¸B×EÑEÓGÐÜÐ+Ó,ˆ	Ø×Ñ Ð);Ò)C¸tÓDˆØ×)Ñ)¨'¸YÐ)ÓGˆÙ#‘¨ˆð*	Ø×,Ñ,¨V°S¸$Ó?ˆDØ×!Ñ!Ô#Ø"Ÿi™i›kŸo™o¨iÓ8Ò>¸BˆOáÜ-0°×1DÑ1DÀTÈ2Ó1NÓ-O�Ô*Ø$×(Ñ(¨Ó2ÒB°g·l±lˆFÜŸ™ ;Ó/ÒB°3·=±=³?×IÑIÓKˆIØ×'Ñ'¨Ô/Ø& y kÐ2�	Ø-6×-=Ñ-=¸cÓ-BÐ,CÀ<ÐPVÈxÐ*XˆGÔ'Ø)-¨i©×)<Ñ)<¸\È2Ó)NˆGÔ&Ü(×9Ñ9ˆGŒNÜ (§¡£ˆGÔØ')ˆGÔ$Ø�L‰LŒNà× Ñ  ¨'Ô2Ø×&Ñ& wÔ/ä×%Ñ%×,Ñ,ØØØ"Ø-¨w×/IÑ/IÐJð	 -ô ð '.×&@Ñ&@Ø'.×'BÑ'Bñð øô ò 	Ü×ÑÐCÀZÔPÜ(×6Ñ6ˆGŒNÜ'*¨3£xˆGÔ$Ø�L‰LÒ'SˆLÔTÜ×%Ñ%×,Ñ,ØØØØ ¤# c£(Ð+ð	 -ô ð ûð	ús   Ä6F6K- Ë-	M9Ë6A>M4Í4M9c                 ó¸   — |j                   j                  d¬«      D ];  }t        j                  |j                  «       d|_        |j                  dg¬«       Œ= y)z6Remove local staging files after a successful publish.r8   )rt   rt   r›   N)rk   Úexcluder   Údeletert   r«   )r   r@   Úimgs      r   r¹   z)ShopifyBlogService._cleanup_staged_imagesö   sI   € ð —>‘>×)Ñ)°RÐ)Ö8ˆCÜ×#Ñ# C§N¡NÔ3ØˆCŒNØ�H‰H L >ˆHÕ2ñ 9r   c                 óF   — | j                   j                  d|› d|› d�«      S )Nr0   z
/articles/z/metafields.jsonr„   )r   r-   r’   s      r   Ú_article_metafields_urlz*ShopifyBlogService._article_metafields_urlþ   s,   € à�{‰{×$Ñ$Ø�W�I˜Z¨
 |Ð3CÐDó
ð 	
r   c                 óÔ   — t        j                  | j                  ||«      | j                  «       d¬«      }|j	                  «        |j                  «       j                  d«      xs g S )Nr!   r"   rW   )r&   r'   rÈ   r   r)   r*   )r   r-   r’   r+   s       r   Ú_list_article_metafieldsz+ShopifyBlogService._list_article_metafields  sT   € ä�|‰|Ø×'Ñ'¨°Ó<Ø—L‘L“NØô
ˆð
 	×ÑÔØ�y‰y‹{�‰˜|Ó,Ò2°Ð2r   rL   rM   rN   Úexistingc           	      ó
  — |sy d|||ddœi}|j                  ||f«      }|r[|j                  d«      rJ| j                  j                  d|d   › d�«      }	t        j                  |	| j                  «       |d¬«      }
n7t        j                  | j                  ||«      | j                  «       |d¬«      }
|
j                  d	k\  rAt        j                  d
|||
j                  |
j                  d d «       |
j                  «        y y )NÚ	metafieldrJ   rK   rŸ   zmetafields/rƒ   r!   r‹   rŒ   z(metafield %s.%s failed status=%s body=%si,  )r'   r   r(   r&   Úputr   ÚpostrÈ   r5   rz   r{   Útextr)   )r   r-   r’   rL   rM   rN   rË   rc   Úfoundr   r+   s              r   Ú_upsert_article_metafieldz,ShopifyBlogService._upsert_article_metafield  sþ   € ñ ØàØ&ØØØ0ñ	ð
ˆð —‘˜i¨Ð-Ó.ˆÙ�U—Y‘Y˜t”_Ø—+‘+×'Ñ'¨+°e¸D±k°]À%Ð(HÓIˆCÜ—<‘< ¨S¯\©\«^À'ÐSUÔV‰Dä—=‘=Ø×+Ñ+¨G°ZÓ@ØŸ™›ØØô	ˆDð ×Ñ˜sÒ"Ü�N‰NØ:ØØØ× Ñ Ø—	‘	˜$˜3�ôð ×!Ñ!Õ#ð #r   c                 ó\  — |j                   xs dj                  «       }|syt        j                  «       j                  xs dj                  «       }|st        d«      ‚| j                  ||«      }t        j                  || j                  «       d¬«      }|j                  dk(  rt        j                  d||«       y|j                  d	k\  r>t        j                  d
|j                  |j                  d d «       |j                  «        t        j                  d|||j                   «       y)Nr8   Fr”   r!   r"   i”  z2Shopify article already deleted blog=%s article=%sTrŒ   z'Shopify delete failed status=%s body=%siô  z7Shopify article deleted blog=%s article=%s django_id=%s)r€   r<   r   r9   r§   r¨   r†   r&   rÅ   r   r5   rz   Úinfor¥   rÐ   r)   r|   )r   r@   Ú
shopify_idr-   r   r+   s         r   Údelete_articlez!ShopifyBlogService.delete_article7  s  € à×0Ñ0Ò6°B×=Ñ=Ó?ˆ
ÙØä×$Ñ$Ó&×6Ñ6Ò<¸"×CÑCÓEˆÙÜÐPÓQÐQà×Ñ ¨Ó4ˆÜ�‰˜s¨C¯L©L«NÀBÔGˆØ×Ñ˜sÒ"Ü�K‰KØDØØôð
 Ø×Ñ˜sÒ"Ü�L‰LØ9Ø× Ñ Ø—	‘	˜$˜3�ôð
 ×!Ñ!Ô#Ü�‰ØEØØØ�J‰Jô		
ð r   c                 óT  — |j                   sy |xs" t        j                  «       j                  xs dj	                  «       }|st        d«      ‚|j                  xs |j                  xs dj	                  «       |j                  xs dj	                  «       dœ}| j                  ||j                   «      }|D �ci c]G  }|j                  d«      r4|j                  d«      r#|j                  d«      |j                  d«      f|“ŒI }}t        D ]5  \  }}| j                  ||j                   |||j                  |d«      |«       Œ7 t        D �	�cg c]-  \  }	}|j                  |«      r|	||j                  |d«      ddœ‘Œ/ c}}	|_        |j                  dd	g¬
«       y c c}w c c}}	w )Nr8   r”   )r   r   rL   rM   rJ   rK   r´   rš   r›   )r€   r   r9   r§   r<   r¨   r\   rI   r]   rÊ   r'   ÚSEO_METAFIELD_SPECSrÒ   r´   r«   )
r   r@   r-   ÚvaluesÚexisting_listÚmrË   rL   rM   Únss
             r   r¸   z#ShopifyBlogService.sync_article_seoY  s   € à×)Ò)ØØÒGœl×/Ñ/Ó1×AÑAÒGÀR×NÑNÓPˆÙÜÐPÓQÐQð "×,Ñ,ÒC°·±ÒCÀ×JÑJÓLØ '× 8Ñ 8Ò >¸B×EÑEÓGñ
ˆð ×4Ñ4°W¸g×>XÑ>XÓYˆñ #ó
á"�Ø�u‰u�[Ô! a§e¡e¨E¤lð �U‰U�;Ó §¡ u£Ð.°Ñ1Ø"ð 	ð 
÷
 2‰NˆI�sØ×)Ñ)ØØ×*Ñ*ØØØ—
‘
˜3 Ó#Øõð 2õ" /ô	&
ñ /‘��CØ�z‰z˜#Œð  ØØŸ™ C¨Ó,Ø0ó	ð /ò	&
ˆÔ"ð 	�‰Ð$8¸,Ð#GˆÕHùò3
ùó	&
s   Â:AFÅ2F$)é2   )Tr   )#Ú__name__Ú
__module__Ú__qualname__r
   r   ÚclassmethodrŽ   rD   r   r   r   rZ   r   r,   Úintr2   r¯   r6   r?   r   re   rn   ra   r†   r&   ÚResponser‘   rÂ   r¹   rÈ   rÊ   ÚtuplerÒ   rÖ   r¸   © r   r   r   r      sa  „ Ø €Gàð%˜˜c 3˜h™ò %ó ð%ð ð&˜#ò &ó ð&ð ð)˜Sò )ó ð)ð ð.˜4  S¨# X¡Ñ/ò .ó ð.ð ñ1 Cð 1°ð 1¸TÀ$ÀsÈCÀxÁ.Ñ=Qò 1ó ð1ð ð' cð '¨dò 'ó ð'ð ð Sò ó ðð
 ñ-$¨[ð -$ÀTð -$ÐUYò -$ó ð-$ð^ ð Kò ó ðð
 ð¨kð ¸dÀ3ÈÀ8¹nÈtÑ>Sò ó ðð0 ñ5 Cð 5¸SÀ4¹Zð 5ÐSVò 5ó ð5ð ðàðð ðð �3˜�8‰nð	ð
 
×	Ñ	òó ðð" ñA¨ð A¸ð AÈÈcÐSVÈhÉò Aó ðAðF ð3¨[ð 3¸Tò 3ó ð3ð ð
¨cð 
¸sð 
Àsò 
ó ð
ð
 ð3¨sð 3Àð 3ÈÈTÐRUÐWZÐRZÉ^ÑH\ò 3ó ð3ð ð&$àð&$ð ð&$ð ð	&$ð
 ð&$ð ð&$ð �u˜S #˜X‘¨Ð,Ñ-ð&$ð 
ò&$ó ð&$ðP ð [ð °Tò ó ððB ñ%I {ð %I¸SÀ4¹Zð %IÐSWò %Ió ñ%Ir   r   )Ú__doc__ru   Úloggingr°   Útypingr   r&   Údjango.utilsr   Úblogs.modelsr   r   r   Ú!blogs.services.blog_image_storager   Úblogs.services.image_servicer	   Ú#blogs.services.shopify_admin_clientr
   Ú	getLoggerrÞ   rz   rØ   r   rå   r   r   Ú<module>rï      sQ   ðÙ 6ã Û Û 	Ý ã Ý !ç EÑ EÝ >Ý 9Ý Bà	ˆ×	Ñ	˜8Ó	$€ðÐ ÷gIò gIr   