lots of updates ... eeks
@@ -13,7 +13,7 @@ class ScraperAdmin(admin.ModelAdmin):
|
|||||||
class OrganizationAdmin(admin.ModelAdmin):
|
class OrganizationAdmin(admin.ModelAdmin):
|
||||||
# prepopulated_fields = {"slug": ("shortname",)}
|
# prepopulated_fields = {"slug": ("shortname",)}
|
||||||
list_display = ( "name", "city",)
|
list_display = ( "name", "city",)
|
||||||
# list_filter = ("promo_type",)
|
list_filter = ("city",)
|
||||||
|
|
||||||
class EventAdmin(admin.ModelAdmin):
|
class EventAdmin(admin.ModelAdmin):
|
||||||
# prepopulated_fields = {"slug": ("shortname",)}
|
# prepopulated_fields = {"slug": ("shortname",)}
|
||||||
@@ -22,7 +22,7 @@ class EventAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
class PromoAdmin(admin.ModelAdmin):
|
class PromoAdmin(admin.ModelAdmin):
|
||||||
# prepopulated_fields = {"slug": ("shortname",)}
|
# prepopulated_fields = {"slug": ("shortname",)}
|
||||||
list_display = ("title", "organization", "get_calendars", "published")
|
list_display = ("title", "organization", "get_calendars", "published", "promo_image")
|
||||||
list_filter = ("calendar__shortcode", "promo_type")
|
list_filter = ("calendar__shortcode", "promo_type")
|
||||||
|
|
||||||
def get_calendars(self, obj):
|
def get_calendars(self, obj):
|
||||||
|
|||||||
@@ -17,19 +17,40 @@ from events.models import Event as DSEvent, Organization, Promo, Scraper, Calend
|
|||||||
plus_one_month = relativedelta.relativedelta(months=1)
|
plus_one_month = relativedelta.relativedelta(months=1)
|
||||||
odt_next_month = datetime.now() + plus_one_month
|
odt_next_month = datetime.now() + plus_one_month
|
||||||
|
|
||||||
|
def translateMonth(month):
|
||||||
|
MONTHS = [
|
||||||
|
('Januar', 'JÄN', 'January'),
|
||||||
|
('Februar', 'FEBR', 'February'),
|
||||||
|
('März', 'MRZ', 'March'),
|
||||||
|
('April', 'APR', 'April'),
|
||||||
|
('Mai', 'MAI', 'May'),
|
||||||
|
('Juni', 'JUN', 'June'),
|
||||||
|
('Juli', 'JUL', 'July'),
|
||||||
|
('August', 'AUG', 'August'),
|
||||||
|
('September', 'SEP', 'September'),
|
||||||
|
('Oktober', 'OKT', 'October'),
|
||||||
|
('November', 'NOV', 'November'),
|
||||||
|
('Dezember', 'DEZ', 'December'),
|
||||||
|
]
|
||||||
|
for mon in MONTHS:
|
||||||
|
if month == mon[1]:
|
||||||
|
return mon[2]
|
||||||
|
|
||||||
# Get Scraper name, item count and online_calendar (virtcal)
|
# Get Scraper name, item count and online_calendar (virtcal)
|
||||||
def getScraper(venue, website, cal):
|
def getScraper(venue, website, cal):
|
||||||
virtcal = Calendar.objects.get(shortcode='000')
|
virtcal = Calendar.objects.get(shortcode='000')
|
||||||
|
ncal = Calendar.objects.get(shortcode=cal)
|
||||||
try:
|
try:
|
||||||
scraper, created = Scraper.objects.get_or_create(
|
scraper, created = Scraper.objects.get_or_create(
|
||||||
name=venue.name,
|
name=venue.name,
|
||||||
website=website,
|
website=website,
|
||||||
calendar = Calendar.objects.get(shortcode=cal),
|
calendar = ncal,
|
||||||
items = 0,
|
items = 0,
|
||||||
new_items = 0,
|
new_items = 0,
|
||||||
last_ran = datetime.now(),
|
last_ran = datetime.now(),
|
||||||
)
|
)
|
||||||
|
venue.cal = ncal
|
||||||
|
venue.save()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
scraper = Scraper.objects.get(name=venue.name)
|
scraper = Scraper.objects.get(name=venue.name)
|
||||||
@@ -51,11 +72,11 @@ def updateScraper(scraper, item_count_start):
|
|||||||
# Get site HTML content for XPATH travel
|
# Get site HTML content for XPATH travel
|
||||||
def getSource(browser, link):
|
def getSource(browser, link):
|
||||||
browser.get(link)
|
browser.get(link)
|
||||||
sleep(5)
|
sleep(6)
|
||||||
ps = html.fromstring(browser.page_source)
|
ps = html.fromstring(browser.page_source)
|
||||||
return ps
|
return ps
|
||||||
|
|
||||||
# Get Selenium Web Drive, with params for Chrome or Firefox
|
# Get Selenium Web Driver, with params for Chrome or Firefox
|
||||||
# Or in production to run headless
|
# Or in production to run headless
|
||||||
def getBrowser(run_env):
|
def getBrowser(run_env):
|
||||||
if run_env == 'dev':
|
if run_env == 'dev':
|
||||||
@@ -154,6 +175,7 @@ def createDashURL(site_url):
|
|||||||
|
|
||||||
# Add Calendar to Event Object (maybe extraneous)
|
# Add Calendar to Event Object (maybe extraneous)
|
||||||
def add_calendar(event, calendar):
|
def add_calendar(event, calendar):
|
||||||
|
print("Add Calendar", type(event), event, calendar)
|
||||||
if type(event) is tuple:
|
if type(event) is tuple:
|
||||||
event = event[0]
|
event = event[0]
|
||||||
cal = Calendar.objects.get(shortcode=calendar)
|
cal = Calendar.objects.get(shortcode=calendar)
|
||||||
@@ -173,18 +195,21 @@ def add_calendars(event, data):
|
|||||||
|
|
||||||
# Create Basic DigiSnaxx Event
|
# Create Basic DigiSnaxx Event
|
||||||
def createBasicEvent(event, event_type, venue):
|
def createBasicEvent(event, event_type, venue):
|
||||||
new_event, created = DSEvent.objects.update_or_create(
|
try:
|
||||||
event_type = event_type,
|
new_event, created = DSEvent.objects.update_or_create(
|
||||||
show_title = event['title'],
|
event_type = event_type,
|
||||||
show_link = event['link'],
|
show_title = event['title'],
|
||||||
show_date = event['dateStamp'],
|
show_link = event['link'],
|
||||||
show_day = event['dateStamp'],
|
show_date = event['dateStamp'],
|
||||||
scraper = event['scraper'],
|
scraper = event['scraper'],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
new_event = add_calendars(new_event, event)
|
new_event = add_calendars(new_event, event)
|
||||||
# print("\n+new event+")
|
print("\n+new event+")
|
||||||
return new_event, created
|
return new_event, created
|
||||||
|
except Exception as e:
|
||||||
|
print("Error: ", e)
|
||||||
|
return None, None
|
||||||
|
|
||||||
# Create iCal Event
|
# Create iCal Event
|
||||||
def createBasiciCalEvent(event, event_type, venue):
|
def createBasiciCalEvent(event, event_type, venue):
|
||||||
@@ -192,8 +217,21 @@ def createBasiciCalEvent(event, event_type, venue):
|
|||||||
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%z %Z'),
|
||||||
show_day = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S'),
|
scraper = event['scraper'],
|
||||||
|
venue = venue
|
||||||
|
)
|
||||||
|
new_event = add_calendars(new_event, event)
|
||||||
|
print("Success")
|
||||||
|
return new_event, created
|
||||||
|
|
||||||
|
def createDetailedEvent2(event, event_type, venue, scraper):
|
||||||
|
new_event, created = DSEvent.objects.update_or_create(
|
||||||
|
event_type = event_type,
|
||||||
|
show_title = event["show_title"],
|
||||||
|
show_link = event["link"],
|
||||||
|
show_date = event["dateStamp"],
|
||||||
|
more_details = event["details"],
|
||||||
scraper = event['scraper'],
|
scraper = event['scraper'],
|
||||||
venue = venue
|
venue = venue
|
||||||
)
|
)
|
||||||
@@ -209,7 +247,6 @@ 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'],
|
|
||||||
guests = " ".join(event["guests"]),
|
guests = " ".join(event["guests"]),
|
||||||
more_details = event["details"],
|
more_details = event["details"],
|
||||||
scraper = event['scraper'],
|
scraper = event['scraper'],
|
||||||
@@ -221,7 +258,7 @@ def createDetailedEvent(event, event_type, venue, scraper):
|
|||||||
|
|
||||||
# Create iCal event from DF_Online & Medellin
|
# Create iCal event from DF_Online & Medellin
|
||||||
def createCleanIcalEvent(event, scraper, venue, event_type):
|
def createCleanIcalEvent(event, scraper, venue, event_type):
|
||||||
new_date = event['dateStart']
|
new_date = event['eventDate']
|
||||||
new_event = {}
|
new_event = {}
|
||||||
new_event['scraper'] = scraper
|
new_event['scraper'] = scraper
|
||||||
new_event['calendars'] = scraper.calendar
|
new_event['calendars'] = scraper.calendar
|
||||||
@@ -229,6 +266,8 @@ def createCleanIcalEvent(event, scraper, venue, event_type):
|
|||||||
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
|
||||||
|
print("New Event")
|
||||||
|
# ppr(new_event)
|
||||||
createBasiciCalEvent(new_event, event_type, venue)
|
createBasiciCalEvent(new_event, event_type, venue)
|
||||||
|
|
||||||
# Get events from iCal
|
# Get events from iCal
|
||||||
@@ -279,7 +318,7 @@ def buildiCalEvents(events, event_type, scraper, venue):
|
|||||||
scraper.save()
|
scraper.save()
|
||||||
return
|
return
|
||||||
|
|
||||||
def getMDEVenue(venue):
|
def getMDEVenue(venue, event):
|
||||||
if venue.name == "DANCEFREE":
|
if venue.name == "DANCEFREE":
|
||||||
venue.website = "https://www.instagram.com/dancefreeco"
|
venue.website = "https://www.instagram.com/dancefreeco"
|
||||||
if venue.name == "Vintrash":
|
if venue.name == "Vintrash":
|
||||||
@@ -297,6 +336,7 @@ def getMDEVenue(venue):
|
|||||||
if "Concious Warrior" in event['strSummary']:
|
if "Concious Warrior" in event['strSummary']:
|
||||||
venue.website = "https://www.consciouscolombia.com/"
|
venue.website = "https://www.consciouscolombia.com/"
|
||||||
venue.save()
|
venue.save()
|
||||||
|
print(venue)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get iCal events for Medellin & OnlineEvents
|
# Get iCal events for Medellin & OnlineEvents
|
||||||
@@ -317,45 +357,49 @@ def getiCalRepeateEvents(gcal, scraper, venue, event_type, cal):
|
|||||||
}
|
}
|
||||||
if event['dateStamp'] != None:
|
if event['dateStamp'] != None:
|
||||||
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']) + " UTC", '%Y-%m-%d %H:%M:%S%z %Z')
|
||||||
|
event['timezone'] = str(event['dateStart'])[-6:].strip()
|
||||||
rules = component.get('RRule')
|
rules = component.get('RRule')
|
||||||
try:
|
try:
|
||||||
if rules['FREQ'][0] == 'WEEKLY':
|
if rules['FREQ'][0] == 'WEEKLY':
|
||||||
if datetime.today().weekday() != 0:
|
date = datetime.today().date() - timedelta(days=datetime.today().weekday())
|
||||||
event = splitLocation(event, city="Medellin")
|
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())
|
event = splitLocation(event, city="Medellin")
|
||||||
days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"]
|
for day in rules['BYDAY']:
|
||||||
for day in rules['BYDAY']:
|
nday = days.index(day)
|
||||||
day = days.index(day)
|
if cal == 'mde':
|
||||||
if cal == 'mde':
|
getMDEVenue(event['venue'],event)
|
||||||
getVenue(event['venue'])
|
print(event)
|
||||||
iCalEventRepeatFilter(day, date, event, scraper, event['venue'], "Ed")
|
iCalEventRepeatFilter(nday, date, event, scraper, event['venue'], "Ed")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Error: ", event, e, "\n\n\n\n")
|
print("Error: ", e, "\n\n")
|
||||||
|
# ppr(event)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def iCalEventRepeatFilter(day, date, event, scraper, venue, event_type):
|
def iCalEventRepeatFilter(day, date, event, scraper, venue, event_type):
|
||||||
|
print("repeate events")
|
||||||
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']
|
dateStart = str(event['dateStamp']) + event['timezone'] + ' UTC'
|
||||||
|
event['eventDate'] = dateStart
|
||||||
createCleanIcalEvent(event, scraper, venue, event_type)
|
createCleanIcalEvent(event, scraper, venue, event_type)
|
||||||
return
|
return
|
||||||
|
|
||||||
def splitLocation(event, **kwargs):
|
def splitLocation(event, **kwargs):
|
||||||
loc_split = event['strLocation'].split(',')
|
loc_split = event['strLocation'].split(',')
|
||||||
ppr(loc_split)
|
# ppr(loc_split)
|
||||||
venue_name = loc_split[0]
|
venue_name = loc_split[0]
|
||||||
venue, created = Organization.objects.get_or_create(
|
venue, created = Organization.objects.get_or_create(
|
||||||
name=venue_name,
|
name=venue_name,
|
||||||
)
|
)
|
||||||
event['venue'] = venue
|
event['venue'] = venue
|
||||||
# if kwargs['city']:
|
if kwargs['city']:
|
||||||
# venue.city = kwargs['city']
|
venue.city = kwargs['city']
|
||||||
# venue.save()
|
venue.save()
|
||||||
return event
|
return event
|
||||||
|
|
||||||
# ARCHIVED Methods
|
# ARCHIVED Methods
|
||||||
def createBasicArticle(article, event_type, organization):
|
def createBasicArticle(article, event_type, organization):
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 6.0.1 on 2026-01-17 23:50
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('events', '0041_alter_event_calendar'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='event',
|
||||||
|
name='event_type',
|
||||||
|
field=models.CharField(choices=[('Ot', '🤔'), ('Mu', '🎶'), ('Va', 'Visual Art'), ('Gv', '🛠️'), ('Ce', 'Civic Engagement'), ('Ed', '🍎'), ('Ma', 'Mutual Aid'), ('Th', '🎭'), ('Co', '🍿')], default='Mu', max_length=15),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='organization',
|
||||||
|
name='cal',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cal_events', to='events.calendar'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# Generated by Django 6.0.1 on 2026-01-23 13:50
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('events', '0042_alter_event_event_type_alter_organization_cal'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='calendar',
|
||||||
|
options={'ordering': ['name'], 'verbose_name_plural': 'Calendars'},
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='event',
|
||||||
|
name='flyer_img',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='event',
|
||||||
|
name='img_link',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='event',
|
||||||
|
name='show_day',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='promo',
|
||||||
|
name='overlay_image',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='promo',
|
||||||
|
name='promo_image',
|
||||||
|
field=models.ImageField(blank=True, upload_to='promo'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='event',
|
||||||
|
name='event_type',
|
||||||
|
field=models.CharField(choices=[('Ot', '🤔'), ('Mu', '🎶'), ('Va', 'Visual Art'), ('Gv', '🛠️'), ('Ce', 'Civic Engagement'), ('Ed', '🍎'), ('Ma', 'Mutual Aid'), ('Th', '🎭'), ('Co', '🍿'), ('Ex', '💪')], default='Mu', max_length=15),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
# Generated by Django 6.0.1 on 2026-01-24 04:02
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('events', '0043_alter_calendar_options_remove_event_flyer_img_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='organization',
|
||||||
|
old_name='is_listed',
|
||||||
|
new_name='is_member',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='organization',
|
||||||
|
name='address_complete',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='organization',
|
||||||
|
name='contact_email',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='organization',
|
||||||
|
name='contact_name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='organization',
|
||||||
|
name='ein',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='organization',
|
||||||
|
name='membership',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='organization',
|
||||||
|
name='stripe_email',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='event',
|
||||||
|
name='event_type',
|
||||||
|
field=models.CharField(choices=[('Ce', 'Civic Engagement'), ('Co', '🍿'), ('Da', '🪇'), ('Ed', '🍎'), ('Ex', '💪'), ('Gv', '🛠️'), ('Ma', '🤝'), ('Mu', '🎶'), ('Ot', '🤔'), ('Th', '🎭'), ('Va', 'Visual Art')], default='Mu', max_length=15),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Person',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('username', models.CharField(blank=True, max_length=63, null=True)),
|
||||||
|
('email', models.CharField(blank=True, max_length=63, null=True)),
|
||||||
|
('calendar', models.ManyToManyField(blank=True, null=True, to='events.calendar')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name_plural': 'People',
|
||||||
|
'ordering': ['username'],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -2,7 +2,8 @@ from django.db import models
|
|||||||
from django.core.files.storage import FileSystemStorage
|
from django.core.files.storage import FileSystemStorage
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
fs = FileSystemStorage(location='/media/flyers')
|
promo = FileSystemStorage(location='/media/promo')
|
||||||
|
events = FileSystemStorage(location='/media/events')
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
|
|
||||||
class Calendar(models.Model):
|
class Calendar(models.Model):
|
||||||
@@ -14,7 +15,7 @@ class Calendar(models.Model):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name_plural = "Calendars"
|
verbose_name_plural = "Calendars"
|
||||||
ordering = ['-published', 'id',]
|
ordering = ['name',]
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return "%s" % self.shortcode
|
return "%s" % self.shortcode
|
||||||
@@ -55,11 +56,6 @@ class Tags(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class Organization(models.Model):
|
class Organization(models.Model):
|
||||||
MEMBER_TYPE = (
|
|
||||||
('Nm', 'Non-Member'),
|
|
||||||
('Ds', 'DigiSnaxx'),
|
|
||||||
('Dsp', 'DigiSnaxx +')
|
|
||||||
)
|
|
||||||
ORG_TYPE = (
|
ORG_TYPE = (
|
||||||
('Fb', 'Food & Beverage'),
|
('Fb', 'Food & Beverage'),
|
||||||
('Re', 'Retail'),
|
('Re', 'Retail'),
|
||||||
@@ -70,8 +66,8 @@ class Organization(models.Model):
|
|||||||
|
|
||||||
name = models.CharField(max_length=63)
|
name = models.CharField(max_length=63)
|
||||||
website = models.CharField(max_length=126, blank=True, null=True)
|
website = models.CharField(max_length=126, blank=True, null=True)
|
||||||
membership = models.CharField(max_length=31, choices=MEMBER_TYPE, default='0')
|
|
||||||
org_type = models.CharField(max_length=31, choices=ORG_TYPE, default='3')
|
org_type = models.CharField(max_length=31, choices=ORG_TYPE, default='3')
|
||||||
|
cal = models.ForeignKey(Calendar, on_delete=models.CASCADE, blank=True, null=True, related_name="cal_events")
|
||||||
|
|
||||||
short_desc = models.CharField(max_length=63, blank=True, null=True)
|
short_desc = models.CharField(max_length=63, blank=True, null=True)
|
||||||
long_desc = models.TextField(blank=True, null=True)
|
long_desc = models.TextField(blank=True, null=True)
|
||||||
@@ -79,9 +75,7 @@ class Organization(models.Model):
|
|||||||
|
|
||||||
address_numbers = 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_type = models.CharField(max_length=31, blank=True, null=True)
|
||||||
address_complete = models.CharField(max_length=63, blank=True, null=True)
|
|
||||||
|
|
||||||
cal = models.ForeignKey(Calendar, on_delete=models.CASCADE, related_name="cal_events")
|
|
||||||
barrio = models.CharField(max_length=127, 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)
|
||||||
@@ -90,17 +84,13 @@ 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_listed= models.BooleanField(default=False)
|
is_member= models.BooleanField(default=False)
|
||||||
is_501c = models.BooleanField(default=False)
|
is_501c = models.BooleanField(default=False)
|
||||||
is_venue= models.BooleanField(default=False)
|
is_venue= models.BooleanField(default=False)
|
||||||
|
|
||||||
latitude = models.FloatField(blank=True, null=True)
|
latitude = models.FloatField(blank=True, null=True)
|
||||||
longitude = models.FloatField(blank=True, null=True)
|
longitude = models.FloatField(blank=True, null=True)
|
||||||
|
|
||||||
contact_name = models.CharField(max_length=63, blank=True, null=True)
|
|
||||||
contact_email = models.CharField(max_length=63, blank=True, null=True)
|
|
||||||
stripe_email = models.CharField(max_length=63, blank=True, null=True)
|
|
||||||
ein = models.CharField(max_length=15, blank=True, null=True)
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ("name", "is_venue")
|
unique_together = ("name", "is_venue")
|
||||||
@@ -114,17 +104,40 @@ class Organization(models.Model):
|
|||||||
return u'%s' % self.name
|
return u'%s' % self.name
|
||||||
|
|
||||||
|
|
||||||
|
class Person(models.Model):
|
||||||
|
username = models.CharField(max_length=63, blank=True, null=True)
|
||||||
|
email = models.CharField(max_length=63, blank=True, null=True)
|
||||||
|
calendar = models.ManyToManyField(Calendar, blank=True, null=True)
|
||||||
|
event_prefs = models.CharField()
|
||||||
|
ad_prefs = models.CharField()
|
||||||
|
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name_plural = "People"
|
||||||
|
ordering = ['username']
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return "%s" % self.username
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u'%s' % self.username
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Event(models.Model):
|
class Event(models.Model):
|
||||||
EVENT_TYPE = (
|
EVENT_TYPE = (
|
||||||
('Ot', '🤔'),
|
|
||||||
('Mu', '🎶'),
|
|
||||||
('Va', 'Visual Art'),
|
|
||||||
('Gv', '🛠️'),
|
|
||||||
('Ce', 'Civic Engagement'),
|
('Ce', 'Civic Engagement'),
|
||||||
('Ed', '🍎'),
|
|
||||||
('Ma', 'Mutual Aid'),
|
|
||||||
('Th', '🎭'),
|
|
||||||
('Co', '🍿'),
|
('Co', '🍿'),
|
||||||
|
('Da', '🪇'),
|
||||||
|
('Ed', '🍎'),
|
||||||
|
('Ex' ,'💪'),
|
||||||
|
('Gv', '🛠️'),
|
||||||
|
('Ma', '🤝'),
|
||||||
|
('Mu', '🎶'),
|
||||||
|
('Ot', '🤔'),
|
||||||
|
('Th', '🎭'),
|
||||||
|
('Va', 'Visual Art'),
|
||||||
)
|
)
|
||||||
EVENT_STATE = (
|
EVENT_STATE = (
|
||||||
('live', 'Live & Direct'),
|
('live', 'Live & Direct'),
|
||||||
@@ -135,7 +148,6 @@ 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.ManyToManyField(Calendar, blank=True, null=True, related_name="events")
|
calendar = models.ManyToManyField(Calendar, blank=True, null=True, related_name="events")
|
||||||
scraper = models.ForeignKey(Scraper, on_delete=models.CASCADE, null=True)
|
scraper = models.ForeignKey(Scraper, on_delete=models.CASCADE, null=True)
|
||||||
@@ -143,9 +155,8 @@ class Event(models.Model):
|
|||||||
|
|
||||||
live = models.CharField(max_length=4, choices=EVENT_STATE, default='live')
|
live = models.CharField(max_length=4, choices=EVENT_STATE, default='live')
|
||||||
event_type = models.CharField(max_length=15, choices=EVENT_TYPE, default='Mu')
|
event_type = models.CharField(max_length=15, choices=EVENT_TYPE, default='Mu')
|
||||||
|
event_image = models.ImageField(upload_to="events", blank=True)
|
||||||
img_link = models.URLField(max_length=255, blank=True, null=True)
|
event_image_url = models.URLField(blank=True, null=True)
|
||||||
flyer_img = models.ImageField(upload_to=fs, blank=True, null=True)
|
|
||||||
|
|
||||||
guests = models.CharField(max_length=255, blank=True, null=True)
|
guests = models.CharField(max_length=255, blank=True, null=True)
|
||||||
more_details = models.JSONField(blank=True, null=True)
|
more_details = models.JSONField(blank=True, null=True)
|
||||||
@@ -165,25 +176,25 @@ class Event(models.Model):
|
|||||||
|
|
||||||
class Promo(models.Model):
|
class Promo(models.Model):
|
||||||
PROMO_TYPE = (
|
PROMO_TYPE = (
|
||||||
('Ar', 'Art'),
|
('Ar', '🎨'),
|
||||||
('Fo', 'Food'),
|
('Fo', '🥙'),
|
||||||
('Ev', 'Event'),
|
('Ev', '🎟️'),
|
||||||
('Re', 'Retail'),
|
('Re', '🛍️'),
|
||||||
('Sv', 'Service'),
|
('Sv', '☎️'),
|
||||||
('Ma', 'Mutual Aid'),
|
('Ma', '🪢'),
|
||||||
('Ca', 'Classified'),
|
('Ca', '📌'),
|
||||||
('Jo', 'Job Opening'),
|
('Jo', '🪤'),
|
||||||
('Ja', 'Journal Article'),
|
('Ja', '✒️'),
|
||||||
('Sp', 'Startup Pitch'),
|
('Sp', '💡'),
|
||||||
('An', 'Academia Nut'),
|
('An', '🩺'),
|
||||||
('Su', 'Survey Question')
|
('Su', '🧩'),
|
||||||
)
|
)
|
||||||
|
|
||||||
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)
|
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='Ar')
|
||||||
overlay_image = models.ImageField(upload_to="overlays", blank=True)
|
promo_image = models.ImageField(upload_to="promo", blank=True)
|
||||||
short_text = models.CharField(max_length=255,blank=True, null=True)
|
short_text = models.CharField(max_length=255,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)
|
||||||
|
|||||||
@@ -67,9 +67,10 @@ class CalSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
class PromoSerializer(serializers.ModelSerializer):
|
class PromoSerializer(serializers.ModelSerializer):
|
||||||
organization = OrganizationSerializer(many=False)
|
organization = OrganizationSerializer(many=False)
|
||||||
|
promo_emoji = serializers.CharField(source='get_promo_type_display')
|
||||||
# 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', 'target_link')
|
fields = ('id', 'title', 'organization', 'promo_type', 'long_text', 'short_text', 'promo_image', 'target_link', 'promo_emoji')
|
||||||
fields = '__all__'
|
# fields = '__all__'
|
||||||
depth = 2
|
depth = 2
|
||||||
@@ -37,11 +37,22 @@ class CalAPIView(generics.ListAPIView):
|
|||||||
|
|
||||||
class EventsAPIView(generics.ListAPIView):
|
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_day')
|
||||||
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
|
queryset = Event.objects.all()
|
||||||
filterset_fields = ['show_title', 'event_type', 'venue__name','show_day', 'calendar__shortcode',]
|
# filter_backends = [DjangoFilterBackend, filters.SearchFilter]
|
||||||
search_fields = ['show_title', 'event_type','show_day', 'venue__name', 'calendar__shortcode',]
|
# filterset_fields = ['show_title', 'event_type', 'venue__name','show_day', 'calendar__shortcode', 'show_date',]
|
||||||
permission_classes = [HasAPIKey]
|
# search_fields = ['show_title', 'event_type','show_day', 'venue__name', 'calendar__shortcode',]
|
||||||
|
# permission_classes = [HasAPIKey]
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
calendar = self.request.GET.get('calendar__shortcode')
|
||||||
|
show_day = self.request.GET.get('show_date')
|
||||||
|
if self.request.GET.get('event_type') != None:
|
||||||
|
event_type = self.request.GET.get('event_type')
|
||||||
|
queryset = Event.objects.filter(event_type=event_type,calendar__shortcode=calendar,show_date__gte=show_day).order_by('show_date')
|
||||||
|
return queryset
|
||||||
|
queryset = Event.objects.filter(calendar__shortcode=calendar,show_date__gte=show_day).order_by('show_date')
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class PromoAPIView(generics.ListAPIView):
|
class PromoAPIView(generics.ListAPIView):
|
||||||
@@ -49,7 +60,7 @@ class PromoAPIView(generics.ListAPIView):
|
|||||||
queryset = Promo.objects.filter(published=True)
|
queryset = Promo.objects.filter(published=True)
|
||||||
filterset_fields = ['organization__name', 'calendar__shortcode',]
|
filterset_fields = ['organization__name', 'calendar__shortcode',]
|
||||||
search_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):
|
||||||
calendar = self.request.GET.get('calendar__shortcode')
|
calendar = self.request.GET.get('calendar__shortcode')
|
||||||
|
|||||||
BIN
media/promo/AshantiMDE.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
media/promo/DigiSnaxx.bcard.back.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
media/promo/GlobalBoom.png
Normal file
|
After Width: | Height: | Size: 3.6 MiB |
BIN
media/promo/LG_mochila.jpg
Normal file
|
After Width: | Height: | Size: 440 KiB |
BIN
media/promo/ManifestingEmpathy.ghost.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
media/promo/PosterPic.jpg
Normal file
|
After Width: | Height: | Size: 278 KiB |
BIN
media/promo/PosterPic_7Ns9Omz.jpg
Normal file
|
After Width: | Height: | Size: 278 KiB |
BIN
media/promo/PosterPic_ji26Rj0.jpg
Normal file
|
After Width: | Height: | Size: 278 KiB |
BIN
media/promo/ProfileMundoViejo.circle.png
Normal file
|
After Width: | Height: | Size: 789 KiB |
|
Before Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 103 KiB |
BIN
media/promo/acido_artesanias.jpg
Normal file
|
After Width: | Height: | Size: 512 KiB |
BIN
media/promo/ananta.infinito.jpg
Normal file
|
After Width: | Height: | Size: 319 KiB |
BIN
media/promo/andino.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
media/promo/andino_kLUymdb.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
media/promo/cafe_don_arturo.jpg
Normal file
|
After Width: | Height: | Size: 179 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 32 KiB |
BIN
media/promo/eye9.png
Normal file
|
After Width: | Height: | Size: 730 KiB |
BIN
media/promo/hero1.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 81 KiB |
BIN
media/promo/pacha_mamista.jpeg
Normal file
|
After Width: | Height: | Size: 212 KiB |
BIN
media/promo/sbadge.f2.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
media/promo/sbadge.f2i.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
media/promo/sbadge_I0j5yEb.f2.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 43 KiB |
BIN
media/promo/tierra_miaa.jpg
Normal file
|
After Width: | Height: | Size: 506 KiB |
BIN
media/promo/yajulivelas.jpg
Normal file
|
After Width: | Height: | Size: 344 KiB |