def clear_skipped(pid): project = Project.get(Project.id == pid) user = get_user() if user: features = Feature.select().where(Feature.project == project) query = Task.delete().where( Task.user == user, Task.skipped == True, Task.feature.in_(features)) query.execute() return redirect(url_for('project', name=project.name))
def update_features(project, features, audit): curfeats = Feature.select(Feature).where(Feature.project == project) ref2feat = {f.ref: f for f in curfeats} deleted = set(ref2feat.keys()) minlat = minlon = 180.0 maxlat = maxlon = -180.0 for f in features: data = json.dumps(f, ensure_ascii=False, sort_keys=True) md5 = hashlib.md5() md5.update(data.encode('utf-8')) md5_hex = md5.hexdigest() coord = f['geometry']['coordinates'] if coord[0] < minlon: minlon = coord[0] if coord[0] > maxlon: maxlon = coord[0] if coord[1] < minlat: minlat = coord[1] if coord[1] > maxlat: maxlat = coord[1] if 'ref_id' in f['properties']: ref = f['properties']['ref_id'] else: ref = '{}{}'.format(f['properties']['osm_type'], f['properties']['osm_id']) update = False if ref in ref2feat: deleted.remove(ref) feat = ref2feat[ref] if feat.feature_md5 != md5_hex: update = True else: feat = Feature(project=project, ref=ref) feat.validates_count = 0 update = True f_audit = audit.get(ref) if f_audit: f_audit = json.dumps(f_audit, ensure_ascii=False, sort_keys=True) if f_audit != feat.audit: feat.audit = f_audit update = True if update: feat.feature = data feat.feature_md5 = md5_hex feat.lon = round(coord[0] * 1e7) feat.lat = round(coord[1] * 1e7) feat.action = f['properties']['action'][0] if feat.validates_count > 0: feat.validates_count = 0 Task.delete().where(Task.feature == feat).execute() feat.save() if deleted: q = Feature.delete().where(Feature.ref << list(deleted)) q.execute() project.bbox = ','.join([str(x) for x in (minlon, minlat, maxlon, maxlat)]) project.feature_count = Feature.select().where(Feature.project == project).count() project.save()