Skip to content

Commit 6a905ae

Browse files
jespinosaarbsipocz
authored andcommitted
JWSTPCR-135: MAST token in login, login_gui, set_token and documentation
1 parent 7b2e742 commit 6a905ae

File tree

3 files changed

+221
-8
lines changed

3 files changed

+221
-8
lines changed

astroquery/jwst/core.py

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from .data_access import JwstDataHandler
3939

4040
from builtins import isinstance
41+
from astroquery.jwst.token import TokenDialog
4142

4243
__all__ = ['Jwst', 'JwstClass']
4344

@@ -947,7 +948,7 @@ def save_results(self, job, verbose=False):
947948
return self.__jwsttap.save_results(job, verbose)
948949

949950
def login(self, user=None, password=None, credentials_file=None,
950-
verbose=False):
951+
token=None, verbose=False):
951952
"""Performs a login.
952953
TAP+ only
953954
User and password can be used or a file that contains user name and
@@ -963,13 +964,17 @@ def login(self, user=None, password=None, credentials_file=None,
963964
credentials_file : str, mandatory if no 'user' & 'password' are
964965
provided
965966
file containing user and password in two lines
967+
token: str, optional
968+
MAST token to have access to propietary data
966969
verbose : bool, optional, default 'False'
967970
flag to display information about the process
968971
"""
969-
return self.__jwsttap.login(user=user,
970-
password=password,
971-
credentials_file=credentials_file,
972-
verbose=verbose)
972+
self.__jwsttap.login(user=user,
973+
password=password,
974+
credentials_file=credentials_file,
975+
verbose=verbose)
976+
if token:
977+
self.set_token(token)
973978

974979
def login_gui(self, verbose=False):
975980
"""Performs a login using a GUI dialog
@@ -982,6 +987,31 @@ def login_gui(self, verbose=False):
982987
"""
983988
return self.__jwsttap.login_gui(verbose)
984989

990+
def login_token_gui(self, verbose=False):
991+
"""Performs a login using a GUI dialog
992+
TAP+ only, with an additiona field to
993+
specify a token
994+
995+
Parameters
996+
----------
997+
verbose : bool, optional, default 'False'
998+
flag to display information about the process
999+
"""
1000+
connHandler = self.__jwsttap._TapPlus__getconnhandler()
1001+
url = connHandler.get_host_url()
1002+
loginDialog = TokenDialog(url)
1003+
loginDialog.show_login()
1004+
if loginDialog.is_accepted():
1005+
user = loginDialog.get_user()
1006+
pwd = loginDialog.get_password()
1007+
if loginDialog.get_token():
1008+
token = loginDialog.get_token()
1009+
self.login(user=user, password=pwd, token=token,
1010+
verbose=verbose)
1011+
else:
1012+
self.login(user=user, password=pwd, verbose=verbose)
1013+
# execute login
1014+
9851015
def logout(self, verbose=False):
9861016
"""Performs a logout
9871017
TAP+ only
@@ -993,6 +1023,19 @@ def logout(self, verbose=False):
9931023
"""
9941024
return self.__jwsttap.logout(verbose)
9951025

1026+
def set_token(self, token):
1027+
"""Links a MAST token to the logged user
1028+
1029+
Parameters
1030+
----------
1031+
token: str, mandatory
1032+
MAST token to have access to propietary data
1033+
"""
1034+
subcontext = 'session'
1035+
data = 'action=set&key=mast_token&value=' + token
1036+
self.__jwsttap._TapPlus__getconnhandler().execute_tappost(subcontext,
1037+
data)
1038+
9961039
def get_product_list(self, observation_id=None,
9971040
cal_level="ALL",
9981041
product_type=None):

astroquery/jwst/token.py

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# Licensed under a 3-clause BSD style license - see LICENSE.rst
2+
"""
3+
=======================
4+
LOGIN WITH TOKEN DIALOG
5+
=======================
6+
7+
@author: Javier Espinosa Aranda
8+
9+
10+
European Space Astronomy Centre (ESAC)
11+
European Space Agency (ESA)
12+
13+
Created on 04 sept. 2020
14+
15+
16+
"""
17+
18+
import six
19+
20+
try:
21+
from six.moves.tkinter import Tk as TKTk
22+
except ImportError:
23+
TKTk = None
24+
25+
try:
26+
from six.moves.tkinter import Toplevel as TKToplevel
27+
except ImportError:
28+
TKToplevel = None
29+
30+
try:
31+
from six.moves.tkinter import Button as TKButton
32+
except ImportError:
33+
TKButton = None
34+
35+
try:
36+
from six.moves.tkinter import Label as TKLabel
37+
except ImportError:
38+
TKLabel = None
39+
40+
try:
41+
from six.moves.tkinter import Entry as TKEntry
42+
except ImportError:
43+
TKEntry = None
44+
45+
46+
class TokenDialog(object):
47+
48+
def __init__(self, host):
49+
self.__interna_init()
50+
self.__host = host
51+
self.__initialized = False
52+
if TKTk is not None:
53+
self.__create_content()
54+
self.__initialized = True
55+
56+
def __interna_init(self):
57+
self.__rootFrame = None
58+
self.__top = None
59+
self.__usrEntry = None
60+
self.__pwdEntry = None
61+
self.__tokenEntry = None
62+
self.__accepted = False
63+
self.__host = None
64+
self.__usr = None
65+
self.__pwd = None
66+
self.__token = None
67+
68+
def __cancel_action(self):
69+
self.__accepted = False
70+
self.__rootFrame.destroy()
71+
72+
def __login_action(self):
73+
self.__accepted = True
74+
self.__usr = self.__usrEntry.get()
75+
self.__pwd = self.__pwdEntry.get()
76+
self.__token = self.__tokenEntry.get()
77+
self.__rootFrame.destroy()
78+
79+
def __enter_action(self, event):
80+
self.__login_action()
81+
82+
def __create_content(self):
83+
self.__rootFrame = TKTk()
84+
self.__rootFrame.withdraw()
85+
86+
self.__top = TKToplevel(self.__rootFrame)
87+
self.__top.title("Login")
88+
self.__top.protocol("WM_DELETE_WINDOW", self.__rootFrame.destroy)
89+
90+
self.__top.bind('<Return>', self.__enter_action)
91+
92+
self.__top.update_idletasks()
93+
width = self.__top.winfo_width()
94+
height = self.__top.winfo_height()
95+
x = (self.__top.winfo_screenwidth() // 2) - (width // 2)
96+
y = (self.__top.winfo_screenheight() // 2) - (height // 2)
97+
98+
self.__top.geometry("+%d+%d" % (x, y))
99+
100+
row = 0
101+
expLabel = TKLabel(self.__top, text='Login to host:')
102+
expLabel.grid(row=row, column=0, columnspan=4, padx=5, pady=2)
103+
104+
row = row+1
105+
urlLabel = TKLabel(self.__top, text=self.__host)
106+
urlLabel.grid(row=row, column=0, columnspan=4, padx=5, pady=2)
107+
108+
row = row+1
109+
usrLabel = TKLabel(self.__top, text='User')
110+
usrLabel.grid(row=row, column=0, columnspan=2, padx=20, pady=5)
111+
self.__usrEntry = TKEntry(self.__top, width=20)
112+
self.__usrEntry.grid(row=row, column=2, columnspan=2, padx=5, pady=5)
113+
114+
row = row+1
115+
pwdLabel = TKLabel(self.__top, text='Password')
116+
pwdLabel.grid(row=row, column=0, columnspan=2, padx=20, pady=5)
117+
self.__pwdEntry = TKEntry(self.__top, width=20, show="*")
118+
self.__pwdEntry.grid(row=row, column=2, columnspan=2, padx=5, pady=5)
119+
120+
row = row+1
121+
tokenLabel = TKLabel(self.__top, text='Token')
122+
tokenLabel.grid(row=row, column=0, columnspan=2, padx=20, pady=5)
123+
self.__tokenEntry = TKEntry(self.__top, width=20)
124+
self.__tokenEntry.grid(row=row, column=2, columnspan=2, padx=5, pady=5)
125+
126+
row = row+1
127+
cancelButton = TKButton(self.__top, text='Cancel', command=self.__cancel_action)
128+
cancelButton.grid(row=row, column=1, padx=5, pady=5)
129+
loginButton = TKButton(self.__top, text='Login', command=self.__login_action)
130+
loginButton.grid(row=row, column=2, padx=5, pady=5)
131+
132+
def show_login(self):
133+
if self.__initialized:
134+
self.__usrEntry.focus_set()
135+
self.__rootFrame.mainloop()
136+
else:
137+
print("tkinter python module is not available.\n\
138+
Please, install tkinter module or use command line login utility.")
139+
140+
def is_accepted(self):
141+
return self.__accepted
142+
143+
def get_user(self):
144+
return self.__usr
145+
146+
def get_password(self):
147+
return self.__pwd
148+
149+
def get_token(self):
150+
return self.__token

docs/jwst/jwst.rst

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ To remove asynchronous
630630
---------------------------
631631

632632
Authenticated users are able to access to TAP+ capabilities (shared tables, persistent jobs, etc.)
633-
In order to authenticate a user, ``login`` or ``login_gui`` methods must be called. After a successful
633+
In order to authenticate a user, ``login``, ``login_gui`` or ``login_token_gui`` methods must be called. After a successful
634634
authentication, the user will be authenticated until ``logout`` method is called.
635635

636636
All previous methods (``query_object``, ``cone_search``, ``load_table``, ``load_tables``, ``launch_job``) explained for
@@ -640,12 +640,13 @@ The main differences are:
640640

641641
* Asynchronous results are kept at server side for ever (until the user decides to remove one of them).
642642
* Users can access to shared tables.
643+
* ``login_token_gui`` allows the user to include a MAST token to download propietary data. It is also possible to set a token after logging using ``set_token`` function.
643644

644645

645646
2.1. Login/Logout
646647
~~~~~~~~~~~~~~~~~
647648

648-
Graphic interface
649+
Using the graphic interface:
649650

650651

651652
*Note: Tkinter module is required to use login_gui method.*
@@ -655,9 +656,14 @@ Graphic interface
655656
>>> from astroquery.jwst import Jwst
656657
>>> Jwst.login_gui()
657658
659+
If the user wants to specify a MAST token to download propietary data:
658660

659-
Command line
661+
.. code-block:: python
662+
663+
>>> from astroquery.jwst import Jwst
664+
>>> Jwst.login_token_gui()
660665
666+
Using the command line:
661667

662668
.. code-block:: python
663669
@@ -674,7 +680,21 @@ It is possible to use a file where the credentials are stored:
674680
>>> from astroquery.jwst import Jwst
675681
>>> Jwst.login(credentials_file='my_credentials_file')
676682
683+
MAST tokens can also be implemented in command line functions:
684+
685+
.. code-block:: python
686+
687+
>>> from astroquery.jwst import Jwst
688+
>>> Jwst.login(user='userName', password='userPassword', token='mastToken')
689+
690+
If the user is logged in and a MAST token has not been included or must be changed, it can be
691+
specified using the ``set_token`` function.
692+
693+
.. code-block:: python
677694
695+
>>> from astroquery.jwst import Jwst
696+
>>> Jwst.login(user='userName', password='userPassword')
697+
>>> Jwst.set_token(token='mastToken')
678698
679699
To perform a logout
680700

0 commit comments

Comments
 (0)