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

SOL #839

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open

SOL #839

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ venv/
.venv/
.pytest_cache/
**__pycache__/
db.sqlite3

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is an extra space before db.sqlite3. This might prevent Git from correctly ignoring the file. Please remove the space to ensure it is properly ignored.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is an extra space after db.sqlite3. This might cause the file not to be ignored as intended. Consider removing the space to ensure it is correctly ignored.

2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
django==4.1
django~=5.1.2
flake8==5.0.4
flake8-quotes==3.3.1
flake8-variables-names==0.0.5
Expand Down
171 changes: 143 additions & 28 deletions taxi/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,51 +13,166 @@ class Migration(migrations.Migration):
initial = True

dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
("auth", "0012_alter_user_first_name_max_length"),
]

operations = [
migrations.CreateModel(
name='Driver',
name="Driver",
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('license_number', models.CharField(max_length=255)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("password", models.CharField(max_length=128, verbose_name="password")),
(
"last_login",
models.DateTimeField(
blank=True, null=True, verbose_name="last login"
),
),
(
"is_superuser",
models.BooleanField(
default=False,
help_text="Designates that this user has all permissions without explicitly assigning them.",
verbose_name="superuser status",
),
),
(
"username",
models.CharField(
error_messages={
"unique": "A user with that username already exists."
},
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
max_length=150,
unique=True,
validators=[
django.contrib.auth.validators.UnicodeUsernameValidator()
],
verbose_name="username",
),
),
(
"first_name",
models.CharField(
blank=True, max_length=150, verbose_name="first name"
),
),
(
"last_name",
models.CharField(
blank=True, max_length=150, verbose_name="last name"
),
),
(
"email",
models.EmailField(
blank=True, max_length=254, verbose_name="email address"
),
),
(
"is_staff",
models.BooleanField(
default=False,
help_text="Designates whether the user can log into this admin site.",
verbose_name="staff status",
),
),
(
"is_active",
models.BooleanField(
default=True,
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting registration.",
verbose_name="active",
),
),
(
"date_joined",
models.DateTimeField(
default=django.utils.timezone.now, verbose_name="date joined"
),
),
("license_number", models.CharField(max_length=255)),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The license_number field is defined as a CharField with a max_length of 255. Depending on the format and requirements for license numbers, you might want to consider a more specific length or add validation to ensure the field meets expected standards.

(
"groups",
models.ManyToManyField(
blank=True,
help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
related_name="user_set",
related_query_name="user",
to="auth.Group",
verbose_name="groups",
),
),
(
"user_permissions",
models.ManyToManyField(
blank=True,
help_text="Specific permissions for this user.",
related_name="user_set",
related_query_name="user",
to="auth.Permission",
verbose_name="user permissions",
),
Comment on lines +115 to +123

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The related_name for the user_permissions field is set to user_set, which is the same as the related_name for the groups field. This might cause a conflict if both fields are accessed in the same context. Consider using a different related_name for one of these fields to avoid potential conflicts.

),
],
options={
'verbose_name': 'driver',
'verbose_name_plural': 'drivers',
"verbose_name": "driver",
"verbose_name_plural": "drivers",
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
("objects", django.contrib.auth.models.UserManager()),
],
),
migrations.CreateModel(
name='Manufacturer',
name="Manufacturer",
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('country', models.CharField(max_length=255)),
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("country", models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name='Car',
name="Car",
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('model', models.CharField(max_length=255)),
('drivers', models.ManyToManyField(related_name='cars', to=settings.AUTH_USER_MODEL)),
('manufacturer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='taxi.manufacturer')),
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("model", models.CharField(max_length=255)),
(
"drivers",
models.ManyToManyField(
related_name="cars", to=settings.AUTH_USER_MODEL
),
),
(
"manufacturer",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="taxi.manufacturer",
),
),
],
),
]
10 changes: 5 additions & 5 deletions taxi/migrations/0002_alter_manufacturer_options_and_more.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@
class Migration(migrations.Migration):

dependencies = [
('taxi', '0001_initial'),
("taxi", "0001_initial"),
]

operations = [
migrations.AlterModelOptions(
name='manufacturer',
options={'ordering': ['name']},
name="manufacturer",
options={"ordering": ["name"]},
),
migrations.AlterField(
model_name='driver',
name='license_number',
model_name="driver",
name="license_number",
field=models.CharField(max_length=255, unique=True),
),
]
6 changes: 3 additions & 3 deletions taxi/migrations/0003_alter_manufacturer_name.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
class Migration(migrations.Migration):

dependencies = [
('taxi', '0002_alter_manufacturer_options_and_more'),
("taxi", "0002_alter_manufacturer_options_and_more"),
]

operations = [
migrations.AlterField(
model_name='manufacturer',
name='name',
model_name="manufacturer",
name="name",
field=models.CharField(max_length=255, unique=True),
),
]
22 changes: 22 additions & 0 deletions taxi/migrations/0004_alter_driver_is_active.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.1.2 on 2024-10-28 22:22

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("taxi", "0003_alter_manufacturer_name"),
]

operations = [
migrations.AlterField(
model_name="driver",
name="is_active",
field=models.BooleanField(
default=True,
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
verbose_name="active",
),
),
]
4 changes: 3 additions & 1 deletion taxi/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
path("cars/<int:pk>/", CarDetailView.as_view(), name="car-detail"),
path("drivers/", DriverListView.as_view(), name="driver-list"),
path(
"drivers/<int:pk>/", DriverDetailView.as_view(), name="driver-detail"
"drivers/<int:pk>/",
DriverDetailView.as_view(),
name="driver-detail"
),
]

Expand Down
12 changes: 9 additions & 3 deletions taxi/views.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,39 @@
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render
from django.views import generic

from .models import Driver, Car, Manufacturer


@login_required
def index(request):
"""View function for the home page of the site."""

num_drivers = Driver.objects.count()
num_cars = Car.objects.count()
num_manufacturers = Manufacturer.objects.count()
num_visits = request.session.get("num_visits", 0)
request.session["num_visits"] = num_visits + 1

context = {
"num_drivers": num_drivers,
"num_cars": num_cars,
"num_manufacturers": num_manufacturers,
"num_visits": num_visits + 1
}

return render(request, "taxi/index.html", context=context)


class ManufacturerListView(generic.ListView):
class ManufacturerListView(LoginRequiredMixin, generic.ListView):
model = Manufacturer
context_object_name = "manufacturer_list"
template_name = "taxi/manufacturer_list.html"
paginate_by = 5


class CarListView(generic.ListView):
class CarListView(LoginRequiredMixin, generic.ListView):
model = Car
paginate_by = 5
queryset = Car.objects.select_related("manufacturer")
Expand All @@ -37,7 +43,7 @@ class CarDetailView(generic.DetailView):
model = Car


class DriverListView(generic.ListView):
class DriverListView(LoginRequiredMixin, generic.ListView):
model = Driver
paginate_by = 5

Expand Down
19 changes: 13 additions & 6 deletions taxi_service/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = (
"django-insecure-8ovil3xu6=eaoqd#-#&ricv159p0pypoh5_lgm*)-dfcjqe=yc"
)
SECRET_KEY = ("django-insecure-8ovil3xu6="
"eaoqd#-#&ricv159p0pypoh5_lgm*)-dfcjqe=yc")
Comment on lines +23 to +24

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SECRET_KEY is hardcoded and visible in the settings file. This is a security risk, especially if the code is shared publicly. Consider using environment variables to manage sensitive information like the secret key.

Comment on lines +23 to +24

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SECRET_KEY is exposed in the settings file. It's crucial to keep this key secret, especially in production environments. Consider using environment variables to manage sensitive information.


# SECURITY WARNING: don"t run with debug turned on in production!
DEBUG = True

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The DEBUG mode is set to True. This should be turned off in a production environment to prevent the exposure of sensitive information.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The DEBUG setting is set to True. This should be set to False in production to avoid exposing sensitive information.

Expand Down Expand Up @@ -94,20 +93,24 @@
},
{
"NAME": "django.contrib.auth.password_validation."
"MinimumLengthValidator",
"MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation."
"CommonPasswordValidator",
"CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation."
"NumericPasswordValidator",
"NumericPasswordValidator",
},
]

AUTH_USER_MODEL = "taxi.Driver"

LOGIN_REDIRECT_URL = "taxi:index"

# LOGOUT_REDIRECT_URL = "/registration/lo"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The LOGOUT_REDIRECT_URL is commented out and seems incomplete. If you intend to use it, ensure the URL is correctly specified and uncomment the line.


# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/

Expand All @@ -133,3 +136,7 @@
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

INTERNAL_IPS = [
"127.0.0.1",
]
8 changes: 6 additions & 2 deletions taxi_service/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,17 @@
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path("blog/", include("blog.urls"))
"""

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
urlpatterns = ([
path("admin/", admin.site.urls),
path("", include("taxi.urls", namespace="taxi")),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
path("accounts/", include("django.contrib.auth.urls")),
] + static(
settings.STATIC_URL, document_root=settings.STATIC_ROOT
))
Loading
Loading