Example #1
0
    def resource_format_autocomplete(self):
        '''Return list of resource formats whose names contain a string

        Note: Maybe, should be changed to match only at the beginning?
        '''

        q = request.params.get('incomplete', '')
        q = str(q).lower()
        limit = request.params.get('limit', 12)

        context = {'model': model, 'session': model.Session}
        data_dict = {'q': q, 'limit': limit}

        toolkit.check_access('site_read', context, data_dict)

        # The result will be calculated as the merge of matches from 2 sources:
        #  * a static list of application-domain formats supplied at configuration time
        #  * a dynamic list of formats supplied for other resources: that's what CKAN's
        #    action `format_autocomplete` already does.

        results = []

        r1 = logic.get_action('format_autocomplete')(context, data_dict)
        results.extend(({'name': t, 'text': t.upper()} for t in r1))

        limit -= len(results)
        r2 = ifilter(lambda t: (not t in r1) and (t.find(q) >= 0),
                     resource_formats)
        r2 = islice(r2, 0, limit)
        results.extend(({'name': t, 'text': t.upper()} for t in r2))

        result_set = {'ResultSet': {'Result': results}}
        response.headers['Content-Type'] = content_types['json']
        return [to_json(result_set)]
    def upload_file(self, object_type):
        
        name = request.params.get('name', '') # prefix
        upload_name = name + '-upload' if name else 'upload'

        upload = request.params.get(upload_name)
        if not isinstance(upload, cgi.FieldStorage):
            abort(400, 'Expected a file upload')
        
        result = None
        if object_type == 'resources':
            abort(400, 'Cannot handle uploading of resources here')
        elif object_type == 'source-metadata':
            up = uploader.MetadataUpload(upload.filename)
            up.update_data_dict(dict(request.params), upload_name)
            up.upload(max_size=1)
        
            link = toolkit.url_for(
                controller='ckanext.publicamundi.controllers.files:Controller',
                action='download_file', 
                object_type=up.object_type,
                name_or_id=up.filename,
                filename=upload.filename)

            size = os.stat(u.filepath).st_size

            result = dict(name=u.filename, url=link, size=size)
        else:
            abort(404, 'Unknown object-type')

        response.headers['Content-Type'] = 'application/json'
        return [to_json(result)]
Example #3
0
    def get_field_markup_with_helper(self, id):
        x = getattr(fixtures, id)

        if request.method == 'POST':
            response.headers['Content-Type'] = 'application/json'
            out = {tuple(k.split('.')): v for k, v in request.params.items()}
            out = unflatten(out)
            return to_json(out)
        else:
            params = dict(request.params)

            k = params.pop('field', 'title')
            field = x.get_field(k)

            action = params.pop('action', 'edit')
            prefix = params.pop('prefix', id)

            extra_vars = copy.deepcopy(params)
            extra_vars.update({
                'helper': True,
                'field': field,
                'action': str(action),
                'name_prefix': str(prefix),
            })

            return render('tests/field.html', extra_vars=extra_vars)
 def get_field_markup_with_helper(self, id):
     x = getattr(fixtures, id)
    
     if request.method == 'POST':
         response.headers['Content-Type'] = 'application/json' 
         out = { tuple(k.split('.')): v for k, v in request.params.items() } 
         out = unflatten(out)
         return to_json(out)
     else:
         params = dict(request.params)
         
         k = params.pop('field', 'title')
         field = x.get_field(k)
         
         action = params.pop('action', 'edit')
         prefix = params.pop('prefix', id)
         
         extra_vars = copy.deepcopy(params) 
         extra_vars.update({
             'helper': True,
             'field': field,
             'action': str(action),
             'name_prefix': str(prefix),
         })
         
         return render('tests/field.html', extra_vars=extra_vars)
Example #5
0
    def mock_handle_upload(self):
        '''Mocks a upload handler.
        Returns a JSON dict that describes a successfully uploaded file.
        '''

        field_name = request.params.get('name')
        upload = request.params.get(field_name +
                                    '-upload') if field_name else 'upload'
        if not isinstance(upload, FieldStorage):
            abort(400, 'Expected a file upload')

        name = datetime.datetime.now().strftime('%s') + '-' + upload.filename
        l = toolkit.url_for(
            controller='ckanext.publicamundi.controllers.files:Controller',
            action='download_file',
            object_type='baz',
            name_or_id=name,
            filename=upload.filename)

        n = random.randint(1000, 9999)

        result = dict(name=name, url=l, size=n)
        response.headers['Content-Type'] = content_types['json']

        return [to_json(result)]
Example #6
0
    def resource_format_autocomplete(self):
        '''Return list of resource formats whose names contain a string

        Note: Maybe, should be changed to match only at the beginning?
        '''
         
        q = request.params.get('incomplete', '')
        q = str(q).lower()
        limit  = request.params.get('limit', 12)
        
        context = { 'model': model, 'session': model.Session }
        data_dict = { 'q': q, 'limit': limit }
        
        toolkit.check_access('site_read', context, data_dict)
        
        # The result will be calculated as the merge of matches from 2 sources:
        #  * a static list of application-domain formats supplied at configuration time 
        #  * a dynamic list of formats supplied for other resources: that's what CKAN's 
        #    action `format_autocomplete` already does.

        results = []
        
        r1 = logic.get_action('format_autocomplete')(context, data_dict)
        results.extend(({ 'name': t, 'text': t.upper() } for t in r1))

        limit -= len(results)
        r2 = ifilter(lambda t: (not t in r1) and (t.find(q) >= 0), resource_formats)
        r2 = islice(r2, 0, limit)
        results.extend(({ 'name': t, 'text': t.upper() } for t in r2))
   
        result_set = { 'ResultSet': { 'Result': results } } 
        response.headers['Content-Type'] = content_types['json']
        return [to_json(result_set)]
Example #7
0
    def upload_file(self, object_type):
        
        name = request.params.get('name', '') # prefix
        upload_name = name + '-upload' if name else 'upload'

        upload = request.params.get(upload_name)
        if not isinstance(upload, cgi.FieldStorage):
            abort(400, 'Expected a file upload')
        
        result = None
        if object_type == 'resources':
            abort(400, 'Cannot handle uploading of resources here')
        elif object_type == 'source-metadata':
            up = uploader.MetadataUpload(upload.filename)
            up.update_data_dict(dict(request.params), upload_name)
            up.upload(max_size=1)
        
            link = toolkit.url_for(
                controller='ckanext.publicamundi.controllers.files:Controller',
                action='download_file', 
                object_type=up.object_type,
                name_or_id=up.filename,
                filename=upload.filename)

            size = os.stat(u.filepath).st_size

            result = dict(name=u.filename, url=link, size=size)
        else:
            abort(404, 'Unknown object-type')

        response.headers['Content-Type'] = 'application/json'
        return [to_json(result)]
Example #8
0
 def vocabulary_get(self, name):
     name = str(name)
     r = None
     
     vocab = vocabularies.by_name(name) 
     if vocab:
         r = {
             'date_type': vocab.get('date_type'),
             'reference_date': vocab.get('reference_date'),
             'title': vocab.get('title'),
             'name': vocab.get('name'),
             'terms': [{'token': t.token, 'value': t.value, 'title': t.title} 
                 for t in vocab['vocabulary']],
         }
     
     response.headers['Content-Type'] = content_types['json']
     return [to_json(r)]
Example #9
0
 def vocabulary_get(self, name):
     name = str(name)
     r = None
     
     vocab = vocabularies.by_name(name) 
     if vocab:
         r = {
             'date_type': vocab.get('date_type'),
             'reference_date': vocab.get('reference_date'),
             'title': vocab.get('title'),
             'name': vocab.get('name'),
             'terms': [{'token': t.token, 'value': t.value, 'title': t.title} 
                 for t in vocab['vocabulary']],
         }
     
     response.headers['Content-Type'] = content_types['json']
     return [to_json(r)]
Example #10
0
 def vocabulary_get(self, name):
     name = str(name)
     r = None
     
     vocab = vocabularies.get_by_name(name)
     if vocab:
         terms = vocab['vocabulary'].by_value
         r = {
             'date_type': vocab.get('date_type'),
             'reference_date': vocab.get('reference_date'),
             'title': vocab.get('title'),
             'name': vocab.get('name'),
             'terms': [{ 'value': k, 'title': terms[k].title } for k in terms],
         }
             
     response.headers['Content-Type'] = content_types['json']
     return [to_json(r)]
Example #11
0
    def resource_mimetype_autocomplete(self):
        '''Return list of mime types whose names contain a string
        '''

        q = request.params.get('incomplete', '')
        q = str(q).lower()
        limit = request.params.get('limit', 12)

        context = self._make_context()
        data_dict = {'q': q, 'limit': limit}

        # Invoke the action we have registered via IActions
        r = logic.get_action('mimetype_autocomplete')(context, data_dict)

        result_set = {'ResultSet': {'Result': [{'name': t} for t in r]}}

        response.headers['Content-Type'] = content_types['json']
        return [to_json(result_set)]
Example #12
0
    def edit_foo(self, id='foo1'):
        '''Grab a Foo fixture and present an edit form 
        '''

        obj = getattr(fixtures, id)
        assert isinstance(obj, types.FooMetadata)

        errors = obj.validate(dictize_errors=True)

        # Examine POSTed data
        if request.method == 'POST':
            # Parse request, filter-out empty values
            d = dict(filter(lambda t: t[1], request.params.items()))
            # Create a factory for this
            factory = Object.Factory(schemata.IFooMetadata,
                                     opts={
                                         'unserialize-keys': True,
                                         'unserialize-values': True,
                                     })
            obj = factory(d, is_flat=True)
            errors = obj.validate()
            if not errors:
                # Output a JSON dump of a valid object
                response.headers['Content-Type'] = 'application/json'
                out = {'status': 'success', 'obj': obj.to_dict()}
                return to_json(out)
            else:
                # Prepare error dict for display
                errors = obj.dictize_errors(errors)
                #response.headers['Content-Type'] = 'application/json'
                #out = { 'status': 'failure', 'errors': errors, 'obj': obj.to_dict() }
                #return to_json(out)

        # Display form
        c.form_class = 'form-horizontal'
        c.form_errors = errors
        c.form_markup = markup_for_object('edit:datasetform',
                                          obj,
                                          errors=errors,
                                          name_prefix='',
                                          data={'title': u'Foo %s' % (id)})
        return render('tests/form.html')
 def get_field_markup(self, id):
     x = getattr(fixtures, id)
    
     if request.method == 'POST':
         response.headers['Content-Type'] = 'application/json' 
         out = { tuple(k.split('.')): v for k, v in request.params.items() } 
         out = unflatten(out)
         return to_json(out)
     else:
         params = dict(request.params)
         k = params.pop('field', 'title')
         action = params.pop('action', 'edit')
         prefix = params.pop('prefix', id)
         
         field = x.get_field(k)
         field_markup = markup_for_field(str(action),
             field, name_prefix=str(prefix), errors=None, data=params)
         
         return render('tests/field.html', extra_vars={ 
             'field_markup': field_markup })
    def edit_foo(self, id='foo1'):
        '''Grab a Foo fixture and present an edit form 
        '''

        obj = getattr(fixtures, id)
        assert isinstance(obj, types.FooMetadata)
        
        errors = obj.validate(dictize_errors=True)

        # Examine POSTed data
        if request.method == 'POST':
            # Parse request, filter-out empty values
            d = dict(filter(lambda t: t[1], request.params.items()))
            # Create a factory for this 
            factory = Object.Factory(schemata.IFooMetadata, opts={
                'unserialize-keys': True,
                'unserialize-values': True,
            })
            obj = factory(d, is_flat=True)
            errors = obj.validate()
            if not errors:
                # Output a JSON dump of a valid object
                response.headers['Content-Type'] = 'application/json' 
                out = { 'status': 'success', 'obj': obj.to_dict() } 
                return to_json(out)
            else:
                # Prepare error dict for display
                errors = obj.dictize_errors(errors)
                #response.headers['Content-Type'] = 'application/json' 
                #out = { 'status': 'failure', 'errors': errors, 'obj': obj.to_dict() } 
                #return to_json(out)

        # Display form
        c.form_class = 'form-horizontal'
        c.form_errors = errors
        c.form_markup = markup_for_object('edit:datasetform', obj, 
            errors = errors,
            name_prefix = '', 
            data = { 'title': u'Foo %s' % (id) }
        )
        return render('tests/form.html')
Example #15
0
    def resource_mimetype_autocomplete(self):
        '''Return list of mime types whose names contain a string
        '''
        
        q = request.params.get('incomplete', '')
        q = str(q).lower()
        limit  = request.params.get('limit', 12)

        context = self._make_context()
        data_dict = { 'q': q, 'limit': limit }

        # Invoke the action we have registered via IActions 
        r = logic.get_action('mimetype_autocomplete')(context, data_dict)

        result_set = {
            'ResultSet': {
                'Result': [{'name': t } for t in r]
            }
        }

        response.headers['Content-Type'] = content_types['json']
        return [to_json(result_set)]
Example #16
0
    def report_params(self):
        result = {}
        for k, f in request.params.items():
            if isinstance(f, FieldStorage) and hasattr(f, 'file'):
                fp, mimetype, filename, name = f.file, f.type, f.filename, f.name
                # Compute size
                fp.seek(0, 2)  # move fp to the end
                size = fp.tell()
                fp.seek(0, 0)  # reset fp
                # Report
                result[k] = {
                    'name': name,
                    'filename': filename,
                    'mimetype': mimetype,
                    'size': size,
                    'sample': fp.read(128).decode('utf-8') \
                        if mimetype.startswith('text/') else '<binary-data>'
                }
            else:
                result[k] = f

        response.headers['Content-Type'] = content_types['json']
        return [to_json(result)]
 def report_params(self):
     result = {}
     for k, f in request.params.items():
         if isinstance(f, FieldStorage) and hasattr(f, 'file'):
             fp, mimetype, filename, name = f.file, f.type, f.filename, f.name
             # Compute size
             fp.seek(0, 2) # move fp to the end
             size = fp.tell()
             fp.seek(0, 0) # reset fp
             # Report
             result[k] = {
                 'name': name,
                 'filename': filename,
                 'mimetype': mimetype,
                 'size': size,
                 'sample': fp.read(128).decode('utf-8') \
                     if mimetype.startswith('text/') else '<binary-data>'
             }
         else:
             result[k] = f
     
     response.headers['Content-Type'] = content_types['json']
     return [to_json(result)]
Example #18
0
    def get_field_markup(self, id):
        x = getattr(fixtures, id)

        if request.method == 'POST':
            response.headers['Content-Type'] = 'application/json'
            out = {tuple(k.split('.')): v for k, v in request.params.items()}
            out = unflatten(out)
            return to_json(out)
        else:
            params = dict(request.params)
            k = params.pop('field', 'title')
            action = params.pop('action', 'edit')
            prefix = params.pop('prefix', id)

            field = x.get_field(k)
            field_markup = markup_for_field(str(action),
                                            field,
                                            name_prefix=str(prefix),
                                            errors=None,
                                            data=params)

            return render('tests/field.html',
                          extra_vars={'field_markup': field_markup})
    def mock_handle_upload(self):
        '''Mocks a upload handler.
        Returns a JSON dict that describes a successfully uploaded file.
        '''
        
        field_name = request.params.get('name')
        upload = request.params.get(field_name + '-upload') if field_name else 'upload'
        if not isinstance(upload, FieldStorage):
            abort(400, 'Expected a file upload')
        
        name = datetime.datetime.now().strftime('%s') + '-' + upload.filename
        l = toolkit.url_for(
            controller = 'ckanext.publicamundi.controllers.files:Controller',
            action = 'download_file',
            object_type = 'baz', 
            name_or_id = name,
            filename = upload.filename)
        
        n = random.randint(1000, 9999) 

        result = dict(name=name, url=l, size=n)
        response.headers['Content-Type'] = content_types['json']
        
        return [to_json(result)]