diff --git a/events/admin.py b/events/admin.py index d9b7b06..aef9617 100644 --- a/events/admin.py +++ b/events/admin.py @@ -13,7 +13,7 @@ class ScraperAdmin(admin.ModelAdmin): class OrganizationAdmin(admin.ModelAdmin): # prepopulated_fields = {"slug": ("shortname",)} list_display = ( "name", "city",) - # list_filter = ("promo_type",) + list_filter = ("city",) class EventAdmin(admin.ModelAdmin): # prepopulated_fields = {"slug": ("shortname",)} @@ -22,7 +22,7 @@ class EventAdmin(admin.ModelAdmin): class PromoAdmin(admin.ModelAdmin): # 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") def get_calendars(self, obj): @@ -34,4 +34,4 @@ admin.site.register(Promo, PromoAdmin) admin.site.register(Event, EventAdmin) admin.site.register(Scraper, ScraperAdmin) admin.site.register(Calendar, CalendarAdmin) -admin.site.register(Organization, OrganizationAdmin) \ No newline at end of file +admin.site.register(Organization, OrganizationAdmin) diff --git a/events/digitools.py b/events/digitools.py index 811240d..3ed7589 100644 --- a/events/digitools.py +++ b/events/digitools.py @@ -17,19 +17,40 @@ from events.models import Event as DSEvent, Organization, Promo, Scraper, Calend plus_one_month = relativedelta.relativedelta(months=1) 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) def getScraper(venue, website, cal): virtcal = Calendar.objects.get(shortcode='000') + ncal = Calendar.objects.get(shortcode=cal) try: scraper, created = Scraper.objects.get_or_create( name=venue.name, website=website, - calendar = Calendar.objects.get(shortcode=cal), + calendar = ncal, items = 0, new_items = 0, last_ran = datetime.now(), ) + venue.cal = ncal + venue.save() except Exception as e: print(e) scraper = Scraper.objects.get(name=venue.name) @@ -51,11 +72,11 @@ def updateScraper(scraper, item_count_start): # Get site HTML content for XPATH travel def getSource(browser, link): browser.get(link) - sleep(5) + sleep(6) ps = html.fromstring(browser.page_source) 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 def getBrowser(run_env): if run_env == 'dev': @@ -154,6 +175,7 @@ def createDashURL(site_url): # Add Calendar to Event Object (maybe extraneous) def add_calendar(event, calendar): + print("Add Calendar", type(event), event, calendar) if type(event) is tuple: event = event[0] cal = Calendar.objects.get(shortcode=calendar) @@ -173,18 +195,21 @@ def add_calendars(event, data): # Create Basic DigiSnaxx Event def createBasicEvent(event, event_type, venue): - new_event, created = DSEvent.objects.update_or_create( - event_type = event_type, - show_title = event['title'], - show_link = event['link'], - show_date = event['dateStamp'], - show_day = event['dateStamp'], - scraper = event['scraper'], - venue = venue - ) - new_event = add_calendars(new_event, event) - # print("\n+new event+") - return new_event, created + try: + new_event, created = DSEvent.objects.update_or_create( + event_type = event_type, + show_title = event['title'], + show_link = event['link'], + show_date = event['dateStamp'], + scraper = event['scraper'], + venue = venue + ) + new_event = add_calendars(new_event, event) + print("\n+new event+") + return new_event, created + except Exception as e: + print("Error: ", e) + return None, None # Create iCal Event def createBasiciCalEvent(event, event_type, venue): @@ -192,8 +217,21 @@ def createBasiciCalEvent(event, event_type, venue): event_type = event_type, show_title = event['title'][0], show_link = event['link'], - show_date = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S'), - show_day = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S'), + show_date = datetime.strptime(str(event['dateStamp'][0]), '%Y-%m-%d %H:%M:%S%z %Z'), + 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'], venue = venue ) @@ -209,7 +247,6 @@ def createDetailedEvent(event, event_type, venue, scraper): show_title = event["show_title"], show_link = event["link"], show_date = event["dateStamp"], - show_day = event['dateStamp'], guests = " ".join(event["guests"]), more_details = event["details"], scraper = event['scraper'], @@ -221,7 +258,7 @@ def createDetailedEvent(event, event_type, venue, scraper): # Create iCal event from DF_Online & Medellin def createCleanIcalEvent(event, scraper, venue, event_type): - new_date = event['dateStart'] + new_date = event['eventDate'] new_event = {} new_event['scraper'] = scraper new_event['calendars'] = scraper.calendar @@ -229,6 +266,8 @@ def createCleanIcalEvent(event, scraper, venue, event_type): new_event['date'] = str(new_date), new_event['dateStamp'] = str(new_date), new_event['link'] = venue.website + print("New Event") +# ppr(new_event) createBasiciCalEvent(new_event, event_type, venue) # Get events from iCal @@ -279,7 +318,7 @@ def buildiCalEvents(events, event_type, scraper, venue): scraper.save() return -def getMDEVenue(venue): +def getMDEVenue(venue, event): if venue.name == "DANCEFREE": venue.website = "https://www.instagram.com/dancefreeco" if venue.name == "Vintrash": @@ -297,6 +336,7 @@ def getMDEVenue(venue): if "Concious Warrior" in event['strSummary']: venue.website = "https://www.consciouscolombia.com/" venue.save() + print(venue) return # Get iCal events for Medellin & OnlineEvents @@ -317,45 +357,49 @@ def getiCalRepeateEvents(gcal, scraper, venue, event_type, cal): } if event['dateStamp'] != None: 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') try: if rules['FREQ'][0] == 'WEEKLY': - if datetime.today().weekday() != 0: - event = splitLocation(event, city="Medellin") - 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) - if cal == 'mde': - getVenue(event['venue']) - iCalEventRepeatFilter(day, date, event, scraper, event['venue'], "Ed") + date = datetime.today().date() - timedelta(days=datetime.today().weekday()) + date = datetime.combine(date, event['dateStart'].time()) + days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"] + event = splitLocation(event, city="Medellin") + for day in rules['BYDAY']: + nday = days.index(day) + if cal == 'mde': + getMDEVenue(event['venue'],event) + print(event) + iCalEventRepeatFilter(nday, date, event, scraper, event['venue'], "Ed") except Exception as e: - print("Error: ", event, e, "\n\n\n\n") + print("Error: ", e, "\n\n") +# ppr(event) pass def iCalEventRepeatFilter(day, date, event, scraper, venue, event_type): + print("repeate events") days = [day-1, day+6, day+13] for day in days: 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) return def splitLocation(event, **kwargs): - loc_split = event['strLocation'].split(',') - ppr(loc_split) - venue_name = loc_split[0] - venue, created = Organization.objects.get_or_create( - name=venue_name, - ) - event['venue'] = venue - # if kwargs['city']: - # venue.city = kwargs['city'] - # venue.save() - return event + loc_split = event['strLocation'].split(',') +# ppr(loc_split) + venue_name = loc_split[0] + venue, created = Organization.objects.get_or_create( + name=venue_name, + ) + event['venue'] = venue + if kwargs['city']: + venue.city = kwargs['city'] + venue.save() + return event # ARCHIVED Methods def createBasicArticle(article, event_type, organization): @@ -366,4 +410,4 @@ def createBasicArticle(article, event_type, organization): published = True, organization = organization ) - return new_article, created \ No newline at end of file + return new_article, created diff --git a/events/migrations/0042_alter_event_event_type_alter_organization_cal.py b/events/migrations/0042_alter_event_event_type_alter_organization_cal.py new file mode 100644 index 0000000..f1c245f --- /dev/null +++ b/events/migrations/0042_alter_event_event_type_alter_organization_cal.py @@ -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'), + ), + ] diff --git a/events/migrations/0043_alter_calendar_options_remove_event_flyer_img_and_more.py b/events/migrations/0043_alter_calendar_options_remove_event_flyer_img_and_more.py new file mode 100644 index 0000000..40ee0fb --- /dev/null +++ b/events/migrations/0043_alter_calendar_options_remove_event_flyer_img_and_more.py @@ -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), + ), + ] diff --git a/events/migrations/0044_rename_is_listed_organization_is_member_and_more.py b/events/migrations/0044_rename_is_listed_organization_is_member_and_more.py new file mode 100644 index 0000000..7878fd8 --- /dev/null +++ b/events/migrations/0044_rename_is_listed_organization_is_member_and_more.py @@ -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'], + }, + ), + ] diff --git a/events/models.py b/events/models.py index 0b8b691..4a6754d 100644 --- a/events/models.py +++ b/events/models.py @@ -2,7 +2,8 @@ from django.db import models from django.core.files.storage import FileSystemStorage 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. class Calendar(models.Model): @@ -14,7 +15,7 @@ class Calendar(models.Model): class Meta: verbose_name_plural = "Calendars" - ordering = ['-published', 'id',] + ordering = ['name',] def __unicode__(self): return "%s" % self.shortcode @@ -55,11 +56,6 @@ class Tags(models.Model): class Organization(models.Model): - MEMBER_TYPE = ( - ('Nm', 'Non-Member'), - ('Ds', 'DigiSnaxx'), - ('Dsp', 'DigiSnaxx +') - ) ORG_TYPE = ( ('Fb', 'Food & Beverage'), ('Re', 'Retail'), @@ -70,8 +66,8 @@ class Organization(models.Model): name = models.CharField(max_length=63) 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') + 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) 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_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) city = models.CharField(max_length=31, 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) 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_venue= models.BooleanField(default=False) latitude = models.FloatField(blank=True, null=True) longitude = models.FloatField(blank=True, null=True) - contact_name = models.CharField(max_length=63, blank=True, null=True) - contact_email = models.CharField(max_length=63, blank=True, null=True) - stripe_email = models.CharField(max_length=63, blank=True, null=True) - ein = models.CharField(max_length=15, blank=True, null=True) class Meta: unique_together = ("name", "is_venue") @@ -114,17 +104,40 @@ class Organization(models.Model): 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): EVENT_TYPE = ( - ('Ot', '๐Ÿค”'), - ('Mu', '๐ŸŽถ'), - ('Va', 'Visual Art'), - ('Gv', '๐Ÿ› ๏ธ'), ('Ce', 'Civic Engagement'), - ('Ed', '๐ŸŽ'), - ('Ma', 'Mutual Aid'), - ('Th', '๐ŸŽญ'), ('Co', '๐Ÿฟ'), + ('Da', '๐Ÿช‡'), + ('Ed', '๐ŸŽ'), + ('Ex' ,'๐Ÿ’ช'), + ('Gv', '๐Ÿ› ๏ธ'), + ('Ma', '๐Ÿค'), + ('Mu', '๐ŸŽถ'), + ('Ot', '๐Ÿค”'), + ('Th', '๐ŸŽญ'), + ('Va', 'Visual Art'), ) EVENT_STATE = ( ('live', 'Live & Direct'), @@ -135,7 +148,6 @@ class Event(models.Model): show_title = models.CharField(max_length=127, blank=True, null=True) show_link = models.URLField(blank=True, null=True) show_date = models.DateTimeField() - show_day = models.DateField() calendar = models.ManyToManyField(Calendar, blank=True, null=True, related_name="events") 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') event_type = models.CharField(max_length=15, choices=EVENT_TYPE, default='Mu') - - img_link = models.URLField(max_length=255, blank=True, null=True) - flyer_img = models.ImageField(upload_to=fs, blank=True, null=True) + event_image = models.ImageField(upload_to="events", blank=True) + event_image_url = models.URLField(blank=True, null=True) guests = models.CharField(max_length=255, blank=True, null=True) more_details = models.JSONField(blank=True, null=True) @@ -165,25 +176,25 @@ class Event(models.Model): class Promo(models.Model): PROMO_TYPE = ( - ('Ar', 'Art'), - ('Fo', 'Food'), - ('Ev', 'Event'), - ('Re', 'Retail'), - ('Sv', 'Service'), - ('Ma', 'Mutual Aid'), - ('Ca', 'Classified'), - ('Jo', 'Job Opening'), - ('Ja', 'Journal Article'), - ('Sp', 'Startup Pitch'), - ('An', 'Academia Nut'), - ('Su', 'Survey Question') + ('Ar', '๐ŸŽจ'), + ('Fo', '๐Ÿฅ™'), + ('Ev', '๐ŸŽŸ๏ธ'), + ('Re', '๐Ÿ›๏ธ'), + ('Sv', 'โ˜Ž๏ธ'), + ('Ma', '๐Ÿชข'), + ('Ca', '๐Ÿ“Œ'), + ('Jo', '๐Ÿชค'), + ('Ja', 'โœ’๏ธ'), + ('Sp', '๐Ÿ’ก'), + ('An', '๐Ÿฉบ'), + ('Su', '๐Ÿงฉ'), ) title = models.CharField(max_length=63) organization = models.ForeignKey(Organization, on_delete=models.CASCADE) calendar = models.ManyToManyField(Calendar, blank=True, null=True) - promo_type = models.CharField(max_length=15, choices=PROMO_TYPE, default='0') - overlay_image = models.ImageField(upload_to="overlays", blank=True) + promo_type = models.CharField(max_length=15, choices=PROMO_TYPE, default='Ar') + promo_image = models.ImageField(upload_to="promo", blank=True) short_text = models.CharField(max_length=255,blank=True, null=True) long_text = models.TextField(blank=True, null=True) target_link = models.URLField(blank=True, null=True) @@ -229,4 +240,4 @@ class Promo(models.Model): # )) # def __str__(self): -# return f"{self.user.username}: {self.scope}" \ No newline at end of file +# return f"{self.user.username}: {self.scope}" diff --git a/events/serializers.py b/events/serializers.py index d6a97cf..3556551 100644 --- a/events/serializers.py +++ b/events/serializers.py @@ -67,9 +67,10 @@ class CalSerializer(serializers.ModelSerializer): class PromoSerializer(serializers.ModelSerializer): organization = OrganizationSerializer(many=False) + promo_emoji = serializers.CharField(source='get_promo_type_display') # event_type = serializers.CharField(source='get_event_type_display') class Meta: model = Promo - # fields = ('id', 'title', 'organization', 'promo_type', 'long_text', 'short_text', 'overlay_image', 'target_link') - fields = '__all__' + fields = ('id', 'title', 'organization', 'promo_type', 'long_text', 'short_text', 'promo_image', 'target_link', 'promo_emoji') + # fields = '__all__' depth = 2 \ No newline at end of file diff --git a/events/views.py b/events/views.py index 3ac3053..c13b7c9 100644 --- a/events/views.py +++ b/events/views.py @@ -37,11 +37,22 @@ class CalAPIView(generics.ListAPIView): class EventsAPIView(generics.ListAPIView): serializer_class = EventSerializer - queryset = Event.objects.filter(show_date__gte=odt).order_by('show_date') - filter_backends = [DjangoFilterBackend, filters.SearchFilter] - filterset_fields = ['show_title', 'event_type', 'venue__name','show_day', 'calendar__shortcode',] - search_fields = ['show_title', 'event_type','show_day', 'venue__name', 'calendar__shortcode',] - permission_classes = [HasAPIKey] +# queryset = Event.objects.filter(show_date__gte=odt).order_by('show_day') + queryset = Event.objects.all() +# filter_backends = [DjangoFilterBackend, filters.SearchFilter] +# filterset_fields = ['show_title', 'event_type', 'venue__name','show_day', 'calendar__shortcode', 'show_date',] +# 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): @@ -49,7 +60,7 @@ class PromoAPIView(generics.ListAPIView): 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): calendar = self.request.GET.get('calendar__shortcode') diff --git a/media/promo/AshantiMDE.jpg b/media/promo/AshantiMDE.jpg new file mode 100644 index 0000000..27667f8 Binary files /dev/null and b/media/promo/AshantiMDE.jpg differ diff --git a/media/promo/DigiSnaxx.bcard.back.png b/media/promo/DigiSnaxx.bcard.back.png new file mode 100644 index 0000000..5100c36 Binary files /dev/null and b/media/promo/DigiSnaxx.bcard.back.png differ diff --git a/media/promo/GlobalBoom.png b/media/promo/GlobalBoom.png new file mode 100644 index 0000000..dd57f2a Binary files /dev/null and b/media/promo/GlobalBoom.png differ diff --git a/media/promo/LG_mochila.jpg b/media/promo/LG_mochila.jpg new file mode 100644 index 0000000..66c476d Binary files /dev/null and b/media/promo/LG_mochila.jpg differ diff --git a/media/promo/ManifestingEmpathy.ghost.png b/media/promo/ManifestingEmpathy.ghost.png new file mode 100644 index 0000000..931d46e Binary files /dev/null and b/media/promo/ManifestingEmpathy.ghost.png differ diff --git a/media/promo/PosterPic.jpg b/media/promo/PosterPic.jpg new file mode 100644 index 0000000..08fdd63 Binary files /dev/null and b/media/promo/PosterPic.jpg differ diff --git a/media/promo/PosterPic_7Ns9Omz.jpg b/media/promo/PosterPic_7Ns9Omz.jpg new file mode 100644 index 0000000..08fdd63 Binary files /dev/null and b/media/promo/PosterPic_7Ns9Omz.jpg differ diff --git a/media/promo/PosterPic_ji26Rj0.jpg b/media/promo/PosterPic_ji26Rj0.jpg new file mode 100644 index 0000000..08fdd63 Binary files /dev/null and b/media/promo/PosterPic_ji26Rj0.jpg differ diff --git a/media/promo/ProfileMundoViejo.circle.png b/media/promo/ProfileMundoViejo.circle.png new file mode 100644 index 0000000..835c63d Binary files /dev/null and b/media/promo/ProfileMundoViejo.circle.png differ diff --git a/media/promo/SOL_Sign.invert2.png b/media/promo/SOL_Sign.invert2.png deleted file mode 100644 index 264019a..0000000 Binary files a/media/promo/SOL_Sign.invert2.png and /dev/null differ diff --git a/media/promo/SOL_Sign.png b/media/promo/SOL_Sign.png deleted file mode 100644 index 264019a..0000000 Binary files a/media/promo/SOL_Sign.png and /dev/null differ diff --git a/media/promo/acido_artesanias.jpg b/media/promo/acido_artesanias.jpg new file mode 100644 index 0000000..7b79abb Binary files /dev/null and b/media/promo/acido_artesanias.jpg differ diff --git a/media/promo/ananta.infinito.jpg b/media/promo/ananta.infinito.jpg new file mode 100644 index 0000000..2758f37 Binary files /dev/null and b/media/promo/ananta.infinito.jpg differ diff --git a/media/promo/andino.png b/media/promo/andino.png new file mode 100644 index 0000000..a5e88dc Binary files /dev/null and b/media/promo/andino.png differ diff --git a/media/promo/andino_kLUymdb.png b/media/promo/andino_kLUymdb.png new file mode 100644 index 0000000..a5e88dc Binary files /dev/null and b/media/promo/andino_kLUymdb.png differ diff --git a/media/promo/cafe_don_arturo.jpg b/media/promo/cafe_don_arturo.jpg new file mode 100644 index 0000000..8379f69 Binary files /dev/null and b/media/promo/cafe_don_arturo.jpg differ diff --git a/media/promo/desk/SOL_Sign.invert.png b/media/promo/desk/SOL_Sign.invert.png deleted file mode 100644 index 52363d6..0000000 Binary files a/media/promo/desk/SOL_Sign.invert.png and /dev/null differ diff --git a/media/promo/desk/SOL_Sign.invert_250.png b/media/promo/desk/SOL_Sign.invert_250.png deleted file mode 100644 index 03b920c..0000000 Binary files a/media/promo/desk/SOL_Sign.invert_250.png and /dev/null differ diff --git a/media/promo/desk/SOL_Sign.invert_300.png b/media/promo/desk/SOL_Sign.invert_300.png deleted file mode 100644 index 73a0f83..0000000 Binary files a/media/promo/desk/SOL_Sign.invert_300.png and /dev/null differ diff --git a/media/promo/eye9.png b/media/promo/eye9.png new file mode 100644 index 0000000..2c5e2f9 Binary files /dev/null and b/media/promo/eye9.png differ diff --git a/media/promo/hero1.png b/media/promo/hero1.png new file mode 100644 index 0000000..5050aa9 Binary files /dev/null and b/media/promo/hero1.png differ diff --git a/media/promo/mobile/SOL_Sign.invert.png b/media/promo/mobile/SOL_Sign.invert.png deleted file mode 100644 index 8e0b3ab..0000000 Binary files a/media/promo/mobile/SOL_Sign.invert.png and /dev/null differ diff --git a/media/promo/pa_cover.jpg b/media/promo/pa_cover.jpg deleted file mode 100644 index ea5e37a..0000000 Binary files a/media/promo/pa_cover.jpg and /dev/null differ diff --git a/media/promo/pa_cover_GYcVScF.jpg b/media/promo/pa_cover_GYcVScF.jpg deleted file mode 100644 index ea5e37a..0000000 Binary files a/media/promo/pa_cover_GYcVScF.jpg and /dev/null differ diff --git a/media/promo/pa_cover_OjpadWL.jpg b/media/promo/pa_cover_OjpadWL.jpg deleted file mode 100644 index ea5e37a..0000000 Binary files a/media/promo/pa_cover_OjpadWL.jpg and /dev/null differ diff --git a/media/promo/pacha_mamista.jpeg b/media/promo/pacha_mamista.jpeg new file mode 100644 index 0000000..a3cbe93 Binary files /dev/null and b/media/promo/pacha_mamista.jpeg differ diff --git a/media/promo/sbadge.f2.png b/media/promo/sbadge.f2.png new file mode 100644 index 0000000..ff1bd3d Binary files /dev/null and b/media/promo/sbadge.f2.png differ diff --git a/media/promo/sbadge.f2i.png b/media/promo/sbadge.f2i.png new file mode 100644 index 0000000..81ac40f Binary files /dev/null and b/media/promo/sbadge.f2i.png differ diff --git a/media/promo/sbadge_I0j5yEb.f2.png b/media/promo/sbadge_I0j5yEb.f2.png new file mode 100644 index 0000000..ff1bd3d Binary files /dev/null and b/media/promo/sbadge_I0j5yEb.f2.png differ diff --git a/media/promo/soltoken.png b/media/promo/soltoken.png deleted file mode 100644 index 4ca7b8c..0000000 Binary files a/media/promo/soltoken.png and /dev/null differ diff --git a/media/promo/tierra_miaa.jpg b/media/promo/tierra_miaa.jpg new file mode 100644 index 0000000..4ecc2c2 Binary files /dev/null and b/media/promo/tierra_miaa.jpg differ diff --git a/media/promo/yajulivelas.jpg b/media/promo/yajulivelas.jpg new file mode 100644 index 0000000..73ce11e Binary files /dev/null and b/media/promo/yajulivelas.jpg differ