diff --git a/pairent_backend/pairent_app/admin.py b/pairent_backend/pairent_app/admin.py index 8c38f3f..e75d8f6 100644 --- a/pairent_backend/pairent_app/admin.py +++ b/pairent_backend/pairent_app/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin +from .models import Apartament, Photo -# Register your models here. +admin.site.register(Apartament) +admin.site.register(Photo) diff --git a/pairent_backend/pairent_app/migrations/0001_initial.py b/pairent_backend/pairent_app/migrations/0001_initial.py new file mode 100644 index 0000000..dadf022 --- /dev/null +++ b/pairent_backend/pairent_app/migrations/0001_initial.py @@ -0,0 +1,51 @@ +# Generated by Django 4.1.7 on 2023-04-12 10:33 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Apartament', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('price', models.IntegerField(help_text='Стоимость аренды квартиры за месяц', validators=[django.core.validators.MaxValueValidator(450000)])), + ('bail', models.IntegerField(help_text='Стоимость залога квартиры', validators=[django.core.validators.MaxValueValidator(450000)])), + ('agencyСommission', models.IntegerField(validators=[django.core.validators.MaxValueValidator(450000)], verbose_name='Коммисия агенству')), + ('utilitiesPrice', models.CharField(help_text='Стоимость коммунальных услуг', max_length=100)), + ('minimumLeasePeriod', models.IntegerField(help_text='Минимальный срок аренды в месяцах', validators=[django.core.validators.MaxValueValidator(60)])), + ('address', models.CharField(help_text='Адрес квартиры', max_length=100)), + ('description', models.TextField(help_text='Описание квартиры', max_length=300)), + ('perimetrs', models.FloatField(help_text='Количество квадратных метров', validators=[django.core.validators.MaxValueValidator(250)])), + ('rooms', models.IntegerField(help_text='Количество комнат', validators=[django.core.validators.MaxValueValidator(10)])), + ('ceilingHeight', models.FloatField(help_text='Высота потолков в метрах', validators=[django.core.validators.MaxValueValidator(5)])), + ('floor', models.IntegerField(help_text='Этаж квартиры', validators=[django.core.validators.MaxValueValidator(50)])), + ('floorHouse', models.IntegerField(help_text='Количество этажей в доме', validators=[django.core.validators.MaxValueValidator(50)])), + ('phoneNumber', models.CharField(help_text='Номер телефона для связи', max_length=16, unique=True, validators=[django.core.validators.RegexValidator(regex='^\\+?1?\\d{8,15}$')])), + ('timeToBus', models.IntegerField(help_text='Время до ближайшей автобусной остановки в минутах', validators=[django.core.validators.MaxValueValidator(60)])), + ('timeToTrain', models.IntegerField(help_text='Время до ближайшей Ж/Д станции в минутах', validators=[django.core.validators.MaxValueValidator(60)])), + ('isFurniture', models.BooleanField(help_text='Имеется мебель в квартире')), + ('isAnimal', models.BooleanField(help_text='Можно с питомцем')), + ('isTelevision', models.BooleanField(help_text='Имеется телевизор в квартире')), + ('isСhild', models.BooleanField(help_text='Можно с детьми')), + ('isInternet', models.BooleanField(help_text='Проведен интернет в квартире')), + ('isBathroom', models.BooleanField(help_text='Имеется санузел в квартире')), + ('isRefrigerator', models.BooleanField(help_text='Имеется холодильник в квартире')), + ('isWasher', models.BooleanField(help_text='Имеется стиральная машинка в квартире')), + ('isAirConditioning', models.BooleanField(help_text='Имеется кондиционер в квартире')), + ('isFreshRepair', models.BooleanField(help_text='Недавно был ремонт в квартире')), + ('isElevator', models.BooleanField(help_text='Имеется лифт в доме')), + ('isParking', models.BooleanField(help_text='Имеется закрытая парковка у дома')), + ('isGarbageChute', models.BooleanField(help_text='Имеется мусоропровод в доме')), + ('isConcierge', models.BooleanField(help_text='Имеется консьерж в доме')), + ('dateCreate', models.DateField(auto_now_add=True, help_text='Дата добавления квартиры')), + ], + ), + ] diff --git a/pairent_backend/pairent_app/migrations/0002_ipaddresses_alter_apartament_options_and_more.py b/pairent_backend/pairent_app/migrations/0002_ipaddresses_alter_apartament_options_and_more.py new file mode 100644 index 0000000..1ab5664 --- /dev/null +++ b/pairent_backend/pairent_app/migrations/0002_ipaddresses_alter_apartament_options_and_more.py @@ -0,0 +1,192 @@ +# Generated by Django 4.1.7 on 2023-04-17 12:43 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('pairent_app', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='IPAddresses', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ipAddress', models.CharField(max_length=15, validators=[django.core.validators.RegexValidator(regex='^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$')], verbose_name='IP адрес')), + ], + options={ + 'verbose_name': 'IP адрес', + 'verbose_name_plural': 'IP адреса', + }, + ), + migrations.AlterModelOptions( + name='apartament', + options={'ordering': ['-dateCreate'], 'verbose_name': 'Квартира', 'verbose_name_plural': 'Квартиры'}, + ), + migrations.AlterField( + model_name='apartament', + name='address', + field=models.CharField(max_length=100, verbose_name='Адрес квартиры'), + ), + migrations.AlterField( + model_name='apartament', + name='bail', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(450000)], verbose_name='Стоимость залога квартиры'), + ), + migrations.AlterField( + model_name='apartament', + name='ceilingHeight', + field=models.FloatField(validators=[django.core.validators.MaxValueValidator(5)], verbose_name='Высота потолков в метрах'), + ), + migrations.AlterField( + model_name='apartament', + name='dateCreate', + field=models.DateField(auto_now_add=True, verbose_name='Дата добавления квартиры'), + ), + migrations.AlterField( + model_name='apartament', + name='description', + field=models.TextField(max_length=300, verbose_name='Описание квартиры'), + ), + migrations.AlterField( + model_name='apartament', + name='floor', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(50)], verbose_name='Этаж квартиры'), + ), + migrations.AlterField( + model_name='apartament', + name='floorHouse', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(50)], verbose_name='Количество этажей в доме'), + ), + migrations.AlterField( + model_name='apartament', + name='isAirConditioning', + field=models.BooleanField(verbose_name='Имеется кондиционер в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isAnimal', + field=models.BooleanField(verbose_name='Можно с питомцем'), + ), + migrations.AlterField( + model_name='apartament', + name='isBathroom', + field=models.BooleanField(verbose_name='Имеется санузел в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isConcierge', + field=models.BooleanField(verbose_name='Имеется консьерж в доме'), + ), + migrations.AlterField( + model_name='apartament', + name='isElevator', + field=models.BooleanField(verbose_name='Имеется лифт в доме'), + ), + migrations.AlterField( + model_name='apartament', + name='isFreshRepair', + field=models.BooleanField(verbose_name='Недавно был ремонт в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isFurniture', + field=models.BooleanField(verbose_name='Имеется мебель в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isGarbageChute', + field=models.BooleanField(verbose_name='Имеется мусоропровод в доме'), + ), + migrations.AlterField( + model_name='apartament', + name='isInternet', + field=models.BooleanField(verbose_name='Проведен интернет в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isParking', + field=models.BooleanField(verbose_name='Имеется закрытая парковка у дома'), + ), + migrations.AlterField( + model_name='apartament', + name='isRefrigerator', + field=models.BooleanField(verbose_name='Имеется холодильник в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isTelevision', + field=models.BooleanField(verbose_name='Имеется телевизор в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isWasher', + field=models.BooleanField(verbose_name='Имеется стиральная машинка в квартире'), + ), + migrations.AlterField( + model_name='apartament', + name='isСhild', + field=models.BooleanField(verbose_name='Можно с детьми'), + ), + migrations.AlterField( + model_name='apartament', + name='minimumLeasePeriod', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(60)], verbose_name='Минимальный срок аренды в месяцах'), + ), + migrations.AlterField( + model_name='apartament', + name='perimetrs', + field=models.FloatField(validators=[django.core.validators.MaxValueValidator(250)], verbose_name='Количество квадратных метров'), + ), + migrations.AlterField( + model_name='apartament', + name='phoneNumber', + field=models.CharField(max_length=16, unique=True, validators=[django.core.validators.RegexValidator(regex='^\\+?1?\\d{8,15}$')], verbose_name='Номер телефона для связи'), + ), + migrations.AlterField( + model_name='apartament', + name='price', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(450000)], verbose_name='Стоимость аренды квартиры за месяц'), + ), + migrations.AlterField( + model_name='apartament', + name='rooms', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(10)], verbose_name='Количество комнат'), + ), + migrations.AlterField( + model_name='apartament', + name='timeToBus', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(60)], verbose_name='Время до ближайшей автобусной остановки в минутах'), + ), + migrations.AlterField( + model_name='apartament', + name='timeToTrain', + field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(60)], verbose_name='Время до ближайшей Ж/Д станции в минутах'), + ), + migrations.AlterField( + model_name='apartament', + name='utilitiesPrice', + field=models.CharField(max_length=100, verbose_name='Стоимость коммунальных услуг'), + ), + migrations.CreateModel( + name='Photo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(upload_to='photos/%Y/%m/%d')), + ('apartament', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pairent_app.apartament', verbose_name='Квартира')), + ], + options={ + 'verbose_name': 'Фотография', + 'verbose_name_plural': 'Фотографии', + }, + ), + migrations.AddField( + model_name='apartament', + name='views', + field=models.ManyToManyField(blank=True, related_name='post_views', to='pairent_app.ipaddresses'), + ), + ] diff --git a/pairent_backend/pairent_app/migrations/0003_alter_photo_image.py b/pairent_backend/pairent_app/migrations/0003_alter_photo_image.py new file mode 100644 index 0000000..93aaddd --- /dev/null +++ b/pairent_backend/pairent_app/migrations/0003_alter_photo_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.7 on 2023-04-17 12:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pairent_app', '0002_ipaddresses_alter_apartament_options_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='photo', + name='image', + field=models.ImageField(upload_to='photos/%Y/%m/%d', verbose_name='Фотография'), + ), + ] diff --git a/pairent_backend/pairent_app/models.py b/pairent_backend/pairent_app/models.py index bdbc48e..6191d77 100644 --- a/pairent_backend/pairent_app/models.py +++ b/pairent_backend/pairent_app/models.py @@ -1,55 +1,79 @@ -import uuid from django.db import models -from django.core.validators import RegexValidator +from django.core.validators import RegexValidator, MaxValueValidator + + +class IPAddresses(models.Model): + """Модель данных для хранения IP адрессов (нужно для подсчета количества просмотров)""" + ipAddressRegex = RegexValidator(regex = r"^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$") + ipAddress = models.CharField(validators=[ipAddressRegex], max_length=15, verbose_name="IP адрес") + + def __str__(self): + return self.ipAddress + + class Meta: + verbose_name = "IP адрес" + verbose_name_plural = "IP адреса" class Apartament(models.Model): """Модель данных квартиры""" + price = models.IntegerField(validators=[MaxValueValidator(450000)], verbose_name="Стоимость аренды квартиры за месяц") + bail = models.IntegerField(validators=[MaxValueValidator(450000)], verbose_name="Стоимость залога квартиры") + agencyСommission = models.IntegerField(validators=[MaxValueValidator(450000)], verbose_name="Коммисия агенству") + utilitiesPrice = models.CharField(max_length=100, verbose_name="Стоимость коммунальных услуг") + minimumLeasePeriod = models.IntegerField(validators=[MaxValueValidator(60)], verbose_name="Минимальный срок аренды в месяцах") - id = models.UUIDField(primary_key=True, default=uuid.uuid4, edtitable=False, help_text="Уникальный индетификатор квартиры") + address = models.CharField(max_length=100, verbose_name="Адрес квартиры") + description = models.TextField(max_length=300, verbose_name="Описание квартиры") - # TODO: Нужно реализовать фотографии. Как вариант, сделать как в этой статье (https://habr.com/ru/articles/505946/) - - price = models.IntegerField(max_value=450000, help_text="Стоимость аренды квартиры за месяц") - bail = models.IntegerField(max_value=450000, help_text="Стоимость залога квартиры") - agencyСommission = models.IntegerField(max_value=450000, verbose_name="Коммисия агенству") - utilitiesPrice = models.CharField(max_length=100, help_text="Стоимость коммунальных услуг") - minimumLeasePeriod = models.IntegerField(max_value=60, help_text="Минимальный срок аренды в месяцах") - - address = models.CharField(max_length=100, help_text="Адрес квартиры") - description = models.TextField(max_length=300, help_text="Описание квартиры") - - perimetrs = models.FloatField(max_value=250, help_text="Количество квадратных метров") - rooms = models.IntegerField(max_value=10, help_text="Количество комнат") - ceilingHeight = models.FloatField(max_value=5, help_text="Высота потолков в метрах") - floor = models.IntegerField(max_value=50, help_text="Этаж квартиры") - floorHouse = models.IntegerField(max_value=50, help_text="Количество этажей в доме") + perimetrs = models.FloatField(validators=[MaxValueValidator(250)], verbose_name="Количество квадратных метров") + rooms = models.IntegerField(validators=[MaxValueValidator(10)], verbose_name="Количество комнат") + ceilingHeight = models.FloatField(validators=[MaxValueValidator(5)], verbose_name="Высота потолков в метрах") + floor = models.IntegerField(validators=[MaxValueValidator(50)], verbose_name="Этаж квартиры") + floorHouse = models.IntegerField(validators=[MaxValueValidator(50)], verbose_name="Количество этажей в доме") phoneNumberRegex = RegexValidator(regex = r"^\+?1?\d{8,15}$") - phoneNumber = models.CharField(validators=[phoneNumberRegex], max_length=16, unique=True, help_text="Номер телефона для связи") + phoneNumber = models.CharField(validators=[phoneNumberRegex], max_length=16, unique=True, verbose_name="Номер телефона для связи") - timeToBus = models.IntegerField(max_value=60, help_text="Время до ближайшей автобусной остановки в минутах") - timeToTrain = models.IntegerField(max_value=60, help_text="Время до ближайшей Ж/Д станции в минутах") + timeToBus = models.IntegerField(validators=[MaxValueValidator(60)], verbose_name="Время до ближайшей автобусной остановки в минутах") + timeToTrain = models.IntegerField(validators=[MaxValueValidator(60)], verbose_name="Время до ближайшей Ж/Д станции в минутах") """Параметры квартиры""" - isFurniture = models.BooleanField(help_text="Имеется мебель в квартире") - isAnimal = models.BooleanField(help_text="Можно с питомцем") - isTelevision = models.BooleanField(help_text="Имеется телевизор в квартире") - isСhild = models.BooleanField(help_text="Можно с детьми") - isInternet = models.BooleanField(help_text="Проведен интернет в квартире") - isBathroom = models.BooleanField(help_text="Имеется санузел в квартире") - isRefrigerator = models.BooleanField(help_text="Имеется холодильник в квартире") - isWasher = models.BooleanField(help_text="Имеется стиральная машинка в квартире") - isAirConditioning = models.BooleanField(help_text="Имеется кондиционер в квартире") - isFreshRepair = models.BooleanField(help_text="Недавно был ремонт в квартире") + isFurniture = models.BooleanField(verbose_name="Имеется мебель в квартире") + isAnimal = models.BooleanField(verbose_name="Можно с питомцем") + isTelevision = models.BooleanField(verbose_name="Имеется телевизор в квартире") + isСhild = models.BooleanField(verbose_name="Можно с детьми") + isInternet = models.BooleanField(verbose_name="Проведен интернет в квартире") + isBathroom = models.BooleanField(verbose_name="Имеется санузел в квартире") + isRefrigerator = models.BooleanField(verbose_name="Имеется холодильник в квартире") + isWasher = models.BooleanField(verbose_name="Имеется стиральная машинка в квартире") + isAirConditioning = models.BooleanField(verbose_name="Имеется кондиционер в квартире") + isFreshRepair = models.BooleanField(verbose_name="Недавно был ремонт в квартире") """Параметры дома""" - isElevator = models.BooleanField(help_text="Имеется лифт в доме") - isParking = models.BooleanField(help_text="Имеется закрытая парковка у дома") - isGarbageChute = models.BooleanField(help_text="Имеется мусоропровод в доме") - isConcierge = models.BooleanField(help_text="Имеется консьерж в доме") + isElevator = models.BooleanField(verbose_name="Имеется лифт в доме") + isParking = models.BooleanField(verbose_name="Имеется закрытая парковка у дома") + isGarbageChute = models.BooleanField(verbose_name="Имеется мусоропровод в доме") + isConcierge = models.BooleanField(verbose_name="Имеется консьерж в доме") - # TODO: Нужно реализовать количество просмотров. Как вариант, сделать через IP (https://ru.stackoverflow.com/q/1233137) + views = models.ManyToManyField(IPAddresses, related_name="post_views", blank=True) - dateCreate = models.DateField(auto_now_add=True, editable=False, help_text="Дата добавления квартиры") + dateCreate = models.DateField(auto_now_add=True, editable=False, verbose_name="Дата добавления квартиры") + def total_views(self): + return self.views.count() + + class Meta: + verbose_name = "Квартира" + verbose_name_plural = "Квартиры" + ordering = ['-dateCreate'] + + +class Photo(models.Model): + """Модель данных фотографий квартир""" + apartament = models.ForeignKey(Apartament, on_delete = models.CASCADE, verbose_name="Квартира") + image = models.ImageField(upload_to='photos/%Y/%m/%d', verbose_name="Фотография") + + class Meta: + verbose_name = "Фотография" + verbose_name_plural = "Фотографии" \ No newline at end of file diff --git a/pairent_backend/requirments.txt b/pairent_backend/requirments.txt index 948326a..dbe7e1c 100644 --- a/pairent_backend/requirments.txt +++ b/pairent_backend/requirments.txt @@ -1,3 +1,2 @@ django -mysqlclient -Pillow \ No newline at end of file +mysqlclient \ No newline at end of file