def parse_results_file(self, src, data_directory):
        """
        """
        saver = Saver()
        process = SbcProcessMethods()
        latest_directory = "%s%s_latest" % (data_directory, src.source_short)
        election = Election.objects.filter(electionid=src.election.electionid).first()

        for file in src.source_files.split(", "):
            latest_path = os.path.join(latest_directory, file)
            file_exists = os.path.isfile(latest_path)
            file_has_size = os.path.getsize(latest_path)
            if file_exists == True and file_has_size > 0:
                rows = ParseTabDelimited(latest_path).dictionaries
                race_ids = process.get_race_ids_from(rows)
                election_package = process.collate_and_fetch_records_for_race(race_ids, rows)
                races = election_package[0]
                election_stats = election_package[1]["stats"]
                file_timestring = None
                file_timestamp = None
                logger.info("\n*****\nUpdating...\n*****")
                saver._update_result_timestamps(src, datetime.datetime.now())
                election_info = process.compile_election_stats(election_stats)
                # print election_info
                for r in races:
                    contest_package = process.compile_contest_results(races[r])
                    # print contest_package
                    process.update_database(contest_package, election, src)
                os.remove(latest_path)
                logger.info("we've finished processing sbc results")
    def parse_results_file(self, src, data_directory):
        """
        """
        saver = Saver()
        process = SbcProcessMethods()
        latest_directory = "%s%s_latest" % (data_directory, src.source_short)
        election = Election.objects.filter(
            electionid=src.election.electionid).first()

        for file in src.source_files.split(", "):
            latest_path = os.path.join(latest_directory, file)
            file_exists = os.path.isfile(latest_path)
            file_has_size = os.path.getsize(latest_path)
            if file_exists == True and file_has_size > 0:
                rows = ParseTabDelimited(latest_path).dictionaries
                race_ids = process.get_race_ids_from(rows)
                election_package = process.collate_and_fetch_records_for_race(
                    race_ids, rows)
                races = election_package[0]
                election_stats = election_package[1]["stats"]
                file_timestring = None
                file_timestamp = None
                logger.info("\n*****\nUpdating...\n*****")
                saver._update_result_timestamps(src, datetime.datetime.now())
                election_info = process.compile_election_stats(election_stats)
                # print election_info
                for r in races:
                    contest_package = process.compile_contest_results(races[r])
                    # print contest_package
                    process.update_database(contest_package, election, src)
                os.remove(latest_path)
                logger.info("we've finished processing sbc results")
 def parse_results_file(self, src, data_directory):
     """
     """
     saver = Saver()
     process = LacProcessMethods()
     latest_directory = "%s%s_latest" % (data_directory, src.source_short)
     election = Election.objects.filter(electionid=src.election.electionid).first()
     for file in src.source_files.split(", "):
         latest_path = os.path.join(latest_directory, file)
         file_exists = os.path.isfile(latest_path)
         file_has_size = os.path.getsize(latest_path)
         if file_exists == True and file_has_size > 0:
             rows = process.open_results_file(latest_path)
             race_ids = process.get_race_ids_from(rows)
             election_package = process.collate_and_fetch_records_for_race(race_ids, rows)
             races = election_package[0]
             election_title = election_package[1]["title"]
             election_stats = election_package[1]["stats"]
             file_timestring = None
             file_timestamp = None
             pacific = pytz.timezone("US/Pacific")
             for t in election_title:
                 if t[3:5] == "TD":
                     parser = TD_parser()
                     parsed = parser.parse_line(t)
                     timestring = parsed["date"] + " " + parsed["time"]
                     file_timestring = timestring
             if file_timestring:
                 file_timestamp = parse(file_timestring, dayfirst=False).datetime
                 file_timestamp = file_timestamp.replace(tzinfo=pacific)
                 if self.testing == True:
                     update_this = self.testing
                 else:
                     update_this = saver._eval_timestamps(file_timestamp, src.source_latest)
                 if update_this == False:
                     logger.info("\n*****\nwe have newer data in the database so let's delete these files\n*****")
                     os.remove(latest_path)
                 else:
                     logger.info("\n*****\nwe have new data to save and we'll update timestamps in the database\n*****")
                     saver._update_result_timestamps(src, file_timestamp)
                     title = process.dictify_records_and_return(election_title)
                     stats = process.dictify_records_and_return(election_stats)
                     election_info = process.compile_election_stats(title, stats)
                     for r in races:
                         records = process.dictify_records_and_return(races[r])
                         """
                         checks to see if this is a recall contest or a nonpartisan contest
                         for now, it's unclear how to store or display these contests
                         in future, however, we may want to parse and return their results
                         """
                         skip = process.check_if_recall_or_nonpartisan(records)
                         if skip:
                             pass
                         else:
                             contest_package = process.compile_contest_results(records)
                             process.update_database(contest_package, election, src)
                     logger.info("we've finished processing lac results")
             else:
                 logger.error("unable to determine whether this data is newer than what we already have.")
    def update_database(self, contest_package, election, src):
        """ import candidates, measures, office and contest info from compiled data """
        saver = Saver()
        framer = Framer()
        fixer = Namefixer()
        county_name = "San Bernardino County"
        contest = contest_package['contest_details']
        candidates = contest_package['candidates']
        measures = contest_package['measures']
        judges = contest_package['judges']
        race_log = "\n"
        if framer._to_num(contest['CONTEST_TOTAL'])["convert"] == True:
            total_contest_votes = framer._to_num(contest['CONTEST_TOTAL'])["value"]
        else:
            total_contest_votes = None
            raise Exception("total_contest_votes is not a number")

        # Check level of contest (i.e. local, statewide)
        if "United States" in contest['CONTEST_FULL_NAME'] or "STATE" in contest['CONTEST_FULL_NAME']:
            level = "california"
            framer.contest["is_statewide"] = True
        else:
            level = "county"
            framer.contest["is_statewide"] = False
        framer.contest["level"] = level

        """ Need to deal with judicial contests in future elections.. None in 2016 general
        if contest['is_judicial_contest']:
            # This is a judicial appointee
            if "SUPREME COURT" in contest["contest_title"]:
                contestname = "Supreme Court"
            elif "APPELLATE COURT" in contest["contest_title"]:
                contestname = "Courts of Appeal District 02"
            else:
                contestname = contest["contest_title"]
            officename = contestname
            framer.office["officename"] = officename
            framer.office["officeslug"] = slugify(officename)
            framer.office["active"] = True
            framer.office["officeid"] = framer.office["officeslug"]
            framer.contest["election_id"] = election.id
            framer.contest["resultsource_id"] = src.id
            framer.contest["seatnum"] = None
            framer.contest["is_uncontested"] = False
            framer.contest["is_national"] = False
            framer.contest["is_statewide"] = True
            framer.contest["level"] = "california"
            # need to determine appropriate level
            framer.contest["is_ballot_measure"] = False
            framer.contest["is_judicial"] = True
            framer.contest["is_runoff"] = False
            framer.contest["reporttype"] = None
            framer.contest["poss_error"] = False
            if framer._to_num(contest['total_precincts'])["convert"] == True:
                pt = framer._to_num(contest['total_precincts'])["value"]
                framer.contest["precinctstotal"] = pt
            else:
                framer.contest["precinctstotal"] = None
                raise Exception("precinctstotal is not a number")
            if framer._to_num(contest['precincts_reporting'])["convert"] == True:
                pr = framer._to_num(contest['precincts_reporting'])["value"]
                framer.contest["precinctsreporting"] = pr
            else:
                framer.contest["precinctsreporting"] = None
                raise Exception("precinctsreporting is not a number")
            framer.contest["precinctsreportingpct"] = framer._calc_pct(
                framer.contest["precinctsreporting"],
                framer.contest["precinctstotal"]
            )
            if framer._to_num(contest['registration'])["convert"] == True:
                framer.contest["votersregistered"] = framer._to_num(
                    contest['registration'])["value"]
            else:
                framer.contest["votersregistered"] = None
                raise Exception("votersregistered is not a number")
            framer.contest["votersturnout"] = None
            framer.contest["contestname"] = fixer._fix(contestname) # framer.office["officename"]
            framer.contest["contestdescription"] = None
            framer.contest["contestid"] = saver._make_contest_id(
                # election.electionid,
                src.source_short,
                framer.contest["level"],
                framer.office["officeslug"],
            )
            race_log += saver.make_office(framer.office)
            race_log += saver.make_contest(framer.office, framer.contest)

            for judge in judges:
                fullname = judge["judicial_name"].title()
                framer.judicial["firstname"] = None
                framer.judicial["lastname"] = None
                framer.judicial["ballotorder"] = None
                framer.judicial["fullname"] = fullname
                framer.judicial["judicialslug"] = slugify(fullname)
                framer.judicial["description"] = judge['judicial_text'].title()
                framer.judicial["poss_error"] = False
                if framer._to_num(judge['yes_votes'])["convert"] == True:
                    yescount = framer._to_num(judge['yes_votes'])["value"]
                    framer.judicial["yescount"] = yescount
                else:
                    framer.judicial["yescount"] = None
                    raise Exception("yescount is not a number")
                if framer._to_num(judge['yes_percent'])["convert"] == True:
                    yespct = framer._to_num(judge['yes_percent'])["value"]
                    framer.judicial["yespct"] = yespct
                else:
                    framer.judicial["yespct"] = None
                    raise Exception("yespct is not a number")
                if framer._to_num(judge['no_votes'])["convert"] == True:
                    nocount = framer._to_num(judge['no_votes'])["value"]
                    framer.judicial["nocount"] = nocount
                else:
                    framer.judicial["nocount"] = None
                    raise Exception("nocount is not a number")
                if framer._to_num(judge['no_percent'])["convert"] == True:
                    nopct = framer._to_num(judge['no_percent'])["value"]
                    framer.judicial["nopct"] = nopct
                else:
                    framer.judicial["nopct"] = None
                    raise Exception("nopct is not a number")
                framer.judicial["judgeid"] = saver._make_this_id(
                    "judicial",
                    framer.contest["contestid"],
                    framer.judicial["judicialslug"],
                )
                race_log += saver.make_judicial(framer.contest, framer.judicial)
        """
        if contest['is_ballot_measure']:
            """ this is a ballot measure """
            framer.contest["level"] = "county"
            framer.contest["is_statewide"] = False
            contestname = contest['CONTEST_FULL_NAME']
            if ("Proposition" in contestname) or ("Recall" in contestname):
                this_type = "Proposition"
                contestname = contestname.replace("State ", "")
                measurename = contestname
            else:
                this_type = "Measure"
                contestname = fixer._fix(contestname)
                split_name = contestname.split(",")
                contestname = split_name[0]
                measurename = split_name[1]

            officename = framer._concat(
                # this_type,
                contestname,
                delimiter="-",
            )
            description = "%s Measure" % officename
            fullname = measurename
            framer.office["officename"] = officename
            framer.office["officeslug"] = slugify(officename)
            framer.office["active"] = True
            framer.office["officeid"] = framer.office["officeslug"]
            framer.contest["election_id"] = election.id
            framer.contest["resultsource_id"] = src.id
            framer.contest["seatnum"] = None
            framer.contest["is_uncontested"] = False
            framer.contest["is_national"] = False
            framer.contest["is_ballot_measure"] = True
            framer.contest["is_judicial"] = False
            framer.contest["is_runoff"] = False
            framer.contest["reporttype"] = None
            framer.contest["poss_error"] = False
            if framer._to_num(contest['TOTAL_PRECINCTS'])["convert"] == True:
                pt = framer._to_num(contest['TOTAL_PRECINCTS'])["value"]
                framer.contest["precinctstotal"] = pt
            else:
                framer.contest["precinctstotal"] = None
                raise Exception("precinctstotal is not a number")
            if framer._to_num(contest['PROCESSED_DONE'])["convert"] == True:
                pr = framer._to_num(contest['PROCESSED_DONE'])["value"]
                framer.contest["precinctsreporting"] = pr
            else:
                framer.contest["precinctsreporting"] = None
                raise Exception("precinctsreporting is not a number")
            framer.contest["precinctsreportingpct"] = framer._calc_pct(
                framer.contest["precinctsreporting"],
                framer.contest["precinctstotal"]
            )*100
            # if framer._to_num(contest['registration'])["convert"] == True:
            #     framer.contest["votersregistered"] = framer._to_num(
            #         contest['registration'])["value"]
            # else:
            #     framer.contest["votersregistered"] = None
            #     raise Exception(
            #         "votersregistered is not a number")
            framer.contest["votersturnout"] = None
            framer.contest["contestname"] = contestname
            framer.contest["contestdescription"] = description
            framer.contest["contestid"] = saver._make_contest_id(
                src.source_short,
                framer.contest["level"],
                framer.office["officeslug"],
            )
            race_log += saver.make_office(framer.office)
            race_log += saver.make_contest(framer.office, framer.contest)
            for measure in measures:
                framer.measure["ballotorder"] = measure["measure_order"]
                framer.measure["fullname"] = fullname
                framer.measure["measureslug"] = slugify(fullname)
                framer.measure["description"] = ""
                framer.measure["poss_error"] = False
                if framer._to_num(measure['yes_votes'])["convert"] == True:
                    yescount = framer._to_num(measure['yes_votes'])["value"]
                    framer.measure["yescount"] = yescount
                else:
                    framer.measure["yescount"] = None
                    raise Exception("yescount is not a number")
                framer.measure["yespct"] = framer._calc_pct(
                    framer.measure["yescount"],
                    total_contest_votes
                )*100
                if framer._to_num(measure['no_votes'])["convert"] == True:
                    nocount = framer._to_num(measure['no_votes'])["value"]
                    framer.measure["nocount"] = nocount
                else:
                    framer.measure["nocount"] = None
                    raise Exception("nocount is not a number")
                framer.measure["nopct"] = framer._calc_pct(
                    framer.measure['nocount'],
                    total_contest_votes
                )*100
                framer.measure["measureid"] = saver._make_this_id(
                    "measure",
                    framer.contest["contestid"],
                    framer.measure["measureslug"],
                )
                race_log += saver.make_measure(framer.contest, framer.measure)
        else:
            """ this is a candidate for elected office """
            # strip_district = contest['district'].lstrip("0")
            framer.contest["seatnum"] = "1010101"
            contestname = contest['CONTEST_FULL_NAME']
            if "Member of the State Assembly" in contestname:
                contestname = contestname.replace("Member of the", "")
            elif "Supervisor" in contestname:
                contestname = "%s %s" % (county_name, contestname)
            elif "United States Representative" in contestname:
                contestname = contestname.replace("United States Representative,", "US House of Representatives")
            elif "State Senator" in contestname:
                contestname = contestname.replace("State Senator,", "State Senate")
            elif "United States Senator" in contestname:
                contestname = "US Senate"
            elif "Judge of the Superior Court" in contestname:
                contestname = county_name + " " + contestname
            framer.office["officename"] = contestname.replace(".", "")
            framer.office["officeslug"] = slugify(framer.office["officename"])
            framer.office["active"] = True
            framer.office["officeid"] = framer.office["officeslug"]
            framer.contest["election_id"] = election.id
            framer.contest["resultsource_id"] = src.id
            if len(candidates) < 2:
                framer.contest["is_uncontested"] = True
            else:
                framer.contest["is_uncontested"] = False
            framer.contest["is_national"] = False
            framer.contest["is_ballot_measure"] = False
            framer.contest["is_judicial"] = False
            framer.contest["is_runoff"] = False
            framer.contest["reporttype"] = None
            framer.contest["poss_error"] = False
            if framer._to_num(contest['TOTAL_PRECINCTS'])["convert"] == True:
                pt = framer._to_num(contest['TOTAL_PRECINCTS'])["value"]
                framer.contest["precinctstotal"] = pt
            else:
                framer.contest["precinctstotal"] = None
                raise Exception("precinctstotal is not a number")
            if framer._to_num(contest['PROCESSED_DONE'])["convert"] == True:
                pr = framer._to_num(contest['PROCESSED_DONE'])["value"]
                framer.contest["precinctsreporting"] = pr
            else:
                framer.contest["precinctsreporting"] = None
                raise Exception("precinctsreporting is not a number")
            framer.contest["precinctsreportingpct"] = framer._calc_pct(
                framer.contest["precinctsreporting"],
                framer.contest["precinctstotal"]
            )*100
            # if framer._to_num(contest['registration'])["convert"] == True:
            #     framer.contest["votersregistered"] = framer._to_num(
            #         contest['registration'])["value"]
            # else:
            #     framer.contest["votersregistered"] = None
            #     raise Exception("votersregistered is not a number")
            framer.contest["votersturnout"] = None
            framer.contest["contestname"] = fixer._fix(contestname) # framer.office["officename"]
            if int(contest["VOTE_FOR"]) > 1:
                framer.contest["contestdescription"] = "Vote for " + contest["VOTE_FOR"]
            else:
                framer.contest["contestdescription"] = None
            framer.contest["contestid"] = saver._make_contest_id(
                # election.electionid,
                src.source_short,
                framer.contest["level"],
                framer.office["officeslug"],
            )
            race_log += saver.make_office(framer.office)
            race_log += saver.make_contest(framer.office, framer.contest)
            for candidate in candidates:
                fullname = candidate['CANDIDATE_FULL_NAME']
                if " - " in fullname:
                    fullname = fullname.split(" - ")[1]
                fullname = fullname.decode('iso-8859-1').encode('utf8')
                fixer = Namefixer()
                fullname = fixer._titlecase_with_accents(fullname)

                party_id = candidate['CANDIDATE_PARTY_ID']
                if party_id == "2":
                    party = "Democratic"
                elif party_id == "3":
                    party = "Green"
                elif party_id == "4":
                    party = "Libertarian"
                elif party_id == "5":
                    party = "Peace and Freedom"
                elif party_id == "6":
                    party = "Republican"
                elif party_id == "8":
                    party = "Republican"
                else:
                    party = ""
                framer.candidate["ballotorder"] = candidate["CANDIDATE_ORDER"]
                framer.candidate["firstname"] = None
                framer.candidate["lastname"] = None
                framer.candidate["fullname"] = fullname
                framer.candidate["candidateslug"] = slugify(fullname)
                framer.candidate["party"] = party
                framer.candidate["incumbent"] = False
                framer.candidate["poss_error"] = False
                if framer._to_num(candidate['TOTAL'])["convert"] == True:
                    framer.candidate["votecount"] = framer._to_num(candidate['TOTAL'])[
                        "value"]
                else:
                    framer.candidate["votecount"] = None
                    raise Exception("votecount is not a number")
                if total_contest_votes > 0:
                    framer.candidate["votepct"] = framer._calc_pct(
                        framer.candidate["votecount"],
                        total_contest_votes
                    )*100
                else:
                    framer.candidate["votepct"] = 0.00
                    logger.debug("No votes have been cast in " + contestname + " or votepct is not a number")
                framer.candidate["candidateid"] = saver._make_this_id(
                    "candidate",
                    framer.contest["contestid"],
                    framer.candidate["candidateslug"],
                )
                race_log += saver.make_candidate(framer.contest, framer.candidate)
    def update_database(self, contest_package, election, src):
        """ import candidates, measures, office and contest info from compiled data """
        saver = Saver()
        framer = Framer()
        fixer = Namefixer()
        county_name = "San Bernardino County"
        contest = contest_package['contest_details']
        candidates = contest_package['candidates']
        measures = contest_package['measures']
        judges = contest_package['judges']
        race_log = "\n"
        if framer._to_num(contest['CONTEST_TOTAL'])["convert"] == True:
            total_contest_votes = framer._to_num(
                contest['CONTEST_TOTAL'])["value"]
        else:
            total_contest_votes = None
            raise Exception("total_contest_votes is not a number")

        # Check level of contest (i.e. local, statewide)
        if "United States" in contest[
                'CONTEST_FULL_NAME'] or "STATE" in contest['CONTEST_FULL_NAME']:
            level = "california"
            framer.contest["is_statewide"] = True
        else:
            level = "county"
            framer.contest["is_statewide"] = False
        framer.contest["level"] = level
        """ Need to deal with judicial contests in future elections.. None in 2016 general
        if contest['is_judicial_contest']:
            # This is a judicial appointee
            if "SUPREME COURT" in contest["contest_title"]:
                contestname = "Supreme Court"
            elif "APPELLATE COURT" in contest["contest_title"]:
                contestname = "Courts of Appeal District 02"
            else:
                contestname = contest["contest_title"]
            officename = contestname
            framer.office["officename"] = officename
            framer.office["officeslug"] = slugify(officename)
            framer.office["active"] = True
            framer.office["officeid"] = framer.office["officeslug"]
            framer.contest["election_id"] = election.id
            framer.contest["resultsource_id"] = src.id
            framer.contest["seatnum"] = None
            framer.contest["is_uncontested"] = False
            framer.contest["is_national"] = False
            framer.contest["is_statewide"] = True
            framer.contest["level"] = "california"
            # need to determine appropriate level
            framer.contest["is_ballot_measure"] = False
            framer.contest["is_judicial"] = True
            framer.contest["is_runoff"] = False
            framer.contest["reporttype"] = None
            framer.contest["poss_error"] = False
            if framer._to_num(contest['total_precincts'])["convert"] == True:
                pt = framer._to_num(contest['total_precincts'])["value"]
                framer.contest["precinctstotal"] = pt
            else:
                framer.contest["precinctstotal"] = None
                raise Exception("precinctstotal is not a number")
            if framer._to_num(contest['precincts_reporting'])["convert"] == True:
                pr = framer._to_num(contest['precincts_reporting'])["value"]
                framer.contest["precinctsreporting"] = pr
            else:
                framer.contest["precinctsreporting"] = None
                raise Exception("precinctsreporting is not a number")
            framer.contest["precinctsreportingpct"] = framer._calc_pct(
                framer.contest["precinctsreporting"],
                framer.contest["precinctstotal"]
            )
            if framer._to_num(contest['registration'])["convert"] == True:
                framer.contest["votersregistered"] = framer._to_num(
                    contest['registration'])["value"]
            else:
                framer.contest["votersregistered"] = None
                raise Exception("votersregistered is not a number")
            framer.contest["votersturnout"] = None
            framer.contest["contestname"] = fixer._fix(contestname) # framer.office["officename"]
            framer.contest["contestdescription"] = None
            framer.contest["contestid"] = saver._make_contest_id(
                # election.electionid,
                src.source_short,
                framer.contest["level"],
                framer.office["officeslug"],
            )
            race_log += saver.make_office(framer.office)
            race_log += saver.make_contest(framer.office, framer.contest)

            for judge in judges:
                fullname = judge["judicial_name"].title()
                framer.judicial["firstname"] = None
                framer.judicial["lastname"] = None
                framer.judicial["ballotorder"] = None
                framer.judicial["fullname"] = fullname
                framer.judicial["judicialslug"] = slugify(fullname)
                framer.judicial["description"] = judge['judicial_text'].title()
                framer.judicial["poss_error"] = False
                if framer._to_num(judge['yes_votes'])["convert"] == True:
                    yescount = framer._to_num(judge['yes_votes'])["value"]
                    framer.judicial["yescount"] = yescount
                else:
                    framer.judicial["yescount"] = None
                    raise Exception("yescount is not a number")
                if framer._to_num(judge['yes_percent'])["convert"] == True:
                    yespct = framer._to_num(judge['yes_percent'])["value"]
                    framer.judicial["yespct"] = yespct
                else:
                    framer.judicial["yespct"] = None
                    raise Exception("yespct is not a number")
                if framer._to_num(judge['no_votes'])["convert"] == True:
                    nocount = framer._to_num(judge['no_votes'])["value"]
                    framer.judicial["nocount"] = nocount
                else:
                    framer.judicial["nocount"] = None
                    raise Exception("nocount is not a number")
                if framer._to_num(judge['no_percent'])["convert"] == True:
                    nopct = framer._to_num(judge['no_percent'])["value"]
                    framer.judicial["nopct"] = nopct
                else:
                    framer.judicial["nopct"] = None
                    raise Exception("nopct is not a number")
                framer.judicial["judgeid"] = saver._make_this_id(
                    "judicial",
                    framer.contest["contestid"],
                    framer.judicial["judicialslug"],
                )
                race_log += saver.make_judicial(framer.contest, framer.judicial)
        """
        if contest['is_ballot_measure']:
            """ this is a ballot measure """
            framer.contest["level"] = "county"
            framer.contest["is_statewide"] = False
            contestname = contest['CONTEST_FULL_NAME']
            if ("Proposition" in contestname) or ("Recall" in contestname):
                this_type = "Proposition"
                contestname = contestname.replace("State ", "")
                measurename = contestname
            else:
                this_type = "Measure"
                contestname = fixer._fix(contestname)
                split_name = contestname.split(",")
                contestname = split_name[0]
                measurename = split_name[1]

            officename = framer._concat(
                # this_type,
                contestname,
                delimiter="-",
            )
            description = "%s Measure" % officename
            fullname = measurename
            framer.office["officename"] = officename
            framer.office["officeslug"] = slugify(officename)
            framer.office["active"] = True
            framer.office["officeid"] = framer.office["officeslug"]
            framer.contest["election_id"] = election.id
            framer.contest["resultsource_id"] = src.id
            framer.contest["seatnum"] = None
            framer.contest["is_uncontested"] = False
            framer.contest["is_national"] = False
            framer.contest["is_ballot_measure"] = True
            framer.contest["is_judicial"] = False
            framer.contest["is_runoff"] = False
            framer.contest["reporttype"] = None
            framer.contest["poss_error"] = False
            if framer._to_num(contest['TOTAL_PRECINCTS'])["convert"] == True:
                pt = framer._to_num(contest['TOTAL_PRECINCTS'])["value"]
                framer.contest["precinctstotal"] = pt
            else:
                framer.contest["precinctstotal"] = None
                raise Exception("precinctstotal is not a number")
            if framer._to_num(contest['PROCESSED_DONE'])["convert"] == True:
                pr = framer._to_num(contest['PROCESSED_DONE'])["value"]
                framer.contest["precinctsreporting"] = pr
            else:
                framer.contest["precinctsreporting"] = None
                raise Exception("precinctsreporting is not a number")
            framer.contest["precinctsreportingpct"] = framer._calc_pct(
                framer.contest["precinctsreporting"],
                framer.contest["precinctstotal"]) * 100
            # if framer._to_num(contest['registration'])["convert"] == True:
            #     framer.contest["votersregistered"] = framer._to_num(
            #         contest['registration'])["value"]
            # else:
            #     framer.contest["votersregistered"] = None
            #     raise Exception(
            #         "votersregistered is not a number")
            framer.contest["votersturnout"] = None
            framer.contest["contestname"] = contestname
            framer.contest["contestdescription"] = description
            framer.contest["contestid"] = saver._make_contest_id(
                src.source_short,
                framer.contest["level"],
                framer.office["officeslug"],
            )
            race_log += saver.make_office(framer.office)
            race_log += saver.make_contest(framer.office, framer.contest)
            for measure in measures:
                framer.measure["ballotorder"] = measure["measure_order"]
                framer.measure["fullname"] = fullname
                framer.measure["measureslug"] = slugify(fullname)
                framer.measure["description"] = ""
                framer.measure["poss_error"] = False
                if framer._to_num(measure['yes_votes'])["convert"] == True:
                    yescount = framer._to_num(measure['yes_votes'])["value"]
                    framer.measure["yescount"] = yescount
                else:
                    framer.measure["yescount"] = None
                    raise Exception("yescount is not a number")
                framer.measure["yespct"] = framer._calc_pct(
                    framer.measure["yescount"], total_contest_votes) * 100
                if framer._to_num(measure['no_votes'])["convert"] == True:
                    nocount = framer._to_num(measure['no_votes'])["value"]
                    framer.measure["nocount"] = nocount
                else:
                    framer.measure["nocount"] = None
                    raise Exception("nocount is not a number")
                framer.measure["nopct"] = framer._calc_pct(
                    framer.measure['nocount'], total_contest_votes) * 100
                framer.measure["measureid"] = saver._make_this_id(
                    "measure",
                    framer.contest["contestid"],
                    framer.measure["measureslug"],
                )
                race_log += saver.make_measure(framer.contest, framer.measure)
        else:
            """ this is a candidate for elected office """
            # strip_district = contest['district'].lstrip("0")
            framer.contest["seatnum"] = "1010101"
            contestname = contest['CONTEST_FULL_NAME']
            if "Member of the State Assembly" in contestname:
                contestname = contestname.replace("Member of the", "")
            elif "Supervisor" in contestname:
                contestname = "%s %s" % (county_name, contestname)
            elif "United States Representative" in contestname:
                contestname = contestname.replace(
                    "United States Representative,",
                    "US House of Representatives")
            elif "State Senator" in contestname:
                contestname = contestname.replace("State Senator,",
                                                  "State Senate")
            elif "United States Senator" in contestname:
                contestname = "US Senate"
            elif "Judge of the Superior Court" in contestname:
                contestname = county_name + " " + contestname
            framer.office["officename"] = contestname.replace(".", "")
            framer.office["officeslug"] = slugify(framer.office["officename"])
            framer.office["active"] = True
            framer.office["officeid"] = framer.office["officeslug"]
            framer.contest["election_id"] = election.id
            framer.contest["resultsource_id"] = src.id
            if len(candidates) < 2:
                framer.contest["is_uncontested"] = True
            else:
                framer.contest["is_uncontested"] = False
            framer.contest["is_national"] = False
            framer.contest["is_ballot_measure"] = False
            framer.contest["is_judicial"] = False
            framer.contest["is_runoff"] = False
            framer.contest["reporttype"] = None
            framer.contest["poss_error"] = False
            if framer._to_num(contest['TOTAL_PRECINCTS'])["convert"] == True:
                pt = framer._to_num(contest['TOTAL_PRECINCTS'])["value"]
                framer.contest["precinctstotal"] = pt
            else:
                framer.contest["precinctstotal"] = None
                raise Exception("precinctstotal is not a number")
            if framer._to_num(contest['PROCESSED_DONE'])["convert"] == True:
                pr = framer._to_num(contest['PROCESSED_DONE'])["value"]
                framer.contest["precinctsreporting"] = pr
            else:
                framer.contest["precinctsreporting"] = None
                raise Exception("precinctsreporting is not a number")
            framer.contest["precinctsreportingpct"] = framer._calc_pct(
                framer.contest["precinctsreporting"],
                framer.contest["precinctstotal"]) * 100
            # if framer._to_num(contest['registration'])["convert"] == True:
            #     framer.contest["votersregistered"] = framer._to_num(
            #         contest['registration'])["value"]
            # else:
            #     framer.contest["votersregistered"] = None
            #     raise Exception("votersregistered is not a number")
            framer.contest["votersturnout"] = None
            framer.contest["contestname"] = fixer._fix(
                contestname)  # framer.office["officename"]
            if int(contest["VOTE_FOR"]) > 1:
                framer.contest[
                    "contestdescription"] = "Vote for " + contest["VOTE_FOR"]
            else:
                framer.contest["contestdescription"] = None
            framer.contest["contestid"] = saver._make_contest_id(
                # election.electionid,
                src.source_short,
                framer.contest["level"],
                framer.office["officeslug"],
            )
            race_log += saver.make_office(framer.office)
            race_log += saver.make_contest(framer.office, framer.contest)
            for candidate in candidates:
                fullname = candidate['CANDIDATE_FULL_NAME']
                if " - " in fullname:
                    fullname = fullname.split(" - ")[1]
                fullname = fullname.decode('iso-8859-1').encode('utf8')
                fixer = Namefixer()
                fullname = fixer._titlecase_with_accents(fullname)

                party_id = candidate['CANDIDATE_PARTY_ID']
                if party_id == "2":
                    party = "Democratic"
                elif party_id == "3":
                    party = "Green"
                elif party_id == "4":
                    party = "Libertarian"
                elif party_id == "5":
                    party = "Peace and Freedom"
                elif party_id == "6":
                    party = "Republican"
                elif party_id == "8":
                    party = "Republican"
                else:
                    party = ""
                framer.candidate["ballotorder"] = candidate["CANDIDATE_ORDER"]
                framer.candidate["firstname"] = None
                framer.candidate["lastname"] = None
                framer.candidate["fullname"] = fullname
                framer.candidate["candidateslug"] = slugify(fullname)
                framer.candidate["party"] = party
                framer.candidate["incumbent"] = False
                framer.candidate["poss_error"] = False
                if framer._to_num(candidate['TOTAL'])["convert"] == True:
                    framer.candidate["votecount"] = framer._to_num(
                        candidate['TOTAL'])["value"]
                else:
                    framer.candidate["votecount"] = None
                    raise Exception("votecount is not a number")
                if total_contest_votes > 0:
                    framer.candidate["votepct"] = framer._calc_pct(
                        framer.candidate["votecount"],
                        total_contest_votes) * 100
                else:
                    framer.candidate["votepct"] = 0.00
                    logger.debug("No votes have been cast in " + contestname +
                                 " or votepct is not a number")
                framer.candidate["candidateid"] = saver._make_this_id(
                    "candidate",
                    framer.contest["contestid"],
                    framer.candidate["candidateslug"],
                )
                race_log += saver.make_candidate(framer.contest,
                                                 framer.candidate)
 def parse_results_file(self, src, data_directory):
     """
     """
     saver = Saver()
     compiler = BuildResults()
     latest_directory = "%s%s_latest" % (data_directory, src.source_short)
     election = Election.objects.filter(electionid=src.election.electionid).first()
     for file in src.source_files.split(", "):
         latest_path = os.path.join(latest_directory, file)
         file_exists = os.path.isfile(latest_path)
         file_has_size = os.path.getsize(latest_path)
         if file_exists == True and file_has_size > 0:
             soup = BeautifulSoup(open(latest_path), "xml")
             file_timestring = unicode(soup.CumulativeRptHeader.ReportHeader.attrs["run_date"])
             file_timestamp = parse(file_timestring, dayfirst=False).datetime
             if self.testing == True:
                 update_this = self.testing
             else:
                 update_this = saver._eval_timestamps(file_timestamp, src.source_latest)
             if update_this == False:
                 logger.info("\n*****\nwe have newer data in the database so let's delete these files\n*****")
                 os.remove(latest_path)
             else:
                 logger.info("\n*****\nwe have new data to save and we'll update timestamps in the database\n*****")
                 saver._update_result_timestamps(src, file_timestamp)
                 races = soup.find_all("ContestTotal")
                 race_log = "\n"
                 for race in races:
                     if race.attrs["contest_type"] == "MS":
                         """
                         this is a proposition
                         """
                         result = compiler._compile_measure(race, election, src)
                         race_log += saver.make_office(result.office)
                         race_log += saver.make_contest(result.office, result.contest)
                         race_log += saver.make_measure(result.contest, result.measure)
                     # elif race.attrs["contest_type"] == "??":
                     #     """
                     #     this is a judicial race
                     #     """
                     #     pass
                     else:
                         """
                         this is a non-judicial candidate
                         """
                         result = compiler._compile_candidate(race, election, src)
                         race_log += saver.make_office(result.office)
                         race_log += saver.make_contest(result.office, result.contest)
                         for candidate in result.candidates:
                             race_log += saver.make_candidate(result.contest, candidate)
                 #logger.info(race_log)
                 os.remove(latest_path)
                 logger.info("\n*****\nwe've finished processing orange county results\n*****")
         else:
             logger.error("XML file to parse is not at expected location")
 def update_database(self, contest_package, election, src):
     """ import candidates, measures, office and contest info from compiled data """
     saver = Saver()
     framer = Framer()
     fixer = Namefixer()
     county_name = "Los Angeles County"
     contest = contest_package["contest_details"]
     candidates = contest_package["candidates"]
     measures = contest_package["measures"]
     judges = contest_package["judges"]
     race_log = "\n"
     # """
     # Check level of contest (i.e. local, statewide)
     # """
     if "U.S." in contest["contest_title"] or "STATE" in contest["contest_title"]:
         level = "county"
         framer.contest["is_statewide"] = True
     else:
         level = "county"
         framer.contest["is_statewide"] = False
     framer.contest["level"] = level
     if contest["is_judicial_contest"]:
         """
         This is a judicial appointee
         """
         if "SUPREME COURT" in contest["contest_title"]:
             contestname = "Supreme Court"
         elif "APPELLATE COURT" in contest["contest_title"]:
             contestname = "Courts of Appeal District 02"
         else:
             contestname = contest["contest_title"]
         officename = contestname
         framer.office["officename"] = officename
         framer.office["officeslug"] = slugify(officename)
         framer.office["active"] = True
         framer.office["officeid"] = framer.office["officeslug"]
         framer.contest["election_id"] = election.id
         framer.contest["resultsource_id"] = src.id
         framer.contest["seatnum"] = None
         framer.contest["is_uncontested"] = False
         framer.contest["is_national"] = False
         framer.contest["is_statewide"] = True
         framer.contest["level"] = "county"
         framer.contest["is_ballot_measure"] = False
         framer.contest["is_judicial"] = True
         framer.contest["is_runoff"] = False
         framer.contest["reporttype"] = None
         framer.contest["poss_error"] = False
         if framer._to_num(contest["total_precincts"])["convert"] == True:
             pt = framer._to_num(contest["total_precincts"])["value"]
             framer.contest["precinctstotal"] = pt
         else:
             framer.contest["precinctstotal"] = None
             raise Exception("precinctstotal is not a number")
         if framer._to_num(contest["precincts_reporting"])["convert"] == True:
             pr = framer._to_num(contest["precincts_reporting"])["value"]
             framer.contest["precinctsreporting"] = pr
         else:
             framer.contest["precinctsreporting"] = None
             raise Exception("precinctsreporting is not a number")
         framer.contest["precinctsreportingpct"] = framer._calc_pct(
             framer.contest["precinctsreporting"],
             framer.contest["precinctstotal"]
         )
         if framer._to_num(contest["registration"])["convert"] == True:
             framer.contest["votersregistered"] = framer._to_num(
                 contest["registration"])["value"]
         else:
             framer.contest["votersregistered"] = None
             raise Exception("votersregistered is not a number")
         framer.contest["votersturnout"] = None
         framer.contest["contestname"] = fixer._fix(contestname)
         framer.contest["contestdescription"] = None
         framer.contest["contestid"] = saver._make_contest_id(
             src.source_short,
             framer.contest["level"],
             framer.office["officeslug"],
         )
         race_log += saver.make_office(framer.office)
         race_log += saver.make_contest(framer.office, framer.contest)
         for judge in judges:
             fullname = fixer._titlecase_with_accents(judge["judicial_name"].encode('utf8'))
             framer.judicial["firstname"] = None
             framer.judicial["lastname"] = None
             framer.judicial["ballotorder"] = None
             framer.judicial["fullname"] = fullname
             framer.judicial["judicialslug"] = slugify(fullname)
             framer.judicial["description"] = judge["judicial_text"].title()
             framer.judicial["poss_error"] = False
             if framer._to_num(judge["yes_votes"])["convert"] == True:
                 yescount = framer._to_num(judge["yes_votes"])["value"]
                 framer.judicial["yescount"] = yescount
             else:
                 framer.judicial["yescount"] = None
                 raise Exception("yescount is not a number")
             if framer._to_num(judge["yes_percent"])["convert"] == True:
                 yespct = framer._to_num(judge["yes_percent"])["value"]
                 framer.judicial["yespct"] = yespct
             else:
                 framer.judicial["yespct"] = None
                 raise Exception("yespct is not a number")
             if framer._to_num(judge["no_votes"])["convert"] == True:
                 nocount = framer._to_num(judge["no_votes"])["value"]
                 framer.judicial["nocount"] = nocount
             else:
                 framer.judicial["nocount"] = None
                 raise Exception("nocount is not a number")
             if framer._to_num(judge["no_percent"])["convert"] == True:
                 nopct = framer._to_num(judge["no_percent"])["value"]
                 framer.judicial["nopct"] = nopct
             else:
                 framer.judicial["nopct"] = None
                 raise Exception("nopct is not a number")
             framer.judicial["judgeid"] = saver._make_this_id(
                 "judicial",
                 framer.contest["contestid"],
                 framer.judicial["judicialslug"],
             )
             race_log += saver.make_judicial(framer.contest, framer.judicial)
     elif contest["is_ballot_measure"]:
         """
         this is a ballot measure
         """
         framer.contest["level"] = "county"
         framer.contest["is_statewide"] = False
         contestname = contest["contest_title"]
         if contest["contest_id"] == "00":
             if contestname == "COUNTY MEASURE A":
                 this_type = "Measure"
                 contestname = "%swide" % (county_name)
                 contest["contest_title_cont"] = "Measure A"
             else:
                 this_type = "Proposition"
             contestname = contestname.replace("STATE MEASURE", "Proposition")
         else:
             this_type = "Measure"
             contestname = fixer._fix(contestname)
         contestname = contestname.title()
         if contestname == "Metro Transportation Authority":
             contestname = "%swide" % (county_name)
         if contest["contest_title_cont"]:
             fullname = (contest["contest_title_cont"]).replace("MEASURE", "Measure")
         else:
             fullname = contestname
         if contest["contest_id"] == "00":
             description = None
             officename = framer._concat(
                 # this_type,
                 contestname,
                 delimiter="-",
             )
         else:
             description = "%s %s" % (contestname, this_type)
             officename = framer._concat(
                 # this_type,
                 contestname,
                 delimiter="-",
             )
         framer.office["officename"] = officename
         framer.office["officeslug"] = slugify(officename)
         framer.office["active"] = True
         framer.office["officeid"] = framer.office["officeslug"]
         framer.contest["election_id"] = election.id
         framer.contest["resultsource_id"] = src.id
         framer.contest["seatnum"] = None
         framer.contest["is_uncontested"] = False
         framer.contest["is_national"] = False
         framer.contest["is_ballot_measure"] = True
         framer.contest["is_judicial"] = False
         framer.contest["is_runoff"] = False
         framer.contest["reporttype"] = None
         framer.contest["poss_error"] = False
         if framer._to_num(contest["total_precincts"])["convert"] == True:
             pt = framer._to_num(contest["total_precincts"])["value"]
             framer.contest["precinctstotal"] = pt
         else:
             framer.contest["precinctstotal"] = None
             raise Exception("precinctstotal is not a number")
         if framer._to_num(contest["precincts_reporting"])["convert"] == True:
             pr = framer._to_num(contest["precincts_reporting"])["value"]
             framer.contest["precinctsreporting"] = pr
         else:
             framer.contest["precinctsreporting"] = None
             raise Exception("precinctsreporting is not a number")
         framer.contest["precinctsreportingpct"] = framer._calc_pct(
             framer.contest["precinctsreporting"],
             framer.contest["precinctstotal"]
         )
         if framer._to_num(contest["registration"])["convert"] == True:
             framer.contest["votersregistered"] = framer._to_num(
                 contest["registration"])["value"]
         else:
             framer.contest["votersregistered"] = None
             raise Exception(
                 "votersregistered is not a number")
         framer.contest["votersturnout"] = None
         framer.contest["contestname"] = contestname
         framer.contest["contestdescription"] = description
         framer.contest["contestid"] = saver._make_contest_id(
             # election.electionid,
             src.source_short,
             framer.contest["level"],
             framer.office["officeslug"],
         )
         race_log += saver.make_office(framer.office)
         race_log += saver.make_contest(framer.office, framer.contest)
         for measure in measures:
             framer.measure["ballotorder"] = None
             framer.measure["fullname"] = fullname
             framer.measure["measureslug"] = slugify(fullname)
             framer.measure["description"] = measure["measure_text"].title()
             framer.measure["poss_error"] = False
             if framer._to_num(measure["yes_votes"])["convert"] == True:
                 yescount = framer._to_num(measure["yes_votes"])["value"]
                 framer.measure["yescount"] = yescount
             else:
                 framer.measure["yescount"] = None
                 raise Exception("yescount is not a number")
             if framer._to_num(measure["yes_percent"])["convert"] == True:
                 yespct = framer._to_num(measure["yes_percent"])["value"]
                 framer.measure["yespct"] = yespct
             else:
                 framer.measure["yespct"] = None
                 raise Exception("yespct is not a number")
             if framer._to_num(measure["no_votes"])["convert"] == True:
                 nocount = framer._to_num(measure["no_votes"])["value"]
                 framer.measure["nocount"] = nocount
             else:
                 framer.measure["nocount"] = None
                 raise Exception("nocount is not a number")
             if framer._to_num(measure["no_percent"])["convert"] == True:
                 nopct = framer._to_num(measure["no_percent"])["value"]
                 framer.measure["nopct"] = nopct
             else:
                 framer.measure["nopct"] = None
                 raise Exception("nopct is not a number")
             if this_type == "Proposition":
                 framer.measure["measureid"] = saver._make_this_id(
                     "measure",
                     "%s-%s" % (src.source_short, framer.contest["level"]),
                     "%s-%s" % (this_type.lower(), measure["measure_id"].lower())
                 )
             else:
                 framer.measure["measureid"] = saver._make_this_id(
                     "measure",
                     framer.contest["contestid"],
                     "%s-%s" % (measure["measure_id"].lower(), slugify(framer.measure["description"].lower()))
                 )
             race_log += saver.make_measure(framer.contest, framer.measure)
     else:
         """
         this is a candidate for elected office
         """
         strip_district = contest["district"].lstrip("0")
         framer.contest["seatnum"] = "1010101"
         if contest["contest_title"] == "MEMBER OF THE ASSEMBLY":
             contestname = "State Assembly District %s" % (strip_district)
         elif "SUPERVISOR" in contest["contest_title"]:
             contestname = "Supervisor District %s" % (strip_district)
             contestname = fixer._affix_county(county_name,contestname)
         elif "U.S. REPRESENTATIVE" in contest["contest_title"]:
             contestname = "U.S. House of Representatives District %s" % (strip_district)
         elif "DELEGATES" in contest["contest_title"]:
             designation = contest["contest_title_cont"].replace("CONGRESSIONAL DISTRICT-", "")
             if designation == "REP":
                 this_desig = "Republican"
             elif designation == "DEM":
                 this_desig = "Democratic"
             else:
                 this_desig = None
             contestname = "%s Presidential Primary Delegates - CD%s" % (this_desig, strip_district)
         elif "STATE SENATOR" in contest["contest_title"]:
             contestname = "State Senate District %s" % (strip_district)
         elif "UNITED STATES SENATOR" in contest["contest_title"]:
             contestname = "US Senate"
         elif "PRESIDENTIAL PREFERENCE" in contest["contest_title"]:
             designation = contest["contest_title_cont"].upper()
             if designation == "AI":
                 this_desig = "American Independent"
             elif designation == "REP":
                 this_desig = "Republican"
             elif designation == "DEM":
                 this_desig = "Democratic"
             elif designation == "PF":
                 this_desig = "Peace And Freedom"
             elif designation == "LIB":
                 this_desig = "Libertarian"
             elif designation == "GRN":
                 this_desig = "Green"
             else:
                 this_desig = None
             contestname = "%s Presidential Primary" % (this_desig)
         elif "PARTY COUNTY COMMITTEE" in contest["contest_title"]:
             contestname = "%s Party County Committee District %s" % (
                 contest["party_name"].capitalize(), strip_district)
         elif "JUDGE-SUPERIOR COURT" in contest["contest_title"]:
             contestname = "Judge Superior Court %s" % (contest["contest_title_cont"].title())
             contestname = fixer._affix_county(county_name, contestname)
         else:
             contestname = "%s %s" % (contest["contest_title"].title(), contest["contest_title_cont"].title())
         contestname = fixer._fix(contestname)
         contestname = contestname.title()
         contestname = framer._convert_district_number(contestname)
         framer.office["officename"] = contestname.replace(".", "")
         framer.office["officeslug"] = slugify(framer.office["officename"])
         framer.office["active"] = True
         framer.office["officeid"] = framer.office["officeslug"]
         framer.contest["election_id"] = election.id
         framer.contest["resultsource_id"] = src.id
         if len(candidates) < 2:
             framer.contest["is_uncontested"] = True
         else:
             framer.contest["is_uncontested"] = False
         framer.contest["is_national"] = False
         framer.contest["is_ballot_measure"] = False
         framer.contest["is_judicial"] = False
         framer.contest["is_runoff"] = False
         framer.contest["reporttype"] = None
         framer.contest["poss_error"] = False
         if framer._to_num(contest["total_precincts"])["convert"] == True:
             pt = framer._to_num(contest["total_precincts"])["value"]
             framer.contest["precinctstotal"] = pt
         else:
             framer.contest["precinctstotal"] = None
             raise Exception("precinctstotal is not a number")
         if framer._to_num(contest["precincts_reporting"])["convert"] == True:
             pr = framer._to_num(contest["precincts_reporting"])["value"]
             framer.contest["precinctsreporting"] = pr
         else:
             framer.contest["precinctsreporting"] = None
             raise Exception("precinctsreporting is not a number")
         framer.contest["precinctsreportingpct"] = framer._calc_pct(
             framer.contest["precinctsreporting"],
             framer.contest["precinctstotal"]
         )
         if framer._to_num(contest["registration"])["convert"] == True:
             framer.contest["votersregistered"] = framer._to_num(
                 contest["registration"])["value"]
         else:
             framer.contest["votersregistered"] = None
             raise Exception("votersregistered is not a number")
         framer.contest["votersturnout"] = None
         framer.contest["contestname"] = contestname
         try:
             framer.contest["contestdescription"] = contest[
                 "vote_for_text"].capitalize() + " " + contest["vote_for_number"]
         except:
             framer.contest["contestdescription"] = None
         framer.contest["contestid"] = saver._make_contest_id(
             src.source_short,
             framer.contest["level"],
             framer.office["officeslug"],
         )
         race_log += saver.make_office(framer.office)
         race_log += saver.make_contest(framer.office, framer.contest)
         for candidate in candidates:
             fullname = fixer._titlecase_with_accents(candidate["candidate_name"].encode('utf8'))
             party = candidate["party_short"]
             if party == "REP":
                 party = "Republican"
             elif party == "DEM":
                 party = "Democrat"
             elif party == "AI":
                 party = "American Independent"
             elif party == "PF":
                 party = "Peace And Freedom"
             elif party == "LIB":
                 party = "Libertarian"
             elif party == "GRN":
                 party = "Green"
             elif party == "NP":
                 party = "No Party Preference"
             framer.candidate["ballotorder"] = None
             framer.candidate["firstname"] = None
             framer.candidate["lastname"] = None
             framer.candidate["fullname"] = fullname
             framer.candidate["candidateslug"] = slugify(fullname)
             framer.candidate["party"] = party
             framer.candidate["incumbent"] = False
             framer.candidate["poss_error"] = False
             if framer._to_num(candidate["votes"])["convert"] == True:
                 framer.candidate["votecount"] = framer._to_num(candidate["votes"])["value"]
             else:
                 framer.candidate["votecount"] = None
                 raise Exception("votecount is not a number")
             if framer._to_num(candidate["percent_of_vote"])["convert"] == True:
                 framer.candidate["votepct"] = framer._to_num(candidate["percent_of_vote"])["value"]
             else:
                 framer.candidate["votepct"] = None
                 raise Exception("votepct is not a number")
             framer.candidate["candidateid"] = saver._make_this_id(
                 "candidate",
                 framer.contest["contestid"],
                 framer.candidate["candidateslug"],
             )
             race_log += saver.make_candidate(framer.contest, framer.candidate)
class BuildResults(object):
    """
    """
    saver = Saver()
    framer = Framer()
    fixer = Namefixer()

    state_measures = [
        "1656",
        "1682",
        "1683",
        "1684",
        "1685",
        "1687"
    ]

    state_recall = [
        "1655"
    ]

    local_measures = [
        "1687",
        "1688",
        "1689",
        "1690",
        "1691"
    ]

    # def _compile_judicial(self, race, race_id, election, src):
    #     """
    #     """
    #     r = race.find("TotalVotes")
    #     this_type = "judicial"
    #     contestname = unicode(" ".join(race.ContestName.stripped_strings))
    #     if race_id == "140":
    #         officename_idx = self.framer._find_nth(contestname, " - ", 1)
    #         officename = unicode(contestname[:officename_idx].replace(".", ""))
    #         officename = unicode(officename.replace(" Justice", ""))
    #         fullname_idx = self.framer._find_nth(contestname, " - ", 1) + 3
    #     elif race_id == "150":
    #         officename_idx = self.framer._find_nth(contestname, " - ", 2)
    #         officename = unicode(contestname[:officename_idx].replace(" - ", " "))
    #         fullname_idx = self.framer._find_nth(contestname, " - ", 2) + 3
    #     fullname = unicode(contestname[fullname_idx:])
    #     level = "county"
    #     seatnum = None
    #     is_statewide = True
    #     precinctstotal = r.find(attrs={"Id": "TP"}).contents[0]
    #     precinctsreport = r.find(attrs={"Id": "PR"}).contents[0]
    #     reporttype = r.find(attrs={"Id": "RT"}).contents[0]
    #     yescount = self.framer._to_num(r.find_all("Selection")[0].ValidVotes.contents[0])["value"]
    #     yespct = self.framer._to_num(r.find(attrs={"Id": "PYV"}).contents[0])["value"]
    #     nocount = self.framer._to_num(r.find_all("Selection")[1].ValidVotes.contents[0])["value"]
    #     nopct = self.framer._to_num(r.find(attrs={"Id": "PNV"}).contents[0])["value"]
    #     self.framer.office["officename"] = officename
    #     self.framer.office["officeslug"] = slugify(officename)
    #     self.framer.office["active"] = True
    #     self.framer.office["officeid"] = self.framer.office["officeslug"]
    #     self.framer.contest["election_id"] = election.id
    #     self.framer.contest["resultsource_id"] = src.id
    #     self.framer.contest["seatnum"] = seatnum
    #     self.framer.contest["is_uncontested"] = False
    #     self.framer.contest["is_national"] = False
    #     self.framer.contest["is_statewide"] = True
    #     self.framer.contest["level"] = level
    #     self.framer.contest["is_ballot_measure"] = False
    #     self.framer.contest["is_judicial"] = True
    #     self.framer.contest["is_runoff"] = False
    #     self.framer.contest["reporttype"] = None
    #     self.framer.contest["poss_error"] = False
    #     if self.framer._to_num(precinctstotal)["convert"] == True:
    #         pt = self.framer._to_num(precinctstotal)["value"]
    #         self.framer.contest["precinctstotal"] = pt
    #     else:
    #         self.framer.contest["precinctstotal"] = None
    #         raise Exception("precinctstotal is not a number")
    #     if self.framer._to_num(precinctsreport)["convert"] == True:
    #         pr = self.framer._to_num(precinctsreport)["value"]
    #         self.framer.contest["precinctsreporting"] = pr
    #     else:
    #         self.framer.contest["precinctsreporting"] = None
    #         raise Exception("precinctsreporting is not a number")
    #     self.framer.contest["precinctsreportingpct"] = self.framer._calc_pct(
    #         self.framer.contest["precinctsreporting"], self.framer.contest["precinctstotal"])
    #     self.framer.contest["votersregistered"] = self.framer._to_num(None)["value"]
    #     self.framer.contest["votersturnout"] = self.framer._to_num(None)["value"]
    #     self.framer.contest["contestname"] = self.framer.office["officename"]
    #     self.framer.contest["contestdescription"] = None
    #     if race_id == "140":
    #         self.framer.contest["contestid"] = self.saver._make_contest_id(
    #             # election.electionid,
    #             src.source_short,
    #             self.framer.contest["level"],
    #             self.framer.office["officeslug"],
    #         )
    #         self.framer.judicial["ballotorder"] = None
    #         self.framer.judicial["firstname"] = None
    #         self.framer.judicial["lastname"] = None
    #         self.framer.judicial["fullname"] = fullname
    #         self.framer.judicial["judicialslug"] = slugify(fullname)
    #         self.framer.judicial["yescount"] = yescount
    #         self.framer.judicial["yespct"] = yespct
    #         self.framer.judicial["nocount"] = nocount
    #         self.framer.judicial["nopct"] = nopct
    #         self.framer.judicial["poss_error"] = False
    #         self.framer.judicial["judgeid"] = self.saver._make_this_id(
    #             "judicial",
    #             self.framer.contest["contestid"],
    #             self.framer.judicial["judicialslug"],
    #         )
    #     elif race_id == "150":
    #         self.framer.contest["contestid"] = self.saver._make_contest_id(
    #             # election.electionid,
    #             src.source_short,
    #             self.framer.contest["level"],
    #             self.framer.office["officeslug"],
    #         )
    #         self.framer.judicial["ballotorder"] = None
    #         self.framer.judicial["firstname"] = None
    #         self.framer.judicial["lastname"] = None
    #         self.framer.judicial["fullname"] = fullname
    #         self.framer.judicial["judicialslug"] = slugify(fullname)
    #         self.framer.judicial["yescount"] = yescount
    #         self.framer.judicial["yespct"] = yespct
    #         self.framer.judicial["nocount"] = nocount
    #         self.framer.judicial["nopct"] = nopct
    #         self.framer.judicial["poss_error"] = False
    #         self.framer.judicial["judgeid"] = self.saver._make_this_id(
    #             "judicial",
    #             self.framer.contest["contestid"],
    #             self.framer.judicial["judicialslug"],
    #         )
    #     return self.framer

    def _compile_measure(self, race, election, src):
        """
        """
        r = race
        if r.attrs["race_id"] in self.local_measures:
            this_type = "Advisory Vote"
        elif race.attrs["race_id"] in self.state_measures:
            this_type = "Proposition"
        elif race.attrs["race_id"] in self.state_recall:
            this_type = "Recall"
        else:
            this_type = "Measure"
        fixed = self.fixer._fix_oc_props(this_type, race.attrs["contest_title"])
        prop_num = fixed["prop_num"]
        measure_fullname = fixed["measure_fullname"]
        description = fixed["description"]
        this_type = fixed["type"]
        if this_type == "Proposition":
            officename = self.framer._concat(
                this_type,
                prop_num,
                delimiter=" ",
            )
        elif this_type == "Measure" or this_type == "Advisory Vote":
            officename = self.framer._concat(
                fixed["district"],
                delimiter=" ",
            )
        else:
            officename = self.framer._concat(
                fixed["district"],
                delimiter=" ",
            )
        level = "county"
        seatnum = None
        precinctstotal = race.attrs["total_precincts"]
        precinctsreport = race.attrs["counted_precincts"]
        vote_counts = race.find_all("ChoiceTotal")
        yescount = self.framer._to_num(vote_counts[0].attrs["c_total_votes"])["value"]
        nocount = self.framer._to_num(vote_counts[1].attrs["c_total_votes"])["value"]
        total = yescount + nocount
        yespct = self.framer._calc_pct(yescount, total)
        nopct = self.framer._calc_pct(nocount, total)
        self.framer.office["officename"] = officename
        self.framer.office["officeslug"] = slugify(officename)
        self.framer.office["active"] = True
        self.framer.office["officeid"] = self.framer.office["officeslug"]
        self.framer.contest["election_id"] = election.id
        self.framer.contest["resultsource_id"] = src.id
        self.framer.contest["seatnum"] = seatnum
        self.framer.contest["is_uncontested"] = False
        self.framer.contest["is_national"] = False
        self.framer.contest["is_statewide"] = False
        self.framer.contest["level"] = level
        self.framer.contest["is_ballot_measure"] = True
        self.framer.contest["is_judicial"] = False
        self.framer.contest["is_runoff"] = False
        self.framer.contest["reporttype"] = None
        self.framer.contest["poss_error"] = False
        if self.framer._to_num(precinctstotal)["convert"] == True:
            pt = self.framer._to_num(precinctstotal)["value"]
            self.framer.contest["precinctstotal"] = pt
        else:
            self.framer.contest["precinctstotal"] = None
            raise Exception("precinctstotal is not a number")
        if self.framer._to_num(precinctsreport)["convert"] == True:
            pr = self.framer._to_num(precinctsreport)["value"]
            self.framer.contest["precinctsreporting"] = pr
        else:
            self.framer.contest["precinctsreporting"] = None
            raise Exception("precinctsreporting is not a number")
        self.framer.contest["precinctsreportingpct"] = self.framer._calc_pct(
            self.framer.contest["precinctsreporting"],
            self.framer.contest["precinctstotal"]
        )
        self.framer.contest["votersregistered"] = self.framer._to_num(race.attrs["reg_voters"])["value"]
        self.framer.contest["votersturnout"] = self.framer._to_num(None)["value"]
        self.framer.measure["ballotorder"] = None
        self.framer.measure["fullname"] = measure_fullname
        self.framer.measure["description"] = description
        self.framer.measure["yescount"] = yescount
        self.framer.measure["yespct"] = yespct
        self.framer.measure["nocount"] = nocount
        self.framer.measure["nopct"] = nopct
        self.framer.measure["poss_error"] = False
        if this_type == "Proposition":
            self.framer.contest["contestname"] = self.framer._concat(
                officename,
                delimiter=" ",
            )
            self.framer.measure["measureid"] = self.saver._make_this_id(
                "measure",
                "%s-%s" % (src.source_short, self.framer.contest["level"]),
                slugify(measure_fullname),
            )
        elif this_type == "":
            self.framer.contest["contestname"] = self.framer._concat(
                officename,
                delimiter=" ",
            )
            self.framer.measure["measureid"] = self.saver._make_this_id(
                "measure",
                "%s-%s-%s" % (src.source_short, self.framer.contest["level"], fixed["district"]),
                slugify(measure_fullname),
            )
        else:
            self.framer.contest["contestname"] = self.framer._concat(
                officename,
                delimiter=" ",
            )
            self.framer.measure["measureid"] = self.saver._make_this_id(
                "measure",
                "%s-%s-%s" % (src.source_short, self.framer.contest["level"], fixed["district"]),
                slugify(measure_fullname),
            )

        self.framer.contest["contestdescription"] = self.framer._concat(
            officename,
            this_type,
            delimiter=" ",
        )
        self.framer.contest["contestid"] = self.saver._make_contest_id(
            src.source_short,
            self.framer.contest["level"],
            self.framer.office["officeslug"],
        )
        return self.framer

    def _compile_candidate(self, race, election, src):
        """
        """
        this_type = "candidate"
        officename = unicode(race.attrs["contest_title"].title())
        if "United States Representative" in officename:
            cleaning_name = officename.replace("United States Representative", "US House of Representatives")
            cleaning_name = cleaning_name.replace(" District", "")
            cleaning_name = cleaning_name.replace("US House of Representatives ", "")
            district_seat = cleaning_name[0:2]
            officename = "US House of Representatives District %s" % (district_seat)
        if "Member Of The State Assembly" in officename:
            cleaning_name = officename.replace("Member Of The State Assembly", "State Assembly")
            cleaning_name = cleaning_name.replace(" District", "")
            cleaning_name = cleaning_name.replace("State Assembly ", "")
            district_seat = cleaning_name[0:2]
            officename = "State Assembly District %s" % (district_seat)
        if "State Senator" in officename:
            cleaning_name = officename.replace("State Senator", "State Senate")
            cleaning_name = cleaning_name.replace(" District", "")
            cleaning_name = cleaning_name.replace("State Senate ", "")
            district_seat = cleaning_name[0:2]
            officename = "State Senate District %s" % (district_seat)
        if "United States Senator" in officename:
            officename = "US Senate"
        if "President And Vice President" in officename:
            officename = "President-Vice President"
        description = unicode(officename)
        prop_num = None
        level = "county"
        seatnum = None
        precinctstotal = race.attrs["total_precincts"]
        precinctsreport = race.attrs["counted_precincts"]
        reporttype = None
        poss_error = False
        self.framer.office["officename"] = officename
        self.framer.office["officeslug"] = slugify(officename)
        self.framer.office["active"] = True
        self.framer.office["officeid"] = self.framer.office["officeslug"]
        self.framer.contest["election_id"] = election.id
        self.framer.contest["resultsource_id"] = src.id
        self.framer.contest["seatnum"] = seatnum
        self.framer.contest["is_uncontested"] = False
        self.framer.contest["is_national"] = False
        self.framer.contest["is_statewide"] = False
        self.framer.contest["level"] = level
        self.framer.contest["is_ballot_measure"] = False
        self.framer.contest["is_judicial"] = False
        self.framer.contest["is_runoff"] = False
        self.framer.contest["reporttype"] = reporttype
        self.framer.contest["poss_error"] = poss_error
        if self.framer._to_num(precinctstotal)["convert"] == True:
            pt = self.framer._to_num(precinctstotal)["value"]
            self.framer.contest["precinctstotal"] = pt
        else:
            self.framer.contest["precinctstotal"] = None
            raise Exception("precinctstotal is not a number")
        if self.framer._to_num(precinctsreport)["convert"] == True:
            pr = self.framer._to_num(precinctsreport)["value"]
            self.framer.contest["precinctsreporting"] = pr
        else:
            self.framer.contest["precinctsreporting"] = None
            raise Exception("precinctsreporting is not a number")
        self.framer.contest["precinctsreportingpct"] = self.framer._calc_pct(
            self.framer.contest["precinctsreporting"],
            self.framer.contest["precinctstotal"]
        )
        self.framer.contest["votersregistered"] = self.framer._to_num(race.attrs["reg_voters"])["value"]
        self.framer.contest["votersturnout"] = self.framer._to_num(None)["value"]
        self.framer.contest["contestdescription"] = None
        self.framer.contest["contestid"] = self.saver._make_contest_id(
            # election.electionid,
            src.source_short,
            self.framer.contest["level"],
            self.framer.office["officeslug"],
        )
        if self.framer.contest["contestid"] == "oc-county-county-supervisor-1st-district":
            self.framer.contest["contestname"] = "Orange County Supervisor District 5"
        else:
            self.framer.contest["contestname"] = self.framer.office["officename"]
        self.framer.candidates = []
        for candidate in race.find_all("ChoiceTotal"):
            this_candidate = {}
            fullname = candidate.attrs["candidate_name"].encode('utf8')
            fullname = self.fixer._titlecase_with_accents(fullname)
            party = unicode(candidate.attrs["party"].title())
            if party == "Democratic" or party == "Dem":
                party = "Democrat"
            elif party == "Rep":
                party = "Republican"
            elif party == "Grn":
                party = "Green"
            elif party == "P-F":
                party = "Peace and Freedom"
            elif party == "Lib":
                party = "Libertarian"
            elif party == "AI" or party == "A-I" or party == "Ind":
                party = "American Independent"
            votecount = self.framer._to_num(candidate.attrs["c_total_votes"])["value"]
            votepct = 0
            this_candidate["ballotorder"] = candidate.attrs["cand_Seq_nbr"]
            this_candidate["firstname"] = None
            this_candidate["lastname"] = None
            this_candidate["fullname"] = fullname.replace("* ", "")
            this_candidate["candidateslug"] = slugify(fullname)
            this_candidate["party"] = party
            this_candidate["incumbent"] = False
            this_candidate["votecount"] = votecount
            this_candidate["votepct"] = votepct
            this_candidate["poss_error"] = False
            this_candidate["candidateid"] = self.saver._make_this_id(
                "candidate",
                self.framer.contest["contestid"],
                this_candidate["candidateslug"],
            )
            self.framer.candidates.append(this_candidate)
        return self.framer
 def parse_results_file(self, src, data_directory):
     """
     """
     saver = Saver()
     compiler = BuildResults()
     latest_directory = "%s%s_latest" % (data_directory, src.source_short)
     election = Election.objects.filter(electionid=src.election.electionid).first()
     for file in src.source_files.split(", "):
         latest_path = os.path.join(latest_directory, file)
         file_exists = os.path.isfile(latest_path)
         file_has_size = os.path.getsize(latest_path)
         if file_exists == True and file_has_size > 0:
             soup = BeautifulSoup(open(latest_path), "xml")
             file_timestring = unicode(soup.find("IssueDate").contents[0])
             file_timestamp = parse(file_timestring, dayfirst=False).datetime
             if self.testing == True:
                 update_this = self.testing
             else:
                 update_this = saver._eval_timestamps(file_timestamp, src.source_latest)
             if update_this == False:
                 logger.info("\n*****\nwe have newer data in the database so let's delete these files\n*****")
                 os.remove(latest_path)
             else:
                 logger.info("\n*****\nwe have new data so we'll update timestamps in the database\n*****")
                 saver._update_result_timestamps(src, file_timestamp)
                 races = soup.find_all("Contest")
                 race_log = "\n"
                 proposition_ids = [
                     "190000000068",
                     "190000000069",
                     "190000000070",
                     "190000000071",
                     "190000000072"
                 ]
                 for race in races:
                     # if race.ContestIdentifier.attrs["IdNumber"][0:3] == "140":
                     #     """
                     #     this is a judicial candidate
                     #     """
                     #     result = compiler._compile_judicial(race, "140", election, src)
                     #     race_log += saver.make_office(result.office)
                     #     race_log += saver.make_contest(result.office, result.contest)
                     #     race_log += saver.make_judicial(result.contest, result.judicial)
                     # elif race.ContestIdentifier.attrs["IdNumber"][0:3] == "150":
                     #     """
                     #     this is a judicial candidate
                     #     """
                     #     result = compiler._compile_judicial(race, "150", election, src)
                     #     race_log += saver.make_office(result.office)
                     #     race_log += saver.make_contest(result.office, result.contest)
                     #     race_log += saver.make_judicial(result.contest, result.judicial)
                     if race.ContestIdentifier.attrs["IdNumber"] in proposition_ids:
                         """
                         this is a proposition
                         """
                         result = compiler._compile_measure(race, election, src)
                         race_log += saver.make_office(result.office)
                         race_log += saver.make_contest(result.office, result.contest)
                         race_log += saver.make_measure(result.contest, result.measure)
                     else:
                         """
                         this is a non-judicial candidate
                         """
                         result = compiler._compile_candidate(race, election, src)
                         race_log += saver.make_office(result.office)
                         race_log += saver.make_contest(result.office, result.contest)
                     for candidate in result.candidates:
                         race_log += saver.make_candidate(result.contest, candidate)
                 #logger.info(race_log)
                 os.remove(latest_path)
                 logger.info("\n*****\nwe've finished processing sos results\n*****")
         else:
             logger.error("XML file to parse is not at expected location")
class BuildResults(object):
    """
    """
    saver = Saver()
    framer = Framer()
    fixer = Namefixer()

    def _compile_judicial(self, race, race_id, election, src):
        """
        """
        r = race.find("TotalVotes")
        this_type = "judicial"
        contestname = unicode(" ".join(race.ContestName.stripped_strings))
        if race_id == "140":
            officename_idx = self.framer._find_nth(contestname, " - ", 1)
            officename = unicode(contestname[:officename_idx].replace(".", ""))
            officename = unicode(officename.replace(" Justice", ""))
            fullname_idx = self.framer._find_nth(contestname, " - ", 1) + 3
        elif race_id == "150":
            officename_idx = self.framer._find_nth(contestname, " - ", 2)
            officename = unicode(
                contestname[:officename_idx].replace(" - ", " "))
            fullname_idx = self.framer._find_nth(contestname, " - ", 2) + 3
        fullname = unicode(contestname[fullname_idx:])
        level = "california"
        seatnum = None
        is_statewide = True
        precinctstotal = r.find(attrs={"Id": "TP"}).contents[0]
        precinctsreport = r.find(attrs={"Id": "PR"}).contents[0]
        reporttype = r.find(attrs={"Id": "RT"}).contents[0]
        yescount = self.framer._to_num(r.find_all("Selection")[0].ValidVotes.contents[0])["value"]
        yespct = self.framer._to_num(r.find(attrs={"Id": "PYV"}).contents[0])["value"]
        nocount = self.framer._to_num(r.find_all("Selection")[1].ValidVotes.contents[0])["value"]
        nopct = self.framer._to_num(r.find(attrs={"Id": "PNV"}).contents[0])["value"]
        self.framer.office["officename"] = officename
        self.framer.office["officeslug"] = slugify(officename)
        self.framer.office["active"] = True
        self.framer.office["officeid"] = self.framer.office["officeslug"]
        self.framer.contest["election_id"] = election.id
        self.framer.contest["resultsource_id"] = src.id
        self.framer.contest["seatnum"] = seatnum
        self.framer.contest["is_uncontested"] = False
        self.framer.contest["is_national"] = False
        self.framer.contest["is_statewide"] = True
        self.framer.contest["level"] = level
        self.framer.contest["is_ballot_measure"] = False
        self.framer.contest["is_judicial"] = True
        self.framer.contest["is_runoff"] = False
        self.framer.contest["reporttype"] = None
        self.framer.contest["poss_error"] = False
        if self.framer._to_num(precinctstotal)["convert"] == True:
            pt = self.framer._to_num(precinctstotal)["value"]
            self.framer.contest["precinctstotal"] = pt
        else:
            self.framer.contest["precinctstotal"] = None
            raise Exception("precinctstotal is not a number")
        if self.framer._to_num(precinctsreport)["convert"] == True:
            pr = self.framer._to_num(precinctsreport)["value"]
            self.framer.contest["precinctsreporting"] = pr
        else:
            self.framer.contest["precinctsreporting"] = None
            raise Exception("precinctsreporting is not a number")
        self.framer.contest["precinctsreportingpct"] = self.framer._calc_pct(self.framer.contest["precinctsreporting"], self.framer.contest["precinctstotal"])
        self.framer.contest["votersregistered"] = self.framer._to_num(None)["value"]
        self.framer.contest["votersturnout"] = self.framer._to_num(None)["value"]
        self.framer.contest["contestname"] = self.framer.office["officename"]
        self.framer.contest["contestdescription"] = None
        if race_id == "140":
            self.framer.contest["contestid"] = self.saver._make_contest_id(
                # election.electionid,
                src.source_short,
                self.framer.contest["level"],
                self.framer.office["officeslug"],
            )
            self.framer.judicial["ballotorder"] = None
            self.framer.judicial["firstname"] = None
            self.framer.judicial["lastname"] = None
            self.framer.judicial["fullname"] = fullname
            self.framer.judicial["judicialslug"] = slugify(fullname)
            self.framer.judicial["yescount"] = yescount
            self.framer.judicial["yespct"] = yespct
            self.framer.judicial["nocount"] = nocount
            self.framer.judicial["nopct"] = nopct
            self.framer.judicial["poss_error"] = False
            self.framer.judicial["judgeid"] = self.saver._make_this_id(
                "judicial",
                self.framer.contest["contestid"],
                self.framer.judicial["judicialslug"],
            )
        elif race_id == "150":
            self.framer.contest["contestid"] = self.saver._make_contest_id(
                # election.electionid,
                src.source_short,
                self.framer.contest["level"],
                self.framer.office["officeslug"],
            )
            self.framer.judicial["ballotorder"] = None
            self.framer.judicial["firstname"] = None
            self.framer.judicial["lastname"] = None
            self.framer.judicial["fullname"] = fullname
            self.framer.judicial["judicialslug"] = slugify(fullname)
            self.framer.judicial["yescount"] = yescount
            self.framer.judicial["yespct"] = yespct
            self.framer.judicial["nocount"] = nocount
            self.framer.judicial["nopct"] = nopct
            self.framer.judicial["poss_error"] = False
            self.framer.judicial["judgeid"] = self.saver._make_this_id(
                "judicial",
                self.framer.contest["contestid"],
                self.framer.judicial["judicialslug"],
            )
        return self.framer

    def _compile_measure(self, race, election, src):
        """
        """
        r = race.find("TotalVotes")
        this_type = "Proposition"
        fullname = unicode(race.ContestName.contents[0].replace(".", ""))
        description = unicode(" ".join(race.ContestName.stripped_strings).replace(".", ""))
        prop_num = self.framer._get_prop_number(race.ContestIdentifier.attrs["IdNumber"], "190")
        officename = self.framer._concat(
            this_type,
            prop_num,
            delimiter=" ",
        )
        level = None
        seatnum = None
        precinctstotal = r.find(attrs={"Id": "TP"}).contents[0]
        precinctsreport = r.find(attrs={"Id": "PR"}).contents[0]
        reporttype = r.find(attrs={"Id": "RT"}).contents[0]
        yescount = self.framer._to_num(r.find_all("Selection")[0].ValidVotes.contents[0])["value"]
        yespct = self.framer._to_num(r.find(attrs={"Id": "PYV"}).contents[0])["value"]
        nocount = self.framer._to_num(r.find_all("Selection")[1].ValidVotes.contents[0])["value"]
        nopct = self.framer._to_num(r.find(attrs={"Id": "PNV"}).contents[0])["value"]
        self.framer.office["officename"] = officename
        self.framer.office["officeslug"] = slugify(officename)
        self.framer.office["active"] = True
        self.framer.office["officeid"] = self.framer.office["officeslug"]
        self.framer.contest["election_id"] = election.id
        self.framer.contest["resultsource_id"] = src.id
        self.framer.contest["seatnum"] = seatnum
        self.framer.contest["is_uncontested"] = False
        self.framer.contest["is_national"] = False
        self.framer.contest["is_statewide"] = True
        self.framer.contest["level"] = "california"
        self.framer.contest["is_ballot_measure"] = True
        self.framer.contest["is_judicial"] = False
        self.framer.contest["is_runoff"] = False
        self.framer.contest["reporttype"] = None
        self.framer.contest["poss_error"] = False
        if self.framer._to_num(precinctstotal)["convert"] == True:
            pt = self.framer._to_num(precinctstotal)["value"]
            self.framer.contest["precinctstotal"] = pt
        else:
            self.framer.contest["precinctstotal"] = None
            raise Exception("precinctstotal is not a number")
        if self.framer._to_num(precinctsreport)["convert"] == True:
            pr = self.framer._to_num(precinctsreport)["value"]
            self.framer.contest["precinctsreporting"] = pr
        else:
            self.framer.contest["precinctsreporting"] = None
            raise Exception(
                "precinctsreporting is not a number")
        self.framer.contest["precinctsreportingpct"] = self.framer._calc_pct(
            self.framer.contest["precinctsreporting"],
            self.framer.contest["precinctstotal"]
        )
        self.framer.contest["votersregistered"] = self.framer._to_num(None)["value"]
        self.framer.contest["votersturnout"] = self.framer._to_num(None)["value"]
        self.framer.contest["contestname"] = self.framer._concat(
            officename,
            fullname,
            delimiter=" ",
        )
        self.framer.contest["contestdescription"] = description
        self.framer.contest["contestid"] = self.saver._make_contest_id(
            # election.electionid,
            src.source_short,
            self.framer.contest["level"],
            self.framer.office["officeslug"],
        )
        self.framer.measure["ballotorder"] = None
        self.framer.measure["fullname"] = officename
        self.framer.measure["measureslug"] = slugify(self.framer.contest["contestname"])
        self.framer.measure["description"] = description
        self.framer.measure["yescount"] = yescount
        self.framer.measure["yespct"] = yespct
        self.framer.measure["nocount"] = nocount
        self.framer.measure["nopct"] = nopct
        self.framer.measure["poss_error"] = False
        self.framer.measure["measureid"] = self.saver._make_this_id(
            "measure",
            self.framer.contest["contestid"],
            slugify(self.framer.measure["description"]),
        )
        return self.framer

    def _compile_candidate(self, race, election, src):
        """
        """
        r = race.find("TotalVotes")
        this_type = "candidate"
        contestname = unicode(" ".join(race.ContestName.stripped_strings))
        officename_idx = self.framer._find_nth(contestname, " - ", 1)
        officename = unicode(contestname[:officename_idx].replace(".", ""))
        if "United States Representative" in officename:
            officename = officename.replace("United States Representative", "US House of Representatives")
        if "State Assembly Member" in officename:
            officename = officename.replace("State Assembly Member", "State Assembly")
        level_idx = self.framer._find_nth(contestname, " - ", 1) + 3
        level = unicode(contestname[level_idx:].replace(" Results", "").lower())
        seatnum = None
        precinctstotal = r.find(attrs={"Id": "TP"}).contents[0]
        precinctsreport = r.find(attrs={"Id": "PR"}).contents[0]
        reporttype = r.find(attrs={"Id": "RT"}).contents[0]
        self.framer.office["officename"] = officename
        self.framer.office["officeslug"] = slugify(officename)
        self.framer.office["active"] = True
        self.framer.office["officeid"] = self.framer.office["officeslug"]
        self.framer.contest["election_id"] = election.id
        self.framer.contest["resultsource_id"] = src.id
        self.framer.contest["seatnum"] = seatnum
        self.framer.contest["is_uncontested"] = False
        self.framer.contest["is_national"] = False
        self.framer.contest["is_statewide"] = True
        self.framer.contest["level"] = level
        self.framer.contest["is_ballot_measure"] = False
        self.framer.contest["is_judicial"] = False
        self.framer.contest["is_runoff"] = False
        self.framer.contest["reporttype"] = None
        self.framer.contest["poss_error"] = False
        if self.framer._to_num(precinctstotal)["convert"] == True:
            pt = self.framer._to_num(precinctstotal)["value"]
            self.framer.contest["precinctstotal"] = pt
        else:
            self.framer.contest["precinctstotal"] = None
            raise Exception("precinctstotal is not a number")
        if self.framer._to_num(precinctsreport)["convert"] == True:
            pr = self.framer._to_num(precinctsreport)["value"]
            self.framer.contest["precinctsreporting"] = pr
        else:
            self.framer.contest["precinctsreporting"] = None
            raise Exception("precinctsreporting is not a number")
        self.framer.contest["precinctsreportingpct"] = self.framer._calc_pct(
            self.framer.contest["precinctsreporting"],
            self.framer.contest["precinctstotal"]
        )
        self.framer.contest["votersregistered"] = self.framer._to_num(None)["value"]
        self.framer.contest["votersturnout"] = self.framer._to_num(None)["value"]
        self.framer.contest["contestname"] = self.framer.office["officename"]
        self.framer.contest["contestdescription"] = None
        self.framer.contest["contestid"] = self.saver._make_contest_id(
            # election.electionid,
            src.source_short,
            self.framer.contest["level"],
            self.framer.office["officeslug"],
        )
        self.framer.candidates = []
        for candidate in r.find_all("Selection"):
            this_candidate = {}
            fullname = candidate.Candidate.CandidateFullName.PersonFullName.contents[0].encode('utf8')
            fullname = self.fixer._titlecase_with_accents(fullname)
            party = unicode(candidate.AffiliationIdentifier.RegisteredName.contents[0])
            if party == "Democratic":
                party = "Democrat"
            votecount = self.framer._to_num(candidate.ValidVotes.contents[0])["value"]
            votepct = self.framer._to_num(candidate.CountMetric.contents[0])["value"]
            this_candidate["ballotorder"] = None
            this_candidate["firstname"] = None
            this_candidate["lastname"] = None
            this_candidate["fullname"] = fullname
            this_candidate["candidateslug"] = slugify(fullname)
            this_candidate["party"] = party
            this_candidate["incumbent"] = False
            this_candidate["votecount"] = votecount
            this_candidate["votepct"] = votepct
            this_candidate["poss_error"] = False
            this_candidate["candidateid"] = self.saver._make_this_id(
                "candidate",
                self.framer.contest["contestid"],
                this_candidate["candidateslug"],
            )
            self.framer.candidates.append(this_candidate)
        return self.framer
 def parse_results_file(self, src, data_directory):
     """
     """
     saver = Saver()
     process = LacProcessMethods()
     latest_directory = "%s%s_latest" % (data_directory, src.source_short)
     election = Election.objects.filter(
         electionid=src.election.electionid).first()
     for file in src.source_files.split(", "):
         latest_path = os.path.join(latest_directory, file)
         file_exists = os.path.isfile(latest_path)
         file_has_size = os.path.getsize(latest_path)
         if file_exists == True and file_has_size > 0:
             rows = process.open_results_file(latest_path)
             race_ids = process.get_race_ids_from(rows)
             election_package = process.collate_and_fetch_records_for_race(
                 race_ids, rows)
             races = election_package[0]
             election_title = election_package[1]["title"]
             election_stats = election_package[1]["stats"]
             file_timestring = None
             file_timestamp = None
             pacific = pytz.timezone("US/Pacific")
             for t in election_title:
                 if t[3:5] == "TD":
                     parser = TD_parser()
                     parsed = parser.parse_line(t)
                     timestring = parsed["date"] + " " + parsed["time"]
                     file_timestring = timestring
             if file_timestring:
                 file_timestamp = parse(file_timestring,
                                        dayfirst=False).datetime
                 file_timestamp = file_timestamp.replace(tzinfo=pacific)
                 if self.testing == True:
                     update_this = self.testing
                 else:
                     update_this = saver._eval_timestamps(
                         file_timestamp, src.source_latest)
                 if update_this == False:
                     logger.info(
                         "\n*****\nwe have newer data in the database so let's delete these files\n*****"
                     )
                     os.remove(latest_path)
                 else:
                     logger.info(
                         "\n*****\nwe have new data to save and we'll update timestamps in the database\n*****"
                     )
                     saver._update_result_timestamps(src, file_timestamp)
                     title = process.dictify_records_and_return(
                         election_title)
                     stats = process.dictify_records_and_return(
                         election_stats)
                     election_info = process.compile_election_stats(
                         title, stats)
                     for r in races:
                         records = process.dictify_records_and_return(
                             races[r])
                         """
                         checks to see if this is a recall contest or a nonpartisan contest
                         for now, it's unclear how to store or display these contests
                         in future, however, we may want to parse and return their results
                         """
                         skip = process.check_if_recall_or_nonpartisan(
                             records)
                         if skip:
                             pass
                         else:
                             contest_package = process.compile_contest_results(
                                 records)
                             process.update_database(
                                 contest_package, election, src)
                     logger.info("we've finished processing lac results")
             else:
                 logger.error(
                     "unable to determine whether this data is newer than what we already have."
                 )
 def update_database(self, contest_package, election, src):
     """ import candidates, measures, office and contest info from compiled data """
     saver = Saver()
     framer = Framer()
     fixer = Namefixer()
     county_name = "Los Angeles County"
     contest = contest_package["contest_details"]
     candidates = contest_package["candidates"]
     measures = contest_package["measures"]
     judges = contest_package["judges"]
     race_log = "\n"
     # """
     # Check level of contest (i.e. local, statewide)
     # """
     if "U.S." in contest["contest_title"] or "STATE" in contest[
             "contest_title"]:
         level = "county"
         framer.contest["is_statewide"] = True
     else:
         level = "county"
         framer.contest["is_statewide"] = False
     framer.contest["level"] = level
     if contest["is_judicial_contest"]:
         """
         This is a judicial appointee
         """
         if "SUPREME COURT" in contest["contest_title"]:
             contestname = "Supreme Court"
         elif "APPELLATE COURT" in contest["contest_title"]:
             contestname = "Courts of Appeal District 02"
         else:
             contestname = contest["contest_title"]
         officename = contestname
         framer.office["officename"] = officename
         framer.office["officeslug"] = slugify(officename)
         framer.office["active"] = True
         framer.office["officeid"] = framer.office["officeslug"]
         framer.contest["election_id"] = election.id
         framer.contest["resultsource_id"] = src.id
         framer.contest["seatnum"] = None
         framer.contest["is_uncontested"] = False
         framer.contest["is_national"] = False
         framer.contest["is_statewide"] = True
         framer.contest["level"] = "county"
         framer.contest["is_ballot_measure"] = False
         framer.contest["is_judicial"] = True
         framer.contest["is_runoff"] = False
         framer.contest["reporttype"] = None
         framer.contest["poss_error"] = False
         if framer._to_num(contest["total_precincts"])["convert"] == True:
             pt = framer._to_num(contest["total_precincts"])["value"]
             framer.contest["precinctstotal"] = pt
         else:
             framer.contest["precinctstotal"] = None
             raise Exception("precinctstotal is not a number")
         if framer._to_num(
                 contest["precincts_reporting"])["convert"] == True:
             pr = framer._to_num(contest["precincts_reporting"])["value"]
             framer.contest["precinctsreporting"] = pr
         else:
             framer.contest["precinctsreporting"] = None
             raise Exception("precinctsreporting is not a number")
         framer.contest["precinctsreportingpct"] = framer._calc_pct(
             framer.contest["precinctsreporting"],
             framer.contest["precinctstotal"])
         if framer._to_num(contest["registration"])["convert"] == True:
             framer.contest["votersregistered"] = framer._to_num(
                 contest["registration"])["value"]
         else:
             framer.contest["votersregistered"] = None
             raise Exception("votersregistered is not a number")
         framer.contest["votersturnout"] = None
         framer.contest["contestname"] = fixer._fix(contestname)
         framer.contest["contestdescription"] = None
         framer.contest["contestid"] = saver._make_contest_id(
             src.source_short,
             framer.contest["level"],
             framer.office["officeslug"],
         )
         race_log += saver.make_office(framer.office)
         race_log += saver.make_contest(framer.office, framer.contest)
         for judge in judges:
             fullname = fixer._titlecase_with_accents(
                 judge["judicial_name"].encode('utf8'))
             framer.judicial["firstname"] = None
             framer.judicial["lastname"] = None
             framer.judicial["ballotorder"] = None
             framer.judicial["fullname"] = fullname
             framer.judicial["judicialslug"] = slugify(fullname)
             framer.judicial["description"] = judge["judicial_text"].title()
             framer.judicial["poss_error"] = False
             if framer._to_num(judge["yes_votes"])["convert"] == True:
                 yescount = framer._to_num(judge["yes_votes"])["value"]
                 framer.judicial["yescount"] = yescount
             else:
                 framer.judicial["yescount"] = None
                 raise Exception("yescount is not a number")
             if framer._to_num(judge["yes_percent"])["convert"] == True:
                 yespct = framer._to_num(judge["yes_percent"])["value"]
                 framer.judicial["yespct"] = yespct
             else:
                 framer.judicial["yespct"] = None
                 raise Exception("yespct is not a number")
             if framer._to_num(judge["no_votes"])["convert"] == True:
                 nocount = framer._to_num(judge["no_votes"])["value"]
                 framer.judicial["nocount"] = nocount
             else:
                 framer.judicial["nocount"] = None
                 raise Exception("nocount is not a number")
             if framer._to_num(judge["no_percent"])["convert"] == True:
                 nopct = framer._to_num(judge["no_percent"])["value"]
                 framer.judicial["nopct"] = nopct
             else:
                 framer.judicial["nopct"] = None
                 raise Exception("nopct is not a number")
             framer.judicial["judgeid"] = saver._make_this_id(
                 "judicial",
                 framer.contest["contestid"],
                 framer.judicial["judicialslug"],
             )
             race_log += saver.make_judicial(framer.contest,
                                             framer.judicial)
     elif contest["is_ballot_measure"]:
         """
         this is a ballot measure
         """
         framer.contest["level"] = "county"
         framer.contest["is_statewide"] = False
         contestname = contest["contest_title"]
         if contest["contest_id"] == "00":
             if contestname == "COUNTY MEASURE A":
                 this_type = "Measure"
                 contestname = "%swide" % (county_name)
                 contest["contest_title_cont"] = "Measure A"
             else:
                 this_type = "Proposition"
             contestname = contestname.replace("STATE MEASURE",
                                               "Proposition")
         else:
             this_type = "Measure"
             contestname = fixer._fix(contestname)
         contestname = contestname.title()
         if contestname == "Metro Transportation Authority":
             contestname = "%swide" % (county_name)
         if contest["contest_title_cont"]:
             fullname = (contest["contest_title_cont"]).replace(
                 "MEASURE", "Measure")
         else:
             fullname = contestname
         if contest["contest_id"] == "00":
             description = None
             officename = framer._concat(
                 # this_type,
                 contestname,
                 delimiter="-",
             )
         else:
             description = "%s %s" % (contestname, this_type)
             officename = framer._concat(
                 # this_type,
                 contestname,
                 delimiter="-",
             )
         framer.office["officename"] = officename
         framer.office["officeslug"] = slugify(officename)
         framer.office["active"] = True
         framer.office["officeid"] = framer.office["officeslug"]
         framer.contest["election_id"] = election.id
         framer.contest["resultsource_id"] = src.id
         framer.contest["seatnum"] = None
         framer.contest["is_uncontested"] = False
         framer.contest["is_national"] = False
         framer.contest["is_ballot_measure"] = True
         framer.contest["is_judicial"] = False
         framer.contest["is_runoff"] = False
         framer.contest["reporttype"] = None
         framer.contest["poss_error"] = False
         if framer._to_num(contest["total_precincts"])["convert"] == True:
             pt = framer._to_num(contest["total_precincts"])["value"]
             framer.contest["precinctstotal"] = pt
         else:
             framer.contest["precinctstotal"] = None
             raise Exception("precinctstotal is not a number")
         if framer._to_num(
                 contest["precincts_reporting"])["convert"] == True:
             pr = framer._to_num(contest["precincts_reporting"])["value"]
             framer.contest["precinctsreporting"] = pr
         else:
             framer.contest["precinctsreporting"] = None
             raise Exception("precinctsreporting is not a number")
         framer.contest["precinctsreportingpct"] = framer._calc_pct(
             framer.contest["precinctsreporting"],
             framer.contest["precinctstotal"])
         if framer._to_num(contest["registration"])["convert"] == True:
             framer.contest["votersregistered"] = framer._to_num(
                 contest["registration"])["value"]
         else:
             framer.contest["votersregistered"] = None
             raise Exception("votersregistered is not a number")
         framer.contest["votersturnout"] = None
         framer.contest["contestname"] = contestname
         framer.contest["contestdescription"] = description
         framer.contest["contestid"] = saver._make_contest_id(
             # election.electionid,
             src.source_short,
             framer.contest["level"],
             framer.office["officeslug"],
         )
         race_log += saver.make_office(framer.office)
         race_log += saver.make_contest(framer.office, framer.contest)
         for measure in measures:
             framer.measure["ballotorder"] = None
             framer.measure["fullname"] = fullname
             framer.measure["measureslug"] = slugify(fullname)
             framer.measure["description"] = measure["measure_text"].title()
             framer.measure["poss_error"] = False
             if framer._to_num(measure["yes_votes"])["convert"] == True:
                 yescount = framer._to_num(measure["yes_votes"])["value"]
                 framer.measure["yescount"] = yescount
             else:
                 framer.measure["yescount"] = None
                 raise Exception("yescount is not a number")
             if framer._to_num(measure["yes_percent"])["convert"] == True:
                 yespct = framer._to_num(measure["yes_percent"])["value"]
                 framer.measure["yespct"] = yespct
             else:
                 framer.measure["yespct"] = None
                 raise Exception("yespct is not a number")
             if framer._to_num(measure["no_votes"])["convert"] == True:
                 nocount = framer._to_num(measure["no_votes"])["value"]
                 framer.measure["nocount"] = nocount
             else:
                 framer.measure["nocount"] = None
                 raise Exception("nocount is not a number")
             if framer._to_num(measure["no_percent"])["convert"] == True:
                 nopct = framer._to_num(measure["no_percent"])["value"]
                 framer.measure["nopct"] = nopct
             else:
                 framer.measure["nopct"] = None
                 raise Exception("nopct is not a number")
             if this_type == "Proposition":
                 framer.measure["measureid"] = saver._make_this_id(
                     "measure",
                     "%s-%s" % (src.source_short, framer.contest["level"]),
                     "%s-%s" %
                     (this_type.lower(), measure["measure_id"].lower()))
             else:
                 framer.measure["measureid"] = saver._make_this_id(
                     "measure", framer.contest["contestid"], "%s-%s" %
                     (measure["measure_id"].lower(),
                      slugify(framer.measure["description"].lower())))
             race_log += saver.make_measure(framer.contest, framer.measure)
     else:
         """
         this is a candidate for elected office
         """
         strip_district = contest["district"].lstrip("0")
         framer.contest["seatnum"] = "1010101"
         if contest["contest_title"] == "MEMBER OF THE ASSEMBLY":
             contestname = "State Assembly District %s" % (strip_district)
         elif "SUPERVISOR" in contest["contest_title"]:
             contestname = "Supervisor District %s" % (strip_district)
             contestname = fixer._affix_county(county_name, contestname)
         elif "U.S. REPRESENTATIVE" in contest["contest_title"]:
             contestname = "U.S. House of Representatives District %s" % (
                 strip_district)
         elif "DELEGATES" in contest["contest_title"]:
             designation = contest["contest_title_cont"].replace(
                 "CONGRESSIONAL DISTRICT-", "")
             if designation == "REP":
                 this_desig = "Republican"
             elif designation == "DEM":
                 this_desig = "Democratic"
             else:
                 this_desig = None
             contestname = "%s Presidential Primary Delegates - CD%s" % (
                 this_desig, strip_district)
         elif "STATE SENATOR" in contest["contest_title"]:
             contestname = "State Senate District %s" % (strip_district)
         elif "UNITED STATES SENATOR" in contest["contest_title"]:
             contestname = "US Senate"
         elif "PRESIDENTIAL PREFERENCE" in contest["contest_title"]:
             designation = contest["contest_title_cont"].upper()
             if designation == "AI":
                 this_desig = "American Independent"
             elif designation == "REP":
                 this_desig = "Republican"
             elif designation == "DEM":
                 this_desig = "Democratic"
             elif designation == "PF":
                 this_desig = "Peace And Freedom"
             elif designation == "LIB":
                 this_desig = "Libertarian"
             elif designation == "GRN":
                 this_desig = "Green"
             else:
                 this_desig = None
             contestname = "%s Presidential Primary" % (this_desig)
         elif "PARTY COUNTY COMMITTEE" in contest["contest_title"]:
             contestname = "%s Party County Committee District %s" % (
                 contest["party_name"].capitalize(), strip_district)
         elif "JUDGE-SUPERIOR COURT" in contest["contest_title"]:
             contestname = "Judge Superior Court %s" % (
                 contest["contest_title_cont"].title())
             contestname = fixer._affix_county(county_name, contestname)
         else:
             contestname = "%s %s" % (contest["contest_title"].title(),
                                      contest["contest_title_cont"].title())
         contestname = fixer._fix(contestname)
         contestname = contestname.title()
         contestname = framer._convert_district_number(contestname)
         framer.office["officename"] = contestname.replace(".", "")
         framer.office["officeslug"] = slugify(framer.office["officename"])
         framer.office["active"] = True
         framer.office["officeid"] = framer.office["officeslug"]
         framer.contest["election_id"] = election.id
         framer.contest["resultsource_id"] = src.id
         if len(candidates) < 2:
             framer.contest["is_uncontested"] = True
         else:
             framer.contest["is_uncontested"] = False
         framer.contest["is_national"] = False
         framer.contest["is_ballot_measure"] = False
         framer.contest["is_judicial"] = False
         framer.contest["is_runoff"] = False
         framer.contest["reporttype"] = None
         framer.contest["poss_error"] = False
         if framer._to_num(contest["total_precincts"])["convert"] == True:
             pt = framer._to_num(contest["total_precincts"])["value"]
             framer.contest["precinctstotal"] = pt
         else:
             framer.contest["precinctstotal"] = None
             raise Exception("precinctstotal is not a number")
         if framer._to_num(
                 contest["precincts_reporting"])["convert"] == True:
             pr = framer._to_num(contest["precincts_reporting"])["value"]
             framer.contest["precinctsreporting"] = pr
         else:
             framer.contest["precinctsreporting"] = None
             raise Exception("precinctsreporting is not a number")
         framer.contest["precinctsreportingpct"] = framer._calc_pct(
             framer.contest["precinctsreporting"],
             framer.contest["precinctstotal"])
         if framer._to_num(contest["registration"])["convert"] == True:
             framer.contest["votersregistered"] = framer._to_num(
                 contest["registration"])["value"]
         else:
             framer.contest["votersregistered"] = None
             raise Exception("votersregistered is not a number")
         framer.contest["votersturnout"] = None
         framer.contest["contestname"] = contestname
         try:
             framer.contest["contestdescription"] = contest[
                 "vote_for_text"].capitalize(
                 ) + " " + contest["vote_for_number"]
         except:
             framer.contest["contestdescription"] = None
         framer.contest["contestid"] = saver._make_contest_id(
             src.source_short,
             framer.contest["level"],
             framer.office["officeslug"],
         )
         race_log += saver.make_office(framer.office)
         race_log += saver.make_contest(framer.office, framer.contest)
         for candidate in candidates:
             fullname = fixer._titlecase_with_accents(
                 candidate["candidate_name"].encode('utf8'))
             party = candidate["party_short"]
             if party == "REP":
                 party = "Republican"
             elif party == "DEM":
                 party = "Democrat"
             elif party == "AI":
                 party = "American Independent"
             elif party == "PF":
                 party = "Peace And Freedom"
             elif party == "LIB":
                 party = "Libertarian"
             elif party == "GRN":
                 party = "Green"
             elif party == "NP":
                 party = "No Party Preference"
             framer.candidate["ballotorder"] = None
             framer.candidate["firstname"] = None
             framer.candidate["lastname"] = None
             framer.candidate["fullname"] = fullname
             framer.candidate["candidateslug"] = slugify(fullname)
             framer.candidate["party"] = party
             framer.candidate["incumbent"] = False
             framer.candidate["poss_error"] = False
             if framer._to_num(candidate["votes"])["convert"] == True:
                 framer.candidate["votecount"] = framer._to_num(
                     candidate["votes"])["value"]
             else:
                 framer.candidate["votecount"] = None
                 raise Exception("votecount is not a number")
             if framer._to_num(
                     candidate["percent_of_vote"])["convert"] == True:
                 framer.candidate["votepct"] = framer._to_num(
                     candidate["percent_of_vote"])["value"]
             else:
                 framer.candidate["votepct"] = None
                 raise Exception("votepct is not a number")
             framer.candidate["candidateid"] = saver._make_this_id(
                 "candidate",
                 framer.contest["contestid"],
                 framer.candidate["candidateslug"],
             )
             race_log += saver.make_candidate(framer.contest,
                                              framer.candidate)