def post(self, request, *args, **kwargs): if not self.form.is_valid(): return self.get(request, *args, **kwargs) if not self.project.is_manager(request.user): return HttpResponseForbidden() hydrovakken_dir = directories.hydrovakken_dir(self.project) filename = request.FILES['shp'].name # Remove old hydrovakken for filename in os.listdir(hydrovakken_dir): filepath = os.path.join(hydrovakken_dir, filename) if os.path.isfile(filepath): os.remove(filepath) models.Hydrovak.objects.filter(project=self.project).delete() # Save uploaded files for ext in ['shp', 'dbf', 'shx']: uploaded_file = request.FILES[ext] with open( os.path.join(hydrovakken_dir, uploaded_file.name), 'wb+') as f: for chunk in uploaded_file.chunks(): f.write(chunk) datasource = DataSource( os.path.join(hydrovakken_dir, request.FILES['shp'].name)) id_field_name = configuration.get( self.project, 'hydrovakken_id_field') layer = datasource[0] for feature in layer: if id_field_name in feature.fields: # The shape can contain both LineStrings and # MultiLineStrings - to be able to save both we # convert them all to multis geom = fromstr(feature.geom.ewkt) if isinstance(geom, LineString): geom = MultiLineString(geom) hydrovak, created = models.Hydrovak.objects.get_or_create( project=self.project, br_ident=unicode(feature[id_field_name]), defaults={'the_geom': geom}) if not created: hydrovak.the_geom = geom hydrovak.save() else: logger.debug("id_field_name not present") logger.debug(feature.fields) return HttpResponseRedirect(reverse( 'lizard_progress_downloadhomeview', kwargs={ 'project_slug': self.project.slug}))
def get(self, request, filetype, project_slug, contractor_slug, filename): project = get_object_or_404(Project, slug=project_slug) if contractor_slug == 'x': contractor = None else: contractor = get_object_or_404(Contractor, slug=contractor_slug) if not has_access(request.user, project, contractor): return HttpResponseForbidden() if filetype == 'reports': directory = directories.reports_dir(project, contractor) elif filetype == 'results': directory = directories.reports_dir(project, contractor) elif filetype == 'locations': logger.debug("Looking for {0}".format(filename)) directory = directories.location_shapefile_dir(project, contractor) logger.debug("Trying in {0}".format(directory)) for path in directories.all_files_in(directory): logger.debug("... {0}".format(path)) if os.path.basename(path) == filename: directory = os.path.dirname(path) break else: raise http.Http404() elif filetype == 'organization': directory = directories.organization_files_dir( project.organization) elif filetype == 'hydrovakken': directory = directories.hydrovakken_dir(project) for path in directories.all_files_in(directory): if os.path.basename(path) == filename: directory = os.path.dirname(path) break else: raise http.Http404() elif filetype == 'contractor_hydrovakken': directory = directories.shapefile_dir(project, contractor) for path in directories.all_files_in(directory): if os.path.basename(path) == filename: directory = os.path.dirname(path) break else: raise http.Http404() else: return HttpResponseForbidden() path = os.path.join(directory, filename) if not os.path.exists(path): raise http.Http404() return serve(request, path, '/')
def _hydrovakken_files(self): if has_access(self.user, self.project): for path in directories.all_files_in( directories.hydrovakken_dir(self.project), extension=".shp"): yield { 'description': "Hydrovakken {project}".format(project=self.project), 'urls': { 'shp': self._make_url( 'hydrovakken', self.project, None, path), 'dbf': self._make_url( 'hydrovakken', self.project, None, path.replace('.shp', '.dbf')), 'shx': self._make_url( 'hydrovakken', self.project, None, path.replace('.shp', '.shx')) }}