Skip to content

Commit 9fbce82

Browse files
committed
feat: initialize models
1 parent a1d0f5e commit 9fbce82

File tree

12 files changed

+267
-21
lines changed

12 files changed

+267
-21
lines changed

app/home/admin.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

app/home/models.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

app/presentations/__init__.py

Whitespace-only changes.

app/presentations/admin.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

app/presentations/apps.py

Lines changed: 0 additions & 6 deletions
This file was deleted.

app/presentations/migrations/__init__.py

Whitespace-only changes.

app/presentations/models.py

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# Generated by Django 5.2.7 on 2025-10-11 09:32
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
initial = True
10+
11+
dependencies = [
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='Speaker',
17+
fields=[
18+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('first_name', models.CharField(max_length=255)),
20+
('last_name', models.CharField(max_length=255)),
21+
('middle_name', models.CharField(blank=True, max_length=255, null=True)),
22+
('title', models.CharField(blank=True, max_length=255, null=True)),
23+
('introduction', models.TextField(blank=True, null=True)),
24+
('bio', models.TextField(blank=True, null=True)),
25+
('email', models.EmailField(blank=True, max_length=255, null=True)),
26+
('is_featured', models.BooleanField(default=False)),
27+
('photo_url', models.URLField(blank=True, max_length=255, null=True)),
28+
('created_at', models.DateTimeField(auto_now_add=True)),
29+
('updated_at', models.DateTimeField(auto_now=True)),
30+
],
31+
options={
32+
'verbose_name': 'Speaker',
33+
'verbose_name_plural': 'Speakers',
34+
},
35+
),
36+
migrations.CreateModel(
37+
name='SpeakerPresentation',
38+
fields=[
39+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
40+
('title', models.CharField(max_length=255)),
41+
('presentation_type', models.CharField(choices=[('talk', 'Talk'), ('workshop', 'Workshop'), ('panel', 'Panel')], max_length=255)),
42+
('description', models.TextField(blank=True, null=True)),
43+
('abstract', models.TextField(blank=True)),
44+
('created_at', models.DateTimeField(auto_now_add=True)),
45+
('updated_at', models.DateTimeField(auto_now=True)),
46+
('speaker', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='presentations', to='speakers.speaker')),
47+
],
48+
options={
49+
'verbose_name': 'Speaker Presentation',
50+
'verbose_name_plural': 'Speaker Presentations',
51+
'ordering': ['title'],
52+
},
53+
),
54+
migrations.CreateModel(
55+
name='SpeakerSchedule',
56+
fields=[
57+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
58+
('day', models.CharField(choices=[('day_1', 'Day 1'), ('day_2', 'Day 2')], max_length=255)),
59+
('track', models.CharField(choices=[('track_1', 'Track 1'), ('track_2', 'Track 2'), ('track_3', 'Track 3')], max_length=255)),
60+
('time_start', models.TimeField()),
61+
('time_end', models.TimeField()),
62+
('location', models.CharField(max_length=255)),
63+
('description', models.TextField(blank=True, null=True)),
64+
('created_at', models.DateTimeField(auto_now_add=True)),
65+
('updated_at', models.DateTimeField(auto_now=True)),
66+
('presentation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to='speakers.speakerpresentation')),
67+
('speaker', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='schedules', to='speakers.speaker')),
68+
],
69+
options={
70+
'verbose_name': 'Speaker Schedule',
71+
'verbose_name_plural': 'Speaker Schedules',
72+
},
73+
),
74+
migrations.CreateModel(
75+
name='SpeakerSocial',
76+
fields=[
77+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
78+
('platform', models.CharField(max_length=255)),
79+
('username', models.CharField(blank=True, max_length=255, null=True)),
80+
('url', models.URLField(max_length=255)),
81+
('created_at', models.DateTimeField(auto_now_add=True)),
82+
('updated_at', models.DateTimeField(auto_now=True)),
83+
('speaker', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='socials', to='speakers.speaker')),
84+
],
85+
options={
86+
'verbose_name': 'Speaker Social',
87+
'verbose_name_plural': 'Speaker Socials',
88+
'ordering': ['platform'],
89+
},
90+
),
91+
]

app/speakers/models.py

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,116 @@
11
from django.db import models
22

3-
# Create your models here.
3+
4+
class Speaker(models.Model):
5+
first_name = models.CharField(max_length=255)
6+
last_name = models.CharField(max_length=255)
7+
middle_name = models.CharField(max_length=255, blank=True, null=True)
8+
title = models.CharField(max_length=255, blank=True, null=True)
9+
introduction = models.TextField(blank=True, null=True)
10+
bio = models.TextField(blank=True, null=True)
11+
email = models.EmailField(max_length=255, blank=True, null=True)
12+
is_featured = models.BooleanField(default=False)
13+
photo_url = models.URLField(max_length=255, blank=True, null=True)
14+
created_at = models.DateTimeField(auto_now_add=True)
15+
updated_at = models.DateTimeField(auto_now=True)
16+
17+
@property
18+
def full_name(self):
19+
return f"{self.first_name} {self.last_name}"
20+
21+
def __str__(self):
22+
return self.full_name
23+
24+
class Meta:
25+
verbose_name = "Speaker"
26+
verbose_name_plural = "Speakers"
27+
28+
29+
class SpeakerSocial(models.Model):
30+
speaker = models.ForeignKey("speaker", on_delete=models.CASCADE, related_name="socials")
31+
platform = models.CharField(max_length=255)
32+
username = models.CharField(max_length=255, blank=True, null=True)
33+
url = models.URLField(max_length=255)
34+
created_at = models.DateTimeField(auto_now_add=True)
35+
updated_at = models.DateTimeField(auto_now=True)
36+
37+
class Meta:
38+
ordering = ["platform"]
39+
verbose_name = "Speaker Social"
40+
verbose_name_plural = "Speaker Socials"
41+
42+
43+
class SpeakerPresentation(models.Model):
44+
class PresentationTypes(models.TextChoices):
45+
TALK = "talk"
46+
WORKSHOP = "workshop"
47+
PANEL = "panel"
48+
49+
speaker = models.ForeignKey(
50+
"speaker",
51+
null=True,
52+
blank=True,
53+
on_delete=models.SET_NULL,
54+
related_name="presentations",
55+
)
56+
title = models.CharField(max_length=255)
57+
presentation_type = models.CharField(max_length=255, choices=PresentationTypes.choices)
58+
description = models.TextField(blank=True, null=True)
59+
abstract = models.TextField(blank=True)
60+
61+
created_at = models.DateTimeField(auto_now_add=True)
62+
updated_at = models.DateTimeField(auto_now=True)
63+
64+
class Meta:
65+
ordering = ["title"]
66+
verbose_name = "Speaker Presentation"
67+
verbose_name_plural = "Speaker Presentations"
68+
69+
70+
class SpeakerSchedule(models.Model):
71+
class Days(models.TextChoices):
72+
DAY_1 = "day_1"
73+
DAY_2 = "day_2"
74+
75+
class Tracks(models.TextChoices):
76+
TRACK_1 = "track_1"
77+
TRACK_2 = "track_2"
78+
TRACK_3 = "track_3"
79+
80+
speaker = models.ForeignKey(
81+
"speaker",
82+
null=True,
83+
blank=True,
84+
on_delete=models.SET_NULL,
85+
related_name="schedules",
86+
)
87+
presentation = models.ForeignKey(
88+
"speakerpresentation",
89+
on_delete=models.CASCADE,
90+
related_name="schedules",
91+
)
92+
day = models.CharField(max_length=255, choices=Days.choices)
93+
track = models.CharField(max_length=255, choices=Tracks.choices)
94+
time_start = models.TimeField()
95+
time_end = models.TimeField()
96+
location = models.CharField(max_length=255)
97+
description = models.TextField(blank=True, null=True)
98+
created_at = models.DateTimeField(auto_now_add=True)
99+
updated_at = models.DateTimeField(auto_now=True)
100+
101+
@property
102+
def display_time(self):
103+
fmt = "%-I:%M %p"
104+
return f"{self.time_start.strftime(fmt)} - {self.time_end.strftime(fmt)}"
105+
106+
@property
107+
def display_start_time(self):
108+
return self.time_start.strftime("%H:%M:%S")
109+
110+
@property
111+
def display_end_time(self):
112+
return self.time_end.strftime("%H:%M:%S")
113+
114+
class Meta:
115+
verbose_name = "Speaker Schedule"
116+
verbose_name_plural = "Speaker Schedules"
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Generated by Django 5.2.7 on 2025-10-11 09:32
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
initial = True
9+
10+
dependencies = [
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='Sponsor',
16+
fields=[
17+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18+
('name', models.CharField(max_length=255)),
19+
('logo_url', models.URLField(max_length=255)),
20+
('website_url', models.URLField(blank=True, max_length=255, null=True)),
21+
('info', models.TextField(blank=True, null=True)),
22+
('sponsorship_date', models.DateField(blank=True, null=True)),
23+
('sponsor_type', models.CharField(choices=[('KEYSTONE', 'Keystone'), ('PLATINUM', 'Platinum'), ('TITANIUM', 'Titanium'), ('GOLD', 'Gold'), ('SILVER', 'Silver')], max_length=255)),
24+
('contact_name', models.CharField(blank=True, max_length=255, null=True)),
25+
('contact_email', models.EmailField(blank=True, max_length=255, null=True)),
26+
('created_at', models.DateTimeField(auto_now_add=True)),
27+
('updated_at', models.DateTimeField(auto_now=True)),
28+
],
29+
options={
30+
'verbose_name': 'Sponsor',
31+
'verbose_name_plural': 'Sponsors',
32+
'ordering': ['name'],
33+
},
34+
),
35+
]

0 commit comments

Comments
 (0)