
    ?jX8              
         d Z ddlm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ZddlZddlmZmZmZ ddlmc mZ dZ ed      Zd	d
dddddddd	Zd)dZd*dZd+dZd,dZd-dZd.dZd.dZd.dZd/dZ d0dZ!d1dZ"d2dZ#d3dZ$d4d Z%d5d!Z&d6d"Z'd7d#Z( G d$ d%ejR                        Z*d8d&Z+d8d'Z,e-d(k(  r e,        yy)9z;
Bulk ARRL NTS MPG-1 Radiogram Generator with Tkinter GUI.
    )annotationsN)Path)Callable)
filedialog
messageboxttkz$https://xmldata.qrz.com/xml/current/z
config.iniXXXRXX8XXXzSTOW OHXXXNNz+ANTHONY LUSCRE K8ZT W1AW/8 OHIO COORDINATORzTHANK YOU FOR ON HYPHEN AIR QSO WITH W1AW/8 OHIO DURING THE ARRL SPONSORED AMERICA 250 OPERATION X ALL LOGS WILL BE UPLOADED TO ARRL LOTWzcallsigns.txt
radiograms)	message_number
precedencestation_of_originplace_of_origin
date_filed	signatureraw_message_textcallsign_file
output_dirc                   | |d}t        j                  t        |d      }|j                          t	        j
                  |j                        }ddi}|j                  d|      }||j                  xs dj                         sB|j                  d|      }||j                  xs dj                         nd	}t        d
|       |j                  j                         S )Nusernamepassword   paramstimeoutqhttp://xmldata.qrz.comz.//q:Session/q:Key .//q:Session/q:Errorzmissing session keyzQRZ login failed: )
requestsgetQRZ_URLraise_for_statusET
fromstringtextfindstripRuntimeError)	r   r   r   responserootnskeyerrorreasons	            ./var/www/html/radiogram/radiogram_generator.py	qrz_loginr4   '   s    "9F||GFB?H=='D
'	(B
))("
-C
{388>r002		0"5/4/@%**"))+F[/x89988>>    c                @   | |d}t        j                  t        |d      }|j                          t	        j
                  |j                        }ddi}|j                  d|      }|K|j                  xs dj                         r-t        d| d	|j                  xs dj                                i }|j                  d
|      D ]B  }|j                  j                  dd      d   }	|j                  xs d||	j                         <   D |st        d| d      |S )N)scallsignr   r   r   r    r"   r!   zQRZ lookup failed for z: z.//q:Callsign/*}   zNo callsign data returned for .)r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   findalltagsplitlower)
session_keyr8   r   r-   r.   r/   r1   dataelemr=   s
             r3   
qrz_lookuprC   6   s   H5F||GFB?H=='D
'	(BII,b1Eejj.B5573H:RAQr@X@X@Z?[\]]D.3 ,hhnnS!$Q' IIOSYY[, ;H:QGHHKr5   c                    | j                  t        j                  ddt        j                              }dj                  |j                         j                               S )Nr!    )	translatestr	maketransstringpunctuationjoinupperr>   )r)   cleaneds     r3   nts_clean_addressrN   J   sA    nnS]]2r63E3EFGG88GMMO))+,,r5   c                    | j                         j                         j                  dd      j                  dd      }dj                  |j	                               S )Nr;   z DOT @z ATSIGN rE   )r+   rL   replacerK   r>   )email	formatteds     r3   nts_format_emailrT   O   sF    ##%--c7;CCCTI88IOO%&&r5   c                x    dj                  d | j                         D              }t        |      dk\  r|d d S |S )Nr!   c              3  B   K   | ]  }|j                         s|  y wN)isdigit).0chs     r3   	<genexpr>znts_zip5.<locals>.<genexpr>U   s     BBRZZ\RBs      )rK   r+   len)zipcodedigitss     r3   nts_zip5r`   T   s8    WWB'--/BBFV)6"1:5v5r5   c                    | j                  dd      j                         }|rt        |      S | j                  dd      }t        |      }|r|j                         d   S dS )Ncityr!   addr2r   )r$   r+   rN   r>   )inforb   rc   rM   s       r3   nts_cityre   Y   s[    88FB%%'D &&HHWb!E&G!(7==?10b0r5   c                    | j                  dd      j                         }|rt        |      S | j                  dd      }t        |      }|j                         }t	        |      dk\  r|d   S dS )Nstater!   rc      r:   )r$   r+   rN   r>   r]   )rd   rg   rc   rM   partss        r3   	nts_staterj   b   sg    HHWb!'')E ''HHWb!E&GMMOE5zQ58.B.r5   c                   t        | j                  dd            t        | j                  dd            t        | j                  dd            | j                  dd      j                         g}dj                  d |D              S )Nfnamer!   namelnamecallrE   c              3  &   K   | ]	  }|s|  y wrW    )rY   ps     r3   r[   z nts_addressee.<locals>.<genexpr>s   s     *!A*s   )rN   r$   rL   rK   )rd   ri   s     r3   nts_addresseers   l   sp    $((7B/0$((62./$((7B/0""$	E 88*u***r5   c           	         t        j                  dd| j                               j                         j	                         dj                  fdt        dt              d      D              S )N\s+rE   
c              3  L   K   | ]  }d j                  ||dz            yw)rE   r\   N)rK   )rY   iwordss     r3   r[   z"nts_format_text.<locals>.<genexpr>x   s$     O!SXXeAa!en-Os   !$r   r\   )resubrL   r+   r>   rK   ranger]   )rawry   s    @r3   nts_format_textr~   v   sO    FF63		,224::<E99OuQE
A7NOOOr5   c                    t        t        j                  dd| j                               j	                         j                               S )Nru   rE   )r]   rz   r{   rL   r+   r>   )r}   s    r3   	nts_checkr   {   s2    rvvfc399;/557==?@@r5   c                H    d| d    d| d    d| d    d| d| d    d| d	    S )
NzNR r   rE   r   z HXG r   z CHECK r   r   rq   )valueschecks     r3   build_preambler      sX    
f%&'q)=(>eFK^D_C` aq 1231VL5I4J	Lr5   c                \   t        |      }t        |j                  dd            }t        |      }t	        |      }t        |j                  dd            }t        | d         }t        | |      }	t        | d         }
|	 d| d| d| d| d| d| d|
 d	| d
    dj                         S )Naddr1r!   zipr   rv   rE   z
EMAIL z

BT
z
BT

r   z
AR
)
rs   rN   r$   re   rj   r`   r   r   r~   r+   )r   rd   email_formattedto_liner   rb   rg   zipcr   preamble
text_blocks              r3   build_radiogramr      s    D!Gdhhw34ED>DdOEDHHUB'(Df/01Efe,H (:!;<Jz 	 
 awav        
EGr5   c                   t         j                         }t        j                         }| j	                         s|S |j                  |        |j                  d      r/|j                  ddd      |d<   |j                  ddd      |d<   n
d|d<   d|d<   |j                  d      r)t         D ]   }|j                  d|t         |         ||<   " |S )NQRZr   r!   )fallbackr   MESSAGE)DEFAULTScopyconfigparserConfigParserexistsreadhas_sectionr$   )config_pathrA   parserr0   s       r3   load_app_configr      s    ==?D&&(F
KK% !::eZ":EZ!::eZ":EZZZ)$ 	KC

9cHSM
JDI	KKr5   c                .   t        j                         }|j                  dd      |j                  dd      d|d<   t        D ci c]  }|||   
 c}|d<   | j	                  dd	      5 }|j                  |       d d d        y c c}w # 1 sw Y   y xY w)
Nr   r!   r   r   r   r   wutf-8encoding)r   r   r$   r   openwrite)r   r   r   r0   fps        r3   save_app_configr      s    &&(FJJz2.JJz2.F5M 6>>cfSk)>F9			#		0 BR  ? s   B+BBc                    | j                  d      j                         D cg c]1  }|j                         s|j                         j                         3 c}S c c}w )Nr   r   )	read_text
splitlinesr+   rL   )pathlines     r3   read_callsigns_from_filer      sE    -1^^W^-M-X-X-ZkT^b^h^h^jDJJL kkks
   A Ac                   | j                         D cg c]1  }|j                         s|j                         j                         3 }}g }t               }|D ])  }||vs|j	                  |       |j                  |       + |S c c}w rW   )r   r+   rL   setaddappend)r)   r   	callsignsdedupedseenr8   s         r3   read_callsigns_from_textr      s{    26//2CT$tzz|##%TITGUD %4HHXNN8$% N Us
   B Bc                ^   |st        d      t        | d         }|j                  dd        |d       t        | d   | d         } |d       d	}d	}|D ]  } |d
| d       	 t	        ||      }|j                  dd      j                         }
|
s|dz  } |d       Lt        | |t        |
            }|| dz  }|j                  |d       |dz  } |d|         ||fS # t         t
        j                  t        j                  f$ r}	|dz  } |d|	        Y d }	~	d }	~	ww xY w)NzNo callsigns provided.r   T)parentsexist_okzLogging into QRZ XML API...r   r   zQRZ login successful.r   zLooking up z...r:   z  Lookup failed: rR   r!   z#  Skipped: no email in QRZ profile.z.txtr   r   z  Generated -> )r,   r   mkdirr4   rC   r#   RequestExceptionr'   
ParseErrorr$   r+   r   rT   
write_text)r   r   logr   r@   	generatedskippedcsrd   excrR   	radiogramoutfiles                r3   generate_bulkr      sd   344f\*+JTD1%&F:.z0BCK IG )k"S!"	k2.D "%++-qLG56#FD2B52IJ	"T{*9w7Q	ogY'(')* g# h77G 	qLG#C5)*	s   'C**(D,D''D,c                  p     e Zd Zd fdZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZ xZS )RadiogramGuic                    t         |           | j                  d       | j                  d       i | _        | j                          | j                          y )NzRadiogram Bulk Generator980x780)super__init__titlegeometryvars_build_form_load_defaults)self	__class__s    r3   r   zRadiogramGui.__init__   sF    

-.i -/	r5   c                   t        j                  | d      }|j                  t        j                  d       g d}t        |      D ]  \  }\  }}t        j                  ||      j                  |ddd	d
       t        j                         }|| j                  |<   |dk(  rdnd}t        j                  |||d      }|j                  |ddd
       |dk(  r5t        j                  |d| j                        j                  |dd       |dk(  st        j                  |d| j                        j                  |dd        t        |      }	t        j                  |d      j                  |	ddd	d
       t        j                  |dd      | _        | j                   j                  |	ddd
       |	dz   }
t        j                  |d       j                  |
ddd	d
       t        j                  |dd      | _        | j"                  j                  |
ddd
       |
dz   }t        j                  |      }|j                  |ddd!       t        j                  |d"| j$                        j                  t        j&                  d#$       t        j                  |d%| j(                        j                  t        j&                  d#$       t        j                  |d&| j*                        j                  t        j&                  d#$       t        j                  |d'| j,                        j                  t        j&                  (       |dz   }t        j                  |d)      j                  |ddd	d
       t        j                  |d*d+      | _        | j.                  j                  |ddd,d
-       |j1                  dd.       |j3                  |d.       y )/N   )paddingT)fillexpand)
)zQRZ Usernamer   )zQRZ Passwordr   )zMessage Numberr   )
Precedencer   )zStation of Originr   )zPlace of Originr   )z
Date Filedr   )	Signaturer   )zCallsign Filer   )zOutput Directoryr   )r)   r   r   )r         )rowcolumnstickypadxpadyr   *r!   Z   )textvariableshowwidthr:   ew)r   r   r   r   r   Browse)r)   commandrh   )r   r   )r   r   r   r   zMessage Textnw   F   )heightr   zInline Callsigns (optional)
   zLoad Config)r   r   )sider   zSave ConfigzGenerate from FilezGenerate from Inline)r   Log   d   nsew)r   r   
columnspanr   r   )weight)r   FramepacktkBOTH	enumerateLabelgrid	StringVarr   EntryButton_pick_callsign_file_pick_output_dirr]   Textmessage_textinline_callsignsr   LEFT_save_defaults_generate_from_file_generate_from_inline
log_outputcolumnconfigurerowconfigure)r   framefieldsr   labelr0   varr   entrymessage_rowcallsign_row
button_rowbtnslog_rows                 r3   r   zRadiogramGui._build_form   s[   		$+


-
 "+6!2 	uC%IIe%(--#aRX_`-a,,.C DIIcN+3DIIe#DKEJJ3qAJ>o%

5x9Q9QRWW\_hipvWw$

5x9N9NOTTY\efmsTt	u &k		%n-22{1UY`fmn2oGGE!2>;qAN"Q		%;<AAl[\eipv}~A "ar B""|AdQR"S!A%
yy		j3R	@

4mT5H5HINNTVT[T[bhNi

4mT5H5HINNTVT[T[bhNi

42D<T<TUZZ`b`g`gntZu

44d>X>XY^^dfdkdk^lq.		%e$))gaSY`a)b''%#>qVWXa*71-r5   c                r    t        j                  d      }|r| j                  d   j                  |       y y )NzSelect Callsign Filer   r   )r   askopenfilenamer   r   r   selecteds     r3   r   z RadiogramGui._pick_callsign_file3  s2    --4JKIIo&**84 r5   c                r    t        j                  d      }|r| j                  d   j                  |       y y )NzSelect Output Directoryr  r   )r   askdirectoryr   r   r  s     r3   r   zRadiogramGui._pick_output_dir8  s2    **1JKIIl#''1 r5   c                    | j                   j                  t        j                  |dz          | j                   j	                  t        j                         | j                          y )Nrv   )r  insertr   ENDseeupdate_idletasks)r   msgs     r3   _logzRadiogramGui._log=  s@    rvvsTz2BFF#r5   c                   | j                   j                         D ci c]$  \  }}||j                         j                         & }}}| j                  j                  dt
        j                        j                         |d<   g d}|D cg c]  }|j                  |      r| }}|rt        ddj                  |      z         |S c c}}w c c}w )N1.0r   )	r   r   r   r   r   r   r   r   r   zMissing required fields: z, )	r   itemsr$   r+   r   r   r  r,   rK   )r   kvr   requiredmissings         r3   _collect_valueszRadiogramGui._collect_valuesB  s    151BCA!QUUW]]_$CC%)%6%6%:%:5"&&%I%O%O%Q!" c&<fjjm1<<:TYYw=OOPP D =s   )CC$Cc           
        t        t              }| j                  D ]D  }| j                  |   j                  |j	                  |t
        j	                  |d                   F | j                  j                  dt        j                         | j                  j                  d|j	                  dt
        d                | j                  dt         d       y )Nr!   r   r   zLoaded config from r;   )r   CONFIG_FILEr   r   r$   r   r   deleter   r  r  r  )r   loadedr0   s      r3   r   zRadiogramGui._load_defaultsK  s     -99 	GCIIcNvzz#x||C/DEF	G  /  

3ExPbGc(de		'}A67r5   c                    	 | j                         }t        t        |       | j                  dt         d       y # t        t
        f$ r)}t        j                  dt        |             Y d }~y d }~ww xY w)NzSaved config to r;   zSave Failed)	r&  r   r(  r  r,   OSErrorr   	showerrorrG   )r   r   r   s      r3   r  zRadiogramGui._save_defaultsS  sa    	:))+FK0II(Q78g& 	:  C99	:s   9< A4A//A4c                   	 | j                         }t        ||| j                        \  }}| j                  d| d|        t        j                  dd| d|        y # t
        t        j                  t        j                  t        f$ r=}t        j                  dt        |             | j                  d|        Y d }~y d }~ww xY w)NDone. Generated: , Skipped: CompletezGenerated: z

Skipped: zGeneration FailedzERROR: )r&  r   r  r   showinfor,   r#   r   r'   r   r,  r-  rG   )r   r   r   r   r   r   s         r3   	_generatezRadiogramGui._generate[  s    	'))+F!.vy$))!LIwII))KyIJ
k)KPWy,YZh77P 	'  !4c#h?IIuo&&	's   AA   -C
3CC
c                6   	 | j                   d   j                         j                         }|st        d      t	        t        |            }| j                  |       y # t        t        f$ r)}t        j                  dt        |             Y d }~y d }~ww xY w)Nr   zCallsign file path is required.zInput Error)r   r$   r+   r,   r   r   r3  r,  r   r-  rG   )r   r   r   r   s       r3   r  z RadiogramGui._generate_from_filee  s}    	: IIo6::<BBDM "#DEE0m1DEINN9%g& 	:  C99	:s   AA   B/BBc                    t        | j                  j                  dt        j                              }| j                  |       y )Nr   )r   r   r$   r   r  r3  )r   r   s     r3   r  z"RadiogramGui._generate_from_inlineo  s/    ,T-B-B-F-Fubff-UV	y!r5   returnNoner  rG   r7  r8  )r7  dict[str, str])r   	list[str]r7  r8  )__name__
__module____qualname__r   r   r   r   r  r&  r   r  r3  r  r  __classcell__)r   s   @r3   r   r      s;    6.p5
2
 
8:':"r5   r   c                     t        t              } | j                  d      r| j                  d      st        d      t	        t        | d               }dd}t        | ||      \  }}t        d| d|        y )	Nr   r   z4config.ini must include [QRZ] username and password.r   c                    t        |        y rW   )print)r  s    r3   printerzrun_cli.<locals>.printerz  s	    c
r5   r/  r0  r9  )r   r(  r$   r,   r   r   r   rB  )r   r   rC  r   r   s        r3   run_clirD  t  ss    [)F::j!J)?QRR(f_.E)FGI 'vy'BIw	i[G9
=>r5   c                     t        j                  d      } | j                  ddd       | j                         }|j                  rt                y t               }|j                          y )NzBulk Radiogram Generator)descriptionz--cli
store_truezRun headless CLI mode)actionhelp)argparseArgumentParseradd_argument
parse_argsclirD  r   mainloop)r   argsapps      r3   mainrR    sV    $$1KLF
;RSDxx	
.CLLNr5   __main__)r   rG   r   rG   r7  rG   )r@   rG   r8   rG   r7  r:  )r)   rG   r7  rG   )rR   rG   r7  rG   )r^   rG   r7  rG   )rd   r:  r7  rG   )r}   rG   r7  rG   )r}   rG   r7  int)r   r:  r   rT  r7  rG   )r   r:  rd   r:  r   rG   r7  rG   )r   r   r7  r:  )r   r   r   r:  r7  r8  )r   r   r7  r;  )r)   rG   r7  r;  )r   r:  r   r;  r   zCallable[[str], None]r7  ztuple[int, int]r6  ).__doc__
__future__r   rJ  r   rz   rI   pathlibr   typingr   r#   tkinterr   r   r   r   xml.etree.ElementTreeetreeElementTreer'   r%   r(  r   r4   rC   rN   rT   r`   re   rj   rs   r~   r   r   r   r   r   r   r   r   Tkr   rD  rR  r<  rq   r5   r3   <module>r^     s    #   	      / / " "
0<  ! >	S % (-
'
6
1/+P
A0(l"J@"255 @"F
?
 zF r5   