reso 0.1.6.7 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +11 -17
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -1
- data/Gemfile.lock +60 -0
- data/LICENSE.txt +17 -18
- data/README.md +19 -125
- data/Rakefile +5 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/generators/reso/install/install_generator.rb +23 -0
- data/lib/generators/reso/install/templates/create_reso_enumeration_assignments.rb +14 -0
- data/lib/generators/reso/install/templates/create_reso_enumerations.rb +12 -0
- data/lib/reso/app/models/.DS_Store +0 -0
- data/lib/reso/app/models/application_record.rb +3 -0
- data/lib/reso/app/models/reso/contact.rb +3 -0
- data/lib/reso/app/models/reso/contact_listing.rb +3 -0
- data/lib/reso/app/models/reso/contact_listing_note.rb +3 -0
- data/lib/reso/app/models/reso/data_dictionary.rb +124 -0
- data/lib/reso/app/models/reso/enumeration.rb +3 -0
- data/lib/reso/app/models/reso/enumeration_assignment.rb +4 -0
- data/lib/reso/app/models/reso/history_transactional.rb +3 -0
- data/lib/reso/app/models/reso/internet_tracking/actor.rb +6 -0
- data/lib/reso/app/models/reso/internet_tracking/event.rb +6 -0
- data/lib/reso/app/models/reso/internet_tracking/object.rb +6 -0
- data/lib/reso/app/models/reso/internet_tracking.rb +7 -0
- data/lib/reso/app/models/reso/lookup/accessibility_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/actor_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/appliance.rb +4 -0
- data/lib/reso/app/models/reso/lookup/area_source.rb +6 -0
- data/lib/reso/app/models/reso/lookup/area_unit.rb +5 -0
- data/lib/reso/app/models/reso/lookup/association_amenity.rb +4 -0
- data/lib/reso/app/models/reso/lookup/association_fee_include.rb +5 -0
- data/lib/reso/app/models/reso/lookup/attended.rb +4 -0
- data/lib/reso/app/models/reso/lookup/basement.rb +5 -0
- data/lib/reso/app/models/reso/lookup/body_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/business_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/buyer_agent_designation.rb +5 -0
- data/lib/reso/app/models/reso/lookup/buyer_financing.rb +4 -0
- data/lib/reso/app/models/reso/lookup/change_type.rb +5 -0
- data/lib/reso/app/models/reso/lookup/class_name.rb +4 -0
- data/lib/reso/app/models/reso/lookup/co_buyer_agent_designation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/co_list_agent_designation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/common_interest.rb +4 -0
- data/lib/reso/app/models/reso/lookup/common_wall.rb +4 -0
- data/lib/reso/app/models/reso/lookup/community_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/compensation_type.rb +8 -0
- data/lib/reso/app/models/reso/lookup/concession.rb +4 -0
- data/lib/reso/app/models/reso/lookup/construction_material.rb +4 -0
- data/lib/reso/app/models/reso/lookup/contact_listing_preference.rb +4 -0
- data/lib/reso/app/models/reso/lookup/contact_status.rb +4 -0
- data/lib/reso/app/models/reso/lookup/contact_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/cooling.rb +4 -0
- data/lib/reso/app/models/reso/lookup/current_financing.rb +4 -0
- data/lib/reso/app/models/reso/lookup/current_use.rb +4 -0
- data/lib/reso/app/models/reso/lookup/daily_schedule.rb +4 -0
- data/lib/reso/app/models/reso/lookup/development_status.rb +4 -0
- data/lib/reso/app/models/reso/lookup/device_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/direction_face.rb +4 -0
- data/lib/reso/app/models/reso/lookup/door_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/electric.rb +4 -0
- data/lib/reso/app/models/reso/lookup/event_target.rb +4 -0
- data/lib/reso/app/models/reso/lookup/event_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/existing_lease_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/exterior_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/fencing.rb +4 -0
- data/lib/reso/app/models/reso/lookup/financial_data_source.rb +4 -0
- data/lib/reso/app/models/reso/lookup/fireplace_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/flooring.rb +4 -0
- data/lib/reso/app/models/reso/lookup/foundation_detail.rb +4 -0
- data/lib/reso/app/models/reso/lookup/frontage_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/furnished.rb +4 -0
- data/lib/reso/app/models/reso/lookup/green_building_verification_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/green_energy_efficient.rb +4 -0
- data/lib/reso/app/models/reso/lookup/green_energy_generation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/green_indoor_air_quality.rb +4 -0
- data/lib/reso/app/models/reso/lookup/green_sustainability.rb +4 -0
- data/lib/reso/app/models/reso/lookup/green_water_conservation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/heating.rb +4 -0
- data/lib/reso/app/models/reso/lookup/horse_amenity.rb +4 -0
- data/lib/reso/app/models/reso/lookup/hours_days_of_operation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/image_of.rb +4 -0
- data/lib/reso/app/models/reso/lookup/income_include.rb +4 -0
- data/lib/reso/app/models/reso/lookup/labor_information.rb +4 -0
- data/lib/reso/app/models/reso/lookup/laundry_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/lease_renewal_compensation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/lease_term.rb +4 -0
- data/lib/reso/app/models/reso/lookup/list_agent_designation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/listing_agreement.rb +4 -0
- data/lib/reso/app/models/reso/lookup/listing_service.rb +4 -0
- data/lib/reso/app/models/reso/lookup/listing_term.rb +4 -0
- data/lib/reso/app/models/reso/lookup/lock_box_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/lot_dimensions_source.rb +4 -0
- data/lib/reso/app/models/reso/lookup/lot_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/lot_size_source.rb +4 -0
- data/lib/reso/app/models/reso/lookup/lot_size_unit.rb +4 -0
- data/lib/reso/app/models/reso/lookup/media_category.rb +4 -0
- data/lib/reso/app/models/reso/lookup/media_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/member_designation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/member_other_phone_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/member_status.rb +4 -0
- data/lib/reso/app/models/reso/lookup/member_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/noted_by.rb +4 -0
- data/lib/reso/app/models/reso/lookup/object_id_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/object_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/occupant_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/open_house_status.rb +4 -0
- data/lib/reso/app/models/reso/lookup/open_house_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/operating_expense_include.rb +4 -0
- data/lib/reso/app/models/reso/lookup/other_equipment.rb +4 -0
- data/lib/reso/app/models/reso/lookup/other_structure.rb +4 -0
- data/lib/reso/app/models/reso/lookup/owner_pay.rb +4 -0
- data/lib/reso/app/models/reso/lookup/ownership_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/parking_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/patio_and_porch_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/permission.rb +4 -0
- data/lib/reso/app/models/reso/lookup/pets_allowed.rb +4 -0
- data/lib/reso/app/models/reso/lookup/pool_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/possession.rb +4 -0
- data/lib/reso/app/models/reso/lookup/possible_use.rb +4 -0
- data/lib/reso/app/models/reso/lookup/property_condition.rb +4 -0
- data/lib/reso/app/models/reso/lookup/property_sub_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/property_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/queue_transaction_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/reason_active_or_disabled.rb +4 -0
- data/lib/reso/app/models/reso/lookup/rent_include.rb +4 -0
- data/lib/reso/app/models/reso/lookup/road_frontage_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/road_responsibility.rb +4 -0
- data/lib/reso/app/models/reso/lookup/road_surface_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/roof.rb +4 -0
- data/lib/reso/app/models/reso/lookup/rule_format.rb +4 -0
- data/lib/reso/app/models/reso/lookup/schedule_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/search_query_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/security_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/sewer.rb +4 -0
- data/lib/reso/app/models/reso/lookup/showing_contact_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/showing_requirement.rb +4 -0
- data/lib/reso/app/models/reso/lookup/skirt.rb +4 -0
- data/lib/reso/app/models/reso/lookup/spa_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/special_license.rb +4 -0
- data/lib/reso/app/models/reso/lookup/special_listing_condition.rb +4 -0
- data/lib/reso/app/models/reso/lookup/standard_status.rb +4 -0
- data/lib/reso/app/models/reso/lookup/street_direction.rb +4 -0
- data/lib/reso/app/models/reso/lookup/structure_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/syndicate_to.rb +4 -0
- data/lib/reso/app/models/reso/lookup/tax_status_current.rb +4 -0
- data/lib/reso/app/models/reso/lookup/team_member_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/team_status.rb +4 -0
- data/lib/reso/app/models/reso/lookup/tenant_pay.rb +4 -0
- data/lib/reso/app/models/reso/lookup/unit_type_type.rb +4 -0
- data/lib/reso/app/models/reso/lookup/units_furnished.rb +4 -0
- data/lib/reso/app/models/reso/lookup/utility.rb +4 -0
- data/lib/reso/app/models/reso/lookup/vegetation.rb +4 -0
- data/lib/reso/app/models/reso/lookup/view.rb +4 -0
- data/lib/reso/app/models/reso/lookup/water_source.rb +4 -0
- data/lib/reso/app/models/reso/lookup/waterfront_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/window_feature.rb +4 -0
- data/lib/reso/app/models/reso/lookup/year_built_source.rb +4 -0
- data/lib/reso/app/models/reso/lookup.rb +2 -0
- data/lib/reso/app/models/reso/media.rb +3 -0
- data/lib/reso/app/models/reso/member.rb +3 -0
- data/lib/reso/app/models/reso/office.rb +3 -0
- data/lib/reso/app/models/reso/open_house.rb +3 -0
- data/lib/reso/app/models/reso/other_phone.rb +3 -0
- data/lib/reso/app/models/reso/ouid.rb +3 -0
- data/lib/reso/app/models/reso/property/business.rb +6 -0
- data/lib/reso/app/models/reso/property/characteristic.rb +9 -0
- data/lib/reso/app/models/reso/property/equipment.rb +5 -0
- data/lib/reso/app/models/reso/property/farming.rb +9 -0
- data/lib/reso/app/models/reso/property/financial.rb +9 -0
- data/lib/reso/app/models/reso/property/hoa.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/buyer_agent.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/buyer_office.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/co_buyer_agent.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/co_buyer_office.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/co_list_agent.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/co_list_office.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/list_agent.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/list_office.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office/team.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/agent_office.rb +15 -0
- data/lib/reso/app/models/reso/property/listing/closing.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/compensation.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/contract.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/date.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/marketing.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/media.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/price.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/remark.rb +6 -0
- data/lib/reso/app/models/reso/property/listing/showing.rb +6 -0
- data/lib/reso/app/models/reso/property/listing.rb +17 -0
- data/lib/reso/app/models/reso/property/location/address.rb +6 -0
- data/lib/reso/app/models/reso/property/location/area.rb +6 -0
- data/lib/reso/app/models/reso/property/location/gis.rb +6 -0
- data/lib/reso/app/models/reso/property/location/school.rb +6 -0
- data/lib/reso/app/models/reso/property/location.rb +10 -0
- data/lib/reso/app/models/reso/property/occupant_owner.rb +6 -0
- data/lib/reso/app/models/reso/property/structure/performance/green_marketing.rb +6 -0
- data/lib/reso/app/models/reso/property/structure/performance/green_verification.rb +6 -0
- data/lib/reso/app/models/reso/property/structure/performance.rb +7 -0
- data/lib/reso/app/models/reso/property/structure/room.rb +6 -0
- data/lib/reso/app/models/reso/property/structure.rb +11 -0
- data/lib/reso/app/models/reso/property/tax.rb +6 -0
- data/lib/reso/app/models/reso/property/unit_type.rb +9 -0
- data/lib/reso/app/models/reso/property/utility.rb +12 -0
- data/lib/reso/app/models/reso/property.rb +22 -0
- data/lib/reso/app/models/reso/property_agent_office.rb +2 -0
- data/lib/reso/app/models/reso/property_green_verification.rb +3 -0
- data/lib/reso/app/models/reso/property_location.rb +2 -0
- data/lib/reso/app/models/reso/property_performance.rb +2 -0
- data/lib/reso/app/models/reso/property_power_production.rb +3 -0
- data/lib/reso/app/models/reso/property_room.rb +3 -0
- data/lib/reso/app/models/reso/property_unit_type.rb +3 -0
- data/lib/reso/app/models/reso/prospecting.rb +3 -0
- data/lib/reso/app/models/reso/queue.rb +48 -0
- data/lib/reso/app/models/reso/rule.rb +85 -0
- data/lib/reso/app/models/reso/saved_search.rb +3 -0
- data/lib/reso/app/models/reso/showing/agent.rb +6 -0
- data/lib/reso/app/models/reso/showing/listing.rb +6 -0
- data/lib/reso/app/models/reso/showing.rb +7 -0
- data/lib/reso/app/models/reso/social_media.rb +3 -0
- data/lib/reso/app/models/reso/team.rb +7 -0
- data/lib/reso/app/models/reso/team_member.rb +3 -0
- data/lib/reso/config/inflections.rb +10 -0
- data/lib/reso/config/initializers/enumeration_assignments.rb +374 -0
- data/lib/reso/railtie.rb +5 -0
- data/lib/reso/version.rb +2 -2
- data/lib/reso.rb +215 -8
- data/reso-1.7.xml +109899 -0
- data/reso.gemspec +20 -20
- metadata +259 -159
- data/app/controllers/syndication_controller.rb +0 -5
- data/app/models/.keep +0 -0
- data/app/models/address.rb +0 -25
- data/app/models/address_type.rb +0 -3
- data/app/models/alternate_price.rb +0 -2
- data/app/models/appliance.rb +0 -3
- data/app/models/architecture_style.rb +0 -5
- data/app/models/area_unit.rb +0 -2
- data/app/models/brokerage.rb +0 -4
- data/app/models/builder.rb +0 -4
- data/app/models/business.rb +0 -8
- data/app/models/community.rb +0 -5
- data/app/models/cooling_system.rb +0 -3
- data/app/models/county.rb +0 -5
- data/app/models/currency_period.rb +0 -3
- data/app/models/enumeration.rb +0 -7
- data/app/models/expense.rb +0 -6
- data/app/models/expense_category.rb +0 -2
- data/app/models/exterior_type.rb +0 -3
- data/app/models/floor_covering.rb +0 -3
- data/app/models/foreclosure_status.rb +0 -5
- data/app/models/franchise.rb +0 -4
- data/app/models/gender.rb +0 -3
- data/app/models/heating_fuel.rb +0 -3
- data/app/models/heating_system.rb +0 -3
- data/app/models/home_feature.rb +0 -3
- data/app/models/import.rb +0 -153
- data/app/models/import_format.rb +0 -3
- data/app/models/import_result.rb +0 -12
- data/app/models/license_category.rb +0 -2
- data/app/models/listing.rb +0 -64
- data/app/models/listing_category.rb +0 -5
- data/app/models/listing_media.rb +0 -6
- data/app/models/listing_provider.rb +0 -9
- data/app/models/listing_status.rb +0 -5
- data/app/models/multiple_listing_service.rb +0 -5
- data/app/models/neighborhood.rb +0 -3
- data/app/models/office.rb +0 -6
- data/app/models/open_house.rb +0 -4
- data/app/models/parking.rb +0 -3
- data/app/models/participant.rb +0 -5
- data/app/models/participant_license.rb +0 -8
- data/app/models/participant_role.rb +0 -3
- data/app/models/person.rb +0 -18
- data/app/models/photo.rb +0 -3
- data/app/models/place.rb +0 -3
- data/app/models/price.rb +0 -4
- data/app/models/property_sub_type.rb +0 -5
- data/app/models/property_type.rb +0 -5
- data/app/models/queued_listing.rb +0 -31
- data/app/models/roof_type.rb +0 -3
- data/app/models/room.rb +0 -4
- data/app/models/room_category.rb +0 -2
- data/app/models/school.rb +0 -3
- data/app/models/school_category.rb +0 -2
- data/app/models/source_provider_category.rb +0 -2
- data/app/models/tax.rb +0 -3
- data/app/models/video.rb +0 -3
- data/app/models/view_type.rb +0 -3
- data/app/models/virtual_tour.rb +0 -3
- data/app/views/syndication/rets.xml.erb +0 -325
- data/lib/class_extensions.rb +0 -53
- data/lib/generators/reso/install_generator.rb +0 -45
- data/lib/generators/reso/setup.rb +0 -37
- data/lib/generators/reso/templates/create_addresses.rb +0 -33
- data/lib/generators/reso/templates/create_businesses.rb +0 -18
- data/lib/generators/reso/templates/create_enumerations.rb +0 -13
- data/lib/generators/reso/templates/create_expenses.rb +0 -13
- data/lib/generators/reso/templates/create_import_results.rb +0 -16
- data/lib/generators/reso/templates/create_imports.rb +0 -19
- data/lib/generators/reso/templates/create_join_tables.rb +0 -27
- data/lib/generators/reso/templates/create_listing_media.rb +0 -18
- data/lib/generators/reso/templates/create_listing_providers.rb +0 -13
- data/lib/generators/reso/templates/create_listings.rb +0 -111
- data/lib/generators/reso/templates/create_multiple_listing_services.rb +0 -11
- data/lib/generators/reso/templates/create_offices.rb +0 -29
- data/lib/generators/reso/templates/create_open_houses.rb +0 -18
- data/lib/generators/reso/templates/create_participant_licenses.rb +0 -13
- data/lib/generators/reso/templates/create_participants.rb +0 -26
- data/lib/generators/reso/templates/create_people.rb +0 -18
- data/lib/generators/reso/templates/create_places.rb +0 -20
- data/lib/generators/reso/templates/create_prices.rb +0 -19
- data/lib/generators/reso/templates/create_queued_listings.rb +0 -10
- data/lib/generators/reso/templates/create_rooms.rb +0 -10
- data/lib/generators/reso/templates/create_schools.rb +0 -13
- data/lib/generators/reso/templates/create_taxes.rb +0 -12
- data/lib/generators/reso/templates/enumerations.csv +0 -748
- data/lib/generators/reso/templates/reso.rake +0 -142
- data/lib/mapper/reso.rb +0 -617
- data/lib/mapper.rb +0 -274
- data/lib/reso/engine.rb +0 -13
- data/lib/reso/railties/reso.rake +0 -38
data/app/models/county.rb
DELETED
data/app/models/enumeration.rb
DELETED
data/app/models/expense.rb
DELETED
data/app/models/exterior_type.rb
DELETED
data/app/models/franchise.rb
DELETED
data/app/models/gender.rb
DELETED
data/app/models/heating_fuel.rb
DELETED
data/app/models/home_feature.rb
DELETED
data/app/models/import.rb
DELETED
@@ -1,153 +0,0 @@
|
|
1
|
-
class Import < ActiveRecord::Base
|
2
|
-
|
3
|
-
require 'nokogiri'
|
4
|
-
require 'open-uri'
|
5
|
-
require 'open_uri_redirections'
|
6
|
-
include ActionView::Helpers::TagHelper
|
7
|
-
|
8
|
-
before_save :set_import_format
|
9
|
-
belongs_to :import_format
|
10
|
-
enum status: [ :active, :inactive, :running ]
|
11
|
-
has_many :import_results
|
12
|
-
has_many :listings
|
13
|
-
has_many :queued_listings
|
14
|
-
validates_uniqueness_of :token
|
15
|
-
|
16
|
-
def remove_listings_not_present fresh_listing_keys
|
17
|
-
existing_listing_keys = self.listings.all.pluck(:listing_key)
|
18
|
-
stale_listing_keys = existing_listing_keys.delete_if{|key| fresh_listing_keys.include? key }
|
19
|
-
stale_listing_keys.each do |listing_key|
|
20
|
-
Listing.find_by(listing_key: listing_key).destroy
|
21
|
-
end
|
22
|
-
stale_listing_keys
|
23
|
-
end
|
24
|
-
|
25
|
-
def set_import_format
|
26
|
-
self.import_format = ImportFormat.find_by(name: 'reso') unless self.import_format.present?
|
27
|
-
end
|
28
|
-
|
29
|
-
def source_url_last_modified
|
30
|
-
open(self.source_url,
|
31
|
-
http_basic_authentication: [self.source_user, self.source_pass],
|
32
|
-
allow_redirections: :all
|
33
|
-
){|f| return f.last_modified }
|
34
|
-
end
|
35
|
-
|
36
|
-
def new_source_data_exists?
|
37
|
-
source_url_last_modified = self.source_url_last_modified
|
38
|
-
if source_url_last_modified.present? && self.source_data_modified.present?
|
39
|
-
DateTime.parse(source_url_last_modified.to_s) > DateTime.parse(self.source_data_modified.to_s) ? true : false
|
40
|
-
else
|
41
|
-
true
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def run_import
|
46
|
-
if self.status == 'active'
|
47
|
-
self.update_attribute(:status, :running)
|
48
|
-
if self.new_source_data_exists?
|
49
|
-
|
50
|
-
source_data_modified = self.source_url_last_modified
|
51
|
-
self.update_attribute(:source_data_modified, source_data_modified)
|
52
|
-
|
53
|
-
listing_count, count, found_listing_keys, snapshots, stream = 0, 0, [], [], ''
|
54
|
-
open_tag, close_tag = get_open_and_closing_tag_for self.repeating_element
|
55
|
-
|
56
|
-
# Grab a file to work with
|
57
|
-
filepath = download_feed_to_import self
|
58
|
-
filepath = uncompress_and_return_new_filepath(filepath) if filepath.split('.').last.downcase == 'gz'
|
59
|
-
|
60
|
-
# Grab the XML header to avoid namespace errors later
|
61
|
-
xml_header = get_xml_header filepath, self.repeating_element
|
62
|
-
|
63
|
-
start_time = Time.now
|
64
|
-
import_result = ImportResult.create(import: self, start_time: start_time, source_data_modified: source_data_modified)
|
65
|
-
File.foreach(filepath) do |line|
|
66
|
-
stream += line
|
67
|
-
while (from_here = stream.index(open_tag)) && (to_there = stream.index(close_tag))
|
68
|
-
xml = stream[from_here..to_there + (close_tag.length-1)]
|
69
|
-
doc = Nokogiri::XML([xml_header, xml].join).remove_namespaces!
|
70
|
-
found_listing_keys << create_queued_listing_and_return_listing_key(doc, self)
|
71
|
-
stream.gsub!(xml, '')
|
72
|
-
if ((listing_count += 1) % 100).zero?
|
73
|
-
GC.start
|
74
|
-
snapshots << [listing_count, listing_count/(Time.now - start_time)]
|
75
|
-
import_result.update_attribute(:snapshots, snapshots) if (listing_count % 1000).zero?
|
76
|
-
puts snapshots.last.inspect if Rails.env.development?
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
snapshots << [listing_count, listing_count/(Time.now - start_time)]
|
81
|
-
end_time = Time.now
|
82
|
-
self.update_attribute(:status, :active)
|
83
|
-
removed_listing_keys = self.remove_listings_not_present(found_listing_keys)
|
84
|
-
import_result.assign_attributes({
|
85
|
-
end_time: end_time,
|
86
|
-
found_listing_keys: found_listing_keys,
|
87
|
-
removed_listing_keys: removed_listing_keys,
|
88
|
-
snapshots: snapshots
|
89
|
-
})
|
90
|
-
import_result.save
|
91
|
-
File.delete(filepath)
|
92
|
-
end
|
93
|
-
self.update_attribute(:status, :active)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def download_feed_to_import import
|
98
|
-
filename = [Time.now.to_s.parameterize, import.source_url.split('/').last].join
|
99
|
-
filepath = Rails.root.join('tmp', filename).to_s
|
100
|
-
File.delete(filepath) if File.file? filepath
|
101
|
-
open(filepath, 'wb') do |file|
|
102
|
-
file << open(import.source_url,
|
103
|
-
http_basic_authentication: [import.source_user, import.source_pass],
|
104
|
-
allow_redirections: :all
|
105
|
-
).read
|
106
|
-
end
|
107
|
-
filepath
|
108
|
-
end
|
109
|
-
|
110
|
-
def get_open_and_closing_tag_for repeating_element
|
111
|
-
content_tag(repeating_element, "\n").split
|
112
|
-
end
|
113
|
-
|
114
|
-
def get_xml_header filepath, repeating_element
|
115
|
-
stream = ''
|
116
|
-
open_tag = get_open_and_closing_tag_for(repeating_element).first
|
117
|
-
File.foreach(filepath) do |line|
|
118
|
-
stream += line
|
119
|
-
pos = stream.index(open_tag)
|
120
|
-
return stream[0..pos-1] if pos
|
121
|
-
end
|
122
|
-
nil # Just in cases
|
123
|
-
end
|
124
|
-
|
125
|
-
def create_queued_listing_and_return_listing_key doc, import
|
126
|
-
begin
|
127
|
-
doc.css(import.repeating_element).each do |o|
|
128
|
-
listing_data = {}
|
129
|
-
Hash.from_xml(o.to_xml)[import.repeating_element].each_pair{|key, value| listing_data[key] = value }
|
130
|
-
queued_listing = QueuedListing.new(import: import, listing_data: listing_data)
|
131
|
-
queued_listing.save
|
132
|
-
return Mapper::unique_identifier(queued_listing)
|
133
|
-
end
|
134
|
-
rescue Exception => e
|
135
|
-
puts e.inspect
|
136
|
-
exit if Rails.env.development?
|
137
|
-
return nil
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def uncompress_and_return_new_filepath filepath
|
142
|
-
output_path = [filepath, '.xml'].join
|
143
|
-
File.delete(output_path) if File.file? output_path
|
144
|
-
Zlib::GzipReader.open(filepath) do |gz|
|
145
|
-
File.open(output_path, "w") do |g|
|
146
|
-
IO.copy_stream(gz, g)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
File.delete(filepath)
|
150
|
-
output_path
|
151
|
-
end
|
152
|
-
|
153
|
-
end
|
data/app/models/import_format.rb
DELETED
data/app/models/import_result.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
class ImportResult < ActiveRecord::Base
|
2
|
-
belongs_to :import
|
3
|
-
enum status: [ :starting, :running, :finishing, :finished, :stalled, :aborted ]
|
4
|
-
serialize :found_listing_keys
|
5
|
-
serialize :removed_listing_keys
|
6
|
-
serialize :snapshots
|
7
|
-
|
8
|
-
def found_count_difference
|
9
|
-
previous_run = self.import.import_results.where(['start_time < ?', self.start_time]).order("start_time DESC").limit(1).first
|
10
|
-
previous_run.present? ? self.found_listing_keys.count - previous_run.found_listing_keys.count : nil
|
11
|
-
end
|
12
|
-
end
|
data/app/models/listing.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
class Listing < ActiveRecord::Base
|
2
|
-
|
3
|
-
belongs_to :architecture_style, optional: true
|
4
|
-
belongs_to :brokerage, optional: true
|
5
|
-
belongs_to :builder, optional: true
|
6
|
-
belongs_to :community, optional: true
|
7
|
-
belongs_to :county, optional: true
|
8
|
-
belongs_to :foreclosure_status, optional: true
|
9
|
-
belongs_to :franchise, optional: true
|
10
|
-
belongs_to :import, optional: true
|
11
|
-
belongs_to :listing_category, optional: true
|
12
|
-
belongs_to :listing_provider, optional: true
|
13
|
-
belongs_to :listing_status, optional: true
|
14
|
-
belongs_to :multiple_listing_service, optional: true
|
15
|
-
belongs_to :property_sub_type, optional: true
|
16
|
-
belongs_to :property_type, optional: true
|
17
|
-
belongs_to :office, optional: true
|
18
|
-
belongs_to :zoning_type, optional: true
|
19
|
-
|
20
|
-
has_one :address, as: :addressable, dependent: :destroy
|
21
|
-
|
22
|
-
has_many :alternate_prices, dependent: :destroy
|
23
|
-
has_many :expenses, dependent: :destroy
|
24
|
-
has_many :open_houses, dependent: :destroy
|
25
|
-
has_many :photos, dependent: :destroy
|
26
|
-
has_many :people, through: :participants
|
27
|
-
has_many :rooms, dependent: :destroy
|
28
|
-
has_many :taxes, dependent: :destroy
|
29
|
-
has_many :videos, dependent: :destroy
|
30
|
-
has_many :virtual_tours, dependent: :destroy
|
31
|
-
|
32
|
-
has_and_belongs_to_many :appliances, association_foreign_key: "enumeration_id"
|
33
|
-
has_and_belongs_to_many :cooling_systems, association_foreign_key: "enumeration_id"
|
34
|
-
has_and_belongs_to_many :exterior_types, association_foreign_key: "enumeration_id"
|
35
|
-
has_and_belongs_to_many :floor_coverings, association_foreign_key: "enumeration_id"
|
36
|
-
has_and_belongs_to_many :heating_fuels, association_foreign_key: "enumeration_id"
|
37
|
-
has_and_belongs_to_many :heating_systems, association_foreign_key: "enumeration_id"
|
38
|
-
has_and_belongs_to_many :home_features, association_foreign_key: "enumeration_id"
|
39
|
-
has_and_belongs_to_many :neighborhoods, association_foreign_key: "place_id"
|
40
|
-
has_and_belongs_to_many :parking, association_foreign_key: "enumeration_id"
|
41
|
-
has_and_belongs_to_many :participants
|
42
|
-
has_and_belongs_to_many :roof_types, association_foreign_key: "enumeration_id"
|
43
|
-
has_and_belongs_to_many :view_types, association_foreign_key: "enumeration_id"
|
44
|
-
|
45
|
-
accepts_nested_attributes_for :alternate_prices, allow_destroy: true
|
46
|
-
accepts_nested_attributes_for :appliances
|
47
|
-
accepts_nested_attributes_for :cooling_systems
|
48
|
-
accepts_nested_attributes_for :expenses, allow_destroy: true
|
49
|
-
accepts_nested_attributes_for :exterior_types
|
50
|
-
accepts_nested_attributes_for :floor_coverings
|
51
|
-
accepts_nested_attributes_for :heating_fuels
|
52
|
-
accepts_nested_attributes_for :heating_systems
|
53
|
-
accepts_nested_attributes_for :home_features
|
54
|
-
accepts_nested_attributes_for :neighborhoods
|
55
|
-
accepts_nested_attributes_for :open_houses, allow_destroy: true
|
56
|
-
accepts_nested_attributes_for :parking
|
57
|
-
accepts_nested_attributes_for :participants, allow_destroy: true
|
58
|
-
accepts_nested_attributes_for :roof_types
|
59
|
-
accepts_nested_attributes_for :rooms, allow_destroy: true
|
60
|
-
accepts_nested_attributes_for :taxes, allow_destroy: true
|
61
|
-
accepts_nested_attributes_for :view_types
|
62
|
-
|
63
|
-
end
|
64
|
-
|
data/app/models/listing_media.rb
DELETED
data/app/models/neighborhood.rb
DELETED
data/app/models/office.rb
DELETED
data/app/models/open_house.rb
DELETED
data/app/models/parking.rb
DELETED
data/app/models/participant.rb
DELETED
data/app/models/person.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
class Person < ActiveRecord::Base
|
2
|
-
belongs_to :gender
|
3
|
-
|
4
|
-
def complete_name
|
5
|
-
# Dr. Edwin E. 'Buzz' Aldrin Jr.
|
6
|
-
|
7
|
-
self.nick_name.blank? ? nick_name = nil : nick_name = "'#{self.nick_name}'"
|
8
|
-
self.middle_name.blank? ? middle_name = nil : middle_name = "#{self.middle_name.first.upcase}."
|
9
|
-
[
|
10
|
-
self.personal_title,
|
11
|
-
self.first_name,
|
12
|
-
middle_name,
|
13
|
-
nick_name,
|
14
|
-
self.last_name,
|
15
|
-
self.suffix
|
16
|
-
].delete_if{|i| i.blank? }.join(' ')
|
17
|
-
end
|
18
|
-
end
|
data/app/models/photo.rb
DELETED
data/app/models/place.rb
DELETED
data/app/models/price.rb
DELETED
data/app/models/property_type.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
class QueuedListing < ActiveRecord::Base
|
2
|
-
belongs_to :import
|
3
|
-
serialize :listing_data
|
4
|
-
after_save :create_listing_and_remove_myself
|
5
|
-
|
6
|
-
def mapper
|
7
|
-
"Mapper::#{self.import.import_format.name.downcase.capitalize}".constantize
|
8
|
-
end
|
9
|
-
|
10
|
-
def create_or_update_listing
|
11
|
-
listing = self.import.listings.
|
12
|
-
eager_load(:address).
|
13
|
-
eager_load(:appliances).
|
14
|
-
eager_load(:participants).
|
15
|
-
eager_load(:photos).
|
16
|
-
find_or_initialize_by(
|
17
|
-
listing_key: Mapper::unique_identifier(self)
|
18
|
-
)
|
19
|
-
if (listing.modification_timestamp != mapper.modification_timestamp(self, listing))
|
20
|
-
Mapper::RESO_LISTING_ATTRIBUTES.each do |attribute|
|
21
|
-
listing.send("#{attribute}=", mapper.send(attribute, self, listing))
|
22
|
-
end
|
23
|
-
listing.save
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def create_listing_and_remove_myself
|
28
|
-
create_or_update_listing ? self.destroy : false
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
data/app/models/roof_type.rb
DELETED
data/app/models/room.rb
DELETED
data/app/models/room_category.rb
DELETED
data/app/models/school.rb
DELETED
data/app/models/tax.rb
DELETED
data/app/models/video.rb
DELETED
data/app/models/view_type.rb
DELETED
data/app/models/virtual_tour.rb
DELETED