-
Notifications
You must be signed in to change notification settings - Fork 720
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
Solution #728
base: master
Are you sure you want to change the base?
Solution #728
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! But don't use black to all project or change your line separator
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for your hard work on this project! While your code generally meets the task requirements, there are a few critical issues that need to be addressed before we can approve the pull request:
-
Security Concerns: The
DEBUG
setting is set toTrue
, and theSECRET_KEY
is hardcoded in thesettings.py
file. These are significant security risks, especially in a production environment. Please ensureDEBUG
is set toFalse
and consider loading theSECRET_KEY
from an environment variable. -
Model and Serializer Issues: In the
Ticket
model'sclean
method, incorrect attribute names (count_rows
andcount_seats_in_row
) are used. They should berows
andseats_in_row
. Additionally, theActorSerializer
should explicitly include thefull_name
property using aSerializerMethodField
. -
GitHub Actions Configuration: The
timeout-minutes
key is incorrectly placed within a step in thetest.yml
file. It should be moved to the job level to apply to the entire job. -
URL Handling in Tests: Consider using Django's
reverse
function to generate URLs in your tests. This will enhance maintainability and reduce errors if URL patterns change.
Please address these issues to ensure the security and functionality of your application. Once these changes are made, we can proceed with the approval. Keep up the great work! 😊
✨ Please rate this review in the Platform's notification center. I will be grateful for your feedback! ✨
🔄 Fix the issues, commit the changes, and then re-request my review using the Re-request review
button in the Reviewers tab.
- name: Run tests | ||
timeout-minutes: 5 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The timeout-minutes
key is placed under the 'Run tests' step. However, according to GitHub Actions documentation, the timeout-minutes
key should be placed at the job level, not within individual steps. Consider moving this key to the job level if you want to set a timeout for the entire job.
for ticket_attr_value, ticket_attr_name, cinema_hall_attr_name in [ | ||
(self.row, "row", "count_rows"), | ||
(self.seat, "seat", "count_seats_in_row"), | ||
]: | ||
count_attrs = getattr( | ||
self.movie_session.cinema_hall, cinema_hall_attr_name | ||
) | ||
if not (1 <= ticket_attr_value <= count_attrs): | ||
raise ValidationError( | ||
{ | ||
ticket_attr_name: f"{ticket_attr_name} number " | ||
f"must be in available range: " | ||
f"(1, {cinema_hall_attr_name}): " | ||
f"(1, {count_attrs})" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the clean
method of the Ticket
model, there seems to be a mistake in the attribute names used for validation. The attributes count_rows
and count_seats_in_row
do not exist in the CinemaHall
model. You should use rows
and seats_in_row
instead, as these are the correct attribute names defined in the CinemaHall
model.
class ActorSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = Actor | ||
fields = ["id", "first_name", "last_name", "full_name"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ActorSerializer
includes the full_name
field, which is a property method in the Actor
model. To include this property in the serializer, you need to define it explicitly as a SerializerMethodField
or similar, as ModelSerializer
does not automatically include properties.
Actor.objects.create(first_name="Keanu", last_name="Reeves") | ||
|
||
def test_get_actors(self): | ||
response = self.client.get("/api/cinema/actors/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for the API endpoints. This approach makes the tests more maintainable and less prone to errors if the URL patterns change in the future.
self.assertEqual(db_actors.filter(first_name="Scarlett").count(), 1) | ||
|
||
def test_get_invalid_actor(self): | ||
response = self.client.get("/api/cinema/actors/1001/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for the API endpoints. This approach makes the tests more maintainable and less prone to errors if the URL patterns change in the future.
) | ||
|
||
def test_get_movie_sessions(self): | ||
movie_sessions = self.client.get("/api/cinema/movie_sessions/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for the API endpoints. This approach makes the tests more maintainable and less prone to errors if the URL patterns change in the future.
|
||
def test_post_movie_session(self): | ||
movies = self.client.post( | ||
"/api/cinema/movie_sessions/", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for the API endpoints. This approach makes the tests more maintainable and less prone to errors if the URL patterns change in the future.
self.assertEqual(movie_sessions.count(), 2) | ||
|
||
def test_get_movie_session(self): | ||
response = self.client.get("/api/cinema/movie_sessions/1/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for the API endpoints. This approach makes the tests more maintainable and less prone to errors if the URL patterns change in the future.
SECRET_KEY = ( | ||
"django-insecure-6vubhk2$++agnctay_4pxy_8cq)mosmn(*-#2b^v4cgsh-^!i3" |
There was a problem hiding this comment.
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 exposed in the settings file. For security reasons, especially in production, it's recommended to load the secret key from an environment variable or a separate configuration file that is not included in version control.
) | ||
|
||
# SECURITY WARNING: don't run with debug turned on in production! | ||
DEBUG = True |
There was a problem hiding this comment.
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
. Remember to set DEBUG = False
in production to avoid exposing sensitive information.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hello! 😊 It looks like your code is almost there, but there are a few critical issues that need to be addressed before it can be approved:
-
Security Concerns: The
DEBUG
setting is set toTrue
, and theSECRET_KEY
is hardcoded in the settings file. These are critical security issues that need to be addressed, especially for production environments. Make sure to setDEBUG
toFalse
and load theSECRET_KEY
from a secure source. -
Model and Serializer Issues: In the
Ticket
model, theclean
method references non-existent attributescount_rows
andcount_seats_in_row
. These should be corrected torows
andseats_in_row
. Additionally, theActorSerializer
includesfull_name
in the fields list, which needs to be explicitly defined using aSerializerMethodField
or similar approach. -
Workflow Configuration: The GitHub Actions workflow is currently set to trigger only on pull requests to the 'master' branch. Ensure this aligns with your branching strategy. Also, the
timeout-minutes
parameter is specified redundantly for a step, which should be cleaned up. -
Test URL Robustness: Consider using Django's
reverse
function to generate URLs for API endpoints in your tests. This will make your tests more robust against changes in the URL patterns.
Once these issues are resolved, your code will be in great shape! Keep up the good work, and don't hesitate to reach out if you need any help. 🚀
✨ Please rate this review in the Platform's notification center. I will be grateful for your feedback! ✨
🔄 Fix the issues, commit the changes, and then re-request my review using the Re-request review
button in the Reviewers tab.
run: flake8 | ||
|
||
- name: Run tests | ||
timeout-minutes: 5 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The timeout-minutes
parameter is specified here for the 'Run tests' step. Since you already have a timeout-minutes
parameter set for the entire job on line 11, this might be redundant unless you intend to have a different timeout for this specific step. Consider removing it if it's unnecessary.
on: | ||
pull_request: | ||
branches: | ||
- "master" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The workflow is currently set to trigger only on pull requests to the 'master' branch. Ensure this aligns with your branching strategy. If you have other branches that require testing, consider adding them here.
for ticket_attr_value, ticket_attr_name, cinema_hall_attr_name in [ | ||
(self.row, "row", "count_rows"), | ||
(self.seat, "seat", "count_seats_in_row"), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The clean
method in the Ticket
model references count_rows
and count_seats_in_row
as attributes of CinemaHall
, but these attributes do not exist. They should be rows
and seats_in_row
respectively. Update the attribute names to match the actual field names in the CinemaHall
model.
class ActorSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = Actor | ||
fields = ["id", "first_name", "last_name", "full_name"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ActorSerializer
includes full_name
in the fields list. Since full_name
is a property and not a model field, you need to define it explicitly in the serializer using a SerializerMethodField
or similar approach to ensure it can be serialized properly.
Actor.objects.create(first_name="Keanu", last_name="Reeves") | ||
|
||
def test_get_actors(self): | ||
response = self.client.get("/api/cinema/actors/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for API endpoints. This approach makes your tests more robust against changes in the URL patterns.
) | ||
|
||
def test_get_movie_sessions(self): | ||
movie_sessions = self.client.get("/api/cinema/movie_sessions/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for API endpoints. This approach makes your tests more robust against changes in the URL patterns.
|
||
def test_post_movie_session(self): | ||
movies = self.client.post( | ||
"/api/cinema/movie_sessions/", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for API endpoints. This approach makes your tests more robust against changes in the URL patterns.
self.assertEqual(movie_sessions.count(), 2) | ||
|
||
def test_get_movie_session(self): | ||
response = self.client.get("/api/cinema/movie_sessions/1/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate URLs for API endpoints. This approach makes your tests more robust against changes in the URL patterns.
|
||
# SECURITY WARNING: keep the secret key used in production secret! | ||
SECRET_KEY = ( | ||
"django-insecure-6vubhk2$++agnctay_4pxy_8cq)mosmn(*-#2b^v4cgsh-^!i3" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The SECRET_KEY
is currently hardcoded and exposed in the settings file. For security reasons, especially in production, consider loading this value from an environment variable or a secure vault.
) | ||
|
||
# SECURITY WARNING: don't run with debug turned on in production! | ||
DEBUG = True |
There was a problem hiding this comment.
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
. Remember to set it to False
in production to avoid exposing sensitive information.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great job on implementing the cinema application! 🎉 While the code is mostly well-structured, there are a few critical issues to address. The DEBUG
setting should be set to False
in production, and the SECRET_KEY
should be securely managed. In the models.py
, correct the clean
method in the Ticket
model and the full_name
property in the Actor
model. Ensure the ActorSerializer
properly handles the full_name
field. Also, consider using Django's reverse
function in your tests for more robust URL handling. Lastly, review your GitHub Actions workflow to align with your branching strategy. Keep up the good work and continue improving your code! 🚀
✨ Please rate this review in the Platform's notification center. I will be grateful for your feedback! ✨
on: | ||
pull_request: | ||
branches: | ||
- "master" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The workflow is set to trigger only on pull requests to the 'master' branch. Ensure this aligns with your branching strategy. If your main branch is named differently (e.g., 'main'), you should update this accordingly.
run: flake8 | ||
|
||
- name: Run tests | ||
timeout-minutes: 5 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The timeout-minutes
parameter is redundantly specified here. It is already set at the job level (line 11). You can remove this line to avoid redundancy.
(self.row, "row", "count_rows"), | ||
(self.seat, "seat", "count_seats_in_row"), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The clean
method references non-existent attributes count_rows
and count_seats_in_row
. These should be corrected to rows
and seats_in_row
respectively.
def full_name(self): | ||
return str(self) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The full_name
property should return the concatenated first_name
and last_name
, not str(self)
. Consider using return f'{self.first_name} {self.last_name}'
.
class ActorSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = Actor | ||
fields = ["id", "first_name", "last_name", "full_name"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The full_name
field in ActorSerializer
needs to be explicitly defined using a SerializerMethodField
or similar approach to ensure it is properly serialized. Consider adding a method get_full_name
to return the full_name
property.
) | ||
|
||
def test_get_movie_sessions(self): | ||
movie_sessions = self.client.get("/api/cinema/movie_sessions/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate the URL for the API endpoint. This will make the test more robust against changes in the URL patterns.
|
||
def test_post_movie_session(self): | ||
movies = self.client.post( | ||
"/api/cinema/movie_sessions/", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate the URL for the API endpoint. This will make the test more robust against changes in the URL patterns.
self.assertEqual(movie_sessions.count(), 2) | ||
|
||
def test_get_movie_session(self): | ||
response = self.client.get("/api/cinema/movie_sessions/1/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate the URL for the API endpoint. This will make the test more robust against changes in the URL patterns.
|
||
# SECURITY WARNING: keep the secret key used in production secret! | ||
SECRET_KEY = ( | ||
"django-insecure-6vubhk2$++agnctay_4pxy_8cq)mosmn(*-#2b^v4cgsh-^!i3" |
There was a problem hiding this comment.
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, which is a security risk. Consider loading it from an environment variable or a secure vault.
) | ||
|
||
# SECURITY WARNING: don't run with debug turned on in production! | ||
DEBUG = True |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great job on your project! 🎉 While there are a few areas that need attention, such as security concerns with the DEBUG
setting and SECRET_KEY
, and some improvements needed in your models and serializers, your overall implementation is solid. Make sure to address these issues, especially the critical ones, to enhance the security and robustness of your application. Using Django's reverse
function in your tests will also make them more resilient to changes. Keep up the good work, and continue learning from these experiences to refine your skills further! 🚀
✨ Please rate this review in the Platform's notification center. I will be grateful for your feedback! ✨
on: | ||
pull_request: | ||
branches: | ||
- "master" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The workflow is currently set to trigger only on pull requests to the 'master' branch. Ensure this aligns with your branching strategy, as many projects now use 'main' as the default branch.
run: flake8 | ||
|
||
- name: Run tests | ||
timeout-minutes: 5 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The timeout-minutes
parameter is redundantly specified here. It is already defined at the job level (line 11). You can remove it from this step to avoid redundancy.
(self.row, "row", "count_rows"), | ||
(self.seat, "seat", "count_seats_in_row"), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The clean
method references non-existent attributes count_rows
and count_seats_in_row
. These should be corrected to rows
and seats_in_row
to match the CinemaHall
model.
class ActorSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = Actor | ||
fields = ["id", "first_name", "last_name", "full_name"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ActorSerializer
includes full_name
in the fields list, but it is not explicitly defined. You should use a SerializerMethodField
or another method to include full_name
in the serialized output.
Actor.objects.create(first_name="Keanu", last_name="Reeves") | ||
|
||
def test_get_actors(self): | ||
response = self.client.get("/api/cinema/actors/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate the URL for the API endpoint. This will make your test more robust against changes in the URL patterns.
) | ||
|
||
def test_get_movie_sessions(self): | ||
movie_sessions = self.client.get("/api/cinema/movie_sessions/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate the URL for the API endpoint. This will make your test more robust against changes in the URL patterns.
|
||
def test_post_movie_session(self): | ||
movies = self.client.post( | ||
"/api/cinema/movie_sessions/", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate the URL for the API endpoint. This will make your test more robust against changes in the URL patterns.
self.assertEqual(movie_sessions.count(), 2) | ||
|
||
def test_get_movie_session(self): | ||
response = self.client.get("/api/cinema/movie_sessions/1/") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Django's reverse
function to generate the URL for the API endpoint. This will make your test more robust against changes in the URL patterns.
|
||
# SECURITY WARNING: keep the secret key used in production secret! | ||
SECRET_KEY = ( | ||
"django-insecure-6vubhk2$++agnctay_4pxy_8cq)mosmn(*-#2b^v4cgsh-^!i3" |
There was a problem hiding this comment.
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, which is a security risk for production environments. Consider loading it from a secure source, such as environment variables.
) | ||
|
||
# SECURITY WARNING: don't run with debug turned on in production! | ||
DEBUG = True |
There was a problem hiding this comment.
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 environments to avoid exposing sensitive information.
No description provided.