diff --git a/carpark/__pycache__/urls.cpython-39.pyc b/carpark/__pycache__/urls.cpython-39.pyc index 90c5111fed91bd3d42ddd5190e80ad48b5fa8e4e..1081066e4c8cc5d88274631e3401667a17d03a9d 100644 Binary files a/carpark/__pycache__/urls.cpython-39.pyc and b/carpark/__pycache__/urls.cpython-39.pyc differ diff --git a/carpark/urls.py b/carpark/urls.py index cfb8bff968a099da0ec4034434da54b661dcc66a..3a10bdbf7375469edee123431197dd746de0dc67 100644 --- a/carpark/urls.py +++ b/carpark/urls.py @@ -18,5 +18,6 @@ from django.urls import path, include urlpatterns = [ path("admin/", admin.site.urls), + path("vehicle/", include("vehicleapp.urls")), path("", include("homeapp.urls")) ] diff --git a/db.sqlite3 b/db.sqlite3 index 6e5a52c852ab75b295326782dda911f827c3c0df..3bd28013ac4ca93c1abea959b922f3eb87adeec4 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/homeapp/templates/homeapp/home.html b/homeapp/templates/homeapp/home.html index 24a2748117460c714ef5ac6b0b41eb35ecf634a9..cf5aef52ba416fd22d139aecee10c2df8602c343 100644 --- a/homeapp/templates/homeapp/home.html +++ b/homeapp/templates/homeapp/home.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block title %} - <title>Notes Home</title> + <title>Carpark Home</title> {% endblock title%} {% block content %} diff --git a/static/css/base.css b/static/css/base.css index da5abb8493b4eadc51cec696249d86b938effe35..016f2d4d8a6de974bf7e3b95a7ec8c4f141e9823 100644 --- a/static/css/base.css +++ b/static/css/base.css @@ -10,7 +10,29 @@ h1 { .success { background-color: #00FF00; } -.error, .errorlist { +.error, +.errorlist { background-color: #FF0000; } +.menu { + font-weight: bold; + float: left; + color: white; + list-style-type: none; + margin: 0; + padding: 0; + width: 100%; + overflow: hidden; + background-color: #111; } + .menu li { + float: left; } + .menu a { + display: block; + color: white; + text-align: center; + padding: 14px 16px; + text-decoration: none; } + .menu a:hover { + background-color: #444; } + /*# sourceMappingURL=base.css.map */ \ No newline at end of file diff --git a/static/css/base.css.map b/static/css/base.css.map index daafed0ec3da13f486d405296352b1ad37d8496c..481bbeb854389aa5386cbb4aa25c2cefb8e5ec11 100644 --- a/static/css/base.css.map +++ b/static/css/base.css.map @@ -5,5 +5,5 @@ "base.scss" ], "names": [], - "mappings": "AAGA,AAAA,IAAI,CAAC;EACD,WAAW,EAJR,iBAAiB,EAAE,OAAO,EAAE,KAAK;EAKpC,gBAAgB,EAJZ,OAAO;EAKX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI,GAChB;;AAED,AAAA,EAAE,CAAC;EACC,cAAc,EAAE,SAAS,GAC5B;;AAED,AAAA,QAAQ,CAAC;EACL,gBAAgB,EAAE,OACtB,GAAC;;AAED,AAAA,MAAM,EAAE,UAAU,CAAC;EACf,gBAAgB,EAAE,OACtB,GAAC" + "mappings": "AAGA,AAAA,IAAI,CAAC;EACD,WAAW,EAJR,iBAAiB,EAAE,OAAO,EAAE,KAAK;EAKpC,gBAAgB,EAJZ,OAAO;EAKX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI,GAChB;;AAED,AAAA,EAAE,CAAC;EACC,cAAc,EAAE,SAAS,GAC5B;;AAED,AAAA,QAAQ,CAAC;EACL,gBAAgB,EAAE,OACtB,GAAC;;AAED,AAAA,MAAM;AACN,UAAU,CAAC;EACP,gBAAgB,EAAE,OACtB,GAAC;;AAED,AAAA,KAAK,CAAC;EACF,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,KAAK;EACZ,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,IAAI;EACX,QAAQ,EAAE,MAAM;EAChB,gBAAgB,EAAE,IAAI,GAiBzB;EA1BD,AAWI,KAXC,CAWD,EAAE,CAAC;IACC,KAAK,EAAE,IAAI,GACd;EAbL,AAeI,KAfC,CAeD,CAAC,CAAC;IACE,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,IAAI,GACxB;EArBL,AAuBI,KAvBC,CAuBD,CAAC,CAAC,KAAK,CAAC;IACJ,gBAAgB,EAAE,IAAI,GACzB" } \ No newline at end of file diff --git a/static/css/base.scss b/static/css/base.scss index 88330864f728126200bf7082bb0577552767f83c..147c69992946268dc381053d31f97b5933e76246 100644 --- a/static/css/base.scss +++ b/static/css/base.scss @@ -16,6 +16,35 @@ h1 { background-color: #00FF00 } -.error, .errorlist { +.error, +.errorlist { background-color: #FF0000 +} + +.menu { + font-weight: bold; + float: left; + color: white; + list-style-type: none; + margin: 0; + padding: 0; + width: 100%; + overflow: hidden; + background-color: #111; + + li { + float: left; + } + + a { + display: block; + color: white; + text-align: center; + padding: 14px 16px; + text-decoration: none; + } + + a:hover { + background-color: #444; + } } \ No newline at end of file diff --git a/vehicleapp/__pycache__/forms.cpython-39.pyc b/vehicleapp/__pycache__/forms.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae4f1fd987bfdabc87c67b122b1b14ffe53dbd42 Binary files /dev/null and b/vehicleapp/__pycache__/forms.cpython-39.pyc differ diff --git a/vehicleapp/__pycache__/models.cpython-39.pyc b/vehicleapp/__pycache__/models.cpython-39.pyc index ddebce1b220e342eb17f1c221db204443a473761..7904ffe301dc507e589f9a7023cab59d14198010 100644 Binary files a/vehicleapp/__pycache__/models.cpython-39.pyc and b/vehicleapp/__pycache__/models.cpython-39.pyc differ diff --git a/vehicleapp/__pycache__/urls.cpython-39.pyc b/vehicleapp/__pycache__/urls.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e86f3b168d9d1ed2a8c46542589dca19186617d Binary files /dev/null and b/vehicleapp/__pycache__/urls.cpython-39.pyc differ diff --git a/vehicleapp/__pycache__/views.cpython-39.pyc b/vehicleapp/__pycache__/views.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d76f5beadb3ed28d5a41d515b5df36191a061e56 Binary files /dev/null and b/vehicleapp/__pycache__/views.cpython-39.pyc differ diff --git a/vehicleapp/forms.py b/vehicleapp/forms.py new file mode 100644 index 0000000000000000000000000000000000000000..e653b83710be5421934168d54abf3c899d6f24b0 --- /dev/null +++ b/vehicleapp/forms.py @@ -0,0 +1,37 @@ +from django import forms +from .models import Vehicle + +class DateInput(forms.DateInput): + input_type = 'date' + +class TimeInput(forms.TimeInput): + input_type: 'time' +# creating a form +class VehicleForm(forms.ModelForm): + + # create meta class + class Meta: + # specify model to be used + model = Vehicle + + fields = ['regNumber', 'owner', 'contactNo', 'parkingDate', 'timeIn', 'timeOut'] + widgets = { + 'regNumber': forms.TextInput(attrs={ + 'class': 'formfield', + 'placeholder': 'Registration Number', + }), + 'owner': forms.TextInput(attrs={ + 'class': 'formfield', + 'placeholder': 'Full Name', + }), + 'contactNo': forms.TextInput(attrs={ + 'class': 'formfield', + 'placeholder': 'Phone Number', + }), + + 'parkingDate': DateInput(), + + 'timeIn': TimeInput(attrs={'placeholder' : 'hh:mm'}), + + 'timeOut': TimeInput(), + } \ No newline at end of file diff --git a/vehicleapp/migrations/__pycache__/0001_initial.cpython-39.pyc b/vehicleapp/migrations/__pycache__/0001_initial.cpython-39.pyc index c3b3ee7e06f4f43b0cce57b36cb6cdc6a308a4bf..def7eaa06b01fac686a83ef982e934ffb10df68d 100644 Binary files a/vehicleapp/migrations/__pycache__/0001_initial.cpython-39.pyc and b/vehicleapp/migrations/__pycache__/0001_initial.cpython-39.pyc differ diff --git a/vehicleapp/models.py b/vehicleapp/models.py index b7423d2e0cded63ddee17efc96f880f5a1569264..8bc298651d857cb88b324fb00393f1291c06b2f7 100644 --- a/vehicleapp/models.py +++ b/vehicleapp/models.py @@ -5,5 +5,5 @@ class Vehicle(models.Model): owner = models.CharField(max_length = 50, unique=True) contactNo = models.CharField(max_length = 11, unique=True) parkingDate = models.DateField() - timeIn = models.CharField(max_length=50) - timeOut = models.CharField(max_length=50) \ No newline at end of file + timeIn = models.TimeField() + timeOut = models.TimeField() \ No newline at end of file diff --git a/vehicleapp/templates/vehicleapp/create_view.html b/vehicleapp/templates/vehicleapp/create_view.html new file mode 100644 index 0000000000000000000000000000000000000000..bf4ac2b3265bff4a60105d5e3b152ba12b747909 --- /dev/null +++ b/vehicleapp/templates/vehicleapp/create_view.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block content %} +<form method="POST" enctype="multipart/form-data"> + + <!-- Security token --> + {% csrf_token %} + + <!-- Using the formset --> + {{ form.as_p }} + + <input type="submit" value="Create"> +</form> +{% endblock content %} \ No newline at end of file diff --git a/vehicleapp/templates/vehicleapp/detail_view.html b/vehicleapp/templates/vehicleapp/detail_view.html new file mode 100644 index 0000000000000000000000000000000000000000..bdbf40b1325dcf22647db78446b029b9d7a1266c --- /dev/null +++ b/vehicleapp/templates/vehicleapp/detail_view.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% block content %} + +<body> + <h2>{{ vehicle.regNumber }}</h2> + <hr> + <p> {{ vehicle.owner }}</p> + <hr> + <hr> + <p> {{ vehicle.contactNo }}</p> + <hr> + <p> Created:{{ vehicle.created_at }}</p> + <p> Last Updated: {{ vehicle.updated_at }}</p> + <input type="button" onclick="location.href='{% url 'vehicle_update' vehicle.id %}';" value="Edit" /> + <input type="button" onclick="location.href='{% url 'vehicle_delete' vehicle.id %}';" value="Delete" /> +</body> +{% endblock content %} \ No newline at end of file diff --git a/vehicleapp/templates/vehicleapp/index.html b/vehicleapp/templates/vehicleapp/index.html new file mode 100644 index 0000000000000000000000000000000000000000..07b17b17e23b71339387b413631dc4b787fe3084 --- /dev/null +++ b/vehicleapp/templates/vehicleapp/index.html @@ -0,0 +1,38 @@ +{% extends 'base.html' %} +{% block content %} +<table> + <tr> + <th>Registration Number</th> + <th>Owner</th> + <th>Contact Number</th> + <th>Parking Date</th> + <th>Time In</th> + <th>Time Out</th> + </tr> + {% for vehicle in vehicle_list %} + <tr> + <td> + <a href="{% url 'vehicles_detail' vehicle.id %}"> + {{ vehicle.regNumber | truncatechars:20}}</a> + </td> + <td> + {{ vehicle.owner | truncatechars:25}} + </td> + <td> + {{ vehicle.contactNo | truncatechars:25}} + </td> + <td> + {{ vehicle.parkingDate | truncatechars:25}} + </td> + <td> + {{ vehicle.timeIn | truncatechars:25}} + </td> + <td> + {{ vehicle.timeOut | truncatechars:25}} + </td> + </tr> + {% endfor %} +</table> +<hr /> +<input type="button" onclick="location.href='{%url 'vehicle_new'%}';" value="New" /> +{% endblock content %} \ No newline at end of file diff --git a/vehicleapp/templates/vehicleapp/update_view.html b/vehicleapp/templates/vehicleapp/update_view.html new file mode 100644 index 0000000000000000000000000000000000000000..f54b4516fdf6740ee616784e4e67f3bb9c1afa68 --- /dev/null +++ b/vehicleapp/templates/vehicleapp/update_view.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} +{% block content %} + +<form method="POST" enctype="multipart/form-data"> + <!-- Security token --> + {% csrf_token %} + <!-- Using the formset --> + {{ form.as_p }} + <input type="submit" value="Update"> +</form> +{% endblock content %} \ No newline at end of file diff --git a/vehicleapp/urls.py b/vehicleapp/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..ab32cd71b7cb24a73c3c076f5445856e4c40a274 --- /dev/null +++ b/vehicleapp/urls.py @@ -0,0 +1,15 @@ +from django.urls import path +from . import views + +urlpatterns = [ + #vehicles/ + path('', views.index_view, name='vehicle_index'), + #vehicles/id + path('<int:nid>', views.detail_view, name='vehicles_detail'), + #vehicles/new + path('new', views.create_view, name='vehicle_new'), + #vehicles/edit/id + path('edit/<int:nid>', views.update_view, name='vehicle_update'), + #vehicles/delete/id + path('delete/<int:nid>', views.delete_view, name='vehicle_delete'), +] diff --git a/vehicleapp/views.py b/vehicleapp/views.py index 91ea44a218fbd2f408430959283f0419c921093e..7d683c68367cb3d51cd5aeda95783ca60aba1a49 100644 --- a/vehicleapp/views.py +++ b/vehicleapp/views.py @@ -1,3 +1,66 @@ -from django.shortcuts import render +from django.http import HttpResponse +from django.shortcuts import (get_object_or_404, render, redirect) +from django.contrib import messages +from .models import Vehicle +from .forms import VehicleForm -# Create your views here. +def index_view(request): + # dictionary for initial data with + # field names as keys + context ={} + + # add the dictionary during initialization + context["vehicle_list"] = Vehicle.objects.all() + + return render(request, "vehicleapp/index.html", context) + +# pass id attribute from urls +def detail_view(request, nid): + context ={} + + # add the dictionary during initialization + context["vehicle"] = get_object_or_404(Vehicle, pk=nid) + return render(request, "vehicleapp/detail_view.html",context) + +def create_view(request): + context ={} + form = VehicleForm(request.POST or None) + if(request.method == 'POST'): + if form.is_valid(): + form.save() + messages.add_message(request, messages.SUCCESS, 'Vehicle Space Created') + return redirect('vehicle_index') + else: + messages.add_message(request, messages.ERROR, 'Invalid Form Data; Space not created') + + context['form']= form + return render(request, "vehicleapp/create_view.html", context) + +def update_view(request, nid): + context ={} + + # fetch the object related to passed id + obj = get_object_or_404(Vehicle, id = nid) + + # pass the object as instance in form + form = VehicleForm(request.POST or None, instance = obj) + + # save the data from the form and + # redirect to detail_view + if form.is_valid(): + form.save() + messages.add_message(request, messages.SUCCESS, 'VehicleUpdated') + + return redirect('vehicle_detail', nid=nid) + # add form dictionary to context + context["form"] = form + return render(request, "vehicleapp/update_view.html", context) + +def delete_view(request, nid): + # fetch the object related to passed id + obj = get_object_or_404(Vehicle, id = nid) + # delete object + obj.delete() + messages.add_message(request, messages.SUCCESS, 'Vehicle Deleted') + # after deleting redirect to index view + return redirect('vehicle_index') \ No newline at end of file