def del_category(id): """Deletes a category""" try: category = db.session.query(model.Category).get(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': db.session.delete(category) db.session.commit() 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: return abort(404) except HTTPException: return abort(403) except Exception as e: 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 del_category(id): """Deletes a category""" try: category = db.session.query(model.Category).get(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=lazy_gettext('Delete Category'), category=category) if request.method == 'POST': db.session.delete(category) db.session.commit() msg = lazy_gettext("Category deleted") flash(msg, 'success') cached_cat.reset() return redirect(url_for(".categories")) else: msg = lazy_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: return abort(404) except HTTPException: return abort(403) except Exception as e: current_app.logger.error(e) return abort(500)
def categories(): """List Categories""" try: if request.method == 'GET': require.category.read() form = CategoryForm() if request.method == 'POST': require.category.create() form = CategoryForm(request.form) if form.validate(): slug = form.name.data.lower().replace(" ", "") category = model.category.Category(name=form.name.data, short_name=slug, description=form.description.data) db.session.add(category) db.session.commit() cached_cat.reset() msg = gettext("Category added") flash(msg, 'success') else: flash(gettext('Please correct the errors'), 'error') categories = cached_cat.get_all() n_apps_per_category = dict() for c in categories: n_apps_per_category[c.short_name] = cached_apps.n_count(c.short_name) return render_template('admin/categories.html', title=gettext('Categories'), categories=categories, n_apps_per_category=n_apps_per_category, form=form) 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': 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 handle_valid_form(form): hidden = int(form.hidden.data) new_info = {} # Add the info items app, n_tasks, n_task_runs, overall_progress, last_activity = app_by_shortname(short_name) if form.thumbnail.data: new_info['thumbnail'] = form.thumbnail.data #if form.sched.data: # new_info['sched'] = form.sched.data # Merge info object info = dict(app.info.items() + new_info.items()) new_application = model.App( id=form.id.data, name=form.name.data, short_name=form.short_name.data, description=form.description.data, long_description=form.long_description.data, hidden=hidden, info=info, owner_id=app.owner_id, allow_anonymous_contributors=form.allow_anonymous_contributors.data, category_id=form.category_id.data) app, n_tasks, n_task_runs, overall_progress, last_activity = app_by_shortname(short_name) db.session.merge(new_application) db.session.commit() cached_apps.reset() cached_cat.reset() flash(gettext('Application updated!'), 'success') return redirect(url_for('.details', short_name=new_application.short_name))
def categories(): """List Categories.""" try: if request.method == 'GET': ensure_authorized_to('read', Category) form = CategoryForm() if request.method == 'POST': ensure_authorized_to('create', Category) form = CategoryForm(request.form) del form.id if form.validate(): slug = form.name.data.lower().replace(" ", "") category = Category(name=form.name.data, short_name=slug, description=form.description.data) project_repo.save_category(category) cached_cat.reset() msg = gettext("Category added") flash(msg, 'success') else: flash(gettext('Please correct the errors'), 'error') categories = cached_cat.get_all() n_projects_per_category = dict() for c in categories: n_projects_per_category[c.short_name] = \ cached_projects.n_count(c.short_name) return render_template('admin/categories.html', title=gettext('Categories'), categories=categories, n_projects_per_category=n_projects_per_category, form=form) except Exception as e: # pragma: no cover current_app.logger.error(e) return abort(500)
def handle_valid_form(form): hidden = int(form.hidden.data) new_info = {} # Add the info items app = app_by_shortname(short_name) if form.thumbnail.data: new_info['thumbnail'] = form.thumbnail.data #if form.sched.data: # new_info['sched'] = form.sched.data # Merge info object info = dict(app.info.items() + new_info.items()) new_application = model.App( id=form.id.data, name=form.name.data, short_name=form.short_name.data, description=form.description.data, long_description=form.long_description.data, hidden=hidden, info=info, owner_id=app.owner_id, allow_anonymous_contributors=form.allow_anonymous_contributors.data, category_id=form.category_id.data) app = app_by_shortname(short_name) db.session.merge(new_application) db.session.commit() cached_apps.reset() cached_cat.reset() flash(gettext('Application updated!'), 'success') return redirect(url_for('.details', short_name=new_application.short_name))
def categories(): """List Categories""" try: if request.method == 'GET': require.category.read() form = CategoryForm() if request.method == 'POST': require.category.create() form = CategoryForm(request.form) if form.validate(): slug = form.name.data.lower().replace(" ", "") category = model.Category(name=form.name.data, short_name=slug, description=form.description.data) db.session.add(category) db.session.commit() cached_cat.reset() msg = gettext("Category added") flash(msg, 'success') else: flash(gettext('Please correct the errors'), 'error') categories = cached_cat.get_all() n_apps_per_category = dict() for c in categories: n_apps_per_category[c.short_name] = cached_apps.n_count( c.short_name) return render_template('admin/categories.html', title=gettext('Categories'), categories=categories, n_apps_per_category=n_apps_per_category, form=form) except Exception as e: # pragma: no cover current_app.logger.error(e) return abort(500)
def update_category(id): """Updates a category""" try: category = db.session.query(model.category.Category).get(id) if category: require.category.update(category) form = CategoryForm(obj=category) form.populate_obj(category) if request.method == 'GET': return render_template('admin/update_category.html', title=gettext('Update Category'), category=category, form=form) if request.method == 'POST': form = CategoryForm(request.form) if form.validate(): slug = form.name.data.lower().replace(" ", "") new_category = model.category.Category(id=form.id.data, name=form.name.data, short_name=slug) # print new_category.id db.session.merge(new_category) db.session.commit() cached_cat.reset() msg = gettext("Category updated") flash(msg, 'success') return redirect(url_for(".categories")) else: msg = gettext("Please correct the errors") flash(msg, 'success') return render_template('admin/update_category.html', title=gettext('Update Category'), category=category, form=form) else: abort(404) except HTTPException: raise except Exception as e: # pragma: no cover current_app.logger.error(e) return abort(500)
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)
def import_repo(short_name): """Import a project from a GitHub repo.""" project = project_repo.get_by_shortname(short_name) if not project: # pragma: no cover abort(404) ensure_authorized_to('update', project) github_url = request.args.get('github_url') try: gh_repo = GitHubRepo(github_url) except GitHubURLError as e: flash(str(e), 'error') return redirect(url_for('.sync', short_name=project.short_name)) gh_repo.load_contents() try: gh_repo.validate() except InvalidPybossaProjectError as e: flash(str(e), 'error') return redirect(url_for('.sync', short_name=project.short_name)) form = GitHubProjectForm(request.form) project_json = gh_repo.get_project_json() _populate_form(form, gh_repo.contents, project_json) categories = project_repo.get_all_categories() if request.method == 'POST' and form.validate(): info = json.loads(form.additional_properties.data) original_short_name = project_json['short_name'] if form.tutorial.data: resp = github.get(form.tutorial.data) info['tutorial'] = resp.content.replace(original_short_name, project.short_name) if form.task_presenter.data: resp = github.get(form.task_presenter.data) info['task_presenter'] = resp.content.replace(original_short_name, project.short_name) if form.results.data: resp = github.get(form.results.data) info['results'] = resp.content.replace(original_short_name, project.short_name) long_description = None if form.long_description.data: resp = github.get(form.long_description.data) long_description = resp.content old_project = Project(**project.dictize()) project.description = form.description.data project.long_description = long_description project.category_id = form.category_id.data project.webhook = form.webhook.data project.info = info if form.thumbnail.data: data = github.get(form.thumbnail.data).content prefix = time.time() filename = "project_%s_thumbnail_%i.png" % (project.id, prefix) container = "user_%s" % current_user.id _download(filename, container, data) if project.info.get("thumbnail"): uploader.delete_file(project.info["thumbnail"], container) project.info['container'] = container project.info['thumbnail'] = filename try: project_repo.update(project) except sqlalchemy.exc.DataError as e: # pragma: no cover flash('''DataError: {0} <br><br>Please check the files being imported from GitHub'''.format(e.orig), 'danger') return redirect(url_for('.sync', short_name=project.short_name)) auditlogger.add_log_entry(old_project, project, current_user) cached_cat.reset() cached_projects.get_project(project.short_name) flash(gettext('Project updated!'), 'success') return redirect(url_for('project.tasks', short_name=project.short_name)) elif request.method == 'POST': # pragma: no cover flash(gettext('Please correct the errors'), 'error') else: form.process() form.description.data = project_json.get('description', '') form.webhook.data = project_json.get('webhook', '') reserved_keys = ['name', 'short_name', 'description', 'webhook', 'category_id'] for k in reserved_keys: project_json.pop(k, None) form.additional_properties.data = json.dumps(project_json) return render_template('projects/github/import.html', form=form, github_url=github_url, project=project)