def analyse(): """Trigger analysis for a result or set of results.""" if request.method == 'GET': return respond('The analysis endpoint is listening...') payload = request.json or {} short_name = payload.get('project_short_name') project = project_repo.get_by_shortname(short_name) if not project: # pragma: no cover abort(404) category = project_repo.get_category(project.category_id) presenter = category.info.get('presenter') valid_presenters = ['z3950', 'iiif-annotation'] if not presenter or presenter not in valid_presenters: abort(400, 'Invalid task presenter') # Analyse all or empty if payload.get('all') or payload.get('empty'): ensure_authorized_to('update', project) if payload.get('all'): analyse_all(project.id, presenter) elif payload.get('empty'): analyse_empty(project.id, presenter) return respond('OK') # Analyse single if payload.get('event') != 'task_completed': abort(400) result_id = payload['result_id'] analyse_single(result_id, presenter) return respond('OK')
def del_category(id): """Delete a category.""" try: category = project_repo.get_category(id) if category: if len(cached_cat.get_all()) > 1: ensure_authorized_to('delete', category) if request.method == 'GET': response = dict(template='admin/del_category.html', title=gettext('Delete Category'), category=category, form=dict(csrf=generate_csrf())) return handle_content_type(response) if request.method == 'POST': project_repo.delete_category(category) msg = gettext("Category deleted") flash(msg, 'success') cached_cat.reset() return redirect_content_type(url_for(".categories")) else: msg = gettext('Sorry, it is not possible to delete the only' ' available category. You can modify it, ' ' click the edit button') flash(msg, 'warning') return redirect_content_type(url_for('.categories')) else: abort(404) except HTTPException: raise except Exception as e: # pragma: no cover current_app.logger.error(e) return abort(500)
def del_category(id): """Deletes a category""" try: category = project_repo.get_category(id) if category: if len(cached_cat.get_all()) > 1: require.category.delete(category) if request.method == 'GET': return render_template('admin/del_category.html', title=gettext('Delete Category'), category=category) if request.method == 'POST': project_repo.delete_category(category) msg = gettext("Category deleted") flash(msg, 'success') cached_cat.reset() return redirect(url_for(".categories")) else: msg = gettext('Sorry, it is not possible to delete the only \ available category. You can modify it, click the \ edit button') flash(msg, 'warning') return redirect(url_for('.categories')) else: abort(404) except HTTPException: raise except Exception as e: # pragma: no cover current_app.logger.error(e) return abort(500)
def del_category(id): """Delete a category.""" try: category = project_repo.get_category(id) if category: if len(cached_cat.get_all()) > 1: ensure_authorized_to('delete', category) if request.method == 'GET': return render_template('admin/del_category.html', title=gettext('Delete Category'), category=category) if request.method == 'POST': project_repo.delete_category(category) msg = gettext("Category deleted") flash(msg, 'success') cached_cat.reset() return redirect(url_for(".categories")) else: msg = gettext('Sorry, it is not possible to delete the only' ' available category. You can modify it, ' ' click the edit button') flash(msg, 'warning') return redirect(url_for('.categories')) else: abort(404) except HTTPException: raise except Exception as e: # pragma: no cover current_app.logger.error(e) return abort(500)
def category_comments(self, category_id): """Embed Discourse comments for a particular category.""" category = project_repo.get_category(category_id) if not category: abort(404) embed_url = url_for('project.project_cat_index', category=category.short_name, _external=True) return self._comment_feed_markup(embed_url)
def _get_result_collection(self, project_id): """Return a ResultCollection for the category.""" from pybossa.core import project_repo project = project_repo.get(project_id) category = project_repo.get_category(project.category_id) try: iri = category.info.get('annotations', {})['results'] except (TypeError, KeyError): err_msg = 'AnnotationCollection not setup for the category' raise BulkImportException(err_msg) return ResultCollection(iri)
def __call__(self, form, form_field): category_id = int(form.category_id.data) vol_id = form.id.data category = project_repo.get_category(category_id) volumes = category.info.get('volumes', []) exists = [ vol for vol in volumes if vol.get(self.field_name) and vol[self.field_name] == form_field.data and (not vol_id or vol_id != vol['id']) ] if exists: raise ValidationError(self.message)
def _sync_category(self, category_id, payload): category_syncer = CategorySyncer(self.target_url, self.target_key) category = project_repo.get_category(category_id) target_category = category_syncer.get_target(name=category.name) if target_category: payload['category_id'] = target_category['id'] else: res = category_syncer.sync(category) if res.ok: data = json.loads(res.content) payload['category_id'] = data['id'] return payload
def get_project_category(category_id): """Returns the project category instance with the specified identifier. Args: category_id (int): A project category's unique identifier. Raises: TypeError: If the 'category_id' argument is not an integer. Returns: pybossa.model.category.Category: A project category object with the specified identifier. """ if not isinstance(category_id, int): raise TypeError("get_project_category expects 'int' but got '{}'.".format(type(category_id).__name__)) from pybossa.core import project_repo return project_repo.get_category(category_id)
def analyse_empty_results(category_id): """Analyse empty results for a category.""" category = project_repo.get_category(category_id) if not category: abort(404) if request.method == 'POST': presenter = category.info.get('presenter') projects = project_repo.filter_by(category_id=category.id) for project in projects: analyse_empty(project.id, presenter) flash('Analysis of empty results queued', 'success') csrf = None else: csrf = generate_csrf() response = dict(csrf=csrf) return handle_content_type(response)
def update_category(id): """Update a category.""" try: category = project_repo.get_category(id) if category: ensure_authorized_to('update', category) form = CategoryForm(obj=category) form.populate_obj(category) if request.method == 'GET': response = dict(template='admin/update_category.html', title=gettext('Update Category'), category=category, form=form) return handle_content_type(response) if request.method == 'POST': form = CategoryForm(request.body) if form.validate(): slug = form.name.data.lower().replace(" ", "") new_category = Category(id=form.id.data, name=form.name.data, short_name=slug) project_repo.update_category(new_category) cached_cat.reset() msg = gettext("Category updated") flash(msg, 'success') return redirect_content_type(url_for(".categories")) else: msg = gettext("Please correct the errors") flash(msg, 'success') response = dict(template='admin/update_category.html', title=gettext('Update Category'), category=category, form=form) return handle_content_type(response) else: abort(404) except HTTPException: raise except Exception as e: # pragma: no cover current_app.logger.error(e) return abort(500)