lots of updates :/
This commit is contained in:
BIN
202511291306.sqlite.bak
Normal file
BIN
202511291306.sqlite.bak
Normal file
Binary file not shown.
BIN
baks/202511291301.sqlite.bak
Normal file
BIN
baks/202511291301.sqlite.bak
Normal file
Binary file not shown.
BIN
baks/202511291303.sqlite.bak
Normal file
BIN
baks/202511291303.sqlite.bak
Normal file
Binary file not shown.
@@ -19,6 +19,7 @@ INSTALLED_APPS = [
|
|||||||
"rest_framework_api_key",
|
"rest_framework_api_key",
|
||||||
'socials',
|
'socials',
|
||||||
'events',
|
'events',
|
||||||
|
'config',
|
||||||
# 'academia_nuts',
|
# 'academia_nuts',
|
||||||
# 'leg_info',
|
# '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.django.core import *
|
||||||
from config.settings.restframework import *
|
from config.settings.restframework import *
|
||||||
@@ -7,4 +7,13 @@ DEBUG = env.bool('DEBUG', default=True)
|
|||||||
ALLOWED_HOSTS=['localhost',]
|
ALLOWED_HOSTS=['localhost',]
|
||||||
CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS')
|
CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS')
|
||||||
# CORS_ALLOWED_ORIGINS=env.list('CORS_ALLOWED_ORIGINS')
|
# CORS_ALLOWED_ORIGINS=env.list('CORS_ALLOWED_ORIGINS')
|
||||||
CORS_ALLOWED_ORIGINS=['http://localhost:5173', 'https://digisnaxx.com']
|
|
||||||
|
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'
|
||||||
|
]
|
||||||
@@ -5,4 +5,14 @@ SECRET_KEY = env('SECRET_KEY')
|
|||||||
DEBUG = env.bool('DEBUG', default=False)
|
DEBUG = env.bool('DEBUG', default=False)
|
||||||
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
|
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
|
||||||
CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS')
|
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',
|
||||||
|
'https://www.digisnaxx.com',
|
||||||
|
'https://www.canincarlos.com',
|
||||||
|
'https://canincarlos.com',
|
||||||
|
'https://dreamfreely.org',
|
||||||
|
'https://www.dreamfreely.org'
|
||||||
|
]
|
||||||
@@ -13,13 +13,16 @@ class OrganizationAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
class EventAdmin(admin.ModelAdmin):
|
class EventAdmin(admin.ModelAdmin):
|
||||||
# prepopulated_fields = {"slug": ("shortname",)}
|
# prepopulated_fields = {"slug": ("shortname",)}
|
||||||
list_display = ( "show_title", "event_type", "show_date", "calendar")
|
list_display = ( "show_title", "event_type", "show_date", "scraper")
|
||||||
list_filter = ("calendar", "venue", "event_type",)
|
list_filter = ("calendar", "event_type", "scraper",)
|
||||||
|
|
||||||
class PromoAdmin(admin.ModelAdmin):
|
class PromoAdmin(admin.ModelAdmin):
|
||||||
# prepopulated_fields = {"slug": ("shortname",)}
|
# prepopulated_fields = {"slug": ("shortname",)}
|
||||||
list_display = ("title", "organization", "promo_type", "published")
|
list_display = ("title", "organization", "get_calendars", "published")
|
||||||
list_filter = ("promo_type",)
|
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.
|
# Register your models here.
|
||||||
|
|||||||
@@ -7,9 +7,6 @@ from lxml import html
|
|||||||
from pprint import pprint as ppr
|
from pprint import pprint as ppr
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../')
|
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
|
||||||
django.setup()
|
|
||||||
|
|
||||||
from xvfbwrapper import Xvfb
|
from xvfbwrapper import Xvfb
|
||||||
from selenium import webdriver as wd
|
from selenium import webdriver as wd
|
||||||
@@ -21,12 +18,20 @@ td = relativedelta.relativedelta(months=1)
|
|||||||
odt = datetime.now() + td
|
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:
|
try:
|
||||||
scraper, created = Scraper.objects.get_or_create(
|
scraper, created = Scraper.objects.get_or_create(
|
||||||
name=venue.name,
|
name=venue.name,
|
||||||
website=venue.website,
|
website=venue.website,
|
||||||
calendar = Calendar.objects.get(id=1),
|
calendar = Calendar.objects.get(shortcode=cal),
|
||||||
items = 0,
|
items = 0,
|
||||||
new_items = 0,
|
new_items = 0,
|
||||||
last_ran = datetime.now(),
|
last_ran = datetime.now(),
|
||||||
@@ -39,7 +44,7 @@ def getScraper(venue):
|
|||||||
scraper.save()
|
scraper.save()
|
||||||
print("Scraper: ", scraper)
|
print("Scraper: ", scraper)
|
||||||
pass
|
pass
|
||||||
return scraper, scraper.items
|
return scraper, scraper.items, virtcal
|
||||||
|
|
||||||
def updateScraper(scraper, item_count_start):
|
def updateScraper(scraper, item_count_start):
|
||||||
num_of_events = DSEvent.objects.filter(scraper=scraper)
|
num_of_events = DSEvent.objects.filter(scraper=scraper)
|
||||||
@@ -143,6 +148,25 @@ def createDashURL(site_url):
|
|||||||
print(links)
|
print(links)
|
||||||
return 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):
|
def createBasicEvent(event, event_type, venue):
|
||||||
new_event, created = DSEvent.objects.update_or_create(
|
new_event, created = DSEvent.objects.update_or_create(
|
||||||
event_type = event_type,
|
event_type = event_type,
|
||||||
@@ -150,26 +174,23 @@ def createBasicEvent(event, event_type, venue):
|
|||||||
show_link = event['link'],
|
show_link = event['link'],
|
||||||
show_date = event['dateStamp'],
|
show_date = event['dateStamp'],
|
||||||
show_day = event['dateStamp'],
|
show_day = event['dateStamp'],
|
||||||
calendar = event['calendar'],
|
|
||||||
scraper = event['scraper'],
|
scraper = event['scraper'],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
|
new_event = add_calendars(new_event, event)
|
||||||
return new_event, created
|
return new_event, created
|
||||||
|
|
||||||
def createBasiciCalEvent(event, event_type, venue):
|
def createBasiciCalEvent(event, event_type, venue):
|
||||||
print("starting create")
|
|
||||||
ppr(event)
|
|
||||||
new_event, created = DSEvent.objects.update_or_create(
|
new_event, created = DSEvent.objects.update_or_create(
|
||||||
event_type = event_type,
|
event_type = event_type,
|
||||||
show_title = event['title'][0],
|
show_title = event['title'][0],
|
||||||
show_link = event['link'],
|
show_link = event['link'],
|
||||||
show_date = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S'),
|
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'),
|
show_day = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S'),
|
||||||
calendar = event['calendar'],
|
|
||||||
scraper = event['scraper'],
|
scraper = event['scraper'],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
print("created")
|
new_event = add_calendars(new_event, event)
|
||||||
return new_event, created
|
return new_event, created
|
||||||
|
|
||||||
def createDetailedEvent(event, event_type, venue, scraper):
|
def createDetailedEvent(event, event_type, venue, scraper):
|
||||||
@@ -178,13 +199,13 @@ def createDetailedEvent(event, event_type, venue, scraper):
|
|||||||
show_title = event["show_title"],
|
show_title = event["show_title"],
|
||||||
show_link = event["link"],
|
show_link = event["link"],
|
||||||
show_date = event["dateStamp"],
|
show_date = event["dateStamp"],
|
||||||
show_day = event["dateStamp"],
|
show_day = event['dateStamp'],
|
||||||
guests = " ".join(event["guests"]),
|
guests = " ".join(event["guests"]),
|
||||||
more_details = event["details"],
|
more_details = event["details"],
|
||||||
calendar = event['calendar'],
|
|
||||||
scraper = event['scraper'],
|
scraper = event['scraper'],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
|
new_event = add_calendars(new_event, event)
|
||||||
return new_event, created
|
return new_event, created
|
||||||
|
|
||||||
def createBasicArticle(article, event_type, organization):
|
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['date'] = str(new_date)[:-6],
|
||||||
new_event['dateStamp'] = str(new_date)[:-6],
|
new_event['dateStamp'] = str(new_date)[:-6],
|
||||||
new_event['link'] = venue.website
|
new_event['link'] = venue.website
|
||||||
|
print("NEW iCal Event")
|
||||||
|
ppr(new_event)
|
||||||
createBasiciCalEvent(new_event, event_type, venue)
|
createBasiciCalEvent(new_event, event_type, venue)
|
||||||
|
|
||||||
def createCleanIcalEvent(event, scraper, venue, event_type):
|
def createCleanIcalEvent(event, scraper, venue, event_type):
|
||||||
new_date = event['dateStart']
|
new_date = event['dateStart']
|
||||||
new_event = {}
|
new_event = {}
|
||||||
new_event['scraper'] = scraper
|
new_event['scraper'] = scraper
|
||||||
new_event['calendar'] = scraper.calendar
|
new_event['calendars'] = scraper.calendar
|
||||||
new_event['title'] = event['strSummary'],
|
new_event['title'] = event['strSummary'],
|
||||||
new_event['date'] = str(new_date),
|
new_event['date'] = str(new_date),
|
||||||
new_event['dateStamp'] = str(new_date),
|
new_event['dateStamp'] = str(new_date),
|
||||||
new_event['link'] = venue.website
|
new_event['link'] = venue.website
|
||||||
createBasiciCalEvent(new_event, event_type, venue)
|
createBasiciCalEvent(new_event, event_type, venue)
|
||||||
|
|
||||||
def getiCalEvents(gcal, scraper, venue):
|
def getiCalEvents(gcal, scraper, venue, event_type):
|
||||||
|
events = []
|
||||||
for component in gcal.walk():
|
for component in gcal.walk():
|
||||||
event = {}
|
event = {}
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['strSummary'] = f"{(component.get('SUMMARY'))}"
|
event['strSummary'] = f"{(component.get('SUMMARY'))}"
|
||||||
event['strDesc'] = component.get('DESCRIPTION')
|
event['strDesc'] = component.get('DESCRIPTION')
|
||||||
event['strLocation'] = component.get('LOCATION')
|
event['strLocation'] = component.get('LOCATION')
|
||||||
@@ -247,17 +271,58 @@ def getiCalEvents(gcal, scraper, venue):
|
|||||||
"description" : event['strDesc'],
|
"description" : event['strDesc'],
|
||||||
"Location" : event['strLocation'],
|
"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:
|
try:
|
||||||
print("1Event: ", event['dateStart'])
|
event['dateStart'] = event['dateStart'].dt
|
||||||
if event['dateStart'] > now_now:
|
|
||||||
createIcalEvent(event, scraper, venue)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
try:
|
event['dateStart'] = event['dateStart'].dt
|
||||||
event['dateStart'] = event['dateStart'].date()
|
|
||||||
print("1Event: ", event['dateStart'])
|
event['dateEnd'] = (component.get('DTEND'))
|
||||||
if event['dateStart'] > now_now:
|
if event['dateEnd'] is not None:
|
||||||
createIcalEvent(event, scraper, venue)
|
event['dateEnd'] = event['dateEnd'].dt
|
||||||
except Exception as e:
|
else:
|
||||||
print("The Error: ", e)
|
event['dateEnd'] = event['dateStart']
|
||||||
pass
|
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
|
||||||
38
events/fixtures/calendars.json
Normal file
38
events/fixtures/calendars.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
994
events/fixtures/orgs.json
Normal file
994
events/fixtures/orgs.json
Normal file
@@ -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": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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": "<p>Alright, I guess this is it. This is the game, these are the plays.</p>\r\n\r\n<p>Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.</p>",
|
|
||||||
"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": "<p>These are all products from my travels.</p>\r\n<p>From hand-woven mochilas, to organic mountain farmed coffee and panela and more.</p>\r\n<p>All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.</p>",
|
|
||||||
"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.<br/><br/>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": "<p>These are all products from my travels.</p>\r\n<p>From hand-woven mochilas, to organic mountain farmed coffee and panela and more.</p>\r\n<p>All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.</p>",
|
|
||||||
"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": "<p>Alright, I guess this is it. This is the game, these are the plays.</p>\r\n\r\n<p>Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.</p>",
|
|
||||||
"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": "<p>After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.</p>\r\n<p>Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.</p>\r\n<p>DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.</p>\r\n</p>We're not trying to be everything either ...</p>\r\n<p>We're trying to be an accessible, community-centered, directory.</p>",
|
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/4V3V9lAS4FRz7apdfj1qsV?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
|
||||||
"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": "<p>After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.</p>\r\n<p>Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.</p>\r\n<p>DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.</p>\r\n</p>We're not trying to be everything either ...</p>\r\n<p>We're trying to be an accessible, community-centered, directory.</p>",
|
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/2gdzy6TjXd3QEj8WRSeZSD?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
|
||||||
"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<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shr3SATN1OTsY47it' frameborder='0' onmousewheel='' width='100%' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/2gdzy6TjXd3QEj8WRSeZSD?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
|
||||||
"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": "<p>Just covering the basics, we'll be hosting webinars.</p>\r\n<p>HTML, CSS, JavaScript & Python.</p>",
|
|
||||||
"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": "<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
|
||||||
"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": "<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
|
||||||
"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<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shr3SATN1OTsY47it' frameborder='0' onmousewheel='' width='100%' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
|
||||||
"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": "<p>Just covering the basics, we'll be hosting webinars.</p>\r\n<p>HTML, CSS, JavaScript & Python.</p>",
|
|
||||||
"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": "<p>These are all products from my travels.</p>\r\n<p>From hand-woven mochilas, to organic mountain farmed coffee and panela and more.</p>\r\n<p>All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.</p>",
|
|
||||||
"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": "<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/4V3V9lAS4FRz7apdfj1qsV?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
|
||||||
"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<br/><br/>\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<br/><br/>\r\nCome see what makes us different. At Saint Wich Burgers, it's all about great burgers, good times, and lasting memories.\r\n<br/><br/>\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<br/><br/>\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": "<b>“The Player’s Store”</b>\r\n<br/><br/>\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<br/><br/>\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<br/><br/>\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<br/><br/>\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<br/><br/>\r\nWinner of “Star Tribune’s Readers Choice Best of”\r\nBest Music Instrument Shop\r\n<br/><br/>\r\n2021 – SILVER! 2023 – SILVER!\r\n<br/>\r\n2022 – GOLD 2024 GOLD!!!!",
|
|
||||||
"target_link": "https://vigguitarshop.com/",
|
|
||||||
"notes": "",
|
|
||||||
"published": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,452 +1,611 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 1,
|
"pk": 1,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "DreamFreely",
|
"title": "Santa Elena",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Jo",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "promo/SOL_Sign.png",
|
"overlay_image": "promo/pa_cover.jpg",
|
||||||
"short_text": "And intro to the operation.",
|
"short_text": "The perfect weekend getaway.",
|
||||||
"long_text": "<p>Alright, I guess this is it. This is the game, these are the plays.</p>\r\n\r\n<p>Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.</p>",
|
"long_text": "<p>Welcome to Santa Elena.</p>",
|
||||||
"target_link": "https://www.dreamfreely.org",
|
"target_link": "https://www.dreamfreely.org",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 2,
|
"pk": 2,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Comuna Andina",
|
"title": "Medellin Run Club",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Fo",
|
||||||
"overlay_image": "promo/pa_cover.jpg",
|
"overlay_image": "promo/pa_cover.jpg",
|
||||||
"short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.",
|
"short_text": "Every Sunday: 8am",
|
||||||
"long_text": "<p>These are all products from my travels.</p>\r\n<p>From hand-woven mochilas, to organic mountain farmed coffee and panela and more.</p>\r\n<p>All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.</p>",
|
"long_text": "<p>Get your exercise on!</p>",
|
||||||
"target_link": "https://www.comunandina.com",
|
"target_link": "https://www.instagram.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 3,
|
"pk": 3,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "idioke",
|
"title": "Manifesting Empathy",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Ev",
|
"promo_type": "Fo",
|
||||||
"overlay_image": "promo/soltoken.png",
|
"overlay_image": "promo/manifestingempathy.png",
|
||||||
"short_text": "We're starting with English, but soon you will be able to practice Spanish as well.",
|
"short_text": "Help humans find their roots.",
|
||||||
"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.",
|
"long_text": "Help humans find their roots.",
|
||||||
"target_link": "https://www.idioke.com",
|
"target_link": "https://www.manifestingempathy.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 4,
|
"pk": 4,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Manifesting Empathy",
|
"title": "DreamFreely",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/manifestingempathy.png",
|
"overlay_image": "promo/SOL_Sign.png",
|
||||||
"short_text": "Help humans find their roots.",
|
"short_text": "And intro to the operation.",
|
||||||
"long_text": "Help humans find their roots.",
|
"long_text": "<p>Alright, I guess this is it. This is the game, these are the plays.</p>\r\n\r\n<p>Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.</p>",
|
||||||
"target_link": "https://www.manifestingempathy.com",
|
"target_link": "https://www.dreamfreely.org",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 5,
|
"pk": 5,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "AI & the Last Question",
|
"title": "Manifesting Empathy",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "promo/cover.png",
|
"overlay_image": "promo/manifestingempathy.png",
|
||||||
"short_text": "A short story by Isaac Asimov",
|
"short_text": "Help humans find their roots.",
|
||||||
"long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov",
|
"long_text": "Help humans find their roots.",
|
||||||
"target_link": "https://canin.dreamfreely.org/the-last-question/",
|
"target_link": "https://www.manifestingempathy.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 6,
|
"pk": 6,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "AI & the Last Question",
|
"title": "DigiSnaxx & the DBC",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "promo/cover.png",
|
"overlay_image": "promo/cover.png",
|
||||||
"short_text": "A short story by Isaac Asimov",
|
"short_text": "More info about the project DigiSnaxx.",
|
||||||
"long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov",
|
"long_text": "<p>After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.</p>\r\n<p>Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.</p>\r\n<p>DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.</p>\r\n</p>We're not trying to be everything either ...</p>\r\n<p>We're trying to be an accessible, community-centered, directory.</p>",
|
||||||
"target_link": "https://canin.dreamfreely.org/the-last-question/",
|
"target_link": "https://canin.dreamfreely.org/digisnaxx/",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 7,
|
"pk": 7,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "idioke",
|
"title": "DigiSnaxx & the DBC",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Ev",
|
"promo_type": "Fo",
|
||||||
"overlay_image": "promo/soltoken.png",
|
"overlay_image": "promo/cover.png",
|
||||||
"short_text": "We're starting with English, but soon you will be able to practice Spanish as well.",
|
"short_text": "More info about the project DigiSnaxx.",
|
||||||
"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.",
|
"long_text": "<p>After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.</p>\r\n<p>Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.</p>\r\n<p>DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.</p>\r\n</p>We're not trying to be everything either ...</p>\r\n<p>We're trying to be an accessible, community-centered, directory.</p>",
|
||||||
"target_link": "https://www.idioke.com",
|
"target_link": "https://canin.dreamfreely.org/digisnaxx/",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 8,
|
"pk": 8,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "AI & the Last Question",
|
"title": "Mpls Stp Mag Calendar",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "promo/cover.png",
|
"overlay_image": "",
|
||||||
"short_text": "A short story by Isaac Asimov",
|
"short_text": "They got a great list of events.",
|
||||||
"long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov",
|
"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://canin.dreamfreely.org/the-last-question/",
|
"target_link": "https://calendar.mspmag.com/calendars/all-events",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 9,
|
"pk": 9,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Comuna Andina",
|
"title": "DreamFreely",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Ev",
|
"promo_type": "Jo",
|
||||||
"overlay_image": "promo/pa_cover.jpg",
|
"overlay_image": "promo/SOL_Sign.png",
|
||||||
"short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.",
|
"short_text": "And intro to the operation.",
|
||||||
"long_text": "<p>These are all products from my travels.</p>\r\n<p>From hand-woven mochilas, to organic mountain farmed coffee and panela and more.</p>\r\n<p>All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.</p>",
|
"long_text": "<p>Alright, I guess this is it. This is the game, these are the plays.</p>\r\n\r\n<p>Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.</p>",
|
||||||
"target_link": "https://www.comunandina.com",
|
"target_link": "https://www.dreamfreely.org",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 10,
|
"pk": 10,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "DreamFreely",
|
"title": "idioki",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "promo/SOL_Sign.png",
|
"overlay_image": "promo/soltoken.png",
|
||||||
"short_text": "And intro to the operation.",
|
"short_text": "We're starting with English, but soon you will be able to practice Spanish as well.",
|
||||||
"long_text": "<p>Alright, I guess this is it. This is the game, these are the plays.</p>\r\n\r\n<p>Lots of work, for sure; but it's a blessing to help people. Now to continue to expand the support and stability.</p>",
|
"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.dreamfreely.org",
|
"target_link": "https://www.idioke.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 11,
|
"pk": 11,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Manifesting Empathy",
|
"title": "Talkin' w/ DiViNCi",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Ev",
|
"promo_type": "Fo",
|
||||||
"overlay_image": "promo/manifestingempathy.png",
|
"overlay_image": "promo/soltoken.png",
|
||||||
"short_text": "Help humans find their roots.",
|
"short_text": "Canin converses with DiViNCi.",
|
||||||
"long_text": "Help humans find their roots.",
|
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/2gdzy6TjXd3QEj8WRSeZSD?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
||||||
"target_link": "https://www.manifestingempathy.com",
|
"target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 12,
|
"pk": 12,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "DigiSnaxx & the DBC",
|
"title": "Vigs Guitars",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Ev",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/cover.png",
|
"overlay_image": "promo/VigGuitarsLogo.sm.jpg",
|
||||||
"short_text": "More info about the project DigiSnaxx.",
|
"short_text": "A luthier-owned music shop.",
|
||||||
"long_text": "<p>After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.</p>\r\n<p>Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.</p>\r\n<p>DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.</p>\r\n</p>We're not trying to be everything either ...</p>\r\n<p>We're trying to be an accessible, community-centered, directory.</p>",
|
"long_text": "<b>“The Player’s Store”</b>\r\n<br/><br/>\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<br/><br/>\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<br/><br/>\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<br/><br/>\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<br/><br/>\r\nWinner of “Star Tribune’s Readers Choice Best of”\r\nBest Music Instrument Shop\r\n<br/><br/>\r\n2021 – SILVER! 2023 – SILVER!\r\n<br/>\r\n2022 – GOLD 2024 GOLD!!!!",
|
||||||
"target_link": "https://canin.dreamfreely.org/digisnaxx/",
|
"target_link": "https://vigguitarshop.com/",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": false,
|
||||||
|
"calendar": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 13,
|
"pk": 13,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Complimentary Street Harrassment",
|
"title": "Add an Event",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "An",
|
"promo_type": "Re",
|
||||||
"overlay_image": "",
|
"overlay_image": "",
|
||||||
"short_text": "It's cultural right?",
|
"short_text": "Got an event for us?",
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/4V3V9lAS4FRz7apdfj1qsV?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
"long_text": "Let's take a look.\r\n\r\n<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
||||||
"target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d",
|
"target_link": null,
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 14,
|
"pk": 14,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "DigiSnaxx & the DBC",
|
"title": "Add a Calendar",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/cover.png",
|
"overlay_image": "",
|
||||||
"short_text": "More info about the project DigiSnaxx.",
|
"short_text": "Got a calendar for us?",
|
||||||
"long_text": "<p>After seeing the City Pages fall down the drain, followed by the dissolution of the MetroIBA.</p>\r\n<p>Anywho, it's time for something different, and that's what DigiSnaxx and DreamFreely is all about.</p>\r\n<p>DigiSnaxx is not trying to replace either of the aforementioned entities; we are rather looking to be an evolution, of sorts.</p>\r\n</p>We're not trying to be everything either ...</p>\r\n<p>We're trying to be an accessible, community-centered, directory.</p>",
|
"long_text": "Let's take a look.\r\n\r\n<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
||||||
"target_link": "https://canin.dreamfreely.org/digisnaxx/",
|
"target_link": null,
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 15,
|
"pk": 15,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "DreamFreely Library",
|
"title": "idioki",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "",
|
"overlay_image": "promo/soltoken.png",
|
||||||
"short_text": "It's like having an open notebook ...",
|
"short_text": "We're starting with English, but soon you will be able to practice Spanish as well.",
|
||||||
"long_text": "It's a work in progress, but you get the idea; and there's still some useful information.",
|
"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://library.dreamfreely.org",
|
"target_link": "https://www.idioke.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 16,
|
"pk": 16,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Talkin' w/ DiViNCi",
|
"title": "Rebel Coding",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/soltoken.png",
|
"overlay_image": "",
|
||||||
"short_text": "Canin converses with DiViNCi.",
|
"short_text": "Enough knowledge to be dangerous.",
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/2gdzy6TjXd3QEj8WRSeZSD?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
"long_text": "<p>Just covering the basics, we'll be hosting webinars.</p>\r\n<p>HTML, CSS, JavaScript & Python.</p>",
|
||||||
"target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v",
|
"target_link": "https://www.rebelcoding.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 17,
|
"pk": 17,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Mpls Stp Mag Calendar",
|
"title": "idioki",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Ev",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "",
|
"overlay_image": "promo/soltoken.png",
|
||||||
"short_text": "They got a great list of events.",
|
"short_text": "We're starting with English, but soon you will be able to practice Spanish as well.",
|
||||||
"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.",
|
"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://calendar.mspmag.com/calendars/all-events",
|
"target_link": "https://www.idioke.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"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<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
||||||
|
"target_link": null,
|
||||||
|
"notes": "",
|
||||||
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 19,
|
"pk": 19,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Academia Nuts",
|
"title": "Complimentary Street Harrassment",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "An",
|
||||||
"overlay_image": "promo/SOL_Sign.png",
|
"overlay_image": "",
|
||||||
"short_text": "Abstacts coming soon; gotta catch 'em all.",
|
"short_text": "It's cultural right?",
|
||||||
"long_text": "I've always wanted to make academia more accessible, so here's my go at that!\r\n\r\n<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shr3SATN1OTsY47it' frameborder='0' onmousewheel='' width='100%' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/4V3V9lAS4FRz7apdfj1qsV?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
||||||
"target_link": "https://www.academianuts.net",
|
"target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 20,
|
"pk": 20,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Talkin' w/ DiViNCi",
|
"title": "Saint Wich Burgers",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Fo",
|
||||||
"overlay_image": "promo/soltoken.png",
|
"overlay_image": "promo/soltoken.png",
|
||||||
"short_text": "Canin converses with DiViNCi.",
|
"short_text": "Serving handcrafted gourmet burgers made with love.",
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/2gdzy6TjXd3QEj8WRSeZSD?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
"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<br/><br/>\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<br/><br/>\r\nCome see what makes us different. At Saint Wich Burgers, it's all about great burgers, good times, and lasting memories.\r\n<br/><br/>\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<br/><br/>\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://creators.spotify.com/pod/show/digisnaxx/episodes/DiViNCi-egm90v",
|
"target_link": "https://www.stwichburgers.com/",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": false,
|
||||||
|
"calendar": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 21,
|
"pk": 21,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Rebel Coding",
|
"title": "idioki",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Ev",
|
||||||
"overlay_image": "",
|
"overlay_image": "promo/soltoken.png",
|
||||||
"short_text": "Enough knowledge to be dangerous.",
|
"short_text": "We're starting with English, but soon you will be able to practice Spanish as well.",
|
||||||
"long_text": "<p>Just covering the basics, we'll be hosting webinars.</p>\r\n<p>HTML, CSS, JavaScript & Python.</p>",
|
"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.rebelcoding.com",
|
"target_link": "https://www.idioke.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 22,
|
"pk": 22,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Add a Calendar",
|
"title": "Rebel Coding",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Re",
|
||||||
"overlay_image": "",
|
"overlay_image": "",
|
||||||
"short_text": "Got a calendar for us?",
|
"short_text": "Enough knowledge to be dangerous.",
|
||||||
"long_text": "<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
"long_text": "<p>Just covering the basics, we'll be hosting webinars.</p>\r\n<p>HTML, CSS, JavaScript & Python.</p>",
|
||||||
"target_link": "",
|
"target_link": "https://www.rebelcoding.com",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 23,
|
"pk": 23,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Add a Calendar",
|
"title": "Add an Event",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Re",
|
||||||
"overlay_image": "",
|
"overlay_image": "",
|
||||||
"short_text": "Got a calendar for us?",
|
"short_text": "Got an event for us?",
|
||||||
"long_text": "<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
"long_text": "Let's take a look.\r\n\r\n<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
||||||
"target_link": "",
|
"target_link": null,
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 24,
|
"pk": 24,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Academia Nuts",
|
"title": "Add a Calendar",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/SOL_Sign.png",
|
"overlay_image": "",
|
||||||
"short_text": "Abstacts coming soon; gotta catch 'em all.",
|
"short_text": "Got a calendar for us?",
|
||||||
"long_text": "I've always wanted to make academia more accessible, so here's my go at that!\r\n\r\n<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shr3SATN1OTsY47it' frameborder='0' onmousewheel='' width='100%' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
"long_text": "Let's take a look.\r\n\r\n<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
||||||
"target_link": "https://www.academianuts.net",
|
"target_link": null,
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 25,
|
"pk": 25,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Rebel Coding",
|
"title": "Add an Event",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Re",
|
||||||
"overlay_image": "",
|
"overlay_image": "",
|
||||||
"short_text": "Enough knowledge to be dangerous.",
|
"short_text": "Got an event for us?",
|
||||||
"long_text": "<p>Just covering the basics, we'll be hosting webinars.</p>\r\n<p>HTML, CSS, JavaScript & Python.</p>",
|
"long_text": "Let's take a look.\r\n\r\n<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
||||||
"target_link": "https://www.rebelcoding.com",
|
"target_link": null,
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 26,
|
"pk": 26,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Comuna Andina",
|
"title": "DreamFreely Library",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/pa_cover.jpg",
|
"overlay_image": "",
|
||||||
"short_text": "Authentic products from the Andes Mountains and surrounding regions, mochilas, cafe y panella.",
|
"short_text": "It's like having an open notebook ...",
|
||||||
"long_text": "<p>These are all products from my travels.</p>\r\n<p>From hand-woven mochilas, to organic mountain farmed coffee and panela and more.</p>\r\n<p>All of these products are direct from the producer, while nearly all proceeds are also returned to the producer.</p>",
|
"long_text": "It's a work in progress, but you get the idea; and there's still some useful information.",
|
||||||
"target_link": "https://www.comunandina.com",
|
"target_link": "https://library.dreamfreely.org",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 27,
|
"pk": 27,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Add a Calendar",
|
"title": "AI & the Last Question",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Re",
|
||||||
"overlay_image": "",
|
"overlay_image": "promo/cover.png",
|
||||||
"short_text": "Got a calendar for us?",
|
"short_text": "A short story by Isaac Asimov",
|
||||||
"long_text": "<iframe class='airtable-embed' src='https://airtable.com/embed/appzQxsifc8AnD1zA/shrfUvOiFdaHI8xoz' frameborder='0' onmousewheel='' width='100%'' height='533' style='background: transparent; border: 1px solid #ccc;'></iframe>",
|
"long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov",
|
||||||
"target_link": "",
|
"target_link": "https://canin.dreamfreely.org/the-last-question/",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 28,
|
"pk": 28,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Complimentary Street Harrassment",
|
"title": "DreamFreely Library",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "An",
|
"promo_type": "Re",
|
||||||
"overlay_image": "",
|
"overlay_image": "",
|
||||||
"short_text": "It's cultural right?",
|
"short_text": "It's like having an open notebook ...",
|
||||||
"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<iframe style='border-radius:12px' src='https://open.spotify.com/embed/episode/4V3V9lAS4FRz7apdfj1qsV?utm_source=generator' width='100%' height='352' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe>",
|
"long_text": "It's a work in progress, but you get the idea; and there's still some useful information.",
|
||||||
"target_link": "https://creators.spotify.com/pod/show/digisnaxx/episodes/Complimentary-Street-Harassment-et9h5d",
|
"target_link": "https://library.dreamfreely.org",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": true
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 29,
|
"pk": 29,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Saint Wich Burgers",
|
"title": "AI & the Last Question",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Fo",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/soltoken.png",
|
"overlay_image": "promo/cover.png",
|
||||||
"short_text": "Serving handcrafted gourmet burgers made with love.",
|
"short_text": "A short story by Isaac Asimov",
|
||||||
"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<br/><br/>\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<br/><br/>\r\nCome see what makes us different. At Saint Wich Burgers, it's all about great burgers, good times, and lasting memories.\r\n<br/><br/>\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<br/><br/>\r\nOur atmosphere is laid-back, our service is friendly, and our burgers are unforgettable. Stop by today and taste what makes us different!",
|
"long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov",
|
||||||
"target_link": "https://www.stwichburgers.com/",
|
"target_link": "https://canin.dreamfreely.org/the-last-question/",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": false
|
"published": true,
|
||||||
|
"calendar": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"tags": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "events.promo",
|
"model": "events.promo",
|
||||||
"pk": 30,
|
"pk": 30,
|
||||||
"fields": {
|
"fields": {
|
||||||
"title": "Arepas, Las de Queso",
|
"title": "AI & the Last Question",
|
||||||
"organization": 1,
|
"organization": 1,
|
||||||
"promo_type": "Re",
|
"promo_type": "Re",
|
||||||
"overlay_image": "promo/SOL_Sign.png",
|
"overlay_image": "promo/cover.png",
|
||||||
"short_text": "If you're lookin' for the tastiest arepa in Medellin.",
|
"short_text": "A short story by Isaac Asimov",
|
||||||
"long_text": "For those who may travel, check out my friends :)",
|
"long_text": "A short story by Isaac AsimovA short story by Isaac AsimovA short story by Isaac Asimov",
|
||||||
"target_link": "https://www.dreamfreely.org",
|
"target_link": "https://canin.dreamfreely.org/the-last-question/",
|
||||||
"notes": "",
|
"notes": "",
|
||||||
"published": false
|
"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": "<b>“The Player’s Store”</b>\r\n<br/><br/>\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<br/><br/>\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<br/><br/>\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<br/><br/>\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<br/><br/>\r\nWinner of “Star Tribune’s Readers Choice Best of”\r\nBest Music Instrument Shop\r\n<br/><br/>\r\n2021 – SILVER! 2023 – SILVER!\r\n<br/>\r\n2022 – GOLD 2024 GOLD!!!!",
|
|
||||||
"target_link": "https://vigguitarshop.com/",
|
|
||||||
"notes": "",
|
|
||||||
"published": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -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}}]
|
|
||||||
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
18
events/migrations/0033_alter_event_show_date.py
Normal file
18
events/migrations/0033_alter_event_show_date.py
Normal file
@@ -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(),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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(),
|
||||||
|
),
|
||||||
|
]
|
||||||
18
events/migrations/0035_organization_is_listed.py
Normal file
18
events/migrations/0035_organization_is_listed.py
Normal file
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -50,16 +50,14 @@ class Tags(models.Model):
|
|||||||
class Organization(models.Model):
|
class Organization(models.Model):
|
||||||
MEMBER_TYPE = (
|
MEMBER_TYPE = (
|
||||||
('Nm', 'Non-Member'),
|
('Nm', 'Non-Member'),
|
||||||
('Na', 'Nano Member'),
|
('Ds', 'DigiSnaxx'),
|
||||||
('Mm', 'Micro Member'),
|
('Dsp', 'DigiSnaxx +')
|
||||||
('Sm', 'Small Business Member'),
|
|
||||||
('Lb', 'Local Business Member'),
|
|
||||||
('Rb', 'Regional Business Member'),
|
|
||||||
)
|
)
|
||||||
ORG_TYPE = (
|
ORG_TYPE = (
|
||||||
('Fo', 'Food'),
|
('Fb', 'Food & Beverage'),
|
||||||
('Re', 'Retail'),
|
('Re', 'Retail'),
|
||||||
('Se', 'Service'),
|
('Se', 'Service'),
|
||||||
|
('Vn', 'Venue'),
|
||||||
('Ud', 'Undefined'),
|
('Ud', 'Undefined'),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -72,7 +70,12 @@ class Organization(models.Model):
|
|||||||
long_desc = models.TextField(blank=True, null=True)
|
long_desc = models.TextField(blank=True, null=True)
|
||||||
tags = models.ManyToManyField(Tags, blank=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)
|
city = models.CharField(max_length=31, blank=True, null=True)
|
||||||
state = models.CharField(max_length=15, 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)
|
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)
|
phone_number = models.CharField(max_length=255, blank=True, null=True)
|
||||||
business_email = models.CharField(max_length=63, 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_501c = models.BooleanField(default=False)
|
||||||
|
is_venue= models.BooleanField(default=False)
|
||||||
|
|
||||||
latitude = models.FloatField()
|
latitude = models.FloatField(blank=True, null=True)
|
||||||
longitude = models.FloatField()
|
longitude = models.FloatField(blank=True, null=True)
|
||||||
|
|
||||||
contact_name = models.CharField(max_length=63, 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)
|
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_title = models.CharField(max_length=127, blank=True, null=True)
|
||||||
show_link = models.URLField(blank=True, null=True)
|
show_link = models.URLField(blank=True, null=True)
|
||||||
show_date = models.DateTimeField()
|
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)
|
scraper = models.ForeignKey(Scraper, on_delete=models.CASCADE, null=True)
|
||||||
venue = models.ForeignKey(Organization, on_delete=models.CASCADE)
|
venue = models.ForeignKey(Organization, on_delete=models.CASCADE)
|
||||||
|
|
||||||
@@ -157,27 +162,26 @@ class Promo(models.Model):
|
|||||||
('Fo', 'Food'),
|
('Fo', 'Food'),
|
||||||
('Ev', 'Event'),
|
('Ev', 'Event'),
|
||||||
('Re', 'Retail'),
|
('Re', 'Retail'),
|
||||||
|
('Sv', 'Service'),
|
||||||
('Ma', 'Mutual Aid'),
|
('Ma', 'Mutual Aid'),
|
||||||
('Ca', 'Classifieds'),
|
('Ca', 'Classified'),
|
||||||
('Jo', 'Job Opening'),
|
('Jo', 'Job Opening'),
|
||||||
('Sp', 'Startup Pitch'),
|
|
||||||
('An', 'Academia Nuts'),
|
|
||||||
('Ja', 'Journal Article'),
|
('Ja', 'Journal Article'),
|
||||||
('Su', 'Survey Questions')
|
('Sp', 'Startup Pitch'),
|
||||||
|
('An', 'Academia Nut'),
|
||||||
|
('Su', 'Survey Question')
|
||||||
)
|
)
|
||||||
|
|
||||||
title = models.CharField(max_length=63)
|
title = models.CharField(max_length=63)
|
||||||
organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
|
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')
|
promo_type = models.CharField(max_length=15, choices=PROMO_TYPE, default='0')
|
||||||
overlay_image = models.ImageField(upload_to="overlays", blank=True)
|
overlay_image = models.ImageField(upload_to="overlays", blank=True)
|
||||||
classified_image = models.ImageField(upload_to="classifieds", blank=True)
|
short_text = models.CharField(max_length=255,blank=True, null=True)
|
||||||
embed_link = models.CharField(max_length=126, blank=True, null=True)
|
|
||||||
short_text = models.TextField(blank=True, null=True)
|
|
||||||
long_text = models.TextField(blank=True, null=True)
|
long_text = models.TextField(blank=True, null=True)
|
||||||
target_link = models.URLField(blank=True, null=True)
|
target_link = models.URLField(blank=True, null=True)
|
||||||
notes = models.TextField(blank=True, null=True)
|
notes = models.TextField(blank=True, null=True)
|
||||||
published = models.BooleanField(default=False)
|
published = models.BooleanField(default=False)
|
||||||
|
|
||||||
tags = models.ManyToManyField(Tags, blank=True)
|
tags = models.ManyToManyField(Tags, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -18,14 +18,16 @@ from xvfbwrapper import Xvfb
|
|||||||
from lxml import html
|
from lxml import html
|
||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
from events.models import Event, Organization, Scraper
|
from events.models import Event, Organization, Scraper, Calendar
|
||||||
from events.digitools import getBrowser, createURL, createBasicEvent, getSource
|
from events.digitools import getBrowser, createURL, createBasicEvent, getSource, add_calendar
|
||||||
|
|
||||||
try:
|
try:
|
||||||
scraper, created = Scraper.objects.get_or_create(
|
scraper, created = Scraper.objects.get_or_create(
|
||||||
name="MN Legislature",
|
name="MN Legislature",
|
||||||
website="https://www.leg.mn.gov/cal?type=all",
|
website="https://www.leg.mn.gov/cal?type=all",
|
||||||
|
calendar = Calendar.objects.get(shortcode='msp'),
|
||||||
items = 0,
|
items = 0,
|
||||||
|
new_items = 0,
|
||||||
last_ran = datetime.now(),
|
last_ran = datetime.now(),
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -48,7 +50,7 @@ else:
|
|||||||
quit()
|
quit()
|
||||||
|
|
||||||
br.get(calendar_url)
|
br.get(calendar_url)
|
||||||
sleep(60)
|
sleep(10)
|
||||||
ps = html.fromstring(br.page_source)
|
ps = html.fromstring(br.page_source)
|
||||||
|
|
||||||
commEvents = ps.xpath('.//*/div[@class="card border-dark comm_item cal_item ml-lg-3"]')
|
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'])
|
# print(dateTime, title, link, details['location'])
|
||||||
venue, created = Organization.objects.get_or_create(name="MN House", city="St. Paul")
|
venue, created = Organization.objects.get_or_create(name="MN House", city="St. Paul")
|
||||||
new_event, created = Event.objects.update_or_create(
|
new_event, created = Event.objects.update_or_create(
|
||||||
calendar = 'msp'
|
|
||||||
event_type = 'Gv',
|
event_type = 'Gv',
|
||||||
show_title = title,
|
show_title = title,
|
||||||
show_link = link,
|
show_link = link,
|
||||||
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
||||||
show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(),
|
show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(),
|
||||||
more_details = details['location'],
|
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
|
scraper.items+=1
|
||||||
|
|
||||||
|
|
||||||
@@ -108,8 +116,14 @@ for sE in senateEvents:
|
|||||||
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
||||||
show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(),
|
show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(),
|
||||||
more_details = details['location'],
|
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
|
scraper.items+=1
|
||||||
|
|
||||||
for cE in commEvents:
|
for cE in commEvents:
|
||||||
@@ -136,8 +150,14 @@ for cE in commEvents:
|
|||||||
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
||||||
show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(),
|
show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(),
|
||||||
more_details = details['location'],
|
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
|
scraper.items+=1
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import re, os, sys
|
import re, os, sys
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event, Organization, Scraper
|
from events.models import Event, Organization, Scraper, Calendar
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from pprint import pprint as ppr
|
from pprint import pprint as ppr
|
||||||
@@ -17,13 +19,17 @@ from selenium.webdriver.common.by import By
|
|||||||
from xvfbwrapper import Xvfb
|
from xvfbwrapper import Xvfb
|
||||||
from lxml import html
|
from lxml import html
|
||||||
import pytz
|
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:
|
try:
|
||||||
scraper, created = Scraper.objects.get_or_create(
|
scraper, created = Scraper.objects.get_or_create(
|
||||||
name="Mpls City Council",
|
name="Mpls City Council",
|
||||||
website="https://lims.minneapolismn.gov/Calendar/citycouncil/upcoming",
|
website="https://lims.minneapolismn.gov/Calendar/citycouncil/upcoming",
|
||||||
|
calendar = Calendar.objects.get(shortcode='msp'),
|
||||||
items = 0,
|
items = 0,
|
||||||
|
new_items = 0,
|
||||||
last_ran = datetime.now(),
|
last_ran = datetime.now(),
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -31,11 +37,24 @@ except Exception as e:
|
|||||||
scraper = Scraper.objects.get(name="Mpls City Council")
|
scraper = Scraper.objects.get(name="Mpls City Council")
|
||||||
print("Scraper: ", scraper)
|
print("Scraper: ", scraper)
|
||||||
|
|
||||||
|
DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S'
|
||||||
tz = pytz.timezone("US/Central")
|
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:
|
if len(sys.argv) >= 2:
|
||||||
arg1 = sys.argv[1]
|
arg1 = sys.argv[1]
|
||||||
@@ -44,56 +63,60 @@ else:
|
|||||||
print("No run_env")
|
print("No run_env")
|
||||||
quit()
|
quit()
|
||||||
|
|
||||||
br.get(calendar_url)
|
br.get(cal_url)
|
||||||
sleep(25)
|
sleep(2)
|
||||||
# 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)
|
|
||||||
|
|
||||||
ps = html.fromstring(br.page_source)
|
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"]')
|
for event in new_events:
|
||||||
meetings = []
|
e = {}
|
||||||
|
e['title'] = event['CommitteeName']
|
||||||
for dB in dayBlocks:
|
e['link'] = scraper.website
|
||||||
date = dB.xpath('.//div[@class="row"]/div/span[@class="ng-binding"]/text()')[0]
|
e['dateStamp'] = datetime.strptime(event['MeetingTime'], DATETIME_FORMAT)
|
||||||
events = dB.xpath('.//div[@class="upcoming ng-scope"]/div')
|
e['agendaStatus'] = event['AgendaStatus']
|
||||||
for event in events:
|
e['address'] = event['Address']
|
||||||
time = event.xpath('.//div/text()')[0]
|
e['description'] = event['Description']
|
||||||
title = event.xpath('.//div/a/text()')[0].strip()
|
e['scraper'] = scraper
|
||||||
if not len(title) > 0:
|
e['calendars'] = [scraper.calendar]
|
||||||
title = event.xpath('.//div/span/a/text()')[0].strip()
|
try:
|
||||||
link = event.xpath('.//div/a/@href')[0]
|
# print(event['Location'].split(",")[1])
|
||||||
if link.startswith("/Download/"):
|
loc = event['Location'].split(",")[1]
|
||||||
link = calendar_url
|
if "City Hall" in loc:
|
||||||
else:
|
e['location'] = "Mpls City Hall"
|
||||||
link = "https://lims.minneapolismn.gov" + link
|
venue = Organization.objects.get(
|
||||||
location = title.split(',')[-1].strip()
|
name="Mpls City Hall",
|
||||||
mtg_title = title.split(',')[:-1]
|
)
|
||||||
if len(mtg_title) > 1:
|
digitools.createBasicEvent(e, 'Gv', venue)
|
||||||
mtg_title = (' -').join(mtg_title).strip()
|
elif "Public Service Building" in loc:
|
||||||
else:
|
e['location'] = "Mpls Public Service Building"
|
||||||
mtg_title = mtg_title[0].strip()
|
venue = Organization.objects.get(
|
||||||
dateTime = datetime.strptime(date + " " + time, DATETIME_FORMAT)
|
name="Mpls Public Service Building",
|
||||||
if location == "City Hall":
|
)
|
||||||
location = "Mpls City Hall"
|
digitools.createBasicEvent(e, 'Gv', venue)
|
||||||
print(dateTime, location, mtg_title, link)
|
except:
|
||||||
print('\n\n++++\n\n')
|
# print(event['Location'].split("-")[0])
|
||||||
venue, created = Organization.objects.get_or_create(name=location, city="Minneapolis")
|
e['location'] = event['Location'].split("-")[0].strip()
|
||||||
new_event = Event.objects.update_or_create(
|
try:
|
||||||
calendar = 'msp'
|
venue, created = Organization.objects.get_or_create(
|
||||||
event_type = 'Gv',
|
name=e['location'] ,
|
||||||
show_title = mtg_title,
|
city="Minneapolis",
|
||||||
show_link = link,
|
website=scraper.website,
|
||||||
show_date = dateTime,
|
is_venue=False,
|
||||||
show_day = dateTime,
|
address_complete=e['address']
|
||||||
venue = venue
|
)
|
||||||
)
|
except:
|
||||||
scraper.items+=1
|
venue = Organization.objects.get(
|
||||||
|
name=e['location'] ,
|
||||||
|
city="Minneapolis",
|
||||||
|
)
|
||||||
|
digitools.createBasicEvent(e, 'Gv', venue)
|
||||||
|
event_list.append(e)
|
||||||
|
|
||||||
|
|
||||||
br.close()
|
br.close()
|
||||||
|
|
||||||
scraper.save()
|
scraper.save()
|
||||||
# br.find_element_by_class_name('fc-btn_allCalendars-button').click()
|
# br.find_element_by_class_name('fc-btn_allCalendars-button').click()
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import re, os, sys
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event, Organization, Scraper
|
from events.models import Event, Organization, Scraper, Calendar
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from pprint import pprint as ppr
|
from pprint import pprint as ppr
|
||||||
@@ -16,13 +16,21 @@ from selenium.webdriver.common.by import By
|
|||||||
from xvfbwrapper import Xvfb
|
from xvfbwrapper import Xvfb
|
||||||
from lxml import html
|
from lxml import html
|
||||||
import pytz
|
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(
|
try:
|
||||||
name="St Paul City Council",
|
scraper, created = Scraper.objects.get_or_create(
|
||||||
website="https://www.stpaul.gov/calendar",
|
name="St Paul City Council",
|
||||||
last_ran = datetime.now(),
|
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")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
@@ -54,14 +62,15 @@ def getEvents(br):
|
|||||||
print('\n\n++++\n\n')
|
print('\n\n++++\n\n')
|
||||||
venue, created = Organization.objects.get_or_create(name="Somewhere in St Paul", city="St. Paul")
|
venue, created = Organization.objects.get_or_create(name="Somewhere in St Paul", city="St. Paul")
|
||||||
new_event = Event.objects.update_or_create(
|
new_event = Event.objects.update_or_create(
|
||||||
calendar = 'msp'
|
|
||||||
event_type = 'Gv',
|
event_type = 'Gv',
|
||||||
show_title = title,
|
show_title = title,
|
||||||
show_link = link,
|
show_link = link,
|
||||||
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
||||||
show_day = 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)
|
getEvents(br)
|
||||||
sleep(5)
|
sleep(5)
|
||||||
|
|||||||
@@ -8,11 +8,13 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
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)
|
td = relativedelta.relativedelta(hours=5)
|
||||||
odt = datetime.now() + td
|
odt = datetime.now() + td
|
||||||
@@ -27,7 +29,9 @@ try:
|
|||||||
scraper, created = Scraper.objects.get_or_create(
|
scraper, created = Scraper.objects.get_or_create(
|
||||||
name=venue.name,
|
name=venue.name,
|
||||||
website=venue.website,
|
website=venue.website,
|
||||||
|
calendar = Calendar.objects.get(shortcode='msp'),
|
||||||
items = 0,
|
items = 0,
|
||||||
|
new_items = 0,
|
||||||
last_ran = datetime.now(),
|
last_ran = datetime.now(),
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -78,7 +82,6 @@ for component in gcal.walk():
|
|||||||
if event['dateStart'] > now_now:
|
if event['dateStart'] > now_now:
|
||||||
print(event['strSummary'])
|
print(event['strSummary'])
|
||||||
new_event, created = DSEvent.objects.update_or_create(
|
new_event, created = DSEvent.objects.update_or_create(
|
||||||
calendar = 'msp'
|
|
||||||
event_type = event_type,
|
event_type = event_type,
|
||||||
show_title = event['strSummary'],
|
show_title = event['strSummary'],
|
||||||
show_link = venue.website,
|
show_link = venue.website,
|
||||||
@@ -87,6 +90,7 @@ for component in gcal.walk():
|
|||||||
more_details = event["details"],
|
more_details = event["details"],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
|
digitools.add_calendar(new_event, 'msp')
|
||||||
scraper.items+=1
|
scraper.items+=1
|
||||||
if event['strLocation'] != None and event['strLocation'] != 'MN' and event['strLocation'] != 'Online':
|
if event['strLocation'] != None and event['strLocation'] != 'MN' and event['strLocation'] != 'Online':
|
||||||
loc = event['strLocation'].split('@')
|
loc = event['strLocation'].split('@')
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
@@ -46,5 +46,23 @@ event_type = "Ed"
|
|||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
|
|||||||
@@ -9,13 +9,16 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
|
|
||||||
sys.path.append('../../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
|
from config.env import env
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
import events.digitools as digitools
|
import events.digitools as digitools
|
||||||
from dateutil import relativedelta
|
|
||||||
td = relativedelta.relativedelta(hours=5)
|
td = relativedelta.relativedelta(hours=5)
|
||||||
|
|
||||||
|
|
||||||
@@ -40,16 +43,44 @@ except Exception as e:
|
|||||||
scraper = Scraper.objects.get(name=venue.name)
|
scraper = Scraper.objects.get(name=venue.name)
|
||||||
|
|
||||||
item_count_start = scraper.items
|
item_count_start = scraper.items
|
||||||
|
|
||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
def createEvent(day, date, event, scraper, venue, event_type):
|
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]
|
days = [day-1, day+6, day+13]
|
||||||
for day in days:
|
for day in days:
|
||||||
event['dateStamp'] = date + timedelta(days=day)
|
event['dateStamp'] = date + timedelta(days=day)
|
||||||
event['dateStart'] = event['dateStamp']
|
event['dateStart'] = event['dateStamp']
|
||||||
|
print("sending")
|
||||||
digitools.createCleanIcalEvent(event, scraper, venue, event_type)
|
digitools.createCleanIcalEvent(event, scraper, venue, event_type)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -68,7 +99,7 @@ counter = 0
|
|||||||
for component in gcal.walk():
|
for component in gcal.walk():
|
||||||
event = {}
|
event = {}
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['strSummary'] = f"{(component.get('SUMMARY'))}"
|
event['strSummary'] = f"{(component.get('SUMMARY'))}"
|
||||||
event['strDesc'] = component.get('DESCRIPTION')
|
event['strDesc'] = component.get('DESCRIPTION')
|
||||||
event['strLocation'] = str(component.get('LOCATION'))
|
event['strLocation'] = str(component.get('LOCATION'))
|
||||||
@@ -87,15 +118,19 @@ for component in gcal.walk():
|
|||||||
event['dateStart'] = event['dateStart'].dt
|
event['dateStart'] = event['dateStart'].dt
|
||||||
event['dateStart'] = datetime.strptime(str(event['dateStart'])[:-6], '%Y-%m-%d %H:%M:%S')
|
event['dateStart'] = datetime.strptime(str(event['dateStart'])[:-6], '%Y-%m-%d %H:%M:%S')
|
||||||
rules = component.get('RRule')
|
rules = component.get('RRule')
|
||||||
if rules['FREQ'][0] == 'WEEKLY':
|
try:
|
||||||
if datetime.today().weekday() != 0:
|
if rules['FREQ'][0] == 'WEEKLY':
|
||||||
event = splitLocation(event)
|
if datetime.today().weekday() != 0:
|
||||||
date = datetime.today().date() - timedelta(days=datetime.today().weekday())
|
event = splitLocation(event)
|
||||||
date = datetime.combine(date, event['dateStart'].time())
|
date = datetime.today().date() - timedelta(days=datetime.today().weekday())
|
||||||
days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"]
|
date = datetime.combine(date, event['dateStart'].time())
|
||||||
for day in rules['BYDAY']:
|
days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"]
|
||||||
day = days.index(day)
|
for day in rules['BYDAY']:
|
||||||
createEvent(day, date, event, scraper, event['venue'], "Ed")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
|
|
||||||
|
|||||||
118
events/scrapers/Working/iCal/ical_online_events.py
Normal file
118
events/scrapers/Working/iCal/ical_online_events.py
Normal file
@@ -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()
|
||||||
@@ -9,8 +9,8 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
@@ -44,5 +44,22 @@ item_count_start = scraper.items
|
|||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
@@ -5,8 +5,8 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
@@ -44,5 +44,23 @@ event_type = "Mu"
|
|||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
|
|||||||
@@ -8,14 +8,14 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
import events.digitools as digitools
|
import events.digitools as digitools
|
||||||
|
|
||||||
|
tz = pytz.timezone("US/Central")
|
||||||
td = relativedelta.relativedelta(hours=5)
|
td = relativedelta.relativedelta(hours=5)
|
||||||
|
|
||||||
venue, created = Organization.objects.get_or_create(
|
venue, created = Organization.objects.get_or_create(
|
||||||
@@ -44,5 +44,50 @@ event_type = "Ed"
|
|||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
@@ -6,8 +6,8 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
@@ -42,5 +42,22 @@ event_type = "Mu"
|
|||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
@@ -8,8 +8,8 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
@@ -46,5 +46,22 @@ event_type = "Mu"
|
|||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
69
events/scrapers/Working/iCal/ical_run.whitesquirrel.py
Normal file
69
events/scrapers/Working/iCal/ical_run.whitesquirrel.py
Normal file
@@ -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)
|
||||||
388
events/scrapers/Working/iCal/index.html
Normal file
388
events/scrapers/Working/iCal/index.html
Normal file
File diff suppressed because one or more lines are too long
498
events/scrapers/Working/iCal/ws.ics
Normal file
498
events/scrapers/Working/iCal/ws.ics
Normal file
@@ -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
|
||||||
@@ -4,7 +4,7 @@ from dateutil import relativedelta
|
|||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from dateutil import relativedelta
|
|||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from dateutil import relativedelta
|
|||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from dateutil import relativedelta
|
|||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'events.settings'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ from dateutil import relativedelta
|
|||||||
from atproto import Client
|
from atproto import Client
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -19,7 +19,7 @@ from socials.models import SocialLink, SocialPost
|
|||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
USERNAME = "dreamfreely.org"
|
USERNAME = "dreamfreely.org"
|
||||||
PASSWORD = "Futbol21!@"
|
PASSWORD = "gU):3-BA]DaK[_K$DHmI"
|
||||||
|
|
||||||
client = Client()
|
client = Client()
|
||||||
client.login(USERNAME, PASSWORD)
|
client.login(USERNAME, PASSWORD)
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ from dateutil import relativedelta
|
|||||||
from atproto import Client
|
from atproto import Client
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -19,7 +19,7 @@ from socials.models import SocialImg
|
|||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
USERNAME = "dreamfreely.org"
|
USERNAME = "dreamfreely.org"
|
||||||
PASSWORD = "Futbol21!@"
|
PASSWORD = "gU):3-BA]DaK[_K$DHmI"
|
||||||
|
|
||||||
client = Client()
|
client = Client()
|
||||||
client.login(USERNAME, PASSWORD)
|
client.login(USERNAME, PASSWORD)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -22,7 +22,8 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue = True
|
is_venue = True
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
|
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
@@ -40,7 +41,7 @@ def get_events(ps, event_type):
|
|||||||
if month == "Jan":
|
if month == "Jan":
|
||||||
year = int(year) + 1
|
year = int(year) + 1
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['title'] = c.xpath('.//*/span[@class="event_title"]/a/text()')[0]
|
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'] = [month, day, str(year), c.xpath('.//*/span[@class="event_time"]/text()')[0].strip()]
|
||||||
event['date'] = " ".join(event['date'])
|
event['date'] = " ".join(event['date'])
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue=True
|
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 = '%B %d %Y %I:%M%p'
|
||||||
DATETIME_FORMAT_2 = '%A, %B %d @ %I%p %Y'
|
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]
|
month = c.xpath('.//*/div[@class="date-month"]/text()')[0]
|
||||||
year = datetime.now().year
|
year = datetime.now().year
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['title'] = c.xpath('.//div/h4/a/text()')[0]
|
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'] = [month, day, str(year), c.xpath('.//div[@class="event-info"]/p/text()')[0].split(" ")[0]]
|
||||||
event['date'] = " ".join(event['date'])
|
event['date'] = " ".join(event['date'])
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -23,7 +23,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue = True
|
is_venue = True
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ events = []
|
|||||||
def get_info(pse):
|
def get_info(pse):
|
||||||
event = {}
|
event = {}
|
||||||
event['scraper'] = scraper
|
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["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', '')
|
event["show_title"] = pse.xpath('.//*/span[@class="show_title"]/text()')[0].replace('\t', '').replace('\n', '')
|
||||||
if event["show_title"] == "":
|
if event["show_title"] == "":
|
||||||
@@ -164,7 +164,7 @@ for show in shows:
|
|||||||
try:
|
try:
|
||||||
event['dateStamp'] = event['date_time']
|
event['dateStamp'] = event['date_time']
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
new_event, created = digitools.createDetailedEvent(event, "Mu", venue)
|
new_event, created = digitools.createDetailedEvent(event, "Mu", venue, scraper)
|
||||||
scraper.items+=1
|
scraper.items+=1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("event creation error: ", e, "\n\n", event, "\n\n", created)
|
print("event creation error: ", e, "\n\n", event, "\n\n", created)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue = True
|
is_venue = True
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
event_type = ""
|
event_type = ""
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ def get_events(ps, event_type):
|
|||||||
if month == "January":
|
if month == "January":
|
||||||
year = int(year) + 1
|
year = int(year) + 1
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['title'] = c.xpath('.//*/h3/a/text()')[0].replace("\n", "").replace("\t", "")
|
event['title'] = c.xpath('.//*/h3/a/text()')[0].replace("\n", "").replace("\t", "")
|
||||||
event['date'] = " ".join([ dateTime, str(year)])
|
event['date'] = " ".join([ dateTime, str(year)])
|
||||||
event['dateStamp'] = datetime.strptime(event['date'], DATETIME_FORMAT)
|
event['dateStamp'] = datetime.strptime(event['date'], DATETIME_FORMAT)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -22,7 +22,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue = True
|
is_venue = True
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
event_type = "Mu"
|
event_type = "Mu"
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ def get_events(ps, event_type):
|
|||||||
# if month == "Jan":
|
# if month == "Jan":
|
||||||
# year = int(year) + 1
|
# year = int(year) + 1
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['title'] = c.xpath('.//*/div[@class="vp-event-name"]/text()')[0]
|
event['title'] = c.xpath('.//*/div[@class="vp-event-name"]/text()')[0]
|
||||||
event['datetime'] = date + " " + str(year) + " " + time
|
event['datetime'] = date + " " + str(year) + " " + time
|
||||||
event['dateStamp'] = datetime.strptime(event['datetime'], DATETIME_FORMAT)
|
event['dateStamp'] = datetime.strptime(event['datetime'], DATETIME_FORMAT)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -26,7 +26,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue=True,
|
is_venue=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp')
|
||||||
ppr(scraper)
|
ppr(scraper)
|
||||||
|
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
@@ -65,7 +65,7 @@ def get_listings(pse, events):
|
|||||||
e['image'] = event.xpath('.//*/img/@data-src')[0]
|
e['image'] = event.xpath('.//*/img/@data-src')[0]
|
||||||
e["date_time"] = datetime.strptime(e['datetime'], DATETIME_FORMAT)
|
e["date_time"] = datetime.strptime(e['datetime'], DATETIME_FORMAT)
|
||||||
e['scraper'] = scraper
|
e['scraper'] = scraper
|
||||||
e['calendar'] = scraper.calendar
|
e['calendar'] = [scraper.calendar]
|
||||||
events.append(e)
|
events.append(e)
|
||||||
|
|
||||||
events = []
|
events = []
|
||||||
@@ -79,7 +79,6 @@ for cal in calendar_url:
|
|||||||
for event in events:
|
for event in events:
|
||||||
try:
|
try:
|
||||||
new_event = Event.objects.update_or_create(
|
new_event = Event.objects.update_or_create(
|
||||||
calendar = event['calendar'],
|
|
||||||
scraper = event['scraper'],
|
scraper = event['scraper'],
|
||||||
event_type = 'Mu',
|
event_type = 'Mu',
|
||||||
show_title = event["show_title"],
|
show_title = event["show_title"],
|
||||||
@@ -89,6 +88,7 @@ for event in events:
|
|||||||
guests = " ".join(event["subtitle"]),
|
guests = " ".join(event["subtitle"]),
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
|
digitools.add_calendar(new_event, 'msp')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("oops ", e, "\n\n", "Scraper:", scraper)
|
print("oops ", e, "\n\n", "Scraper:", scraper)
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue=False
|
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 = '%A, %B %d , %Y %I:%M %p'
|
||||||
DATETIME_FORMAT_2 = '%A, %B %d @ %I%p %Y'
|
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]
|
month = c.xpath('.//*/div[@class="month"]/text()')[0]
|
||||||
year = c.xpath('.//*/div[@class="year"]/text()')[0]
|
year = c.xpath('.//*/div[@class="year"]/text()')[0]
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['title'] = c.xpath('.//*/h3/text()')[0]
|
event['title'] = c.xpath('.//*/h3/text()')[0]
|
||||||
event['date'] = [month, day, year, c.xpath('.//*/p[@class="time"]/text()')[0]]
|
event['date'] = [month, day, year, c.xpath('.//*/p[@class="time"]/text()')[0]]
|
||||||
event['date'] = " ".join(event['date'])
|
event['date'] = " ".join(event['date'])
|
||||||
@@ -45,7 +45,7 @@ def get_events(ps, event_type):
|
|||||||
scraper.items+=1
|
scraper.items+=1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
event['link'] = "https://www.magersandquinn.com" + c.xpath('.//a[@class="event off-site"]/@href')[0]
|
event['link'] = "https://www.magersandquinn.com" + c.xpath('.//a[@class="event off-site"]/@href')[0]
|
||||||
print(e)
|
print("Error: ", e)
|
||||||
ppr(event)
|
ppr(event)
|
||||||
digitools.createBasicEvent(event, "Ed", venue)
|
digitools.createBasicEvent(event, "Ed", venue)
|
||||||
print("\n\n+++\n\n")
|
print("\n\n+++\n\n")
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -25,7 +25,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue = True
|
is_venue = True
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start, virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ else:
|
|||||||
quit()
|
quit()
|
||||||
|
|
||||||
br.get(calendar_url)
|
br.get(calendar_url)
|
||||||
sleep(30)
|
sleep(20)
|
||||||
|
|
||||||
def getEvents(br):
|
def getEvents(br):
|
||||||
ps = html.fromstring(br.page_source)
|
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
|
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", "")
|
title = event.xpath('.//*/h2[@class="alt-font"]/a/text()')[0].replace("\n", "").replace("\t", "")
|
||||||
link = event.xpath('.//*/h2[@class="alt-font"]/a/@href')[0]
|
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:
|
try:
|
||||||
new_event = Event.objects.update_or_create(
|
new_event, created = Event.objects.update_or_create(
|
||||||
calendar = scraper.calendar,
|
|
||||||
scraper = scraper,
|
scraper = scraper,
|
||||||
event_type = 'Mu',
|
event_type = 'Mu',
|
||||||
show_title = title,
|
show_title = title,
|
||||||
show_link = link,
|
show_link = link,
|
||||||
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
show_date = datetime.strptime(dateTime, DATETIME_FORMAT),
|
||||||
show_day = datetime.strptime(dateTime, DATETIME_FORMAT).date(),
|
show_day = datetime.strptime(dateTime, DATETIME_FORMAT),
|
||||||
more_details = deets["tickets"],
|
# more_details = deets["tickets"],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
|
digitools.add_calendar(new_event, 'msp')
|
||||||
scraper.items+=1
|
scraper.items+=1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("oops", e)
|
print("oops", e)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -25,7 +25,7 @@ try:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
venue = Organization.objects.get(name="Parkway Theater")
|
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")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ def get_events(ps, event_type):
|
|||||||
for c,i in zip(contents,img_etc):
|
for c,i in zip(contents,img_etc):
|
||||||
try:
|
try:
|
||||||
event = {}
|
event = {}
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['title'] = c.xpath('.//*/a[@class="summary-title-link"]/text()')[0]
|
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['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()
|
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:
|
try:
|
||||||
new_event = DSEvent.objects.update_or_create(
|
new_event, created = DSEvent.objects.update_or_create(
|
||||||
calendar = scraper.calendar,
|
|
||||||
scraper = scraper,
|
scraper = scraper,
|
||||||
event_type = event_type,
|
event_type = event_type,
|
||||||
show_title = event['title'],
|
show_title = event['title'],
|
||||||
@@ -62,13 +61,13 @@ def get_events(ps, event_type):
|
|||||||
more_details = event["details"],
|
more_details = event["details"],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
|
digitools.add_calendar(new_event, 'msp')
|
||||||
scraper.items+=1
|
scraper.items+=1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
try:
|
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['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)
|
event['dateStamp'] = datetime.strptime(event['date'], DATETIME_FORMAT)
|
||||||
new_event = DSEvent.objects.update_or_create(
|
new_event, created = DSEvent.objects.update_or_create(
|
||||||
calendar = scraper.calendar,
|
|
||||||
scraper = scraper,
|
scraper = scraper,
|
||||||
event_type = event_type,
|
event_type = event_type,
|
||||||
show_title = event['title'],
|
show_title = event['title'],
|
||||||
@@ -78,6 +77,7 @@ def get_events(ps, event_type):
|
|||||||
more_details = event["details"],
|
more_details = event["details"],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
|
digitools.add_calendar(new_event, 'msp')
|
||||||
scraper.items+=1
|
scraper.items+=1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|||||||
@@ -3,10 +3,9 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from pprint import pprint as ppr
|
from pprint import pprint as ppr
|
||||||
import pytz
|
import pytz
|
||||||
@@ -22,7 +21,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue = False
|
is_venue = False
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start, virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
# Time Signatures
|
# Time Signatures
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
@@ -38,7 +37,7 @@ def get_events(ps, event_type):
|
|||||||
subtitle = ps.xpath('.//*/article/h1/em/text()')
|
subtitle = ps.xpath('.//*/article/h1/em/text()')
|
||||||
event = {}
|
event = {}
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
if len(subtitle) == 1:
|
if len(subtitle) == 1:
|
||||||
if len(ntitle) == 2:
|
if len(ntitle) == 2:
|
||||||
title = ntitle[0] + subtitle[0] + ntitle[1]
|
title = ntitle[0] + subtitle[0] + ntitle[1]
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -24,7 +24,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue = True
|
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
|
# Set initial variables for City, etc
|
||||||
@@ -42,11 +42,13 @@ else:
|
|||||||
quit()
|
quit()
|
||||||
|
|
||||||
def get_listings(pse, events):
|
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:
|
for l in listings:
|
||||||
event = {}
|
event = {}
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
|
print("1: ", event)
|
||||||
try:
|
try:
|
||||||
event["image"] = l.xpath('.//*/img/@src')[0]
|
event["image"] = l.xpath('.//*/img/@src')[0]
|
||||||
except:
|
except:
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -21,7 +21,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue=True
|
is_venue=True
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ def get_events(ps):
|
|||||||
pse = digitools.getSource(br, "https://www.thecedar.org" + l)
|
pse = digitools.getSource(br, "https://www.thecedar.org" + l)
|
||||||
event = {}
|
event = {}
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['link'] = "https://www.thecedar.org" + l
|
event['link'] = "https://www.thecedar.org" + l
|
||||||
try:
|
try:
|
||||||
time = pse.xpath('.//*/time[@class="event-time-localized-start"]/text()')[0]
|
time = pse.xpath('.//*/time[@class="event-time-localized-start"]/text()')[0]
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -24,7 +24,7 @@ venue, created = Organization.objects.get_or_create(
|
|||||||
is_venue=True,
|
is_venue=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper,item_count_start = digitools.getScraper(venue)
|
scraper,item_count_start,virtcal = digitools.getScraper(venue, 'msp')
|
||||||
|
|
||||||
tz = pytz.timezone("US/Central")
|
tz = pytz.timezone("US/Central")
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ for d in dates:
|
|||||||
event["bands"] = (", ").join(bands)
|
event["bands"] = (", ").join(bands)
|
||||||
if len(bands) > 0:
|
if len(bands) > 0:
|
||||||
event['scraper'] = scraper
|
event['scraper'] = scraper
|
||||||
event['calendar'] = scraper.calendar
|
event['calendars'] = [scraper.calendar]
|
||||||
event['title'] = event["bands"]
|
event['title'] = event["bands"]
|
||||||
event['date'] = event["date_time"]
|
event['date'] = event["date_time"]
|
||||||
event['dateStamp'] = event["date_time"]
|
event['dateStamp'] = event["date_time"]
|
||||||
|
|||||||
1295
events/scrapers/Working/venues/manual/data.json
Normal file
1295
events/scrapers/Working/venues/manual/data.json
Normal file
File diff suppressed because it is too large
Load Diff
1471
events/scrapers/Working/venues/manual/data.updated.json
Normal file
1471
events/scrapers/Working/venues/manual/data.updated.json
Normal file
File diff suppressed because it is too large
Load Diff
169
events/scrapers/Working/venues/manual/eventario.py
Normal file
169
events/scrapers/Working/venues/manual/eventario.py
Normal file
@@ -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)
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -1,39 +1,44 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# BASEDIR=/var/www/digisnaxx.com/
|
DIGIDIR=/var/www/digisnaxx.ado
|
||||||
# DJANGODIR=/var/www/digisnaxx.com/ds_events
|
DJANGODIR=/var/www/digisnaxx.ado/api.digisnaxx
|
||||||
# EVENTDIR=/var/www/digisnaxx.com/ds_events/event_scrapers
|
EVENTSDIR=/var/www/digisnaxx.ado/api.digisnaxx/events
|
||||||
|
FIXTURESDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/fixtures
|
||||||
BASEDIR=/home/canin/Downloads/DigiSnaxxEvents
|
SCRAPEDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers
|
||||||
DJANGODIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events
|
SCRIPTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/scripts
|
||||||
EVENTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers
|
VENUESDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/venues
|
||||||
VENUESDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/venues
|
ICALDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/iCal
|
||||||
ICALDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/iCal
|
GOVTDIR=/var/www/digisnaxx.ado/api.digisnaxx/events/scrapers/Working/govt
|
||||||
GOVTDIR=/home/canin/Downloads/DigiSnaxxEvents/ds_events/event_scrapers/Working/govt
|
|
||||||
|
|
||||||
export DJANGO_SUPERUSER_EMAIL=canin@dreamfreely.org
|
export DJANGO_SUPERUSER_EMAIL=canin@dreamfreely.org
|
||||||
export DJANGO_SUPERUSER_USERNAME=canin
|
export DJANGO_SUPERUSER_USERNAME=canin
|
||||||
export DJANGO_SUPERUSER_PASSWORD='hello123'
|
export DJANGO_SUPERUSER_PASSWORD='hello123'
|
||||||
|
|
||||||
cd $BASEDIR
|
cd $DIGIDIR
|
||||||
source venv/bin/activate
|
source venv/bin/activate
|
||||||
|
|
||||||
cd $DJANGODIR
|
cd $DJANGODIR
|
||||||
mv db.sqlite3 db.sqlite3.bak
|
mv *.bak baks/
|
||||||
python manage.py migrate
|
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_venues.sh $1
|
||||||
bash run_ical.sh
|
|
||||||
bash run_govt.sh $1
|
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 clean_up.py
|
||||||
python Working/smedia/bluesky_media.py
|
# cd ../
|
||||||
python Working/smedia/redsky.py
|
# deactivate
|
||||||
python clean_up.py
|
|
||||||
|
|
||||||
deactivate
|
# rm -rf ../*/__pycache__
|
||||||
|
# rm -rf ../*/*/__pycache__
|
||||||
rm -rf ../*/__pycache__
|
|
||||||
rm -rf ../*/*/__pycache__
|
|
||||||
@@ -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
|
|
||||||
@@ -4,8 +4,8 @@ from datetime import datetime, timedelta
|
|||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../')
|
sys.path.append('../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event, Organization
|
from events.models import Event, Organization
|
||||||
@@ -21,10 +21,13 @@ for e in events:
|
|||||||
for e in events1:
|
for e in events1:
|
||||||
e.delete()
|
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:
|
for o in org_sin_events:
|
||||||
print(org)
|
print(o)
|
||||||
org.delete()
|
|
||||||
|
# for org in org_sin_events:
|
||||||
|
# print(org)
|
||||||
|
# org.delete()
|
||||||
|
|
||||||
print("completed and cleaned scrapes")
|
print("completed and cleaned scrapes")
|
||||||
17
events/scrapers/scripts/run_govt.sh
Normal file
17
events/scrapers/scripts/run_govt.sh
Normal file
@@ -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
|
||||||
16
events/scrapers/scripts/run_ical.sh
Normal file
16
events/scrapers/scripts/run_ical.sh
Normal file
@@ -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
|
||||||
22
events/scrapers/scripts/run_media_update.sh
Normal file
22
events/scrapers/scripts/run_media_update.sh
Normal file
@@ -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
|
||||||
16
events/scrapers/scripts/run_news.sh
Normal file
16
events/scrapers/scripts/run_news.sh
Normal file
@@ -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
|
||||||
16
events/scrapers/scripts/run_venues.sh
Normal file
16
events/scrapers/scripts/run_venues.sh
Normal file
@@ -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
|
||||||
29
events/scrapers/scripts/start_up.py
Normal file
29
events/scrapers/scripts/start_up.py
Normal file
@@ -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.")
|
||||||
@@ -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')
|
|
||||||
@@ -3,8 +3,8 @@ from datetime import datetime
|
|||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
@@ -6,8 +6,8 @@ from pprint import pprint as ppr
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
import django
|
import django
|
||||||
sys.path.append('../../../')
|
sys.path.append('../../../../')
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'ds_events.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.django.local'
|
||||||
django.setup()
|
django.setup()
|
||||||
|
|
||||||
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
from events.models import Event as DSEvent, Organization, Scraper, Calendar
|
||||||
@@ -42,5 +42,24 @@ event_type = "Mu"
|
|||||||
objIcalData = requests.get(scraper.website)
|
objIcalData = requests.get(scraper.website)
|
||||||
gcal = iCalendar.from_ical(objIcalData.text)
|
gcal = iCalendar.from_ical(objIcalData.text)
|
||||||
tz = pytz.timezone("US/Central")
|
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)
|
digitools.updateScraper(scraper, item_count_start)
|
||||||
91
events/scrapers/zArchive/eventario.2.py
Normal file
91
events/scrapers/zArchive/eventario.2.py
Normal file
@@ -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)
|
||||||
@@ -57,6 +57,6 @@ class PromoSerializer(serializers.ModelSerializer):
|
|||||||
# event_type = serializers.CharField(source='get_event_type_display')
|
# event_type = serializers.CharField(source='get_event_type_display')
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Promo
|
model = Promo
|
||||||
fields = ('id', 'title', 'organization', 'promo_type', 'long_text', 'short_text', 'overlay_image', 'classified_image', 'target_link')
|
# fields = ('id', 'title', 'organization', 'promo_type', 'long_text', 'short_text', 'overlay_image', 'target_link')
|
||||||
# fields = '__all__'
|
fields = '__all__'
|
||||||
depth = 2
|
depth = 2
|
||||||
@@ -30,19 +30,21 @@ class EventsAPIView(generics.ListAPIView):
|
|||||||
serializer_class = EventSerializer
|
serializer_class = EventSerializer
|
||||||
queryset = Event.objects.filter(show_date__gte=odt).order_by('show_date')
|
queryset = Event.objects.filter(show_date__gte=odt).order_by('show_date')
|
||||||
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
|
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
|
||||||
filterset_fields = ['show_title', 'event_type', 'venue__name', 'calendar__shortcode']
|
filterset_fields = ['show_title', 'event_type', 'venue__name','show_day', 'calendar__shortcode',]
|
||||||
search_fields = ['show_title', 'event_type', 'venue__name']
|
search_fields = ['show_title', 'event_type','show_day', 'venue__name', 'calendar__shortcode',]
|
||||||
permission_classes = [HasAPIKey]
|
permission_classes = [HasAPIKey]
|
||||||
|
|
||||||
|
|
||||||
class PromoAPIView(generics.ListAPIView):
|
class PromoAPIView(generics.ListAPIView):
|
||||||
serializer_class = PromoSerializer
|
serializer_class = PromoSerializer
|
||||||
|
queryset = Promo.objects.filter(published=True)
|
||||||
|
filterset_fields = ['organization__name', 'calendar__shortcode',]
|
||||||
|
search_fields = ['organization__name', 'calendar__shortcode',]
|
||||||
permission_classes = [HasAPIKey]
|
permission_classes = [HasAPIKey]
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
promo_objects = list(Promo.objects.filter(published=True))
|
calendar = self.request.GET.get('calendar__shortcode')
|
||||||
print(len(promo_objects))
|
queryset = Promo.objects.filter(published=True, calendar__shortcode=calendar).order_by('?')
|
||||||
queryset = random.sample(promo_objects, 21)
|
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
# class EventsTokenAPIView(APIAccessTokenView):
|
# class EventsTokenAPIView(APIAccessTokenView):
|
||||||
|
|||||||
18
socials/migrations/0011_sociallink_star.py
Normal file
18
socials/migrations/0011_sociallink_star.py
Normal file
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -60,6 +60,7 @@ class SocialLink(models.Model):
|
|||||||
|
|
||||||
published = models.BooleanField(default=0)
|
published = models.BooleanField(default=0)
|
||||||
pub_link = models.URLField(blank=True, null=True)
|
pub_link = models.URLField(blank=True, null=True)
|
||||||
|
star = models.BooleanField(default=0)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ("uri",)
|
unique_together = ("uri",)
|
||||||
|
|||||||
Reference in New Issue
Block a user