From aab168b5a775e8a61b08b958e858c4747cd00cc6 Mon Sep 17 00:00:00 2001 From: MagerOK Date: Wed, 4 Oct 2023 15:36:18 +0200 Subject: [PATCH 1/5] completed level_3 ex a --- django_views_routing_homework/views/level_3/a_user_ip.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/django_views_routing_homework/views/level_3/a_user_ip.py b/django_views_routing_homework/views/level_3/a_user_ip.py index f1e0ac8..7a8a023 100644 --- a/django_views_routing_homework/views/level_3/a_user_ip.py +++ b/django_views_routing_homework/views/level_3/a_user_ip.py @@ -5,8 +5,10 @@ https://docs.djangoproject.com/en/4.2/ref/request-response/#django.http.HttpRequest.META """ +from django.views import View from django.http import HttpResponse, HttpRequest -def show_user_ip_view(request: HttpRequest) -> HttpResponse: - pass # код писать тут +class Show_User_IP_View(View): + def get(self, request: HttpRequest) -> HttpResponse: + return HttpResponse(request.META["REMOTE_ADDR"]) \ No newline at end of file From ac5bccaeeb3d392a67e70c7dc695b3498d291c7f Mon Sep 17 00:00:00 2001 From: MagerOK Date: Wed, 4 Oct 2023 15:41:52 +0200 Subject: [PATCH 2/5] finaly completed level 3 ex b and fixed ex a --- django_views_routing_homework/settings.py | 1 - django_views_routing_homework/urls.py | 4 ++ .../views/level_3/a_user_ip.py | 2 +- .../views/level_3/b_validate_user_data.py | 47 ++++++++++++++++++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/django_views_routing_homework/settings.py b/django_views_routing_homework/settings.py index 813acb8..dee3f58 100644 --- a/django_views_routing_homework/settings.py +++ b/django_views_routing_homework/settings.py @@ -21,7 +21,6 @@ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', diff --git a/django_views_routing_homework/urls.py b/django_views_routing_homework/urls.py index b0f20d1..5c1e3e1 100644 --- a/django_views_routing_homework/urls.py +++ b/django_views_routing_homework/urls.py @@ -10,6 +10,8 @@ from django_views_routing_homework.views.level_2.b_greet_user_language import greet_user_in_different_languages_view from django_views_routing_homework.views.level_2.c_product_type import get_products_view from django_views_routing_homework.views.level_2.d_authorization import authorization_view, process_authorization_view +from django_views_routing_homework.views.level_3.b_validate_user_data import ValidateUserDataView +from django_views_routing_homework.views.level_3.a_user_ip import ShowUserIpView urlpatterns = [ path('admin/', admin.site.urls), @@ -23,4 +25,6 @@ path('authorization/', authorization_view), path('process-authorization/', process_authorization_view), path('greet///', greet_user_in_different_languages_view), + path('show-user-ip/', ShowUserIpView.as_view()), + path('validate-user-data/', ValidateUserDataView.as_view()), ] diff --git a/django_views_routing_homework/views/level_3/a_user_ip.py b/django_views_routing_homework/views/level_3/a_user_ip.py index 7a8a023..ccdd7df 100644 --- a/django_views_routing_homework/views/level_3/a_user_ip.py +++ b/django_views_routing_homework/views/level_3/a_user_ip.py @@ -9,6 +9,6 @@ from django.http import HttpResponse, HttpRequest -class Show_User_IP_View(View): +class ShowUserIpView(View): def get(self, request: HttpRequest) -> HttpResponse: return HttpResponse(request.META["REMOTE_ADDR"]) \ No newline at end of file diff --git a/django_views_routing_homework/views/level_3/b_validate_user_data.py b/django_views_routing_homework/views/level_3/b_validate_user_data.py index d58e56d..7f0d94b 100644 --- a/django_views_routing_homework/views/level_3/b_validate_user_data.py +++ b/django_views_routing_homework/views/level_3/b_validate_user_data.py @@ -17,9 +17,52 @@ Для тестирования рекомендую использовать Postman. Когда будете писать код, не забывайте о читаемости, поддерживаемости и модульности. """ +import json +import re from django.http import HttpResponse, HttpRequest +from django.http import JsonResponse +from django.views import View -def validate_user_data_view(request: HttpRequest) -> HttpResponse: - pass # код писать тут +class ValidateUserDataView(View): + + def validate_full_name(self, full_name: str) -> bool: + return 5 <= len(full_name) <= 256 + + def validate_email(self, email: str) -> bool: + pattern = r"^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$" + if re.match(pattern, email): + return True + return False + + def validate_registered_from(self, registered_from: str) -> bool: + return registered_from in ["website", "mobile_app"] + + def validate_age(self, age: int) -> bool: + try: + int(age) + return True + except TypeError and ValueError: + return False + + def validate_all_data(self, data: dict) -> dict: + is_valid = ( + self.validate_email(data.get('email', False)) and + self.validate_full_name(data.get('full_name', False)) and + self.validate_registered_from(data.get('registered_from', False)) + ) + age = data.get('age', None) + if self.validate_age(age): + data['age'] = age + elif age is not None: + is_valid = False + return {"is_valid": is_valid} + + def post(self, request: HttpRequest) -> HttpResponse: + try: + data = json.loads(request.body.decode('utf-8')) + except json.JSONDecodeError: + return HttpResponse(status=400) + return JsonResponse(self.validate_all_data(data)) + \ No newline at end of file From c5ca786364bf52f546a51420de48cb13c27506b6 Mon Sep 17 00:00:00 2001 From: MagerOK Date: Wed, 4 Oct 2023 16:43:43 +0200 Subject: [PATCH 3/5] completed level_3 ex c --- django_views_routing_homework/urls.py | 2 ++ .../views/level_3/c_github_full_name.py | 16 +++++++++++++--- requirements.txt | 10 +++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/django_views_routing_homework/urls.py b/django_views_routing_homework/urls.py index 5c1e3e1..361cbee 100644 --- a/django_views_routing_homework/urls.py +++ b/django_views_routing_homework/urls.py @@ -12,6 +12,7 @@ from django_views_routing_homework.views.level_2.d_authorization import authorization_view, process_authorization_view from django_views_routing_homework.views.level_3.b_validate_user_data import ValidateUserDataView from django_views_routing_homework.views.level_3.a_user_ip import ShowUserIpView +from django_views_routing_homework.views.level_3.c_github_full_name import FetchNameFromGithubView urlpatterns = [ path('admin/', admin.site.urls), @@ -27,4 +28,5 @@ path('greet///', greet_user_in_different_languages_view), path('show-user-ip/', ShowUserIpView.as_view()), path('validate-user-data/', ValidateUserDataView.as_view()), + path('user/github//full-name', FetchNameFromGithubView.as_view()), ] diff --git a/django_views_routing_homework/views/level_3/c_github_full_name.py b/django_views_routing_homework/views/level_3/c_github_full_name.py index 1a0bd38..d60c883 100644 --- a/django_views_routing_homework/views/level_3/c_github_full_name.py +++ b/django_views_routing_homework/views/level_3/c_github_full_name.py @@ -9,8 +9,18 @@ - если пользователь на Гитхабе есть, но имя у него не указано, верните None вместо имени """ -from django.http import HttpResponse, HttpRequest +from django.http import HttpResponse, HttpRequest, JsonResponse +from django.views import View +import requests -def fetch_name_from_github_view(request: HttpRequest, github_username: str) -> HttpResponse: - pass # код писать тут +class FetchNameFromGithubView(View): + def get(self, request: HttpRequest, github_username: str) -> HttpResponse: + response = requests.get(f"https://api.github.com/users/{github_username}") + if response.status_code == 404: + return HttpResponse(status=404) + + user_data = response.json() + name = user_data.get("name", None) + return JsonResponse({"name": name}) + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 41125cc..069afef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,9 @@ -django==4.2.3 +asgiref==3.7.2 +certifi==2023.7.22 +charset-normalizer==3.3.0 +Django==4.2.3 +idna==3.4 +requests==2.31.0 +sqlparse==0.4.4 +tzdata==2023.3 +urllib3==2.0.6 From f22b3f2468f3bfe1239210a75b9e5f16461e9298 Mon Sep 17 00:00:00 2001 From: MagerOK Date: Wed, 4 Oct 2023 18:22:28 +0200 Subject: [PATCH 4/5] completed level 3 ex d and fixed 1 line in ex b --- django_views_routing_homework/urls.py | 2 ++ .../views/level_3/b_validate_user_data.py | 2 +- .../views/level_3/d_file_generation.py | 35 +++++++++++++++++-- requirements.txt | 3 ++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/django_views_routing_homework/urls.py b/django_views_routing_homework/urls.py index 361cbee..815d56a 100644 --- a/django_views_routing_homework/urls.py +++ b/django_views_routing_homework/urls.py @@ -13,6 +13,7 @@ from django_views_routing_homework.views.level_3.b_validate_user_data import ValidateUserDataView from django_views_routing_homework.views.level_3.a_user_ip import ShowUserIpView from django_views_routing_homework.views.level_3.c_github_full_name import FetchNameFromGithubView +from django_views_routing_homework.views.level_3.d_file_generation import GenerateFileWithTextView urlpatterns = [ path('admin/', admin.site.urls), @@ -29,4 +30,5 @@ path('show-user-ip/', ShowUserIpView.as_view()), path('validate-user-data/', ValidateUserDataView.as_view()), path('user/github//full-name', FetchNameFromGithubView.as_view()), + path('text/generate/', GenerateFileWithTextView.as_view()) ] diff --git a/django_views_routing_homework/views/level_3/b_validate_user_data.py b/django_views_routing_homework/views/level_3/b_validate_user_data.py index 7f0d94b..457fff4 100644 --- a/django_views_routing_homework/views/level_3/b_validate_user_data.py +++ b/django_views_routing_homework/views/level_3/b_validate_user_data.py @@ -43,7 +43,7 @@ def validate_age(self, age: int) -> bool: try: int(age) return True - except TypeError and ValueError: + except TypeError or ValueError: return False def validate_all_data(self, data: dict) -> dict: diff --git a/django_views_routing_homework/views/level_3/d_file_generation.py b/django_views_routing_homework/views/level_3/d_file_generation.py index 60d8fce..1fd1439 100644 --- a/django_views_routing_homework/views/level_3/d_file_generation.py +++ b/django_views_routing_homework/views/level_3/d_file_generation.py @@ -15,7 +15,38 @@ """ from django.http import HttpResponse, HttpRequest +from django.views import View +from faker import Faker -def generate_file_with_text_view(request: HttpRequest) -> HttpResponse: - pass # код писать тут +class GenerateFileWithTextView(View): + + def generate_text(self, length: int) -> str: + fake = Faker() + text = '' + while len(text) < length: + text += fake.word() + ' ' + text_cut = text[:length] + return text_cut + + def validate_length(self, length: int) -> bool: + try: + int(length) + except ValueError or TypeError: + return False + if 0 <= int(length) <= 10000: + return True + return False + + def get(self, request: HttpRequest) -> HttpResponse: + length = request.GET.get("length", None) + if not self.validate_length(length): + return HttpResponse(status=403) + response = HttpResponse( + content_type="text/txt", + headers={"Content-Disposition": 'attachment; filename="generated_file.txt"'}, + ) + text = self.generate_text(int(length)) + response.write(text) + return response + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 069afef..7899fcf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,8 +2,11 @@ asgiref==3.7.2 certifi==2023.7.22 charset-normalizer==3.3.0 Django==4.2.3 +Faker==19.6.2 idna==3.4 +python-dateutil==2.8.2 requests==2.31.0 +six==1.16.0 sqlparse==0.4.4 tzdata==2023.3 urllib3==2.0.6 From e5e3354ab09e06027d6a495ab99bfb5e4b0c135c Mon Sep 17 00:00:00 2001 From: MagerOK Date: Tue, 10 Oct 2023 13:01:08 +0200 Subject: [PATCH 5/5] switched exceptions to isdigit method and added staticmethods to all independent functions --- .../views/level_3/b_validate_user_data.py | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/django_views_routing_homework/views/level_3/b_validate_user_data.py b/django_views_routing_homework/views/level_3/b_validate_user_data.py index 457fff4..0d4fa02 100644 --- a/django_views_routing_homework/views/level_3/b_validate_user_data.py +++ b/django_views_routing_homework/views/level_3/b_validate_user_data.py @@ -20,6 +20,8 @@ import json import re +from django.core.validators import EmailValidator +from django.core.exceptions import ValidationError from django.http import HttpResponse, HttpRequest from django.http import JsonResponse from django.views import View @@ -27,23 +29,28 @@ class ValidateUserDataView(View): - def validate_full_name(self, full_name: str) -> bool: + @staticmethod + def validate_full_name(full_name: str) -> bool: return 5 <= len(full_name) <= 256 - def validate_email(self, email: str) -> bool: - pattern = r"^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$" - if re.match(pattern, email): + @staticmethod + def validate_email(email: str) -> bool: + validator = EmailValidator() + try: + validator(email) return True - return False - - def validate_registered_from(self, registered_from: str) -> bool: + except ValidationError: + return False + + @staticmethod + def validate_registered_from(registered_from: str) -> bool: return registered_from in ["website", "mobile_app"] - def validate_age(self, age: int) -> bool: + @staticmethod + def validate_age(age: str) -> bool: try: - int(age) - return True - except TypeError or ValueError: + return age.isdigit() + except AttributeError: return False def validate_all_data(self, data: dict) -> dict: