lots of updates ... eeks

This commit is contained in:
2026-01-24 12:47:25 -05:00
parent aacc0af901
commit 4f4e524640
40 changed files with 291 additions and 97 deletions

View File

@@ -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)
admin.site.register(Organization, OrganizationAdmin)

View File

@@ -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
return new_article, created

View File

@@ -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'),
),
]

View File

@@ -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),
),
]

View File

@@ -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'],
},
),
]

View File

@@ -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}"
# return f"{self.user.username}: {self.scope}"

View File

@@ -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

View File

@@ -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')

BIN
media/promo/AshantiMDE.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
media/promo/GlobalBoom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

BIN
media/promo/LG_mochila.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
media/promo/PosterPic.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 KiB

BIN
media/promo/andino.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

BIN
media/promo/eye9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

BIN
media/promo/hero1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

BIN
media/promo/sbadge.f2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
media/promo/sbadge.f2i.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

BIN
media/promo/tierra_miaa.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

BIN
media/promo/yajulivelas.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB