Example #1
0
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))
Example #2
0
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()