From 36ebeae44f43e22238b00a41dbeb4b42ea33f77a Mon Sep 17 00:00:00 2001 From: ayxan Date: Wed, 24 Aug 2022 21:27:27 +0400 Subject: [PATCH] API_clien app removed --- src/API_client/__init__.py | 1 - src/API_client/get_request.py | 33 ----------------- src/account/models.py | 11 ------ src/account/templates/register.html | 1 + src/account/views/register.py | 18 +++++----- src/series/models.py | 19 +--------- src/series/templates/add_series.html | 22 ++++++++++++ src/series/urls.py | 2 +- src/series/views/__init__.py | 3 +- src/series/views/add_series.py | 53 ++++++++++++++++++++++++++++ 10 files changed, 89 insertions(+), 74 deletions(-) delete mode 100644 src/API_client/__init__.py delete mode 100644 src/API_client/get_request.py create mode 100644 src/series/templates/add_series.html create mode 100644 src/series/views/add_series.py diff --git a/src/API_client/__init__.py b/src/API_client/__init__.py deleted file mode 100644 index 6d19125..0000000 --- a/src/API_client/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .get_request import APIClient \ No newline at end of file diff --git a/src/API_client/get_request.py b/src/API_client/get_request.py deleted file mode 100644 index cf8e85b..0000000 --- a/src/API_client/get_request.py +++ /dev/null @@ -1,33 +0,0 @@ -from requests import get -from django.core.exceptions import ValidationError - - -class APIClient: - def __init__(self, api_key: str) -> None: - self.api_key = api_key - - def __get_data(self, link: str) -> dict: - raw_data = get(link) - if raw_data.status_code == 200: - data = raw_data.json() - - if data['errorMessage'] == 'Invalid API Key': raise ValidationError('Invalid API Key') - elif data['errorMessage']: raise ValidationError('id is not correct.') - - return data - raise ValidationError('Could not created. Please try again later.') - - def key_control(self) -> None: - self.__get_data(f"https://imdb-api.com/en/API/Title/{self.api_key}/tt7939766") - - def get_seasons(self, series_id: str) -> list: - data = self.__get_data(f"https://imdb-api.com/en/API/Title/{self.api_key}/{series_id}") - - if not data['tvSeriesInfo']: - raise ValidationError('This is not a TV series id') - return data['tvSeriesInfo']['seasons'] - - def get_episodes_count(self, season: int, series_id: str) -> int: - data = self.__get_data( - f"https://imdb-api.com/en/API/SeasonEpisodes/{self.api_key}/{series_id}/{season}") - return len(data['episodes']) \ No newline at end of file diff --git a/src/account/models.py b/src/account/models.py index c089ba2..fd8ad45 100644 --- a/src/account/models.py +++ b/src/account/models.py @@ -1,21 +1,10 @@ from django.db import models from django.contrib.auth.models import AbstractUser -from API_client import APIClient -from django.core.exceptions import ValidationError class User(AbstractUser): imdb_api_key = models.CharField(max_length=15, blank=False, null=False) - def clean(self) -> None: - client = APIClient(self.imdb_api_key) - client.key_control() - # raw_data = get(f"https://imdb-api.com/en/API/Title/{self.imdb_api_key}/tt0110413") - - # if raw_data.status_code == 200: data = raw_data.json() - # else: raise ValidationError('Account not created. Please try again later') - # if not data['errorMessage']: raise ValidationError(data['errorMessage']) - class Meta: db_table = 'user' verbose_name = 'User' diff --git a/src/account/templates/register.html b/src/account/templates/register.html index df8862e..f789d2c 100644 --- a/src/account/templates/register.html +++ b/src/account/templates/register.html @@ -5,6 +5,7 @@ {% block title %} Signup {% endblock title %} {% block content %} +{% include 'components/message.html' %}
{% csrf_token %} diff --git a/src/account/views/register.py b/src/account/views/register.py index ca47c3e..6a2c816 100644 --- a/src/account/views/register.py +++ b/src/account/views/register.py @@ -2,7 +2,6 @@ from django.shortcuts import render, redirect from django.contrib import messages from account.forms import RegisterForm from django.contrib.auth import login, authenticate -from django.core.exceptions import ValidationError from requests import get @@ -10,15 +9,16 @@ def register_view(request): if request.method == 'POST': form = RegisterForm(request.POST) if form.is_valid(): - # raw_data = get(f"https://imdb-api.com/en/API/Title/{request.POST['imdb_api_key']}/tt0110413") - # if raw_data.status_code == 200: data = raw_data.json() - # else: - # messages.info(request, 'Account not created. Please try again later') - # return redirect('register') + raw_data = get(f"https://imdb-api.com/en/API/Title/{request.POST['imdb_api_key']}/tt0110413") - # if data['errorMessage'] == 'Invalid API Key': - # messages.info(request, 'Invalid API Key') - # return redirect('register') + if raw_data.status_code != 200: + messages.info(request, 'Account not created. Please try again later') + return redirect('register') + data = raw_data.json() + + if data['errorMessage'] == 'Invalid API Key': + form.add_error('imdb_api_key', 'Invalid API Key') + return render(request, 'register.html', context={"form": form}) form.save() username = form.cleaned_data.get('username') diff --git a/src/series/models.py b/src/series/models.py index bd1ca6e..04b5309 100644 --- a/src/series/models.py +++ b/src/series/models.py @@ -1,6 +1,6 @@ from django.db import models from django.core.exceptions import ValidationError -from API_client import APIClient +# from API_client import APIClient from django.core.validators import (MaxValueValidator, MinValueValidator, MinLengthValidator) @@ -21,22 +21,5 @@ class SeriesModel(models.Model): ], blank=False, null=False) show = models.BooleanField(default=True) - def clean(self) -> None: - if len(self.imdb_id) < 9: - raise ValidationError(f'Ensure this value has at least 9 characters (it has {len(self.imdb_id)}).') - - if len(self.imdb_id) > 10: - raise ValidationError(f'Make sure this value is no more than 10 characters (it has {len(self.imdb_id)}).') - - client = APIClient(self.user.imdb_api_key) - - seasons = client.get_seasons(self.imdb_id) - if str(self.last_season) not in seasons: - raise ValidationError('The season number you entered is not correct.') - - episodes_count = client.get_episodes_count(self.last_season, self.imdb_id) - if self.last_episode > episodes_count: - raise ValidationError('The episode number you entered is not correct.') - def __str__(self) -> str: return f"{self.user.username} - {self.title}" \ No newline at end of file diff --git a/src/series/templates/add_series.html b/src/series/templates/add_series.html new file mode 100644 index 0000000..b1b2a9c --- /dev/null +++ b/src/series/templates/add_series.html @@ -0,0 +1,22 @@ +{% extends 'base.html' %} +{% load crispy_forms_tags %} + +{% block title %} Add Series {% endblock title %} + +{% block content %} +{% include 'components/message.html' %} + + + {% csrf_token %} + {{form|crispy}} + + +
+ +{% endblock content %} + diff --git a/src/series/urls.py b/src/series/urls.py index 214629c..494afb9 100644 --- a/src/series/urls.py +++ b/src/series/urls.py @@ -4,5 +4,5 @@ from series import views urlpatterns = [ path('', views.homepage_view, name='homepage'), - # path('series/create', views.homepage_view, name='homepage'), + path('series/add', views.AddSeriesView.as_view(), name='add-series'), ] \ No newline at end of file diff --git a/src/series/views/__init__.py b/src/series/views/__init__.py index 7e1c3a5..4a0c3a2 100644 --- a/src/series/views/__init__.py +++ b/src/series/views/__init__.py @@ -1 +1,2 @@ -from .homepage import homepage_view \ No newline at end of file +from .homepage import homepage_view +from .add_series import AddSeriesView \ No newline at end of file diff --git a/src/series/views/add_series.py b/src/series/views/add_series.py new file mode 100644 index 0000000..3c55c0d --- /dev/null +++ b/src/series/views/add_series.py @@ -0,0 +1,53 @@ +from django.views.generic import CreateView +from series.models import SeriesModel +from django.urls import reverse_lazy, reverse +from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib import messages +from django.shortcuts import redirect +from requests import get + + +class AddSeriesView(LoginRequiredMixin, CreateView): + login_url = reverse_lazy('login') + template_name = 'add_series.html' + model = SeriesModel + fields = ('title', 'imdb_id', 'last_season', 'last_episode', 'show') + + def get_success_url(self): + messages.success(self.request, 'Series Added') + return reverse('homepage') + + def form_valid(self, form): + series = form.save(commit=False) + series.user = self.request.user + + raw_data = get(f"https://imdb-api.com/en/API/Title/{series.user.imdb_api_key}/{series.imdb_id}") + + if raw_data.status_code != 200: + messages.info(self.request, 'TV Series no added. Please try again.') + return redirect('add-series') + data = raw_data.json() + + if data['errorMessage']: + form.add_error('imdb_id', 'ID is not correct.') + return self.form_invalid(form) + + if not data['tvSeriesInfo']: + form.add_error('imdb_id', 'This is not a TV series id.') + return self.form_invalid(form) + seasons = data['tvSeriesInfo']['seasons'] + + if str(series.last_season) not in seasons: + form.add_error('last_season', 'The season number is not correct.') + return self.form_invalid(form) + + data = get(f"https://imdb-api.com/en/API/SeasonEpisodes/{series.user.imdb_api_key}/{series.imdb_id}/{series.last_season}").json() + episodes_count = len(data['episodes']) + if series.last_episode > episodes_count: + form.add_error('last_episode', 'The episode number is not correct.') + return self.form_invalid(form) + + series.save() + form.save_m2m() + + return super().form_valid(form)