def upload_project(): def add_flash(pid, msg): flash(msg) return redirect(url_for('add_project', pid=pid)) user = get_user() if not is_admin(user): return redirect(url_for('front')) pid = request.form['pid'] if pid: pid = int(pid) project = Project.get(Project.id == pid) if not is_admin(user, project): return redirect(url_for('front')) update_audit(project) else: pid = None project = Project() project.feature_count = 0 project.bbox = '' project.owner = user project.name = request.form['name'].strip() if not project.name: return add_flash(pid, 'Empty name - bad') project.title = request.form['title'].strip() if not project.title: return add_flash(pid, 'Empty title - bad') project.url = request.form['url'].strip() if not project.url: project.url = None project.description = request.form['description'].strip() project.can_validate = request.form.get('validate') is not None project.validate_modified = request.form.get('validate_modified') is not None project.hidden = request.form.get('is_hidden') is not None if 'json' not in request.files or request.files['json'].filename == '': if not pid: return add_flash(pid, 'Would not create a project without features') features = [] else: try: features = json.load(codecs.getreader('utf-8')(request.files['json'])) except ValueError as e: return add_flash(pid, 'Error in the uploaded features file: {}'.format(e)) if 'features' not in features or not features['features']: return add_flash(pid, 'No features found in the JSON file') features = features['features'] audit = None if 'audit' in request.files and request.files['audit'].filename: try: audit = json.load(codecs.getreader('utf-8')(request.files['audit'])) except ValueError as e: return add_flash(pid, 'Error in the uploaded audit file: {}'.format(e)) if not audit: return add_flash(pid, 'No features found in the audit JSON file') proj_audit = json.loads(project.audit or '{}') if audit: proj_audit.update(audit) project.audit = json.dumps(proj_audit, ensure_ascii=False) if features or audit or not project.updated: project.updated = datetime.datetime.utcnow().date() project.save() if features: with database.atomic(): update_features(project, features, proj_audit) if project.feature_count == 0: project.delete_instance() return add_flash('Zero features in the JSON file') return redirect(url_for('project', name=project.name))