diff --git a/jobs/management/commands/fix_dupes.py b/jobs/management/commands/fix_dupes.py new file mode 100644 index 0000000..dadb737 --- /dev/null +++ b/jobs/management/commands/fix_dupes.py @@ -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 + + diff --git a/jobs/management/commands/fix_employers.py b/jobs/management/commands/fix_employers.py deleted file mode 100644 index 5f77365..0000000 --- a/jobs/management/commands/fix_employers.py +++ /dev/null @@ -1,48 +0,0 @@ -from django.db.models import Count -from django.core.management.base import BaseCommand - -from shortimer.jobs.models import Employer - -class Command(BaseCommand): - - def handle(self, *args, **kwargs): - slugs = Employer.objects.values("slug").annotate(Count("id")) - for slug in slugs.order_by('id__count'): - if slug['id__count'] == 1: - continue - - employers = list(Employer.objects.filter(slug=slug['slug'])) - with_freebase_id = [] - without_freebase_id = [] - with_city = [] - without_city = [] - - for employer in employers: - - if employer.freebase_id.startswith("/en/"): - with_freebase_id.append(employer) - else: - without_freebase_id.append(employer) - - if employer.city: - with_city.append(employer) - else: - without_city.append(employer) - - if len(with_freebase_id) > 1 and len(with_city) == 1: - fix(with_city[0], without_city) - - elif len(with_freebase_id) == 1: - fix(with_freebase_id[0], without_freebase_id) - -def fix(good_employer, bad_employers): - for bad_employer in bad_employers: - for job in bad_employer.jobs.all(): - print "rewiring %s to %s" % (job, good_employer) - job.employer = good_employer - job.save() - bad_employer.delete() - print "deleting: %s" % bad_employer - - - diff --git a/jobs/templates/job_edit.html b/jobs/templates/job_edit.html index 20000bb..189e257 100644 --- a/jobs/templates/job_edit.html +++ b/jobs/templates/job_edit.html @@ -176,6 +176,10 @@ }); } + function resetEmployerFreebaseId() { + $("#employer_freebase_id").val(null); + } + function addLocation(e, data) { $("#location_freebase_id").val(data.mid); } @@ -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 diff --git a/jobs/views.py b/jobs/views.py index 7b4147c..198a58d 100644 --- a/jobs/views.py +++ b/jobs/views.py @@ -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 @@ -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 @@ -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)