def save_model(self, request, obj, form, change): this_is_an_add = obj.id is None # Save the object. super(TaxonAdmin, self).save_model(request, obj, form, change) # If this is a new species, we go ahead and add it to the # admin's partner sites. if this_is_an_add: user = request.user for partner in models.PartnerSite.objects.filter(users=user): models.PartnerSpecies(species=obj, partner=partner).save()
def partner_plants_upload(request, idnum): partner = get_object_or_404(models.PartnerSite, id=idnum) return_url = '..' printout = [] changes = None if request.method == 'POST': # Step 3: they pressed "Confirm" so we make the changes. if 'changes' in request.POST: inserts, updates, deletes = json.loads(request.POST['changes']) for name, simple in inserts: taxon = models.Taxon.objects.filter(scientific_name=name)[0] ps = models.PartnerSpecies() ps.species = taxon ps.partner = partner ps.simple_key = (simple == 'yes') ps.save() for ((old_name, old_simple), (name, simple)) in updates: taxon = models.Taxon.objects.filter(scientific_name=name)[0] ps = (models.PartnerSpecies.objects.filter(species=taxon, partner=partner))[0] ps.simple_key = (simple == 'yes') ps.save() for name, simple in deletes: taxon = models.Taxon.objects.filter(scientific_name=name)[0] ps = models.PartnerSpecies() ps = (models.PartnerSpecies.objects.filter(species=taxon, partner=partner))[0] ps.delete() return redirect(return_url) # Step 2: they have selected a file and pressed "Upload". if 'csvfile' in request.FILES: upload_records = tablib.Dataset() upload_records.csv = request.FILES['csvfile'].read() wrangler = wranglers.PartnerPlants(partner) database_records = wrangler.generate_records() de = DifferenceEngine() de.differentiate(database_records, upload_records, [0]) bad_inserts = [ record for record in de.inserts if not len(models.Taxon.objects.filter(scientific_name=record[0])) ] if bad_inserts: printout.append('Unrecognized plants that will NOT be ' 'imported but ignored for now:') printout.append('') for bad in bad_inserts: printout.append('- {}'.format(bad[0])) printout.append('') de.inserts = [ record for record in de.inserts if record[0].lower() != 'scientific_name' and record not in bad_inserts ] if de.inserts: printout.append('Plants to insert:') printout.append('') for record in de.inserts: printout.append('- {}'.format(record[0])) else: printout.append('No plants to insert.') printout.append('') if de.updates: printout.append('Plants changing simple-key membership:') printout.append('') for record in de.updates: printout.append('- {} changing to: {}'.format(*record[1])) else: printout.append('No plants to update.') printout.append('') if de.deletes: printout.append('Plants to remove from this partner:') printout.append('') for record in de.deletes: printout.append('- {}'.format(record[0])) else: printout.append('No plants to delete.') printout.append('') changes = json.dumps([de.inserts, de.updates, de.deletes]) else: printout.append('Please select a file for upload and try again.') # Step 1: an admin visits the page. return render( request, 'gobotany/upload_partner_plants.html', { 'changes': changes, 'partner': partner, 'printout': '\n'.join(printout), 'return_url': return_url, })