
    ɢi5W                        d dl Z d dlmZ  e j                  e      Zddddddddd	ddd	dd
dddddddddd	dddd	dddd	dddd	dddd	dddd	g ddd	d	ddd	ddd
ddZd
ddddddd	ddddddd	d ddd	d ddd	dddd	dddd	dddd	dddZg dddgdd d!gg d"d#gd$d%d&gd'd(gd)gd*d+gg d,d-d.d%gg d/d0g d1d%d!gg d2d3g d4g d5d6d!d gg d7d6d%d!d gid8	Zd%d9gd:gd d;d<d=gg d>d d;d?d@gg d d;dAdBgd:gd d;d%d9gd:dCgd d;d!dDgg dEd d;d!dFgdGdHgd d;d%gg dId d;d%gg dJd d;dK	Z	dL dMdNdO d)dPdQ dRdSdT dUdVdW d)dPdXZ
g dYZ G dZ d[      ZdAed\ed]efd^Zdmd_ed`ed]eeef   fdaZdmd_ed`ed]eeef   fdbZd_edcefddZdmd_ed`ed]eeef   fdeZdmdfed`ed]eeef   fdgZd]efdhZd]efdiZdjedked]eeef   fdlZy)n    N)AnystringT)typerequiredlist_of_strings   )r   r   	min_itemsFlist_of_dictsnumber   )r   r   default	affiliate mediumz	1000-5000bool)
namedescriptionscoremonetization_modeltarget_audiencetime_to_revenuevaluation_bandaffiliate_programsrequires_inventorysynopsis)r   r   r	   item_schema)domainkeywordsinterpretationsdomain_summarynichesr   tagline)r   r   r	   r   preserve_extra_keysz#4F46E5z#7C3AEDz#06B6D4)optionsrecommendedrecommended_indexcolor_primarycolor_secondarycolor_accentindustry_context)r   attributionpersontextcontent)authorquoteheadingr   )r.   bodydetailsummary	icon_hint)titler   iconr7   tiercostamountfeatures)r   pricefeatures_listmember_name)r7   position	job_title)r   roleq)aresponser.   )questionanswer)r   statmetric)contextr.   r3   )valuelabelr   )r2   r   step)r.   r3   r4   )r7   r   )r.   r3   r5   )	testimonialsr<   pricing_tiersteam_members	faq_itemsstatshow_it_works_stepsresource_itemsgallery_sectionsr   r8   )required_keysoptional_keysr	   r1   r0   )rB   companyratingr   rF   rG   rK   rL   step_numberr=   )r   r<   ctapopularrB   bioimage)r   r^   items)r   r8   url)	r<   rN   rQ   rR   rS   rO   rP   rU   rT   c                     d| v xr d| v S )NrF   rG    items    5/sites/domain-asset-master/app/services/validators.py<lambda>rf   e   s    zT'9'Nh$>N     rQ   )looks_like_faqtargetc                 "    d| v xr
 d| v xr d| vS )Nr8   r7   rF   rb   rc   s    re   rf   rf   i   s    6T>+hgo+hR\dhRh rg   )looks_like_featureri   c                 "    d| v xr
 d| v xr d| vS )NrB   r]   r1   rb   rc   s    re   rf   rf   m   s    $(`5D=(`W\`M` rg   rP   )looks_like_teamri   c                 
    d| v S )Nr1   rb   rc   s    re   rf   rf   q   s
    w$ rg   rN   )looks_like_testimonialri   c                 V    d| v xr$ t        | j                  dd            dkD  xr d| vS )Nr   r   P   rK   )lengetrc   s    re   rf   rf   u   sB    =D+@  ,CSR_acIdEehjEj  ,Cov  C  pC rg   )r<   rQ   rN   rP   rR   )headlinesubheadline	hero_bodycta_textaboutabout_titlemission_statementfeatures_titlefeatures_subtitletestimonials_title	faq_titleproblem_titleproblem_descriptionsolution_titlesolution_descriptionpricing_titlepricing_subtitlecontact_titlecontact_descriptionresources_titlecomparison_titlegallery_title
team_titleteam_subtitlehow_it_works_titlefinal_cta_titlefinal_cta_bodyfinal_cta_buttonc                       e Zd ZdefdZdedefdZdedefdZdedefdZed	e	fd
       Z
ed	efd       Zd	efdZy)ValidationReportrJ   c                 <    || _         g | _        g | _        g | _        y N)rJ   errorswarningsrepairs)selfrJ   s     re   __init__zValidationReport.__init__   s    "$$&#%rg   fieldmessagec                     | j                   j                  ||d       t        j                  d| j                   d| d|        y N)r   r   
[VALIDATE:z] : )r   appendloggererrorrJ   r   r   r   s      re   r   zValidationReport.error   s<    Uw?@z$,,r%7)DErg   c                     | j                   j                  ||d       t        j                  d| j                   d| d|        y r   )r   r   r   warningrJ   r   s      re   warnzValidationReport.warn   s<    uABDLL>E7"WIFGrg   actionc                     | j                   j                  ||d       t        j                  d| j                   d| d|        y )N)r   r   r   z] REPAIRED r   )r   r   r   inforJ   )r   r   r   s      re   repairzValidationReport.repair   s<    ev>?jk%6(KLrg   returnc                 2    t        | j                        dk(  S )Nr   )rr   r   r   s    re   is_validzValidationReport.is_valid   s    4;;1$$rg   c                     d}|t        | j                        dz  z  }|t        | j                        dz  z  }t        dt	        d|            S )Nd         r   )rr   r   r   maxmin)r   bases     re   r   zValidationReport.score   sJ    DKK 2%%DMM"Q&&1c#tn%%rg   c           
         | j                   | j                  | j                  t        | j                        t        | j
                        t        | j                        | j                  | j
                  | j                  d	S )N)	rJ   validr   error_countwarning_countrepair_countr   r   r   )rJ   r   r   rr   r   r   r   r   s    re   to_dictzValidationReport.to_dict   sZ    ||]]ZZt{{+ /-kk||

 
	
rg   N)__name__
__module____qualname__strr   r   r   r   propertyr   r   intr   dictr   rb   rg   re   r   r      s    & &F3 F FH# H HMC M M %$ % % &s & &
 
rg   r   expected_typer   c                 \   |dk(  rt        | t              S |dk(  rt        | t        t        f      S |dk(  rt        | t              S |dk(  r$t        | t
              xr t        d | D              S |dk(  r$t        | t
              xr t        d | D              S |dk(  rt        | t              S y	)
Nr   r   r   r   c              3   <   K   | ]  }t        |t                y wr   )
isinstancer   .0vs     re   	<genexpr>z_check_type.<locals>.<genexpr>   s     .Qaz!S/A.Q   r
   c              3   <   K   | ]  }t        |t                y wr   )r   r   r   s     re   r   z_check_type.<locals>.<genexpr>   s     .Rqz!T/B.Rr   r   T)r   r   r   floatr   listallr   )rK   r   s     re   _check_typer      s     %%% %#u..%&&))%&Q3.Q5.Q+QQ'%&R3.RE.R+RR%&&rg   dataauto_repairc                 	   t        d      }t        | t              s,|j                  ddt	        |       j
                          | |fS t        j                         D ]  \  }}| j                  |      }|J|j                  d      r8|j                  |d       |r$d|v r |d   | |<   |j                  |d|d           dt        ||d         s|j                  |d	|d    d
t	        |      j
                          |r|d   dk(  r1t        |t              s!t        |      | |<   |j                  |d       na|d   dk(  r)t        |t              r|g| |<   |j                  |d       n0|d   dk(  r(t        |t              r|g| |<   |j                  |d       |d   j                  d      rft        | j                  |      t              rG|j                  dd      }t        | |         |k  r$|j                  |d| dt        | |                 |d   dk(  sd|v s| j                  |g       }t        |t              st        |      D ]  \  }}	t        |	t              sv|j                  | d| ddt	        |	      j
                          |rEt        |d   j!                               d   t        |	      i||<   |j                  | d| dd       |d   j                         D ]8  \  }
}|	j                  |
      }|\|j                  d      rK|j#                  | d| d|
 d       |sHd|v sM|d   |	|
<   |j                  | d| d|
 d|d           v|yt        ||d         r|j#                  | d| d|
 d	|d    d
t	        |      j
                          |r1|d   dk(  r)t        |      |	|
<   |j                  | d| d|
 d       |s|d   dk(  st        |t              s	 t%        |      |	|
<   |j                  | d| d|
 d       ;   | |fS # t&        $ rF |j                  dd      |	|
<   |j                  | d| d|
 d|j                  dd              Y w xY w)NanalysisrootExpected dict, got r   Required field missingr   zSet default: r   z	Expected z, got r   Coerced to stringr   zWrapped string in listr
   zWrapped single dict in listlist_ofr	   r   zExpected at least z items, got r   []Converted to dict].zRequired sub-field missingr   zCoerced to number)r   r   r   r   r   r   ANALYSIS_SCHEMAr_   rs   r   r   r   
startswithr   rr   	enumeratekeysr   r   
ValueError)r   r   report
field_namespecvalr	   r_   ird   
item_field	item_specitem_vals                re   validate_analysisr      s   j)FdD!V24:3F3F2GHIV|+113 9D
Dhhz";xx
#Z)AB9#4'+ID$MM*d9o=N.OP3V-LLyffT#YEWEWDX%YZ<8+JsC4H'*3xD$MM*.AB&\%66:c3;O(+uD$MM*.FG&\_4C9N(+uD$MM*.KL<""9-*TXXj=QSW2Xa0I4
#$y0Z+=i[UXY]^hYiUjTk)lm<?*}/DHHZ,E%&(/ DGAt%dD1
|1QCq%9=PQUVZQ[QdQdPe;fg&(,T--@-E-E-G(H(KSQUY'WE!H"MMZL!A*>@ST 15m1D1J1J1L D-
I#'88J#7#+	j0I"KK:,as"ZL(IKgh*yI/E3<Y3GZ 0 &AaS:,.OS`ajktau`vQw x%1+hPYZ`Pa:b"KK:,as"ZL(IYW`agWhViioptu}p~  qH  qH  pI  LJ  K*y/@H/L36x=Z 0 &AaS:,.OQd e!,61Bh1NS]^fhkSl!D7<XD$4$*MMZL!Bzl2SUh$iDDA9Dv <	 (2 !D7@}}YPQ7RD$4$*MMZL!Bzl2SWdenerers|~  fA  eB  VC  %D!Ds   (P88AR	R	c           	         t        d      }t        | t              sI|j                  ddt	        |       j
                          |rdddgdd} |j                  dd	       | |fS t        j                         D ]  \  }}| j                  |      }|C|j                  d
      r|j                  |d       |rd|v r|d   | |<   |j                  |d       |d   dk(  sed|v sj| j                  |g       }t        |t              st        |      D ]Z  \  }}t        |t              r|j                  | d| dd       |s2t        |      dd||<   |j                  | d| dd       \  | j                  dg       }	| j                  dd      }
t        |	t              rat        |
t        t        f      rK|
t        |	      k\  r=|	r;|j!                  dd|
 dt        |	       d       |rd| d<   |j                  dd       | |fS )Nbrandr   r   Brandr   r"   r   )r%   r&   zCreated minimal brand structurer   r   r   zSet defaultr   r
   r   r   r   zExpected dict in listr   r%   r&   zIndex z out of range (options length: )z
Reset to 0)r   r   r   r   r   r   r   BRAND_SCHEMAr_   rs   r   r   r   r   r   rr   r   )r   r   r   r   r   r   r_   r   rd   r%   recs              re   validate_brandr     s
   g&FdD!V24:3F3F2GHI)0R @ARSTDMM&"CDV|(..0 U
Dhhz";xx
#Z)AByD0#'	?Z jK9<?*}/DHHZ,E%&(/ UGAt%dD1
|1QCq%9;RS&03D	b'IE!H"MMZL!A*>@STUU& hhy"%G
((=!
$C'4 Zc5\%B#g,7KKu4STWX_T`Saab'cd&']#m\:<rg   r   c                 T   t         j                         D ]{  \  }}| j                  |      }t        |t              r|s+|d   }|j                         D ci c]  \  }}|dk7  st        |      s|| }}}g }	t        |      D ]h  \  }
}t        |t              s|j                         D ]?  \  }}	  ||      r1|	j                  |
       |j                  | d|
 dd| d|         gA j |	s|| vst        | j                  |      t              sg | |<   t        |	d      D ]d  }|j                  |      }| |   j                  |       |j                  | d| d	|j                  d
|j                  dd            d d         f ~ y c c}}w # t        $ r Y w xY w)Nri   r   r   zLooks misplaced (z), moving to T)reverseu   →zMoved misplaced item: r7   rF   rd   (   )MISPLACEMENT_SIGNATURESr_   rs   r   r   callabler   r   r   r   	Exceptionsortedpopr   )r   r   source_fieldsigssource_itemstarget_fieldkr   	check_fnsmisplaced_indicesr   rd   
check_namecheck_fnidx
moved_items                   re   _detect_and_fix_misplacementsr  6  s   5;;= _dxx-,-\H~&*jjlTdaa8mQRQTT	T . 
	GAtdD)(1(9 $
H~)003|nAaS$:>OPZ|[hiuhv<wx &
	 4'z$((<:PRV/W%'\"/> _)--c2
\"))*5c,@DZ[e[i[ijqs}  tB  tB  CM  OU  tV  \W  X[  Y[  \\  []  C^  __3_ U ! s$   F&F2F57F	F'	&F'	c                    t        d      }t        | t              sD|j                  ddt	        |       j
                          |rddi} |j                  dd       | |fS |rt        | |       t        D ]  }| j                  |      }|t        |t              r(|j                  |dt	        |      j
                          |sSt        |t              rg|j                  ||j                  d|j                  d	|j                  d
d                        }t        |t              r|| |<   nt        |      | |<   nt        |      | |<   |j                  |d        t        j                         D ],  \  }}| j                  |      }|t        |t              r7||v r3|j                  |d       |r||   | |<   | |   }|j                  |d       t        |t              sY|j                  |dt	        |      j
                          |r.t        |t              r|g| |<   ng | |<   |j                  |d       t        |      D ]S  \  }}	t        |	t              s|j                  | d| ddt	        |	      j
                          |rYt        |	t              rI|d   rD|d   d   |	i||<   t!        |d         dkD  rd||   |d   d   <   |j                  | d| dd       t"        j                  |i       }
|d   D ]  }||	vsd}|
j                  |g       D ]8  }||	v s|	|   s|r&|	|   |	|<   |j                  | d| d| d| d       d} n |rZ|j                  | d| d| d       |swd|	|<   |j                  | d| d| d        V / | j                  d      }|t        |t              sH|j                  ddt	        |      j
                          |rg g d| d<   |j                  dd        | |fS d!|vrg |d!<   |j                  d"d#       d$|vrg |d$<   |j                  d%d&       | |fS )'N	site_copyr   r   rt   WelcomezCreated minimal site_copyExpected string, got r.   r/   r7   r   r   zNested wrapper detectedzUnwrapped nested structurezExpected list, got zConverted to listr   r   rV   r   r   zConverted string to dictFr   zResolved from alias ''Tz!Required key missing in list itemzSet empty string defaultcomparison_table)headersrowszReset to empty tabler  zcomparison_table.headerszAdded empty headersr  zcomparison_table.rowszAdded empty rows)r   r   r   r   r   r   r   r  SITE_COPY_STRING_FIELDSrs   r   r   SITE_COPY_LIST_FIELDSr_   r   r   rr   FIELD_ALIASES)r   r   r   r   r   r.   r   r   r   rd   aliasesreq_keyresolvedaliascts                  re   validate_site_copyr  V  s   k*FdD!V24:3F3F2GHI	*DMM&"=>V|%dF3( :hhuo?:c3#7KK!6tCy7I7I6JKLc4(775#''&#'')SWWU\^`Ma:b*cdD!$,&*U&)#hU"%c(DKe%89: 2779 1f
Dhhz";c4 S J(AB'*:D$z*CMM*.JK#t$LL':49;M;M:N%OPc4((+uD$')D$j*=> ~ 	fGAtdD)zl!A3a04GT
H[H[G\2]^!$,o1F"&"7":D!AAtO459?ACF4#8#;<AaS&:<VW#''
B7G0 f$&$H!(Wb!9 " D=T%[*04UW &AaS7).LPefkellmNn o'+H!" $zl!A3b	$BDgh&,.DM"MMZL!Bwi*HJdef	f/1ff 
$	%B	~"d#KK*.A$r(BSBSAT,UV792+F'(02HI < " "98:OPR6
57IJ<rg   package_datac                 R   t        d      }| j                  di       }t        ||      \  }}|| d<   |j                  j	                  |j                         |j
                  j	                  |j
                         |j                  j	                  |j                         | j                  di       }t        ||      \  }}|| d<   |j                  j	                  |j                         |j
                  j	                  |j
                         |j                  j	                  |j                         | j                  d      }|Zt        |t              sJ|j                  ddt        |      j                          |r t        |      | d<   |j                  dd       | |fS )Npackager   r   r  sales_letterr	  r   )r   rs   r   r   extendr   r   r  r   r   r   r   r   r   )r  r   r   r   brand_reportr  copy_reportsaless           re   validate_packager     sa   i(FWb)E(KHE<!L
MM,,-
OO<001
NN,../  b1I/	{SI{ )L
MM++,
OO;//0
NN+--.^,EE3!7N&;DK<P<P;Q$RS+.u:L(MM.*=>rg   c                    t        d| j                         }| j                  s|j                  dd       nt	        | j                  t
              s3|j                  ddt        | j                        j                          nmt        t        | j                        d      \  }}|j                  j                  |j                         |j                  j                  |j                         | j                  s|j                  dd       nt	        | j                  t
              s3|j                  ddt        | j                        j                          nmt        t        | j                        d      \  }}|j                  j                  |j                         |j                  j                  |j                         | j                  rLt	        | j                  t               s2|j                  d	d
t        | j                        j                          | j"                  s|j                  dd       |S )Nzdb_package:r   zBrand data is nullr   Fr  r  zSite copy is nullr  r	  chosen_nichezMissing chosen niche)r   domain_namer   r   r   r   r   r   r   r   r   r  r   r  r  r  r   r"  )pkgr   _brand_rcopy_rs        re   validate_db_packager(    s   COO+<=>F99G12		4(W 3DO4L4L3MNO#DOG
7W^^,w//0==K!45t,[$7S]]8K8T8T7U"VW&tCMM':N	6V]]+v/

3+;+;S A^'<T#BRBR=S=\=\<]%^_^%;<Mrg   c                    t        d| j                         }| j                  s|j                  dd       |S t	        | j                  t
              s4|j                  ddt        | j                        j                          |S t        t        | j                        d      \  }}|j                  j                  |j                         |j                  j                  |j                         |S )Nzdb_analysis:r   zAnalysis data is nullr   Fr  )r   r   r   r   r   r   r   r   r   r   r   r  r   )r   r   r%  
analysis_rs       re   validate_db_analysisr+    s    V]]O<=F??J 78foot,Z#6tFOO7L7U7U6V!WX%d6??&;OMAz
MM**+
OO:../Mrg   template_namerJ   c                     	 | j                  |      } |j                  di | y# t        $ r}dt        |      fcY d }~S d }~ww xY w)N)Tr   Frb   )get_templaterenderr   r   )templates_enginer,  rJ   templatees        re   render_test_templater3    sI    #00?"'" c!f}s   #& 	AAAA)T)loggingtypingr   	getLoggerr   r   r   r   r  r  r   r  r   r   r   r   r   tupler   r   r  r  r   r(  r+  r3  rb   rg   re   <module>r8     s    			8	$  T2*1M 1uE'U;&Dq!t4 (d;"!D'/U{[$,%BO$,%HU#+;W'8eXZ['-5US%5RHZ ( (T!t4$%BG[ #$ %%AF"*!L&EiP (e	R%5YO!)uL  AFT]K^_$f->cnymz{&/68:L`j_kl+_6XY"Gn8QR3w>O`{|$?Pjk!' 3D_` 69"56
 "=1  "8,> %h/ "7+  "=1 -0 !'*F !&)) ": "7S. d O
 i
 a 
 #? 
 C# . $)
 )
Xs 3 4  BD Bt BuTK[E[?\ BJ& &D &E$HXBX<Y &R_ _6F _@^T ^ ^dL\F\@] ^B 4  d  eDRbLbFc  6 0 <$4 $#  QVW[]`W`Qa rg   