Пример #1
0
    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()
Пример #2
0
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,
        })