Skip to content
This repository has been archived by the owner on Mar 28, 2019. It is now read-only.

Commit

Permalink
Remove positions if they don't appear in the xml we get from jobvite
Browse files Browse the repository at this point in the history
  • Loading branch information
paulosman committed Apr 25, 2011
1 parent 320c985 commit 1960dda
Showing 1 changed file with 32 additions and 3 deletions.
35 changes: 32 additions & 3 deletions django_jobvite/management/commands/syncjobvite.py
Expand Up @@ -6,7 +6,7 @@

from django_jobvite.models import Position


# map jobvite XML element names to field names used in model.
field_map = {
'id': 'job_id', 'title': 'title', 'requisitionid': 'requisition_id',
'category': 'category', 'jobtype': 'job_type', 'location': 'location',
Expand All @@ -19,13 +19,15 @@ class Command(BaseCommand):
help = 'Fetch job listings from Jobvite'

def _get_jobvite_xml(self):
"""Fetch XML from Jobvite."""
uri = getattr(settings, 'JOBVITE_URI', None)
if not uri:
raise CommandError('No Jobvite URI set')
content = urllib2.urlopen(uri).read()
return content

def _parse_jobvite_xml(self, content):
"""Given XML as a string, return a dictionary keyed on job id."""
jobs = {}
et = ElementTree.fromstring(content)
job_elements = et.findall('job')
Expand All @@ -37,12 +39,39 @@ def _parse_jobvite_xml(self, content):
jobs[job_id][field_name] = value
return jobs

def _remove_deleted_positions(self, job_ids):
"""
Delete positions that are not in the list ``job_ids``.
Returns the number deleted.
"""
if len(job_ids) == 0:
# something must be wrong if we get ZERO jobs.
# Let's not wipe the db in case its bad data.
return 0
positions = Position.objects.exclude(job_id__in=job_ids)
deleted = len(positions)
positions.delete()
return deleted

def handle(self, *args, **options):
"""
Sync positions in Jobvite. Updates existing positions, creates new ones
if necessary and deletes expired or removed positions.
"""
content = self._get_jobvite_xml()
parsed = self._parse_jobvite_xml(content)
stats = dict(added=0, deleted=0)
for job_id, fields in parsed.iteritems():
position, created = Position.objects.get_or_create(job_id=job_id)
try:
position = Position.objects.get(job_id=job_id)
except Position.DoesNotExist:
position = Position(job_id=job_id)
stats['added'] += 1
for k, v in fields.iteritems():
setattr(position, k, v)
position.save()
print "Synced %d jobs" % (len(parsed.keys()),)
job_ids = parsed.keys()
stats['deleted'] = self._remove_deleted_positions(job_ids)
print "Synced: %d" % (len(job_ids),)
print "Added: %d" % (stats['added'],)
print "Removed: %d" % (stats['deleted'],)

0 comments on commit 1960dda

Please sign in to comment.