
    hGf                        d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZmZ d dlmZmZmZmZ d dlmZmZ d	d
lmZ d dlZd dlmZ d dlmZmZmZmZm Z  d dl!m"Z" d	dlm#Z# d dl$Z$d dl%m&Z& d dl'm(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l0m1Z1  e1         ejd                  ejf                         d dl4Z4d dl5Z5 e)jl                  dd      Z7e)jp                  js                  e)jp                  ju                  e)jp                  jw                  e<      ddd            Z=e)jp                  ju                  e=ddddd      Z> e)j~                  e>d       d ed!ej                  d"ej                  fd#ZBd ed$eCd"eej                     fd%ZDd ed&eCd'eEd(eEd"eej                     f
d)ZFd ed$eCd!ej                  d"ej                  fd*ZHd$eCd!ej                  d ed"ej                  fd+ZId ed$eCfd,ZJd ed"eej                     fd-ZKd.ej                  d efd/ZMd ed0eCd"ej                  fd1ZOd ed$eCd"eej                     fd2ZPd ed0eCd.ej                  d"ej                  fd3ZRd ed0eCd"dfd4ZS e+ e)jl                  d5      d6 e)jl                  d7      8      ZTd9ed"e fd:ZUd;ed ed"efd<ZVd=eEd"e#fd>ZWd ed?eCd0eCfd@ZXy)A    )CalendarPostCalendarPostType)Calendar)Session)schema)HTTPExceptionstatus)ListOptional)timezoneUTCAmbiguousTimeErrorNonExistentTimeError)datetimetime   )	PostImageN)UnknownTimeZoneError)GeneratedImageGenerateImageContentGenerateTextContentGeneratedImageResponseGeneratedTextResponse)settings)URLInfoResponse)BeautifulSoup)urlparse)AzureOpenAI)convert_to_utcpost_to_twitterpost_to_facebook)load_dotenv)levelBASE_URLzhttp://localhost:8000z..menu_designdesignerstatic	marketingimagesTexist_okdb	post_datareturnc                 b   |j                   rvd |_        t        j                         }|j	                         |_        |j                         |_        t        j                  d|j
                   d|j                          n| j                  t              j                  t        j                  |j                  k(        j                         }|st        dd      	 t!        |j                   xs dj#                               }t        j&                  |j
                  |j                  xs t        d	d	            }	 |j)                  |d 
      }|j1                  t2              }|j	                         |_        |j                         |_        	 t4        j6                  j8                  D ch c]  }|j:                   }	}|j=                         j?                         D 
ci c]  \  }
}|
|	v s|
| }}
}t5        di |}| jA                  |       | jC                          | jE                  |       tP        jR                  jU                  |      S # t$        $ r t        dd|j                          w xY w# t*        $ r |j)                  t,        d
      }Y Mt.        $ r t        dd      w xY wc c}w c c}}
w # tF        $ ra}d	d l$}t        jJ                  d|        t        jJ                  |jM                                | jO                          t        dd      d }~ww xY w)Nz*[InstantPost] Using current UTC schedule:    Calendar not foundstatus_codedetailr     zInvalid timezone: r   )is_dstFz8The scheduled time does not exist due to DST transition.z*[CreateCalendarPost] Error creating post:   zError creating post )+is_instant_postcalendar_idr   utcnowdateschedule_dater   schedule_timelogginginfoqueryr   filteridfirstr   r   stripr   combinelocalizer   localDatetimer   
astimezoner   r   	__table__columnsname
model_dumpitemsaddcommitrefresh	Exception	tracebackerror
format_excrollbackr   CalendarPostOutmodel_validate)r,   r-   now_utccalendaruser_tzlocal_datetimelocal_dt_with_tzutc_datetimecvalid_fieldskv	post_dictposterT   s                   >/var/www/html/hubwallet-dev/src/marketing/apps/post/service.pycreate_calendar_postrh   [   s      $	//#"),,.	"),,.	A)BYBYAZZ[\e\s\s[tuv88H%,,X[[I<Q<Q-QRXXZC8LMM	b 1 1 :UAACDG "))####1tAqz
	t&//t/L
 (2237"."3"3"5	"."3"3"5	K(4(>(>(F(FG1GG&/&:&:&<&B&B&DZda\HYQTZ	Z(i(
t
		


4 !!0066A $ 	bC:LXM^M^L_8`aa	b " 	M&//e/L# 	tC8rss	t HZ  KB1#FGi**,-
4IJJKs\    'I  I= K /J9#K %J>2J>7A K $I:= J6 J69K 	L.AL))L.post_idc                 H   | j                  t              j                  t        j                  |k(  t        j                  dk(  t        j
                  dk7        j                         }|st        t        j                  d      t        j                  j                  |      S )NFarchivedCalendar post not foundr3   )rB   r   rC   rD   
is_deletedpost_statusrE   r   r	   HTTP_404_NOT_FOUNDr   rX   rY   r,   ri   re   s      rg   get_calendar_post_by_idrq      s    88L!((7"&  J.
 %'	 	
 (A(AJcdd!!0066    r;   
start_dateend_datec                 ^   | j                  t              j                  t        j                  |k(  t        j                  |k\  t        j                  |k  t        j
                  dk(        j                         }|sy |D cg c]!  }t        j                  j                  |      # c}S c c}w NF)
rB   r   rC   r;   r>   rm   allr   rX   rY   )r,   r;   rs   rt   postsre   s         rg   0get_calendar_posts_by_calendar_id_and_date_rangery      s     HH\"))  K/""j0""h.5(	
 
ce 
 DIJDF""11$7JJJs   &B*c                 L   | j                  t              j                  t        j                  |k(  t        j                  dk(        j                         }|st        t        j                  d      h d}|j                  r|j                  |vrt        dd      |j                  rvd |_        t        j                         }|j                         |_        |j!                         |_        t%        j&                  d|j                   d|j"                          n|j                  |j"                  |j                  xs |j                  }| j                  t(              j                  t(        j                  |k(        j                         }|st        d	d
      t+        |j                  xs |j                  |j"                  xs |j"                  |j,                  xs d      }|j                         |_        |j!                         |_        t%        j&                  d|        |j/                  d      j1                         D ]  \  }	}
t3        ||	|
        | j5                          | j7                  |       t8        j:                  j=                  |      S )NFrl   r3   >   draftpausedrk   	published	submittedr6   zInvalid post statusz2[InstantPost][UPDATE] Using current UTC schedule: r0   r1   r2   r   z[Update] Converted to UTC: Texclude_unset)rB   r   rC   rD   rm   rE   r   r	   ro   rn   r:   r;   r   r<   r=   r>   r   r?   r@   rA   r   r   r   rN   rO   setattrrQ   rR   r   rX   rY   )r,   ri   r-   re   allowed_statusesrZ   r;   r[   r_   keyvalues              rg   update_calendar_postr      s6   88L!((7"5( eg 	
 (A(AJcdd Q!6!6>N!N4IJJ    $	//#"),,.	"),,.	I)JaJaIbbcdmd{d{c|}~ 
	 	 	,	0G0G0S++?t/?/?88H%,,X[[K-GHNNPC8LMM%##9t'9'9##9t'9'9&

 #/"3"3"5	"."3"3"5	2<.AB  ***>DDF "
Uc5!" IIKJJt!!0066rr   c                    |j                  t              j                  t        j                  | k(  t        j                  dk(        j                         }|st        t        j                  d      |j                  d      j                         D ]  \  }}t        |||        |j                          |j                  |       t        j                  j!                  |      S )NFzPost not foundr3   Tr   )rB   r   rC   rD   rm   rE   r   r	   ro   rN   rO   r   rQ   rR   r   rX   rY   )ri   r-   r,   re   r   r   s         rg   partial_update_calendar_postr     s    88L!((G)C\E\E\`eEefllnD(A(AJZ[[  ***>DDF "
Uc5!" IIKJJt!!0066rr   c                     | j                  t              j                  t        j                  |k(        j	                         }|st        t        j                  d      d|_        | j                          y )Nrl   r3   T)
rB   r   rC   rD   rE   r   r	   ro   rm   rQ   rp   s      rg   delete_calendar_postr     sV    88L!((G)CDJJLD(A(AJcdd DOIIKrr   c                    | j                  t              j                  t        j                  dk7  t        j                  dk(        j                         }|D cg c]!  }t        j                  j                  |      # c}S c c}w )Nrk   F)	rB   r   rC   rn   rm   rw   r   rX   rY   )r,   rx   ps      rg   list_calendar_postsr     sk    HH\"))  J.5( 
ce 
 ?DDF""11!4DDDs   &Bpost_type_datac                    t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  
      }| j                  r`|j                  t              j                  t        j                  j!                  | j                              j#                         }||_        |j%                  |       |j'                          |j)                  |       t+        dt-        |j.                  dd              |j                  r	 |j.                  j0                  j2                  j5                         }|dk(  rt7        |      }n|dv rt9        |      }nddd}|j;                  d	      rj|j;                  d
      |_        |j>                  rd|j>                  _         |j'                          tC        jD                  d| d|j<                          |S tC        jF                  d| d|j;                  d              	 |S |S # tH        $ r,}tC        jF                  dtK        |              Y d }~|S d }~ww xY w)N)
store_id	branch_iduser_idr;   calendar_post_idconnected_account_id	post_typecontentlinkr:   zpost_type ============== tokenx (twitter)facebookzfacebook pageFUnsupported platformsuccessrU   r   ri   r}   z$[InstantPost] Posted immediately to 	 with ID z[InstantPost] Failed for : rU   z[InstantPost] Error: )&r   r   r   r   r;   r   r   r   r   r   r:   r)   rB   r   rC   rD   in_rw   rP   rQ   rR   printgetattrconnected_accountmaster_accountsocial_media_namelowerr    r!   getexternal_post_idcalendar_postrn   r@   rA   rU   rS   str)r   r,   r   r)   platform_nameresponserf   s          rg   create_calendar_post_typer   (  s!   
 !(( **&&"..'88+@@ **&&  &66I )$++ILL,<,<^=R=R,STXXZ!	FF9IIKJJy	
%gi.I.I7TX&YZ   	<%77FFXX^^`M-*95"??+I6',%;= ||I&-5\\)-D	***:EI++7		CM?R[\e\v\v[wxy   9-8<<X_K`Jabc
 9  	<MM1#a&:;;	<s   CI *I 	I9!I44I9post_type_idc                     | j                  t              j                  t        j                  |k(  t        j                  dk(        j                         }|sy t        j                  j                  |      S rv   )	rB   r   rC   rD   rm   rE   r   CalendarPostTypeOutrY   r,   r   r   s      rg   get_calendar_post_type_by_idr   c  sf    )*112B2E2E2UVfVqVquzVz{  B  B  DI%%44Y??rr   c                    | j                  t              j                  t        j                  |k(  t        j                  dk(        j                         }|sg S |D cg c]!  }t        j                  j                  |      # c}S c c}w rv   )	rB   r   rC   r   rm   rw   r   r   rY   )r,   ri   
post_typespts       rg   get_post_types_by_post_idr   l  so    
!"	 11W<>N>Y>Y]b>b	c	  	DNObF&&55b9OOOs   &Bc                    | j                  t              j                  t        j                  |k(  t        j                  dk(        j                         }|st        t        j                  d      |j                  d      }|j                  dd       }|| j                  t              j                  t        j                  j                  |            j                         }t        |      t        |      k7  r@|D ch c]  }|j                   }}t        t!        |      |z
        }	t        dd|	       ||_        |j%                         D ]  \  }
}t'        ||
|        |j(                  r|j*                  d	|_        	 |j,                  j.                  j0                  j3                         }|d
k(  rt5        ||       }n|dv rt7        |      }nddd}|j9                  d      r<|j9                  d      |_        t;        j<                  d| d|j*                          n*t;        j>                  d| d|j9                  d              | jE                          | jG                  |       tH        jJ                  jM                  |      S c c}w # t@        $ r+}t;        j>                  dtC        |              Y d }~td }~ww xY w)NFCalendar post type not foundr3   Tr   r)   r6   z'Some image IDs are invalid or missing: r}   r   r   r   r   r   ri   z,[InstantPost][UPDATE] Posted immediately to r   z![InstantPost][UPDATE] Failed for r   rU   z[InstantPost][UPDATE] Error: )'rB   r   rC   rD   rm   rE   r   r	   ro   rN   popr   r   rw   lenlistsetr)   rO   r   r:   r   r   r   r   r   r    r!   r   r@   rA   rU   rS   r   rQ   rR   r   r   rY   )r,   r   r   r   update_data	image_idsr)   img	found_idsmissing_idsr   r   r   r   rf   s                  rg   update_calendar_post_typer     s    )*11|+##u, eg 
 (A(AJhii ++$+?K $/I)$++ILL,<,<Y,GHLLNv;#i.(+12C2I2s9~	9:K@N  "	 "'') '
U	3&'   Y%?%?%G&		D%77FFXX^^`M-*9b9"??+I6',7MN||I&-5\\)-D	*
 KM?Zcdmd~d~c  A  B A-PRS[S_S_`gShRijk
 IIKJJy%%44Y??O 3B  	DMM9#a&BCC	Ds   JCJ 	K%!KKc                     | j                  t              j                  t        j                  |k(        j	                         }|st        t        j                  d      d|_        | j                          y )Nr   r3   T)
rB   r   rC   rD   rE   r   r	   ro   rm   rQ   r   s      rg   delete_calendar_post_typer     sY    )*112B2E2E2UV\\^I(A(AJhiiIIIKrr   AZURE_OPENAI_API_KEYz2024-02-15-previewAZURE_OPENAI_ENDPOINT)api_keyapi_versionazure_endpointdatac           	      L   d| j                    d| j                   d| j                   d| j                   d	}	 t        j
                  j                  j                  t        j                  dd      dd	d
d|d
gdd      }|j                  d   j                  j                  j                         }| j                  r-t        |      | j                  kD  r|d| j                  dz
   dz   }t        |      S # t         $ r"}t        dt#        |             cY d}~S d}~ww xY w)z^
    Generate text content using Azure OpenAI based on the GenerateContentRequest schema.
    z-Generate a compelling social media post for 'z
'.
Topic: z1
Ensure it is professional, engaging, and within z@ characters.
Try to keep the length around the optimum limit of z  characters for best engagement.AZURE_OPENAI_DEPLOYMENTzgpt-35-turbosystemz/You are a helpful social media content creator.)roler   userr8   gffffff?)modelmessages
max_tokenstemperaturer   N   z...)generated_textzError generating content: )r   
input_texttext_max_limittext_optimum_limitclientchatcompletionscreateosgetenvchoicesmessager   rF   r   r   rS   r   )r   promptr   ai_textrf   s        rg   generate_text_contentr     s;    87G H//" #;;?;N;N:O P>>B>U>U=VVv	x [;;**11))5~F!._`F3  2 
 ""1%--55;;= 3w<$2E2E#E6t22Q67%?G$G<< [$6PQTUVQWPX4YZZ[s   B>C8 8	D#DD#D#statec           
         | j                    d| j                  d d j                  dd       d}	 t        j                  t
        j                  dt
        j                  id | j                  fd | j                  j                  dd      xs dfd	d
d      }|j                  dk7  r%t        d|j                   d|j                         |j                         }|j                  dg       }|rd|d   vrt        d|       |d   d   }t        j                  |d      }|j                  j                  d      }|dvrt        d      t        j                          j"                   d| }	t$        j&                  j)                  t*        |	      }
t%        j,                  t*        d       t/        |
d      5 }t1        j2                  |j4                  |       d d d        t6         d|	 }t9        | j:                  | j<                  ||	t?        j@                               }|jC                  |       |jE                          |jG                  |       tI        tK        |jL                  |jN                  |jP                        g      S # 1 sw Y   xY w# tR        $ r}tU        dtW        |             d }~ww xY w)N_   r0   z.jpgzApi-Key:x1x1)NON)Nr   )r   aspect_ratiomagic_prompt
num_images)headersfiles   zImage generation failed: z - r   urlr   z'No image URLs returned. Full response: T)streamzContent-Type)z	image/pngz
image/jpegz	image/jpgz
image/webpz%Invalid image type returned from API.r*   wbz/static/marketing/images/)ri   r   	image_url
image_name
created_at)rD   r   r   )generated_images),r   r   replacerequestsre   r   IDEOGRAM_URLIDEOGRAM_API_KEYimage_ratior4   
ValueErrortextjsonr   r   uuiduuid4hexr   pathjoinSTATIC_PATHmakedirsopenshutilcopyfileobjrawr$   r   ri   r   r   r<   rP   rQ   rR   r   r   rD   r   r   rS   RuntimeErrorr   )r   r,   image_temp_namer   r   image_itemsexternal_image_urlimage_contentcontent_typefilename	file_pathout_filelocal_image_url
post_imagerf   s                  rg   generate_image_contentr    s    )5+;+;CR+@+H+Hc+R*SSWXOHA==!!844  !1!12!%u'8'8'@'@S'I'RU S ,'	
 3&89M9M8NcRZR_R_Q`abb }}hhvr*e;q>9FtfMNN(^E2 !%7E$,,00@UUDEE jjl&&'q(9:GGLLh7	 	K$/ )T" 	<h}00(;	< &J&?zJ MM --%(

 	z
		


: &!}}(22)44
 	
'	< 	<:  A6s1vh?@@As1   FJ <!JB1J JJ 	K $J;;K r   c                 \   d d d}	 ddi}t        j                  | |d      }|j                          t        |j                        |d<   t        |j                  d      }|j                  r>|j                  j                  r(|j                  j                  j                         |d<   n(|j                  d	      }|r|j                  d
      |d<   |j                  dddi      }|r4|j                  d      r#|j                  d      j                         |d<   n(|j                  d      }|r|j                  d
      |d<   t!        di |S # t         j                  j                  $ r}dt        |       |d<   Y d }~>d }~wt        $ r}dt        |       |d<   Y d }~`d }~ww xY w)N)titlemeta_descriptionz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
   )r   timeouthttp_headerszhtml.parserr  h1T)rF   metarM   description)attrsr   r  r   zRequest failed: rU   zAn error occurred: r9   )r   r   raise_for_statusdictr   r   r   r  stringrF   findget_text
exceptionsRequestExceptionr   rS   r   )	r   resultr   r   soupr  	meta_descr   rf   s	            rg   get_url_infor,  i  s    F
9  L
 <<WbA!!#!%h&6&6!7~X]]M: ::$**++"jj//557F7O4B"$++D+"9w IIfV],CID	y1)2y)A)G)G)IF%&		#A-.ZZdZ-C)* $V$$ // 6,SVH5w 9/Ax8w9s$   D?E F+.FF+F&&F+image_idc                     | j                  t              j                  t        j                  |k(  t        j                  |k(        j                         }|sy | j                  |       | j                          y)NT)rB   r   rC   rD   r   rE   deleterQ   )r,   r-  r   search_photos       rg   delete_upload_photor1    sY    88I&--illH.DYE[E[]iEijpprLIIlIIKrr   )Ysrc.marketing.apps.post.modelr   r   !src.marketing.apps.Calendar.modelr   sqlalchemy.ormr   src.marketing.apps.postr   fastapir   r	   typingr
   r   pytzr   r   r   r   r   r   r   r   r@   pytz.exceptionsr   src.marketing.apps.post.schemar   r   r   r   r   src.utils.settingsr   r   r   bs4r   urllib.parser   r   openair   utilsr   r    r!   dotenvr"   basicConfigINFOr  r	  r   r$   r  abspathr  dirname__file__BASE_DIRr  r  CalendarPostCreaterX   rh   intrq   r   ry   CalendarPostUpdater   r   r   r   CalendarPostTypeCreater   r   r   r   CalendarPostTypeUpdater   r   r   r   r  r,  r1  r9   rr   rg   <module>rL     sg   H 6 " * ( ! G G #   0 Q  Q ' #   !  	  D D     ',, '  299Z!89 77??277<<(A4tTUggll8]J+W_` K$ 'h-7W -71J1J -7vOeOe -7j7 7# 7(6CYCY:Z 7KKK K 	K
 
&
 
 !Kh-7W -7s -7v?X?X -7]c]s]s -7b7# 7&:S:S 7Y` 7eke{e{ 7W s EG EV-C-C(D E6f.K.K 6QX 6v@W @C @FD^D^ @
P' 
PC 
PDA[A[<\ 
P4<@<@<@ 11<@ 	<@B'   . 
BII,-$29945
 [ 3  [8M  [XNA"6 NAG NAH^ NAr&%c &%o &%`7 S s rr   