def make_subjectset_from_collection(request): # if this is a POST request we need to process the form data if request.method == 'POST': # create a form instance and populate it with data from the request: form = SearchForm(request.POST) # check whether it's valid: if form.is_valid(): project = panoptes_client.Project.find(1104) username = str(form.cleaned_data['username']) collection_display_name = str( form.cleaned_data['collection_display_name']) subjects_in_collection = retrieve_subjects_from_collection( username, collection_display_name) subject_set = panoptes_client.SubjectSet() subject_set.links.project = project subject_set.display_name = '{0}'.format(collection_display_name) subject_set.save() subject_set.add(subjects_in_collection) #workflow = panoptes_client.Workflow() #workflow.display_name = '{0}'.format(collection_display_name) #project.add_workflows(workflow) #workflow.add_subject_sets(subject_set) return HttpResponse('Success!', content_type="text/plain")
try: project = utils.connect(projid) except PanoptesAPIException: return False if opts.subject: try: subject_set = pan.SubjectSet.find(opts.subject) except PanoptesAPIException as e: log.error("Could not find subject set id") for arg in e.args: log.error("> " + arg) return False else: log.info("Creating new subject set") subject_set = pan.SubjectSet() subject_set.links.project = project while(True): name = input("Enter subject set display name: ") try: subject_set.display_name = name subject_set.save() except PanoptesAPIException as e: log.error("Could not set subject set display name") for arg in e.args: if arg == 'You must be logged in to access this resource.': log.error("User credentials invalid") exit(False) log.error("> " + arg) if arg == 'Validation failed:' \
def upload(imgdir, projid, opts, **kwargs): ''' %prog upload imgdir zoo_proj_id Does: - Uploads images from the specified image directory to zooniverse project specified by zoo_project_id. - Will also generate a manifest if one is not already present inside imgdir. Note: - This program uploads only images listed in the manifest.csv file. Args: - imgdir -type: str -desc: The directory of the images to be uploaded - proj_id -type: str -desc: The zooniverse project id to upload the images to. Returns: None ''' if opts.quiet: log.setLevel(logging.INFO) if not osp.isdir(imgdir): log.error("Image directory '{}' does not exist".format(imgdir)) return False try: project = utils.connect(projid) except PanoptesAPIException: return False if opts.subject: try: subject_set = pan.SubjectSet.find(opts.subject) except PanoptesAPIException as e: log.error("Could not find subject set id") for arg in e.args: log.error("> " + arg) return False else: log.info("Creating new subject set") subject_set = pan.SubjectSet() subject_set.links.project = project while (True): name = input("Enter subject set display name: ") try: subject_set.display_name = name subject_set.save() except PanoptesAPIException as e: log.error("Could not set subject set display name") for arg in e.args: if arg == 'You must be logged in to access this resource.': log.error("User credentials invalid") exit(False) log.error("> " + arg) if arg == 'Validation failed:' \ + ' Display name has already been taken': log.info("To use {} as the display name," + " get the subject set id from zooniverse" + " and call this command with --subject <id>") if not utils.get_yn('Try again?'): exit(False) continue break # NOTE: This would need to be cross-platform and efficient # I am removing this feature and leaving file compression to # the user. ''' if opts.convert: log.info("Compressing and converting to jpg") log.critical("Warning: All jpg files will be overwritten.") if utils.get_yn("Continue?"): utils.convert(imgdir) ''' if not osp.isfile(osp.join(imgdir, 'manifest.csv')): log.info("Generating manifest") if opts.extension: manif_gen_succeeded = manifest(imgdir, ext=opts.extension) else: manif_gen_succeeded = manifest(imgdir) if not manif_gen_succeeded: log.error("No images to upload.") return False mfile = open(osp.join(imgdir, 'manifest.csv'), 'r') fieldnames = mfile.readline().strip().split(",") mfile.seek(0) reader = csv.DictReader(mfile) if 'filename' not in fieldnames: log.error("Manifest file must have a 'filename' column") return False log.info("Loading images from manifest...") error_count = 0 success_count = 0 project.reload() for row in reader: try: # getsize returns file size in bytes filesize = osp.getsize(row['filename']) / 1000 if filesize > 256: log.warning( "File size of {}KB is larger than recommended 256KB". format(filesize)) temp_subj = pan.Subject() temp_subj.add_location(row['filename']) temp_subj.metadata.update(row) temp_subj.links.project = project temp_subj.save() subject_set.add(temp_subj) except PanoptesAPIException as e: error_count += 1 log.error("Error on row: {}".format(row)) for arg in e.args: log.error("> " + arg) try: log.info("Trying again...") subject_set.add(temp_subj) except PanoptesAPIException as e2: for arg in e2.args: log.error("> " + arg) log.info("Skipping") continue success_count += 1 success_count += 1 log.debug("{}- {} - success".format(success_count, str(osp.basename( row['filename'])))) log.info("DONE") log.info("Summary:") log.info(" Upload completed at: " + dt.now().strftime("%H:%M:%S %m/%d/%y")) log.info(" {} of {} images loaded".format(success_count, success_count + error_count)) log.info("\n") log.info("Remember to link your workflow to this subject set") return True
def make_subjectset_from_collection(request): # if this is a POST request we need to process the form data if request.method == 'POST': # create a form instance and populate it with data from the request: form = SearchForm(request.POST) # check whether it's valid: if form.is_valid(): username = str(form.cleaned_data['username']) collection_display_name = str( form.cleaned_data['collection_display_name']) workflow_name = str(form.cleaned_data['workflow_name']) client = panoptes_client.Panoptes() client.connect(username=os.environ.get('PANOPTES_USERNAME'), password=os.environ.get('PANOPTES_PASSWORD')) subjects_in_collection, collection_display_url = retrieve_subjects_from_collection( username, collection_display_name) subject_set = panoptes_client.SubjectSet() subject_set.links.project = '6040' subject_set.display_name = '{0}'.format(collection_display_name) subject_set.save() subject_set.add(subjects_in_collection) workflow = panoptes_client.Workflow() workflow.display_name = '{0}'.format(workflow_name) workflow.links.project = '6040' workflow.primary_language = 'en' image_location_str = "![Example Alt Text]({0} =400x275)".format( collection_display_url) workflow.tasks = { u'T0': { u'answers': [{ u'label': u'Yes' }, { u'label': u'No' }], u'help': u'', u'question': u'Does this image look like \n{0}'.format( image_location_str), u'required': True, u'type': u'single' } } workflow.first_task = "T0" workflow.save() workflow.mobile_friendly = True workflow.retirement = { u'criteria': u'classification_count', u'options': { u'count': 5 } } workflow.save() workflow.add_subject_sets(subject_set) return redirect( "https://www.zooniverse.org/projects/sbc538/vet-new-classes/") else: return render(request, 'subjectset_from_collection_form.html', {'form': form})