def challenge_create(request): if request.method == "POST": form = ChallengeForm(request.POST) if form.is_valid(): challenge = form.save(commit=False) challenge.user = request.user geometry = json.loads(challenge.geometry) multipolygon = MultiPolygon() for geo in geometry: coordinates = geo['geometry']['coordinates'][0] line_string = LineString() first_point = None for i in range(len(coordinates)): coord = coordinates[i] if i == 0: first_point = Point(coord[0], coord[1]) continue point = Point(coord[0], coord[1]) if i == 1: line_string = LineString(first_point.coords, point.coords) else: line_string.append(point.coords) polygon = Polygon(line_string.coords) multipolygon.append(polygon) challenge.multipolygon = multipolygon for geo in geometry: geo['properties']['challenge_id'] = str(challenge.unique_id) challenge.geometry = json.dumps(geometry) challenge.save() camera_make = form.cleaned_data['camera_make'] if not camera_make is None and len(camera_make) > 0: for cm in camera_make: challenge.camera_make.add(cm) transport_type = form.cleaned_data['transport_type'] if not transport_type is None: challenge.transport_type.clear() if len(transport_type) > 0: for transport_t in transport_type: challenge.transport_type.add(transport_t) messages.success(request, 'A challenge was created successfully.') return redirect('challenge.my_challenge_list') else: form = ChallengeForm() content = { 'form': form, 'pageName': 'Create Challenge', 'pageTitle': 'Create Challenge' } return render(request, 'challenge/capture/create.html', content)
def challenge_edit(request, unique_id): challenge = get_object_or_404(Challenge, unique_id=unique_id) if request.method == "POST": form = ChallengeForm(request.POST, instance=challenge) if form.is_valid(): challenge = form.save(commit=False) challenge.user = request.user challenge.updated_at = datetime.now() challenge.save() geometry = json.loads(challenge.geometry) multipoly = MultiPolygon() for geo in geometry: coordinates = geo['geometry']['coordinates'][0] lineString = LineString() firstPoint = None for i in range(len(coordinates)): coor = coordinates[i] if i == 0: firstPoint = Point(coor[0], coor[1]) continue point = Point(coor[0], coor[1]) if i == 1: lineString = LineString(firstPoint.coords, point.coords) else: lineString.append(point.coords) polygon = Polygon(lineString.coords) multipoly.append(polygon) challenge.multipolygon = multipoly for geo in geometry: geo['properties']['challenge_id'] = str(challenge.unique_id) challenge.geometry = json.dumps(geometry) challenge.save() transport_type = form.cleaned_data['transport_type'] if not transport_type is None: challenge.transport_type.add(transport_type) messages.success( request, 'Challenge "%s" is updated successfully.' % challenge.name) return redirect('challenge.index') else: form = ChallengeForm(instance=challenge) content = { 'form': form, 'pageName': 'Edit Challenge', 'challenge': challenge, 'pageTitle': challenge.name + ' - Edit Challenge' } return render(request, 'challenge/edit.html', content)
def photographer_edit(request, unique_id): photographer = get_object_or_404(Photographer, unique_id=unique_id) if request.method == "POST": form = PhotographerForm(request.POST, instance=photographer) if form.is_valid(): photographer = form.save(commit=False) photographer.user = request.user photographer.updated_at = datetime.now() photographer.save() geometry = json.loads(photographer.geometry) multipoly = MultiPolygon() for geo in geometry: coordinates = geo['geometry']['coordinates'][0] lineString = LineString() firstPoint = None for i in range(len(coordinates)): coor = coordinates[i] if i == 0: firstPoint = Point(coor[0], coor[1]) continue point = Point(coor[0], coor[1]) if i == 1: lineString = LineString(firstPoint.coords, point.coords) else: lineString.append(point.coords) polygon = Polygon(lineString.coords) multipoly.append(polygon) photographer.multipolygon = multipoly for geo in geometry: geo['properties']['photographer_id'] = str( photographer.unique_id) photographer.geometry = json.dumps(geometry) photographer.save() messages.success( request, 'Photographer "%s" is updated successfully.' % photographer.name) return redirect('photographer.index') else: form = PhotographerForm(instance=photographer) content = { 'form': form, 'pageName': 'Edit Photographer', 'photographer': photographer, 'pageTitle': photographer.name + ' - Edit Photographer' } return render(request, 'photographer/edit.html', content)
def photographer_create(request): if request.method == "POST": form = PhotographerForm(request.POST) if form.is_valid(): photographer = form.save(commit=False) photographer.user = request.user geometry = json.loads(photographer.geometry) multipoly = MultiPolygon() for geo in geometry: coordinates = geo['geometry']['coordinates'][0] lineString = LineString() firstPoint = None for i in range(len(coordinates)): coor = coordinates[i] if i == 0: firstPoint = Point(coor[0], coor[1]) continue point = Point(coor[0], coor[1]) if i == 1: lineString = LineString(firstPoint.coords, point.coords) else: lineString.append(point.coords) polygon = Polygon(lineString.coords) multipoly.append(polygon) photographer.multipolygon = multipoly for geo in geometry: geo['properties']['photographer_id'] = str( photographer.unique_id) photographer.geometry = json.dumps(geometry) photographer.save() messages.success(request, 'A photographer was created successfully.') return redirect('photographer.my_photographer_list') else: form = PhotographerForm() content = { 'form': form, 'pageName': 'Create Photographer', 'pageTitle': 'Create Photographer' } return render(request, 'photographer/create.html', content)
def photographer_create(request): if request.method == "POST": form = PhotographerForm(request.POST) if form.is_valid(): photographer = form.save(commit=False) photographer.user = request.user geometry = json.loads(photographer.geometry) multipolygon = MultiPolygon() for geo in geometry: coordinates = geo['geometry']['coordinates'][0] lineString = LineString() firstPoint = None for i in range(len(coordinates)): coor = coordinates[i] if i == 0: firstPoint = Point(coor[0], coor[1]) continue point = Point(coor[0], coor[1]) if i == 1: lineString = LineString(firstPoint.coords, point.coords) else: lineString.append(point.coords) polygon = Polygon(lineString.coords) multipolygon.append(polygon) photographer.multipolygon = multipolygon for geo in geometry: geo['properties']['photographer_id'] = str( photographer.unique_id) photographer.geometry = json.dumps(geometry) photographer.save() capture_types = form.cleaned_data['capture_type'] capture_method = form.cleaned_data['capture_method'] image_quality = form.cleaned_data['image_quality'] if capture_types is not None: photographer.capture_type.clear() for capture_type in capture_types: photographer.capture_type.add(capture_type) if capture_method is not None: photographer.capture_method.clear() for capture_m in capture_method: photographer.capture_method.add(capture_m) if image_quality is not None: photographer.image_quality.clear() for image_q in image_quality: photographer.image_quality.add(image_q) messages.success(request, 'A photographer was created successfully.') return redirect('photographer.index') else: form = PhotographerForm() content = { 'form': form, 'pageName': 'Create Photographer', 'pageTitle': 'Create Photographer' } return render(request, 'photographer/create.html', content)
def upload_estimated_data(request): global progress_update try: filepath_estimated = request.FILES['estimated_data_file'] filepath_region = request.FILES['region_metadata_file'] except Exception as err: return Estimated_value.objects.all().delete() Estimated_data.objects.all().delete() Region.objects.all().delete() file_regions = TextIOWrapper(filepath_region.file, encoding=request.encoding) reader = csv.reader(file_regions) # skip/get the headers field_titles = next(reader, None) #print('field titles:', field_titles) progress_update.progress_json = {'percent_complete': None, 'status': 'Loading estimates', 'sub_status': 'Loading regions metadata file'} try: for row in reader: try: extra_data = {} for idx, item in enumerate(field_titles[2:]): extra_data[item] = row[idx + 2] # Initialise polys multipoly_geo = MultiPolygon() poly = () # Split the row poly_split = row[1].split(' ')[1:] # make first_point point_split = poly_split[0].strip().split(',') try: first_point = (float(point_split[0]), float(point_split[1])) except: continue start = True for point_str in poly_split: point_split = point_str.strip().split(',') point = (float(point_split[0]), float(point_split[1])) poly = poly + (point,) if start != True and point == first_point: # Restart as enclosed circle found # Make an enclosed circle poly_geo = Polygon(poly) multipoly_geo.append(poly_geo) poly = () start = True else: start = False region = Region(region_id=str(row[0]), geom=multipoly_geo, extra_data=extra_data ) #print("Saving a region") region.save() except Exception as err1: print('Region file error. ', err1) #print('Region file error. Row: ', row[0]) continue except Exception as err: print('Error reading regions file:', err) return progress_update.progress_json = {'percent_complete': None, 'status': 'Loading estimates', 'sub_status': 'Loading estimates data file'} file_estimates = TextIOWrapper(filepath_estimated.file, encoding=request.encoding) reader = csv.reader(file_estimates) # Count the rows row_count = len(list(reader)) - 1 # Go back to start of file (both lines required!) file_estimates.seek(0) reader = csv.reader(file_estimates) # skip/get the headers field_titles = next(reader, None) value_idxs = [] extra_field_idxs = [] timestamp_idx = 0 region_idx = '' # Find the fields in the file for idx, title in enumerate(field_titles): title = title.strip().lower() if title.startswith('val_'): value_idxs.append(idx) elif (title == 'time_stamp') or (title == 'timestamp'): timestamp_idx = idx elif (title == 'region') or (title=='region_id'): region_idx = idx elif title.startswith('extra_'): extra_field_idxs.append(idx) extra_data_idxs = {} for extra_idx in extra_field_idxs: # 'extra_rings_Platanus_max' field_name = field_titles[extra_idx].replace('extra_', '', 1) # 'rings_Platanus_max' extra_data_field = field_name.split('_')[0] # 'rings' measurement_name = slugify(field_name.replace(extra_data_field + '_', '', 1), lowercase=True, separator='_') # 'Platanus_max' if measurement_name not in extra_data_idxs: extra_data_idxs[measurement_name] = {} extra_data_idxs[measurement_name][extra_data_field] = extra_idx try: line_no = 0 for row in reader: line_no += 1 progress_update.progress_json = {'percent_complete': (line_no / row_count) * 100, 'status': 'Loading estimates', 'sub_status': 'Loading estimates data file'} try: region = Region.objects.get(region_id=str(row[region_idx])) if region: estimated = Estimated_data( timestamp=slugify(row[timestamp_idx]), region=region ) estimated.save() for idx in value_idxs: name = slugify(field_titles[idx].replace('val_', '', 1), lowercase=True, separator='_') # Get extra data fields extra_data = {} try: extra_idxs = extra_data_idxs[name] for extra_data_name, extra_data_idx in extra_idxs.items(): extra_data[extra_data_name] = row[extra_data_idx] except: pass # Check that the name has a matching site measurement # and add to model if it has. #if name in site_measurements: try: fvalue = float(row[idx]) except: fvalue = None actual_value = Estimated_value( measurement_name=name, value = fvalue, estimated_data = estimated, extra_data=extra_data, ) actual_value.save() except Exception as err: print('Estimate file error: ', err, 'Region_ID:' + str(row[1])) continue except Exception as err: print('Error reading estimated file:', err) return default_storage.save(filepath_region.name, filepath_region.file) default_storage.save(filepath_estimated.name, filepath_estimated.file)