diff --git a/Taskfile.yaml b/Taskfile.yaml index 7f82d67..b055713 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -108,7 +108,7 @@ tasks: run: desc: Run a local version of PythonIE cmds: - - docker compose run --rm --service-ports web python pythonie/manage.py runserver 0.0.0.0:8000 + - docker compose run --remove-orphans --rm --service-ports web python pythonie/manage.py runserver 0.0.0.0:8000 django:shell-plus: desc: Run Django shell_plus @@ -183,7 +183,12 @@ tasks: stack:pull: desc: Pull the docker images for the stack cmds: - - docker compose pull postgres minio mc + - docker compose pull postgres minio mc redis + + stack:services: + desc: List the services from the docker compose file + cmds: + - docker compose config --services pycon:import:sessionize: desc: Import the information from Sessionize @@ -221,3 +226,8 @@ tasks: desc: Run all tests cmds: - docker compose run --rm -e DJANGO_SETTINGS_MODULE=pythonie.settings.tests web python pythonie/manage.py test pythonie --verbosity=3 + + down: + desc: Stop the docker compose stack + cmds: + - docker compose down diff --git a/pythonie/core/models.py b/pythonie/core/models.py index fe477e6..c498b4f 100644 --- a/pythonie/core/models.py +++ b/pythonie/core/models.py @@ -108,8 +108,6 @@ class HomePage(Page, MeetupMixin, SponsorMixin): subpage_types = [ "HomePage", "SimplePage", - "speakers.SpeakersPage", - "speakers.TalksPage", ] body = StreamField( diff --git a/pythonie/pythonie/settings/base.py b/pythonie/pythonie/settings/base.py index cf463f7..27213f6 100644 --- a/pythonie/pythonie/settings/base.py +++ b/pythonie/pythonie/settings/base.py @@ -14,6 +14,7 @@ # Absolute filesystem path to the Django project directory: PROJECT_ROOT = dirname(dirname(dirname(abspath(__file__)))) +print(f'{PROJECT_ROOT=}') # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ @@ -62,7 +63,6 @@ "storages", "meetups", "sponsors", - "speakers", # 'debug_toolbar', "django_extensions", ) @@ -117,11 +117,6 @@ "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"), "propagate": True, }, - "speakers": { - "handlers": ["console"], - "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"), - "propagate": True, - }, "core": { "handlers": ["console"], "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"), diff --git a/pythonie/pythonie/settings/tests.py b/pythonie/pythonie/settings/tests.py index aa6c9cb..66edea0 100644 --- a/pythonie/pythonie/settings/tests.py +++ b/pythonie/pythonie/settings/tests.py @@ -37,10 +37,6 @@ "handlers": ["console"], "level": os.getenv("DJANGO_LOG_LEVEL", "ERROR"), }, - "speakers": { - "handlers": ["console"], - "level": os.getenv("DJANGO_LOG_LEVEL", "ERROR"), - }, "core": { "handlers": ["console"], "level": os.getenv("DJANGO_LOG_LEVEL", "ERROR"), diff --git a/pythonie/speakers/__init__.py b/pythonie/speakers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pythonie/speakers/admin.py b/pythonie/speakers/admin.py deleted file mode 100644 index b380284..0000000 --- a/pythonie/speakers/admin.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.contrib import admin - -from speakers.models import Speaker, Session, Room - - -class RoomAdmin(admin.ModelAdmin): - list_display = ("name",) - - -admin.site.register(Room, RoomAdmin) - - -class SpeakerAdmin(admin.ModelAdmin): - list_display = ( - "name", - "email", - ) - - -admin.site.register(Speaker, SpeakerAdmin) - - -class SessionAdmin(admin.ModelAdmin): - list_display = ( - "name", - "speaker_names", - "room", - "type", - "state", - "scheduled_at", - ) - - list_filter = ("room", "state", "type") - - search_fields = ["name", "room", "type", "state"] - - @admin.display() - def speaker_names(self, obj): - return ", ".join(speaker.name for speaker in obj.speakers.all()) - - -admin.site.register(Session, SessionAdmin) diff --git a/pythonie/speakers/management/__init__.py b/pythonie/speakers/management/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pythonie/speakers/management/commands/__init__.py b/pythonie/speakers/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pythonie/speakers/management/commands/import-sessionize.py b/pythonie/speakers/management/commands/import-sessionize.py deleted file mode 100644 index 803923d..0000000 --- a/pythonie/speakers/management/commands/import-sessionize.py +++ /dev/null @@ -1,163 +0,0 @@ -import enum -import logging - -import numpy as np -import pandas as pd -from django.core.management.base import BaseCommand, CommandParser -from django.utils.text import slugify -from wagtail.models import Page - -from speakers.models import Speaker, Room, Session - -log = logging.getLogger("import-sessionize") - - -class SessionHeaders(str, enum.Enum): - Id = "Session Id" - Title = "Title" - Description = "Description" - OwnerInformed = "Owner Informed" - OwnerConfirmed = "Owner Confirmed" - Room = "Room" - ScheduledAt = "Scheduled At" - ScheduledDuration = "Scheduled Duration" - SpeakerIds = "Speaker Ids" - - -class SpeakerHeaders(str, enum.Enum): - Id = "Speaker Id" - FirstName = "FirstName" - LastName = "LastName" - Email = "Email" - TagLine = "TagLine" - Bio = "Bio" - ProfilePicture = "Profile Picture" - Blog = "Blog" - Twitter = "Twitter" - LinkedIn = "LinkedIn" - - -SESSION_HEADERS = [member.value for name, member in SessionHeaders.__members__.items()] -print(f"{SESSION_HEADERS=}") -SPEAKER_HEADERS = [member.value for name, member in SpeakerHeaders.__members__.items()] -print(f"{SPEAKER_HEADERS=}") - - -class Command(BaseCommand): - help = "Import the sessionize record" - - def add_arguments(self, parser: CommandParser): - parser.add_argument("--file", "-f", action="store", type=str) - - def handle(self, *args, **options): - self.save_speakers(options) - self.save_sessions(options) - - def save_speakers(self, options): - df_accepted_speakers = pd.read_excel( - options["file"], - sheet_name="Accepted speakers", - ) - speakers = df_accepted_speakers[SPEAKER_HEADERS] - parent_page = Page.objects.get(id=144).specific - print(parent_page.title) - for index, row in speakers.iterrows(): - # print(index, row) - name = f"{row[SpeakerHeaders.FirstName]} {row[SpeakerHeaders.LastName]}" - print(f"{row[SpeakerHeaders.Id]=}") - picture_url = row[SpeakerHeaders.ProfilePicture] - if picture_url is np.nan: - picture_url = "" - try: - speaker = Speaker.objects.get(external_id=row[SpeakerHeaders.Id]) - speaker.name = name - speaker.email = row[SpeakerHeaders.Email] - speaker.biography = row[SpeakerHeaders.Bio] - speaker.picture_url = picture_url - speaker.title = name - except Speaker.DoesNotExist: - speaker = Speaker( - external_id=row[SpeakerHeaders.Id], - name=name, - email=row[SpeakerHeaders.Email], - biography=row[SpeakerHeaders.Bio], - picture_url=picture_url, - title=name, - ) - parent_page.add_child(instance=speaker) - - speaker.save() - speaker.save_revision().publish() - - def save_sessions(self, options): - df_accepted_session = pd.read_excel( - options["file"], - sheet_name="Accepted sessions", - ) - sessions = df_accepted_session[SESSION_HEADERS] - parent_page = Page.objects.get(id=145).specific - - for index, row in sessions.iterrows(): - - if row[SessionHeaders.Room] is np.nan: - continue - - room, created = Room.objects.get_or_create( - name=row[SessionHeaders.Room], - ) - - if row[SessionHeaders.ScheduledAt] is pd.NaT: - continue - - state = Session.StateChoices.ACCEPTED - if row[SessionHeaders.OwnerConfirmed] != "No": - state = Session.StateChoices.CONFIRMED - - session_type = Session.TypeChoices.TALK - if str(row[SessionHeaders.Title]).startswith("Workshop:"): - session_type = Session.TypeChoices.WORKSHOP - - name = row[SessionHeaders.Title] - - print(f"{row[SessionHeaders.Id]=}") - try: - session = Session.objects.get(external_id=row[SessionHeaders.Id]) - session.name = name - session.description = row[SessionHeaders.Description] - session.room = room - session.scheduled_at = row[SessionHeaders.ScheduledAt] - session.duration = row[SessionHeaders.ScheduledDuration] - session.state = state - session.type = session_type - session.title = name - except Session.DoesNotExist: - session = Session( - external_id=row[SessionHeaders.Id], - name=name, - description=row[SessionHeaders.Description], - room=room, - scheduled_at=row[SessionHeaders.ScheduledAt], - duration=row[SessionHeaders.ScheduledDuration], - state=state, - type=session_type, - title=name, - ) - parent_page.add_child(instance=session) - - session.save() - session.save_revision().publish() - - session.speakers.all().delete() - session.save() - - speaker_ids = [ - speaker_id.strip() - for speaker_id in row[SessionHeaders.SpeakerIds].split(",") - ] - for speaker in Speaker.objects.filter(external_id__in=speaker_ids): - session.speakers.add(speaker) - - session.save() - - -# print(f"{session_speakers=}") diff --git a/pythonie/speakers/management/commands/update-sessionize-json-stream.py b/pythonie/speakers/management/commands/update-sessionize-json-stream.py deleted file mode 100644 index 65374bd..0000000 --- a/pythonie/speakers/management/commands/update-sessionize-json-stream.py +++ /dev/null @@ -1,140 +0,0 @@ -import datetime - -import pydantic -import requests -from django.core.management import BaseCommand, CommandParser -from wagtail.models import Page - -from speakers.models import Speaker, Session, Room - - -class SessionModel(pydantic.BaseModel): - id: str - title: str - description: str - startsAt: datetime.datetime - endsAt: datetime.datetime - speakers: list[pydantic.UUID4] - roomId: int - - @property - def duration(self) -> int: - return int((self.endsAt - self.startsAt).seconds / 60) - - -class SpeakerModel(pydantic.BaseModel): - id: pydantic.UUID4 - firstName: str - lastName: str - bio: str | None - tagLine: str - profilePicture: pydantic.HttpUrl | None - sessions: list[int] - fullName: str - # email: str - - # @property - # def fullName(self): - # return f'{self.firstName} {self.lastName}' - - -class RoomModel(pydantic.BaseModel): - id: int - name: str - - -class SessionizeModel(pydantic.BaseModel): - sessions: list[SessionModel] - speakers: list[SpeakerModel] - rooms: list[RoomModel] - - -class Command(BaseCommand): - def handle(self, *args, **kwargs): - response = requests.get("https://sessionize.com/api/v2/z66z4kb6/view/All") - sessionize: SessionizeModel = SessionizeModel.parse_obj(response.json()) - - rooms = {} - - for incoming_room in sessionize.rooms: - incoming_room: RoomModel - rooms[incoming_room.id] = self.save_room(incoming_room) - - parent_page: Page = Page.objects.get(id=144).specific - for speaker in sessionize.speakers: - speaker: SpeakerModel - self.save_speaker(parent_page, speaker) - - parent_page: Page = Page.objects.get(id=145).specific - for session in sessionize.sessions: - session: SessionModel - self.save_session(parent_page, rooms[session.roomId], session) - - def save_speaker(self, parent_page: Page, incoming_speaker: SpeakerModel) -> None: - print(f"{incoming_speaker.id} {incoming_speaker.fullName}") - try: - speaker: Speaker = Speaker.objects.get(external_id=incoming_speaker.id) - speaker.name = incoming_speaker.fullName - speaker.email = f"{incoming_speaker.id}@sessionize.com" - speaker.biography = incoming_speaker.bio or "No biography available." - speaker.picture_url = incoming_speaker.profilePicture or "" - speaker.title = incoming_speaker.fullName - except Speaker.DoesNotExist: - speaker: Speaker = Speaker( - external_id=incoming_speaker.id, - name=incoming_speaker.fullName, - email=f"{incoming_speaker.id}@sessionize.com", - biography=incoming_speaker.bio or "No biography available", - picture_url=incoming_speaker.profilePicture or "", - title=incoming_speaker.fullName, - ) - - parent_page.add_child(instance=speaker) - - speaker.save() - speaker.save_revision().publish() - - def save_session( - self, - parent_page: Page, - room: Room, - incoming_session: SessionModel, - ) -> None: - print(f"{incoming_session.id} {incoming_session.title}") - created: bool = False - - try: - session: Session = Session.objects.get(external_id=incoming_session.id) - session.name = incoming_session.title - session.description = incoming_session.description - session.scheduled_at = incoming_session.startsAt - session.duration = incoming_session.duration - session.title = incoming_session.title - session.room = room - except Session.DoesNotExist: - session: Session = Session( - external_id=incoming_session.id, - name=incoming_session.title, - description=incoming_session.description, - scheduled_at=incoming_session.startsAt, - duration=incoming_session.duration, - title=incoming_session.title, - room=room, - ) - created = True - - parent_page.add_child(instance=session) - - speakers = Speaker.objects.filter(external_id__in=incoming_session.speakers) - for speaker in speakers: - session.speakers.add(speaker) - - session.save() - session.save_revision().publish() - print( - f'{incoming_session.id} {incoming_session.title} {created and "CREATED" or "UPDATED"}' - ) - - def save_room(self, incoming_room: RoomModel) -> Room: - room, created = Room.objects.get_or_create(name=incoming_room.name) - return room diff --git a/pythonie/speakers/migrations/0001_initial.py b/pythonie/speakers/migrations/0001_initial.py deleted file mode 100644 index 390a9d5..0000000 --- a/pythonie/speakers/migrations/0001_initial.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [("wagtailcore", "0016_change_page_url_path_to_text_field")] - - operations = [ - migrations.CreateModel( - name="SpeakersPage", - fields=[ - ( - "page_ptr", - models.OneToOneField( - auto_created=True, - to="wagtailcore.Page", - parent_link=True, - serialize=False, - primary_key=True, - on_delete=models.CASCADE, - ), - ), - ("api_url", models.CharField(max_length=255)), - ], - options={ - "abstract": False, - }, - bases=("wagtailcore.page",), - ), - ] diff --git a/pythonie/speakers/migrations/0002_talkspage.py b/pythonie/speakers/migrations/0002_talkspage.py deleted file mode 100644 index 33df73a..0000000 --- a/pythonie/speakers/migrations/0002_talkspage.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("speakers", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="TalksPage", - fields=[ - ( - "page_ptr", - models.OneToOneField( - primary_key=True, - serialize=False, - parent_link=True, - auto_created=True, - to="wagtailcore.Page", - on_delete=models.CASCADE, - ), - ), - ("api_url", models.CharField(max_length=255)), - ], - options={ - "abstract": False, - }, - bases=("wagtailcore.page",), - ), - ] diff --git a/pythonie/speakers/migrations/0003_auto_20220929_1828.py b/pythonie/speakers/migrations/0003_auto_20220929_1828.py deleted file mode 100644 index bb8040e..0000000 --- a/pythonie/speakers/migrations/0003_auto_20220929_1828.py +++ /dev/null @@ -1,134 +0,0 @@ -# Generated by Django 3.2.15 on 2022-09-29 18:28 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("wagtailcore", "0066_collection_management_permissions"), - ("speakers", "0002_talkspage"), - ] - - operations = [ - migrations.CreateModel( - name="Room", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=255)), - ], - options={ - "ordering": ["name"], - }, - ), - migrations.CreateModel( - name="Speaker", - fields=[ - ( - "page_ptr", - models.OneToOneField( - auto_created=True, - on_delete=django.db.models.deletion.CASCADE, - parent_link=True, - primary_key=True, - serialize=False, - to="wagtailcore.page", - ), - ), - ("name", models.CharField(max_length=255)), - ("email", models.CharField(max_length=255)), - ( - "external_id", - models.CharField(blank=True, max_length=255, unique=True), - ), - ("picture_url", models.CharField(blank=True, max_length=255)), - ("biography", models.TextField()), - ("created_at", models.DateTimeField(auto_now_add=True)), - ("updated_at", models.DateTimeField(auto_now=True)), - ], - options={ - "ordering": ["name"], - }, - bases=("wagtailcore.page",), - ), - migrations.RemoveField( - model_name="speakerspage", - name="api_url", - ), - migrations.RemoveField( - model_name="talkspage", - name="api_url", - ), - migrations.CreateModel( - name="Session", - fields=[ - ( - "page_ptr", - models.OneToOneField( - auto_created=True, - on_delete=django.db.models.deletion.CASCADE, - parent_link=True, - primary_key=True, - serialize=False, - to="wagtailcore.page", - ), - ), - ("name", models.CharField(db_index=True, max_length=255)), - ("description", models.TextField()), - ("scheduled_at", models.DateTimeField()), - ("duration", models.IntegerField(default=30)), - ("created_at", models.DateTimeField(auto_now_add=True)), - ("updated_at", models.DateTimeField(auto_now=True)), - ("external_id", models.CharField(max_length=255, unique=True)), - ( - "type", - models.CharField( - choices=[("talk", "Talk"), ("workshop", "Workshop")], - db_index=True, - default="talk", - max_length=16, - ), - ), - ( - "state", - models.CharField( - choices=[ - ("draft", "Draft"), - ("accepted", "Accepted"), - ("confirmed", "Confirmed"), - ("refused", "Refused"), - ("cancelled", "Cancelled"), - ], - db_index=True, - default="draft", - max_length=16, - ), - ), - ( - "room", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to="speakers.room" - ), - ), - ( - "speakers", - models.ManyToManyField( - related_name="sessions", to="speakers.Speaker" - ), - ), - ], - options={ - "ordering": ["name"], - }, - bases=("wagtailcore.page",), - ), - ] diff --git a/pythonie/speakers/migrations/__init__.py b/pythonie/speakers/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pythonie/speakers/models.py b/pythonie/speakers/models.py deleted file mode 100644 index 472811d..0000000 --- a/pythonie/speakers/models.py +++ /dev/null @@ -1,124 +0,0 @@ -import json -import logging - -import requests -from django.conf import settings -from django.db import models -from wagtail.admin.panels import FieldPanel -from wagtail.models import Page - -log = logging.getLogger("speakers") - - -class Room(models.Model): - name = models.CharField(max_length=255, blank=False) - - def __str__(self): - return self.name - - class Meta: - ordering = ["name"] - - -class Speaker(Page): - name = models.CharField(max_length=255, blank=False) - email = models.CharField(max_length=255, blank=False) - external_id = models.CharField(max_length=255, unique=True, blank=True) - picture_url = models.CharField(max_length=255, blank=True) - biography = models.TextField() - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - - content_panels = Page.content_panels + [ - FieldPanel("name"), - FieldPanel("email"), - FieldPanel("external_id"), - FieldPanel("biography"), - FieldPanel("picture_url"), - ] - - def __str__(self): - return self.name - - class Meta: - ordering = ["name"] - - -class SpeakersPage(Page): - subpage_types = ["Speaker"] - - @property - def speakers(self): - return Speaker.objects.order_by("name").all() - - -# In this context, a session is a link to a future proposal (talk) -class Session(Page): - class StateChoices(models.TextChoices): - DRAFT = "draft", "Draft" - ACCEPTED = "accepted", "Accepted" - CONFIRMED = "confirmed", "Confirmed" - REFUSED = "refused", "Refused" - CANCELLED = "cancelled", "Cancelled" - - class TypeChoices(models.TextChoices): - TALK = "talk", "Talk" - WORKSHOP = "workshop", "Workshop" - - name = models.CharField(max_length=255, blank=False, db_index=True) - description = models.TextField() - scheduled_at = models.DateTimeField() - duration = models.IntegerField(default=30) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - external_id = models.CharField(max_length=255, unique=True) - type = models.CharField( - max_length=16, - blank=False, - choices=TypeChoices.choices, - default=TypeChoices.TALK, - db_index=True, - ) - - state = models.CharField( - max_length=16, - blank=False, - choices=StateChoices.choices, - default=StateChoices.DRAFT, - db_index=True, - ) - room = models.ForeignKey(Room, on_delete=models.PROTECT) - # speaker = models.ForeignKey(Speaker, on_delete=models.CASCADE) - speakers = models.ManyToManyField(Speaker, related_name="sessions") - - @property - def speaker_names(self): - return ", ".join(speaker.name for speaker in self.speakers.all()) - - content_panels = Page.content_panels + [ - FieldPanel("name"), - FieldPanel("description"), - FieldPanel("scheduled_at"), - FieldPanel("duration"), - FieldPanel("type"), - FieldPanel("state"), - ] - - def is_confirmed(self) -> bool: - return self.state == "confirmed" - - def __str__(self): - return self.name - - class Meta: - ordering = [ - "name", - ] - - -class TalksPage(Page): - subpage_types = ["Session"] - - @property - def sessions(self): - return Session.objects.order_by("scheduled_at", "room__name").all() diff --git a/pythonie/speakers/templates/speakers/session.html b/pythonie/speakers/templates/speakers/session.html deleted file mode 100644 index a643438..0000000 --- a/pythonie/speakers/templates/speakers/session.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends "base.html" %} - -{% load wagtailcore_tags %} -{% load static core_tags speaker_tags %} - -{% block body_class %}template-{{ self.get_verbose_name|slugify }}{% endblock %} - -{% block content %} -
-
-
-
-
-

{{ self.name }}

- {{ self.biography }} - - - - - - - - {% for speaker in self.speakers.all %} - - - - - - {% endfor %} - -
Speaker
{% speaker_picture speaker %} - {{ speaker.name }} - - {{ speaker.biography|safe }} -
-
-
-
-
-
-{% endblock %} diff --git a/pythonie/speakers/templates/speakers/speaker.html b/pythonie/speakers/templates/speakers/speaker.html deleted file mode 100644 index ed06098..0000000 --- a/pythonie/speakers/templates/speakers/speaker.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base.html" %} - -{% load wagtailcore_tags %} -{% load static core_tags speaker_tags %} - -{% block body_class %}template-{{ self.get_verbose_name|slugify }}{% endblock %} - -{% block content %} -
-
-
-
-
-

{{ self.name }}

- {% speaker_picture self %} -
- {{ self.biography }} - - - - - - - - - - {% for session in self.sessions.all %} - - - - - - {% endfor %} - -
SessionWhenDuration
- {{ session.name }} - {{ session.scheduled_at }}{{ session.duration }}
-
-
-
-
-
-{% endblock %} diff --git a/pythonie/speakers/templates/speakers/speaker_picture.html b/pythonie/speakers/templates/speakers/speaker_picture.html deleted file mode 100644 index 1e0e431..0000000 --- a/pythonie/speakers/templates/speakers/speaker_picture.html +++ /dev/null @@ -1 +0,0 @@ -{{ name }} \ No newline at end of file diff --git a/pythonie/speakers/templates/speakers/speakers_page.html b/pythonie/speakers/templates/speakers/speakers_page.html deleted file mode 100644 index 3ac78c7..0000000 --- a/pythonie/speakers/templates/speakers/speakers_page.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends "base.html" %} - -{% load wagtailcore_tags %} -{% load static core_tags speaker_tags %} - -{% block body_class %}template-{{ self.get_verbose_name|slugify }}{% endblock %} - -{% block content %} -
-
-
-
-
- - -
-

- - PyCon Ireland 2022 Speakers - -

-
- - - - {% for speaker in self.speakers %} - - - - - - {% endfor %} - - -
{% speaker_picture speaker %} - {{ speaker.name }} - - -
-
-
-
-
-
-{% endblock %} diff --git a/pythonie/speakers/templates/speakers/talks_page.html b/pythonie/speakers/templates/speakers/talks_page.html deleted file mode 100644 index 1f8d519..0000000 --- a/pythonie/speakers/templates/speakers/talks_page.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "base.html" %} - -{% load wagtailcore_tags %} -{% load static core_tags speaker_tags %} - -{% block body_class %}template-{{ self.get_verbose_name|slugify }}{% endblock %} - -{% block content %} -
-
-
-
-
- -
-

- PyCon - Ireland - 2022 - Talks -

-
- - - - - - - - - - - - - {% for session in self.sessions %} - - - - - - - - {% endfor %} - -
TitleSpeaker(s)WhenDurationWhere
- {{ session.title }} - -
    - {% for speaker in session.speakers.all %} -
  • {% speaker_picture speaker 40 %} {{ speaker.name }} -
  • - {% endfor %} -
-
{{ session.scheduled_at }}{{ session.duration }}{{ session.room }}
-
-
-
-
-
-{% endblock %} diff --git a/pythonie/speakers/templatetags/__init__.py b/pythonie/speakers/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pythonie/speakers/templatetags/speaker_tags.py b/pythonie/speakers/templatetags/speaker_tags.py deleted file mode 100644 index 0055506..0000000 --- a/pythonie/speakers/templatetags/speaker_tags.py +++ /dev/null @@ -1,12 +0,0 @@ -from django import template -from speakers.models import Speaker - -register = template.Library() - - -@register.inclusion_tag("speakers/speaker_picture.html") -def speaker_picture(speaker: Speaker, size: int = 75): - picture_url = speaker.picture_url - if not picture_url: - picture_url = f"https://robohash.org/{speaker.name}" - return {"url": picture_url, "name": speaker.name, "size": size}