Update main with development#24
Conversation
- api_venues now serializes agents_primary_types alongside primary_type_display - VenueRow type gains agents_primary_types: string[] - Venues table Type column shows AI labels (comma-joined); falls back to primary_type_display for venues not yet classified Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
event size done
feat(venues): display agents_primary_types in venues UI
- Extend api_events to return organizer_slug and venue_slug - Add api_venue_detail JSON endpoint and URL - Add VenueDetail type and api.venue() client method - Render organizer/venue as links when slug is available, plain text otherwise - Create new /venues/[slug] detail page mirroring organizer detail layout Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…l page Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(events): clickable organizer and venue links
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Feat/clickthecity
…and email Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds GET /api/organizers/export/ that streams a CSV of all organizers matching the current q/status filters with no pagination. Columns: Name, Email, Phone, Website, Address, City, Country, Facebook, Instagram, Source. Frontend organizers page gets an Export CSV button that passes the active filter state into the download URL. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…root Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(ui): rebrand sidebar, remove notification bell and email
feat(organizers): add CSV export
chore: remove debug scripts and HTML/screenshot artifacts
… spam - Events page: add Source and Category select dropdowns backed by existing api.eventsBySource() and api.eventsByCategory() endpoints - All table pages (events, venues, organizers): disable Previous/Next buttons while loading to prevent duplicate requests on rapid clicks Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nizers Events: - Sort by name / starts_at via backend ordering param - Upcoming only toggle filter Venues: - Sort by name, city, rating, event_count via backend ordering param - Type filter dropdown (new api/venues/types/ endpoint) - ordering resets when switching status tabs Organizers: - Add sortable Source column (client-side) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add enriched_at and enrichment_source fields to Organizer model - Fix save_organizers() to merge-not-overwrite existing contact data - Add DIFFBOT_API_KEY and HUNTER_API_KEY to settings - New management command: enrich_organizers (--limit, --dry-run, --force, --delay) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes Diffbot and Hunter.io API dependencies in favor of a self-contained HTML crawler. Adds contact_extractor.py as a shared extraction helper and rewrites the enrich_organizers management command to use direct HTTP crawling. Drops DIFFBOT_API_KEY and HUNTER_API_KEY from settings. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…et encoding Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Active Sources StatCard now displays data.scrapers.length as the primary
value (number of scrapers registered in Scraper Center) and
data.stats.active_sources as the sub-label ("N with events"), replacing
the previous inversion.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…elect, deduplicate organizer source display Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(ui): source/category filters on events table + pagination spam fix
…row DedupResult entity type Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…fix always_update set Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…pdate Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Feat deduplication
feat(organizers): crawler-based enrichment (no API keys)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(dashboard): show scraper center count as active sources
Feat/meetup eventalways
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (47)
📝 WalkthroughWalkthroughAdds a two-layer cross-source deduplication system ( ChangesDedup System, New Scrapers, Organizer Enrichment, and Frontend Expansions
Sequence Diagram(s)sequenceDiagram
participant Frontend
participant DjangoAPI
participant DedupScript as scripts/deduplicate.py
participant DeduPy as scripts/dedup.py
participant PostgresDB
Frontend->>DjangoAPI: POST /api/scrapers/dedup/ {entity}
DjangoAPI->>DjangoAPI: acquire _DEDUP_LOCK (non-blocking)
DjangoAPI->>DedupScript: subprocess.run --entity venues/organizers/events
DedupScript->>PostgresDB: connect via DATABASE_URL
DedupScript->>DeduPy: find_X_duplicates(cursor)
DeduPy->>PostgresDB: SELECT rows, group by normalized key
DeduPy-->>DedupScript: [[winner_id, loser_ids], ...]
loop each group
DedupScript->>DeduPy: merge_X(cursor, winner_id, loser_ids)
DeduPy->>PostgresDB: UPDATE winner fields
DeduPy->>PostgresDB: UPDATE FK references on events_event
DeduPy->>PostgresDB: DELETE loser rows
DedupScript->>PostgresDB: COMMIT
end
DedupScript-->>DjangoAPI: stdout summary
DjangoAPI-->>Frontend: {output, entity}
sequenceDiagram
participant BaseScraper
participant SaveOrganizers as save_organizers
participant DedupAfterSave as _dedup_after_save
participant DeduPy as scripts/dedup.py logic (inline)
participant OrganizerDB
BaseScraper->>SaveOrganizers: [ScrapedOrganizer, ...]
loop each organizer
SaveOrganizers->>OrganizerDB: INSERT or UPDATE (always_update fields + blank-fill)
SaveOrganizers->>SaveOrganizers: collect organizer_ids
end
SaveOrganizers->>DedupAfterSave: ("organizers", organizer_ids)
DedupAfterSave->>OrganizerDB: SELECT rows WHERE id IN organizer_ids
DedupAfterSave->>DedupAfterSave: bucket by normalized website/name
DedupAfterSave->>OrganizerDB: UPDATE winner + remap FK + DELETE losers
DedupAfterSave-->>SaveOrganizers: (exceptions swallowed)
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Suggested reviewers
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Summary by CodeRabbit
New Features
UI/UX Improvements