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..815d56a 100644 --- a/django_views_routing_homework/urls.py +++ b/django_views_routing_homework/urls.py @@ -10,6 +10,10 @@ 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 +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), @@ -23,4 +27,8 @@ 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()), + path('user/github//full-name', FetchNameFromGithubView.as_view()), + path('text/generate/', GenerateFileWithTextView.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 f1e0ac8..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 @@ -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 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..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 @@ -17,9 +17,59 @@ Для тестирования рекомендую использовать Postman. Когда будете писать код, не забывайте о читаемости, поддерживаемости и модульности. """ +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 -def validate_user_data_view(request: HttpRequest) -> HttpResponse: - pass # код писать тут +class ValidateUserDataView(View): + + @staticmethod + def validate_full_name(full_name: str) -> bool: + return 5 <= len(full_name) <= 256 + + @staticmethod + def validate_email(email: str) -> bool: + validator = EmailValidator() + try: + validator(email) + return True + except ValidationError: + return False + + @staticmethod + def validate_registered_from(registered_from: str) -> bool: + return registered_from in ["website", "mobile_app"] + + @staticmethod + def validate_age(age: str) -> bool: + try: + return age.isdigit() + except AttributeError: + 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 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/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 41125cc..7899fcf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,12 @@ -django==4.2.3 +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