def index(self): # Attempt to retrieve search parameters form = processRequest(request=request) self.random['imnumber'] = 16 images = [] # Get random images ; parse out thumbnails ; construct plate-IFUs imfiles = None try: imfiles = getRandomImages(as_url=True, num=self.random['imnumber'], mode='local', release=self._release) except (MarvinError, AssertionError) as e: self.random['error'] = 'Error: could not get images: {0}'.format(e) else: images = buildImageDict(imfiles) # if image grab failed, make placeholders if not imfiles: images = buildImageDict(imfiles, test=True, num=self.random['imnumber']) # Add images to dict self.random['images'] = images return render_template('random.html', **self.random)
def login(self): ''' login for trac user ''' try: from inspection.marvin import Inspection except ImportError as e: from brain.core.inspection import Inspection form = processRequest(request=request) result = {} username = form['username'].strip() password = form['password'].strip() auth = md5("{0}:AS3Trac:{1}".format(username, password).encode( 'utf-8')).hexdigest() if username and password else None try: inspection = Inspection(current_session, username=username, auth=auth) except Exception as e: result['status'] = -1 result['message'] = e current_session['loginready'] = False else: result = inspection.result() current_session['loginready'] = inspection.ready current_session['name'] = result.get('membername', None) print('login result', result) return jsonify(result=result)
def webtable(self): ''' Do a query for Bootstrap Table interaction in Marvin web ''' form = processRequest(request=request) args = av.manual_parse(self, request, use_params='query') # remove args __tmp__ = args.pop('release', None) __tmp__ = args.pop('searchfilter', None) limit = args.get('limit') offset = args.get('offset') if 'sort' in args: current_session['query_sort'] = args['sort'] # set parameters searchvalue = current_session.get('searchvalue', None) returnparams = current_session.get('returnparams', None) # exit if no searchvalue is found if not searchvalue: output = jsonify({'errmsg': 'No searchvalue found', 'status': -1}) return output # this is to fix the brokeness with sorting on a table column using remote names print('rp', returnparams, args) # do query try: q, res = doQuery(searchfilter=searchvalue, release=self._release, returnparams=returnparams, **args) except Exception as e: errmsg = 'Error generating webtable: {0}'.format(e) output = jsonify({'status': -1, 'errmsg': errmsg}) return output # get subset on a given page try: __results__ = res.getSubset(offset, limit=limit) except Exception as e: errmsg = 'Error getting table page: {0}'.format(e) output = jsonify({'status': -1, 'errmsg': errmsg}) return output else: # get keys cols = res.columns.remote # create output rows = res.getDictOf(format_type='listdict') output = { 'total': res.totalcount, 'rows': rows, 'columns': cols, 'limit': limit, 'offset': offset } output = jsonify(output) return output
def webtable(self): ''' Do a query for Bootstrap Table interaction in Marvin web ''' form = processRequest(request=request) args = av.manual_parse(self, request, use_params='query') #{'sort': u'cube.mangaid', 'task': None, 'end': None, 'searchfilter': None, #'paramdisplay': None, 'start': None, 'rettype': None, 'limit': 10, 'offset': 30, #'release': u'MPL-4', 'params': None, 'order': u'asc'} # remove args __tmp__ = args.pop('release', None) __tmp__ = args.pop('searchfilter', None) limit = args.get('limit') offset = args.get('offset') # set parameters searchvalue = current_session.get('searchvalue', None) returnparams = current_session.get('returnparams', None) # limit = form.get('limit', 10, type=int) # offset = form.get('offset', None, type=int) # order = form.get('order', None, type=str) # sort = form.get('sort', None, type=str) # search = form.get('search', None, type=str) # exit if no searchvalue is found if not searchvalue: output = jsonify({ 'webtable_error': 'No searchvalue found', 'status': -1 }) return output # do query q, res = doQuery(searchfilter=searchvalue, release=self._release, returnparams=returnparams, **args) # q, res = doQuery(searchfilter=searchvalue, release=self._release, # limit=limit, order=order, sort=sort, returnparams=returnparams) # get subset on a given page __results__ = res.getSubset(offset, limit=limit) # get keys cols = res.mapColumnsToParams() # create output rows = res.getDictOf(format_type='listdict') output = {'total': res.totalcount, 'rows': rows, 'columns': cols} output = jsonify(output) return output
def login(self): ''' Server-Side login to generate a new token ''' result = {} # check the form form = processRequest(request=request) if form is None: result['error'] = 'Request has no form data!' return jsonify(result), 400 # get username and password username = form.get('username', None) password = form.get('password', None) # return if no valid login form data if not username or not password: result['error'] = 'Missing username and/or password!' return jsonify(result), 400 username = username.strip() password = password.strip() # validate the user with htpassfile or trac username is_valid, user, result = validate_user(username, password, request=request) # User code goes here if is_valid: user = get_db_user(username, password, dbsession=marvindb.session, user_model=marvindb.datadb.User, request=request) if user and user.check_password(password): # generate token if valid access_token = create_access_token(identity=user.username, fresh=True) return jsonify(access_token=access_token), 200 else: msg = result['error'] if 'error' in result else '' result[ 'error'] = 'Not valid login. Bad username or password. {0}'.format( msg) return jsonify(result), 401
def login(self): form = processRequest(request=request) result = {} username = form['username'].strip() password = form['password'].strip() # do nothing if already validated if current_user.is_authenticated: return jsonify(result=result) # validate the user with htpassfile or trac username is_valid, user, result = validate_user(username, password, request=request, session=current_session) # get User only if valid if is_valid: user = get_db_user(username, password, dbsession=marvindb.session, user_model=marvindb.datadb.User, request=request) if user and user.check_password(password): login_user(user) if is_valid: result['status'] = 1 result['message'] = 'Login Successful!' current_session['name'] = user.username current_session['loginready'] = True config.access = 'collab' setGlobalSession() else: result['status'] = -1 result['message'] = 'Login {0} is not valid!'.format(username) return jsonify(result=result)
def index(self): # Attempt to retrieve search parameters form = processRequest(request=request) self.search['formparams'] = form self.search['latest_dr'] = self._release.lower() if 'DR' in self._release else config._get_latest_release(dr_only=True).lower() # set the search form and form validation searchform = self.mf.SearchForm(form) searchform.returnparams.choices = [(k.lower(), k) for k in query_params.list_params()] # Add the forms and parameters self.search['paramdata'] = query_params self.search['guideparams'] = [{'id': p.full, 'optgroup': group.name, 'type': 'double' if p.dtype == 'float' else p.dtype, 'validation': {'step': 'any'}} for group in query_params for p in group] self.search['searchform'] = searchform self.search['placeholder'] = getRandomQuery() self.search['returnurl'] = 'https://sdss-marvin.readthedocs.io/en/stable/datamodel/{0}.html#{0}query'.format( current_session['release'].lower().replace('-', '')) # If form parameters then try to do a search if form: self.search.update({'results': None, 'errmsg': None}) args = av.manual_parse(self, request, use_params='search') # get form parameters searchvalue = form['searchbox'] # search filter input returnparams = form.getlist('returnparams', type=str) # dropdown select self.search.update({'returnparams': returnparams}) current_session.update({'searchvalue': searchvalue, 'returnparams': returnparams}) # if main form passes validation then do search if searchform.validate(): # try the query try: q, res = doQuery(search_filter=searchvalue, release=self._release, return_params=returnparams) except (MarvinError, KeyError) as e: self.search['errmsg'] = 'Could not perform query: {0}'.format(refine_error(e)) except NotImplementedError as e: # DAP queries disabled self.search['errmsg'] = 'Could not perform query: {0}'.format(e) else: self.search['filter'] = q.search_filter self.search['count'] = res.totalcount self.search['runtime'] = res.query_time.total_seconds() if res.count > 0: cols = res.columns.remote rows = res.getDictOf(format_type='listdict') output = {'total': res.totalcount, 'rows': rows, 'columns': cols, 'limit': None, 'offset': None} else: output = None self.search['results'] = output self.search['reslen'] = len(res.results) if returnparams: returnparams = [str(r) for r in returnparams] rpstr = 'return_params={0} <br>'.format(returnparams) if returnparams else '' qstr = ', return_params=returnparams' if returnparams else '' self.search['querystring'] = ("<html><samp>from marvin.tools.query import Query<br>\ myfilter='{0}'<br> {1}\ q = Query(search_filter=myfilter{2})<br>\ r = q.run()<br></samp></html>".format(searchvalue, rpstr, qstr)) return render_template('search.html', **self.search)
def index(self): # Attempt to retrieve search parameters form = processRequest(request=request) self.search['formparams'] = form print('search form', form, type(form)) # set the search form and form validation searchform = self.mf.SearchForm(form) q = Query(release=self._release) # allparams = q.get_available_params() bestparams = q.get_best_params() searchform.returnparams.choices = [(k.lower(), k) for k in bestparams] searchform.parambox.validators = [ all_in(bestparams), validators.Optional() ] # Add the forms self.search['searchform'] = searchform self.search['placeholder'] = getRandomQuery() #from flask import abort #abort(500) # If form parameters then try to do a search if form: self.search.update({'results': None, 'errmsg': None}) args = av.manual_parse(self, request, use_params='search') print('search args', args) # get form parameters searchvalue = form['searchbox'] # search filter input returnparams = form.getlist('returnparams', type=str) # dropdown select parambox = form.get('parambox', None, type=str) # from autocomplete if parambox: parms = parambox.split(',') parms = parms if parms[-1].strip() else parms[:-1] parambox = parms if parambox else None # Select the one that is not none returnparams = returnparams if returnparams and not parambox else \ parambox if parambox and not returnparams else \ list(set(returnparams) | set(parambox)) if returnparams and parambox else None print('return params', returnparams) current_session.update({ 'searchvalue': searchvalue, 'returnparams': returnparams }) # if main form passes validation then do search if searchform.validate(): # try the query try: q, res = doQuery(searchfilter=searchvalue, release=self._release, returnparams=returnparams) except MarvinError as e: self.search[ 'errmsg'] = 'Could not perform query: {0}'.format(e) else: self.search['filter'] = q.strfilter self.search['count'] = res.totalcount self.search['runtime'] = res.query_runtime.total_seconds() if res.count > 0: cols = res.mapColumnsToParams() rows = res.getDictOf(format_type='listdict') output = { 'total': res.totalcount, 'rows': rows, 'columns': cols } else: output = None self.search['results'] = output self.search['reslen'] = len(res.results) if returnparams: returnparams = [str(r) for r in returnparams] rpstr = 'returnparams={0} <br>'.format( returnparams) if returnparams else '' qstr = ', returnparams=returnparams' if returnparams else '' self.search['querystring'] = ( "<html><samp>from marvin import \ config<br>from marvin.tools.query import Query<br>config.mode='remote'<br>\ filter='{0}'<br> {1}\ q = Query(searchfilter=filter{2})<br>\ r = q.run()<br></samp></html>".format( searchvalue, rpstr, qstr)) return render_template('search.html', **self.search)