Esempio n. 1
0
class SearchAndLoadGoogleVenues(object):


    def __init__(self, query, google_venue_types):
        self.google_venue_types = google_venue_types
        self._query = query
        self._apikey = "YourKey"
        self._gapi = GooglePlacesAPI(self._apikey)
        self._db = RateVailDb()

    def run(self):
        print "Searching query: " + str(self._query)

        search_page = self._gapi.search_places(self._query)
        while search_page:
            if search_page['status'] != "OK":
                raise Exception("Search Page response returned status: %s" % search_page['status'])

            self._proc_results(search_page['results'])

            next_token = search_page.get("next_page_token")
            if next_token:
                print "Processing next search page"
                search_page = self._gapi.search_places(self._query, pagetoken=next_token)
            else:
                print "Finished processing all pages"
                break


    def _proc_results(self, results):
        print "Processing Result"
        for result in results:
            detail_page = self._gapi.fetch_place_detail(result['reference'])
            if detail_page['status'] != "OK":
                raise Exception("Detail Page returned bad status")

            #Venue Properties
            venue_name = escape_str(result['name'])
            venue_shortname = super_sanitize_str(result['name'])
            venue_shortname = venue_shortname.replace(" ", "").lower()
            venue_address = result['formatted_address']
            venue_phone = detail_page['result'].get('formatted_phone_number')
            g_venue_types = result['types']
            venue_externalsourceid = result['reference']
            externalrating_uniqid = result['id']
            venue_description = "Description for this venue is coming soon"
            #Rating Val
            if "rating" in result.keys():
                venue_rating = result['rating']
            else:
                venue_rating = 0
            #Price point
            if "price_level" in result.keys():
                venue_pricepoint = result['price_level']
            else:
                venue_pricepoint = 0
            #Convert google venue types to rv venue types
            rv_venue_types = []
            for typ in g_venue_types:
                if typ in self.google_venue_types:
                    rv_venue_types.append(self.google_venue_types[typ])

            rv_venue_types = set(rv_venue_types) #remove duplicates
            if len(rv_venue_types) == 0:
                print "WARNING: This venue doesn't ahve any matching venue types and will be skipped"
                print "WARNING: Skipping venue: " + str(venue_name)
                continue

            #
            # Check if externalsourceid already exists. If it does then just assign types. Have to insert ignore though
            #
            ext_src_rec = self._db.externalrating_uniqid_exists(externalrating_uniqid)
            if len(ext_src_rec) == 1:
                print "External Sourceid exists"
                print "Assigning types"
                for typ in rv_venue_types:
                    self._db.assign_ignore_venue_venuetyp(ext_src_rec[0]['venueid'], typ)
                print "Continuing to next record"
                continue
            elif len(ext_src_rec) > 1:
                raise Exception("Externa Source ID is linked to more than one venue. %s" % str(ext_src_rec))
            else:
                print "External Source id does NOT exist. Creating venue"
                

            #Create Phone Number
            if venue_phone:
                phone_parts = venue_phone.split(" ")
                area_code = phone_parts[0][1:4]
                phone_parts = phone_parts[1].split("-")
                exchange = phone_parts[0]
                subscriberno = phone_parts[1]
                self._db.insert_phone("pri", area_code, exchange, subscriberno, commit=False)
                phoneid = self._db._last_insert_id()
            else:
                phoneid = None
            #Create Address
            # TODO: Find zip properly
            zipcd = "81657"

            addr_parts = venue_address.split(",")
            if len(addr_parts) == 3:
                self._db.insert_addr("PHYS", "", addrline2=None, city=addr_parts[0],
                                     state=addr_parts[1], zipcd=zipcd, commit=False)
            if len(addr_parts) == 4:
                self._db.insert_addr("PHYS", addr_parts[0], addrline2=None, city=addr_parts[1],
                                     state=addr_parts[2], zipcd=zipcd, commit=False)
            elif len(addr_parts) == 5:
                self._db.insert_addr("PHYS", addr_parts[0], addrline2=addr_parts[1], city=addr_parts[2],
                                     state=addr_parts[3], zipcd=zipcd, commit=False)
            addrid = self._db._last_insert_id()

            #Create venue
            resortid = 1
            venueid = self._db.create_venue(resortid, venue_name, venue_shortname, venue_description,
                                            rv_venue_types, pricepointval=venue_pricepoint, phoneid=phoneid,
                                            addrids=[addrid], logoimageid=1)

            #Create External Rating
            self._db.insert_external_rating("GOOGL", venue_externalsourceid, venue_name,
                                            pricepointval=venue_pricepoint,
                                            ratingval=venue_rating,
                                            uniqid=externalrating_uniqid,
                                            commit=False)

            externalratingid = self._db._last_insert_id()
            self._db.assign_venue_external_rating(externalratingid, venueid, commit=True)