Skip to content

Commit b922cf0

Browse files
committed
added additional examples, formatted and cleaned up the code, updated requirements.txt
1 parent ce61a9a commit b922cf0

File tree

10 files changed

+114
-29
lines changed

10 files changed

+114
-29
lines changed

core/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@
130130
MEDIA_URL = "media/"
131131
MEDIA_ROOT = BASE_DIR / "mediafiles"
132132

133+
133134
# Default primary key field type
134135
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
135136

core/urls.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@
2020
admin.site.site_title = "TicketsPlus site admin"
2121
admin.site.site_header = "TicketsPlus administration"
2222
admin.site.index_title = "Site administration"
23-
admin.site.site_url = "/"
24-
admin.site.enable_nav_sidebar = True
25-
admin.site.empty_value_display = "-"
23+
# https://github.com/django/django/blob/main/django/contrib/admin/sites.py
2624

2725
urlpatterns = [
2826
path("secretadmin/", admin.site.urls),

requirements.txt

158 Bytes
Binary file not shown.

templates/admin/login.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{% extends "admin/login.html" %}
2+
3+
{% block content_title %}
4+
<p style="background: #ffffcc; padding: 10px 8px">
5+
This is a really important message.
6+
</p>
7+
{% endblock %}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{% extends "admin/base_site.html" %}
2+
{% load i18n %}
3+
4+
{% block breadcrumbs %}<div class="breadcrumbs"><a href="{% url 'admin:index' %}">{% translate 'Home' %}</a></div>{% endblock %}
5+
6+
{% block nav-sidebar %}{% endblock %}
7+
8+
{% block content %}
9+
10+
<p>{% translate "See you soon." %}</p>
11+
12+
<p><a href="{% url 'admin:index' %}">{% translate 'Log in again' %}</a></p>
13+
14+
{% endblock %}

tickets/admin.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
from django.contrib import admin
22
from django.contrib.admin import SimpleListFilter
3+
from django.urls import reverse
4+
from django.utils.html import format_html
35
from djangoql.admin import DjangoQLSearchMixin
4-
from import_export.admin import ExportActionModelAdmin, ImportExportActionModelAdmin
6+
from import_export.admin import ImportExportActionModelAdmin
57

8+
from tickets.forms import TicketAdminForm
69
from tickets.models import Venue, ConcertCategory, Concert, Ticket
710

811

@@ -16,25 +19,13 @@ class ConcertInline(admin.TabularInline):
1619
show_change_link = True
1720

1821

19-
class ConcertThroughInline(admin.TabularInline):
20-
verbose_name = "concert"
21-
verbose_name_plural = "concerts"
22-
model = Concert.categories.through
23-
fields = ["concert"]
24-
readonly_fields = ["concert"]
25-
max_num = 0
26-
extra = 0
27-
can_delete = False
28-
show_change_link = True
29-
30-
3122
class VenueAdmin(admin.ModelAdmin):
3223
list_display = ["name", "address", "capacity"]
3324
inlines = [ConcertInline]
3425

3526

3627
class ConcertCategoryAdmin(admin.ModelAdmin):
37-
inlines = [ConcertThroughInline]
28+
pass
3829

3930

4031
class SoldOutFilter(SimpleListFilter):
@@ -54,11 +45,11 @@ def queryset(self, request, queryset):
5445
return queryset.exclude(tickets_left=0)
5546

5647

57-
class ConcertAdmin(DjangoQLSearchMixin, admin.ModelAdmin):
58-
list_display = ["name", "venue", "starts_at", "display_price", "tickets_left", "display_sold_out"]
48+
class ConcertAdmin(admin.ModelAdmin):
49+
list_display = ["name", "display_venue", "starts_at", "display_price", "tickets_left", "display_sold_out"]
50+
search_fields = ["name", "venue__name", "venue__address"]
5951
list_filter = ["venue", SoldOutFilter]
6052
readonly_fields = ["tickets_left"]
61-
search_fields = ["name", "venue__name", "venue__address"]
6253

6354
def display_sold_out(self, obj):
6455
return obj.is_sold_out()
@@ -72,6 +63,12 @@ def display_price(self, obj):
7263
display_price.short_description = "Price"
7364
display_price.admin_order_field = "price"
7465

66+
def display_venue(self, obj):
67+
link = reverse("admin:tickets_venue_change", args=[obj.venue.id])
68+
return format_html('<a href="{}">{}</a>', link, obj.venue)
69+
70+
display_venue.short_description = "Venue"
71+
7572

7673
@admin.action(description="Activate selected tickets")
7774
def activate_tickets(modeladmin, request, queryset):
@@ -83,10 +80,10 @@ def deactivate_tickets(modeladmin, request, queryset):
8380
queryset.update(is_active=False)
8481

8582

86-
class TicketAdmin(ImportExportActionModelAdmin):
83+
class TicketAdmin(DjangoQLSearchMixin, ImportExportActionModelAdmin):
8784
list_display = ["customer_full_name", "concert", "payment_method", "paid_at", "is_active"]
88-
list_filter = ["payment_method", "paid_at", "is_active"]
8985
actions = [activate_tickets, deactivate_tickets]
86+
form = TicketAdminForm
9087

9188

9289
admin.site.register(Venue, VenueAdmin)

tickets/forms.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from django import forms
2+
from django.forms import ModelForm, RadioSelect
3+
4+
from tickets.models import Ticket
5+
6+
7+
class TicketAdminForm(ModelForm):
8+
first_name = forms.CharField(label="First name", max_length=32)
9+
last_name = forms.CharField(label="Last name", max_length=32)
10+
11+
class Meta:
12+
model = Ticket
13+
fields = ["concert", "first_name", "last_name", "payment_method", "is_active"]
14+
widgets = {
15+
"payment_method": RadioSelect(),
16+
}
17+
18+
def __init__(self, *args, **kwargs):
19+
instance = kwargs.get("instance")
20+
initial = {}
21+
22+
if instance:
23+
customer_full_name_split = instance.customer_full_name.split(
24+
" ", maxsplit=1
25+
)
26+
initial = {
27+
"first_name": customer_full_name_split[0],
28+
"last_name": customer_full_name_split[1],
29+
}
30+
31+
super().__init__(*args, **kwargs, initial=initial)
32+
33+
def save(self, commit=True):
34+
self.instance.customer_full_name = (
35+
self.cleaned_data["first_name"] + " " + self.cleaned_data["last_name"]
36+
)
37+
return super().save(commit)

tickets/management/commands/populate_db.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ def handle(self, *args, **options):
2020
name="Arena of Nîmes", address="Boulevard des Arènes, 30000 Nîmes, France", capacity=720,
2121
),
2222
Venue.objects.get_or_create(
23-
name="Red Rocks Amphitheatre", address="18300 W Alameda, Morrison, CO, United States", capacity=640,
23+
name="Red Rocks Amphitheatre", address="18300 W Alameda, Morrison, United States", capacity=640,
2424
),
2525
Venue.objects.get_or_create(
2626
name="Dalhalla Amphitheatre", address="Dalhalla, 790 90 Rättvik, Sweden", capacity=800,
2727
),
2828
Venue.objects.get_or_create(
29-
name="The Fillmore", address="1805 Geary Blvd, San Francisco, CA, United States", capacity=620,
29+
name="The Fillmore", address="1805 Geary Blvd, San Francisco, United States", capacity=620,
3030
),
3131
]
3232

@@ -46,7 +46,7 @@ def handle(self, *args, **options):
4646
description="",
4747
venue=venue,
4848
starts_at=datetime.now(pytz.utc)
49-
+ timedelta(days=random.randint(1, 365)),
49+
+ timedelta(days=random.randint(1, 365)),
5050
price=random.randint(10, 100),
5151
)
5252
concert.categories.add(category)
@@ -60,7 +60,9 @@ def handle(self, *args, **options):
6060
Ticket.objects.create(
6161
concert=concert,
6262
customer_full_name=f"{random.choice(names)} {random.choice(surname)}",
63-
payment_method=random.choice(["CC", "CC", "CC", "CC", "DC", "DC", "ET", "BC"]),
63+
payment_method=random.choice(
64+
["CC", "CC", "CC", "CC", "DC", "DC", "ET", "BC"]
65+
),
6466
paid_at=datetime.now(pytz.utc) - timedelta(days=random.randint(1, 365)),
6567
is_active=random.choice([True, False]),
6668
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 4.2.4 on 2023-08-15 20:54
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("tickets", "0001_initial"),
9+
]
10+
11+
operations = [
12+
migrations.AlterModelOptions(
13+
name="concert",
14+
options={"ordering": ["starts_at"]},
15+
),
16+
migrations.AlterModelOptions(
17+
name="concertcategory",
18+
options={
19+
"ordering": ["-name"],
20+
"verbose_name": "concert category",
21+
"verbose_name_plural": "concert categories",
22+
},
23+
),
24+
]

tickets/models.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class ConcertCategory(models.Model):
1818
class Meta:
1919
verbose_name = "concert category"
2020
verbose_name_plural = "concert categories"
21+
ordering = ["-name"]
2122

2223
def __str__(self):
2324
return f"{self.name}"
@@ -35,8 +36,10 @@ class Concert(models.Model):
3536
class Meta:
3637
ordering = ["starts_at"]
3738

38-
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
39-
if self.pk is None:
39+
def save(
40+
self, force_insert=False, force_update=False, using=None, update_fields=None
41+
):
42+
if self.id is None:
4043
self.tickets_left = self.venue.capacity
4144

4245
super().save(force_insert, force_update, using, update_fields)
@@ -57,7 +60,9 @@ class Ticket(models.Model):
5760
("ET", "Ethereum"),
5861
("BC", "Bitcoin"),
5962
]
60-
payment_method = models.CharField(max_length=2, default="CC", choices=PAYMENT_METHODS)
63+
payment_method = models.CharField(
64+
max_length=2, default="CC", choices=PAYMENT_METHODS
65+
)
6166
paid_at = models.DateTimeField(auto_now_add=True)
6267
is_active = models.BooleanField(default=True)
6368

0 commit comments

Comments
 (0)