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 }}
-
-
-
- | Speaker |
-
-
-
- {% for speaker in self.speakers.all %}
-
- | {% speaker_picture speaker %} |
-
- {{ speaker.name }}
- |
-
- {{ speaker.biography|safe }}
- |
-
- {% endfor %}
-
-
-
-
-
-
-
-{% 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 }}
-
-
-
- | Session |
- When |
- Duration |
-
-
-
- {% for session in self.sessions.all %}
-
- |
- {{ session.name }}
- |
- {{ session.scheduled_at }} |
- {{ session.duration }} |
-
- {% endfor %}
-
-
-
-
-
-
-
-{% 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 @@
-
\ 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 %}
-
- | {% speaker_picture speaker %} |
-
- {{ speaker.name }}
- |
-
-
- |
-
- {% endfor %}
-
-
-
-
-
-
-
-
-{% 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
-
-
-
-
-
- | Title |
- Speaker(s) |
- When |
- Duration |
- Where |
-
-
-
-
- {% for session in self.sessions %}
-
- |
- {{ session.title }}
- |
-
-
- {% for speaker in session.speakers.all %}
- - {% speaker_picture speaker 40 %} {{ speaker.name }}
-
- {% endfor %}
-
- |
- {{ session.scheduled_at }} |
- {{ session.duration }} |
- {{ session.room }} |
-
- {% endfor %}
-
-
-
-
-
-
-
-{% 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}