Compare commits
3 Commits
4281941814
...
56a8b7afaa
| Author | SHA1 | Date | |
|---|---|---|---|
| 56a8b7afaa | |||
| 82ebef8465 | |||
| 5874c5299b |
1
Pipfile
1
Pipfile
@@ -7,6 +7,7 @@ name = "pypi"
|
||||
Django = "*"
|
||||
django-registration-redux = "*"
|
||||
django-tailwind = "*"
|
||||
django-reversion = "*"
|
||||
|
||||
[dev-packages]
|
||||
|
||||
|
||||
12
Pipfile.lock
generated
12
Pipfile.lock
generated
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "7c687a6bc97aa06b7d51dcb4f6b6115d9dec1ca067ebe7189c94a98dfe8c0c7b"
|
||||
"sha256": "6cab97299da689eabef18022a5ecc8898bc04de8cf1f66a3edae938c348e6976"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
@@ -21,6 +21,7 @@
|
||||
"sha256:5ee950735509d04eb673bd7f7120f8fa1c9e2df495394992c73234d526907e17",
|
||||
"sha256:7162a3cb30ab0609f1a4c95938fd73e8604f63bdba516a7f7d64b83ff09478f0"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==3.3.1"
|
||||
},
|
||||
"django": {
|
||||
@@ -39,6 +40,14 @@
|
||||
"index": "pypi",
|
||||
"version": "==2.9"
|
||||
},
|
||||
"django-reversion": {
|
||||
"hashes": [
|
||||
"sha256:1b57127a136b969f4b843a915c72af271febe7f336469db6c27121f8adcad35c",
|
||||
"sha256:a5af55f086a3f9c38be2f049c251e06005b9ed48ba7a109473736b1fc95a066f"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.0.9"
|
||||
},
|
||||
"django-tailwind": {
|
||||
"hashes": [
|
||||
"sha256:2c1bf6c91fc54c844b85e8b379c211c971a2827c3d5b84f7e0464485ef9b8adf",
|
||||
@@ -59,6 +68,7 @@
|
||||
"sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0",
|
||||
"sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.4.1"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -44,6 +44,7 @@ INSTALLED_APPS = [
|
||||
# 3rd Party
|
||||
'registration',
|
||||
'tailwind',
|
||||
'reversion',
|
||||
# 1st Party
|
||||
'theme',
|
||||
'users',
|
||||
@@ -53,6 +54,7 @@ INSTALLED_APPS = [
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'reversion.middleware.RevisionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
@@ -65,7 +67,7 @@ ROOT_URLCONF = 'core.urls'
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'DIRS': ['templates'],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
|
||||
@@ -2,7 +2,10 @@ from django.contrib import admin
|
||||
from django.urls import path
|
||||
from django.conf.urls import include
|
||||
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.Index.as_view(), name='index'),
|
||||
path('user/', include('users.urls')),
|
||||
path('vehicles/', include('vehicles.urls')),
|
||||
path('admin/', admin.site.urls),
|
||||
|
||||
5
core/views.py
Normal file
5
core/views.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django.views import generic
|
||||
|
||||
|
||||
class Index(generic.TemplateView):
|
||||
template_name = 'index.html'
|
||||
10
templates/index.html
Normal file
10
templates/index.html
Normal file
@@ -0,0 +1,10 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h1 class="text-4xl center py-2 font-serif font-black">SUPERINTENDANT</h1>
|
||||
<h2 class="text-3xl center py-2">Fleet Manager</h2>
|
||||
<h3 class="text-2xl center italic py-2 pb-8 text-blue-400">Fljōtr - Swift (Old Norse)</h3>
|
||||
<h2 class="text-2xl underline text-blue-100 py-2"><a href="{% url 'vehicle_list' %}"><svg style="width: 24px; height: 24px;" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
|
||||
</svg>Vehicle List</a></h2>
|
||||
{% endblock %}
|
||||
@@ -9,13 +9,13 @@
|
||||
<title>Fleet Management</title>
|
||||
<meta name="description" content="">
|
||||
<meta name="keywords" content="">
|
||||
<meta name="author" content="">
|
||||
<meta name="author" content="FreneticScribbler">
|
||||
|
||||
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
|
||||
</head>
|
||||
|
||||
<body class="bg-grey-lightest font-serif leading-normal tracking-normal">
|
||||
<div class="container mx-auto">
|
||||
<body class="bg-gray-900 font-sans leading-normal tracking-normal">
|
||||
<div class="container mx-auto text-white py-4 text-center">
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
|
||||
39
users/migrations/0002_driver_licence.py
Normal file
39
users/migrations/0002_driver_licence.py
Normal file
@@ -0,0 +1,39 @@
|
||||
# Generated by Django 3.1.6 on 2021-02-14 12:44
|
||||
|
||||
import django.contrib.auth.models
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Licence',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('licence_number', models.CharField(max_length=100)),
|
||||
('date_obtained', models.DateField()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Driver',
|
||||
fields=[
|
||||
('customuser_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='users.customuser')),
|
||||
('licence', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.licence')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'user',
|
||||
'verbose_name_plural': 'users',
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('users.customuser',),
|
||||
managers=[
|
||||
('objects', django.contrib.auth.models.UserManager()),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -1,6 +1,16 @@
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class CustomUser(AbstractUser):
|
||||
pass
|
||||
|
||||
|
||||
class Licence(models.Model):
|
||||
licence_number = models.CharField(max_length=100)
|
||||
date_obtained = models.DateField()
|
||||
# entitlements
|
||||
|
||||
|
||||
class Driver(CustomUser):
|
||||
licence = models.ForeignKey('Licence', on_delete=models.CASCADE)
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
from vehicles.models import Make, Model, Status, Vehicle
|
||||
|
||||
admin.site.register(Make)
|
||||
admin.site.register(Model)
|
||||
admin.site.register(Status)
|
||||
admin.site.register(Vehicle)
|
||||
|
||||
47
vehicles/migrations/0002_auto_20210214_1244.py
Normal file
47
vehicles/migrations/0002_auto_20210214_1244.py
Normal file
@@ -0,0 +1,47 @@
|
||||
# Generated by Django 3.1.6 on 2021-02-14 12:44
|
||||
|
||||
import datetime
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.utils.timezone import utc
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('vehicles', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='vehicle',
|
||||
name='engine_number',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='vehicle',
|
||||
name='date_purchased',
|
||||
field=models.DateField(default=datetime.datetime(2021, 2, 14, 12, 44, 16, 378064, tzinfo=utc)),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='vehicle',
|
||||
name='first_registered',
|
||||
field=models.DateField(default=datetime.datetime(2021, 2, 14, 12, 44, 22, 562249, tzinfo=utc)),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='vehicle',
|
||||
name='yom',
|
||||
field=models.DateField(default=datetime.datetime(2021, 2, 14, 12, 44, 32, 354386, tzinfo=utc)),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ICEVehicle',
|
||||
fields=[
|
||||
('vehicle_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='vehicles.vehicle')),
|
||||
('engine_number', models.CharField(max_length=50)),
|
||||
('capacity', models.IntegerField()),
|
||||
],
|
||||
bases=('vehicles.vehicle',),
|
||||
),
|
||||
]
|
||||
@@ -1,26 +1,51 @@
|
||||
from django.db import models
|
||||
|
||||
from reversion import revisions as reversion
|
||||
|
||||
|
||||
class Status(models.Model):
|
||||
name = models.CharField(max_length=80)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Make(models.Model):
|
||||
name = models.CharField(max_length=80)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Model(models.Model): # Cause that won't be a confusing name at all
|
||||
name = models.CharField(max_length=80)
|
||||
make = models.ForeignKey('Make', on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return "{} {}".format(self.make.name, self.name)
|
||||
|
||||
|
||||
@reversion.register
|
||||
class Vehicle(models.Model):
|
||||
name = models.CharField(max_length=50)
|
||||
# color
|
||||
|
||||
yom = models.DateField()
|
||||
first_registered = models.DateField()
|
||||
date_purchased = models.DateField()
|
||||
|
||||
reg_number = models.CharField(max_length=7)
|
||||
vin_number = models.CharField(max_length=50)
|
||||
chassis_number = models.CharField(max_length=50)
|
||||
engine_number = models.CharField(max_length=50)
|
||||
|
||||
status = models.ForeignKey('Status', on_delete=models.CASCADE)
|
||||
owner = models.ForeignKey('users.CustomUser', blank=True, null=True, on_delete=models.CASCADE)
|
||||
model = models.ForeignKey('Model', on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class ICEVehicle(Vehicle):
|
||||
engine_number = models.CharField(max_length=50)
|
||||
capacity = models.IntegerField()
|
||||
|
||||
5
vehicles/templates/vehicle_detail.html
Normal file
5
vehicles/templates/vehicle_detail.html
Normal file
@@ -0,0 +1,5 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h1 class="text-2xl">Vehicle {{ object }}</h1>
|
||||
{% endblock %}
|
||||
@@ -1,5 +1,37 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
Test!
|
||||
<h1 class="text-2xl py-3 font-bold">All Vehicles</h1>
|
||||
<table class="table-auto border w-full">
|
||||
<thead>
|
||||
<th class="p-2">Name</th>
|
||||
<th class="p-2">Make & Model</th>
|
||||
<th class="p-2">Registration</th>
|
||||
<th class="p-2">Owner</th>
|
||||
<th class="p-2">Status</th>
|
||||
<th class="p-2">VIN Number</th>
|
||||
<th class="p-2">Engine Number</th>
|
||||
<th class="p-2">Chassis Number</th>
|
||||
<th class="p-2">Links</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for object in object_list %}
|
||||
<tr>
|
||||
<th scope="row" class="p-2">{{ object.name }}</th>
|
||||
<td class="p-2">{{ object.model }}</td>
|
||||
<td class="bg-yellow-400 text-black font-black rounded text-xl px-2">{{ object.reg_number|slice:"4:" }} {{ object.reg_number|slice:":3" }}</td>
|
||||
<td class="p-2">{{ object.owner|default:"God" }}</td>
|
||||
<td class="p-2">{{ object.status }}</td>
|
||||
<td class="p-2">{{ object.vin_number|default:"Unknown" }}</td>
|
||||
<td class="p-2">{{ object.engine_number|default:"Unknown" }}</td>
|
||||
<td class="p-2">{{ object.chassis_number|default:"Unknown" }}</td>
|
||||
<td class="p-2"><a href="{% url 'vehicle_detail' object.pk %}" class="underline text-blue-100">Detail</a></td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr class="bg-yellow-400">
|
||||
<td span="10">Nothing found!</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
from django.urls import path
|
||||
|
||||
from .views import VehicleList
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('list/', VehicleList.as_view(), name='vehicle_list')
|
||||
path('list/', views.VehicleList.as_view(), name='vehicle_list'),
|
||||
path('<int:pk>/', views.VehicleDetail.as_view(), name='vehicle_detail')
|
||||
]
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
from django.shortcuts import render
|
||||
from django.views.generic.list import ListView
|
||||
from django.views import generic
|
||||
|
||||
from .models import Vehicle
|
||||
|
||||
|
||||
class VehicleList(ListView):
|
||||
class VehicleList(generic.ListView):
|
||||
template_name = 'vehicle_list.html'
|
||||
model = Vehicle
|
||||
|
||||
|
||||
class VehicleDetail(generic.DetailView):
|
||||
template_name = 'vehicle_detail.html'
|
||||
model = Vehicle
|
||||
|
||||
Reference in New Issue
Block a user