def upload_readme(request, item_id, slug): """ Allow the user to add a readme to a dataset. Arguments: request -- the request item_id -- the id for the dataset the 'readme' is to be attached to slug -- the slug for the dataset the 'readme' is to be attached to """ dataset = get_object_or_404(DataSet, pk=item_id) user = request.user if user != dataset.creator or dataset.is_active: return HttpResponseRedirect( reverse('epic.datasets.views.view_dataset', kwargs={'item_id':dataset.id, 'slug':dataset.slug})) if request.method != 'POST': form = UploadReadMeForm() else: form = UploadReadMeForm(request.POST, request.FILES) if form.is_valid(): readme_file = form.cleaned_data['readme'] if is_valid_readme_filename(readme_file.name): datasetreadmefile = DataSetFile(parent_dataset=dataset, file_contents=readme_file, is_readme=True) datasetreadmefile.file_contents.save('readme.txt', readme_file, save=True) datasetreadmefile.save() dataset.is_active = True dataset.save() return HttpResponseRedirect( reverse('epic.datasets.views.view_dataset', kwargs={'item_id':dataset.id, 'slug':dataset.slug})) else: msg = u"""The readme '%(readme)s' is not a valid readme.txt file.""" \ % {'readme': readme_file.name,} form._errors['readme'] = ErrorList([msg]) return render_to_response('datasets/upload_readme.html', {'form': form, 'dataset': dataset}, context_instance=RequestContext(request))
def _add_uploaded_files(dataset, uploaded_files): readme_file = _get_readme(uploaded_files) if readme_file: datasetreadmefile = ReadMeFile(parent_dataset=dataset, file_contents=readme_file) datasetreadmefile.file_contents.save('readme.txt', readme_file, save=True) datasetreadmefile.save() else: pass # # TODO: Maybe if the readme was a top level file that was uploaded, it should be pulled out... # if readme_file in uploaded_files: # uploaded_files.remove(readme_file) for uploaded_file in uploaded_files: new_datasetfile = DataSetFile(parent_dataset=dataset, file_contents=uploaded_file) new_datasetfile.file_contents.save(uploaded_file.name, uploaded_file, save=True) new_datasetfile.save() return readme_file
def _add_uploaded_files(dataset, uploaded_files): """ Add all the uploaded files to the dataset. The first 'readme' file found will be added with a flag that indicates it is a 'readme'. Arguments: dataset -- the dataset the files are to be added to uploaded_files -- the files to be added Raises: NoReadMeException -- if there was not a readme file in the uploaded_files """ readme_file = _get_readme(uploaded_files) if uploaded_files: for uploaded_file in uploaded_files: if uploaded_file == readme_file: # The readme file will be added below pass else: new_datasetfile = DataSetFile(parent_dataset=dataset, file_contents=uploaded_file) new_datasetfile.file_contents.save(uploaded_file.name, uploaded_file, save=True) new_datasetfile.save() if readme_file: dataset_readmefile = DataSetFile( parent_dataset=dataset, file_contents=readme_file, is_readme=True) dataset_readmefile.file_contents.save('readme.txt', readme_file, save=True) dataset_readmefile.save() else: raise NoReadMeException else: # TODO: Something special marking the dataset as just being an advertisement? pass
def create_dataset(request): if request.method != 'POST': #user has not filled out the upload form yet form = NewDataSetForm() add_formset = GeoLocationFormSet(prefix='add') remove_formset = RemoveGeoLocationFormSet(prefix='remove') else: form = NewDataSetForm(request.POST, request.FILES) add_formset = GeoLocationFormSet(request.POST, prefix='add') remove_formset = RemoveGeoLocationFormSet(request.POST, prefix='remove') if form.is_valid(): name = form.cleaned_data['name'] description = form.cleaned_data['description'] uploaded_files = form.cleaned_data['files'] tags = form.cleaned_data['tags'] new_dataset = DataSet.objects.create(creator=request.user, name=name, description=description, slug=slugify(name)) Tagging.objects.update_tags(tags,item=new_dataset, user=request.user) for geoloc in _get_geolocs_from_formset(add_formset, 'add_location'): new_dataset.geolocations.add(geoloc) for geoloc in _get_geolocs_from_formset(remove_formset, 'remove_location'): new_dataset.geolocations.remove(geoloc) for uploaded_file in uploaded_files: new_datasetfile = DataSetFile(parent_dataset=new_dataset, file_contents=uploaded_file) new_datasetfile.file_contents.save(uploaded_file.name, uploaded_file, save=True) new_datasetfile.save() return HttpResponseRedirect(reverse('epic.datasets.views.view_dataset', kwargs={'item_id':new_dataset.id,'slug':new_dataset.slug})) return render_to_response('datasets/create_dataset.html', {'form':form, 'add_formset': add_formset, 'remove_formset':remove_formset,}, context_instance=RequestContext(request))
def _add_uploaded_files(dataset, uploaded_files): readme_file = _get_readme(uploaded_files) if readme_file: datasetreadmefile = DataSetFile(parent_dataset=dataset, file_contents=readme_file) datasetreadmefile.file_contents.save('readme.txt', readme_file, save=True) datasetreadmefile.save() else: # TODO: throw an error pass if readme_file in uploaded_files: uploaded_files.remove(readme_file) for uploaded_file in uploaded_files: new_datasetfile = DataSetFile(parent_dataset=dataset, file_contents=uploaded_file) new_datasetfile.file_contents.save(uploaded_file.name, uploaded_file, save=True) new_datasetfile.save()
def create_dataset(request): if request.method != 'POST': #user has not filled out the upload form yet form = NewDataSetForm() add_formset = GeoLocationFormSet(prefix='add') remove_formset = RemoveGeoLocationFormSet(prefix='remove') return render_to_response('datasets/create_dataset.html', {'form': form, 'add_formset': add_formset, 'remove_formset':remove_formset, 'user':request.user,}) else: # Create all the forms and formsets from the post data form = NewDataSetForm(request.POST, request.FILES) add_formset = GeoLocationFormSet(request.POST, prefix='add') remove_formset = RemoveGeoLocationFormSet(request.POST, prefix='remove') if form.is_valid(): name = form.cleaned_data['name'] description = form.cleaned_data['description'] uploaded_files = form.cleaned_data['files'] tags = form.cleaned_data['tags'] new_dataset = DataSet.objects.create(creator=request.user, name=name, description=description, slug=slugify(name)) new_dataset.tags.update_tags(tags, user=request.user) # Add all the locations specified in the add_formset if not add_formset.is_valid(): print 'The add formset for the geolocations for the edit dataset page was not valid' else: # Get all of the geolocations for add_form in add_formset.forms: try: location = add_form.cleaned_data['add_location'] import re # This pattern will match on [[-#.#, -#.#], '*', * location_pattern = re.compile(r"""^\[\[(?P<lat>-?\d+\.\d+), (?P<lng>-?\d+\.\d+)\], '(?P<name>.+?)',(?:.*)""") location_match = location_pattern.match(location) location_dict = location_match.groupdict() lat = location_dict['lat'] lng = location_dict['lng'] canonical_name = unicode(location_dict['name']) # If the location already exists, use it otherwise create a new one try: geoloc = GeoLoc.objects.get(longitude=lng, latitude=lat, canonical_name=canonical_name) except: geoloc = GeoLoc(longitude=lng, latitude=lat, canonical_name=canonical_name) geoloc.save() # Add the found/created location to the dataset new_dataset.geolocations.add(geoloc) except: print 'There was a problem in adding the location from the hidden field to the database' if not remove_formset.is_valid(): print 'The remove formset for the geolocations for the edit dataset page was not valid' else: for remove_form in remove_formset.forms: try: location = remove_form.cleaned_data['remove_location'] import re # This pattern will match on [[-#.#, -#.#], '*', * location_pattern = re.compile(r"""^\[\[(?P<lat>-?\d+\.\d+), (?P<lng>-?\d+\.\d+)\], '(?P<name>.+?)',(?:.*)""") location_match = location_pattern.match(location) location_dict = location_match.groupdict() lat = location_dict['lat'] lng = location_dict['lng'] canonical_name = unicode(location_dict['name']) try: geoloc = GeoLoc.objects.get(longitude=lng,latitude=lat, canonical_name=canonical_name) except: print "The geolocation to be removed does not appear to have been attached to this dataset" # Remove the geoloc from the dataset. Note that the geoloc will still be in the database incase other things were attached. new_dataset.geolocations.remove(geoloc) except: print 'There was a problem in removing the location from the dataset' for uploaded_file in uploaded_files: new_datasetfile = DataSetFile(parent_dataset=new_dataset, file_contents=uploaded_file) new_datasetfile.file_contents.save(uploaded_file.name, uploaded_file, save=True) new_datasetfile.save() #show them the page for the dataset we just created return HttpResponseRedirect(reverse('epic.datasets.views.view_dataset', kwargs={'item_id':new_dataset.id,'slug':new_dataset.slug})) else: #form wasn't filled out correctly return render_to_response('datasets/create_dataset.html', {'form':form, 'add_formset': add_formset, 'remove_formset':remove_formset, 'user':request.user})