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 update_volume(short_name, volume_id): """Update a volume.""" category = project_repo.get_category_by(short_name=short_name) if not category: # pragma: no cover abort(404) ensure_authorized_to('update', category) volumes = category.info.get('volumes', []) try: volume = [v for v in volumes if v['id'] == volume_id][0] except IndexError: abort(404) form = VolumeForm(**volume) form.category_id.data = category.id all_importers = importer.get_all_importer_names() form.importer.choices = [(name, name) for name in all_importers] upload_form = AvatarUploadForm() import_form = GenericBulkTaskImportForm()(volume['importer'], **volume.get('data', {})) def update(): """Helper function to update the current volume.""" try: idx = [ i for i, _vol in enumerate(volumes) if _vol['id'] == volume_id ][0] except IndexError: # pragma: no cover abort(404) volumes[idx] = volume category.info['volumes'] = volumes project_repo.update_category(category) cat_projects = project_repo.filter_by(category_id=category.id) has_projects = len( [p for p in cat_projects if p.info.get('volume_id') == volume_id]) > 0 if request.method == 'POST': # Process task import form if (request.form.get('btn') == 'Import' or request.body.get('btn') == 'Import'): import_form = GenericBulkTaskImportForm()(volume['importer'], request.body) if import_form.validate(): if has_projects: flash('Update failed as projects have already been built', 'error') else: volume['data'] = import_form.get_import_data() import_data = import_form.get_import_data() try: importer.count_tasks_to_import(**import_data) update() flash('Volume updated', 'success') except BulkImportException as err: flash(err.message, 'error') else: flash('Please correct the errors', 'error') # Process volume details form elif request.form.get('btn') != 'Upload': form = VolumeForm(request.body) all_importers = importer.get_all_importer_names() form.importer.choices = [(name, name) for name in all_importers] if form.validate(): if has_projects: flash('Update failed as projects have already been built', 'error') else: volume['name'] = form.name.data volume['short_name'] = form.short_name.data volume['importer'] = form.importer.data update() flash('Volume updated', 'success') else: flash('Please correct the errors', 'error') # Process thumbnail upload form else: if upload_form.validate_on_submit(): _file = request.files['avatar'] coordinates = (upload_form.x1.data, upload_form.y1.data, upload_form.x2.data, upload_form.y2.data) suffix = time.time() _file.filename = "volume_{0}_{1}.png".format( volume['id'], suffix) container = "category_{}".format(category.id) uploader.upload_file(_file, container=container, coordinates=coordinates) # Delete previous thumbnail from storage if volume.get('thumbnail'): uploader.delete_file(volume['thumbnail'], container) volume['thumbnail'] = _file.filename volume['container'] = container upload_method = current_app.config.get('UPLOAD_METHOD') thumbnail_url = get_avatar_url(upload_method, _file.filename, container) volume['thumbnail_url'] = thumbnail_url update() project_repo.save_category(category) flash('Thumbnail updated', 'success') url = url_for('.get_volumes', short_name=category.short_name) return redirect_content_type(url) else: flash('You must provide a file', 'error') response = dict(form=form, all_importers=all_importers, upload_form=upload_form, import_form=import_form, volume=volume, has_projects=has_projects) return handle_content_type(response)