azavea / pfb-network-connectivity

PFB Bicycle Network Connectivity
Other
39 stars 10 forks source link

Prevent Neighborhoods from getting deleted along with analysis jobs #769

Closed KlaasH closed 4 years ago

KlaasH commented 4 years ago

Overview

The Neighborhood model has a foreign key to AnalysisJob to keep track of the latest job for each neighborhood. But the on_delete property of that foreign key was set to CASCADE, so deleting a job would take the neighborhood with it. Which is not what we want. This changes it to SET_NULL, i.e. if the job that's currently the "last job" of a neighborhood gets deleted, the last_job on that neighborhood gets set to NULL and the neighborhood is fine.

Demo

Before:

>>> Neighborhood.objects.filter(label='Ames')
<QuerySet [<Neighborhood: <Neighborhood: ames (root)>>]>
>>> AnalysisJob.objects.filter(neighborhood__label='Ames')
<QuerySet [<AnalysisJob: <AnalysisJob: QUEUED Ames>>]>
>>> AnalysisJob.objects.filter(neighborhood__label='Ames').delete()
(3, {'pfb_analysis.NeighborhoodWaysResults': 0, 'pfb_analysis.CensusBlocksResults': 0, 'pfb_analysis.AnalysisJobStatusUpdate': 1, 'pfb_analysis.AnalysisLocalUploadTask': 0, 'pfb_analysis.AnalysisJob': 1, 'pfb_analysis.Neighborhood': 1})
>>> Neighborhood.objects.filter(label='Ames')
<QuerySet []>

After:

>>> Neighborhood.objects.filter(label='Ames')               
<QuerySet [<Neighborhood: <Neighborhood: ames (root)>>]>
>>> AnalysisJob.objects.filter(neighborhood__label='Ames')
<QuerySet [<AnalysisJob: <AnalysisJob: QUEUED Ames>>]>
>>> AnalysisJob.objects.filter(neighborhood__label='Ames').delete()
(2, {'pfb_analysis.NeighborhoodWaysResults': 0, 'pfb_analysis.CensusBlocksResults': 0, 'pfb_analysis.AnalysisJobStatusUpdate': 1, 'pfb_analysis.AnalysisLocalUploadTask': 0, 'pfb_analysis.AnalysisJob': 1})
>>> Neighborhood.objects.filter(label='Ames')                      
<QuerySet [<Neighborhood: <Neighborhood: ames (root)>>]>

Notes

I looked into this while I was evaluating issues for prioritization and decided this one was too simple, and the consequences of triggering the bug too troublesome, not to just do. So I just did it.

Testing Instructions

Checklist

Resolves #644