Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
0
    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)
Beispiel #7
0
    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)
Beispiel #8
0
    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)