From 5b5f16f2f5fa19f521094f8126acfb60af4ae697 Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 16:15:57 +0300 Subject: [PATCH 01/15] test --- FRONTEND/fastparking/fastparking/settings.py | 1 + FRONTEND/fastparking/parking/forms.py | 12 +++ ...e_parkingspace_registration_id_and_more.py | 22 +++++ ...yregistration_exitregistration_and_more.py | 41 +++++++++ FRONTEND/fastparking/parking/models.py | 38 ++++++++- .../parking/templates/parking/base.html | 8 ++ .../parking/templates/parking/index.html | 6 +- .../parking/templates/parking/parking.html | 29 ------- .../templates/parking/parking_plan.html | 29 +++++++ .../templates/parking/registration_list.html | 35 ++++++++ .../templates/parking/registration_table.html | 33 ++++++++ FRONTEND/fastparking/parking/urls.py | 4 +- FRONTEND/fastparking/parking/views.py | 83 +++++++++++++++++-- 13 files changed, 298 insertions(+), 43 deletions(-) create mode 100644 FRONTEND/fastparking/parking/forms.py create mode 100644 FRONTEND/fastparking/parking/migrations/0003_remove_parkingspace_registration_id_and_more.py create mode 100644 FRONTEND/fastparking/parking/migrations/0004_entryregistration_exitregistration_and_more.py delete mode 100644 FRONTEND/fastparking/parking/templates/parking/parking.html create mode 100644 FRONTEND/fastparking/parking/templates/parking/parking_plan.html create mode 100644 FRONTEND/fastparking/parking/templates/parking/registration_list.html create mode 100644 FRONTEND/fastparking/parking/templates/parking/registration_table.html diff --git a/FRONTEND/fastparking/fastparking/settings.py b/FRONTEND/fastparking/fastparking/settings.py index 994814e8..77968b3d 100644 --- a/FRONTEND/fastparking/fastparking/settings.py +++ b/FRONTEND/fastparking/fastparking/settings.py @@ -79,6 +79,7 @@ ] AUTH_USER_MODEL = "users.CustomUser" +PARKING_SPACES_COUNT = 100 MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", diff --git a/FRONTEND/fastparking/parking/forms.py b/FRONTEND/fastparking/parking/forms.py new file mode 100644 index 00000000..6d8c5e58 --- /dev/null +++ b/FRONTEND/fastparking/parking/forms.py @@ -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 diff --git a/FRONTEND/fastparking/parking/migrations/0003_remove_parkingspace_registration_id_and_more.py b/FRONTEND/fastparking/parking/migrations/0003_remove_parkingspace_registration_id_and_more.py new file mode 100644 index 00000000..75346847 --- /dev/null +++ b/FRONTEND/fastparking/parking/migrations/0003_remove_parkingspace_registration_id_and_more.py @@ -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), + ), + ] diff --git a/FRONTEND/fastparking/parking/migrations/0004_entryregistration_exitregistration_and_more.py b/FRONTEND/fastparking/parking/migrations/0004_entryregistration_exitregistration_and_more.py new file mode 100644 index 00000000..3afc5f13 --- /dev/null +++ b/FRONTEND/fastparking/parking/migrations/0004_entryregistration_exitregistration_and_more.py @@ -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')), + ], + ), + ] diff --git a/FRONTEND/fastparking/parking/models.py b/FRONTEND/fastparking/parking/models.py index 8b003303..f9932e59 100644 --- a/FRONTEND/fastparking/parking/models.py +++ b/FRONTEND/fastparking/parking/models.py @@ -1,21 +1,20 @@ -from django.contrib.auth.models import User - +from django.utils import timezone from django.db import models from photos.models import Photo from django.db import models -from photos.models import Photo from cars.models import Car class ParkingSpace(models.Model): number = models.CharField(max_length=10, unique=True) status = models.BooleanField(default=False) # False - вільно, True - зайнято - registration_id = models.ForeignKey(Photo, on_delete=models.SET_NULL, null=True, blank=True) + reserved = models.BooleanField(default=False) # Додайте поле для вказання, чи є місце зарезервованим def __str__(self): return self.number + class Registration(models.Model): parking = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) entry_datetime = models.DateTimeField(auto_now_add=True) @@ -27,5 +26,36 @@ class Registration(models.Model): photo_out = models.ForeignKey(Photo, on_delete=models.SET_NULL, related_name='registration_photo_out', null=True, blank=True) car = models.ForeignKey(Car, on_delete=models.SET_NULL, null=True, blank=True) + @property + def duration(self): + if self.exit_datetime: + return self.exit_datetime - self.entry_datetime + else: + return timezone.now() - self.entry_datetime + def __str__(self): return f"Registration ID: {self.id} - Parking ID: {self.parking_id} - Entry Time: {self.entry_datetime}" + + +class EntryRegistration(models.Model): + parking = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) + entry_datetime = models.DateTimeField(auto_now_add=True) + car_number_in = models.CharField(max_length=16) + +class ExitRegistration(models.Model): + parking = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) + entry_registration = models.OneToOneField(EntryRegistration, on_delete=models.CASCADE) + exit_datetime = models.DateTimeField() + car_number_out = models.CharField(max_length=16) + +class CombinedRegistration(models.Model): + entry_registration = models.OneToOneField(EntryRegistration, on_delete=models.CASCADE) + exit_registration = models.OneToOneField(ExitRegistration, on_delete=models.CASCADE) + + def __str__(self): + return f"Combined Registration ID: {self.id}" + + @classmethod + def create_combined_registration(cls, entry_registration, exit_registration): + combined_registration = cls.objects.create(entry_registration=entry_registration, exit_registration=exit_registration) + return combined_registration \ No newline at end of file diff --git a/FRONTEND/fastparking/parking/templates/parking/base.html b/FRONTEND/fastparking/parking/templates/parking/base.html index 4e4434bc..446fe4b8 100644 --- a/FRONTEND/fastparking/parking/templates/parking/base.html +++ b/FRONTEND/fastparking/parking/templates/parking/base.html @@ -44,6 +44,14 @@

Sidebars examples

Accounts + + + Registration + + + + Registration Table +
  • diff --git a/FRONTEND/fastparking/parking/templates/parking/index.html b/FRONTEND/fastparking/parking/templates/parking/index.html index 30335479..adfefa04 100644 --- a/FRONTEND/fastparking/parking/templates/parking/index.html +++ b/FRONTEND/fastparking/parking/templates/parking/index.html @@ -4,9 +4,13 @@

    Fast Parking

    -

    Швидка паркова

    +

    Швидка паркова

    diff --git a/FRONTEND/fastparking/parking/templates/parking/parking.html b/FRONTEND/fastparking/parking/templates/parking/parking.html deleted file mode 100644 index 561cd15c..00000000 --- a/FRONTEND/fastparking/parking/templates/parking/parking.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Зайняті місця у кінотеатрі - - - -
    Місце 1
    -
    Місце 2
    -
    Місце 3
    -
    Місце 4
    - - - \ No newline at end of file diff --git a/FRONTEND/fastparking/parking/templates/parking/parking_plan.html b/FRONTEND/fastparking/parking/templates/parking/parking_plan.html new file mode 100644 index 00000000..f6ee8c3f --- /dev/null +++ b/FRONTEND/fastparking/parking/templates/parking/parking_plan.html @@ -0,0 +1,29 @@ + + + + + + План парковки + + + + {% for row in parking_rows %} +
    + {% for space in row %} +
    + {% endfor %} +
    + {% endfor %} + + diff --git a/FRONTEND/fastparking/parking/templates/parking/registration_list.html b/FRONTEND/fastparking/parking/templates/parking/registration_list.html new file mode 100644 index 00000000..c4379a1a --- /dev/null +++ b/FRONTEND/fastparking/parking/templates/parking/registration_list.html @@ -0,0 +1,35 @@ + + + + + + Combined Registration List + + +

    Combined Registration List

    + + + + + + + + + + + + + {% for combined_registration in combined_registrations %} + + + + + + + + + {% endfor %} + +
    Registration IDParking SpaceEntry DatetimeExit DatetimeCar Number InCar Number Out
    {{ combined_registration.id }}{{ combined_registration.entry_registration.parking }}{{ combined_registration.entry_registration.entry_datetime }}{{ combined_registration.exit_registration.exit_datetime }}{{ combined_registration.entry_registration.car_number_in }}{{ combined_registration.exit_registration.car_number_out }}
    + + diff --git a/FRONTEND/fastparking/parking/templates/parking/registration_table.html b/FRONTEND/fastparking/parking/templates/parking/registration_table.html new file mode 100644 index 00000000..e29fb427 --- /dev/null +++ b/FRONTEND/fastparking/parking/templates/parking/registration_table.html @@ -0,0 +1,33 @@ + + + + + + Registration Table + + +

    Registration Table

    + + + + + + + + + + + + {% for registration in registrations %} + + + + + + + + {% endfor %} + +
    IDParkingEntry TimeExit TimeCar Number
    {{ registration.id }}{{ registration.parking }}{{ registration.entry_registration.entry_datetime }}{{ registration.exit_datetime }}{{ registration.car_number_out }}
    + + diff --git a/FRONTEND/fastparking/parking/urls.py b/FRONTEND/fastparking/parking/urls.py index 24c69a9e..075b8722 100644 --- a/FRONTEND/fastparking/parking/urls.py +++ b/FRONTEND/fastparking/parking/urls.py @@ -5,5 +5,7 @@ urlpatterns = [ path('', views.main, name='main'), - + path('parking_plan/', views.parking_plan_view, name='parking_plan'), + path('registration/', views.registration_list, name='registration_list'), + path('registration_table/', views.registration_table, name='registration_table'), ] diff --git a/FRONTEND/fastparking/parking/views.py b/FRONTEND/fastparking/parking/views.py index 8885eabe..5c2ccc1c 100644 --- a/FRONTEND/fastparking/parking/views.py +++ b/FRONTEND/fastparking/parking/views.py @@ -1,28 +1,95 @@ -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, EntryRegistration, ExitRegistration, CombinedRegistration 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}) \ No newline at end of file From 9ab7cb734ad5275e32ecd31990e21f5b21d84abb Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:19:12 +0300 Subject: [PATCH 02/15] reg --- FRONTEND/fastparking/parking/models.py | 63 ++++++---------------- FRONTEND/fastparking/parking/repository.py | 45 +++++++++++++--- FRONTEND/fastparking/parking/views.py | 3 +- FRONTEND/fastparking/users/models.py | 2 +- 4 files changed, 58 insertions(+), 55 deletions(-) diff --git a/FRONTEND/fastparking/parking/models.py b/FRONTEND/fastparking/parking/models.py index f9932e59..42ec57f6 100644 --- a/FRONTEND/fastparking/parking/models.py +++ b/FRONTEND/fastparking/parking/models.py @@ -1,9 +1,5 @@ -from django.utils import timezone from django.db import models -from photos.models import Photo -from django.db import models -from cars.models import Car - +# from finance.models import Tariff class ParkingSpace(models.Model): number = models.CharField(max_length=10, unique=True) @@ -12,50 +8,25 @@ class ParkingSpace(models.Model): def __str__(self): return self.number - - - class Registration(models.Model): - parking = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) + parking_space = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) + car_number = models.CharField(max_length=16) entry_datetime = models.DateTimeField(auto_now_add=True) - car_number_in = models.CharField(max_length=16) exit_datetime = models.DateTimeField(null=True, blank=True) invoice = models.CharField(max_length=255, null=True, blank=True) - car_number_out = models.CharField(max_length=16, null=True, blank=True) - photo_in = models.ForeignKey(Photo, on_delete=models.SET_NULL, related_name='registration_photo_in', null=True, blank=True) - photo_out = models.ForeignKey(Photo, on_delete=models.SET_NULL, related_name='registration_photo_out', null=True, blank=True) - car = models.ForeignKey(Car, on_delete=models.SET_NULL, null=True, blank=True) - - @property - def duration(self): - if self.exit_datetime: - return self.exit_datetime - self.entry_datetime - else: - return timezone.now() - self.entry_datetime - - def __str__(self): - return f"Registration ID: {self.id} - Parking ID: {self.parking_id} - Entry Time: {self.entry_datetime}" - - -class EntryRegistration(models.Model): - parking = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) - entry_datetime = models.DateTimeField(auto_now_add=True) - car_number_in = models.CharField(max_length=16) - -class ExitRegistration(models.Model): - parking = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) - entry_registration = models.OneToOneField(EntryRegistration, on_delete=models.CASCADE) - exit_datetime = models.DateTimeField() - car_number_out = models.CharField(max_length=16) - -class CombinedRegistration(models.Model): - entry_registration = models.OneToOneField(EntryRegistration, on_delete=models.CASCADE) - exit_registration = models.OneToOneField(ExitRegistration, on_delete=models.CASCADE) + payments = models.BooleanField(default=False) + tariff_id = models.IntegerField(null=True) # Додамо поле для зберігання id тарифу def __str__(self): - return f"Combined Registration ID: {self.id}" - - @classmethod - def create_combined_registration(cls, entry_registration, exit_registration): - combined_registration = cls.objects.create(entry_registration=entry_registration, exit_registration=exit_registration) - return combined_registration \ No newline at end of file + return f"Registration: {self.car_number} - Parking Space: {self.parking_space.number}" + + def save(self, *args, **kwargs): + if not self.pk: # Якщо це нова реєстрація + # Збережемо id тарифу для цієї реєстрації на момент заїзду + self.tariff_id = self.get_current_tariff_id() + super(Registration, self).save(*args, **kwargs) + + def get_current_tariff_id(self): + # Отримаємо всі тарифи, які були активні на момент заїзду + tariff = Tariff.objects.filter(start_date__lte=self.entry_datetime, end_date__gte=self.entry_datetime).first() + return tariff.id if tariff else None diff --git a/FRONTEND/fastparking/parking/repository.py b/FRONTEND/fastparking/parking/repository.py index 132abe62..37c3fa56 100644 --- a/FRONTEND/fastparking/parking/repository.py +++ b/FRONTEND/fastparking/parking/repository.py @@ -1,12 +1,16 @@ # from .models import Registration +from django.core.exceptions import ObjectDoesNotExist from django.db.models import Q - +# from finance.models import Tariff from .services import compare_plates - - -## DUMMY -class Registration: - ... +from .models import Registration +from finance.models import Payment +from finance.models import Tariff +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: @@ -27,3 +31,32 @@ def find_registered_plate(num_auto: str, max_results: int = 1000) -> int | None: result, sim = compare_plates(num_auto, reg_num_auto) if result: return reg.id + +# 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.") \ No newline at end of file diff --git a/FRONTEND/fastparking/parking/views.py b/FRONTEND/fastparking/parking/views.py index 5c2ccc1c..e5f17d7e 100644 --- a/FRONTEND/fastparking/parking/views.py +++ b/FRONTEND/fastparking/parking/views.py @@ -3,8 +3,7 @@ from django.conf import settings from django.utils import timezone from .models import Registration -from .models import ParkingSpace, EntryRegistration, ExitRegistration, CombinedRegistration - +from .models import ParkingSpace def main(request): total_parking_spaces = settings.PARKING_SPACES_COUNT diff --git a/FRONTEND/fastparking/users/models.py b/FRONTEND/fastparking/users/models.py index 2aa6ae2c..32e2875f 100644 --- a/FRONTEND/fastparking/users/models.py +++ b/FRONTEND/fastparking/users/models.py @@ -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) # Додано поле багато-до-багатьох для прив'язки автомобілів до користувача From 75343afa9e3218a46ebeab8bac31242f4c55990b Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:20:04 +0300 Subject: [PATCH 03/15] reg --- .../templates/parking/registration_table.html | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 FRONTEND/fastparking/parking/templates/parking/registration_table.html diff --git a/FRONTEND/fastparking/parking/templates/parking/registration_table.html b/FRONTEND/fastparking/parking/templates/parking/registration_table.html deleted file mode 100644 index e29fb427..00000000 --- a/FRONTEND/fastparking/parking/templates/parking/registration_table.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Registration Table - - -

    Registration Table

    - - - - - - - - - - - - {% for registration in registrations %} - - - - - - - - {% endfor %} - -
    IDParkingEntry TimeExit TimeCar Number
    {{ registration.id }}{{ registration.parking }}{{ registration.entry_registration.entry_datetime }}{{ registration.exit_datetime }}{{ registration.car_number_out }}
    - - From b6bf59c1e2eda771e7b9affc56300b813706342b Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:22:12 +0300 Subject: [PATCH 04/15] reg --- FRONTEND/fastparking/parking/templates/parking/base.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/FRONTEND/fastparking/parking/templates/parking/base.html b/FRONTEND/fastparking/parking/templates/parking/base.html index 446fe4b8..20acdca7 100644 --- a/FRONTEND/fastparking/parking/templates/parking/base.html +++ b/FRONTEND/fastparking/parking/templates/parking/base.html @@ -48,10 +48,6 @@

    Sidebars examples

    Registration - - - Registration Table -
  • From 4871793cf4a228b0624a230f2ea814f3d63bd7a1 Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:29:10 +0300 Subject: [PATCH 05/15] reg --- FRONTEND/fastparking/parking/{repository.py => repository1.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename FRONTEND/fastparking/parking/{repository.py => repository1.py} (100%) diff --git a/FRONTEND/fastparking/parking/repository.py b/FRONTEND/fastparking/parking/repository1.py similarity index 100% rename from FRONTEND/fastparking/parking/repository.py rename to FRONTEND/fastparking/parking/repository1.py From 3e8eaefdf1eaae4353c1c68854ec6e70fc825bb5 Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:46:35 +0300 Subject: [PATCH 06/15] fin --- FRONTEND/fastparking/finance/models.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/FRONTEND/fastparking/finance/models.py b/FRONTEND/fastparking/finance/models.py index d8f55cdc..1cfc72a8 100644 --- a/FRONTEND/fastparking/finance/models.py +++ b/FRONTEND/fastparking/finance/models.py @@ -2,6 +2,7 @@ from django.urls import reverse from parking.models import Registration + class Tariff(models.Model): description = models.CharField(max_length=255) price_per_hour = models.DecimalField(max_digits=10, decimal_places=2) @@ -11,17 +12,21 @@ class Tariff(models.Model): def __str__(self): return self.description + def get_absolute_url(self): - return reverse('tariff-detail', kwargs={'pk': self.pk}) + return reverse("tariff-detail", kwargs={"pk": self.pk}) + class Payment(models.Model): # user_id = models.IntegerField(blank=True, null=True) # ID користувача, який здійснив оплату (не обов'язкове) - registration_id = models.ForeignKey(Registration, on_delete=models.SET_NULL, null=True, blank=True) # ID реєстрації, за яку здійснюється оплата + registration_id = models.ForeignKey( + Registration, on_delete=models.SET_NULL, null=True, blank=True + ) # ID реєстрації, за яку здійснюється оплата amount = models.DecimalField(max_digits=10, decimal_places=2) - datetime = models.DateTimeField() + datetime = models.DateTimeField(auto_now_add=True) def __str__(self): - return f"Payment {self.id}" + return f"Payment {self.id} on {self.datetime} for {self.registration_id} by {self.amount}" def get_absolute_url(self): - return reverse('post', kwargs={'post_slug': self.id}) + return reverse("post", kwargs={"post_slug": self.id}) From d72ca4283de343eba6056c86d2ec0ac78b3a5c7b Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:49:11 +0300 Subject: [PATCH 07/15] park --- FRONTEND/fastparking/parking/models.py | 93 +++++++++++++++++++++----- 1 file changed, 75 insertions(+), 18 deletions(-) diff --git a/FRONTEND/fastparking/parking/models.py b/FRONTEND/fastparking/parking/models.py index 07244ba2..7cffdf5d 100644 --- a/FRONTEND/fastparking/parking/models.py +++ b/FRONTEND/fastparking/parking/models.py @@ -1,34 +1,91 @@ +import datetime + from django.contrib.auth.models import User from django.db import models -# from finance.models import Tariff +from photos.models import Photo +from django.db import models +from photos.models import Photo +from cars.models import Car + +# from finance.repository import calculate_current_invoice +# import finance.repository as finance_repo + class ParkingSpace(models.Model): number = models.CharField(max_length=10, unique=True) status = models.BooleanField(default=False) # False - вільно, True - зайнято - reserved = models.BooleanField(default=False) # Додайте поле для вказання, чи є місце зарезервованим + registration_id = models.ForeignKey( + Photo, on_delete=models.SET_NULL, null=True, blank=True + ) def __str__(self): return self.number + + class Registration(models.Model): - parking_space = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) - car_number = models.CharField(max_length=16) + parking = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) entry_datetime = models.DateTimeField(auto_now_add=True) + car_number_in = models.CharField(max_length=16) exit_datetime = models.DateTimeField(null=True, blank=True) invoice = models.CharField(max_length=255, null=True, blank=True) - payments = models.BooleanField(default=False) - tariff_id = models.IntegerField(null=True) # Додамо поле для зберігання id тарифу + car_number_out = models.CharField(max_length=16, null=True, blank=True) + photo_in = models.ForeignKey( + Photo, + on_delete=models.SET_NULL, + related_name="registration_photo_in", + null=True, + blank=True, + ) + photo_out = models.ForeignKey( + Photo, + on_delete=models.SET_NULL, + related_name="registration_photo_out", + null=True, + blank=True, + ) + car = models.ForeignKey(Car, on_delete=models.SET_NULL, null=True, blank=True) def __str__(self): - return f"Registration: {self.car_number} - Parking Space: {self.parking_space.number}" - - def save(self, *args, **kwargs): - if not self.pk: # Якщо це нова реєстрація - # Збережемо id тарифу для цієї реєстрації на момент заїзду - self.tariff_id = self.get_current_tariff_id() - super(Registration, self).save(*args, **kwargs) - - def get_current_tariff_id(self): - # Отримаємо всі тарифи, які були активні на момент заїзду - tariff = Tariff.objects.filter(start_date__lte=self.entry_datetime, end_date__gte=self.entry_datetime).first() - return tariff.id if tariff else None + if self.invoice: + invoice_predict = self.invoice + else: + invoice_predict = "Calc..." # calculate_current_invoice(self.id) + # invoice_predict = finance_repo.calculate_current_invoice(self.id) + e_date = self.entry_datetime.strftime("%Y-%m-%d %H:%M") + return f"Registration ID: {self.id:06} - Parking Number: {self.parking.number} - Entry: {e_date} - Invoice*: {invoice_predict}" + +# from django.contrib.auth.models import User + +# from django.db import models +# # from finance.models import Tariff + +# class ParkingSpace(models.Model): +# number = models.CharField(max_length=10, unique=True) +# status = models.BooleanField(default=False) # False - вільно, True - зайнято +# reserved = models.BooleanField(default=False) # Додайте поле для вказання, чи є місце зарезервованим + +# def __str__(self): +# return self.number +# class Registration(models.Model): +# parking_space = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) +# car_number = models.CharField(max_length=16) +# entry_datetime = models.DateTimeField(auto_now_add=True) +# exit_datetime = models.DateTimeField(null=True, blank=True) +# invoice = models.CharField(max_length=255, null=True, blank=True) +# payments = models.BooleanField(default=False) +# tariff_id = models.IntegerField(null=True) # Додамо поле для зберігання id тарифу + +# def __str__(self): +# return f"Registration: {self.car_number} - Parking Space: {self.parking_space.number}" + +# def save(self, *args, **kwargs): +# if not self.pk: # Якщо це нова реєстрація +# # Збережемо id тарифу для цієї реєстрації на момент заїзду +# self.tariff_id = self.get_current_tariff_id() +# super(Registration, self).save(*args, **kwargs) + +# def get_current_tariff_id(self): +# # Отримаємо всі тарифи, які були активні на момент заїзду +# tariff = Tariff.objects.filter(start_date__lte=self.entry_datetime, end_date__gte=self.entry_datetime).first() +# return tariff.id if tariff else None From ac0ed8645cb42381de35979a949f7390f852181b Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:58:19 +0300 Subject: [PATCH 08/15] reg --- FRONTEND/fastparking/fastparking/settings.py | 4 +- FRONTEND/fastparking/parking/views.py | 71 -------------------- 2 files changed, 1 insertion(+), 74 deletions(-) diff --git a/FRONTEND/fastparking/fastparking/settings.py b/FRONTEND/fastparking/fastparking/settings.py index db5ac440..39a7e32e 100644 --- a/FRONTEND/fastparking/fastparking/settings.py +++ b/FRONTEND/fastparking/fastparking/settings.py @@ -79,10 +79,8 @@ ] AUTH_USER_MODEL = "users.CustomUser" -<<<<<<< HEAD PARKING_SPACES_COUNT = 100 -======= ->>>>>>> origin/dev + MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", diff --git a/FRONTEND/fastparking/parking/views.py b/FRONTEND/fastparking/parking/views.py index 05662b25..18402404 100644 --- a/FRONTEND/fastparking/parking/views.py +++ b/FRONTEND/fastparking/parking/views.py @@ -22,86 +22,15 @@ def main(request): }, ) -<<<<<<< HEAD -======= -from parking.models import Registration -# from .models import Sessions - ->>>>>>> origin/dev def generate_report(request): user = request.user entry_datetime = request.GET.get('start_date') exit_datetime = request.GET.get('end_date') car = car -<<<<<<< HEAD -======= - # entries = Sessions.objects.all()[:10] ->>>>>>> origin/dev 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}) -<<<<<<< HEAD -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}) -======= ->>>>>>> origin/dev From 2690e1bd90b28c89968e13998ce00a2c08edb3bd Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 21:59:07 +0300 Subject: [PATCH 09/15] reg --- FRONTEND/fastparking/parking/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FRONTEND/fastparking/parking/urls.py b/FRONTEND/fastparking/parking/urls.py index 075b8722..89e603f6 100644 --- a/FRONTEND/fastparking/parking/urls.py +++ b/FRONTEND/fastparking/parking/urls.py @@ -7,5 +7,5 @@ path('', views.main, name='main'), path('parking_plan/', views.parking_plan_view, name='parking_plan'), path('registration/', views.registration_list, name='registration_list'), - path('registration_table/', views.registration_table, name='registration_table'), + ] From 36212f20531691d58e079987ae8dd78134f0c9a7 Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 22:01:02 +0300 Subject: [PATCH 10/15] reg --- FRONTEND/fastparking/parking/repository1.py | 62 --------------------- 1 file changed, 62 deletions(-) delete mode 100644 FRONTEND/fastparking/parking/repository1.py diff --git a/FRONTEND/fastparking/parking/repository1.py b/FRONTEND/fastparking/parking/repository1.py deleted file mode 100644 index 37c3fa56..00000000 --- a/FRONTEND/fastparking/parking/repository1.py +++ /dev/null @@ -1,62 +0,0 @@ -# from .models import Registration -from django.core.exceptions import ObjectDoesNotExist -from django.db.models import Q -# from finance.models import Tariff -from .services import compare_plates -from .models import Registration -from finance.models import Payment -from finance.models import Tariff -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 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.") \ No newline at end of file From a4bd0d2d198f84d13d798e77b3a45848c084bd27 Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 22:12:35 +0300 Subject: [PATCH 11/15] reg --- FRONTEND/fastparking/parking/models.py | 35 -------------------------- 1 file changed, 35 deletions(-) diff --git a/FRONTEND/fastparking/parking/models.py b/FRONTEND/fastparking/parking/models.py index 7cffdf5d..237eee78 100644 --- a/FRONTEND/fastparking/parking/models.py +++ b/FRONTEND/fastparking/parking/models.py @@ -54,38 +54,3 @@ def __str__(self): # invoice_predict = finance_repo.calculate_current_invoice(self.id) e_date = self.entry_datetime.strftime("%Y-%m-%d %H:%M") return f"Registration ID: {self.id:06} - Parking Number: {self.parking.number} - Entry: {e_date} - Invoice*: {invoice_predict}" - -# from django.contrib.auth.models import User - -# from django.db import models -# # from finance.models import Tariff - -# class ParkingSpace(models.Model): -# number = models.CharField(max_length=10, unique=True) -# status = models.BooleanField(default=False) # False - вільно, True - зайнято -# reserved = models.BooleanField(default=False) # Додайте поле для вказання, чи є місце зарезервованим - -# def __str__(self): -# return self.number -# class Registration(models.Model): -# parking_space = models.ForeignKey(ParkingSpace, on_delete=models.CASCADE) -# car_number = models.CharField(max_length=16) -# entry_datetime = models.DateTimeField(auto_now_add=True) -# exit_datetime = models.DateTimeField(null=True, blank=True) -# invoice = models.CharField(max_length=255, null=True, blank=True) -# payments = models.BooleanField(default=False) -# tariff_id = models.IntegerField(null=True) # Додамо поле для зберігання id тарифу - -# def __str__(self): -# return f"Registration: {self.car_number} - Parking Space: {self.parking_space.number}" - -# def save(self, *args, **kwargs): -# if not self.pk: # Якщо це нова реєстрація -# # Збережемо id тарифу для цієї реєстрації на момент заїзду -# self.tariff_id = self.get_current_tariff_id() -# super(Registration, self).save(*args, **kwargs) - -# def get_current_tariff_id(self): -# # Отримаємо всі тарифи, які були активні на момент заїзду -# tariff = Tariff.objects.filter(start_date__lte=self.entry_datetime, end_date__gte=self.entry_datetime).first() -# return tariff.id if tariff else None From f0d86a03f9a4752e83ed5e8b71c0dacc510442ef Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 22:13:59 +0300 Subject: [PATCH 12/15] reg --- FRONTEND/fastparking/parking/repository.py | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 FRONTEND/fastparking/parking/repository.py diff --git a/FRONTEND/fastparking/parking/repository.py b/FRONTEND/fastparking/parking/repository.py new file mode 100644 index 00000000..94e1bd34 --- /dev/null +++ b/FRONTEND/fastparking/parking/repository.py @@ -0,0 +1,33 @@ +# from .models import Registration +from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Q + +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 543330fa8c926fb500953fa549df3358417cf0f0 Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 22:16:04 +0300 Subject: [PATCH 13/15] url --- FRONTEND/fastparking/parking/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/FRONTEND/fastparking/parking/urls.py b/FRONTEND/fastparking/parking/urls.py index 89e603f6..4b36733e 100644 --- a/FRONTEND/fastparking/parking/urls.py +++ b/FRONTEND/fastparking/parking/urls.py @@ -9,3 +9,4 @@ path('registration/', views.registration_list, name='registration_list'), ] + From 57f1975f1c86ed551636e79ecb5cf79c247d12ce Mon Sep 17 00:00:00 2001 From: Rostyslav Bysko <132708200+RostislavB74@users.noreply.github.com> Date: Mon, 15 Apr 2024 22:21:56 +0300 Subject: [PATCH 14/15] Update urls.py --- FRONTEND/fastparking/parking/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FRONTEND/fastparking/parking/urls.py b/FRONTEND/fastparking/parking/urls.py index 163dd888..4b36733e 100644 --- a/FRONTEND/fastparking/parking/urls.py +++ b/FRONTEND/fastparking/parking/urls.py @@ -4,7 +4,7 @@ app_name = 'parking' urlpatterns = [ - path('', views.main, name='main') + path('', views.main, name='main'), path('parking_plan/', views.parking_plan_view, name='parking_plan'), path('registration/', views.registration_list, name='registration_list'), From 251864e47d0cbf9eb57a3ba9728d835405d14d8f Mon Sep 17 00:00:00 2001 From: RostislavB74 Date: Mon, 15 Apr 2024 22:27:15 +0300 Subject: [PATCH 15/15] view --- FRONTEND/fastparking/parking/views.py | 58 +++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/FRONTEND/fastparking/parking/views.py b/FRONTEND/fastparking/parking/views.py index 18402404..fed4e076 100644 --- a/FRONTEND/fastparking/parking/views.py +++ b/FRONTEND/fastparking/parking/views.py @@ -34,3 +34,61 @@ def generate_report(request): 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})