Skip to content

Commit

Permalink
tighten up object lookups
Browse files Browse the repository at this point in the history
over time the db has accumulated a fair number of subjects and
employers with duplicate names, which causes problems for
views that use a slugified version of the name.

this commit tightens up the lookups to use the freebase id
and also includes a new command line utility to help diagnose
and correct these duplicates.

refs #38
  • Loading branch information
edsu committed Jan 28, 2016
1 parent b566fd1 commit 7d3d14c
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 57 deletions.
50 changes: 50 additions & 0 deletions jobs/management/commands/fix_dupes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from django.db.models import Count
from django.core.management.base import BaseCommand

from shortimer.jobs.models import Employer, Subject

class Command(BaseCommand):

def handle(self, *args, **kwargs):
for klass in (Employer, Subject):
fix(klass)

def fix(klass):
slugs = klass.objects.values("slug").annotate(Count("id"))
for slug in slugs.order_by('id__count'):
if slug['id__count'] == 1:
continue

slug = slug['slug']

objects = list(klass.objects.filter(slug=slug))
guess = None
for o in objects:
jobs = o.jobs.all()
print ("%s [%s] %s" % (o.name, o.id, jobs.count())).encode('utf8')
if guess is None or jobs.count() > guess.jobs.all().count():
guess = o

print ("guess: %s [%s]" % (guess.name, guess.id)).encode('utf8')
choice = raw_input("rewire? [y/n] ")
if choice.lower() == "y" or choice == "":
for o in objects:
if o == guess:
continue

for job in o.jobs.all():
if klass == Employer:
job.employer = guess
job.save()
elif klass == Subject:
job.subjects.remove(o)
job.subjects.add(guess)
job.save()
print ("rewrote %s [%s]" % (job.title, job.id)).encode('utf8')

klass.objects.get(id=o.id).delete()
print ("deleted %s [%s]" % (o.name, o.id))

print


48 changes: 0 additions & 48 deletions jobs/management/commands/fix_employers.py

This file was deleted.

5 changes: 5 additions & 0 deletions jobs/templates/job_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@
});
}

function resetEmployerFreebaseId() {
$("#employer_freebase_id").val(null);
}

function addLocation(e, data) {
$("#location_freebase_id").val(data.mid);
}
Expand Down Expand Up @@ -230,6 +234,7 @@
"suggest_new": "Click here if you don't see anything in list."
})
.bind("fb-select", addEmployer)
.bind("fb-select-new", resetEmployerFreebaseId)
.click(function(e) {$(this).trigger("keyup");});

// set up location freebase suggest lookup
Expand Down
32 changes: 23 additions & 9 deletions jobs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from django.core.paginator import Paginator
from django.core.urlresolvers import reverse
from django.template.defaultfilters import slugify
from django.core.exceptions import ObjectDoesNotExist
from django.views.decorators.cache import cache_control
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseGone, HttpResponseNotFound
Expand Down Expand Up @@ -163,18 +164,31 @@ def _update_job(j, form, user):

# set employer: when an employer is first added this save triggers
# a lookup to Freebase to get hq address information
# note: a freebase_id is not required
if form.get("employer", None):
e, created = models.Employer.objects.get_or_create(
name=form.get("employer"),
freebase_id=form.get("employer_freebase_id"))
name = form.get("employer")
freebase_id = form.get("employer_freebase_id")
try:
if freebase_id:
e = models.Employer.objects.get(freebase_id=freebase_id)
else:
e = models.Employer.filter(name=name)[0]
except (ObjectDoesNotExist, IndexError) as e:
e = models.Employer(name=name, freebase_id=freebase_id)
e.save()
j.employer = e

# set location: when a location is first added this save triggers
# a lookup to Freebase to get geo-coordinates
if form.get("location", None):
l, created = models.Location.objects.get_or_create(
name=form.get("location"),
freebase_id=form.get("location_freebase_id"))
# note: freebase_id is required
if form.get("location_freebase_id", None):
freebase_id = form.get("location_freebase_id")
name = form.get("location")
try:
l = models.Location.objects.get(freebase_id=freebase_id)
except ObjectDoesNotExist:
l = models.Location(name=name, freebase_id=freebase_id)
l.save()
j.location = l

# only people flagged as staff can edit the job text
Expand All @@ -196,8 +210,8 @@ def _update_job(j, form, user):
slug = slugify(name)

try:
s = models.Subject.objects.get(slug=slug)
except models.Subject.DoesNotExist:
s = models.Subject.objects.get(freebase_id=fb_id)
except ObjectDoesNotExist:
s = models.Subject.objects.create(name=name, freebase_id=fb_id, slug=slug)
finally:
j.subjects.add(s)
Expand Down

0 comments on commit 7d3d14c

Please sign in to comment.