Compare commits

...

3 Commits

Author SHA1 Message Date
56a8b7afaa Init reversion 2021-02-14 12:52:36 +00:00
82ebef8465 Make migrations, template stuff 2021-02-14 12:48:12 +00:00
5874c5299b More initial sketching 2021-02-14 11:49:56 +00:00
16 changed files with 213 additions and 13 deletions

View File

@@ -7,6 +7,7 @@ name = "pypi"
Django = "*"
django-registration-redux = "*"
django-tailwind = "*"
django-reversion = "*"
[dev-packages]

12
Pipfile.lock generated
View File

@@ -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"
}
},

View File

@@ -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': [

View File

@@ -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
View File

@@ -0,0 +1,5 @@
from django.views import generic
class Index(generic.TemplateView):
template_name = 'index.html'

10
templates/index.html Normal file
View 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 %}

View File

@@ -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>

View 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()),
],
),
]

View File

@@ -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)

View File

@@ -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)

View 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',),
),
]

View File

@@ -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()

View File

@@ -0,0 +1,5 @@
{% extends 'base.html' %}
{% block content %}
<h1 class="text-2xl">Vehicle {{ object }}</h1>
{% endblock %}

View File

@@ -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 %}

View File

@@ -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')
]

View File

@@ -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