Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rost150424 #75

Merged
merged 18 commits into from
Apr 15, 2024
2 changes: 2 additions & 0 deletions FRONTEND/fastparking/fastparking/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@
]

AUTH_USER_MODEL = "users.CustomUser"
PARKING_SPACES_COUNT = 100


MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
Expand Down
12 changes: 12 additions & 0 deletions FRONTEND/fastparking/parking/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django import forms
from .models import Registration

class RegistrationForm(forms.ModelForm):
class Meta:
model = Registration
fields = ['parking', 'car_number_in', 'car']

def clean(self):
cleaned_data = super().clean()
# Додайте власні перевірки, якщо потрібно
return cleaned_data
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.0.4 on 2024-04-15 09:56

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('parking', '0002_remove_parkingspace_user_remove_registration_payment_and_more'),
]

operations = [
migrations.RemoveField(
model_name='parkingspace',
name='registration_id',
),
migrations.AddField(
model_name='parkingspace',
name='reserved',
field=models.BooleanField(default=False),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by Django 5.0.4 on 2024-04-15 12:36

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('parking', '0003_remove_parkingspace_registration_id_and_more'),
]

operations = [
migrations.CreateModel(
name='EntryRegistration',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('entry_datetime', models.DateTimeField(auto_now_add=True)),
('car_number_in', models.CharField(max_length=16)),
('parking', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parking.parkingspace')),
],
),
migrations.CreateModel(
name='ExitRegistration',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('exit_datetime', models.DateTimeField()),
('car_number_out', models.CharField(max_length=16)),
('entry_registration', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='parking.entryregistration')),
('parking', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parking.parkingspace')),
],
),
migrations.CreateModel(
name='CombinedRegistration',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('entry_registration', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='parking.entryregistration')),
('exit_registration', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='parking.exitregistration')),
],
),
]
4 changes: 4 additions & 0 deletions FRONTEND/fastparking/parking/templates/parking/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ <h1 class="visually-hidden">Sidebars examples</h1>
<span class="nav-item">Accounts</span>
</a>
</li>
<a class="nav-link {% if active_menu == 'parking:registration_list' %}active{% else %}text-white{% endif %}" href="{% url 'parking:registration_list' %}">
<i class="fa-solid fa-car"></i>
<span class="nav-item">Registration</span>
</a>
<li>
<a class="nav-link {% if active_menu == 'cars' %}active{% else %}text-white{% endif %}" href="/cars/">
<i class="fa-solid fa-car"></i>
Expand Down
6 changes: 5 additions & 1 deletion FRONTEND/fastparking/parking/templates/parking/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@

<div class="px-4 my-5 text-center" style="padding-top: 0; margin-top: 0;">
<h1 class="display-5 fw-bold" style="font-size: 36px; margin-top: -20px;">Fast Parking</h1>
<h3 class="display-5 fw-bold" style="font-size: 26px; margin-top: 10px;" >Швидка паркова</h2>
<h3 class="display-5 fw-bold" style="font-size: 26px; margin-top: 10px;">Швидка паркова</h3>
<div class="col-lg-6 mx-auto">
<p class="lead" style="font-size: 16px;">A new generation of parking</p>
<div style="border: 1px solid #ccc; border-radius: 5px; padding: 10px; margin-top: 20px;">
Total parking spaces: {{ total_parking_spaces }} | Free spaces: {{ free_parking_spaces }}
<a href="{% url 'parking:parking_plan' %}" class="btn btn-primary" style="margin-left: 10px;">Переглянути план парковки</a>
</div>
</div>
<img class="d-block mx-auto mb-4" style="border-radius: 0.5rem;" src="static/parking/cont1.jpg"
alt="" width="1280" height="720">
Expand Down
29 changes: 29 additions & 0 deletions FRONTEND/fastparking/parking/templates/parking/parking_plan.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>План парковки</title>
<style>
.parking-space {
width: 50px; /* Ширина парковочного місця */
height: 50px; /* Висота парковочного місця */
border: 1px solid #000; /* Рамка парковочного місця */
margin: 2px; /* Відступ між місцями */
display: inline-block; /* Показувати місця в одному рядку */
}
.free-space {
background-color: green; /* Колір для вільних місць */
}
</style>
</head>
<body>
{% for row in parking_rows %}
<div>
{% for space in row %}
<div class="parking-space free-space"></div>
{% endfor %}
</div>
{% endfor %}
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Combined Registration List</title>
</head>
<body>
<h1>Combined Registration List</h1>
<table>
<thead>
<tr>
<th>Registration ID</th>
<th>Parking Space</th>
<th>Entry Datetime</th>
<th>Exit Datetime</th>
<th>Car Number In</th>
<th>Car Number Out</th>
</tr>
</thead>
<tbody>
{% for combined_registration in combined_registrations %}
<tr>
<td>{{ combined_registration.id }}</td>
<td>{{ combined_registration.entry_registration.parking }}</td>
<td>{{ combined_registration.entry_registration.entry_datetime }}</td>
<td>{{ combined_registration.exit_registration.exit_datetime }}</td>
<td>{{ combined_registration.entry_registration.car_number_in }}</td>
<td>{{ combined_registration.exit_registration.car_number_out }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
5 changes: 4 additions & 1 deletion FRONTEND/fastparking/parking/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,8 @@

urlpatterns = [
path('', views.main, name='main'),

path('parking_plan/', views.parking_plan_view, name='parking_plan'),
path('registration/', views.registration_list, name='registration_list'),

]

84 changes: 75 additions & 9 deletions FRONTEND/fastparking/parking/views.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,94 @@
from django.shortcuts import render

# Create your views here.

from django.shortcuts import render, redirect
from .models import ParkingSpace
from django.conf import settings
from django.utils import timezone
from .models import Registration
from .models import ParkingSpace

def main(request):
total_parking_spaces = settings.PARKING_SPACES_COUNT
occupied_parking_spaces = ParkingSpace.objects.filter(status=True).count()
free_parking_spaces = total_parking_spaces - occupied_parking_spaces

active_menu = "home"
return render(
request,
"parking/index.html",
{"title": "Fast Parking", "active_menu": active_menu},
{
"title": "Fast Parking",
"active_menu": active_menu,
"total_parking_spaces": total_parking_spaces,
"free_parking_spaces": free_parking_spaces,
},
)

from parking.models import Registration
# from .models import Sessions

def generate_report(request):
user = request.user
entry_datetime = request.GET.get('start_date')
exit_datetime = request.GET.get('end_date')
car = car
# entries = Sessions.objects.all()[:10]


parking_entries = Registration.objects.filter(user=user,
entry_time__range=[entry_datetime, exit_datetime])

return render(request, 'accounts/report.html', {'car': car, 'start_date': entry_datetime, 'end_date': exit_datetime})

def parking_plan_view(request):
parking_spaces = ParkingSpace.objects.all()

# Розбиття місць на рядки
row_length = 10 # Довжина рядка (кількість місць у рядку)
parking_rows = [parking_spaces[i:i+row_length] for i in range(0, len(parking_spaces), row_length)]

return render(request, 'parking/parking_plan.html', {'parking_rows': parking_rows})

def registration_list(request):
registrations = Registration.objects.all()
return render(request, 'parking/registration_list.html', {'registrations': registrations})


def entry_registration(request):
if request.method == 'POST':
# Отримання даних з форми
parking_id = request.POST.get('parking_id')
car_number_in = request.POST.get('car_number_in')

# Створення реєстрації заїзду
parking = ParkingSpace.objects.get(id=parking_id)
entry_registration = EntryRegistration.objects.create(parking=parking, car_number_in=car_number_in)

# Перенаправлення на сторінку з реєстрацією виїзду
return redirect('exit_registration', entry_id=entry_registration.id)

return render(request, 'entry_registration_form.html')

def exit_registration(request, entry_id):
if request.method == 'POST':
# Отримання даних з форми
exit_datetime = timezone.now()
car_number_out = request.POST.get('car_number_out')

# Отримання реєстрації заїзду
entry_registration = EntryRegistration.objects.get(id=entry_id)

# Створення реєстрації виїзду
exit_registration = ExitRegistration.objects.create(
parking=entry_registration.parking,
entry_registration=entry_registration,
exit_datetime=exit_datetime,
car_number_out=car_number_out
)

# Створення об'єднаної реєстрації
combined_registration = CombinedRegistration.create_combined_registration(entry_registration, exit_registration)

# Перенаправлення на іншу сторінку
return redirect('some_other_view')

return render(request, 'exit_registration_form.html')


def registration_table(request):
registrations = EntryRegistration.objects.all()
return render(request, 'registration_table.html', {'registrations': registrations})
61 changes: 61 additions & 0 deletions FRONTEND/fastparking/repository.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# from .models import Registration
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from .models import Tariff
from .services import compare_plates
from .models import Registration


def get_registration_instance(id: int) -> Registration | None:
try:
return Registration.objects.get(pk=id)
except ObjectDoesNotExist:
return None


def find_registered_plate(num_auto: str, max_results: int = 1000) -> int | None:
try:
reg = Registration.objects.get(
car_number_out__isnull=True, car_number_in__contains=num_auto
)
if reg:
return reg.id
except Registration.DoesNotExist:
return None

unclosed_registration = Registration.objects.filter(car_number_out__isnull=True)[
:max_results
]
for reg in unclosed_registration:
reg_num_auto = reg.car_number_in
result, sim = compare_plates(num_auto, reg_num_auto)
if result:
return reg.id
from .models import Payment
# from parking.repository import get_registration_instance

def save_payment(registration_id: int, amount: float) -> Payment:
registration = get_registration_instance(registration_id)
if registration:
payment = Payment(registration=registration, amount=amount)
payment.save()
return payment
else:
raise ValueError("Registration does not exist.")



def calculate_current_invoice(registration_id: int) -> float:
registration = get_registration_instance(registration_id)
if registration:
# Assuming duration is calculated somewhere
duration = 2 # Placeholder for duration calculation
tariff = Tariff.objects.first() # Placeholder for fetching current tariff
if tariff:
price_per_hour = tariff.price_per_hour
result = duration * price_per_hour
return result
else:
raise ValueError("No tariff found.")
else:
raise ValueError("Registration does not exist.")
2 changes: 1 addition & 1 deletion FRONTEND/fastparking/users/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

class CustomUser(AbstractUser):
# cars = models.TextField(blank=True, null=True)
telegram_nickname = models.CharField(max_length=20, blank=True, null=True)
telegram_nickname = models.CharField(max_length=20, unique=True, blank=True, null=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
telegram_id = models.CharField(max_length=50, blank=True, null=True)
cars = models.ManyToManyField(Car, related_name='owners', blank=True) # Додано поле багато-до-багатьох для прив'язки автомобілів до користувача
Expand Down
Loading