diff --git a/.bak b/.bak new file mode 100644 index 0000000..11ee167 Binary files /dev/null and b/.bak differ diff --git a/202511291306.sqlite.bak b/202511291306.sqlite.bak new file mode 100644 index 0000000..d013c16 Binary files /dev/null and b/202511291306.sqlite.bak differ diff --git a/baks/202511291301.sqlite.bak b/baks/202511291301.sqlite.bak new file mode 100644 index 0000000..11ee167 Binary files /dev/null and b/baks/202511291301.sqlite.bak differ diff --git a/baks/202511291303.sqlite.bak b/baks/202511291303.sqlite.bak new file mode 100644 index 0000000..11ee167 Binary files /dev/null and b/baks/202511291303.sqlite.bak differ diff --git a/config/django/base.py b/config/django/base.py index 848ee19..b153b0e 100644 --- a/config/django/base.py +++ b/config/django/base.py @@ -19,6 +19,7 @@ INSTALLED_APPS = [ "rest_framework_api_key", 'socials', 'events', + 'config', # 'academia_nuts', # 'leg_info', ] @@ -45,5 +46,15 @@ DATABASES = { } } +CORS_ALLOWED_ORIGINS = [ + 'http://localhost:5173', + 'https://digisnaxx.com', + 'https://www.digisnaxx.com', + 'https://www.canincarlos.com', + 'https://canincarlos.com', + 'https://dreamfreely.org', + 'https://www.dreamfreely.org' + ] + from config.django.core import * from config.settings.restframework import * \ No newline at end of file diff --git a/config/django/local.py b/config/django/local.py index c3127c9..e5eeae0 100644 --- a/config/django/local.py +++ b/config/django/local.py @@ -7,4 +7,13 @@ DEBUG = env.bool('DEBUG', default=True) ALLOWED_HOSTS=['localhost',] CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS') # CORS_ALLOWED_ORIGINS=env.list('CORS_ALLOWED_ORIGINS') -CORS_ALLOWED_ORIGINS=['http://localhost:5173', 'https://digisnaxx.com'] \ No newline at end of file + +CORS_ALLOWED_ORIGINS = [ + 'http://localhost:5173', + 'https://digisnaxx.com', + 'https://www.digisnaxx.com', + 'https://www.canincarlos.com', + 'https://canincarlos.com', + 'https://dreamfreely.org', + 'https://www.dreamfreely.org' + ] \ No newline at end of file diff --git a/config/django/prod.py b/config/django/prod.py index a117694..5985b2c 100644 --- a/config/django/prod.py +++ b/config/django/prod.py @@ -5,4 +5,14 @@ SECRET_KEY = env('SECRET_KEY') DEBUG = env.bool('DEBUG', default=False) ALLOWED_HOSTS = env.list('ALLOWED_HOSTS') CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS') -CORS_ALLOWED_ORIGINS=env.list('CORS_ALLOWED_ORIGINS') \ No newline at end of file + + +CORS_ALLOWED_ORIGINS = [ + 'http://localhost:5173', + 'https://digisnaxx.com', + 'https://www.digisnaxx.com', + 'https://www.canincarlos.com', + 'https://canincarlos.com', + 'https://dreamfreely.org', + 'https://www.dreamfreely.org' + ] \ No newline at end of file diff --git a/events/admin.py b/events/admin.py index e42225d..4147d11 100644 --- a/events/admin.py +++ b/events/admin.py @@ -13,13 +13,16 @@ class OrganizationAdmin(admin.ModelAdmin): class EventAdmin(admin.ModelAdmin): # prepopulated_fields = {"slug": ("shortname",)} - list_display = ( "show_title", "event_type", "show_date", "calendar") - list_filter = ("calendar", "venue", "event_type",) + list_display = ( "show_title", "event_type", "show_date", "scraper") + list_filter = ("calendar", "event_type", "scraper",) class PromoAdmin(admin.ModelAdmin): # prepopulated_fields = {"slug": ("shortname",)} - list_display = ("title", "organization", "promo_type", "published") - list_filter = ("promo_type",) + list_display = ("title", "organization", "get_calendars", "published") + list_filter = ("calendar__shortcode", "promo_type") + + def get_calendars(self, obj): + return "\n".join([p.shortcode for p in obj.calendar.all()]) # Register your models here. diff --git a/events/digitools.py b/events/digitools.py index bbfe312..8b7e7a9 100644 --- a/events/digitools.py +++ b/events/digitools.py @@ -7,9 +7,6 @@ from lxml import html from pprint import pprint as ppr import django -sys.path.append('../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' -django.setup() from xvfbwrapper import Xvfb from selenium import webdriver as wd @@ -21,12 +18,20 @@ td = relativedelta.relativedelta(months=1) odt = datetime.now() + td -def getScraper(venue): +def getReady(): + sys.path.append('../../') + os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' + django.setup() + return + + +def getScraper(venue, cal): + virtcal = Calendar.objects.get(shortcode='000') try: scraper, created = Scraper.objects.get_or_create( name=venue.name, website=venue.website, - calendar = Calendar.objects.get(id=1), + calendar = Calendar.objects.get(shortcode=cal), items = 0, new_items = 0, last_ran = datetime.now(), @@ -39,7 +44,7 @@ def getScraper(venue): scraper.save() print("Scraper: ", scraper) pass - return scraper, scraper.items + return scraper, scraper.items, virtcal def updateScraper(scraper, item_count_start): num_of_events = DSEvent.objects.filter(scraper=scraper) @@ -143,6 +148,25 @@ def createDashURL(site_url): print(links) return links +def add_calendar(event, calendar): + print("\nNEW EVENT DIGITOOLS: ", event, type(event), calendar) + if type(event) is tuple: + print("STS: ", event) + event = event[0] + cal = Calendar.objects.get(shortcode=calendar) + event.calendar.add(cal) + event.save() + return event + +def add_calendars(event, data): + if type(data['calendars']) is not list: + event.calendar.add(data['calendars']) + else: + for cal in data['calendars']: + event.calendar.add(cal) + event.save() + return event + def createBasicEvent(event, event_type, venue): new_event, created = DSEvent.objects.update_or_create( event_type = event_type, @@ -150,26 +174,23 @@ def createBasicEvent(event, event_type, venue): show_link = event['link'], show_date = event['dateStamp'], show_day = event['dateStamp'], - calendar = event['calendar'], scraper = event['scraper'], venue = venue ) + new_event = add_calendars(new_event, event) return new_event, created def createBasiciCalEvent(event, event_type, venue): - print("starting create") - ppr(event) new_event, created = DSEvent.objects.update_or_create( event_type = event_type, show_title = event['title'][0], show_link = event['link'], show_date = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S'), show_day = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S'), - calendar = event['calendar'], scraper = event['scraper'], venue = venue ) - print("created") + new_event = add_calendars(new_event, event) return new_event, created def createDetailedEvent(event, event_type, venue, scraper): @@ -178,13 +199,13 @@ def createDetailedEvent(event, event_type, venue, scraper): show_title = event["show_title"], show_link = event["link"], show_date = event["dateStamp"], - show_day = event["dateStamp"], + show_day = event['dateStamp'], guests = " ".join(event["guests"]), more_details = event["details"], - calendar = event['calendar'], scraper = event['scraper'], venue = venue ) + new_event = add_calendars(new_event, event) return new_event, created def createBasicArticle(article, event_type, organization): @@ -206,24 +227,27 @@ def createIcalEvent(event, scraper, venue, event_type): new_event['date'] = str(new_date)[:-6], new_event['dateStamp'] = str(new_date)[:-6], new_event['link'] = venue.website + print("NEW iCal Event") + ppr(new_event) createBasiciCalEvent(new_event, event_type, venue) def createCleanIcalEvent(event, scraper, venue, event_type): new_date = event['dateStart'] new_event = {} new_event['scraper'] = scraper - new_event['calendar'] = scraper.calendar + new_event['calendars'] = scraper.calendar new_event['title'] = event['strSummary'], new_event['date'] = str(new_date), new_event['dateStamp'] = str(new_date), new_event['link'] = venue.website createBasiciCalEvent(new_event, event_type, venue) -def getiCalEvents(gcal, scraper, venue): +def getiCalEvents(gcal, scraper, venue, event_type): + events = [] for component in gcal.walk(): event = {} event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['strSummary'] = f"{(component.get('SUMMARY'))}" event['strDesc'] = component.get('DESCRIPTION') event['strLocation'] = component.get('LOCATION') @@ -247,17 +271,58 @@ def getiCalEvents(gcal, scraper, venue): "description" : event['strDesc'], "Location" : event['strLocation'], } - now_now = datetime.today().date() + events.append(event) + return events + +def returniCalEvents(gcal, scraper, venue, event_type): + events = [] + for component in gcal.walk(): + event = {} + event['scraper'] = scraper + event['calendars'] = [scraper.calendar] + event['strSummary'] = f"{(component.get('SUMMARY'))}" + event['strDesc'] = component.get('DESCRIPTION') + event['strLocation'] = component.get('LOCATION') + event['dateStart'] = component.get('DTSTART') + event['dateStamp'] = component.get('DTSTAMP') + if event['dateStamp'] is not None: + event['dateStamp'] = event['dateStamp'].dt + if event['dateStart'] is not None: try: - print("1Event: ", event['dateStart']) - if event['dateStart'] > now_now: - createIcalEvent(event, scraper, venue) + event['dateStart'] = event['dateStart'].dt except Exception as e: - try: - event['dateStart'] = event['dateStart'].date() - print("1Event: ", event['dateStart']) - if event['dateStart'] > now_now: - createIcalEvent(event, scraper, venue) - except Exception as e: - print("The Error: ", e) - pass \ No newline at end of file + event['dateStart'] = event['dateStart'].dt + + event['dateEnd'] = (component.get('DTEND')) + if event['dateEnd'] is not None: + event['dateEnd'] = event['dateEnd'].dt + else: + event['dateEnd'] = event['dateStart'] + if event['strSummary'] != 'None': + event['details'] = { + "description" : event['strDesc'], + "Location" : event['strLocation'], + } + events.append(event) + now_now = datetime.today().date() + try: + print("1Event: ", event['dateStart']) + if event['dateStart'] > now_now: + print("Check Check: ", event['dateStart']) + createIcalEvent(event, scraper, venue, event_type) + else: + print("WHAT?") + ppr(event) + except Exception as e: + try: + event['dateStart'] = event['dateStart'].date() + print("2Event: ", event['dateStart']) + if event['dateStart'] > now_now: + print("Check Check: ", event['dateStart']) + createIcalEvent(event, scraper, venue, event_type) + else: + print("WHAT?") + ppr(event) + except Exception as e: + print("The Error: ", e) + pass \ No newline at end of file diff --git a/events/fixtures/calendars.json b/events/fixtures/calendars.json new file mode 100644 index 0000000..c0c5c8a --- /dev/null +++ b/events/fixtures/calendars.json @@ -0,0 +1,38 @@ +[ + { + "model": "events.calendar", + "pk": 1, + "fields": { + "name": "Virtual", + "shortcode": "000", + "desc": "Virtual Events" + } + }, + { + "model": "events.calendar", + "pk": 2, + "fields": { + "name": "Mpls-StP", + "shortcode": "msp", + "desc": "none" + } + }, + { + "model": "events.calendar", + "pk": 3, + "fields": { + "name": "Medellin", + "shortcode": "mde", + "desc": "none" + } + }, + { + "model": "events.calendar", + "pk": 4, + "fields": { + "name": "Bakata", + "shortcode": "bog", + "desc": "Bogota, Colombia" + } + } +] \ No newline at end of file diff --git a/events/fixtures/organizations.json b/events/fixtures/organizations.json deleted file mode 100644 index 504082b..0000000 --- a/events/fixtures/organizations.json +++ /dev/null @@ -1,1118 +0,0 @@ -[ -{ - "model": "events.organization", - "pk": 1, - "fields": { - "name": "DreamFreely", - "website": "https://www.dreamfreely.org", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": "Canin Carlos", - "contact_email": "canin@dreamfreely.org", - "phone_number": "6124054535", - "address": null, - "city": "St Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 2, - "fields": { - "name": "Acme Comedy Club", - "website": "https://acmecomedycompany.com/the-club/calendar/", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 3, - "fields": { - "name": "Amsterdam Bar & Hall", - "website": "https://www.amsterdambarandhall.com/events-new/", - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 4, - "fields": { - "name": "The Cedar Cultural Center", - "website": "https://www.thecedar.org/listing", - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 5, - "fields": { - "name": "Club 331", - "website": "https://331club.com", - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 6, - "fields": { - "name": "Eastside Freedom Library", - "website": "https://eastsidefreedomlibrary.org/events/", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 7, - "fields": { - "name": "Ginkgo Coffee", - "website": "https://ginkgocoffee.com/events/", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Saint Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 8, - "fields": { - "name": "Green Room", - "website": "https://www.greenroommn.com/events", - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 9, - "fields": { - "name": "Chicago Ave Fire Arts Center", - "website": "https://www.cafac.org/classes", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 10, - "fields": { - "name": "Bunkers", - "website": "https://bunkersmusic.com/calendar/", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 11, - "fields": { - "name": "Center for Performing Arts", - "website": "https://www.cfpampls.com/events", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 12, - "fields": { - "name": "Eagles #34", - "website": "https://www.minneapoliseagles34.org/events-entertainment.html", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 13, - "fields": { - "name": "KJ's Hideaway", - "website": "", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 14, - "fields": { - "name": "location", - "website": "", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 15, - "fields": { - "name": "Sociable Ciderwerks", - "website": "https://sociablecider.com/events", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 16, - "fields": { - "name": "Terminal Bar", - "website": "https://terminalbarmn.com", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 17, - "fields": { - "name": "Icehouse", - "website": "https://icehouse.turntabletickets.com", - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 18, - "fields": { - "name": "Magers & Quinn", - "website": "https://www.magersandquinn.com/events", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 19, - "fields": { - "name": "MN Launch", - "website": "ps://mn.gov/launchmn/calendar", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 20, - "fields": { - "name": "Red Wing Ignite ", - "website": "https://mn.gov/launchmn/calendar", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Red Wing", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 21, - "fields": { - "name": "Guthrie Theater ", - "website": "https://mn.gov/launchmn/calendar", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 22, - "fields": { - "name": "Bad Habit Brewing ", - "website": "https://mn.gov/launchmn/calendar", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Joseph", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 23, - "fields": { - "name": "Wilder Foundation ", - "website": "https://mn.gov/launchmn/calendar", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Saint Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 24, - "fields": { - "name": "Pryes Brewing Company ", - "website": "https://mn.gov/launchmn/calendar", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 25, - "fields": { - "name": "Hybrid ", - "website": "https://mn.gov/launchmn/calendar", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Red Wing", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 26, - "fields": { - "name": "Mn House", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 27, - "fields": { - "name": "Mn Senate", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 28, - "fields": { - "name": "Mn Legislature", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 29, - "fields": { - "name": "Public Service Center", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 30, - "fields": { - "name": "Public Service Building", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 31, - "fields": { - "name": "Powderhorn Recreation Center - Multipurpose Room", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 32, - "fields": { - "name": "2nd Floor", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 33, - "fields": { - "name": "All Office Locations", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 34, - "fields": { - "name": "Mpls City Hall", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 35, - "fields": { - "name": "Phillips Community Center", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 36, - "fields": { - "name": "Farview Park Recreation Center", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 37, - "fields": { - "name": "Uptown VFW", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 38, - "fields": { - "name": "Parkway Theater", - "website": "https://theparkwaytheater.com", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 39, - "fields": { - "name": "Piller Forum", - "website": "https://www.pilllar.com/pages/events", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 41, - "fields": { - "name": "Somewhere in St Paul", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 42, - "fields": { - "name": "White Squirrel", - "website": "https://whitesquirrelbar.com", - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 43, - "fields": { - "name": "Cedar Cultural Center", - "website": "https://www.thecedar.org", - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 44, - "fields": { - "name": "7th St Entry", - "website": null, - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 45, - "fields": { - "name": "Fine Line", - "website": null, - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 46, - "fields": { - "name": "Turf Club", - "website": null, - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 47, - "fields": { - "name": "First Avenue", - "website": null, - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 48, - "fields": { - "name": "State Theatre", - "website": null, - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 49, - "fields": { - "name": "The Fitzgerald Theater", - "website": null, - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 50, - "fields": { - "name": "Palace Theatre", - "website": null, - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 51, - "fields": { - "name": "Hook & Ladder", - "website": "", - "membership": "0", - "is_venue": true, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 52, - "fields": { - "name": "Ordway Concert Hall", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 53, - "fields": { - "name": "Temple Israel", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 54, - "fields": { - "name": "Ted Mann Concert Hall", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 55, - "fields": { - "name": "Capri Theater", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 56, - "fields": { - "name": "Shepherd of the Valley Lutheran Church", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Apple Valley", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 57, - "fields": { - "name": "St. Andrew's Lutheran Church", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Mahtomedi", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 58, - "fields": { - "name": "Wooddale Church", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Eden Prairie", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 59, - "fields": { - "name": "Saint Paul's United Church of Christ", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Summit Avenue", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 60, - "fields": { - "name": "MN House", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 61, - "fields": { - "name": "MN Senate", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 62, - "fields": { - "name": "MN Legislature", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "St. Paul", - "state": null, - "zip_code": null - } -}, -{ - "model": "events.organization", - "pk": 63, - "fields": { - "name": "Franklin Library - Hennepin County Library", - "website": null, - "membership": "0", - "is_venue": false, - "is_501c": false, - "contact_name": null, - "contact_email": null, - "phone_number": null, - "address": null, - "city": "Minneapolis", - "state": null, - "zip_code": null - } -} -] diff --git a/events/fixtures/orgs.json b/events/fixtures/orgs.json new file mode 100644 index 0000000..c75ddf5 --- /dev/null +++ b/events/fixtures/orgs.json @@ -0,0 +1,994 @@ +[ + { + "model": "events.organization", + "pk": 1, + "fields": { + "name": "DreamFreely", + "website": "https://www.dreamfreely.org", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": null, + "state": null, + "zip_code": null, + "phone_number": "6124054535", + "business_email": "canin@dreamfreely.org", + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": "Canin Carlos", + "contact_email": "canin@dreamfreely.org", + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 2, + "fields": { + "name": "Acme Comedy Club", + "website": "https://acmecomedycompany.com/the-club/calendar/", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 3, + "fields": { + "name": "Amsterdam Bar & Hall", + "website": "https://www.amsterdambarandhall.com/events-new/", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "St. Paul", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 4, + "fields": { + "name": "Cedar Cultural Center", + "website": "https://www.thecedar.org", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 5, + "fields": { + "name": "Club 331", + "website": "https://331club.com", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 6, + "fields": { + "name": "First Avenue", + "website": "https://first-avenue.com", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 7, + "fields": { + "name": "Palace Theatre", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 8, + "fields": { + "name": "7th St Entry", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 9, + "fields": { + "name": "The Fitzgerald Theater", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "St. Paul", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 10, + "fields": { + "name": "Turf Club", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "St. Paul", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 11, + "fields": { + "name": "Fine Line", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 12, + "fields": { + "name": "icehouse MPLS", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 13, + "fields": { + "name": "Ginkgo Coffee", + "website": "https://ginkgocoffee.com/events/", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Saint Paul", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 14, + "fields": { + "name": "Green Room", + "website": "https://www.greenroommn.com/events", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 15, + "fields": { + "name": "Hook & Ladder", + "website": "https://thehookmpls.com", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 16, + "fields": { + "name": "Magers & Quinn", + "website": "https://www.magersandquinn.com/events", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 17, + "fields": { + "name": "Parkway Theater", + "website": "https://theparkwaytheater.com", + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 18, + "fields": { + "name": "Ordway Concert Hall", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "St. Paul", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 19, + "fields": { + "name": "Wooddale Church", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Eden Prairie", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": 0, + "longitude": 0, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 20, + "fields": { + "name": "Basilica of Saint Mary", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 21, + "fields": { + "name": "The Cedar Cultural Center", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 22, + "fields": { + "name": "The Depot Tavern", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Minneapolis", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": true, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 23, + "fields": { + "name": "DANCEFREE", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 24, + "fields": { + "name": "Blood Dance Company - Sede Laureles", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 25, + "fields": { + "name": "Dulce Posion", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 26, + "fields": { + "name": "Vintrash", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 27, + "fields": { + "name": "The Wandering Paisa", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 28, + "fields": { + "name": "El Poblado", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 29, + "fields": { + "name": "OLSA Certified Spanish School", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 30, + "fields": { + "name": "BaseLang Medellín Spanish School", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 31, + "fields": { + "name": "Terraza El Poblado", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": "Medellin", + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + }, + { + "model": "events.organization", + "pk": 32, + "fields": { + "name": "None", + "website": null, + "membership": "0", + "org_type": "3", + "short_desc": null, + "long_desc": null, + "address_numbers": null, + "address_type": null, + "address_complete": null, + "barrio": null, + "city": null, + "state": null, + "zip_code": null, + "phone_number": null, + "business_email": null, + "is_listed": false, + "is_501c": false, + "is_venue": false, + "latitude": null, + "longitude": null, + "contact_name": null, + "contact_email": null, + "stripe_email": null, + "ein": null, + "tags": [] + } + } +] \ No newline at end of file diff --git a/events/fixtures/promo.2.json b/events/fixtures/promo.2.json deleted file mode 100644 index d9a1e9f..0000000 --- a/events/fixtures/promo.2.json +++ /dev/null @@ -1,452 +0,0 @@ -[ -{ - "model": "events.promo", - "pk": 1, - "fields": { - "title": "DreamFreely", - "organization": 1, - "promo_type": "Jo", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "And intro to the operation.", - "long_text": "

Alright, I guess this is it. This is the game, these are the plays.

\r\n\r\n

Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.

", - "target_link": "https://www.dreamfreely.org", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 2, - "fields": { - "title": "Comuna Andina", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/pa_cover.jpg", - "short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.", - "long_text": "

These are all products from my travels.

\r\n

From hand-woven mochilas, to organic mountain farmed coffee and panela and more.

\r\n

All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.

", - "target_link": "https://www.comunandina.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 3, - "fields": { - "title": "idioke", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/soltoken.png", - "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", - "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", - "target_link": "https://www.idioke.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 4, - "fields": { - "title": "Manifesting Empathy", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/manifestingempathy.png", - "short_text": "Help humans find their roots.", - "long_text": "Help humans find their roots.", - "target_link": "https://www.manifestingempathy.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 5, - "fields": { - "title": "DigiSnaxx LIVE!", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/cover.png", - "short_text": "@ the Acadia. Every Monday. 4pm.", - "long_text": "This is a brave space to converse, relax, listen to music and begin to navigate a path forward.

This is going to be a process.", - "target_link": "https://canin.dreamfreely.org/digisnaxx/", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 6, - "fields": { - "title": "AI & the Last Question", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/cover.png", - "short_text": "A short story by Isaac Asimov", - "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", - "target_link": "https://canin.dreamfreely.org/the-last-question/", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 7, - "fields": { - "title": "idioke", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/soltoken.png", - "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", - "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", - "target_link": "https://www.idioke.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 8, - "fields": { - "title": "AI & the Last Question", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/cover.png", - "short_text": "A short story by Isaac Asimov", - "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", - "target_link": "https://canin.dreamfreely.org/the-last-question/", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 9, - "fields": { - "title": "Comuna Andina", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/pa_cover.jpg", - "short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.", - "long_text": "

These are all products from my travels.

\r\n

From hand-woven mochilas, to organic mountain farmed coffee and panela and more.

\r\n

All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.

", - "target_link": "https://www.comunandina.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 10, - "fields": { - "title": "DreamFreely", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "And intro to the operation.", - "long_text": "

Alright, I guess this is it. This is the game, these are the plays.

\r\n\r\n

Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.

", - "target_link": "https://www.dreamfreely.org", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 11, - "fields": { - "title": "Manifesting Empathy", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/manifestingempathy.png", - "short_text": "Help humans find their roots.", - "long_text": "Help humans find their roots.", - "target_link": "https://www.manifestingempathy.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 12, - "fields": { - "title": "DigiSnaxx & the DBC", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/cover.png", - "short_text": "More info about the project DigiSnaxx.", - "long_text": "

After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.

\r\n

Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.

\r\n

DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.

\r\n

We're not trying to be everything either ...

\r\n

We're trying to be an accessible, community-centered, directory.

", - "target_link": "https://canin.dreamfreely.org/digisnaxx/", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 13, - "fields": { - "title": "Complimentary Street Harrassment", - "organization": 1, - "promo_type": "An", - "overlay_image": "", - "short_text": "It's cultural right?", - "long_text": "I learn about the creation of gender in public space through the lens of a PhD student studying pidopo's, in Colombia.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 14, - "fields": { - "title": "DigiSnaxx & the DBC", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/cover.png", - "short_text": "More info about the project DigiSnaxx.", - "long_text": "

After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.

\r\n

Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.

\r\n

DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.

\r\n

We're not trying to be everything either ...

\r\n

We're trying to be an accessible, community-centered, directory.

", - "target_link": "https://canin.dreamfreely.org/digisnaxx/", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 15, - "fields": { - "title": "DreamFreely Library", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "It's like having an open notebook ...", - "long_text": "It's a work in progress, but you get the idea; and there's still some useful information.", - "target_link": "https://library.dreamfreely.org", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 16, - "fields": { - "title": "Talkin' w/ DiViNCi", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/soltoken.png", - "short_text": "Canin converses with DiViNCi.", - "long_text": "We met a great many number of years ago; before the hills were hills and the trees mere saplings. Haha ... I dunno, but it was definitely a fun conversation.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 17, - "fields": { - "title": "Mpls Stp Mag Calendar", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "", - "short_text": "They got a great list of events.", - "long_text": "They've got a great collection of events; we just don't have the time/resources to parse them all at present; and so pass the link directly on to you.", - "target_link": "https://calendar.mspmag.com/calendars/all-events", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 19, - "fields": { - "title": "Academia Nuts", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "Abstacts coming soon; gotta catch 'em all.", - "long_text": "I've always wanted to make academia more accessible, so here's my go at that!\r\n\r\n", - "target_link": "https://www.academianuts.net", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 20, - "fields": { - "title": "Talkin' w/ DiViNCi", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/soltoken.png", - "short_text": "Canin converses with DiViNCi.", - "long_text": "We met a great many number of years ago; before the hills were hills and the trees mere saplings. Haha ... I dunno, but it was definitely a fun conversation.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 21, - "fields": { - "title": "Rebel Coding", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Enough knowledge to be dangerous.", - "long_text": "

Just covering the basics, we'll be hosting webinars.

\r\n

HTML, CSS, JavaScript & Python.

", - "target_link": "https://www.rebelcoding.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 22, - "fields": { - "title": "Add a Calendar", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Got a calendar for us?", - "long_text": "", - "target_link": "", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 23, - "fields": { - "title": "Add a Calendar", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Got a calendar for us?", - "long_text": "", - "target_link": "", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 24, - "fields": { - "title": "Academia Nuts", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "Abstacts coming soon; gotta catch 'em all.", - "long_text": "I've always wanted to make academia more accessible, so here's my go at that!\r\n\r\n", - "target_link": "https://www.academianuts.net", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 25, - "fields": { - "title": "Rebel Coding", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Enough knowledge to be dangerous.", - "long_text": "

Just covering the basics, we'll be hosting webinars.

\r\n

HTML, CSS, JavaScript & Python.

", - "target_link": "https://www.rebelcoding.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 26, - "fields": { - "title": "Comuna Andina", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/pa_cover.jpg", - "short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.", - "long_text": "

These are all products from my travels.

\r\n

From hand-woven mochilas, to organic mountain farmed coffee and panela and more.

\r\n

All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.

", - "target_link": "https://www.comunandina.com", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 27, - "fields": { - "title": "Add a Calendar", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Got a calendar for us?", - "long_text": "", - "target_link": "", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 28, - "fields": { - "title": "Complimentary Street Harrassment", - "organization": 1, - "promo_type": "An", - "overlay_image": "", - "short_text": "It's cultural right?", - "long_text": "I learn about the creation of gender in public space through the lens of a PhD student studying pidopo's, in Colombia.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d", - "notes": "", - "published": true - } -}, -{ - "model": "events.promo", - "pk": 29, - "fields": { - "title": "Saint Wich Burgers", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/soltoken.png", - "short_text": "Serving handcrafted gourmet burgers made with love.", - "long_text": "Welcome to Saint Wich Burgers, located on Selby Avenue in Saint Paul, Minnesota, where our love for food and dedication to quality come together in every burger we serve. We don’t believe in shortcuts. Our burgers are made from scratch with premium ingredients, served fresh, and customized to suit your unique tastes.\r\n

\r\nFrom our hand-crafted patties to our delicious signature sauces, everything is designed to make each bite something special. Whether you like your burger simple or stacked with all the toppings, we offer a variety of options to satisfy every craving.\r\n

\r\nCome see what makes us different. At Saint Wich Burgers, it's all about great burgers, good times, and lasting memories.\r\n

\r\nWhether you're in the mood for a simple, classic burger or a sandwich with sides, we’ve got you covered. Enjoy the perfect meal in our inviting space, where you can savor your burger and enjoy time with family and friends.\r\n

\r\nOur atmosphere is laid-back, our service is friendly, and our burgers are unforgettable. Stop by today and taste what makes us different!", - "target_link": "https://www.stwichburgers.com/", - "notes": "", - "published": false - } -}, -{ - "model": "events.promo", - "pk": 30, - "fields": { - "title": "Arepas, Las de Queso", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "If you're lookin' for the tastiest arepa in Medellin.", - "long_text": "For those who may travel, check out my friends :)", - "target_link": "https://www.dreamfreely.org", - "notes": "", - "published": false - } -}, -{ - "model": "events.promo", - "pk": 31, - "fields": { - "title": "Vigs Guitars", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/VigGuitarsLogo.sm.jpg", - "short_text": "A luthier-owned music shop.", - "long_text": "“The Player’s Store”\r\n

\r\nWe are an independent, full service, luthier-owned shop serving the working musicians in the Minneapolis/St. Paul metro area since September 2014. Ted Vig’s expert repair is the cornerstone of our business. We specialize in repair and customization, and carry a variety of guitars, basses, mandolins, ukuleles, and accessories.\r\n

\r\nWith EXPERT repair, a large stock of parts and interesting, unique and fun instruments, both new and used, you won’t be afraid to come in here, and it’s a big part of the reason that we’ve been coined as “The Players Store.”\r\n

\r\nTed Vig has been working full time and building his audience through music stores since 1988. He has a long list of devoted repair clients…this just doesn’t happen overnight! His Custom Vig Handwound Pickups are flying out the door! *SATURDAYS ARE THE BEST DAYS TO COME IN AND TALK TO TED ABOUT THE PICKUPS*\r\n

\r\nThis store is Indigenous Female Owned and run by local musicians who SUPPORT local musicians! We have ample street parking in front of the shop and a big parking lot.\r\n

\r\nWinner of “Star Tribune’s Readers Choice Best of”\r\nBest Music Instrument Shop\r\n

\r\n2021 – SILVER! 2023 – SILVER!\r\n
\r\n2022 – GOLD 2024 GOLD!!!!", - "target_link": "https://vigguitarshop.com/", - "notes": "", - "published": false - } -} -] diff --git a/events/fixtures/promo.json b/events/fixtures/promo.json index 3f67599..49e4768 100644 --- a/events/fixtures/promo.json +++ b/events/fixtures/promo.json @@ -1,452 +1,611 @@ [ -{ + { "model": "events.promo", "pk": 1, "fields": { - "title": "DreamFreely", - "organization": 1, - "promo_type": "Jo", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "And intro to the operation.", - "long_text": "

Alright, I guess this is it. This is the game, these are the plays.

\r\n\r\n

Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.

", - "target_link": "https://www.dreamfreely.org", - "notes": "", - "published": true + "title": "Santa Elena", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "promo/pa_cover.jpg", + "short_text": "The perfect weekend getaway.", + "long_text": "

Welcome to Santa Elena.

", + "target_link": "https://www.dreamfreely.org", + "notes": "", + "published": true, + "calendar": [ + 2 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 2, "fields": { - "title": "Comuna Andina", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/pa_cover.jpg", - "short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.", - "long_text": "

These are all products from my travels.

\r\n

From hand-woven mochilas, to organic mountain farmed coffee and panela and more.

\r\n

All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.

", - "target_link": "https://www.comunandina.com", - "notes": "", - "published": true + "title": "Medellin Run Club", + "organization": 1, + "promo_type": "Fo", + "overlay_image": "promo/pa_cover.jpg", + "short_text": "Every Sunday: 8am", + "long_text": "

Get your exercise on!

", + "target_link": "https://www.instagram.com", + "notes": "", + "published": true, + "calendar": [ + 2 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 3, "fields": { - "title": "idioke", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/soltoken.png", - "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", - "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", - "target_link": "https://www.idioke.com", - "notes": "", - "published": true + "title": "Manifesting Empathy", + "organization": 1, + "promo_type": "Fo", + "overlay_image": "promo/manifestingempathy.png", + "short_text": "Help humans find their roots.", + "long_text": "Help humans find their roots.", + "target_link": "https://www.manifestingempathy.com", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 4, "fields": { - "title": "Manifesting Empathy", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/manifestingempathy.png", - "short_text": "Help humans find their roots.", - "long_text": "Help humans find their roots.", - "target_link": "https://www.manifestingempathy.com", - "notes": "", - "published": true + "title": "DreamFreely", + "organization": 1, + "promo_type": "Re", + "overlay_image": "promo/SOL_Sign.png", + "short_text": "And intro to the operation.", + "long_text": "

Alright, I guess this is it. This is the game, these are the plays.

\r\n\r\n

Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.

", + "target_link": "https://www.dreamfreely.org", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 5, "fields": { - "title": "AI & the Last Question", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/cover.png", - "short_text": "A short story by Isaac Asimov", - "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", - "target_link": "https://canin.dreamfreely.org/the-last-question/", - "notes": "", - "published": true + "title": "Manifesting Empathy", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "promo/manifestingempathy.png", + "short_text": "Help humans find their roots.", + "long_text": "Help humans find their roots.", + "target_link": "https://www.manifestingempathy.com", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 6, "fields": { - "title": "AI & the Last Question", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/cover.png", - "short_text": "A short story by Isaac Asimov", - "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", - "target_link": "https://canin.dreamfreely.org/the-last-question/", - "notes": "", - "published": true + "title": "DigiSnaxx & the DBC", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "promo/cover.png", + "short_text": "More info about the project DigiSnaxx.", + "long_text": "

After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.

\r\n

Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.

\r\n

DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.

\r\n

We're not trying to be everything either ...

\r\n

We're trying to be an accessible, community-centered, directory.

", + "target_link": "https://canin.dreamfreely.org/digisnaxx/", + "notes": "", + "published": true, + "calendar": [ + 1, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 7, "fields": { - "title": "idioke", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/soltoken.png", - "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", - "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", - "target_link": "https://www.idioke.com", - "notes": "", - "published": true + "title": "DigiSnaxx & the DBC", + "organization": 1, + "promo_type": "Fo", + "overlay_image": "promo/cover.png", + "short_text": "More info about the project DigiSnaxx.", + "long_text": "

After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.

\r\n

Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.

\r\n

DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.

\r\n

We're not trying to be everything either ...

\r\n

We're trying to be an accessible, community-centered, directory.

", + "target_link": "https://canin.dreamfreely.org/digisnaxx/", + "notes": "", + "published": true, + "calendar": [ + 1, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 8, "fields": { - "title": "AI & the Last Question", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/cover.png", - "short_text": "A short story by Isaac Asimov", - "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", - "target_link": "https://canin.dreamfreely.org/the-last-question/", - "notes": "", - "published": true + "title": "Mpls Stp Mag Calendar", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "", + "short_text": "They got a great list of events.", + "long_text": "They've got a great collection of events; we just don't have the time/resources to parse them all at present; and so pass the link directly on to you.", + "target_link": "https://calendar.mspmag.com/calendars/all-events", + "notes": "", + "published": true, + "calendar": [ + 1 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 9, "fields": { - "title": "Comuna Andina", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/pa_cover.jpg", - "short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.", - "long_text": "

These are all products from my travels.

\r\n

From hand-woven mochilas, to organic mountain farmed coffee and panela and more.

\r\n

All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.

", - "target_link": "https://www.comunandina.com", - "notes": "", - "published": true + "title": "DreamFreely", + "organization": 1, + "promo_type": "Jo", + "overlay_image": "promo/SOL_Sign.png", + "short_text": "And intro to the operation.", + "long_text": "

Alright, I guess this is it. This is the game, these are the plays.

\r\n\r\n

Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.

", + "target_link": "https://www.dreamfreely.org", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 10, "fields": { - "title": "DreamFreely", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "And intro to the operation.", - "long_text": "

Alright, I guess this is it. This is the game, these are the plays.

\r\n\r\n

Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.

", - "target_link": "https://www.dreamfreely.org", - "notes": "", - "published": true + "title": "idioki", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "promo/soltoken.png", + "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", + "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", + "target_link": "https://www.idioke.com", + "notes": "", + "published": true, + "calendar": [ + 2 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 11, "fields": { - "title": "Manifesting Empathy", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/manifestingempathy.png", - "short_text": "Help humans find their roots.", - "long_text": "Help humans find their roots.", - "target_link": "https://www.manifestingempathy.com", - "notes": "", - "published": true + "title": "Talkin' w/ DiViNCi", + "organization": 1, + "promo_type": "Fo", + "overlay_image": "promo/soltoken.png", + "short_text": "Canin converses with DiViNCi.", + "long_text": "We met a great many number of years ago; before the hills were hills and the trees mere saplings. Haha ... I dunno, but it was definitely a fun conversation.\r\n\r\n", + "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 12, "fields": { - "title": "DigiSnaxx & the DBC", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "promo/cover.png", - "short_text": "More info about the project DigiSnaxx.", - "long_text": "

After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.

\r\n

Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.

\r\n

DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.

\r\n

We're not trying to be everything either ...

\r\n

We're trying to be an accessible, community-centered, directory.

", - "target_link": "https://canin.dreamfreely.org/digisnaxx/", - "notes": "", - "published": true + "title": "Vigs Guitars", + "organization": 1, + "promo_type": "Re", + "overlay_image": "promo/VigGuitarsLogo.sm.jpg", + "short_text": "A luthier-owned music shop.", + "long_text": "“The Player’s Store”\r\n

\r\nWe are an independent, full service, luthier-owned shop serving the working musicians in the Minneapolis/St. Paul metro area since September 2014. Ted Vig’s expert repair is the cornerstone of our business. We specialize in repair and customization, and carry a variety of guitars, basses, mandolins, ukuleles, and accessories.\r\n

\r\nWith EXPERT repair, a large stock of parts and interesting, unique and fun instruments, both new and used, you won’t be afraid to come in here, and it’s a big part of the reason that we’ve been coined as “The Players Store.”\r\n

\r\nTed Vig has been working full time and building his audience through music stores since 1988. He has a long list of devoted repair clients…this just doesn’t happen overnight! His Custom Vig Handwound Pickups are flying out the door! *SATURDAYS ARE THE BEST DAYS TO COME IN AND TALK TO TED ABOUT THE PICKUPS*\r\n

\r\nThis store is Indigenous Female Owned and run by local musicians who SUPPORT local musicians! We have ample street parking in front of the shop and a big parking lot.\r\n

\r\nWinner of “Star Tribune’s Readers Choice Best of”\r\nBest Music Instrument Shop\r\n

\r\n2021 – SILVER! 2023 – SILVER!\r\n
\r\n2022 – GOLD 2024 GOLD!!!!", + "target_link": "https://vigguitarshop.com/", + "notes": "", + "published": false, + "calendar": [ + 1 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 13, "fields": { - "title": "Complimentary Street Harrassment", - "organization": 1, - "promo_type": "An", - "overlay_image": "", - "short_text": "It's cultural right?", - "long_text": "I learn about the creation of gender in public space through the lens of a PhD student studying pidopo's, in Colombia.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d", - "notes": "", - "published": true + "title": "Add an Event", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Got an event for us?", + "long_text": "Let's take a look.\r\n\r\n", + "target_link": null, + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 14, "fields": { - "title": "DigiSnaxx & the DBC", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/cover.png", - "short_text": "More info about the project DigiSnaxx.", - "long_text": "

After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.

\r\n

Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.

\r\n

DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.

\r\n

We're not trying to be everything either ...

\r\n

We're trying to be an accessible, community-centered, directory.

", - "target_link": "https://canin.dreamfreely.org/digisnaxx/", - "notes": "", - "published": true + "title": "Add a Calendar", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Got a calendar for us?", + "long_text": "Let's take a look.\r\n\r\n", + "target_link": null, + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 15, "fields": { - "title": "DreamFreely Library", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "It's like having an open notebook ...", - "long_text": "It's a work in progress, but you get the idea; and there's still some useful information.", - "target_link": "https://library.dreamfreely.org", - "notes": "", - "published": true + "title": "idioki", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "promo/soltoken.png", + "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", + "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", + "target_link": "https://www.idioke.com", + "notes": "", + "published": true, + "calendar": [ + 2 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 16, "fields": { - "title": "Talkin' w/ DiViNCi", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/soltoken.png", - "short_text": "Canin converses with DiViNCi.", - "long_text": "We met a great many number of years ago; before the hills were hills and the trees mere saplings. Haha ... I dunno, but it was definitely a fun conversation.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v", - "notes": "", - "published": true + "title": "Rebel Coding", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Enough knowledge to be dangerous.", + "long_text": "

Just covering the basics, we'll be hosting webinars.

\r\n

HTML, CSS, JavaScript & Python.

", + "target_link": "https://www.rebelcoding.com", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 17, "fields": { - "title": "Mpls Stp Mag Calendar", - "organization": 1, - "promo_type": "Ev", - "overlay_image": "", - "short_text": "They got a great list of events.", - "long_text": "They've got a great collection of events; we just don't have the time/resources to parse them all at present; and so pass the link directly on to you.", - "target_link": "https://calendar.mspmag.com/calendars/all-events", - "notes": "", - "published": true + "title": "idioki", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "promo/soltoken.png", + "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", + "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", + "target_link": "https://www.idioke.com", + "notes": "", + "published": true, + "calendar": [ + 2 + ], + "tags": [] } -}, -{ + }, + { + "model": "events.promo", + "pk": 18, + "fields": { + "title": "Add a Calendar", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Got a calendar for us?", + "long_text": "Let's take a look.\r\n\r\n", + "target_link": null, + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] + } + }, + { "model": "events.promo", "pk": 19, "fields": { - "title": "Academia Nuts", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "Abstacts coming soon; gotta catch 'em all.", - "long_text": "I've always wanted to make academia more accessible, so here's my go at that!\r\n\r\n", - "target_link": "https://www.academianuts.net", - "notes": "", - "published": true + "title": "Complimentary Street Harrassment", + "organization": 1, + "promo_type": "An", + "overlay_image": "", + "short_text": "It's cultural right?", + "long_text": "I learn about the creation of gender in public space through the lens of a PhD student studying pidopo's, in Colombia.\r\n\r\n", + "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d", + "notes": "", + "published": true, + "calendar": [ + 1, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 20, "fields": { - "title": "Talkin' w/ DiViNCi", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/soltoken.png", - "short_text": "Canin converses with DiViNCi.", - "long_text": "We met a great many number of years ago; before the hills were hills and the trees mere saplings. Haha ... I dunno, but it was definitely a fun conversation.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v", - "notes": "", - "published": true + "title": "Saint Wich Burgers", + "organization": 1, + "promo_type": "Fo", + "overlay_image": "promo/soltoken.png", + "short_text": "Serving handcrafted gourmet burgers made with love.", + "long_text": "Welcome to Saint Wich Burgers, located on Selby Avenue in Saint Paul, Minnesota, where our love for food and dedication to quality come together in every burger we serve. We don’t believe in shortcuts. Our burgers are made from scratch with premium ingredients, served fresh, and customized to suit your unique tastes.\r\n

\r\nFrom our hand-crafted patties to our delicious signature sauces, everything is designed to make each bite something special. Whether you like your burger simple or stacked with all the toppings, we offer a variety of options to satisfy every craving.\r\n

\r\nCome see what makes us different. At Saint Wich Burgers, it's all about great burgers, good times, and lasting memories.\r\n

\r\nWhether you're in the mood for a simple, classic burger or a sandwich with sides, we’ve got you covered. Enjoy the perfect meal in our inviting space, where you can savor your burger and enjoy time with family and friends.\r\n

\r\nOur atmosphere is laid-back, our service is friendly, and our burgers are unforgettable. Stop by today and taste what makes us different!", + "target_link": "https://www.stwichburgers.com/", + "notes": "", + "published": false, + "calendar": [ + 1 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 21, "fields": { - "title": "Rebel Coding", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Enough knowledge to be dangerous.", - "long_text": "

Just covering the basics, we'll be hosting webinars.

\r\n

HTML, CSS, JavaScript & Python.

", - "target_link": "https://www.rebelcoding.com", - "notes": "", - "published": true + "title": "idioki", + "organization": 1, + "promo_type": "Ev", + "overlay_image": "promo/soltoken.png", + "short_text": "We're starting with English, but soon you will be able to practice Spanish as well.", + "long_text": "We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.We're starting with English, but soon you will be able to practice Spanish as well.", + "target_link": "https://www.idioke.com", + "notes": "", + "published": true, + "calendar": [ + 2 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 22, "fields": { - "title": "Add a Calendar", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Got a calendar for us?", - "long_text": "", - "target_link": "", - "notes": "", - "published": true + "title": "Rebel Coding", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Enough knowledge to be dangerous.", + "long_text": "

Just covering the basics, we'll be hosting webinars.

\r\n

HTML, CSS, JavaScript & Python.

", + "target_link": "https://www.rebelcoding.com", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 23, "fields": { - "title": "Add a Calendar", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Got a calendar for us?", - "long_text": "", - "target_link": "", - "notes": "", - "published": true + "title": "Add an Event", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Got an event for us?", + "long_text": "Let's take a look.\r\n\r\n", + "target_link": null, + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 24, "fields": { - "title": "Academia Nuts", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "Abstacts coming soon; gotta catch 'em all.", - "long_text": "I've always wanted to make academia more accessible, so here's my go at that!\r\n\r\n", - "target_link": "https://www.academianuts.net", - "notes": "", - "published": true + "title": "Add a Calendar", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Got a calendar for us?", + "long_text": "Let's take a look.\r\n\r\n", + "target_link": null, + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 25, "fields": { - "title": "Rebel Coding", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Enough knowledge to be dangerous.", - "long_text": "

Just covering the basics, we'll be hosting webinars.

\r\n

HTML, CSS, JavaScript & Python.

", - "target_link": "https://www.rebelcoding.com", - "notes": "", - "published": true + "title": "Add an Event", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "Got an event for us?", + "long_text": "Let's take a look.\r\n\r\n", + "target_link": null, + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 26, "fields": { - "title": "Comuna Andina", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/pa_cover.jpg", - "short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.", - "long_text": "

These are all products from my travels.

\r\n

From hand-woven mochilas, to organic mountain farmed coffee and panela and more.

\r\n

All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.

", - "target_link": "https://www.comunandina.com", - "notes": "", - "published": true + "title": "DreamFreely Library", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "It's like having an open notebook ...", + "long_text": "It's a work in progress, but you get the idea; and there's still some useful information.", + "target_link": "https://library.dreamfreely.org", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 27, "fields": { - "title": "Add a Calendar", - "organization": 1, - "promo_type": "Re", - "overlay_image": "", - "short_text": "Got a calendar for us?", - "long_text": "", - "target_link": "", - "notes": "", - "published": true + "title": "AI & the Last Question", + "organization": 1, + "promo_type": "Re", + "overlay_image": "promo/cover.png", + "short_text": "A short story by Isaac Asimov", + "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", + "target_link": "https://canin.dreamfreely.org/the-last-question/", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 28, "fields": { - "title": "Complimentary Street Harrassment", - "organization": 1, - "promo_type": "An", - "overlay_image": "", - "short_text": "It's cultural right?", - "long_text": "I learn about the creation of gender in public space through the lens of a PhD student studying pidopo's, in Colombia.\r\n\r\n", - "target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d", - "notes": "", - "published": true + "title": "DreamFreely Library", + "organization": 1, + "promo_type": "Re", + "overlay_image": "", + "short_text": "It's like having an open notebook ...", + "long_text": "It's a work in progress, but you get the idea; and there's still some useful information.", + "target_link": "https://library.dreamfreely.org", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 29, "fields": { - "title": "Saint Wich Burgers", - "organization": 1, - "promo_type": "Fo", - "overlay_image": "promo/soltoken.png", - "short_text": "Serving handcrafted gourmet burgers made with love.", - "long_text": "Welcome to Saint Wich Burgers, located on Selby Avenue in Saint Paul, Minnesota, where our love for food and dedication to quality come together in every burger we serve. We don’t believe in shortcuts. Our burgers are made from scratch with premium ingredients, served fresh, and customized to suit your unique tastes.\r\n

\r\nFrom our hand-crafted patties to our delicious signature sauces, everything is designed to make each bite something special. Whether you like your burger simple or stacked with all the toppings, we offer a variety of options to satisfy every craving.\r\n

\r\nCome see what makes us different. At Saint Wich Burgers, it's all about great burgers, good times, and lasting memories.\r\n

\r\nWhether you're in the mood for a simple, classic burger or a sandwich with sides, we’ve got you covered. Enjoy the perfect meal in our inviting space, where you can savor your burger and enjoy time with family and friends.\r\n

\r\nOur atmosphere is laid-back, our service is friendly, and our burgers are unforgettable. Stop by today and taste what makes us different!", - "target_link": "https://www.stwichburgers.com/", - "notes": "", - "published": false + "title": "AI & the Last Question", + "organization": 1, + "promo_type": "Re", + "overlay_image": "promo/cover.png", + "short_text": "A short story by Isaac Asimov", + "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", + "target_link": "https://canin.dreamfreely.org/the-last-question/", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ + }, + { "model": "events.promo", "pk": 30, "fields": { - "title": "Arepas, Las de Queso", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/SOL_Sign.png", - "short_text": "If you're lookin' for the tastiest arepa in Medellin.", - "long_text": "For those who may travel, check out my friends :)", - "target_link": "https://www.dreamfreely.org", - "notes": "", - "published": false + "title": "AI & the Last Question", + "organization": 1, + "promo_type": "Re", + "overlay_image": "promo/cover.png", + "short_text": "A short story by Isaac Asimov", + "long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov", + "target_link": "https://canin.dreamfreely.org/the-last-question/", + "notes": "", + "published": true, + "calendar": [ + 1, + 2, + 3 + ], + "tags": [] } -}, -{ - "model": "events.promo", - "pk": 31, - "fields": { - "title": "Vigs Guitars", - "organization": 1, - "promo_type": "Re", - "overlay_image": "promo/VigGuitarsLogo.sm.jpg", - "short_text": "A luthier-owned music shop.", - "long_text": "“The Player’s Store”\r\n

\r\nWe are an independent, full service, luthier-owned shop serving the working musicians in the Minneapolis/St. Paul metro area since September 2014. Ted Vig’s expert repair is the cornerstone of our business. We specialize in repair and customization, and carry a variety of guitars, basses, mandolins, ukuleles, and accessories.\r\n

\r\nWith EXPERT repair, a large stock of parts and interesting, unique and fun instruments, both new and used, you won’t be afraid to come in here, and it’s a big part of the reason that we’ve been coined as “The Players Store.”\r\n

\r\nTed Vig has been working full time and building his audience through music stores since 1988. He has a long list of devoted repair clients…this just doesn’t happen overnight! His Custom Vig Handwound Pickups are flying out the door! *SATURDAYS ARE THE BEST DAYS TO COME IN AND TALK TO TED ABOUT THE PICKUPS*\r\n

\r\nThis store is Indigenous Female Owned and run by local musicians who SUPPORT local musicians! We have ample street parking in front of the shop and a big parking lot.\r\n

\r\nWinner of “Star Tribune’s Readers Choice Best of”\r\nBest Music Instrument Shop\r\n

\r\n2021 – SILVER! 2023 – SILVER!\r\n
\r\n2022 – GOLD 2024 GOLD!!!!", - "target_link": "https://vigguitarshop.com/", - "notes": "", - "published": false - } -} -] + } +] \ No newline at end of file diff --git a/events/fixtures/venues.json b/events/fixtures/venues.json deleted file mode 100644 index edb1c98..0000000 --- a/events/fixtures/venues.json +++ /dev/null @@ -1 +0,0 @@ -[{"model": "events.venue", "pk": 1, "fields": {"name": "Acme Comedy Club", "website": "https://acmecomedycompany.com/the-club/calendar/", "phone_number": null, "address": null, "city": "Minneapolis", "state": "Minnesota", "zip_code": null}}, {"model": "events.venue", "pk": 2, "fields": {"name": "Amsterdam Bar & Hall", "website": "https://www.amsterdambarandhall.com/events-new/", "phone_number": null, "address": null, "city": "St. Paul", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 3, "fields": {"name": "Birchbark Books", "website": "https://birchbarkbooks.com/pages/events", "phone_number": null, "address": null, "city": "Minneapolis", "state": "Minnesota", "zip_code": null}}, {"model": "events.venue", "pk": 4, "fields": {"name": "Cedar Cultural Center", "website": "https://www.thecedar.org/listing", "phone_number": null, "address": null, "city": "Minneapolis", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 5, "fields": {"name": "331 Club", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 6, "fields": {"name": "Comedy Corner", "website": "https://comedycornerunderground.com/calendar", "phone_number": null, "address": null, "city": "Minneapolis", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 7, "fields": {"name": "Eastside Freedom Library", "website": "https://eastsidefreedomlibrary.org/events/", "phone_number": null, "address": null, "city": "Minneapolis", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 30, "fields": {"name": "7th St Entry", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 34, "fields": {"name": "Fine Line", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 35, "fields": {"name": "The Fitzgerald Theater", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 36, "fields": {"name": "Turf Club", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 37, "fields": {"name": "Palace Theatre", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 38, "fields": {"name": "First Avenue", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 39, "fields": {"name": "The Cedar Cultural Center", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 40, "fields": {"name": "Pantages Theatre", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 41, "fields": {"name": "Xcel Energy Center", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 42, "fields": {"name": "State Theatre", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 43, "fields": {"name": "Hook & Ladder", "website": null, "phone_number": null, "address": null, "city": null, "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 44, "fields": {"name": "Magers & Quinn", "website": "https://www.magersandquinn.com/events", "phone_number": null, "address": null, "city": "Minneapolis", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 45, "fields": {"name": "Uptown VFW", "website": null, "phone_number": null, "address": null, "city": "Minneapolis", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 46, "fields": {"name": "Palmer's Bar", "website": "https://palmers-bar.com", "phone_number": null, "address": null, "city": "Minneapolis", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 47, "fields": {"name": "Parkway Theater", "website": "https://theparkwaytheater.com", "phone_number": null, "address": null, "city": "Minneapolis", "state": null, "zip_code": null}}, {"model": "events.venue", "pk": 48, "fields": {"name": "White Squirrel", "website": "https://whitesquirrelbar.com", "phone_number": null, "address": null, "city": "St. Paul", "state": null, "zip_code": null}}] \ No newline at end of file diff --git a/events/migrations/0030_rename_address_organization_address_complete_and_more.py b/events/migrations/0030_rename_address_organization_address_complete_and_more.py new file mode 100644 index 0000000..b68b981 --- /dev/null +++ b/events/migrations/0030_rename_address_organization_address_complete_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.1.1 on 2025-10-17 21:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0029_remove_event_show_day_organization_business_email_and_more'), + ] + + operations = [ + migrations.RenameField( + model_name='organization', + old_name='address', + new_name='address_complete', + ), + migrations.AddField( + model_name='organization', + name='address_numbers', + field=models.CharField(blank=True, max_length=63, null=True), + ), + migrations.AddField( + model_name='organization', + name='address_type', + field=models.CharField(blank=True, max_length=31, null=True), + ), + migrations.AddField( + model_name='organization', + name='barrio', + field=models.CharField(blank=True, max_length=127, null=True), + ), + ] diff --git a/events/migrations/0031_alter_organization_latitude_and_more.py b/events/migrations/0031_alter_organization_latitude_and_more.py new file mode 100644 index 0000000..1b9db58 --- /dev/null +++ b/events/migrations/0031_alter_organization_latitude_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.1 on 2025-10-17 23:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0030_rename_address_organization_address_complete_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='organization', + name='latitude', + field=models.FloatField(blank=True, null=True), + ), + migrations.AlterField( + model_name='organization', + name='longitude', + field=models.FloatField(blank=True, null=True), + ), + ] diff --git a/events/migrations/0032_remove_promo_classified_image_and_more.py b/events/migrations/0032_remove_promo_classified_image_and_more.py new file mode 100644 index 0000000..f735731 --- /dev/null +++ b/events/migrations/0032_remove_promo_classified_image_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 5.1.1 on 2025-11-11 03:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0031_alter_organization_latitude_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='promo', + name='classified_image', + ), + migrations.RemoveField( + model_name='promo', + name='embed_link', + ), + migrations.AlterField( + model_name='promo', + name='promo_type', + field=models.CharField(choices=[('Ar', 'Art'), ('Fo', 'Food'), ('Ev', 'Event'), ('Re', 'Retail'), ('Ma', 'Mutual Aid'), ('Ca', 'Classifieds'), ('Jo', 'Job Opening'), ('Sp', 'Startup Pitch'), ('An', 'Academia Nuts'), ('Su', 'Survey Questions')], default='0', max_length=15), + ), + migrations.AlterField( + model_name='promo', + name='short_text', + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/events/migrations/0033_alter_event_show_date.py b/events/migrations/0033_alter_event_show_date.py new file mode 100644 index 0000000..21d42e3 --- /dev/null +++ b/events/migrations/0033_alter_event_show_date.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.1 on 2025-11-12 12:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0032_remove_promo_classified_image_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='show_date', + field=models.DateField(), + ), + ] diff --git a/events/migrations/0034_event_show_day_alter_event_show_date.py b/events/migrations/0034_event_show_day_alter_event_show_date.py new file mode 100644 index 0000000..3280fb6 --- /dev/null +++ b/events/migrations/0034_event_show_day_alter_event_show_date.py @@ -0,0 +1,25 @@ +# Generated by Django 5.1.1 on 2025-11-12 12:56 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0033_alter_event_show_date'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='show_day', + field=models.DateField(default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AlterField( + model_name='event', + name='show_date', + field=models.DateTimeField(), + ), + ] diff --git a/events/migrations/0035_organization_is_listed.py b/events/migrations/0035_organization_is_listed.py new file mode 100644 index 0000000..a6896a7 --- /dev/null +++ b/events/migrations/0035_organization_is_listed.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.1 on 2025-11-12 14:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0034_event_show_day_alter_event_show_date'), + ] + + operations = [ + migrations.AddField( + model_name='organization', + name='is_listed', + field=models.BooleanField(default=False), + ), + ] diff --git a/events/migrations/0036_promo_calendar_alter_promo_promo_type.py b/events/migrations/0036_promo_calendar_alter_promo_promo_type.py new file mode 100644 index 0000000..ba8c65d --- /dev/null +++ b/events/migrations/0036_promo_calendar_alter_promo_promo_type.py @@ -0,0 +1,24 @@ +# Generated by Django 5.1.1 on 2025-11-15 02:51 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0035_organization_is_listed'), + ] + + operations = [ + migrations.AddField( + model_name='promo', + name='calendar', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='events.calendar'), + ), + migrations.AlterField( + model_name='promo', + name='promo_type', + field=models.CharField(choices=[('Ar', 'Art'), ('Fo', 'Food'), ('Ev', 'Event'), ('Re', 'Retail'), ('Ma', 'Mutual Aid'), ('Ca', 'Classifieds'), ('Jo', 'Job Opening'), ('Ja', 'Journal Article'), ('Sp', 'Startup Pitch'), ('An', 'Academia Nuts'), ('Su', 'Survey Questions')], default='0', max_length=15), + ), + ] diff --git a/events/migrations/0037_remove_promo_calendar_promo_calendar.py b/events/migrations/0037_remove_promo_calendar_promo_calendar.py new file mode 100644 index 0000000..a904d26 --- /dev/null +++ b/events/migrations/0037_remove_promo_calendar_promo_calendar.py @@ -0,0 +1,22 @@ +# Generated by Django 5.1.1 on 2025-11-15 02:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0036_promo_calendar_alter_promo_promo_type'), + ] + + operations = [ + migrations.RemoveField( + model_name='promo', + name='calendar', + ), + migrations.AddField( + model_name='promo', + name='calendar', + field=models.ManyToManyField(blank=True, null=True, to='events.calendar'), + ), + ] diff --git a/events/migrations/0038_remove_event_calendar_event_calendar.py b/events/migrations/0038_remove_event_calendar_event_calendar.py new file mode 100644 index 0000000..707db43 --- /dev/null +++ b/events/migrations/0038_remove_event_calendar_event_calendar.py @@ -0,0 +1,22 @@ +# Generated by Django 5.1.1 on 2025-11-15 07:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0037_remove_promo_calendar_promo_calendar'), + ] + + operations = [ + migrations.RemoveField( + model_name='event', + name='calendar', + ), + migrations.AddField( + model_name='event', + name='calendar', + field=models.ManyToManyField(blank=True, null=True, to='events.calendar'), + ), + ] diff --git a/events/models.py b/events/models.py index 502aeb0..be6a71c 100644 --- a/events/models.py +++ b/events/models.py @@ -50,16 +50,14 @@ class Tags(models.Model): class Organization(models.Model): MEMBER_TYPE = ( ('Nm', 'Non-Member'), - ('Na', 'Nano Member'), - ('Mm', 'Micro Member'), - ('Sm', 'Small Business Member'), - ('Lb', 'Local Business Member'), - ('Rb', 'Regional Business Member'), + ('Ds', 'DigiSnaxx'), + ('Dsp', 'DigiSnaxx +') ) ORG_TYPE = ( - ('Fo', 'Food'), + ('Fb', 'Food & Beverage'), ('Re', 'Retail'), ('Se', 'Service'), + ('Vn', 'Venue'), ('Ud', 'Undefined'), ) @@ -72,7 +70,12 @@ class Organization(models.Model): long_desc = models.TextField(blank=True, null=True) tags = models.ManyToManyField(Tags, blank=True) - address = models.CharField(max_length=63, blank=True, null=True) + address_numbers = models.CharField(max_length=63, blank=True, null=True) + address_type = models.CharField(max_length=31, blank=True, null=True) + address_complete = models.CharField(max_length=63, blank=True, null=True) + + + barrio = models.CharField(max_length=127, blank=True, null=True) city = models.CharField(max_length=31, blank=True, null=True) state = models.CharField(max_length=15, blank=True, null=True) zip_code = models.CharField(max_length=15, blank=True, null=True) @@ -80,11 +83,12 @@ class Organization(models.Model): phone_number = models.CharField(max_length=255, blank=True, null=True) business_email = models.CharField(max_length=63, blank=True, null=True) - is_venue= models.BooleanField(default=False) + is_listed= models.BooleanField(default=False) is_501c = models.BooleanField(default=False) + is_venue= models.BooleanField(default=False) - latitude = models.FloatField() - longitude = models.FloatField() + latitude = models.FloatField(blank=True, null=True) + longitude = models.FloatField(blank=True, null=True) contact_name = models.CharField(max_length=63, blank=True, null=True) contact_email = models.CharField(max_length=63, blank=True, null=True) @@ -124,8 +128,9 @@ class Event(models.Model): show_title = models.CharField(max_length=127, blank=True, null=True) show_link = models.URLField(blank=True, null=True) show_date = models.DateTimeField() + show_day = models.DateField() - calendar = models.ForeignKey(Calendar, on_delete=models.CASCADE, blank=True, null=True) + calendar = models.ManyToManyField(Calendar, blank=True, null=True) scraper = models.ForeignKey(Scraper, on_delete=models.CASCADE, null=True) venue = models.ForeignKey(Organization, on_delete=models.CASCADE) @@ -157,27 +162,26 @@ class Promo(models.Model): ('Fo', 'Food'), ('Ev', 'Event'), ('Re', 'Retail'), + ('Sv', 'Service'), ('Ma', 'Mutual Aid'), - ('Ca', 'Classifieds'), + ('Ca', 'Classified'), ('Jo', 'Job Opening'), - ('Sp', 'Startup Pitch'), - ('An', 'Academia Nuts'), ('Ja', 'Journal Article'), - ('Su', 'Survey Questions') + ('Sp', 'Startup Pitch'), + ('An', 'Academia Nut'), + ('Su', 'Survey Question') ) title = models.CharField(max_length=63) organization = models.ForeignKey(Organization, on_delete=models.CASCADE) + calendar = models.ManyToManyField(Calendar, blank=True, null=True) promo_type = models.CharField(max_length=15, choices=PROMO_TYPE, default='0') overlay_image = models.ImageField(upload_to="overlays", blank=True) - classified_image = models.ImageField(upload_to="classifieds", blank=True) - embed_link = models.CharField(max_length=126, blank=True, null=True) - short_text = models.TextField(blank=True, null=True) + short_text = models.CharField(max_length=255,blank=True, null=True) long_text = models.TextField(blank=True, null=True) target_link = models.URLField(blank=True, null=True) notes = models.TextField(blank=True, null=True) published = models.BooleanField(default=False) - tags = models.ManyToManyField(Tags, blank=True) class Meta: diff --git a/events/scrapers/Working/govt/MNLeg.py b/events/scrapers/Working/govt/MNLeg.py index 9e7097c..6dc9a68 100644 --- a/events/scrapers/Working/govt/MNLeg.py +++ b/events/scrapers/Working/govt/MNLeg.py @@ -6,8 +6,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -18,14 +18,16 @@ from xvfbwrapper import Xvfb from lxml import html import pytz -from events.models import Event, Organization, Scraper -from events.digitools import getBrowser, createURL, createBasicEvent, getSource +from events.models import Event, Organization, Scraper, Calendar +from events.digitools import getBrowser, createURL, createBasicEvent, getSource, add_calendar try: scraper, created = Scraper.objects.get_or_create( name="MN Legislature", website="https://www.leg.mn.gov/cal?type=all", + calendar = Calendar.objects.get(shortcode='msp'), items = 0, + new_items = 0, last_ran = datetime.now(), ) except Exception as e: @@ -48,7 +50,7 @@ else: quit() br.get(calendar_url) -sleep(60) +sleep(10) ps = html.fromstring(br.page_source) commEvents = ps.xpath('.//*/div[@class="card border-dark comm_item cal_item ml-lg-3"]') @@ -71,15 +73,21 @@ for hE in houseEvents: # print(dateTime, title, link, details['location']) venue, created = Organization.objects.get_or_create(name="MN House", city="St. Paul") new_event, created = Event.objects.update_or_create( - calendar = 'msp' event_type = 'Gv', show_title = title, show_link = link, show_date = datetime.strptime(dateTime, DATETIME_FORMAT), show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(), more_details = details['location'], - venue = venue + venue = venue, + scraper = scraper ) + + if type(new_event) is tuple: + print("STS: ", new_event) + add_calendar(new_event[0], 'msp') + else: + add_calendar(new_event, 'msp') scraper.items+=1 @@ -108,8 +116,14 @@ for sE in senateEvents: show_date = datetime.strptime(dateTime, DATETIME_FORMAT), show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(), more_details = details['location'], - venue = venue + venue = venue, + scraper = scraper ) + if type(new_event) is tuple: + print("STS: ", new_event) + add_calendar(new_event[0], 'msp') + else: + add_calendar(new_event, 'msp') scraper.items+=1 for cE in commEvents: @@ -136,8 +150,14 @@ for cE in commEvents: show_date = datetime.strptime(dateTime, DATETIME_FORMAT), show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(), more_details = details['location'], - venue = venue + venue = venue, + scraper = scraper ) + if type(new_event) is tuple: + print("STS: ", new_event) + add_calendar(new_event[0], 'msp') + else: + add_calendar(new_event, 'msp') scraper.items+=1 diff --git a/events/scrapers/Working/govt/MplsCityCouncil.py b/events/scrapers/Working/govt/MplsCityCouncil.py index 09e0e89..5ea9073 100644 --- a/events/scrapers/Working/govt/MplsCityCouncil.py +++ b/events/scrapers/Working/govt/MplsCityCouncil.py @@ -1,12 +1,14 @@ import re, os, sys -from datetime import datetime +from datetime import datetime, timedelta +import requests +import json import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() -from events.models import Event, Organization, Scraper +from events.models import Event, Organization, Scraper, Calendar from time import sleep from pprint import pprint as ppr @@ -17,13 +19,17 @@ from selenium.webdriver.common.by import By from xvfbwrapper import Xvfb from lxml import html import pytz -from events.digitools import getBrowser, createURL, createBasicEvent, getSource +from events.digitools import getBrowser, createURL, createBasicEvent, getSource, add_calendar + +import events.digitools as digitools try: scraper, created = Scraper.objects.get_or_create( name="Mpls City Council", website="https://lims.minneapolismn.gov/Calendar/citycouncil/upcoming", + calendar = Calendar.objects.get(shortcode='msp'), items = 0, + new_items = 0, last_ran = datetime.now(), ) except Exception as e: @@ -31,11 +37,24 @@ except Exception as e: scraper = Scraper.objects.get(name="Mpls City Council") print("Scraper: ", scraper) +DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S' tz = pytz.timezone("US/Central") +td = timedelta(days=2) +odt = datetime.now() - td -DATETIME_FORMAT = '%A, %b %d, %Y %I:%M %p' +month = odt.strftime("%b") +day = int(datetime.now().day) -calendar_url = 'https://lims.minneapolismn.gov/Calendar/citycouncil/upcoming' +if day == 1: + day = 30 + +year = int(datetime.now().year) + +cal_url = 'https://lims.minneapolismn.gov/Calendar/GetCalenderList?fromDate={}%20{},%20{}&toDate=null&meetingType=0&committeeId=null&pageCount=100&offsetStart=0&abbreviation=undefined&keywords=&sortOrder=1'.format(month, day, year) + +# print("URL: ", cal_url) + +# cal_url = 'https://lims.minneapolismn.gov/Calendar/GetCalenderList?fromDate=Nov%2015,%202025&toDate=null&meetingType=0&committeeId=null&pageCount=50&offsetStart=0&abbreviation=undefined&keywords=&sortOrder=1' if len(sys.argv) >= 2: arg1 = sys.argv[1] @@ -44,56 +63,60 @@ else: print("No run_env") quit() -br.get(calendar_url) -sleep(25) -# br.find_element(By.XPATH, '//*/li[@class="tab-header-small"]/a').click() -# sleep(15) -# all_entries = Select(br.find_element(By.XPATH, '//*/select')) -# all_entries.select_by_value('50') -# sleep(15) - +br.get(cal_url) +sleep(2) ps = html.fromstring(br.page_source) +events = ps.xpath('.//body/pre/text()')[0] +new_events = json.loads(events) +# ppr(dict(new_events[0])) +event_list = [] -dayBlocks = ps.xpath('.//*/div[@class="ng-scope"]') -meetings = [] - -for dB in dayBlocks: - date = dB.xpath('.//div[@class="row"]/div/span[@class="ng-binding"]/text()')[0] - events = dB.xpath('.//div[@class="upcoming ng-scope"]/div') - for event in events: - time = event.xpath('.//div/text()')[0] - title = event.xpath('.//div/a/text()')[0].strip() - if not len(title) > 0: - title = event.xpath('.//div/span/a/text()')[0].strip() - link = event.xpath('.//div/a/@href')[0] - if link.startswith("/Download/"): - link = calendar_url - else: - link = "https://lims.minneapolismn.gov" + link - location = title.split(',')[-1].strip() - mtg_title = title.split(',')[:-1] - if len(mtg_title) > 1: - mtg_title = (' -').join(mtg_title).strip() - else: - mtg_title = mtg_title[0].strip() - dateTime = datetime.strptime(date + " " + time, DATETIME_FORMAT) - if location == "City Hall": - location = "Mpls City Hall" - print(dateTime, location, mtg_title, link) - print('\n\n++++\n\n') - venue, created = Organization.objects.get_or_create(name=location, city="Minneapolis") - new_event = Event.objects.update_or_create( - calendar = 'msp' - event_type = 'Gv', - show_title = mtg_title, - show_link = link, - show_date = dateTime, - show_day = dateTime, - venue = venue - ) - scraper.items+=1 - +for event in new_events: + e = {} + e['title'] = event['CommitteeName'] + e['link'] = scraper.website + e['dateStamp'] = datetime.strptime(event['MeetingTime'], DATETIME_FORMAT) + e['agendaStatus'] = event['AgendaStatus'] + e['address'] = event['Address'] + e['description'] = event['Description'] + e['scraper'] = scraper + e['calendars'] = [scraper.calendar] + try: + # print(event['Location'].split(",")[1]) + loc = event['Location'].split(",")[1] + if "City Hall" in loc: + e['location'] = "Mpls City Hall" + venue = Organization.objects.get( + name="Mpls City Hall", + ) + digitools.createBasicEvent(e, 'Gv', venue) + elif "Public Service Building" in loc: + e['location'] = "Mpls Public Service Building" + venue = Organization.objects.get( + name="Mpls Public Service Building", + ) + digitools.createBasicEvent(e, 'Gv', venue) + except: + # print(event['Location'].split("-")[0]) + e['location'] = event['Location'].split("-")[0].strip() + try: + venue, created = Organization.objects.get_or_create( + name=e['location'] , + city="Minneapolis", + website=scraper.website, + is_venue=False, + address_complete=e['address'] + ) + except: + venue = Organization.objects.get( + name=e['location'] , + city="Minneapolis", + ) + digitools.createBasicEvent(e, 'Gv', venue) + event_list.append(e) + br.close() + scraper.save() # br.find_element_by_class_name('fc-btn_allCalendars-button').click() diff --git a/events/scrapers/Working/govt/StPaulCityCouncil.py b/events/scrapers/Working/govt/StPaulCityCouncil.py index 37105b4..1580908 100644 --- a/events/scrapers/Working/govt/StPaulCityCouncil.py +++ b/events/scrapers/Working/govt/StPaulCityCouncil.py @@ -2,11 +2,11 @@ import re, os, sys from datetime import datetime import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() -from events.models import Event, Organization, Scraper +from events.models import Event, Organization, Scraper, Calendar from time import sleep from pprint import pprint as ppr @@ -16,13 +16,21 @@ from selenium.webdriver.common.by import By from xvfbwrapper import Xvfb from lxml import html import pytz -from events.digitools import getBrowser, createURL, createBasicEvent, getSource +from events.digitools import getBrowser, createURL, createBasicEvent, getSource, add_calendar -scraper, created = Scraper.objects.get_or_create( - name="St Paul City Council", - website="https://www.stpaul.gov/calendar", - last_ran = datetime.now(), +try: + scraper, created = Scraper.objects.get_or_create( + name="St Paul City Council", + website="https://www.stpaul.gov/calendar", + calendar = Calendar.objects.get(shortcode='msp'), + items = 0, + new_items = 0, + last_ran = datetime.now(), ) +except Exception as e: + print(e) + scraper = Scraper.objects.get(name="St Paul City Council") + print("Scraper: ", scraper) tz = pytz.timezone("US/Central") @@ -54,14 +62,15 @@ def getEvents(br): print('\n\n++++\n\n') venue, created = Organization.objects.get_or_create(name="Somewhere in St Paul", city="St. Paul") new_event = Event.objects.update_or_create( - calendar = 'msp' event_type = 'Gv', show_title = title, show_link = link, show_date = datetime.strptime(dateTime, DATETIME_FORMAT), show_day = datetime.strptime(dateTime, DATETIME_FORMAT), - venue = venue + venue = venue, + scraper = scraper ) + add_calendar(new_event, 'msp') getEvents(br) sleep(5) diff --git a/events/scrapers/Working/govt/mngov.py b/events/scrapers/Working/govt/mngov.py index e1cdd0c..816f11b 100644 --- a/events/scrapers/Working/govt/mngov.py +++ b/events/scrapers/Working/govt/mngov.py @@ -8,11 +8,13 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() -from events.models import Event as DSEvent, Organization, Scraper +from events.models import Event as DSEvent, Organization, Scraper, Calendar + +import events.digitools as digitools td = relativedelta.relativedelta(hours=5) odt = datetime.now() + td @@ -27,7 +29,9 @@ try: scraper, created = Scraper.objects.get_or_create( name=venue.name, website=venue.website, + calendar = Calendar.objects.get(shortcode='msp'), items = 0, + new_items = 0, last_ran = datetime.now(), ) except Exception as e: @@ -78,7 +82,6 @@ for component in gcal.walk(): if event['dateStart'] > now_now: print(event['strSummary']) new_event, created = DSEvent.objects.update_or_create( - calendar = 'msp' event_type = event_type, show_title = event['strSummary'], show_link = venue.website, @@ -87,6 +90,7 @@ for component in gcal.walk(): more_details = event["details"], venue = venue ) + digitools.add_calendar(new_event, 'msp') scraper.items+=1 if event['strLocation'] != None and event['strLocation'] != 'MN' and event['strLocation'] != 'Online': loc = event['strLocation'].split('@') diff --git a/events/scrapers/Working/iCal/ical.CAFAC.mpls.py b/events/scrapers/Working/iCal/ical.CAFAC.mpls.py index 0e43759..8653689 100644 --- a/events/scrapers/Working/iCal/ical.CAFAC.mpls.py +++ b/events/scrapers/Working/iCal/ical.CAFAC.mpls.py @@ -9,8 +9,8 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event as DSEvent, Organization, Scraper, Calendar @@ -46,5 +46,23 @@ event_type = "Ed" objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") -digitools.getiCalEvents(gcal, scraper, venue) + +events = digitools.getiCalEvents(gcal, scraper, venue, "Ed") + +for event in events: + # ppr(event) + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + try: + digitools.createBasicEvent(e, 'Ed', venue) + except Exception as e: + print("Error: ", e) + digitools.updateScraper(scraper, item_count_start) diff --git a/events/scrapers/Working/iCal/ical_ingles.py b/events/scrapers/Working/iCal/ical_ingles.py index b1a888a..3c0b956 100644 --- a/events/scrapers/Working/iCal/ical_ingles.py +++ b/events/scrapers/Working/iCal/ical_ingles.py @@ -9,13 +9,16 @@ from pprint import pprint as ppr import pytz import django + sys.path.append('../../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() +from config.env import env + from events.models import Event as DSEvent, Organization, Scraper, Calendar import events.digitools as digitools -from dateutil import relativedelta + td = relativedelta.relativedelta(hours=5) @@ -40,16 +43,44 @@ except Exception as e: scraper = Scraper.objects.get(name=venue.name) item_count_start = scraper.items - objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") def createEvent(day, date, event, scraper, venue, event_type): + ppr(event) + print("NAME: ", venue.name) + print('\n\n') + + if venue.name == "DANCEFREE": + venue.website = "https://www.instagram.com/dancefreeco" + if venue.name == "Vintrash": + venue.website = "https://www.instagram.com/vintrashbar" + if venue.name == "The Wandering Paisa": + venue.website = "https://wanderingpaisahostel.com" + if venue.name == "Dulce Posion": + venue.website = "https://www.instagram.com/dulceposionr" + if venue.name == "Blood Dance Company": + venue.website = "https://www.instagram.com/blooddancecompany" + if venue.name == "OLSA Certified Spanish School": + venue.website = "https://www.olsafoundation.org/" + if event['strSummary'] == "Merli Rooftop Language Exchange": + venue.website = "https://calendar.google.com/calendar/embed?src=46ae0446724b1b3ee83cbd7dbc0db6a235bf97509ad860ca91eada3c267b5e41%40group.calendar.google.com&ctz=America%2FBogota" + if "Concious Warrior" in event['strSummary']: + venue.website = "https://www.consciouscolombia.com/" + # if venue.name == "": + # venue.website = "https://www.consciouscolombia.com/" + # if venue.name == "": + # venue.website = "https://www.consciouscolombia.com/" + # if venue.name == "": + # venue.website = "https://www.consciouscolombia.com/" + venue.save() + days = [day-1, day+6, day+13] for day in days: event['dateStamp'] = date + timedelta(days=day) event['dateStart'] = event['dateStamp'] + print("sending") digitools.createCleanIcalEvent(event, scraper, venue, event_type) return @@ -68,7 +99,7 @@ counter = 0 for component in gcal.walk(): event = {} event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['strSummary'] = f"{(component.get('SUMMARY'))}" event['strDesc'] = component.get('DESCRIPTION') event['strLocation'] = str(component.get('LOCATION')) @@ -87,15 +118,19 @@ for component in gcal.walk(): event['dateStart'] = event['dateStart'].dt event['dateStart'] = datetime.strptime(str(event['dateStart'])[:-6], '%Y-%m-%d %H:%M:%S') rules = component.get('RRule') - if rules['FREQ'][0] == 'WEEKLY': - if datetime.today().weekday() != 0: - event = splitLocation(event) - date = datetime.today().date() - timedelta(days=datetime.today().weekday()) - date = datetime.combine(date, event['dateStart'].time()) - days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"] - for day in rules['BYDAY']: - day = days.index(day) - createEvent(day, date, event, scraper, event['venue'], "Ed") + try: + if rules['FREQ'][0] == 'WEEKLY': + if datetime.today().weekday() != 0: + event = splitLocation(event) + date = datetime.today().date() - timedelta(days=datetime.today().weekday()) + date = datetime.combine(date, event['dateStart'].time()) + days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"] + for day in rules['BYDAY']: + day = days.index(day) + createEvent(day, date, event, scraper, event['venue'], "Ed") + except Exception as e: + print("Error: ", e, "\n\n\n\n") + pass digitools.updateScraper(scraper, item_count_start) diff --git a/events/scrapers/Working/iCal/ical_online_events.py b/events/scrapers/Working/iCal/ical_online_events.py new file mode 100644 index 0000000..6027189 --- /dev/null +++ b/events/scrapers/Working/iCal/ical_online_events.py @@ -0,0 +1,118 @@ +import requests, os, sys +from icalendar import Calendar as iCalendar, Event + +from datetime import datetime, timedelta +from dateutil import relativedelta +td = relativedelta.relativedelta(hours=5) + +from pprint import pprint as ppr +import pytz + +import django + +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' +django.setup() + +from config.env import env + +from events.models import Event as DSEvent, Organization, Scraper, Calendar +import events.digitools as digitools + +td = relativedelta.relativedelta(hours=5) + + +venue, created = Organization.objects.get_or_create( + name="Online Events", + city="Online", + website="https://dreamfreely.org/", + ) +event_type = "Mu" + +try: + scraper, created = Scraper.objects.get_or_create( + name="Online Events", + website="https://calendar.google.com/calendar/ical/p1a4r9glkjpu4u6iv3fkmu8qtc%40group.calendar.google.com/public/basic.ics", + calendar = Calendar.objects.get(shortcode='000'), + items = 0, + new_items = 0, + last_ran = datetime.now(), + ) +except Exception as e: + print(e) + scraper = Scraper.objects.get(name=venue.name) + +item_count_start = scraper.items +objIcalData = requests.get(scraper.website) +gcal = iCalendar.from_ical(objIcalData.text) +tz = pytz.timezone("US/Central") + +def createEvent(day, date, event, scraper, venue, event_type): + days = [day-1, day+6, day+13] + for day in days: + event['dateStamp'] = date + timedelta(days=day) + event['dateStart'] = event['dateStamp'] + digitools.createCleanIcalEvent(event, scraper, venue, event_type) + return + +def splitLocation(event): + loc_split = event['strLocation'].split(',') + venue_name = loc_split[0] + venue, created = Organization.objects.get_or_create( + name=venue_name, + ) + event['venue'] = venue + return event + +counter = 0 + +for component in gcal.walk(): + event = {} + event['scraper'] = scraper + event['calendars'] = [scraper.calendar] + event['strSummary'] = f"{(component.get('SUMMARY'))}" + event['strDesc'] = component.get('DESCRIPTION') + event['strLocation'] = str(component.get('LOCATION')) + # startDate = component.get('DTSTART') + # startTime = startDate.time() + event['dateStart'] = component.get('DTSTART') + event['dateStamp'] = component.get('DTSTAMP') + + if event['strSummary'] != 'None': + event['details'] = { + "description" : event['strDesc'], + "Location" : event['strLocation'], + } + if 'Mikel' in event['strSummary']: + print('JELLOO \n\n\n JELOOO') + pass + elif event['dateStamp'] != None: + event['dateStart'] = event['dateStart'].dt + event['dateStart'] = datetime.strptime(str(event['dateStart'])[:-6], '%Y-%m-%d %H:%M:%S') + rules = component.get('RRule') + try: + if rules['FREQ'][0] == 'WEEKLY': + if datetime.today().weekday() != 0: + event = splitLocation(event) + date = datetime.today().date() - timedelta(days=datetime.today().weekday()) + date = datetime.combine(date, event['dateStart'].time()) + days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"] + for day in rules['BYDAY']: + day = days.index(day) + createEvent(day, date, event, scraper, event['venue'], "Ed") + except Exception as e: + print("Error (no repeat): ", e) + pass + +digitools.updateScraper(scraper, item_count_start) + +new_time = datetime.now() - timedelta(days=1) +right_bound_time = datetime.now() + timedelta(days=45) +events = DSEvent.objects.filter(show_date__lte=new_time) +events1 = DSEvent.objects.filter(show_date__gte=right_bound_time) + +for e in events: + e.delete() + +for e in events1: + e.delete() \ No newline at end of file diff --git a/events/scrapers/Working/iCal/ical_run.SocialableCider.mpls.py b/events/scrapers/Working/iCal/ical_run.SocialableCider.mpls.py index bde0fa6..b8cd415 100644 --- a/events/scrapers/Working/iCal/ical_run.SocialableCider.mpls.py +++ b/events/scrapers/Working/iCal/ical_run.SocialableCider.mpls.py @@ -9,8 +9,8 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event as DSEvent, Organization, Scraper, Calendar @@ -44,5 +44,22 @@ item_count_start = scraper.items objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") -digitools.getiCalEvents(gcal, scraper, venue) +events = digitools.getiCalEvents(gcal, scraper, venue, "Ed") + +for event in events: + # ppr(event) + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + try: + digitools.createBasicEvent(e, 'Mu', venue) + except Exception as e: + print("Error: ", e) + digitools.updateScraper(scraper, item_count_start) \ No newline at end of file diff --git a/events/scrapers/Working/iCal/ical_run.bunkers.py b/events/scrapers/Working/iCal/ical_run.bunkers.py index 982f86d..9dedf0b 100644 --- a/events/scrapers/Working/iCal/ical_run.bunkers.py +++ b/events/scrapers/Working/iCal/ical_run.bunkers.py @@ -5,8 +5,8 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event as DSEvent, Organization, Scraper, Calendar @@ -44,5 +44,23 @@ event_type = "Mu" objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") -digitools.getiCalEvents(gcal, scraper, venue) +events = digitools.getiCalEvents(gcal, scraper, venue, "Mu") + +for event in events: + # ppr(event) + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + try: + digitools.createBasicEvent(e, 'Mu', venue) + except Exception as e: + print("Error: ", e) + +# digitools.returniCalEvents(gcal, scraper, venue, "Mu") digitools.updateScraper(scraper, item_count_start) diff --git a/events/scrapers/Working/iCal/ical_run.cfpa.py b/events/scrapers/Working/iCal/ical_run.cfpa.py index 77b9afd..750d924 100644 --- a/events/scrapers/Working/iCal/ical_run.cfpa.py +++ b/events/scrapers/Working/iCal/ical_run.cfpa.py @@ -8,14 +8,14 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event as DSEvent, Organization, Scraper, Calendar import events.digitools as digitools - +tz = pytz.timezone("US/Central") td = relativedelta.relativedelta(hours=5) venue, created = Organization.objects.get_or_create( @@ -44,5 +44,50 @@ event_type = "Ed" objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") -digitools.getiCalEvents(gcal, scraper, venue) + +events = digitools.getiCalEvents(gcal, scraper, venue, "Ed") + +for event in events: + ppr(event) + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + try: + digitools.createBasicEvent(e, 'Ed', venue) + except Exception as e: + print("Error: ", e) + + + # now_now = datetime.today().date() + # try: + # print("1Event: ", event['dateStart']) + # if event['dateStart'] > now_now: + # print("Check Check: ", event['dateStart']) + # ppr(event) + # # createIcalEvent(event, scraper, venue, event_type) + # else: + # print("WHAT?") + # ppr(event) + # except Exception as e: + # try: + # event['dateStart'] = event['dateStart'].date() + # print("2Event: ", event['dateStart']) + # if event['dateStart'] > now_now: + # print("Check Check: ", event['dateStart']) + # ppr(event) + # # createIcalEvent(event, scraper, venue, event_type) + # else: + # print("WHAT?") + # ppr(event) + # except Exception as e: + # print("The Error: ", e) + # pass + + digitools.updateScraper(scraper, item_count_start) \ No newline at end of file diff --git a/events/scrapers/Working/iCal/ical_run.eagles.py b/events/scrapers/Working/iCal/ical_run.eagles.py index 2a92be5..fe3ebf2 100644 --- a/events/scrapers/Working/iCal/ical_run.eagles.py +++ b/events/scrapers/Working/iCal/ical_run.eagles.py @@ -6,8 +6,8 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event as DSEvent, Organization, Scraper, Calendar @@ -42,5 +42,22 @@ event_type = "Mu" objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") -digitools.getiCalEvents(gcal, scraper, venue) +events = digitools.getiCalEvents(gcal, scraper, venue, "Ed") + +for event in events: + ppr(event) + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + try: + digitools.createBasicEvent(e, 'Mu', venue) + except Exception as e: + print("Error: ", e) + digitools.updateScraper(scraper, item_count_start) \ No newline at end of file diff --git a/events/scrapers/Working/iCal/ical_run.terminalbar-mpls.py b/events/scrapers/Working/iCal/ical_run.terminalbar-mpls.py index 5278fb0..3848b15 100644 --- a/events/scrapers/Working/iCal/ical_run.terminalbar-mpls.py +++ b/events/scrapers/Working/iCal/ical_run.terminalbar-mpls.py @@ -8,8 +8,8 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event as DSEvent, Organization, Scraper, Calendar @@ -46,5 +46,22 @@ event_type = "Mu" objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") -digitools.getiCalEvents(gcal, scraper, venue) +events = digitools.getiCalEvents(gcal, scraper, venue, "Ed") + +for event in events: + # ppr(event) + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + try: + digitools.createBasicEvent(e, 'Mu', venue) + except Exception as e: + print("Error: ", e) + digitools.updateScraper(scraper, item_count_start) \ No newline at end of file diff --git a/events/scrapers/Working/iCal/ical_run.whitesquirrel.py b/events/scrapers/Working/iCal/ical_run.whitesquirrel.py new file mode 100644 index 0000000..9f6951a --- /dev/null +++ b/events/scrapers/Working/iCal/ical_run.whitesquirrel.py @@ -0,0 +1,69 @@ +import requests, os, sys +# from icalendar import Calendar as iCalendar, Event +from icalendar import Calendar as iCalendar +from datetime import datetime +from dateutil import relativedelta +td = relativedelta.relativedelta(hours=5) + +from pprint import pprint as ppr +import pytz + +import django +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' +django.setup() + +from events.models import Event as DSEvent, Organization, Scraper, Calendar +import events.digitools as digitools + +from dateutil import relativedelta +td = relativedelta.relativedelta(hours=5) + +tz = pytz.timezone("US/Central") +DATETIME_FORMAT = '%Y-%m-%d %I:%M %p' + +venue, created = Organization.objects.get_or_create( + name="White Squirrel", + city="St. Paul", + website="https://whitesquirrelbar.com", + is_venue = True + ) + +try: + scraper, created = Scraper.objects.get_or_create( + name="White Squirrel", + website="https://calendar.google.com/calendar/ical/vh5sr9h59nmrs2op5lmptu2fsa344cig%40import.calendar.google.com/public/basic.ics", + calendar = Calendar.objects.get(shortcode='msp'), + items = 0, + new_items = 0, + last_ran = datetime.now(), + ) +except Exception as e: + print(e) + scraper = Scraper.objects.get(name=venue.name) + +item_count_start = scraper.items +event_type = "Mu" + +objIcalData = requests.get(scraper.website) +gcal = iCalendar.from_ical(objIcalData.content) +tz = pytz.timezone("US/Central") +events = digitools.getiCalEvents(gcal, scraper, venue, event_type) + +for event in events: + ppr(event) + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + try: + digitools.createBasicEvent(e, event_type, venue) + except Exception as e: + print("Error: ", e) + +digitools.updateScraper(scraper, item_count_start) diff --git a/events/scrapers/Working/iCal/index.html b/events/scrapers/Working/iCal/index.html new file mode 100644 index 0000000..3c7ad8a --- /dev/null +++ b/events/scrapers/Working/iCal/index.html @@ -0,0 +1,388 @@ + + + + + + + + + + + The White Squirrel Bar - Cocktails • Live Music • Saint Paul, Minnesota + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ +
    +
  • + +
    +
  • +
  • + +
    +
  • +
  • + +
    +
  • +
  • + +
    +
  • +
  • + +
    +
  • +
  • + +
    +
  • +
+ + +
+ +
+ +
+

974 West Seventh Street
+Saint Paul, Minnesota 55102

+
+ + +
+

Monday - Friday 3pm-2am
+Saturday and Sunday 12pm-2am +

+
+ +
+ + +
+
+

Cocktails & Beers

+
+

Our signature cocktails, plus local craft beers on tap and in bottles

+
+
    +
  • +

    + Little Bohemia Rhapsody +

    +

    vodka, creme de fleur, herbal liqueur, lime juice, mint

    +
  • +
  • +

    + West End Girls +

    +

    reposado, mezcal, lemon juice, ginger syrup

    +
  • +
  • +

    + Hot Dog Flavored Water +

    +

    old overholt rye, johnny walker black, maple syrup, herbs & spices

    +
  • +
  • +

    + Dreamkiller +

    +

    aged rum, velvet falernum, mezcal, coco lopez, pineapple, orange, lime, nutmeg

    +
  • +
  • +

    + Gold Rush - barrel finished +

    +

    bourbon, local honey, lemon,

    +
  • +
  • +

    + It Was A Very Good Year - barrel finished +

    +

    tattersall barrel aged gin, sangria, cinnamon

    +
  • +
  • +

    + Kevin Is A Place On Earth - barrel finished +

    +

    brandy, applesauce, absinthe, cider

    +
  • +
  • +

    + Tap Beer +

    +

    rotating taps

    +
  • +
  • +

    + Bottles & Cans +

    +
    rotating selection
    +
    +
  • +
  • +

    + Wine +

    +
    house red
    +house white
    +sangria
    +cabernet
    +pinot gris
    +rose
    +cava split
    +
  • +
  • +

    + Non-Alcoholic +

    +
    Dream On
    +Back In the Date
    +NA Beer
    +Cold Coffee
    +Switchel (rotating flavors)
    +Kombucha (rotating flavors)
    +
  • +
+
+
+ + + +
+ + +
+ + +
+ + + +
+ + + + + + + + + diff --git a/events/scrapers/Working/iCal/ws.ics b/events/scrapers/Working/iCal/ws.ics new file mode 100644 index 0000000..1582f7e --- /dev/null +++ b/events/scrapers/Working/iCal/ws.ics @@ -0,0 +1,498 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:The White Squirrel Bar +X-WR-TIMEZONE:UTC +X-WR-CALDESC:Events for The White Squirrel Bar +BEGIN:VEVENT +DTSTART:20251118T030000Z +DTEND:20251118T060000Z +DTSTAMP:20251116T033816Z +UID:10806-1763413200-1763424000@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-deeper-kind-w-23-watts/ +CREATED:20251104T233617Z +LAST-MODIFIED:20251105T053618Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The Deeper Kind w. 23 Watts +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251129T000000Z +DTEND:20251129T020000Z +DTSTAMP:20251116T033816Z +UID:10852-1764352800-1764360000@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-mary-cutrufello-band-3/ +CREATED:20251115T173617Z +DESCRIPTION:A rock and roll band! Killer harmonies\, rippin’ solos\, cool s + ongs\, funny\nshit in between. \nHailed as a country guitarist\, Mary Cutru + fello grew up on East Coast\nclassic rock. (Yes\, think Springsteen!) This + tight\, taut trio explores\nher songs old and new with the fearless guitars + \, stories\, and\nbetween-song banter she’s known for. +LAST-MODIFIED:20251115T233617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The Mary Cutrufello Band +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251117T030000Z +DTEND:20251117T060000Z +DTSTAMP:20251116T033816Z +UID:10802-1763326800-1763337600@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/karaoke-with-ally/ +CREATED:20251103T163617Z +LAST-MODIFIED:20251103T223619Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Karaoke With Ally! +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251127T000000Z +DTEND:20251127T020000Z +DTSTAMP:20251116T033816Z +UID:10846-1764180000-1764187200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/family-dinner-w-doug-sarah-4/ +CREATED:20251115T013617Z +LAST-MODIFIED:20251115T073617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Family Dinner w. Doug & Sarah +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251116T190000Z +DTEND:20251116T220000Z +DTSTAMP:20251116T033816Z +UID:10147-1763298000-1763308800@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-friend-ship/ +CREATED:20251103T003616Z +DESCRIPTION:These popular singer/songwriters first got together to perform + on Joel Sax’s debut\nalbum\, ‘Billions of Stars.’ They had so much fun and + got such a great response at their\nsold-out release show that they have jo + ined together to form a new band\, The Friend\nShip! They will bring their + best songs\, sweetest harmonies\, and funniest stories to the\nWhite Squirr + el for a night of beautiful music. \nNikki Lemire is an incredibly in deman + d artist\, having earned accolades from fans and critics\nalike. Natalia To + ledo\, from The Current describes ‘Mend’ It as “a dreamy\, simple\, and\nbe + autiful song led by the sounds of her harp.”\nJoel Sax writes heartfelt son + gs about love\, regret\, and hope for a bigger\, brighter future.\nHis debu + t album title track\, Billions of Stars\, is “… a wonderful mix for a conte + mporary\nfolk song” – Minnesota Sound and ‘A Lovely New Album\,’ by Mostly + Minnesota\nMusic. \nMarc Severin has been a mainstay of the music scene for + many years. His music is\ntrue Americana and his storytelling is midwester + n country at its best. The Friend Ship\nwill be previewing songs from his w + ell anticipated new album coming out this Winter. \nDave Mehling is a highl + y sought-after musician\, producer and songwriter. He has\nproduced albums + for many artists\, including Sarah Morris\, Haley E Rydell\, Joel Sax and\n + Emily Haavik. “You are drawn in with his lyrics. They speak of very univers + al issues of\nlove which we all have\, but few of us have the talent to giv + e them a voice. Dave Mehling\npossesses this rare gift.” – Becca Martin +LAST-MODIFIED:20251103T063617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The Friend Ship +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251123T000000Z +DTEND:20251123T020000Z +DTSTAMP:20251116T033816Z +UID:10827-1763834400-1763841600@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/giant-valley-string-band/ +CREATED:20251109T183617Z +DESCRIPTION:Giant Valley String Band is a Twin Cities acoustic group playin + g an\neclectic mix of covers and originals in Bluegrass and Americana. The\ + nband members are Noelle Haland on guitar\, Ted Haland on dobro and\nbass\, + Nate Hess on fiddle and guitar\, Erika Janik on banjo\, Matt\nJensen on ma + ndolin\, and Debra Pflipsen on guitar\, harmonica\,\naccordion\, and bass. + More info at giantvalleystringband.com. \n\n\n\n\nBlue Groove is a multiple + award-winning bluegrass band based in the\nTwin Cities that plays both con + temporary and classic bluegrass tunes\nwith a creative approach that drives + while still maintaining a sense\nof laid-back\, Midwestern chill. That’s w + hat they mean by “groove”. The\nbands inviting sound combined with their op + enness warmth on and\noff-stage have made them crowd favorites at festivals + and concert\nvenues all around Minnesota and the Upper Midwest. \nThe band + covers a number of past and current contemporary bluegrass\nartists. A Blu + e Groove show may feature songs from Alison Krauss or\nRhonda Vincent as we + ll as traditional bluegrass (Bill Monroe\, Flatt &\nScruggs) with all of it + s drive\, improvisation and harmony singing!\nBlue Groove also likes to put + a bluegrass spin on more\ncontemporary/pop artists such as U2\, Passenger\ + , and the Doobie\nBrothers! \nMembers of Blue Groove bluegrass band include + Adelle Hyrkas\, lead\nvocals and rhythm guitar\; David Smith\, banjo and v + ocals\; Bob Doe\, lead\nguitar\, dobro\, and vocals\; Pete Mathison bass an + d vocals\, Tom\nWadzinski mandolin and vocals. Ocassionally we may have a g + uest\nfiddler- past guests have included fiddlers Richard Kriehn\, Michael\ + nPrewitt\, and AJ Srubas. \nYou can find out more about Blue Groove at www. + bluegroovebluegrass.com +LAST-MODIFIED:20251110T003617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Giant Valley String Band w. Blue Groove +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251121T220000Z +DTEND:20251122T040000Z +DTSTAMP:20251116T033816Z +UID:11255-1763740800-1763762400@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-angry-line-cook-4/ +CREATED:20251114T133616Z +DESCRIPTION:The Best Smash Burgers in town! +LAST-MODIFIED:20251114T193617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The Angry Line Cook +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251127T030000Z +DTEND:20251127T060000Z +DTSTAMP:20251116T033816Z +UID:10848-1764190800-1764201600@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/nights-with-tim-2/ +CREATED:20251115T013617Z +DESCRIPTION:Dig into the deeper\, progressive side of disco\, funk\, and R& + B from the ’70s and ’80s\, with the occasional turn into house and left-fie + ld gems. An all vinyl night courtesy of local selector Tim. He knows how to + keep the vibes at White Squirrel curious and moving. +LAST-MODIFIED:20251115T073617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Nights with Tim +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251122T190000Z +DTEND:20251122T220000Z +DTSTAMP:20251116T033816Z +UID:10825-1763816400-1763827200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/caitlin-robertson/ +CREATED:20251109T023617Z +LAST-MODIFIED:20251109T083618Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Caitlin Robertson +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251128T220000Z +DTEND:20251129T040000Z +DTSTAMP:20251116T033816Z +UID:11257-1764345600-1764367200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-angry-line-cook-5/ +CREATED:20251115T013617Z +DESCRIPTION:The Best Smash Burgers in town! +LAST-MODIFIED:20251115T073617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The Angry Line Cook +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251122T000000Z +DTEND:20251122T020000Z +DTSTAMP:20251116T033816Z +UID:10821-1763748000-1763755200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/chris-holm-friends-2/ +CREATED:20251108T203618Z +LAST-MODIFIED:20251109T023619Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Chris Holm & Friends +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251123T030000Z +DTEND:20251123T060000Z +DTSTAMP:20251116T033816Z +UID:10829-1763845200-1763856000@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/13-howell/ +CREATED:20251110T003617Z +LAST-MODIFIED:20251110T063617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:13 Howell w. Steph Was & The Secret Izz\, TH3 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251120T000000Z +DTEND:20251120T020000Z +DTSTAMP:20251116T033816Z +UID:10813-1763575200-1763582400@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/st-paul-mudsteppers-4/ +CREATED:20251107T033617Z +LAST-MODIFIED:20251107T093617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:St Paul Mudsteppers +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251116T000000Z +DTEND:20251116T020000Z +DTSTAMP:20251116T033816Z +UID:10819-1763229600-1763236800@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/in-circles-sunny-day-real-estate-tri + bute-w-120-minutes/ +CREATED:20251102T013616Z +DESCRIPTION:It’s the 30th anniversary of Sunny Day Real Estates LP2 record! + In Circles with be performing the album in its entirety. \n  +LAST-MODIFIED:20251102T063617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:In Circles (Sunny Day Real Estate Tribute) w. 120 Minutes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251124T000000Z +DTEND:20251124T020000Z +DTSTAMP:20251116T033816Z +UID:10833-1763920800-1763928000@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-jeff-becker-band/ +CREATED:20251110T223617Z +LAST-MODIFIED:20251111T043617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The Jeff Becker Band +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251122T030000Z +DTEND:20251122T060000Z +DTSTAMP:20251116T033816Z +UID:10823-1763758800-1763769600@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/ancient-waves-2/ +CREATED:20251108T203618Z +LAST-MODIFIED:20251109T023619Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Ancient Waves w. Muun Batos & Jarad Miles +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251121T000000Z +DTEND:20251121T020000Z +DTSTAMP:20251116T033816Z +UID:10815-1763661600-1763668800@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/devaney-friends-2/ +CREATED:20251107T223617Z +LAST-MODIFIED:20251108T043617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Devaney & Friends w. Aaron James +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251121T030000Z +DTEND:20251121T060000Z +DTSTAMP:20251116T033816Z +UID:10817-1763672400-1763683200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/country-oke-3/ +CREATED:20251108T043618Z +LAST-MODIFIED:20251108T103619Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Country-oke +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251124T030000Z +DTEND:20251124T060000Z +DTSTAMP:20251116T033816Z +UID:10835-1763931600-1763942400@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/bryan-the-haggards/ +CREATED:20251111T043617Z +LAST-MODIFIED:20251111T103617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Bryan & The Haggards w. Jump Loop\, The American Songbook +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251125T030000Z +DTEND:20251125T060000Z +DTSTAMP:20251116T033816Z +UID:10839-1764018000-1764028800@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/seven-seasons/ +CREATED:20251112T013616Z +LAST-MODIFIED:20251112T073617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Slasher Film +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251126T030000Z +DTEND:20251126T060000Z +DTSTAMP:20251116T033816Z +UID:10841-1764104400-1764115200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/third-date-tuesday-night-residency-2 + / +CREATED:20251113T053616Z +LAST-MODIFIED:20251113T113617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Third Date Tuesday Night Residency +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251117T000000Z +DTEND:20251117T020000Z +DTSTAMP:20251116T033816Z +UID:10800-1763316000-1763323200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/bingo-with-pete-3/ +CREATED:20251103T003616Z +LAST-MODIFIED:20251103T063617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Bingo With Pete! +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251125T000000Z +DTEND:20251125T020000Z +DTSTAMP:20251116T033816Z +UID:10837-1764007200-1764014400@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/devil-dodger/ +CREATED:20251111T203617Z +LAST-MODIFIED:20251112T023617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Devil Dodger +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251126T000000Z +DTEND:20251126T020000Z +DTSTAMP:20251116T033816Z +UID:10843-1764093600-1764100800@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/ali-grays-country-jamboree-2/ +CREATED:20251112T233616Z +DESCRIPTION:Come on out for a tribute to the Darlings of Country music\, fe + aturing Ali Gray’s Country Jamboree! Hear songs from the catalogs of Lorett + a Lynn\, Tammy Wynette\, Tanya Tucker\, Dolly Parton\, Linda Ronstadt\, Pam + Tillis\, Patty Loveless and many more. We won’t leave out the Kings of Cou + ntry\, sung by guitar legend Dan Neale and drummer extraordinaire Scott Wen + um\, including favorites like Roger Miller\, Hank Williams\, Johnny Cash\, + Buck Owens\, Waylon Jennings and more!  Also featuring Dan Lowinger on bass + ! 6-8. +LAST-MODIFIED:20251113T053616Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Ali Gray's Country Jamboree +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251116T030000Z +DTEND:20251116T060000Z +DTSTAMP:20251116T033816Z +UID:10798-1763240400-1763251200@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/lost-island-society-w-woolly-mack-po + ison-ivy-the-people/ +CREATED:20251102T183617Z +LAST-MODIFIED:20251103T003617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Lost Island Society w. Woolly Mack\, Poison Ivy & The People +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251123T190000Z +DTEND:20251123T220000Z +DTSTAMP:20251116T033816Z +UID:10831-1763902800-1763913600@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-stress-of-her-regard/ +CREATED:20251110T003617Z +LAST-MODIFIED:20251110T063617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The Stress Of Her Regard +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251119T030000Z +DTEND:20251119T060000Z +DTSTAMP:20251116T033816Z +UID:10811-1763499600-1763510400@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/third-date-tuesday-night-residency/ +CREATED:20251106T213618Z +LAST-MODIFIED:20251107T033618Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Third Date Tuesday Night Residency +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251119T000000Z +DTEND:20251119T020000Z +DTSTAMP:20251116T033816Z +UID:10809-1763488800-1763496000@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/the-new-havoline-supremes/ +CREATED:20251105T053616Z +DESCRIPTION:The New Havoline Supremes are a Twin Cities based band\,  featu + ring the legendary Mary Cutrufello on guitar and vocals\, and Dan Lowinger + on guitar.  Formed in October of 2023\, the band plays a mix of classic cou + ntry and Mary’s original tunes\, and features Greg Schutte (Ryan Bingham\, + Mickey Hart\, Chasity Brown) on drums\, and Erik Lillestol (Cafe Accordion) + on bass.\n\nMary Cutrufello\n\nWith 30 years of experience in the music bu + siness\, Mary Cutrufello is everything from Texas honky-tonk heroine and fi + ery Midwestern roots-rocker to a powerhouse acoustic performer. Connecticut + -raised and Yale-educated\, Mary’s musical journey has taken her from the E + ast Coast to Houston and now to Minnesota.  Career highlights include: the + major label release of    ”When the Night is Through\,” on Mercury Records + in 1998\, appearances on national tv shows such as Tonight Show with Jay Le + no\, appearances at major festivals including Farm Aid\, and tours with Jim + mie Dale Gilmore and Tish Hinojosa.  Mary has seven self-released albums\, + and has played guitar locally for Annie Mack\, Michael Perry and the Long B + eds\, and many others.\n\n\n\nDan Lowinger\, a transplant from Portland\, O + R\, is a guitarist steeped in the tradition of Western swing and classic co + untry. Since moving to the Twin Cities in 2017\, Dan has become a fixture i + n the local country and Americana scene\, playing on a regular basis with a + ll star Western swing band Honky Tonk Jump\, and country rockers Cole Diamo + nd\, while also sharing the stage with local greats\, Martin Zellar (Gear D + addies)\, Tony Andreason (The Trashmen)\, Pat Donohue (Prairie Home Compani + on) and many others! He has performed regionally and toured nationally with + many different country and swing bands from the Pacific Northwest includin + g: The Barn Door Slammers\, Ralph Carney’s Pepper Grinders\, Vince Mira\, a + nd Western Centuries. +LAST-MODIFIED:20251105T113617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:The New Havoline Supremes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251120T030000Z +DTEND:20251120T060000Z +DTSTAMP:20251116T033816Z +UID:10782-1763586000-1763596800@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/venturer-w-peeler-mild-manner/ +CREATED:20251107T223617Z +DESCRIPTION:Venturer is a rock based band with many other genre influences + such as funk\, folk\, prog\, punk\, and jazz. Venturer has played around th + e United States\, mainly in Milwaukee\, Madison\, Chicago\, and Minneapolis + \, but also on the East Coast and greater Midwest. +LAST-MODIFIED:20251108T043617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Venturer w. Peeler & Mild Manner +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART:20251118T000000Z +DTEND:20251118T020000Z +DTSTAMP:20251116T033816Z +UID:10804-1763402400-1763409600@whitesquirrelbar.com +URL:https://whitesquirrelbar.com/event/clovers-daughter/ +CREATED:20251103T223616Z +LAST-MODIFIED:20251104T043617Z +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Clovers Daughter +TRANSP:OPAQUE +END:VEVENT +END:VCALENDAR diff --git a/events/scrapers/Working/news/minnpost.mn.py b/events/scrapers/Working/news/minnpost.mn.py index 1a6be3f..dfeaf8d 100644 --- a/events/scrapers/Working/news/minnpost.mn.py +++ b/events/scrapers/Working/news/minnpost.mn.py @@ -4,7 +4,7 @@ from dateutil import relativedelta import django sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings' django.setup() from time import sleep diff --git a/events/scrapers/Working/news/racket.mn.py b/events/scrapers/Working/news/racket.mn.py index a48e072..fb7ee45 100644 --- a/events/scrapers/Working/news/racket.mn.py +++ b/events/scrapers/Working/news/racket.mn.py @@ -4,7 +4,7 @@ from dateutil import relativedelta import django sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings' django.setup() from time import sleep diff --git a/events/scrapers/Working/news/sahan.mn.py b/events/scrapers/Working/news/sahan.mn.py index 69e399a..7535d68 100644 --- a/events/scrapers/Working/news/sahan.mn.py +++ b/events/scrapers/Working/news/sahan.mn.py @@ -4,7 +4,7 @@ from dateutil import relativedelta import django sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings' django.setup() from time import sleep diff --git a/events/scrapers/Working/news/unicornriot.py b/events/scrapers/Working/news/unicornriot.py index 841d132..3fa1a16 100644 --- a/events/scrapers/Working/news/unicornriot.py +++ b/events/scrapers/Working/news/unicornriot.py @@ -4,7 +4,7 @@ from dateutil import relativedelta import django sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings' django.setup() from time import sleep diff --git a/events/scrapers/Working/smedia/bluesky.py b/events/scrapers/Working/smedia/bluesky.py index 9c9b98e..fb0a87e 100644 --- a/events/scrapers/Working/smedia/bluesky.py +++ b/events/scrapers/Working/smedia/bluesky.py @@ -5,8 +5,8 @@ from dateutil import relativedelta from atproto import Client import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -19,7 +19,7 @@ from socials.models import SocialLink, SocialPost tz = pytz.timezone("US/Central") USERNAME = "dreamfreely.org" -PASSWORD = "Futbol21!@" +PASSWORD = "gU):3-BA]DaK[_K$DHmI" client = Client() client.login(USERNAME, PASSWORD) diff --git a/events/scrapers/Working/smedia/bluesky_media.py b/events/scrapers/Working/smedia/bluesky_media.py index e230ac7..eabfc11 100644 --- a/events/scrapers/Working/smedia/bluesky_media.py +++ b/events/scrapers/Working/smedia/bluesky_media.py @@ -5,8 +5,8 @@ from dateutil import relativedelta from atproto import Client import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -19,7 +19,7 @@ from socials.models import SocialImg tz = pytz.timezone("US/Central") USERNAME = "dreamfreely.org" -PASSWORD = "Futbol21!@" +PASSWORD = "gU):3-BA]DaK[_K$DHmI" client = Client() client.login(USERNAME, PASSWORD) diff --git a/events/scrapers/Working/smedia/redsky.py b/events/scrapers/Working/smedia/redsky.py index d1219ca..780d4b2 100644 --- a/events/scrapers/Working/smedia/redsky.py +++ b/events/scrapers/Working/smedia/redsky.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep diff --git a/events/scrapers/Working/venues/AcmeComedy.Mpls.py b/events/scrapers/Working/venues/AcmeComedy.Mpls.py index 426faf9..6e6a984 100644 --- a/events/scrapers/Working/venues/AcmeComedy.Mpls.py +++ b/events/scrapers/Working/venues/AcmeComedy.Mpls.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -22,7 +22,8 @@ venue, created = Organization.objects.get_or_create( is_venue = True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') + tz = pytz.timezone("US/Central") @@ -40,7 +41,7 @@ def get_events(ps, event_type): if month == "Jan": year = int(year) + 1 event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['title'] = c.xpath('.//*/span[@class="event_title"]/a/text()')[0] event['date'] = [month, day, str(year), c.xpath('.//*/span[@class="event_time"]/text()')[0].strip()] event['date'] = " ".join(event['date']) diff --git a/events/scrapers/Working/venues/Amsterdam.StPaul.py b/events/scrapers/Working/venues/Amsterdam.StPaul.py index fe5156d..1f60329 100644 --- a/events/scrapers/Working/venues/Amsterdam.StPaul.py +++ b/events/scrapers/Working/venues/Amsterdam.StPaul.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create( is_venue=True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') DATETIME_FORMAT = '%B %d %Y %I:%M%p' DATETIME_FORMAT_2 = '%A, %B %d @ %I%p %Y' @@ -35,7 +35,7 @@ def get_events(ps): month = c.xpath('.//*/div[@class="date-month"]/text()')[0] year = datetime.now().year event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['title'] = c.xpath('.//div/h4/a/text()')[0] event['date'] = [month, day, str(year), c.xpath('.//div[@class="event-info"]/p/text()')[0].split(" ")[0]] event['date'] = " ".join(event['date']) diff --git a/events/scrapers/Working/venues/FirstAveScrape.py b/events/scrapers/Working/venues/FirstAveScrape.py index a130b98..c85d178 100644 --- a/events/scrapers/Working/venues/FirstAveScrape.py +++ b/events/scrapers/Working/venues/FirstAveScrape.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -23,7 +23,7 @@ venue, created = Organization.objects.get_or_create( is_venue = True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') tz = pytz.timezone("US/Central") @@ -93,7 +93,7 @@ events = [] def get_info(pse): event = {} event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event["venue"] = pse.xpath('.//*/div[@class="content"]/div/div[@class="venue_name"]/text()')[0].replace('\t', '').replace('\n', '').strip() event["show_title"] = pse.xpath('.//*/span[@class="show_title"]/text()')[0].replace('\t', '').replace('\n', '') if event["show_title"] == "": @@ -164,7 +164,7 @@ for show in shows: try: event['dateStamp'] = event['date_time'] event['scraper'] = scraper - new_event, created = digitools.createDetailedEvent(event, "Mu", venue) + new_event, created = digitools.createDetailedEvent(event, "Mu", venue, scraper) scraper.items+=1 except Exception as e: print("event creation error: ", e, "\n\n", event, "\n\n", created) diff --git a/events/scrapers/Working/venues/GinkgoCoffee.stp.py b/events/scrapers/Working/venues/GinkgoCoffee.stp.py index 3750377..1e5aa03 100644 --- a/events/scrapers/Working/venues/GinkgoCoffee.stp.py +++ b/events/scrapers/Working/venues/GinkgoCoffee.stp.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create( is_venue = True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') event_type = "" @@ -41,7 +41,7 @@ def get_events(ps, event_type): if month == "January": year = int(year) + 1 event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['title'] = c.xpath('.//*/h3/a/text()')[0].replace("\n", "").replace("\t", "") event['date'] = " ".join([ dateTime, str(year)]) event['dateStamp'] = datetime.strptime(event['date'], DATETIME_FORMAT) diff --git a/events/scrapers/Working/venues/GreenRoom.Mpls.py b/events/scrapers/Working/venues/GreenRoom.Mpls.py index fd89394..fa33529 100644 --- a/events/scrapers/Working/venues/GreenRoom.Mpls.py +++ b/events/scrapers/Working/venues/GreenRoom.Mpls.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -22,7 +22,7 @@ venue, created = Organization.objects.get_or_create( is_venue = True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') event_type = "Mu" @@ -43,7 +43,7 @@ def get_events(ps, event_type): # if month == "Jan": # year = int(year) + 1 event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['title'] = c.xpath('.//*/div[@class="vp-event-name"]/text()')[0] event['datetime'] = date + " " + str(year) + " " + time event['dateStamp'] = datetime.strptime(event['datetime'], DATETIME_FORMAT) diff --git a/events/scrapers/Working/venues/HookLadderScrape.py b/events/scrapers/Working/venues/HookLadderScrape.py index e99686d..1d93e80 100644 --- a/events/scrapers/Working/venues/HookLadderScrape.py +++ b/events/scrapers/Working/venues/HookLadderScrape.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -26,7 +26,7 @@ venue, created = Organization.objects.get_or_create( is_venue=True, ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') ppr(scraper) tz = pytz.timezone("US/Central") @@ -65,7 +65,7 @@ def get_listings(pse, events): e['image'] = event.xpath('.//*/img/@data-src')[0] e["date_time"] = datetime.strptime(e['datetime'], DATETIME_FORMAT) e['scraper'] = scraper - e['calendar'] = scraper.calendar + e['calendar'] = [scraper.calendar] events.append(e) events = [] @@ -79,7 +79,6 @@ for cal in calendar_url: for event in events: try: new_event = Event.objects.update_or_create( - calendar = event['calendar'], scraper = event['scraper'], event_type = 'Mu', show_title = event["show_title"], @@ -89,6 +88,7 @@ for event in events: guests = " ".join(event["subtitle"]), venue = venue ) + digitools.add_calendar(new_event, 'msp') except Exception as e: print("oops ", e, "\n\n", "Scraper:", scraper) diff --git a/events/scrapers/Working/venues/MagersQuinn.py b/events/scrapers/Working/venues/MagersQuinn.py index 85023bf..006fc49 100644 --- a/events/scrapers/Working/venues/MagersQuinn.py +++ b/events/scrapers/Working/venues/MagersQuinn.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create( is_venue=False ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') DATETIME_FORMAT = '%A, %B %d , %Y %I:%M %p' DATETIME_FORMAT_2 = '%A, %B %d @ %I%p %Y' @@ -35,7 +35,7 @@ def get_events(ps, event_type): month = c.xpath('.//*/div[@class="month"]/text()')[0] year = c.xpath('.//*/div[@class="year"]/text()')[0] event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['title'] = c.xpath('.//*/h3/text()')[0] event['date'] = [month, day, year, c.xpath('.//*/p[@class="time"]/text()')[0]] event['date'] = " ".join(event['date']) @@ -45,7 +45,7 @@ def get_events(ps, event_type): scraper.items+=1 except Exception as e: event['link'] = "https://www.magersandquinn.com" + c.xpath('.//a[@class="event off-site"]/@href')[0] - print(e) + print("Error: ", e) ppr(event) digitools.createBasicEvent(event, "Ed", venue) print("\n\n+++\n\n") diff --git a/events/scrapers/Working/venues/MplsVFW.py b/events/scrapers/Working/venues/MplsVFW.py index 96fcef2..e1ce3be 100644 --- a/events/scrapers/Working/venues/MplsVFW.py +++ b/events/scrapers/Working/venues/MplsVFW.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -25,7 +25,7 @@ venue, created = Organization.objects.get_or_create( is_venue = True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start, virtcal = digitools.getScraper(venue, 'msp') tz = pytz.timezone("US/Central") @@ -44,7 +44,7 @@ else: quit() br.get(calendar_url) -sleep(30) +sleep(20) def getEvents(br): ps = html.fromstring(br.page_source) @@ -54,19 +54,19 @@ def getEvents(br): dateTime = event.xpath('.//*/span[@class="tribe-event-date-start"]/text()')[0].replace("•", "").strip() + " " + current_year title = event.xpath('.//*/h2[@class="alt-font"]/a/text()')[0].replace("\n", "").replace("\t", "") link = event.xpath('.//*/h2[@class="alt-font"]/a/@href')[0] - deets["tickets"] = event.xpath('.//*/span[@class="tribe-events-c-small-cta__price"]/strong/text()')[0] + # deets["tickets"] = event.xpath('.//*/span[@class="tribe-events-c-small-cta__price"]/strong/text()')[0] try: - new_event = Event.objects.update_or_create( - calendar = scraper.calendar, + new_event, created = Event.objects.update_or_create( scraper = scraper, event_type = 'Mu', show_title = title, show_link = link, show_date = datetime.strptime(dateTime, DATETIME_FORMAT), - show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(), - more_details = deets["tickets"], + show_day = datetime.strptime(dateTime, DATETIME_FORMAT), + # more_details = deets["tickets"], venue = venue ) + digitools.add_calendar(new_event, 'msp') scraper.items+=1 except Exception as e: print("oops", e) diff --git a/events/scrapers/Working/venues/ParkwayTheater.py b/events/scrapers/Working/venues/ParkwayTheater.py index a45c0dc..00bfc5b 100644 --- a/events/scrapers/Working/venues/ParkwayTheater.py +++ b/events/scrapers/Working/venues/ParkwayTheater.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -25,7 +25,7 @@ try: except Exception as e: venue = Organization.objects.get(name="Parkway Theater") -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start, virtcal = digitools.getScraper(venue, 'msp') tz = pytz.timezone("US/Central") @@ -38,7 +38,7 @@ def get_events(ps, event_type): for c,i in zip(contents,img_etc): try: event = {} - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['title'] = c.xpath('.//*/a[@class="summary-title-link"]/text()')[0] event['link'] = "https://theparkwaytheater.com" + c.xpath('.//*/a[@class="summary-title-link"]/@href')[0] event['date'] = c.xpath('.//div/div/time/text()')[0] + " " + c.xpath('.//*/span[@class="event-time-12hr"]/text()')[0].split("–")[0].strip() @@ -51,8 +51,7 @@ def get_events(ps, event_type): } try: - new_event = DSEvent.objects.update_or_create( - calendar = scraper.calendar, + new_event, created = DSEvent.objects.update_or_create( scraper = scraper, event_type = event_type, show_title = event['title'], @@ -62,13 +61,13 @@ def get_events(ps, event_type): more_details = event["details"], venue = venue ) + digitools.add_calendar(new_event, 'msp') scraper.items+=1 except Exception as e: try: event['date'] = c.xpath('.//div/div/time/text()')[0].split("–")[0] + " " + c.xpath('.//*/span[@class="event-time-12hr"]/text()')[0].split("–")[0].strip() event['dateStamp'] = datetime.strptime(event['date'], DATETIME_FORMAT) - new_event = DSEvent.objects.update_or_create( - calendar = scraper.calendar, + new_event, created = DSEvent.objects.update_or_create( scraper = scraper, event_type = event_type, show_title = event['title'], @@ -78,6 +77,7 @@ def get_events(ps, event_type): more_details = event["details"], venue = venue ) + digitools.add_calendar(new_event, 'msp') scraper.items+=1 except Exception as e: print(e) diff --git a/events/scrapers/Working/venues/SPCO.stp.py b/events/scrapers/Working/venues/SPCO.stp.py index 6b5732f..4e7d029 100644 --- a/events/scrapers/Working/venues/SPCO.stp.py +++ b/events/scrapers/Working/venues/SPCO.stp.py @@ -3,10 +3,9 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() - from time import sleep from pprint import pprint as ppr import pytz @@ -22,7 +21,7 @@ venue, created = Organization.objects.get_or_create( is_venue = False ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start, virtcal = digitools.getScraper(venue, 'msp') # Time Signatures tz = pytz.timezone("US/Central") @@ -38,7 +37,7 @@ def get_events(ps, event_type): subtitle = ps.xpath('.//*/article/h1/em/text()') event = {} event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] if len(subtitle) == 1: if len(ntitle) == 2: title = ntitle[0] + subtitle[0] + ntitle[1] diff --git a/events/scrapers/Working/venues/WhiteSquirrelScrape.py b/events/scrapers/Working/venues/WhiteSquirrelScrape.py index 34d49fe..5484591 100644 --- a/events/scrapers/Working/venues/WhiteSquirrelScrape.py +++ b/events/scrapers/Working/venues/WhiteSquirrelScrape.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -24,7 +24,7 @@ venue, created = Organization.objects.get_or_create( is_venue = True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start, virtcal = digitools.getScraper(venue, 'msp') # Set initial variables for City, etc @@ -42,11 +42,13 @@ else: quit() def get_listings(pse, events): - listings = pse.xpath('.//*/div[@class="tribe-common-g-row tribe-events-calendar-list__event-row"]') + listings = pse.xpath('.//*/li[@class="tribe-common-g-row tribe-events-calendar-list__event-row"]') + print("get listings", listings) for l in listings: event = {} event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] + print("1: ", event) try: event["image"] = l.xpath('.//*/img/@src')[0] except: diff --git a/events/scrapers/Working/venues/cedar.mpls.py b/events/scrapers/Working/venues/cedar.mpls.py index 28d1cee..0bb56f1 100644 --- a/events/scrapers/Working/venues/cedar.mpls.py +++ b/events/scrapers/Working/venues/cedar.mpls.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create( is_venue=True ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') tz = pytz.timezone("US/Central") @@ -39,7 +39,7 @@ def get_events(ps): pse = digitools.getSource(br, "https://www.thecedar.org" + l) event = {} event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['link'] = "https://www.thecedar.org" + l try: time = pse.xpath('.//*/time[@class="event-time-localized-start"]/text()')[0] diff --git a/events/scrapers/Working/venues/club331Scrape.py b/events/scrapers/Working/venues/club331Scrape.py index 47e1228..b08f18a 100644 --- a/events/scrapers/Working/venues/club331Scrape.py +++ b/events/scrapers/Working/venues/club331Scrape.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep @@ -24,7 +24,7 @@ venue, created = Organization.objects.get_or_create( is_venue=True, ) -scraper,item_count_start = digitools.getScraper(venue) +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp') tz = pytz.timezone("US/Central") @@ -88,7 +88,7 @@ for d in dates: event["bands"] = (", ").join(bands) if len(bands) > 0: event['scraper'] = scraper - event['calendar'] = scraper.calendar + event['calendars'] = [scraper.calendar] event['title'] = event["bands"] event['date'] = event["date_time"] event['dateStamp'] = event["date_time"] diff --git a/events/scrapers/Working/venues/manual/data.json b/events/scrapers/Working/venues/manual/data.json new file mode 100644 index 0000000..1fb8eca --- /dev/null +++ b/events/scrapers/Working/venues/manual/data.json @@ -0,0 +1,1295 @@ +[ + { + "link": "https://eventario.co/events/faltan-5-pa-las-doce-2/", + "title": "FALTAN 5 PA´ LAS DOCE", + "venue": "LA MECHA TEJO", + "venueLink": "https://eventario.co/places/la-mecha-tejo/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "29/11/25 2:00 PM" + ], + "location": "Llanogrande, Antioquia", + "address": "Vía Guarne - Llano Grande, 054048 Rionegro" + }, + { + "link": "https://eventario.co/events/deja-el-miedo-a-hablar-en-publico/", + "title": "Deja el miedo a hablar en público", + "venue": "Indie Universe Hotel & Coliving", + "venueLink": "https://eventario.co/places/indie-universe-hotel-coliving/", + "label": "Conferencias y Charlas", + "dateTime": [ + "29/11/25 7:00 PM", + "13/12/25 9:00 AM", + "14/12/25 9:00 AM", + "15/12/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Av. Nutibara #71-25, Laureles - Estadio" + }, + { + "link": "https://eventario.co/events/intercambio-de-idiomas-en-casa-almarita-%ef%b8%8f/", + "title": "Intercambio de Idiomas en Casa Almarita ️", + "venue": "Casa Almarita", + "venueLink": "https://eventario.co/places/casa-almarita/", + "label": "Intercambio de idiomas", + "dateTime": [ + "29/11/25 7:00 PM", + "6/12/25 7:00 PM", + "13/12/25 7:00 PM", + "20/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 48b 79-39, 050034 Medellín" + }, + { + "link": "https://eventario.co/events/alborada-tropical/", + "title": "Alborada Tropical", + "venue": "CANDELA Tropical Rooftop", + "venueLink": "https://eventario.co/places/candela-tropical-rooftop/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 6:00 PM" + ], + "location": "Bello, Antioquia", + "address": "Cra. 52 #33-34, Obrero" + }, + { + "link": "https://eventario.co/events/alboreo-en-naufrago/", + "title": "ALBOREO en Náufrago", + "venue": "Náufrago Bar", + "venueLink": "https://eventario.co/places/naufrago-bar/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 37 10a 29, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/alborada-2025/", + "title": "ALBORADA 2025", + "venue": "Hostal del Cielo Medellin", + "venueLink": "https://eventario.co/places/hostal-del-cielo-medellin/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 55 #127-46, San Javier La Loma" + }, + { + "link": "https://eventario.co/events/primer-aniversario/", + "title": "Primer Aniversario", + "venue": "Quereme", + "venueLink": "https://eventario.co/places/quereme/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 8:00 PM" + ], + "location": "Antioquia", + "address": "Cra. 11 #9a-35, Medellin" + }, + { + "link": "https://eventario.co/events/fieston-de-alborada-en-coyo-taco/", + "title": "Fiestón de Alborada en Coyo Taco", + "venue": "Coyo Taco", + "venueLink": "https://eventario.co/places/coyo-taco/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 10:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 35 8a-45, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/comunidades-de-bienestar-y-kids/", + "title": "Comunidades de Bienestar y Kids", + "venue": "Centro Comercial Los Molinos", + "venueLink": "https://eventario.co/places/centro-comercial-los-molinos/", + "label": "Familia y Niños", + "dateTime": [ + "1/12/25 9:00 AM", + "3/12/25 9:00 AM", + "8/12/25 9:00 AM", + "10/12/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 82 30a-46, 050026 Medellín" + }, + { + "link": "https://eventario.co/events/de-que-vas-a-vivir-miamor-yo-no-quiero-trabajar/", + "title": "¿De qué vas a vivir miamor? - Yo no quiero trabajar", + "venue": "La Pascasia", + "venueLink": "https://eventario.co/places/la-pascasia/", + "label": "Conferencias y Charlas", + "dateTime": [ + "1/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 47 43-88, 050016 Medellín" + }, + { + "link": "https://eventario.co/events/noche-de-juegos-game-night/", + "title": "Noche de juegos", + "venue": "Masaya Medellín", + "venueLink": "https://eventario.co/places/masaya-medellin/", + "label": "Juegos de Mesa", + "dateTime": [ + "1/12/25 8:00 PM", + "8/12/25 8:00 PM", + "15/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 8 #43a-89, El Poblado" + }, + { + "link": "https://eventario.co/events/gringo-tuesdays-language-exchange-medellin/", + "title": "Gringo Tuesdays Language Exchange Medellín", + "venue": "GringoTuesdays", + "venueLink": "https://eventario.co/organizadores/gringotuesdays/", + "label": "Intercambio de idiomas", + "dateTime": [ + "2/12/25 4:00 PM", + "9/12/25 4:00 PM", + "16/12/25 4:00 PM", + "23/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Teatro Victoria, Carrera 35" + }, + { + "link": "https://eventario.co/events/free-weekly-language-exchange-keeptalking/", + "title": "Free Weekly Language Exchange by KeepTalking", + "venue": "Barrio Sur Cafe Bar", + "venueLink": "https://eventario.co/places/barrio-sur-cafe-bar/", + "label": "Intercambio de idiomas", + "dateTime": [ + "2/12/25 7:00 PM", + "9/12/25 7:00 PM", + "16/12/25 7:00 PM", + "23/12/25 7:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Calle 30 Sur 43a 23, 055422 Envigado" + }, + { + "link": "https://eventario.co/events/open-magic/", + "title": "Open Magic", + "venue": "GABO Envigado", + "venueLink": "https://eventario.co/places/gabo-envigado/", + "label": "Feria y Salon", + "dateTime": [ + "3/12/25 12:00 PM", + "10/12/25 12:00 PM", + "17/12/25 12:00 PM", + "24/12/25 12:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Restaurante Gabo.mde Envigado, Calle 30 Sur" + }, + { + "link": "https://eventario.co/events/free-language-exchance/", + "title": "Free Language Exchance", + "venue": "Merli Rooftop", + "venueLink": "https://eventario.co/places/merli-rooftop/", + "label": "Intercambio de idiomas", + "dateTime": [ + "3/12/25 6:00 PM", + "10/12/25 6:00 PM", + "17/12/25 6:00 PM", + "24/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 43c 8 29, 050022 Medellín" + }, + { + "link": "https://eventario.co/events/regalos-con-proposito/", + "title": "REGALOS CON PROPÓSITO", + "venue": "Bodega Comfama", + "venueLink": "https://eventario.co/places/bodega-comfama/", + "label": "Familia y Niños", + "dateTime": [ + "5/12/25 11:00 AM", + "6/12/25 11:00 AM", + "7/12/25 11:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Bodega Recreación Comfama, Calle 62" + }, + { + "link": "https://eventario.co/events/antonieta-y-la-navidad/", + "title": "Antonieta y La Navidad", + "venue": "Teatro Manicomio de Muñecos", + "venueLink": "https://eventario.co/places/teatro-manicomio-de-munecos/", + "label": "Familia y Niños", + "dateTime": [ + "5/12/25 8:00 PM", + "6/12/25 5:00 PM", + "7/12/25 11:00 AM", + "12/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 32EE #82a26, Laureles - Estadio" + }, + { + "link": "https://eventario.co/events/comparsa-navidena/", + "title": "Comparsa Navideña", + "venue": "Centro Comercial Puerta del Norte", + "venueLink": "https://eventario.co/places/centro-comercial-puerta-del-norte/", + "label": "Familia y Niños", + "dateTime": [ + "7/12/25 4:00 PM" + ], + "location": "Bello, Antioquia", + "address": "Diagonal 55 #34-67, Bello" + }, + { + "link": "https://eventario.co/events/bazar-navideno-2025/", + "title": "BAZAR NAVIDEÑO 2025", + "venue": "Centro Comercial Monterrey", + "venueLink": "https://eventario.co/places/centro-comercial-monterrey/", + "label": "Mercado Artesanal", + "dateTime": [ + "9/12/25 9:00 AM", + "10/12/25 9:00 AM", + "11/12/25 9:00 AM", + "12/12/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 48 #10-45, El Poblado" + }, + { + "link": "https://eventario.co/events/parlin-en-la-montana/", + "title": "Parlín en la montaña", + "venue": "Centro Comercial Sandiego", + "venueLink": "https://eventario.co/places/centro-comercial-sandiego/", + "label": "Familia y Niños", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Calle 33 42b 06, 050016 Medellín" + }, + { + "link": "https://eventario.co/events/feria-de-oficios-recuperar-los-gestos-del-hacer/", + "title": "Feria de Oficios: Recuperar los Gestos del Hacer", + "venue": "Exploratorio", + "venueLink": "https://eventario.co/places/exploratorio/", + "label": "Feria y Salon", + "dateTime": [ + "13/12/25 10:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 73 #52-100 #52- a, Aranjuez" + }, + { + "link": "https://eventario.co/events/fiesta-de-cuadra-el-traido/", + "title": "Fiesta de Cuadra 'El Traído'", + "venue": "Centauro Centro de Eventos", + "venueLink": "https://eventario.co/places/centauro-centro-de-eventos/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "13/12/25 4:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Calle 49 #37 sur 130, Zona 1" + }, + { + "link": "https://eventario.co/events/guaro-a-dos-manos/", + "title": "GUARO A DOS MANOS", + "venue": "Mamasita Medallo", + "venueLink": "https://eventario.co/places/mamasita-medallo/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "13/12/25 8:00 PM" + ], + "location": "Antioquia", + "address": "Cra 43D #10 - 77, El Poblado" + }, + { + "link": "https://eventario.co/events/faltan-5-pa-las-12/", + "title": "FALTAN 5 PA' LAS 12", + "venue": "Centro Comercial Sandiego", + "venueLink": "https://eventario.co/places/centro-comercial-sandiego/", + "label": "Feria y Salon", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Calle 33 42b 06, 050016 Medellín" + }, + { + "link": "https://eventario.co/events/para-no-olvidar-recap-noticias-2025/", + "title": "Para no olvidar recap noticias 2025", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Conferencias y Charlas", + "dateTime": [ + "19/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/happy-new-waves/", + "title": "Happy New Waves", + "venue": "La Deriva Rooftop", + "venueLink": "https://eventario.co/places/la-deriva-rooftop/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 10b 37-29, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/san-silvestre-2025/", + "title": "San Silvestre 2025", + "venue": "Terraza Municipal", + "venueLink": "https://eventario.co/places/terraza-municipal/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 7:00 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Cl. 24, Getsemaní" + }, + { + "link": "https://eventario.co/events/the-rite-of-candles/", + "title": "THE RITE OF CANDLES", + "venue": "Sabine Bistró & Lounge", + "venueLink": "https://eventario.co/places/sabine-bistro-lounge/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 7:30 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Cra. 11 #39-21, San Diego" + }, + { + "link": "https://eventario.co/events/abonanza-naufrago/", + "title": "Abonanza - Náufrago", + "venue": "Náufrago Bar", + "venueLink": "https://eventario.co/places/naufrago-bar/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 37 10a 29, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/hello-2026-lets-shine/", + "title": "HELLO 2026 LET'S SHINE!", + "venue": "Townhouse Cartagena", + "venueLink": "https://eventario.co/places/townhouse-cartagena/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 9:00 PM" + ], + "location": "San José De La Montaña, Antioquia", + "address": "Cra. 7 #36-88, San Diego" + }, + { + "link": "https://eventario.co/events/expofitness-lifestyle-2026/", + "title": "Expofitness Lifestyle 2026", + "venue": "Plaza mayor", + "venueLink": "https://eventario.co/places/plaza-mayor/", + "label": "Feria y Salon", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Cra. 57 #41-81, La Candelaria" + }, + { + "link": "https://eventario.co/events/planeta-salvaje-v10/", + "title": "PLANETA SALVAJE V10", + "venue": "Locación Secreta 7", + "venueLink": "https://eventario.co/places/locacion-secreta-7/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 3:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 36 55-62, 050013 Medellín" + }, + { + "link": "https://eventario.co/events/calentamiento-decembrino/", + "title": "Calentamiento decembrino", + "venue": "MAMM Museo de Arte Moderno de Medellín", + "venueLink": "https://eventario.co/places/museo-de-arte-moderno-de-medellin/", + "label": "Concierto", + "dateTime": [ + "29/11/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Museo de Arte Moderno Sede Ciudad del Río, Carrera 44 #19A-100" + }, + { + "link": "https://eventario.co/events/la-eterna-gozaderia/", + "title": "La Eterna Gozaderia", + "venue": "Club Unión Medellín", + "venueLink": "https://eventario.co/places/club-union-medellin/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 43a 1-50, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/afrodicto-2/", + "title": "AFRODICTO", + "venue": "Afrodisia", + "venueLink": "https://eventario.co/places/afrodisia/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 37 8a-79, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/m-i-t-a/", + "title": "M.I.T.A.", + "venue": "Sonorama", + "venueLink": "https://eventario.co/places/sonorama/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 37 #10-37, El Poblado" + }, + { + "link": "https://eventario.co/events/tropikal-beat/", + "title": "TROPIKAL BEAT", + "venue": "Eminence", + "venueLink": "https://eventario.co/places/eminence/", + "label": "Concierto", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 25 43g-25, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/10-anos-la-ciudad-maldita/", + "title": "10 AÑOS ANIVERSARIO LA CIUDAD MALDITA", + "venue": "El Callejón", + "venueLink": "https://eventario.co/places/el-callejon/", + "label": "Concierto", + "dateTime": [ + "6/12/25 8:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Cra. 42 #39 Sur-6, Zona 7" + }, + { + "link": "https://eventario.co/events/medallo-rumba-fest-2025/", + "title": "Medallo Rumba Fest 2025", + "venue": "Aeroparque Juan Pablo II", + "venueLink": "https://eventario.co/places/aeroparque-juan-pablo-ii/", + "label": "Festival", + "dateTime": [ + "29/11/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Aeroparque Juan Pablo II, Carrera 70" + }, + { + "link": "https://eventario.co/events/mas-mujeres-musicas-fest-2025/", + "title": "Más Mujeres Músicas Fest 2025", + "venue": "Museo Casa de la Memoria", + "venueLink": "https://eventario.co/places/museo-casa-de-la-memoria/", + "label": "Festival", + "dateTime": [ + "29/11/25 2:00 PM" + ], + "location": "n/a", + "address": [] + }, + { + "link": "https://eventario.co/events/made-in-medellin/", + "title": "Made In Medellín", + "venue": "Estadio Atanasio Girardot", + "venueLink": "https://eventario.co/places/estadio-atanasio-girardot/", + "label": "Concierto", + "dateTime": [ + "29/11/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 70 48-373, 050034 Medellín" + }, + { + "link": "https://eventario.co/events/predecembrina-rock-en-espanol/", + "title": "PreDecembrina & Rock en Español", + "venue": "Café Cliché", + "venueLink": "https://eventario.co/places/cafe-cliche/", + "label": "Concierto", + "dateTime": [ + "29/11/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 77 #39B 45, Laureles - Estadio" + }, + { + "link": "https://eventario.co/events/salsa-underground-vol-6/", + "title": "Salsa Underground Vol 6.", + "venue": "TIBIRI BAR", + "venueLink": "https://eventario.co/places/tibiri-bar/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "El Tíbiri, Avenida San Juan" + }, + { + "link": "https://eventario.co/events/noche-de-karaoke/", + "title": "Noche de Karaoke", + "venue": "Casa Cultural La Trilla", + "venueLink": "https://eventario.co/places/casa-cultural-la-trilla/", + "label": "Karaoké", + "dateTime": [ + "29/11/25 9:30 PM", + "6/12/25 9:30 PM", + "13/12/25 9:30 PM", + "20/12/25 9:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 44a 73-60, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/francis-mercier-soley/", + "title": "FRANCIS MERCIER- SOLÈY", + "venue": "Orquideorama", + "venueLink": "https://eventario.co/places/orquideorama/", + "label": "Festival", + "dateTime": [ + "30/11/25 11:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 41 #40A-26, Aranjuez" + }, + { + "link": "https://eventario.co/events/la-previa-de-la-alborada/", + "title": "LA PREVIA DE LA ALBORADA", + "venue": "OCCA", + "venueLink": "https://eventario.co/places/occa/", + "label": "Concierto", + "dateTime": [ + "30/11/25 3:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 20 Sur 27-55, 050022 Medellín" + }, + { + "link": "https://eventario.co/events/domingos-de-los-60s-en-badalona-bar/", + "title": "Domingos de los 60's en Badalona Bar", + "venue": "Badalona Café Bar", + "venueLink": "https://eventario.co/places/badalona-cafe-bar/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "30/11/25 4:00 PM", + "7/12/25 4:00 PM", + "14/12/25 4:00 PM", + "21/12/25 4:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Transversal 32a Sur 31d 19, 055422 Envigado" + }, + { + "link": "https://eventario.co/events/tardeo-chill-en-el-rooftop/", + "title": "¡Tardeo Chill en el rooftop!", + "venue": "Masaya Medellín", + "venueLink": "https://eventario.co/places/masaya-medellin/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "30/11/25 4:00 PM", + "7/12/25 4:00 PM", + "14/12/25 4:00 PM", + "21/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 8 43a-89, 050022 Medellín" + }, + { + "link": "https://eventario.co/events/franky-wah/", + "title": "Franky Wah", + "venue": "Orquideorama", + "venueLink": "https://eventario.co/places/orquideorama/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "30/11/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 41 #40A-26, Aranjuez" + }, + { + "link": "https://eventario.co/events/karaoke-night-en-bololoi-masaya/", + "title": "Karaoké Night en Bololoi, Masaya!", + "venue": "Masaya Medellín", + "venueLink": "https://eventario.co/places/masaya-medellin/", + "label": "Karaoké", + "dateTime": [ + "30/11/25 8:00 PM", + "7/12/25 8:00 PM", + "14/12/25 8:00 PM", + "21/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 8 #43a-89, El Poblado" + }, + { + "link": "https://eventario.co/events/lunes-de-salsa/", + "title": "LUNES DE SALSA", + "venue": "la buyeson", + "venueLink": "https://eventario.co/organizadores/la-buyeson/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "1/12/25 8:00 PM", + "8/12/25 8:00 PM", + "15/12/25 8:00 PM", + "22/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Socialtel Medellin, Carrera 32d" + }, + { + "link": "https://eventario.co/events/tardes-en%c2%b7cantadas/", + "title": "Tardes En·Cantadas", + "venue": "El Solar del Águila", + "venueLink": "https://eventario.co/places/el-solar-del-aguila/", + "label": "Concierto", + "dateTime": [ + "3/12/25 4:00 PM", + "10/12/25 4:00 PM", + "17/12/25 4:00 PM", + "24/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 59 45d-1, 050012 Medellín" + }, + { + "link": "https://eventario.co/events/noche-de-karaoke-en-bolero-bar/", + "title": "Noche de Karaoke en Bolero Bar", + "venue": "Bolero Bar Medellin", + "venueLink": "https://eventario.co/places/bolero-bar-medellin/", + "label": "Karaoké", + "dateTime": [ + "3/12/25 8:00 PM", + "10/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 67B #51a-98, Laureles - Estadio" + }, + { + "link": "https://eventario.co/events/jueves-de-tbt-en-la-mecha/", + "title": "JUEVES DE TBT EN LA MECHA", + "venue": "LA MECHA TEJO", + "venueLink": "https://eventario.co/places/la-mecha-tejo/", + "label": "Karaoké", + "dateTime": [ + "4/12/25 12:00 PM", + "11/12/25 12:00 PM", + "18/12/25 12:00 PM", + "25/12/25 12:00 PM" + ], + "location": "Guarne, Antioquia", + "address": "Vía Guarne - Llano Grande, 054048 Rionegro" + }, + { + "link": "https://eventario.co/events/concierto-de-navidad/", + "title": "CONCIERTO DE NAVIDAD", + "venue": "Volver Siempre Volver", + "venueLink": "https://eventario.co/places/volver-siempre-volver/", + "label": "Concierto", + "dateTime": [ + "4/12/25 5:30 PM" + ], + "location": "Envigado, Antioquia", + "address": "Vía al aeropuerto, Av. Las Palmas" + }, + { + "link": "https://eventario.co/events/dj-set-y-vinilos/", + "title": "Dj Set y Vinilos", + "venue": "Víbora Sound System", + "venueLink": "https://eventario.co/places/vibora-sound-system/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 6:00 PM", + "4/12/25 6:00 PM", + "5/12/25 6:00 PM", + "6/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 10a 37-64, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/rhythm-dough/", + "title": "Rhythm dough", + "venue": "Sandra Jaramillo", + "venueLink": "https://eventario.co/organizadores/sandra-jaramillo/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "4/12/25 7:00 PM", + "11/12/25 7:00 PM", + "18/12/25 7:00 PM", + "25/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Rama Sound Garden, Carrera 48" + }, + { + "link": "https://eventario.co/events/cuentos-de-hilo-con-natalia-ramirez/", + "title": "Cuentos de hilo con Natalia Ramírez", + "venue": "VIVAPALABRA", + "venueLink": "https://eventario.co/places/vivapalabra/", + "label": "Cultura", + "dateTime": [ + "29/11/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 55 #43-63, La Candelaria" + }, + { + "link": "https://eventario.co/events/la-gringada-de-sefora/", + "title": "La gringada de Séfora", + "venue": "VIVAPALABRA", + "venueLink": "https://eventario.co/places/vivapalabra/", + "label": "Cultura", + "dateTime": [ + "29/11/25 7:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 55 #43-63, La Candelaria" + }, + { + "link": "https://eventario.co/events/social-de-salsa/", + "title": "SOCIAL DE SALSA", + "venue": "Posada León", + "venueLink": "https://eventario.co/places/posada-leon/", + "label": "Baile", + "dateTime": [ + "3/12/25 7:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Posada León, Carrera 35" + }, + { + "link": "https://eventario.co/events/el-show-de-rudolf-medellin-y-la-luz-del-corazon/", + "title": "EL SHOW DE RUDOLF, Medellín y la luz del corazón", + "venue": "Teatro el Tesoro", + "venueLink": "https://eventario.co/places/teatro-el-tesoro/", + "label": "Cultura", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Teatro El Tesoro, Carrera 25a" + }, + { + "link": "https://eventario.co/events/raspa-las-4-fiestas/", + "title": "Raspa las 4 FIESTAS", + "venue": "La Chula Cartagena", + "venueLink": "https://eventario.co/places/la-chula-cartagena/", + "label": "Cultura", + "dateTime": [ + "29/11/25 9:00 AM" + ], + "location": "Cartagena, Bolivar", + "address": "Av. Escallon, Dg. 35 #34-63" + }, + { + "link": "https://eventario.co/events/tour-centro-de-francia-a-medellin/", + "title": "Tour Centro - De Francia a Medellín", + "venue": "Alianza Francesa Medellín", + "venueLink": "https://eventario.co/places/alianza-francesa-medellin/", + "label": "Cultura", + "dateTime": [ + "29/11/25 10:00 AM" + ], + "location": "n/a", + "address": "Edificio Porvenir, Av El Poblado" + }, + { + "link": "https://eventario.co/events/recorrido-comentado-mamm/", + "title": "Recorrido comentado con Mediadores MAMM", + "venue": "MAMM Museo de Arte Moderno de Medellín", + "venueLink": "https://eventario.co/places/museo-de-arte-moderno-de-medellin/", + "label": "Cultura", + "dateTime": [ + "29/11/25 3:00 PM", + "6/12/25 3:00 PM", + "13/12/25 3:00 PM", + "20/12/25 3:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Museo de Arte Moderno Sede Ciudad del Río, Carrera 44 #19A-100" + }, + { + "link": "https://eventario.co/events/la-comedy-surprise/", + "title": "La Comedy Surprise", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "29/11/25 7:00 PM", + "6/12/25 7:00 PM", + "13/12/25 7:00 PM", + "20/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/la-masa-moya-con-leche-y-panela/", + "title": "LA MASA MOYA CON LECHE Y PANELA", + "venue": "Boom stand-up", + "venueLink": "https://eventario.co/places/boom-stand-up/", + "label": "Comedia y Stand Up", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 26 #43g-30, El Poblado" + }, + { + "link": "https://eventario.co/events/ii-taller-de-fotografia-percepcion-visual/", + "title": "II Taller de Fotografía: Percepción Visual", + "venue": "Centro de Formacion de la Cooperacion Española", + "venueLink": "https://eventario.co/places/centro-de-formacion-de-la-cooperacion-espanola/", + "label": "Cultura", + "dateTime": [ + "30/11/25 9:00 AM" + ], + "location": "Cartagena, Bolivar", + "address": "Cl. 36 #2-74, El Centro" + }, + { + "link": "https://eventario.co/events/en-el-barrio/", + "title": "EN EL BARRIO", + "venue": "Centro Cultural Caribe", + "venueLink": "https://eventario.co/places/centro-cultural-caribe/", + "label": "Cultura", + "dateTime": [ + "30/11/25 2:00 PM" + ], + "location": "Itagui, Antioquia", + "address": "Cra. 50 #52-77, Villa Paula" + }, + { + "link": "https://eventario.co/events/navidad-en-espiral/", + "title": "Navidad en espiral", + "venue": "Teatro Metropolitano José Gutiérrez Gómez", + "venueLink": "https://eventario.co/places/teatro-metropolitano-jose-gutierrez-gomez/", + "label": "Cultura", + "dateTime": [ + "30/11/25 5:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 41 #57-30, La Candelaria" + }, + { + "link": "https://eventario.co/events/los-dioses-de-la-impro/", + "title": "Los Dioses de la impro", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "30/11/25 7:00 PM", + "7/12/25 7:00 PM", + "14/12/25 7:00 PM", + "21/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/el-tribunal-de-los-necios/", + "title": "El tribunal de los necios", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "30/11/25 7:00 PM", + "7/12/25 7:00 PM", + "14/12/25 7:00 PM", + "21/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/language-exchange%f0%9f%8c%8e%f0%9f%8c%bb/", + "title": "LANGUAGE EXCHANGE????????", + "venue": "Floras black coffee", + "venueLink": "https://eventario.co/places/floras-black-coffee/", + "label": "Cultura", + "dateTime": [ + "30/11/25 7:30 PM", + "1/12/25 7:30 PM", + "3/12/25 7:30 PM", + "7/12/25 7:30 PM" + ], + "location": "Antioquia", + "address": "Cra. 48 #7-282, El Poblado" + }, + { + "link": "https://eventario.co/events/lunes-noche-bachatera/", + "title": "Lunes Noche Bachatera", + "venue": "Blood Dance Company", + "venueLink": "https://eventario.co/places/blood-dance-company/", + "label": "Baile", + "dateTime": [ + "1/12/25 8:30 PM", + "8/12/25 8:30 PM", + "15/12/25 8:30 PM", + "22/12/25 8:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 81 36-44, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/kriminales-open-mic/", + "title": "Kriminales Open Mic", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "2/12/25 7:00 PM", + "9/12/25 7:00 PM", + "16/12/25 7:00 PM", + "23/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/colombian-music-night-2/", + "title": "COLOMBIAN MUSIC NIGHT", + "venue": "Milo Borja", + "venueLink": "https://eventario.co/organizadores/milo-borja/", + "label": "Baile", + "dateTime": [ + "2/12/25 8:00 PM", + "9/12/25 8:00 PM", + "16/12/25 8:00 PM", + "23/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "La República Restaurante Bar, Calle 10" + }, + { + "link": "https://eventario.co/events/el-caballero-y-su-escudero-al-rescate-de-la-ortografia/", + "title": "El Caballero y su Escudero al rescate de la Ortografía", + "venue": "Auditorio Monseñor Nelson Sierra Pérez", + "venueLink": "https://eventario.co/places/auditorio-monsenor-nelson-sierra-perez/", + "label": "Cultura", + "dateTime": [ + "3/12/25 3:50 PM" + ], + "location": "Envigado, Antioquia", + "address": "Cl 38A Sur #45a-80, Zona 8" + }, + { + "link": "https://eventario.co/events/clases-de-porro/", + "title": "CLASES DE PORRO", + "venue": "Centro Comercial Terminal Sur", + "venueLink": "https://eventario.co/places/centro-comercial-terminal-sur/", + "label": "Baile", + "dateTime": [ + "3/12/25 6:30 PM", + "10/12/25 6:30 PM", + "17/12/25 6:30 PM", + "24/12/25 6:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 65 8b 91, 050024 Medellín" + }, + { + "link": "https://eventario.co/events/noches-de-impro/", + "title": "Noches de Impro", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "3/12/25 7:00 PM", + "10/12/25 7:00 PM", + "17/12/25 7:00 PM", + "24/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/club-de-pintura-sensibilizacion-al-arte/", + "title": "Club de pintura - sensibilización al arte", + "venue": "Casa Cultural La Trilla", + "venueLink": "https://eventario.co/places/casa-cultural-la-trilla/", + "label": "Cultura", + "dateTime": [ + "3/12/25 7:00 PM", + "10/12/25 7:00 PM", + "17/12/25 7:00 PM", + "24/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 44a 73-60, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/miercoles-secretos/", + "title": "MIERCOLES SECRETOS", + "venue": "La Casa De Ruby", + "venueLink": "https://eventario.co/places/la-casa-de-ruby/", + "label": "Baile", + "dateTime": [ + "3/12/25 8:30 PM", + "10/12/25 8:30 PM", + "17/12/25 8:30 PM", + "24/12/25 8:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 10 33-21, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/toma-tu-tomate-2/", + "title": "Toma tu Tomate", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "3/12/25 9:00 PM", + "10/12/25 9:00 PM", + "17/12/25 9:00 PM", + "24/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/actividad-de-pintura-y-vino-%f0%9f%8e%a8%f0%9f%96%8c%ef%b8%8f%f0%9f%8d%b7/", + "title": "Actividad De Pintura Y Vino ????????️????", + "venue": "Floras black coffee", + "venueLink": "https://eventario.co/places/floras-black-coffee/", + "label": "Cultura", + "dateTime": [ + "29/11/25 4:00 PM", + "2/12/25 4:00 PM", + "4/12/25 4:00 PM", + "6/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Flora's Black Coffee, Mall las vegas TERRAZA - ROOFTOP" + }, + { + "link": "https://eventario.co/events/a-tomarse-una-pola-con-los-parceros/", + "title": "A tomarse una Pola con los Parceros", + "venue": "La Cellar Club", + "venueLink": "https://eventario.co/places/la-cellar-club/", + "label": "Baile", + "dateTime": [ + "4/12/25 6:00 PM", + "11/12/25 6:00 PM", + "18/12/25 6:00 PM", + "25/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 27 43f 79, 050021 Medellín" + }, + { + "link": "https://eventario.co/events/joyas-colombianas-dinner-show/", + "title": "Joyas Colombianas Dinner & Show", + "venue": "Restaurante Marmoleo", + "venueLink": "https://eventario.co/places/restaurante-marmoleo/", + "label": "Cultura", + "dateTime": [ + "4/12/25 7:00 PM", + "11/12/25 7:00 PM", + "18/12/25 7:00 PM", + "25/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 11 #9a Sur-180, Medellín" + }, + { + "link": "https://eventario.co/events/reinas-de-la-comedia/", + "title": "Reinas de la Comedia", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "4/12/25 7:00 PM", + "11/12/25 7:00 PM", + "18/12/25 7:00 PM", + "25/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/el-parche-del-chicharron/", + "title": "EL PARCHE DEL CHICHARRON", + "venue": "Centauro Centro de Eventos", + "venueLink": "https://eventario.co/places/centauro-centro-de-eventos/", + "label": "Cultura", + "dateTime": [], + "location": "Envigado, Antioquia", + "address": "Calle 49 #37 sur 130, Zona 1" + }, + { + "link": "https://eventario.co/events/bestias-de-la-comedia-medellin/", + "title": "Bestias de la Comedia - Medellín", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "5/12/25 7:00 PM", + "12/12/25 7:00 PM", + "19/12/25 7:00 PM", + "26/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/salsa-fever/", + "title": "SALSA FEVER", + "venue": "Blood Dance Company", + "venueLink": "https://eventario.co/places/blood-dance-company/", + "label": "Baile", + "dateTime": [ + "5/12/25 8:30 PM", + "12/12/25 8:30 PM", + "19/12/25 8:30 PM", + "26/12/25 8:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 81 36-44, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/humor-etilico-drink-cast/", + "title": "Humor Etílico, Drink-Cast", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "5/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/terapia-de-choque-medellin/", + "title": "Terapia de Choque - Medellín", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "5/12/25 9:00 PM", + "12/12/25 9:00 PM", + "19/12/25 9:00 PM", + "26/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles" + }, + { + "link": "https://eventario.co/events/un-show-de-medio-pelo/", + "title": "Un show de medio pelo", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "12/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/feria-de-oficios/", + "title": "Feria de Oficios", + "venue": "Parque Explora", + "venueLink": "https://eventario.co/places/parque-explora/", + "label": "Cultura", + "dateTime": [ + "13/12/25 10:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 53 73 75, 050010 Medellín" + }, + { + "link": "https://eventario.co/events/todo-sobre-ruedas/", + "title": "Todo sobre ruedas", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "13/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín" + }, + { + "link": "https://eventario.co/events/free-comedy-fest-medallo/", + "title": "FREE COMEDY FEST MEDALLO", + "venue": "Teatro Universidad de Medellín", + "venueLink": "https://eventario.co/places/teatro-universidad-de-medellin/", + "label": "Comedia y Stand Up", + "dateTime": [ + "17/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 87 #30-65, Medellín" + }, + { + "link": "https://eventario.co/events/navidad-en-andres/", + "title": "Navidad en Andrés", + "venue": "Andrés Carne de Res Cartagena", + "venueLink": "https://eventario.co/places/andres-carne-de-res-cartagena/", + "label": "Cultura", + "dateTime": [ + "24/12/25 7:00 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Carrera 11, Cl. de la Serrezuela #39 - 21" + }, + { + "link": "https://eventario.co/events/gran-cena-de-san-silvestre/", + "title": "Gran Cena de San Silvestre", + "venue": "Hotel Las Américas Cartagena", + "venueLink": "https://eventario.co/places/hotel-las-americas-cartagena/", + "label": "Cultura", + "dateTime": [ + "31/12/25 6:00 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Anillo Vial, Sector" + }, + { + "link": "https://eventario.co/events/probando-probando-finura/", + "title": "Probando Probando Finura", + "venue": "Teatro el Tesoro", + "venueLink": "https://eventario.co/places/teatro-el-tesoro/", + "label": "Comedia y Stand Up", + "dateTime": [ + "7/02/26 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 25a #1A Sur - 45, El Poblado" + }, + { + "link": "https://eventario.co/events/medellin-street-art-festival/", + "title": "Medellín Street Art Festival", + "venue": "Medellín Street Art Festival", + "venueLink": "https://eventario.co/places/medellin-street-art-festival/", + "label": "Cultura", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Street Art Colombia, Calle 10b" + }, + { + "link": "https://eventario.co/events/maridaje-sabor-y-fiesta-2025/", + "title": "MARIDAJE SABOR Y FIESTA 2025", + "venue": "Plaza mayor", + "venueLink": "https://eventario.co/places/plaza-mayor/", + "label": "Cultura", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Cra. 57 #41-81, La Candelaria" + } +] \ No newline at end of file diff --git a/events/scrapers/Working/venues/manual/data.updated.json b/events/scrapers/Working/venues/manual/data.updated.json new file mode 100644 index 0000000..f2904c6 --- /dev/null +++ b/events/scrapers/Working/venues/manual/data.updated.json @@ -0,0 +1,1471 @@ +[ + { + "link": "https://eventario.co/events/faltan-5-pa-las-doce-2/", + "title": "FALTAN 5 PA´ LAS DOCE", + "venue": "LA MECHA TEJO", + "venueLink": "https://eventario.co/places/la-mecha-tejo/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "29/11/25 2:00 PM" + ], + "location": "Llanogrande, Antioquia", + "address": "Vía Guarne - Llano Grande, 054048 Rionegro", + "category": "Mu", + "city": "Llanogrande" + }, + { + "link": "https://eventario.co/events/deja-el-miedo-a-hablar-en-publico/", + "title": "Deja el miedo a hablar en público", + "venue": "Indie Universe Hotel & Coliving", + "venueLink": "https://eventario.co/places/indie-universe-hotel-coliving/", + "label": "Conferencias y Charlas", + "dateTime": [ + "29/11/25 7:00 PM", + "13/12/25 9:00 AM", + "14/12/25 9:00 AM", + "15/12/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Av. Nutibara #71-25, Laureles - Estadio", + "category": "Ed", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/intercambio-de-idiomas-en-casa-almarita-%ef%b8%8f/", + "title": "Intercambio de Idiomas en Casa Almarita ️", + "venue": "Casa Almarita", + "venueLink": "https://eventario.co/places/casa-almarita/", + "label": "Intercambio de idiomas", + "dateTime": [ + "29/11/25 7:00 PM", + "6/12/25 7:00 PM", + "13/12/25 7:00 PM", + "20/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 48b 79-39, 050034 Medellín", + "category": "Ed", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/alborada-tropical/", + "title": "Alborada Tropical", + "venue": "CANDELA Tropical Rooftop", + "venueLink": "https://eventario.co/places/candela-tropical-rooftop/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 6:00 PM" + ], + "location": "Bello, Antioquia", + "address": "Cra. 52 #33-34, Obrero", + "category": "Mu", + "city": "Bello" + }, + { + "link": "https://eventario.co/events/alboreo-en-naufrago/", + "title": "ALBOREO en Náufrago", + "venue": "Náufrago Bar", + "venueLink": "https://eventario.co/places/naufrago-bar/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 37 10a 29, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/alborada-2025/", + "title": "ALBORADA 2025", + "venue": "Hostal del Cielo Medellin", + "venueLink": "https://eventario.co/places/hostal-del-cielo-medellin/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 55 #127-46, San Javier La Loma", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/primer-aniversario/", + "title": "Primer Aniversario", + "venue": "Quereme", + "venueLink": "https://eventario.co/places/quereme/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 8:00 PM" + ], + "location": "Antioquia", + "address": "Cra. 11 #9a-35, Medellin", + "category": "Mu", + "city": "Antioquia" + }, + { + "link": "https://eventario.co/events/fieston-de-alborada-en-coyo-taco/", + "title": "Fiestón de Alborada en Coyo Taco", + "venue": "Coyo Taco", + "venueLink": "https://eventario.co/places/coyo-taco/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "30/11/25 10:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 35 8a-45, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/comunidades-de-bienestar-y-kids/", + "title": "Comunidades de Bienestar y Kids", + "venue": "Centro Comercial Los Molinos", + "venueLink": "https://eventario.co/places/centro-comercial-los-molinos/", + "label": "Familia y Niños", + "dateTime": [ + "1/12/25 9:00 AM", + "3/12/25 9:00 AM", + "8/12/25 9:00 AM", + "10/12/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 82 30a-46, 050026 Medellín", + "category": "Ot", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/de-que-vas-a-vivir-miamor-yo-no-quiero-trabajar/", + "title": "¿De qué vas a vivir miamor? - Yo no quiero trabajar", + "venue": "La Pascasia", + "venueLink": "https://eventario.co/places/la-pascasia/", + "label": "Conferencias y Charlas", + "dateTime": [ + "1/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 47 43-88, 050016 Medellín", + "category": "Ed", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/noche-de-juegos-game-night/", + "title": "Noche de juegos", + "venue": "Masaya Medellín", + "venueLink": "https://eventario.co/places/masaya-medellin/", + "label": "Juegos de Mesa", + "dateTime": [ + "1/12/25 8:00 PM", + "8/12/25 8:00 PM", + "15/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 8 #43a-89, El Poblado", + "category": "Ot", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/gringo-tuesdays-language-exchange-medellin/", + "title": "Gringo Tuesdays Language Exchange Medellín", + "venue": "GringoTuesdays", + "venueLink": "https://eventario.co/organizadores/gringotuesdays/", + "label": "Intercambio de idiomas", + "dateTime": [ + "2/12/25 4:00 PM", + "9/12/25 4:00 PM", + "16/12/25 4:00 PM", + "23/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Teatro Victoria, Carrera 35", + "category": "Ed", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/free-weekly-language-exchange-keeptalking/", + "title": "Free Weekly Language Exchange by KeepTalking", + "venue": "Barrio Sur Cafe Bar", + "venueLink": "https://eventario.co/places/barrio-sur-cafe-bar/", + "label": "Intercambio de idiomas", + "dateTime": [ + "2/12/25 7:00 PM", + "9/12/25 7:00 PM", + "16/12/25 7:00 PM", + "23/12/25 7:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Calle 30 Sur 43a 23, 055422 Envigado", + "category": "Ed", + "city": "Envigado" + }, + { + "link": "https://eventario.co/events/open-magic/", + "title": "Open Magic", + "venue": "GABO Envigado", + "venueLink": "https://eventario.co/places/gabo-envigado/", + "label": "Feria y Salon", + "dateTime": [ + "3/12/25 12:00 PM", + "10/12/25 12:00 PM", + "17/12/25 12:00 PM", + "24/12/25 12:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Restaurante Gabo.mde Envigado, Calle 30 Sur", + "category": "Ot", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/free-language-exchance/", + "title": "Free Language Exchance", + "venue": "Merli Rooftop", + "venueLink": "https://eventario.co/places/merli-rooftop/", + "label": "Intercambio de idiomas", + "dateTime": [ + "3/12/25 6:00 PM", + "10/12/25 6:00 PM", + "17/12/25 6:00 PM", + "24/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 43c 8 29, 050022 Medellín", + "category": "Ed", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/regalos-con-proposito/", + "title": "REGALOS CON PROPÓSITO", + "venue": "Bodega Comfama", + "venueLink": "https://eventario.co/places/bodega-comfama/", + "label": "Familia y Niños", + "dateTime": [ + "5/12/25 11:00 AM", + "6/12/25 11:00 AM", + "7/12/25 11:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Bodega Recreación Comfama, Calle 62", + "category": "Ot", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/antonieta-y-la-navidad/", + "title": "Antonieta y La Navidad", + "venue": "Teatro Manicomio de Muñecos", + "venueLink": "https://eventario.co/places/teatro-manicomio-de-munecos/", + "label": "Familia y Niños", + "dateTime": [ + "5/12/25 8:00 PM", + "6/12/25 5:00 PM", + "7/12/25 11:00 AM", + "12/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 32EE #82a26, Laureles - Estadio", + "category": "Ot", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/comparsa-navidena/", + "title": "Comparsa Navideña", + "venue": "Centro Comercial Puerta del Norte", + "venueLink": "https://eventario.co/places/centro-comercial-puerta-del-norte/", + "label": "Familia y Niños", + "dateTime": [ + "7/12/25 4:00 PM" + ], + "location": "Bello, Antioquia", + "address": "Diagonal 55 #34-67, Bello", + "category": "Ot", + "city": "Bello" + }, + { + "link": "https://eventario.co/events/bazar-navideno-2025/", + "title": "BAZAR NAVIDEÑO 2025", + "venue": "Centro Comercial Monterrey", + "venueLink": "https://eventario.co/places/centro-comercial-monterrey/", + "label": "Mercado Artesanal", + "dateTime": [ + "9/12/25 9:00 AM", + "10/12/25 9:00 AM", + "11/12/25 9:00 AM", + "12/12/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 48 #10-45, El Poblado", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/parlin-en-la-montana/", + "title": "Parlín en la montaña", + "venue": "Centro Comercial Sandiego", + "venueLink": "https://eventario.co/places/centro-comercial-sandiego/", + "label": "Familia y Niños", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Calle 33 42b 06, 050016 Medellín" + }, + { + "link": "https://eventario.co/events/feria-de-oficios-recuperar-los-gestos-del-hacer/", + "title": "Feria de Oficios: Recuperar los Gestos del Hacer", + "venue": "Exploratorio", + "venueLink": "https://eventario.co/places/exploratorio/", + "label": "Feria y Salon", + "dateTime": [ + "13/12/25 10:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 73 #52-100 #52- a, Aranjuez", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/fiesta-de-cuadra-el-traido/", + "title": "Fiesta de Cuadra 'El Traído'", + "venue": "Centauro Centro de Eventos", + "venueLink": "https://eventario.co/places/centauro-centro-de-eventos/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "13/12/25 4:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Calle 49 #37 sur 130, Zona 1", + "category": "Mu", + "city": "Envigado" + }, + { + "link": "https://eventario.co/events/guaro-a-dos-manos/", + "title": "GUARO A DOS MANOS", + "venue": "Mamasita Medallo", + "venueLink": "https://eventario.co/places/mamasita-medallo/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "13/12/25 8:00 PM" + ], + "location": "Antioquia", + "address": "Cra 43D #10 - 77, El Poblado", + "category": "Mu", + "city": "Antioquia" + }, + { + "link": "https://eventario.co/events/faltan-5-pa-las-12/", + "title": "FALTAN 5 PA' LAS 12", + "venue": "Centro Comercial Sandiego", + "venueLink": "https://eventario.co/places/centro-comercial-sandiego/", + "label": "Feria y Salon", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Calle 33 42b 06, 050016 Medellín" + }, + { + "link": "https://eventario.co/events/para-no-olvidar-recap-noticias-2025/", + "title": "Para no olvidar recap noticias 2025", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Conferencias y Charlas", + "dateTime": [ + "19/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín", + "category": "Ed", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/happy-new-waves/", + "title": "Happy New Waves", + "venue": "La Deriva Rooftop", + "venueLink": "https://eventario.co/places/la-deriva-rooftop/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 10b 37-29, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/san-silvestre-2025/", + "title": "San Silvestre 2025", + "venue": "Terraza Municipal", + "venueLink": "https://eventario.co/places/terraza-municipal/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 7:00 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Cl. 24, Getsemaní", + "category": "Mu" + }, + { + "link": "https://eventario.co/events/the-rite-of-candles/", + "title": "THE RITE OF CANDLES", + "venue": "Sabine Bistró & Lounge", + "venueLink": "https://eventario.co/places/sabine-bistro-lounge/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 7:30 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Cra. 11 #39-21, San Diego", + "category": "Mu" + }, + { + "link": "https://eventario.co/events/abonanza-naufrago/", + "title": "Abonanza - Náufrago", + "venue": "Náufrago Bar", + "venueLink": "https://eventario.co/places/naufrago-bar/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 37 10a 29, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/hello-2026-lets-shine/", + "title": "HELLO 2026 LET'S SHINE!", + "venue": "Townhouse Cartagena", + "venueLink": "https://eventario.co/places/townhouse-cartagena/", + "label": "Fiesta de Ciudad", + "dateTime": [ + "31/12/25 9:00 PM" + ], + "location": "San José De La Montaña, Antioquia", + "address": "Cra. 7 #36-88, San Diego", + "category": "Mu", + "city": "San José De La Montaña" + }, + { + "link": "https://eventario.co/events/expofitness-lifestyle-2026/", + "title": "Expofitness Lifestyle 2026", + "venue": "Plaza mayor", + "venueLink": "https://eventario.co/places/plaza-mayor/", + "label": "Feria y Salon", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Cra. 57 #41-81, La Candelaria" + }, + { + "link": "https://eventario.co/events/planeta-salvaje-v10/", + "title": "PLANETA SALVAJE V10", + "venue": "Locación Secreta 7", + "venueLink": "https://eventario.co/places/locacion-secreta-7/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 3:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 36 55-62, 050013 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/calentamiento-decembrino/", + "title": "Calentamiento decembrino", + "venue": "MAMM Museo de Arte Moderno de Medellín", + "venueLink": "https://eventario.co/places/museo-de-arte-moderno-de-medellin/", + "label": "Concierto", + "dateTime": [ + "29/11/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Museo de Arte Moderno Sede Ciudad del Río, Carrera 44 #19A-100", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/la-eterna-gozaderia/", + "title": "La Eterna Gozaderia", + "venue": "Club Unión Medellín", + "venueLink": "https://eventario.co/places/club-union-medellin/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 43a 1-50, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/afrodicto-2/", + "title": "AFRODICTO", + "venue": "Afrodisia", + "venueLink": "https://eventario.co/places/afrodisia/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 37 8a-79, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/m-i-t-a/", + "title": "M.I.T.A.", + "venue": "Sonorama", + "venueLink": "https://eventario.co/places/sonorama/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 37 #10-37, El Poblado", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/tropikal-beat/", + "title": "TROPIKAL BEAT", + "venue": "Eminence", + "venueLink": "https://eventario.co/places/eminence/", + "label": "Concierto", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 25 43g-25, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/10-anos-la-ciudad-maldita/", + "title": "10 AÑOS ANIVERSARIO LA CIUDAD MALDITA", + "venue": "El Callejón", + "venueLink": "https://eventario.co/places/el-callejon/", + "label": "Concierto", + "dateTime": [ + "6/12/25 8:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Cra. 42 #39 Sur-6, Zona 7", + "category": "Mu", + "city": "Envigado" + }, + { + "link": "https://eventario.co/events/medallo-rumba-fest-2025/", + "title": "Medallo Rumba Fest 2025", + "venue": "Aeroparque Juan Pablo II", + "venueLink": "https://eventario.co/places/aeroparque-juan-pablo-ii/", + "label": "Festival", + "dateTime": [ + "29/11/25 9:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Aeroparque Juan Pablo II, Carrera 70", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/mas-mujeres-musicas-fest-2025/", + "title": "Más Mujeres Músicas Fest 2025", + "venue": "Museo Casa de la Memoria", + "venueLink": "https://eventario.co/places/museo-casa-de-la-memoria/", + "label": "Festival", + "dateTime": [ + "29/11/25 2:00 PM" + ], + "location": "n/a", + "address": [], + "category": "Mu" + }, + { + "link": "https://eventario.co/events/made-in-medellin/", + "title": "Made In Medellín", + "venue": "Estadio Atanasio Girardot", + "venueLink": "https://eventario.co/places/estadio-atanasio-girardot/", + "label": "Concierto", + "dateTime": [ + "29/11/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 70 48-373, 050034 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/predecembrina-rock-en-espanol/", + "title": "PreDecembrina & Rock en Español", + "venue": "Café Cliché", + "venueLink": "https://eventario.co/places/cafe-cliche/", + "label": "Concierto", + "dateTime": [ + "29/11/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 77 #39B 45, Laureles - Estadio", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/salsa-underground-vol-6/", + "title": "Salsa Underground Vol 6.", + "venue": "TIBIRI BAR", + "venueLink": "https://eventario.co/places/tibiri-bar/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "El Tíbiri, Avenida San Juan", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/noche-de-karaoke/", + "title": "Noche de Karaoke", + "venue": "Casa Cultural La Trilla", + "venueLink": "https://eventario.co/places/casa-cultural-la-trilla/", + "label": "Karaoké", + "dateTime": [ + "29/11/25 9:30 PM", + "6/12/25 9:30 PM", + "13/12/25 9:30 PM", + "20/12/25 9:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 44a 73-60, 050031 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/francis-mercier-soley/", + "title": "FRANCIS MERCIER- SOLÈY", + "venue": "Orquideorama", + "venueLink": "https://eventario.co/places/orquideorama/", + "label": "Festival", + "dateTime": [ + "30/11/25 11:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 41 #40A-26, Aranjuez", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/la-previa-de-la-alborada/", + "title": "LA PREVIA DE LA ALBORADA", + "venue": "OCCA", + "venueLink": "https://eventario.co/places/occa/", + "label": "Concierto", + "dateTime": [ + "30/11/25 3:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 20 Sur 27-55, 050022 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/domingos-de-los-60s-en-badalona-bar/", + "title": "Domingos de los 60's en Badalona Bar", + "venue": "Badalona Café Bar", + "venueLink": "https://eventario.co/places/badalona-cafe-bar/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "30/11/25 4:00 PM", + "7/12/25 4:00 PM", + "14/12/25 4:00 PM", + "21/12/25 4:00 PM" + ], + "location": "Envigado, Antioquia", + "address": "Transversal 32a Sur 31d 19, 055422 Envigado", + "category": "Mu", + "city": "Envigado" + }, + { + "link": "https://eventario.co/events/tardeo-chill-en-el-rooftop/", + "title": "¡Tardeo Chill en el rooftop!", + "venue": "Masaya Medellín", + "venueLink": "https://eventario.co/places/masaya-medellin/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "30/11/25 4:00 PM", + "7/12/25 4:00 PM", + "14/12/25 4:00 PM", + "21/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 8 43a-89, 050022 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/franky-wah/", + "title": "Franky Wah", + "venue": "Orquideorama", + "venueLink": "https://eventario.co/places/orquideorama/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "30/11/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 41 #40A-26, Aranjuez", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/karaoke-night-en-bololoi-masaya/", + "title": "Karaoké Night en Bololoi, Masaya!", + "venue": "Masaya Medellín", + "venueLink": "https://eventario.co/places/masaya-medellin/", + "label": "Karaoké", + "dateTime": [ + "30/11/25 8:00 PM", + "7/12/25 8:00 PM", + "14/12/25 8:00 PM", + "21/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 8 #43a-89, El Poblado", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/lunes-de-salsa/", + "title": "LUNES DE SALSA", + "venue": "la buyeson", + "venueLink": "https://eventario.co/organizadores/la-buyeson/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "1/12/25 8:00 PM", + "8/12/25 8:00 PM", + "15/12/25 8:00 PM", + "22/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Socialtel Medellin, Carrera 32d", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/tardes-en%c2%b7cantadas/", + "title": "Tardes En·Cantadas", + "venue": "El Solar del Águila", + "venueLink": "https://eventario.co/places/el-solar-del-aguila/", + "label": "Concierto", + "dateTime": [ + "3/12/25 4:00 PM", + "10/12/25 4:00 PM", + "17/12/25 4:00 PM", + "24/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 59 45d-1, 050012 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/noche-de-karaoke-en-bolero-bar/", + "title": "Noche de Karaoke en Bolero Bar", + "venue": "Bolero Bar Medellin", + "venueLink": "https://eventario.co/places/bolero-bar-medellin/", + "label": "Karaoké", + "dateTime": [ + "3/12/25 8:00 PM", + "10/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 67B #51a-98, Laureles - Estadio", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/jueves-de-tbt-en-la-mecha/", + "title": "JUEVES DE TBT EN LA MECHA", + "venue": "LA MECHA TEJO", + "venueLink": "https://eventario.co/places/la-mecha-tejo/", + "label": "Karaoké", + "dateTime": [ + "4/12/25 12:00 PM", + "11/12/25 12:00 PM", + "18/12/25 12:00 PM", + "25/12/25 12:00 PM" + ], + "location": "Guarne, Antioquia", + "address": "Vía Guarne - Llano Grande, 054048 Rionegro", + "category": "Mu", + "city": "Guarne" + }, + { + "link": "https://eventario.co/events/concierto-de-navidad/", + "title": "CONCIERTO DE NAVIDAD", + "venue": "Volver Siempre Volver", + "venueLink": "https://eventario.co/places/volver-siempre-volver/", + "label": "Concierto", + "dateTime": [ + "4/12/25 5:30 PM" + ], + "location": "Envigado, Antioquia", + "address": "Vía al aeropuerto, Av. Las Palmas", + "category": "Mu", + "city": "Envigado" + }, + { + "link": "https://eventario.co/events/dj-set-y-vinilos/", + "title": "Dj Set y Vinilos", + "venue": "Víbora Sound System", + "venueLink": "https://eventario.co/places/vibora-sound-system/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "29/11/25 6:00 PM", + "4/12/25 6:00 PM", + "5/12/25 6:00 PM", + "6/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 10a 37-64, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/rhythm-dough/", + "title": "Rhythm dough", + "venue": "Sandra Jaramillo", + "venueLink": "https://eventario.co/organizadores/sandra-jaramillo/", + "label": "DJ Set / Clubbing", + "dateTime": [ + "4/12/25 7:00 PM", + "11/12/25 7:00 PM", + "18/12/25 7:00 PM", + "25/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Rama Sound Garden, Carrera 48", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/cuentos-de-hilo-con-natalia-ramirez/", + "title": "Cuentos de hilo con Natalia Ramírez", + "venue": "VIVAPALABRA", + "venueLink": "https://eventario.co/places/vivapalabra/", + "label": "Cultura", + "dateTime": [ + "29/11/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 55 #43-63, La Candelaria", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/la-gringada-de-sefora/", + "title": "La gringada de Séfora", + "venue": "VIVAPALABRA", + "venueLink": "https://eventario.co/places/vivapalabra/", + "label": "Cultura", + "dateTime": [ + "29/11/25 7:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 55 #43-63, La Candelaria", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/social-de-salsa/", + "title": "SOCIAL DE SALSA", + "venue": "Posada León", + "venueLink": "https://eventario.co/places/posada-leon/", + "label": "Baile", + "dateTime": [ + "3/12/25 7:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Posada León, Carrera 35", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/el-show-de-rudolf-medellin-y-la-luz-del-corazon/", + "title": "EL SHOW DE RUDOLF, Medellín y la luz del corazón", + "venue": "Teatro el Tesoro", + "venueLink": "https://eventario.co/places/teatro-el-tesoro/", + "label": "Cultura", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Teatro El Tesoro, Carrera 25a" + }, + { + "link": "https://eventario.co/events/raspa-las-4-fiestas/", + "title": "Raspa las 4 FIESTAS", + "venue": "La Chula Cartagena", + "venueLink": "https://eventario.co/places/la-chula-cartagena/", + "label": "Cultura", + "dateTime": [ + "29/11/25 9:00 AM" + ], + "location": "Cartagena, Bolivar", + "address": "Av. Escallon, Dg. 35 #34-63", + "category": "Mu" + }, + { + "link": "https://eventario.co/events/tour-centro-de-francia-a-medellin/", + "title": "Tour Centro - De Francia a Medellín", + "venue": "Alianza Francesa Medellín", + "venueLink": "https://eventario.co/places/alianza-francesa-medellin/", + "label": "Cultura", + "dateTime": [ + "29/11/25 10:00 AM" + ], + "location": "n/a", + "address": "Edificio Porvenir, Av El Poblado", + "category": "Mu" + }, + { + "link": "https://eventario.co/events/recorrido-comentado-mamm/", + "title": "Recorrido comentado con Mediadores MAMM", + "venue": "MAMM Museo de Arte Moderno de Medellín", + "venueLink": "https://eventario.co/places/museo-de-arte-moderno-de-medellin/", + "label": "Cultura", + "dateTime": [ + "29/11/25 3:00 PM", + "6/12/25 3:00 PM", + "13/12/25 3:00 PM", + "20/12/25 3:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Museo de Arte Moderno Sede Ciudad del Río, Carrera 44 #19A-100", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/la-comedy-surprise/", + "title": "La Comedy Surprise", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "29/11/25 7:00 PM", + "6/12/25 7:00 PM", + "13/12/25 7:00 PM", + "20/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/la-masa-moya-con-leche-y-panela/", + "title": "LA MASA MOYA CON LECHE Y PANELA", + "venue": "Boom stand-up", + "venueLink": "https://eventario.co/places/boom-stand-up/", + "label": "Comedia y Stand Up", + "dateTime": [ + "29/11/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 26 #43g-30, El Poblado", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/ii-taller-de-fotografia-percepcion-visual/", + "title": "II Taller de Fotografía: Percepción Visual", + "venue": "Centro de Formacion de la Cooperacion Española", + "venueLink": "https://eventario.co/places/centro-de-formacion-de-la-cooperacion-espanola/", + "label": "Cultura", + "dateTime": [ + "30/11/25 9:00 AM" + ], + "location": "Cartagena, Bolivar", + "address": "Cl. 36 #2-74, El Centro", + "category": "Mu" + }, + { + "link": "https://eventario.co/events/en-el-barrio/", + "title": "EN EL BARRIO", + "venue": "Centro Cultural Caribe", + "venueLink": "https://eventario.co/places/centro-cultural-caribe/", + "label": "Cultura", + "dateTime": [ + "30/11/25 2:00 PM" + ], + "location": "Itagui, Antioquia", + "address": "Cra. 50 #52-77, Villa Paula", + "category": "Mu", + "city": "Itagui" + }, + { + "link": "https://eventario.co/events/navidad-en-espiral/", + "title": "Navidad en espiral", + "venue": "Teatro Metropolitano José Gutiérrez Gómez", + "venueLink": "https://eventario.co/places/teatro-metropolitano-jose-gutierrez-gomez/", + "label": "Cultura", + "dateTime": [ + "30/11/25 5:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cl. 41 #57-30, La Candelaria", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/los-dioses-de-la-impro/", + "title": "Los Dioses de la impro", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "30/11/25 7:00 PM", + "7/12/25 7:00 PM", + "14/12/25 7:00 PM", + "21/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/el-tribunal-de-los-necios/", + "title": "El tribunal de los necios", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "30/11/25 7:00 PM", + "7/12/25 7:00 PM", + "14/12/25 7:00 PM", + "21/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/language-exchange%f0%9f%8c%8e%f0%9f%8c%bb/", + "title": "LANGUAGE EXCHANGE????????", + "venue": "Floras black coffee", + "venueLink": "https://eventario.co/places/floras-black-coffee/", + "label": "Cultura", + "dateTime": [ + "30/11/25 7:30 PM", + "1/12/25 7:30 PM", + "3/12/25 7:30 PM", + "7/12/25 7:30 PM" + ], + "location": "Antioquia", + "address": "Cra. 48 #7-282, El Poblado", + "category": "Mu", + "city": "Antioquia" + }, + { + "link": "https://eventario.co/events/lunes-noche-bachatera/", + "title": "Lunes Noche Bachatera", + "venue": "Blood Dance Company", + "venueLink": "https://eventario.co/places/blood-dance-company/", + "label": "Baile", + "dateTime": [ + "1/12/25 8:30 PM", + "8/12/25 8:30 PM", + "15/12/25 8:30 PM", + "22/12/25 8:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 81 36-44, 050031 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/kriminales-open-mic/", + "title": "Kriminales Open Mic", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "2/12/25 7:00 PM", + "9/12/25 7:00 PM", + "16/12/25 7:00 PM", + "23/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/colombian-music-night-2/", + "title": "COLOMBIAN MUSIC NIGHT", + "venue": "Milo Borja", + "venueLink": "https://eventario.co/organizadores/milo-borja/", + "label": "Baile", + "dateTime": [ + "2/12/25 8:00 PM", + "9/12/25 8:00 PM", + "16/12/25 8:00 PM", + "23/12/25 8:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "La República Restaurante Bar, Calle 10", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/el-caballero-y-su-escudero-al-rescate-de-la-ortografia/", + "title": "El Caballero y su Escudero al rescate de la Ortografía", + "venue": "Auditorio Monseñor Nelson Sierra Pérez", + "venueLink": "https://eventario.co/places/auditorio-monsenor-nelson-sierra-perez/", + "label": "Cultura", + "dateTime": [ + "3/12/25 3:50 PM" + ], + "location": "Envigado, Antioquia", + "address": "Cl 38A Sur #45a-80, Zona 8", + "category": "Mu", + "city": "Envigado" + }, + { + "link": "https://eventario.co/events/clases-de-porro/", + "title": "CLASES DE PORRO", + "venue": "Centro Comercial Terminal Sur", + "venueLink": "https://eventario.co/places/centro-comercial-terminal-sur/", + "label": "Baile", + "dateTime": [ + "3/12/25 6:30 PM", + "10/12/25 6:30 PM", + "17/12/25 6:30 PM", + "24/12/25 6:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 65 8b 91, 050024 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/noches-de-impro/", + "title": "Noches de Impro", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "3/12/25 7:00 PM", + "10/12/25 7:00 PM", + "17/12/25 7:00 PM", + "24/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/club-de-pintura-sensibilizacion-al-arte/", + "title": "Club de pintura - sensibilización al arte", + "venue": "Casa Cultural La Trilla", + "venueLink": "https://eventario.co/places/casa-cultural-la-trilla/", + "label": "Cultura", + "dateTime": [ + "3/12/25 7:00 PM", + "10/12/25 7:00 PM", + "17/12/25 7:00 PM", + "24/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 44a 73-60, 050031 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/miercoles-secretos/", + "title": "MIERCOLES SECRETOS", + "venue": "La Casa De Ruby", + "venueLink": "https://eventario.co/places/la-casa-de-ruby/", + "label": "Baile", + "dateTime": [ + "3/12/25 8:30 PM", + "10/12/25 8:30 PM", + "17/12/25 8:30 PM", + "24/12/25 8:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 10 33-21, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/toma-tu-tomate-2/", + "title": "Toma tu Tomate", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "3/12/25 9:00 PM", + "10/12/25 9:00 PM", + "17/12/25 9:00 PM", + "24/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/actividad-de-pintura-y-vino-%f0%9f%8e%a8%f0%9f%96%8c%ef%b8%8f%f0%9f%8d%b7/", + "title": "Actividad De Pintura Y Vino ????????️????", + "venue": "Floras black coffee", + "venueLink": "https://eventario.co/places/floras-black-coffee/", + "label": "Cultura", + "dateTime": [ + "29/11/25 4:00 PM", + "2/12/25 4:00 PM", + "4/12/25 4:00 PM", + "6/12/25 4:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Flora's Black Coffee, Mall las vegas TERRAZA - ROOFTOP", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/a-tomarse-una-pola-con-los-parceros/", + "title": "A tomarse una Pola con los Parceros", + "venue": "La Cellar Club", + "venueLink": "https://eventario.co/places/la-cellar-club/", + "label": "Baile", + "dateTime": [ + "4/12/25 6:00 PM", + "11/12/25 6:00 PM", + "18/12/25 6:00 PM", + "25/12/25 6:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Calle 27 43f 79, 050021 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/joyas-colombianas-dinner-show/", + "title": "Joyas Colombianas Dinner & Show", + "venue": "Restaurante Marmoleo", + "venueLink": "https://eventario.co/places/restaurante-marmoleo/", + "label": "Cultura", + "dateTime": [ + "4/12/25 7:00 PM", + "11/12/25 7:00 PM", + "18/12/25 7:00 PM", + "25/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 11 #9a Sur-180, Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/reinas-de-la-comedia/", + "title": "Reinas de la Comedia", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "4/12/25 7:00 PM", + "11/12/25 7:00 PM", + "18/12/25 7:00 PM", + "25/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/el-parche-del-chicharron/", + "title": "EL PARCHE DEL CHICHARRON", + "venue": "Centauro Centro de Eventos", + "venueLink": "https://eventario.co/places/centauro-centro-de-eventos/", + "label": "Cultura", + "dateTime": [], + "location": "Envigado, Antioquia", + "address": "Calle 49 #37 sur 130, Zona 1" + }, + { + "link": "https://eventario.co/events/bestias-de-la-comedia-medellin/", + "title": "Bestias de la Comedia - Medellín", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "5/12/25 7:00 PM", + "12/12/25 7:00 PM", + "19/12/25 7:00 PM", + "26/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/salsa-fever/", + "title": "SALSA FEVER", + "venue": "Blood Dance Company", + "venueLink": "https://eventario.co/places/blood-dance-company/", + "label": "Baile", + "dateTime": [ + "5/12/25 8:30 PM", + "12/12/25 8:30 PM", + "19/12/25 8:30 PM", + "26/12/25 8:30 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 81 36-44, 050031 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/humor-etilico-drink-cast/", + "title": "Humor Etílico, Drink-Cast", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "5/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/terapia-de-choque-medellin/", + "title": "Terapia de Choque - Medellín", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "5/12/25 9:00 PM", + "12/12/25 9:00 PM", + "19/12/25 9:00 PM", + "26/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cq. 4 #71-84, Laureles", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/un-show-de-medio-pelo/", + "title": "Un show de medio pelo", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "12/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/feria-de-oficios/", + "title": "Feria de Oficios", + "venue": "Parque Explora", + "venueLink": "https://eventario.co/places/parque-explora/", + "label": "Cultura", + "dateTime": [ + "13/12/25 10:00 AM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 53 73 75, 050010 Medellín", + "category": "Mu", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/todo-sobre-ruedas/", + "title": "Todo sobre ruedas", + "venue": "LA KORTE", + "venueLink": "https://eventario.co/places/la-korte-bar-de-comedia/", + "label": "Comedia y Stand Up", + "dateTime": [ + "13/12/25 9:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Circular 4 71-84, 050031 Medellín", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/free-comedy-fest-medallo/", + "title": "FREE COMEDY FEST MEDALLO", + "venue": "Teatro Universidad de Medellín", + "venueLink": "https://eventario.co/places/teatro-universidad-de-medellin/", + "label": "Comedia y Stand Up", + "dateTime": [ + "17/12/25 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Carrera 87 #30-65, Medellín", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/navidad-en-andres/", + "title": "Navidad en Andrés", + "venue": "Andrés Carne de Res Cartagena", + "venueLink": "https://eventario.co/places/andres-carne-de-res-cartagena/", + "label": "Cultura", + "dateTime": [ + "24/12/25 7:00 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Carrera 11, Cl. de la Serrezuela #39 - 21", + "category": "Mu" + }, + { + "link": "https://eventario.co/events/gran-cena-de-san-silvestre/", + "title": "Gran Cena de San Silvestre", + "venue": "Hotel Las Américas Cartagena", + "venueLink": "https://eventario.co/places/hotel-las-americas-cartagena/", + "label": "Cultura", + "dateTime": [ + "31/12/25 6:00 PM" + ], + "location": "Cartagena, Bolivar", + "address": "Anillo Vial, Sector", + "category": "Mu" + }, + { + "link": "https://eventario.co/events/probando-probando-finura/", + "title": "Probando Probando Finura", + "venue": "Teatro el Tesoro", + "venueLink": "https://eventario.co/places/teatro-el-tesoro/", + "label": "Comedia y Stand Up", + "dateTime": [ + "7/02/26 7:00 PM" + ], + "location": "Medellín, Antioquia", + "address": "Cra. 25a #1A Sur - 45, El Poblado", + "category": "Co", + "city": "Medellín" + }, + { + "link": "https://eventario.co/events/medellin-street-art-festival/", + "title": "Medellín Street Art Festival", + "venue": "Medellín Street Art Festival", + "venueLink": "https://eventario.co/places/medellin-street-art-festival/", + "label": "Cultura", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Street Art Colombia, Calle 10b" + }, + { + "link": "https://eventario.co/events/maridaje-sabor-y-fiesta-2025/", + "title": "MARIDAJE SABOR Y FIESTA 2025", + "venue": "Plaza mayor", + "venueLink": "https://eventario.co/places/plaza-mayor/", + "label": "Cultura", + "dateTime": [], + "location": "Medellín, Antioquia", + "address": "Cra. 57 #41-81, La Candelaria" + } +] \ No newline at end of file diff --git a/events/scrapers/Working/venues/manual/eventario.py b/events/scrapers/Working/venues/manual/eventario.py new file mode 100644 index 0000000..b15ed30 --- /dev/null +++ b/events/scrapers/Working/venues/manual/eventario.py @@ -0,0 +1,169 @@ +import os, sys +from datetime import datetime +from dateutil import relativedelta +import json + +from selenium.webdriver.common.by import By +from lxml import html + +import django +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' +django.setup() + +from time import sleep +from pprint import pprint as ppr +import pytz + +from events.models import Organization, Scraper, Calendar +import events.digitools as digitools + +venue, created = Organization.objects.get_or_create( + name="Events Medellin", + city="Medellin", + website="https://eventario.co/events-category/social/", + is_venue=True + ) + +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'mde') + +DATETIME_FORMAT = '%B %d %Y %I:%M%p' +DATETIME_FORMAT_2 = '%A, %B %d @ %I%p %Y' + +# with open('data.json') as f: +# totalLinks = json.load(f) + +def getLinks(br, url, links): + br.get(url) + sleep(2) + br.execute_script("window.scrollTo(0, window.scrollY + 1500)") + sleep(2) + x = 1 + while x == 1: + try: + div = br.find_element(By.XPATH, ".//*/div[@class='feed-pagination flexify']/a") + div.click() + sleep(2) + br.execute_script("window.scrollTo(0, window.scrollY + 1100)") + sleep(2) + except: + x = 0 + ps = html.fromstring(br.page_source) + newLinks = [] + # newlinks = ps.xpath('.//*/div[@class="e-con-inner"]/*/a/@href') + events = ps.xpath('.//*/div[@class="e-con-inner"]') + for event in events: + e = {} + try: + e['link'] = event.xpath('.//*/a/@href')[0] + e['title'] = event.xpath('.//*/h3/a/text()')[0] + e['venue'] = event.xpath('.//*/ul/li/a/text()')[-1:][0].replace('\n', '').replace('\t', '') + # e['venue'] = event.xpath('.//*/ul/li/a/text()')[-1:][0] + e['venueLink'] = event.xpath('.//*/ul/li/a/@href')[1] + label= event.xpath('.//*/li[@class="elementor-repeater-item-46edd7d flexify ts-action"]/div/text()') + e['label'] = ''.join([x.replace('\t', '').replace('\n', '') for x in label]).strip() + newLinks.append(e) + except Exception as e: + print("Error: ", e) + + links = links + newLinks + return links + +if len(sys.argv) >= 2: + arg1 = sys.argv[1] + br = digitools.getBrowser(arg1) +else: + print("No run_env") + quit() + +urls = ["https://eventario.co/events-category/social/", "https://eventario.co/events-category/musica/", "https://eventario.co/events-category/cultura/"] + +allLinks = [] + +for url in urls: + allLinks = getLinks(br, url, allLinks) + +totalLinks = list({v['title']:v for v in allLinks}.values()) +ppr(len(totalLinks)) +# sortedlinks = allLinks.sort() +# ppr(sortedlinks) + +for event in totalLinks: + br.get(event['link']) + sleep(2) + ps = html.fromstring(br.page_source) + dateTime= ps.xpath('.//*/div[@class="elementor-element elementor-element-d9beb21 elementor-widget elementor-widget-heading"]/span[@class="elementor-heading-title elementor-size-default"]/text()') + event['dateTime'] = [x[3:].split('-')[0].strip() for x in dateTime] + locations = ps.xpath('.//*/div[@class="elementor-element elementor-element-f04aae3 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-ts-advanced-list"]/*/li[@class="elementor-repeater-item-138dbed flexify ts-action"]/a/text()') + location = [x.replace('\t', '').replace('\n', '') for x in locations] + if len(location) == 2: + event['location'] = "{0}, {1}".format(location[1], location[0]) + else: + try: + event['location'] = location[0] + except: + event['location'] = 'n/a' + address= ps.xpath('.//*/ul[@class="flexify simplify-ul ts-advanced-list"]/li[@class="elementor-repeater-item-842568d flexify ts-action"]/div/text()') + try: + event['address'] = [x for x in address if 'Capacidad' not in x and '$' not in x][0] + except: + event['address'] = address + # ppr(event) + +sleep(2) +br.close() + +data = totalLinks +print("Set:", len(totalLinks)) + +paisa = [] + +for d in data: + if len(d['dateTime']) != 0: + if 'Familia' in d['label']: + d['category'] = 'Ot' + elif 'Comedia' in d['label']: + d['category'] = 'Co' + elif ('Magic' in d['title']) or ('Juegos' in d['label']): + d['category'] = 'Ot' + elif ('Conferencias' in d['label']) or ('Intercambio' in d['label']): + d['category'] = 'Ed' + else: + d['category'] = 'Mu' + if "Antioquia" in d['location']: + try: + d['city'] = d['location'].split(',')[0] + paisa.append(d) + except: + continue + +cal = Calendar.objects.get(shortcode='mde') + +for d in paisa: + d['dateStamp'] =datetime.strptime(d['dateTime'][0], DATETIME_FORMAT) + try: + nvenue, created = Organization.objects.get_or_create( + name=d['venue'], + city=d['city'], + website=d['venueLink'], + address_complete = d['address'], + is_venue=True + ) + except: + nvenue = Organization.objects.get(name=d['venue']) + nvenue.address_complete = d['address'] + nvenue.save() + new_event, created = Event.objects.update_or_create( + event_type = d['category'], + show_title = d['title'], + show_link = d['link'], + show_date = d['dateStamp'], + show_day = d['dateStamp'], + scraper = scraper, + venue = nvenue + ) + new_event.calendar.add(cal) + new_event.save() + print(new_event) + +digitools.updateScraper(scraper, item_count_start) \ No newline at end of file diff --git a/events/scrapers/run_govt.sh b/events/scrapers/run_govt.sh deleted file mode 100644 index 3b4115b..0000000 --- a/events/scrapers/run_govt.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -BASEDIR=/home/canin/Downloads/DigiSnaxxEvents -DJANGODIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events -EVENTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers -GOVTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/govt - -cd $GOVTDIR -for file in * -do - python "$file" $1 - echo "SCRIPT COMPLETE" -done - -cd $EVENTDIR -python clean_up.py \ No newline at end of file diff --git a/events/scrapers/run_ical.sh b/events/scrapers/run_ical.sh deleted file mode 100644 index 6a4839c..0000000 --- a/events/scrapers/run_ical.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -BASEDIR=/home/canin/Downloads/DigiSnaxxEvents -DJANGODIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events -EVENTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers -ICALDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/iCal - -cd $ICALDIR -for file in * -do - python "$file" - echo "SCRIPT COMPLETE" -done - -cd $EVENTDIR -python clean_up.py \ No newline at end of file diff --git a/events/scrapers/run_media_update.sh b/events/scrapers/run_media_update.sh deleted file mode 100644 index afed243..0000000 --- a/events/scrapers/run_media_update.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -ENVDIR=/var/www/digisnaxx.com/ -DJANGODIR=/var/www/digisnaxx.com/ds_events -EVENTDIR=/var/www/digisnaxx.com/ds_events/event_scrapers -WORKMEDIADIR=/var/www/digisnaxx.com/ds_events/event_scrapers/Working/smedia - -# ENVDIR=/home/canin/Downloads/DigiSnaxxEvents -# DJANGODIR=/home/canin/Documents/repos/digisnaxx/ds_events -# WORKMEDIADIR=/home/canin/Documents/repos/digisnaxx/ds_events/event_scrapers/Working/smedia - -cd $ENVDIR -pwd -source venv/bin/activate - -cd $WORKMEDIADIR - -python bluesky.py -python bluesky_media.py -python redsky.py - -deactivate diff --git a/events/scrapers/run_news.sh b/events/scrapers/run_news.sh deleted file mode 100644 index f31de03..0000000 --- a/events/scrapers/run_news.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -BASEDIR=/home/canin/Downloads/DigiSnaxxEvents -DJANGODIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events -EVENTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers -NEWSDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/news - -cd $NEWSDIR -for file in * -do - python "$file" $1 - echo "SCRIPT COMPLETE" -done - -cd $EVENTDIR -python clean_up.py \ No newline at end of file diff --git a/events/scrapers/run_scrapers.sh b/events/scrapers/run_scrapers.sh index 49fdfcc..34d98ef 100644 --- a/events/scrapers/run_scrapers.sh +++ b/events/scrapers/run_scrapers.sh @@ -1,39 +1,44 @@ #!/bin/bash -# BASEDIR=/var/www/digisnaxx.com/ -# DJANGODIR=/var/www/digisnaxx.com/ds_events -# EVENTDIR=/var/www/digisnaxx.com/ds_events/event_scrapers - -BASEDIR=/home/canin/Downloads/DigiSnaxxEvents -DJANGODIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events -EVENTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers -VENUESDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/venues -ICALDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/iCal -GOVTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/govt +DIGIDIR=/var/www/digisnaxx.ado +DJANGODIR=/var/www/digisnaxx.ado/api.digisnaxx +EVENTSDIR=/var/www/digisnaxx.ado/api.digisnaxx/events +FIXTURESDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/fixtures +SCRAPEDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers +SCRIPTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/scripts +VENUESDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/venues +ICALDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/iCal +GOVTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/govt export DJANGO_SUPERUSER_EMAIL=canin@dreamfreely.org export DJANGO_SUPERUSER_USERNAME=canin export DJANGO_SUPERUSER_PASSWORD='hello123' -cd $BASEDIR +cd $DIGIDIR source venv/bin/activate cd $DJANGODIR -mv db.sqlite3 db.sqlite3.bak -python manage.py migrate +mv *.bak baks/ +cp db.sqlite3 $(date -d "today" +"%Y%m%d%H%M").sqlite.bak + +# python manage.py migrate + +# cd $FIXTURESDIR +# django-admin loaddata orgs.json +# django-admin loaddata promo.json + +cd $SCRIPTDIR +python start_up.py -cd $EVENTDIR bash run_venues.sh $1 -bash run_ical.sh bash run_govt.sh $1 -bash run_news.sh $1 +bash run_ical.sh +# # bash run_media_update.sh +# # bash run_news.sh $1 -python Working/smedia/bluesky.py -python Working/smedia/bluesky_media.py -python Working/smedia/redsky.py -python clean_up.py +# python clean_up.py +# cd ../ +# deactivate -deactivate - -rm -rf ../*/__pycache__ -rm -rf ../*/*/__pycache__ \ No newline at end of file +# rm -rf ../*/__pycache__ +# rm -rf ../*/*/__pycache__ \ No newline at end of file diff --git a/events/scrapers/run_venues.sh b/events/scrapers/run_venues.sh deleted file mode 100644 index e8d0a0d..0000000 --- a/events/scrapers/run_venues.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -BASEDIR=/home/canin/Downloads/DigiSnaxxEvents -DJANGODIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events -EVENTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers -VENUESDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/venues - -cd $VENUESDIR -for file in * -do - python "$file" $1 - echo "SCRIPT COMPLETE" -done - -cd $EVENTDIR -python clean_up.py \ No newline at end of file diff --git a/events/scrapers/clean_up.py b/events/scrapers/scripts/clean_up.py similarity index 66% rename from events/scrapers/clean_up.py rename to events/scrapers/scripts/clean_up.py index 3ef6fa7..d7a179d 100644 --- a/events/scrapers/clean_up.py +++ b/events/scrapers/scripts/clean_up.py @@ -4,8 +4,8 @@ from datetime import datetime, timedelta from django.db.models import Count import django -sys.path.append('../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event, Organization @@ -21,10 +21,13 @@ for e in events: for e in events1: e.delete() -org_sin_events = Organization.objects.annotate(num_events = Count('event')).filter(num_events__lt=1).filter(is_501c=False) +org_sin_events = Organization.objects.annotate(num_events = Count('event')).filter(num_events__lt=1) -for org in org_sin_events: - print(org) - org.delete() +for o in org_sin_events: + print(o) + +# for org in org_sin_events: +# print(org) +# org.delete() print("completed and cleaned scrapes") \ No newline at end of file diff --git a/events/scrapers/scripts/run_govt.sh b/events/scrapers/scripts/run_govt.sh new file mode 100644 index 0000000..377d73b --- /dev/null +++ b/events/scrapers/scripts/run_govt.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +BASEDIR=/var/www/digisnaxx.ado/api.digisnaxx +EVENTSDIR=/var/www/digisnaxx.ado/api.digisnaxx/events +SCRIPTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/scripts +GOVTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/govt + +cd $GOVTDIR +for file in * +do + python "$file" $1 + echo "SCRIPT COMPLETE" +done + +cd $SCRIPTDIR +pwd +python clean_up.py \ No newline at end of file diff --git a/events/scrapers/scripts/run_ical.sh b/events/scrapers/scripts/run_ical.sh new file mode 100644 index 0000000..0f03c44 --- /dev/null +++ b/events/scrapers/scripts/run_ical.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +BASEDIR=/var/www/digisnaxx.ado/api.digisnaxx +DJANGODIR=/var/www/digisnaxx.ado/api.digisnaxx/events +SCRIPTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/scripts +ICALDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/iCal + +cd $ICALDIR +for file in * +do + python "$file" + echo "SCRIPT COMPLETE" +done + +cd $SCRIPTDIR +python clean_up.py \ No newline at end of file diff --git a/events/scrapers/scripts/run_media_update.sh b/events/scrapers/scripts/run_media_update.sh new file mode 100644 index 0000000..b83b648 --- /dev/null +++ b/events/scrapers/scripts/run_media_update.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +ENVDIR=/var/www/digisnaxx.ado/ +DJANGODIR=/var/www/digisnaxx.ado/api.digisnaxx/events +EVENTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers +WORKMEDIADIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/smedia + +# ENVDIR=/home/canin/Downloads/DigiSnaxxEvents +# DJANGODIR=/home/canin/Documents/repos/digisnaxx/events +# WORKMEDIADIR=/home/canin/Documents/repos/digisnaxx/events/scrapers/Working/smedia + +cd $ENVDIR +pwd +source venv/bin/activate + +cd $WORKMEDIADIR + +python bluesky.py +python bluesky_media.py +python redsky.py + +deactivate diff --git a/events/scrapers/scripts/run_news.sh b/events/scrapers/scripts/run_news.sh new file mode 100644 index 0000000..b0fc4ca --- /dev/null +++ b/events/scrapers/scripts/run_news.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +BASEDIR=/var/www/digisnaxx.com/api.digisnaxx +DJANGODIR=/var/www/digisnaxx.com/api.digisnaxx/events +SCRIPTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/scripts +NEWSDIR=/var/www/digisnaxx.com/api.digisnaxx/events/scrapers/Working/news + +cd $NEWSDIR +for file in * +do + python "$file" $1 + echo "SCRIPT COMPLETE" +done + +cd $SCRIPTDIR +python clean_up.py \ No newline at end of file diff --git a/events/scrapers/scripts/run_venues.sh b/events/scrapers/scripts/run_venues.sh new file mode 100644 index 0000000..8f5ccfe --- /dev/null +++ b/events/scrapers/scripts/run_venues.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +BASEDIR=/var/www/digisnaxx.ado/api.digisnaxx +DJANGODIR=/var/www/digisnaxx.ado/api.digisnaxx/events +SCRIPTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/scripts +VENUESDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/venues + +cd $VENUESDIR +for file in * +do + python "$file" $1 + echo "SCRIPT COMPLETE" +done + +cd $SCRIPTDIR +python clean_up.py \ No newline at end of file diff --git a/events/scrapers/scripts/start_up.py b/events/scrapers/scripts/start_up.py new file mode 100644 index 0000000..8c8074e --- /dev/null +++ b/events/scrapers/scripts/start_up.py @@ -0,0 +1,29 @@ +import re, os, sys +from datetime import datetime, timedelta + +import django +sys.path.append('../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' +django.setup() + +from events.models import Event,Organization, Promo, Calendar + +# venue, created = Organization.objects.get_or_create(name="DreamFreely", +# website="https://www.dreamfreely.org", +# city="Minneapolis", +# contact_name="Canin Carlos", +# contact_email="canin@dreamfreely.org", +# phone_number="6124054535") + +# print("Created DreamFreely:", created, venue) + +# calendar, created = Calendar.objects.get_or_create(name='Mpls-StP', shortcode='msp', desc='none') +# calendar, created = Calendar.objects.get_or_create(name='Medellin', shortcode='mde', desc='none') +# calendar, created = Calendar.objects.get_or_create(name='Online', shortcode='000', desc='none') + +events = Event.objects.all() + +for e in events: + e.delete() + +print("Events are cleared. Ready to scrape.") \ No newline at end of file diff --git a/events/scrapers/start_up.py b/events/scrapers/start_up.py deleted file mode 100644 index cd94b9d..0000000 --- a/events/scrapers/start_up.py +++ /dev/null @@ -1,23 +0,0 @@ -import re, os, sys -from datetime import datetime, timedelta - -import django -sys.path.append('../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' -django.setup() - -from events.models import Organization, Promo, Calendar - -venue, created = Organization.objects.get_or_create(name="DreamFreely", - website="https://www.dreamfreely.org", - city="St Paul", - contact_name="Canin Carlos", - contact_email="canin@dreamfreely.org", - phone_number="6124054535") - -print("Created DreamFreely:", created, venue) - -calendar, created = Calendar.objects.get_or_create(name='Mpls-StP', shortcode='msp', desc='none') -calendar, created = Calendar.objects.get_or_create(name='Medellin', shortcode='mde', desc='none') -calendar, created = Calendar.objects.get_or_create(name='Global', shortcode='000', desc='none') -calendar, created = Calendar.objects.get_or_create(name='Online', shortcode='111', desc='none') diff --git a/events/scrapers/Working/venues/EastsideLibrary.py b/events/scrapers/zArchive/broken/EastsideLibrary.py similarity index 93% rename from events/scrapers/Working/venues/EastsideLibrary.py rename to events/scrapers/zArchive/broken/EastsideLibrary.py index 7604d5c..8ea7c7f 100644 --- a/events/scrapers/Working/venues/EastsideLibrary.py +++ b/events/scrapers/zArchive/broken/EastsideLibrary.py @@ -3,8 +3,8 @@ from datetime import datetime from dateutil import relativedelta import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from time import sleep diff --git a/events/scrapers/Working/iCal/ical_run.KJHideaway.StPaul.py b/events/scrapers/zArchive/broken/ical_run.KJHideaway.StPaul.py similarity index 61% rename from events/scrapers/Working/iCal/ical_run.KJHideaway.StPaul.py rename to events/scrapers/zArchive/broken/ical_run.KJHideaway.StPaul.py index 4946118..fdb1f37 100644 --- a/events/scrapers/Working/iCal/ical_run.KJHideaway.StPaul.py +++ b/events/scrapers/zArchive/broken/ical_run.KJHideaway.StPaul.py @@ -6,8 +6,8 @@ from pprint import pprint as ppr import pytz import django -sys.path.append('../../../') -os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings' +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' django.setup() from events.models import Event as DSEvent, Organization, Scraper, Calendar @@ -42,5 +42,24 @@ event_type = "Mu" objIcalData = requests.get(scraper.website) gcal = iCalendar.from_ical(objIcalData.text) tz = pytz.timezone("US/Central") -digitools.getiCalEvents(gcal, scraper, venue) +events = digitools.getiCalEvents(gcal, scraper, venue, "Ed") + +for event in events: + # ppr(event) + now_now = datetime.today().date() + e = {} + e['calendars'] = event['calendars'] + try: + e['dateStamp'] = event['dateStart'][0] + except: + e['dateStamp'] = event['dateStart'] + e['title'] = event['strSummary'] + e['scraper'] = scraper + e['link'] = venue.website + if e['dateStamp'] > now_now: + try: + digitools.createBasicEvent(e, 'Mu', venue) + except Exception as e: + print("Error: ", e) + digitools.updateScraper(scraper, item_count_start) \ No newline at end of file diff --git a/events/scrapers/zArchive/eventario.2.py b/events/scrapers/zArchive/eventario.2.py new file mode 100644 index 0000000..5bd48f7 --- /dev/null +++ b/events/scrapers/zArchive/eventario.2.py @@ -0,0 +1,91 @@ +import json + +import os, sys +from datetime import datetime +from dateutil import relativedelta + +import django +sys.path.append('../../../../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local' +django.setup() + +from time import sleep +from pprint import pprint as ppr +import pytz + +from events.models import Organization, Scraper, Calendar, Event +import events.digitools as digitools + + +venue, created = Organization.objects.get_or_create( + name="Eventario", + city="Medellin", + website="https://www.eventario.co", + is_venue=True + ) + +scraper,item_count_start,virtcal = digitools.getScraper(venue, 'mde') + +DATETIME_FORMAT = '%-d/%-m/%y %I:%M %p' + + +with open('data.json') as f: + data = json.load(f) + +paisa = [] + +for d in data: + if len(d['dateTime']) != 0: + if 'Familia' in d['label']: + d['category'] = 'Ot' + elif 'Comedia' in d['label']: + d['category'] = 'Co' + elif ('Magic' in d['title']) or ('Juegos' in d['label']): + d['category'] = 'Ot' + elif ('Conferencias' in d['label']) or ('Intercambio' in d['label']): + d['category'] = 'Ed' + else: + d['category'] = 'Mu' + if "Antioquia" in d['location']: + try: + d['city'] = d['location'].split(',')[0] + paisa.append(d) + except: + continue + +# ppr(paisa) +with open('data.updated.json', 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + +cal = Calendar.objects.get(shortcode='mde') + + +for d in paisa: + d['dateStamp'] =datetime.strptime(d['dateTime'][0], DATETIME_FORMAT) + try: + nvenue, created = Organization.objects.get_or_create( + name=d['venue'], + city=d['city'], + website=d['venueLink'], + address_complete = d['address'], + is_venue=True + ) + except: + nvenue = Organization.objects.get(name=d['venue']) + nvenue.address_complete = d['address'] + nvenue.save() + new_event, created = Event.objects.update_or_create( + event_type = d['category'], + show_title = d['title'], + show_link = d['link'], + show_date = d['dateStamp'], + show_day = d['dateStamp'], + scraper = scraper, + venue = nvenue + ) + new_event.calendar.add(cal) + new_event.save() + print(new_event) + +digitools.updateScraper(scraper, item_count_start) \ No newline at end of file diff --git a/events/serializers.py b/events/serializers.py index 2ef685e..db78c61 100644 --- a/events/serializers.py +++ b/events/serializers.py @@ -57,6 +57,6 @@ class PromoSerializer(serializers.ModelSerializer): # event_type = serializers.CharField(source='get_event_type_display') class Meta: model = Promo - fields = ('id', 'title', 'organization', 'promo_type', 'long_text', 'short_text', 'overlay_image', 'classified_image', 'target_link') - # fields = '__all__' + # fields = ('id', 'title', 'organization', 'promo_type', 'long_text', 'short_text', 'overlay_image', 'target_link') + fields = '__all__' depth = 2 \ No newline at end of file diff --git a/events/views.py b/events/views.py index e9d7798..7b56242 100644 --- a/events/views.py +++ b/events/views.py @@ -30,19 +30,21 @@ class EventsAPIView(generics.ListAPIView): serializer_class = EventSerializer queryset = Event.objects.filter(show_date__gte=odt).order_by('show_date') filter_backends = [DjangoFilterBackend, filters.SearchFilter] - filterset_fields = ['show_title', 'event_type', 'venue__name', 'calendar__shortcode'] - search_fields = ['show_title', 'event_type', 'venue__name'] + filterset_fields = ['show_title', 'event_type', 'venue__name','show_day', 'calendar__shortcode',] + search_fields = ['show_title', 'event_type','show_day', 'venue__name', 'calendar__shortcode',] permission_classes = [HasAPIKey] class PromoAPIView(generics.ListAPIView): serializer_class = PromoSerializer + queryset = Promo.objects.filter(published=True) + filterset_fields = ['organization__name', 'calendar__shortcode',] + search_fields = ['organization__name', 'calendar__shortcode',] permission_classes = [HasAPIKey] def get_queryset(self): - promo_objects = list(Promo.objects.filter(published=True)) - print(len(promo_objects)) - queryset = random.sample(promo_objects, 21) + calendar = self.request.GET.get('calendar__shortcode') + queryset = Promo.objects.filter(published=True, calendar__shortcode=calendar).order_by('?') return queryset # class EventsTokenAPIView(APIAccessTokenView): diff --git a/socials/migrations/0011_sociallink_star.py b/socials/migrations/0011_sociallink_star.py new file mode 100644 index 0000000..6b7df4a --- /dev/null +++ b/socials/migrations/0011_sociallink_star.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.1 on 2025-10-17 21:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('socials', '0010_socialimg'), + ] + + operations = [ + migrations.AddField( + model_name='sociallink', + name='star', + field=models.BooleanField(default=0), + ), + ] diff --git a/socials/models.py b/socials/models.py index 2e086f2..5fbd2f8 100644 --- a/socials/models.py +++ b/socials/models.py @@ -60,6 +60,7 @@ class SocialLink(models.Model): published = models.BooleanField(default=0) pub_link = models.URLField(blank=True, null=True) + star = models.BooleanField(default=0) class Meta: unique_together = ("uri",)