
    ceM?                    \   d Z ddlmZ dgZddlZddlZddlZddl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mZmZ dd	lmZ 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mZm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& d dZ'd dZ(d dZ)d dZ*d!dZ+ G d de          Z, G d de!          Z-dS )"zCommunity Tab.    )annotationsCommunityTabN)QtCore)QtGui)	QtWidgets)CONFCONTENT_PATHIMAGE_DATA_PATH)LINKS_INFO_PATH)	LOGO_PATHVIDEO_ICON_PATH)download_manager)	url_utils)logger)
ButtonBaseFrameTabContentFrameTabHeaderSpacerHorizontal
WidgetBase)LineEditSearch)ListItemContentListWidgetContentdownloaddownload_manager.Downloadreturn+typing.Tuple[bool, typing.List[typing.Any]]c                    g }	 |                      dd          5 }t          j        |          }ddd           n# 1 swxY w Y   n# t          t          t
          f$ r Y nw xY wt          |          |fS )z
    Parse data fetched from https://anaconda.com/api/content.

    Returns tuple of primary content flag and the content itself. Primary content flag is used as a sign that primary
    content is loaded and doesn't need to be fetched from the file.
    rtutf-8encodingN)openjsonloadOSError	TypeError
ValueErrorbool)r   contentstreams      Ilib/python3.11/site-packages/anaconda_navigator/widgets/tabs/community.pyparse_contentr,   &   s     (*G]]4']22 	(fi''G	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(Y
+   =='!!1   A <A A  A A A A"!A"c                *   g }	 |                      dd          5 }t          j        |          }ddd           n# 1 swxY w Y   n# t          t          t
          f$ r Y nw xY w|D ]!}dg|d<   |                    dd          |d	<   "d
|dd         fS )zt
    Parse data fetched from https://anaconda.com/api/events.

    Output is similar to :func:`~parse_content`.
    r   r   r    Neventtagsurl uriF   r"   r#   r$   r%   r&   r'   popr   r)   r*   items       r+   parse_eventsr9   7   s     (*G]]4']22 	(fi''G	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(Y
+     * *yVhhub))U'#2#,r-   c                   g }	 |                      dd          5 }t          j        |          }ddd           n# 1 swxY w Y   n# t          t          t
          f$ r Y nw xY w|D ][}dg|d<   |                    dd          |d<   |d         r|                    d	d          |d
<   |                    dd          |d<   \d|dd         fS )zt
    Parse data fetched from https://anaconda.com/api/videos.

    Output is similar to :func:`~parse_content`.
    r   r   r    Nvideor0   r2   r3   	thumbnailbanner
date_startdateFr4   r5   r7   s       r+   parse_videosr@   M   s/    (*G]]4']22 	(fi''G	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(Y
+     2 2yVhhw++U; 	7!XXk266DNxxb11V'#2#,r-   c                   g }	 |                      dd          5 }t          j        |          }ddd           n# 1 swxY w Y   n# t          t          t
          f$ r Y nw xY w|D ]g}dg|d<   |                    dd          |d	<   |                    d
d          }|r.t          |t                    r|	                    dd          |d<   hd|dd         fS )zv
    Parse data fetched from https://anaconda.com/api/webinars.

    Output is similar to :func:`~parse_content`.
    r   r   r    Nwebinarr0   r1   r2   r3   imagesrcr=   Fr4   )
r"   r#   r$   r%   r&   r'   r6   
isinstancedictget)r   r)   r*   r8   rC   s        r+   parse_webinarsrH   f   s7    (*G]]4']22 	(fi''G	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(Y
+     2 2!{Vhhub))U HHWb11 	2Zt,, 	2"YYub11DN'#2#,r-   groupdownload_manager.Grouptyping.Tuple[bool, typing.Any]c                    d}g }| j         D ]F}|j        
	 |j        \  }}n# t          t          f$ r Y )w xY w|p|}|                    |           G||fS )zw
    Combine outputs from all data sources into a single content

    Output is similar to :func:`~parse_content`.
    F)	downloadsresultr&   r'   extend)rI   
total_flagtotal_contentr   current_flagcurrent_contents         r+   combinerT      s     J "M O . .?"	,4O)L//:& 	 	 	H	  /<
_----}$$s   
"66c                  (     e Zd ZdZ fdZd Z xZS )ButtonToggle"Toggle button used in CSS styling.c                      t                      j        |i |                      d            j                            d fd	           dS )rW   TNc                    j         S N)
_fix_check)vselfs    r+   <lambda>z'ButtonToggle.__init__.<locals>.<lambda>   s	    DO     rZ   )super__init__setCheckableclickedconnect)r]   argskwargs	__class__s   `  r+   ra   zButtonToggle.__init__   s]    $)&)))$;;;;;<<<<<r_   c                    |                      d|                                            |                      d|                                             d S )Nchecked	unchecked)setProperty	isCheckedr]   s    r+   r[   zButtonToggle._fix_check   sK    DNN$4$4555$..*:*:&:;;;;;r_   )__name__
__module____qualname____doc__ra   r[   __classcell__rg   s   @r+   rV   rV      sM        ,,= = = = =< < < < < < <r_   rV   c                       e Zd ZdZ ej                    Z	 	 	 dd  fdZd!dZd"dZ	d!dZ
d!dZd#dZd$dZd Z	 d%d&dZd!dZ xZS )'r   zTab with a community content.Nr2   parenttyping.Optional[QtCore.QObject]r0   %typing.Optional[typing.Sequence[str]]
utm_mediumstrr   Nonec                   t                                          |           g | _        d| _        d| _        || _        i | _        g | _        t          j	        t                                        ddt          j        j        t          j        j                  | _        |                     d           t          j                    | _        | j                            d           t+          j                    | _        t1                      | _        | j                            d           | j                            t          j        j        d	           | j                                        }| j                            |                    d
                     t+          j                    }|                     | j                   |!                                 |"                    | j                   tG                      }|$                    |           tK          |          | _&        | j&                            t          j        j        d	           | j&        '                    d           t+          j                    }|"                    | j&                   tQ                      }|$                    |           t+          j)                    }	|	"                    |           |	"                    |           | $                    |	           | j        j*        +                    | j,                   | j        j-        +                    | j.                   dS )z.Initialize new :class:`~CommunityTab` content.)ru   r      d   <   TabiM  SearchFMMMMMMMMMMMMMMMMMMMMMMM)rx      N)/r`   ra   _CommunityTab__content_CommunityTab__content_offset_CommunityTab__content_step_CommunityTab__tags_CommunityTab__pixmaps_CommunityTab__filter_widgetsr   QPixmapr   scaledr   QtKeepAspectRatioFastTransformation_CommunityTab__default_pixmapsetObjectNameQTimer_CommunityTab__timer_loadsetIntervalr   QHBoxLayout_CommunityTab__filters_layoutr   _CommunityTab__text_filtersetPlaceholderTextsetAttributeWA_MacShowFocusRectfontMetricssetMaximumWidthwidth	addLayout
addStretch	addWidgetr   	setLayoutr   _CommunityTab__listsetMinimumHeightr   QVBoxLayouttimeoutrd   _CommunityTab__put_contenttextChanged_CommunityTab__filter_content)r]   ru   r0   rx   font_metricslayout_headerframe_headerlayout_contentframe_contentlayoutrg   s             r+   ra   zCommunityTab.__init__   s    	'''24%&#$=A:<;= %o > > E EI%I(	!
 !
 	5!!!+1=??%%c*** ) 5 7 7-;-=-=--h777''	(EuMMM+/+=+I+I+K+K**<+=+=h+G+GHHH/8/D/F/F 5666  """ 2333'5'7'7}---):j)Q)Q)Q  !>FFF$$S)))090E0G0G  ---)8):):///(1(=(?(?&&&'''v 	!))$*<===&..t/DEEEEEr_   c                4    t          j        t          j        d                              t          j                            t          d                                        t                    t          j        d                              t          j                            t          d                                        t                    t          j        d                              t          j                            t          d                                        t                    t          j        d                              t          j                            t          d                                        t                                                  t           j        j                                      t                     j                             fd	           t          j                                                   d
S )zSet up tab content.zhttps://anaconda.com/api/eventszevents.jsonzhttps://anaconda.com/api/videoszvideos.jsonz!https://anaconda.com/api/webinarszwebinars.jsonz https://anaconda.com/api/contentzcontent.jsonc                0                                   S )N)rI   )_CommunityTab__process_content)_rI   r]   s    r+   r^   z$CommunityTab.setup.<locals>.<lambda>  s    d.D.D5.D.Q.Q r_   N)r   GroupDownloadintoospathjoinr	   processr9   r@   rH   r,   requireRequireNONErT   sig_succeededrd   managerexecute)r]   rI   s   `@r+   setupzCommunityTab.setup   s    &%&GHHMM\=99 g  %&GHHMM\=99 g  %&IJJOO\?;; g  %&HIINN\>:: g %
 
* '$)
 

'
 
/ 	6 	##$Q$Q$Q$Q$QRRR ""**511111r_   rI   rJ   c                *   |j         \  }}|s	 t          t          dd          5 }|                    t	          j        |                     ddd           n# 1 swxY w Y   n+# t          t          f$ r t          j	        d           Y nw xY w|D ]}|d         
                    dd          
                    d	d          
                    d
d          |d<   |                    dd          }|rt          j        |          |d<   t          j                            t"          |                    dd                    |d<   |                    d            || _        |                                  | j                            d           dS )z9Apply content to the tab after it is loaded from the web.r   r   r    Nz(failed to load bundled community contentr3   z<p>r2   z</p> z%20r=   
image_file...image_file_pathc                ^    |                      dd          dv|                      dg           fS )Nstickyr2   )TTruetrue1r0   rG   )tiles    r+   r^   z0CommunityTab.__process_content.<locals>.<lambda>-  s2    txx"'='=E`'`bfbjbjkqsubvbv&w r_   )key   )rN   r"   r   rO   r#   r$   r%   r'   r   	exceptionreplacerG   r   safe_file_namer   r   r   r
   sortr   _CommunityTab__make_tag_filtersr   start)r]   rI   flagr)   r*   r8   r=   s          r+   __process_contentzCommunityTab.__process_content  s    g  	MM/4'BBB 6fNN49V#4#45556 6 6 6 6 6 6 6 6 6 6 6 6 6 6Z( M M M !KLLLLLM  	c 	cDu+--eR88@@LLTTUXZ_``DK((8R00F F%.%=f%E%E\"&(gll?DHH\[`DaDa&b&bD"##wwxxx 
 	!!!#####s4   A% (AA% AA%  A!A% %%BBc                   t          j        d | j        D                       }| j        t	          |          | _        t	          | j                  D ]"}||         }|st          |                                 d| d                                          }|                    |	                                           |
                    t          j        d|	                                d                     |j                            | j                   | j                            |           | j                            |           | j                            t)                                 $dS )z@Create tag filtering checkboxes based on available content tags.c              3  L   K   | ]}|                     d g           D ]}|V   dS )r0   Nr   ).0r8   tags      r+   	<genexpr>z2CommunityTab.__make_tag_filters.<locals>.<genexpr>8  s[       :
 :
xx++:
 :
  :
 :
 :
 :
 :
 :
 :
r_   Nz ()
checkboxesT)collectionsCounterr   r   sortedrV   
capitalizestripr   lower
setCheckedr   rG   rc   rd   r   r   appendr   r   r   )r]   countsr   counttoggles        r+   __make_tag_filterszCommunityTab.__make_tag_filters6  sf   &1&9 :
 :
:
 :
 :
 '
 '
 ; ..DK$+&& 	@ 	@CE !S^^%5%5"A"A"A"A"A"G"G"I"IJJF  ---dh|SYY[[$GGHHHN""4#8999!((000!++F333!++,<,>,>????	@ 	@r_   c                Z   t          | j        | j        | j        z             D ]}|t          | j                  k    r5| j                                         | j                                          n| j        |         }|	                    dd          pd}|	                    dd          pd}t          |	                    dd          pd|	                    dd          pd|	                    dd          pd|	                    dd          pd|	                    d	d          pd|	                    d
g           ||| j        	  	        }| j                            |           | j        |_        t           j                            t&          |	                    dd                    }t           j                            |          r|                     ||           |r|r|                     |||           | xj        | j        z  c_        |                                  dS )z
        Add items to the list.

        This method adds only a part of the content. Each next call adds next part to the interface.
        r=   Nr2   r   titlesubtitler3   r?   summaryr0   )	r   r   r3   r?   r   r0   r=   r   pixmapr   r   )ranger   r   lenr   r   stop	sig_readyemitrG   r   r   r   addItemr   pixmapsr   r   r   r   isfile _CommunityTab__process_thumbnail!_CommunityTab__download_thumbnailr   )r]   indexr8   r=   r   content_itemlocal_images          r+   __put_contentzCommunityTab.__put_contentO  s    40$2G$J]2]^^ 	F 	FEDN++++!&&(((##%%%#~e4D((8T228bF!2D99?RD,;hhw--3*d339rHHUD))/RXXfd++1rD117RXXfb)),
- 
- 
-L K--- $(>L   "w||Itxxe7T7TUUKw~~k** F(({CCCC FD F)),EEE!44r_   r8   r   r1   r   c                (    t          j        |                                                            t           j        j                  }|j                             fd           t          j                    	                    |           dS )z(Fetch thumbnail for a card from the web.c                 0                                    S rZ   )r   )r8   r   r]   s   r+   r^   z3CommunityTab.__download_thumbnail.<locals>.<lambda>~  s    t/G/Gd/S/S r_   N)
r   r   r   keepKeepFRESHr   rd   r   r   )r]   r8   r1   r   r   s   `` ` r+   __download_thumbnailz!CommunityTab.__download_thumbnailz  s     $,S1166t<<AABRBWB]^^&&'S'S'S'S'S'STTT ""**844444r_   c                z   || j         vr	 t          j                            |          st	          j                    | j         |<   n~t          j                            |          d         dd                                         }|dv rt	          j        ||          | j         |<   nt	          j        |          | j         |<   n$# t          $ r t          j
        d           Y nw xY wt          j        t                    5  |                    | j         |                    ddd           dS # 1 swxY w Y   dS )z)Process thumbnail and apply it to a card.r|   N)PNGJPGJPEG)formatz-failed to initialize community card thumbnail)r   r   r   r   r   r   splitextupperr%   r   r   
contextlibsuppressRuntimeErrorupdate_thumbnail)r]   r8   r   	extensions       r+   __process_thumbnailz CommunityTab.__process_thumbnail  sz   t~%%
Rw~~d++ C+0=??DN4((%'W%5%5d%;%;A%>qrr%B%H%H%J%JI $:::/4}T)/T/T/Tt,,/4}T/B/Bt, R R R !PQQQQQR  .. 	8 	8!!$."6777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s$   B9C C&%C&!D00D47D4c                  	 t          t          t          t          t          j        t          j        d| j        	                                
                                                                        }g 	| j        D ]W}|                                }|                                }t          j        d||           |r	                    |           Xt#          | j                                                  D ]}| j                            |          }g }|D ]}|                    ||j        
                                v pc||j        
                                v pH|d                    |j                  
                                v p||j        
                                v            |                    t5          	fd|j        D                                  |                    t;          |                      dS )z@Filter content by a search string on all the fields of the item.z\Wr   r   c              3  D   K   | ]}|                                 v V  d S rZ   )r   )r   r   selected_tagss     r+   r   z0CommunityTab.__filter_content.<locals>.<genexpr>  sD       " " 		}," " " " " "r_   N)listfilterr(   mapry   r   resplitr   textr   r   
objectNamerl   r   setr   r   r   r   r8   r   venuer   authorsr   anyr0   	setHiddenall)
r]   tokensr   r   ri   r   r8   
all_checkstokenr  s
            @r+   __filter_contentzCommunityTab.__filter_content  s   #'4SY8J8O8O8Q8Q8W8W8Y8Y(Z(Z[[\\$
 $

 +-+ 	* 	*F((**C",,..GH\3000 *$$S))) 4;,,..// 	0 	0E;##E**D,.J    !!TZ--/// 2TZ--///2SXXdl3399;;;2 T\//111	    c " " " "9" " "     
 NNs:.////'	0 	0r_   next_widget"typing.Optional[QtWidgets.QWidget]typing.List[QtWidgets.QWidget]c                T    g | j         | j        | j                                        S )zFix tab order of UI widgets.)r   r   r   ordered_widgets)r]   r"  s     r+   r&  zCommunityTab.ordered_widgets  s:    

"

 [((**
 	
r_   c                8    | j                                          dS )zUpdate custom CSS stylesheet.N)r   update_style_sheetrm   s    r+   r(  zCommunityTab.update_style_sheet  s    &&(((((r_   )NNr2   )ru   rv   r0   rw   rx   ry   r   rz   )r   rz   )rI   rJ   r   rz   )r8   r   r1   ry   r   ry   r   rz   )r8   r   r   ry   r   rz   rZ   )r"  r#  r   r$  )rn   ro   rp   rq   r   Signalr   ra   r   r   r   r   r   r   r   r&  r(  rr   rs   s   @r+   r   r      s*       ''I 7;:> 	>F >F >F >F >F >F >F@2 2 2 2B$ $ $ $B@ @ @ @2)  )  )  ) V5 5 5 58 8 8 8$$0 $0 $0P ?C	
 	
 	
 	
 	
) ) ) ) ) ) ) )r_   )r   r   r   r   )rI   rJ   r   rK   ).rq   
__future__r   __all__r   r  r#   r   r  typingqtpyr   r   r   anaconda_navigator.configr   r	   r
   !anaconda_navigator.static.contentr    anaconda_navigator.static.imagesr   r   anaconda_navigator.utilsr   r   anaconda_navigator.utils.logsr   anaconda_navigator.widgetsr   r   r   r   r   (anaconda_navigator.widgets.helperwidgetsr   (anaconda_navigator.widgets.lists.contentr   r   r,   r9   r@   rH   rT   rV   r    r_   r+   <module>r7     s7     " " " " " "
          				 				                    I I I I I I I I I I = = = = = = G G G G G G G G 5 5 5 5 5 5 . . . . . . 0 0 0 0 0 0 p p p p p p p p p p p p p p C C C C C C W W W W W W W W" " " ""   ,   2   4% % % %<< < < < <: < < <"W) W) W) W) W): W) W) W) W) W)r_   