The Open House module provides access to open house events and schedules in the WFRMLS system. This includes event details, timing, property associations, and agent information.
The OpenHouseService class handles all open house-related operations through the WFRMLS API. Open houses represent scheduled property showings and events where potential buyers can view properties.
# Get upcoming open housesupcoming_openhouses=client.openhouse.get_openhouses(filter_query="OpenHouseDate ge 2024-01-01T00:00:00Z",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime","OpenHouseEndTime"],orderby="OpenHouseDate asc",top=100)# Get open houses for a specific propertyproperty_openhouses=client.openhouse.get_openhouses(filter_query="PropertyKey eq '12345678'",orderby="OpenHouseDate desc")# Get open houses by agentagent_openhouses=client.openhouse.get_openhouses(filter_query="OpenHouseAgentKey eq 'AGENT123'",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime"])
# Get complete open house recordopenhouse=client.openhouse.get_openhouse("OPENHOUSE123")# Get specific fields onlyopenhouse_schedule=client.openhouse.get_openhouse("OPENHOUSE123",select=["OpenHouseDate","OpenHouseStartTime","OpenHouseEndTime","PropertyKey"])
fromdatetimeimportdatetime,timedelta# Get open houses for the next 7 daysnext_week=datetime.now()+timedelta(days=7)upcoming_openhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseDate ge {datetime.now().isoformat()}Z and OpenHouseDate le {next_week.isoformat()}Z",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime","OpenHouseEndTime","OpenHouseAgentKey"],orderby="OpenHouseDate asc, OpenHouseStartTime asc")forohinupcoming_openhouses:print(f"Open House: {oh['PropertyKey']} on {oh['OpenHouseDate']}")print(f" Time: {oh['OpenHouseStartTime']} - {oh['OpenHouseEndTime']}")
# Get all open houses for the upcoming weekendfromdatetimeimportdatetime,timedelta# Find next Saturday and Sundaytoday=datetime.now()days_until_saturday=(5-today.weekday())%7ifdays_until_saturday==0andtoday.weekday()==5:# Today is Saturdaysaturday=todayelse:saturday=today+timedelta(days=days_until_saturday)sunday=saturday+timedelta(days=1)weekend_openhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseDate ge {saturday.date().isoformat()}T00:00:00Z and OpenHouseDate le {sunday.date().isoformat()}T23:59:59Z",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime","OpenHouseEndTime","OpenHouseAgentKey","OpenHouseRemarks"],orderby="OpenHouseDate asc, OpenHouseStartTime asc")print(f"Weekend Open Houses ({saturday.date()} - {sunday.date()}):")forohinweekend_openhouses:date_str=oh['OpenHouseDate'][:10]# Extract date partprint(f" {date_str}{oh['OpenHouseStartTime']}-{oh['OpenHouseEndTime']}: Property {oh['PropertyKey']}")
# Get an agent's open house scheduledefget_agent_openhouse_schedule(agent_key,days_ahead=30):"""Get open house schedule for a specific agent."""end_date=datetime.now()+timedelta(days=days_ahead)agent_openhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseAgentKey eq '{agent_key}' and OpenHouseDate ge {datetime.now().isoformat()}Z and OpenHouseDate le {end_date.isoformat()}Z",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime","OpenHouseEndTime","OpenHouseRemarks"],orderby="OpenHouseDate asc, OpenHouseStartTime asc")returnagent_openhouses# Usageschedule=get_agent_openhouse_schedule("AGENT123")forohinschedule:print(f"{oh['OpenHouseDate']}{oh['OpenHouseStartTime']}: Property {oh['PropertyKey']}")
# Get open houses for a specific date rangefromdatetimeimportdatetime,timedeltastart_date=datetime(2024,1,1)end_date=datetime(2024,1,31)january_openhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseDate ge {start_date.isoformat()}Z and OpenHouseDate le {end_date.isoformat()}Z",orderby="OpenHouseDate asc, OpenHouseStartTime asc")# Get open houses for todaytoday=datetime.now().date()today_openhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseDate eq {today.isoformat()}T00:00:00Z",orderby="OpenHouseStartTime asc")
# Get morning open houses (before noon)morning_openhouses=client.openhouse.get_openhouses(filter_query="OpenHouseStartTime lt '12:00:00'",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime"],orderby="OpenHouseDate asc, OpenHouseStartTime asc")# Get weekend open housesweekend_openhouses=client.openhouse.get_openhouses(filter_query="day(OpenHouseDate) eq 0 or day(OpenHouseDate) eq 6",# Sunday=0, Saturday=6orderby="OpenHouseDate asc")
# Get open houses for multiple propertiesproperty_keys=["PROP123","PROP456","PROP789"]property_filter=" or ".join([f"PropertyKey eq '{key}'"forkeyinproperty_keys])multi_property_openhouses=client.openhouse.get_openhouses(filter_query=f"({property_filter})",orderby="OpenHouseDate asc")# Get open houses by multiple agentsagent_keys=["AGENT123","AGENT456"]agent_filter=" or ".join([f"OpenHouseAgentKey eq '{key}'"forkeyinagent_keys])multi_agent_openhouses=client.openhouse.get_openhouses(filter_query=f"({agent_filter}) and OpenHouseDate ge {datetime.now().isoformat()}Z",orderby="OpenHouseDate asc")
defget_openhouse_with_property(openhouse_key):"""Get open house details along with property information."""try:# Get open house informationopenhouse=client.openhouse.get_openhouse(openhouse_key)# Get associated property detailsproperty_data=client.property.get_property(openhouse['PropertyKey'])return{'openhouse':openhouse,'property':property_data}exceptNotFoundError:returnNone# Usageoh_details=get_openhouse_with_property("OPENHOUSE123")ifoh_details:oh=oh_details['openhouse']prop=oh_details['property']print(f"Open House: {oh['OpenHouseDate']}{oh['OpenHouseStartTime']}")print(f"Property: {prop['PropertyAddress']}, {prop['PropertyCity']}")print(f"Price: ${prop['ListPrice']:,}")
defcreate_agent_calendar(agent_key,month=None,year=None):"""Create a calendar view of an agent's open houses."""fromdatetimeimportdatetime,timedeltaimportcalendarifnotmonth:month=datetime.now().monthifnotyear:year=datetime.now().year# Get first and last day of the monthfirst_day=datetime(year,month,1)ifmonth==12:last_day=datetime(year+1,1,1)-timedelta(days=1)else:last_day=datetime(year,month+1,1)-timedelta(days=1)# Get open houses for the monthopenhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseAgentKey eq '{agent_key}' and OpenHouseDate ge {first_day.isoformat()}Z and OpenHouseDate le {last_day.isoformat()}Z",select=["OpenHouseDate","OpenHouseStartTime","OpenHouseEndTime","PropertyKey"],orderby="OpenHouseDate asc, OpenHouseStartTime asc")# Group by datecalendar_data={}forohinopenhouses:date_str=oh['OpenHouseDate'][:10]ifdate_strnotincalendar_data:calendar_data[date_str]=[]calendar_data[date_str].append(oh)returncalendar_data# Usagecal=create_agent_calendar("AGENT123",1,2024)fordate,openhousesincal.items():print(f"\n{date}:")forohinopenhouses:print(f" {oh['OpenHouseStartTime']}-{oh['OpenHouseEndTime']}: {oh['PropertyKey']}")
defanalyze_openhouse_patterns():"""Analyze open house scheduling patterns."""fromdatetimeimportdatetime,timedeltafromcollectionsimportdefaultdict# Get open houses for the last 90 daysstart_date=datetime.now()-timedelta(days=90)openhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseDate ge {start_date.isoformat()}Z",select=["OpenHouseDate","OpenHouseStartTime","OpenHouseAgentKey"],top=1000)# Analyze by day of weekday_counts=defaultdict(int)hour_counts=defaultdict(int)agent_counts=defaultdict(int)forohinopenhouses:# Parse date and timedate_obj=datetime.fromisoformat(oh['OpenHouseDate'].replace('Z','+00:00'))day_of_week=date_obj.strftime('%A')# Parse start timestart_time=oh['OpenHouseStartTime']hour=int(start_time.split(':')[0])day_counts[day_of_week]+=1hour_counts[hour]+=1agent_counts[oh['OpenHouseAgentKey']]+=1return{'by_day':dict(day_counts),'by_hour':dict(hour_counts),'by_agent':dict(sorted(agent_counts.items(),key=lambdax:x[1],reverse=True)[:10])}# Usageanalytics=analyze_openhouse_patterns()print("Open Houses by Day of Week:")forday,countinanalytics['by_day'].items():print(f" {day}: {count}")
fromwfrmls.exceptionsimportWFRMLSError,NotFoundError,ValidationErrortry:# Attempt to get open houseopenhouse=client.openhouse.get_openhouse("INVALID_KEY")exceptNotFoundError:print("Open house not found")exceptValidationErrorase:print(f"Invalid request: {e}")exceptWFRMLSErrorase:print(f"API error: {e}")
# Use specific date ranges to improve performancefromdatetimeimportdatetime,timedelta# Get next 30 days of open housesend_date=datetime.now()+timedelta(days=30)upcoming_openhouses=client.openhouse.get_openhouses(filter_query=f"OpenHouseDate ge {datetime.now().isoformat()}Z and OpenHouseDate le {end_date.isoformat()}Z",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime"],orderby="OpenHouseDate asc")
defget_all_openhouses_in_range(start_date,end_date):"""Get all open houses in a date range using pagination."""all_openhouses=[]skip=0batch_size=100whileTrue:batch=client.openhouse.get_openhouses(filter_query=f"OpenHouseDate ge {start_date.isoformat()}Z and OpenHouseDate le {end_date.isoformat()}Z",top=batch_size,skip=skip,count=True)ifnotbatch:breakall_openhouses.extend(batch)skip+=batch_size# Check if we've retrieved all recordsiflen(batch)<batch_size:breakreturnall_openhouses
fromfunctoolsimportlru_cachefromdatetimeimportdatetime,timedeltaclassOpenHouseCache:def__init__(self,client):self.client=clientself._cache={}self._cache_timeout=timedelta(minutes=30)# Shorter timeout for time-sensitive datadefget_upcoming_openhouses(self,days=7):"""Get upcoming open houses with caching."""cache_key=f"upcoming_{days}"now=datetime.now()ifcache_keyinself._cache:cached_data,timestamp=self._cache[cache_key]ifnow-timestamp<self._cache_timeout:returncached_data# Fetch fresh dataend_date=now+timedelta(days=days)openhouses=self.client.openhouse.get_openhouses(filter_query=f"OpenHouseDate ge {now.isoformat()}Z and OpenHouseDate le {end_date.isoformat()}Z",orderby="OpenHouseDate asc, OpenHouseStartTime asc")self._cache[cache_key]=(openhouses,now)returnopenhouses
defcheck_for_new_openhouses(last_check_time):"""Check for newly added open houses since last check."""new_openhouses=client.openhouse.get_openhouses(filter_query=f"OriginalEntryTimestamp ge {last_check_time.isoformat()}Z",select=["OpenHouseKey","PropertyKey","OpenHouseDate","OpenHouseStartTime","OpenHouseAgentKey","OriginalEntryTimestamp"],orderby="OriginalEntryTimestamp desc")returnnew_openhouses# Usagefromdatetimeimportdatetime,timedeltalast_check=datetime.now()-timedelta(hours=1)new_events=check_for_new_openhouses(last_check)foreventinnew_events:print(f"New open house: Property {event['PropertyKey']} on {event['OpenHouseDate']}")