diff --git a/src/account/templates/profile_editing.html b/src/account/templates/profile_editing.html index d1f8e97..f91f0e8 100644 --- a/src/account/templates/profile_editing.html +++ b/src/account/templates/profile_editing.html @@ -2,7 +2,7 @@ {% load crispy_forms_tags %} -{% block title %} Profil Güncəllə {% endblock title %} +{% block title %} Edit Profile {% endblock title %} {% block content %} diff --git a/src/account/views/profile_editing.py b/src/account/views/profile_editing.py index e370fa5..921631f 100644 --- a/src/account/views/profile_editing.py +++ b/src/account/views/profile_editing.py @@ -2,6 +2,7 @@ from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.contrib import messages from account.forms import ProfileEditingForm +from requests import get @login_required(login_url='/') @@ -9,8 +10,25 @@ def profile_editing_view(request): if request.method == 'POST': form = ProfileEditingForm(request.POST, instance=request.user) if form.is_valid(): - form.save() + raw_data = get(f"https://imdb-api.com/en/API/Title/{request.POST['imdb_api_key']}/tt0110413") + if raw_data.status_code != 200: + messages.info(request, 'Account not created. Please try again later') + return redirect('profile-editing') + data = raw_data.json() + + if data['errorMessage']: + if 'Maximum usage' in data['errorMessage']: + messages.info(request, f"IMDB API: {data['errorMessage']}") + return redirect('profile-editing') + + elif data['errorMessage'] == 'Invalid API Key': + form.add_error('imdb_api_key', 'Invalid API Key') + return render(request, 'profile_editing.html', context={"form": form}) + messages.info(request, f"IMDB API: {data['errorMessage']}") + return redirect('profile-editing') + + form.save() messages.success(request, 'Profile Updated') return redirect('homepage') diff --git a/src/account/views/register.py b/src/account/views/register.py index eaca4c9..cc380a4 100644 --- a/src/account/views/register.py +++ b/src/account/views/register.py @@ -16,15 +16,14 @@ def register_view(request): return redirect('register') data = raw_data.json() - if 'Maximum usage' in data['errorMessage']: - messages.info(request, f"IMDB API: {data['errorMessage']}") - return redirect('register') - - if data['errorMessage'] == 'Invalid API Key': - form.add_error('imdb_api_key', 'Invalid API Key') - return render(request, 'register.html', context={"form": form}) - if data['errorMessage']: + if 'Maximum usage' in data['errorMessage']: + messages.info(request, f"IMDB API: {data['errorMessage']}") + return redirect('register') + + elif data['errorMessage'] == 'Invalid API Key': + form.add_error('imdb_api_key', 'Invalid API Key') + return render(request, 'register.html', context={"form": form}) messages.info(request, f"IMDB API: {data['errorMessage']}") return redirect('register') diff --git a/src/series/templates/add_series.html b/src/series/templates/add_series.html index b1b2a9c..b1773e7 100644 --- a/src/series/templates/add_series.html +++ b/src/series/templates/add_series.html @@ -12,7 +12,7 @@ diff --git a/src/series/templates/homepage.html b/src/series/templates/homepage.html index 67427b4..d966e5d 100644 --- a/src/series/templates/homepage.html +++ b/src/series/templates/homepage.html @@ -10,8 +10,8 @@ - - + + @@ -25,11 +25,9 @@
- - @@ -45,28 +43,38 @@
TitleSeason, EpisodeTitle ({{series.paginator.count}})Season - Episode Show
{{s.last_season}} - {{s.last_episode}}
- + {% endblock content %} \ No newline at end of file diff --git a/src/series/templates/new_episodes.html b/src/series/templates/new_episodes.html new file mode 100644 index 0000000..50f4d78 --- /dev/null +++ b/src/series/templates/new_episodes.html @@ -0,0 +1,40 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %} New Episodes of The Series {% endblock title %} + +{% block content %} + + + + + + + + + + + + {% for s, d in data %} + + + + + + + {% endfor %} + +
Title ({{series.paginator.count}})Watched Season - EpisodeLast Season - EpisodeNumber of New Episodes
+ + {{s.title}} + +
+ + + + + + +
{{s.last_season}} - {{s.last_episode}}{{d.last_season}} - {{d.last_episode}}{{d.count}}
+ +{% endblock content %} \ No newline at end of file diff --git a/src/series/templates/update_series.html b/src/series/templates/update_series.html index 4b7124d..ce73385 100644 --- a/src/series/templates/update_series.html +++ b/src/series/templates/update_series.html @@ -6,6 +6,8 @@ {% block content %} +{% include 'components/message.html' %} +
{% csrf_token %} {{form|crispy}} diff --git a/src/series/urls.py b/src/series/urls.py index 5985a78..c74bdce 100644 --- a/src/series/urls.py +++ b/src/series/urls.py @@ -4,7 +4,8 @@ from series import views urlpatterns = [ path('', views.homepage_view, name='homepage'), - path('series/add', views.AddSeriesView.as_view(), name='add-series'), + path('series/add/', views.AddSeriesView.as_view(), name='add-series'), path('series/update/', views.UpdateSeriesView.as_view(), name='update-series'), path('series/delete/', views.SeriesDeleteView.as_view(), name='delete-series'), + path('series/new-episodes/', views.new_episodes_view, name='new-episodes'), ] \ No newline at end of file diff --git a/src/series/views/__init__.py b/src/series/views/__init__.py index 000530d..d3246ad 100644 --- a/src/series/views/__init__.py +++ b/src/series/views/__init__.py @@ -1,4 +1,5 @@ from .homepage import homepage_view from .add_series import AddSeriesView from .update_series import UpdateSeriesView -from .delete_series import SeriesDeleteView \ No newline at end of file +from .delete_series import SeriesDeleteView +from .new_episodes import new_episodes_view \ No newline at end of file diff --git a/src/series/views/add_series.py b/src/series/views/add_series.py index 8c50ab2..b7ef9c5 100644 --- a/src/series/views/add_series.py +++ b/src/series/views/add_series.py @@ -5,6 +5,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib import messages from django.shortcuts import redirect from requests import get +from datetime import datetime class AddSeriesView(LoginRequiredMixin, CreateView): @@ -28,11 +29,10 @@ class AddSeriesView(LoginRequiredMixin, CreateView): return redirect('add-series') data = raw_data.json() - if 'Maximum usage' in data['errorMessage']: - messages.info(self.request, f"IMDB API: {data['errorMessage']}") - return redirect('add-series') - if data['errorMessage']: + if 'Maximum usage' in data['errorMessage']: + messages.info(self.request, f"IMDB API: {data['errorMessage']}") + return redirect('add-series') form.add_error('imdb_id', 'ID is not correct.') return self.form_invalid(form) @@ -49,13 +49,31 @@ class AddSeriesView(LoginRequiredMixin, CreateView): if raw_data.status_code != 200: messages.info(self.request, 'TV Series can not added. Please try again.') return redirect('add-series') - episodes = raw_data.json()['episodes'] + data = raw_data.json() + + if data['errorMessage']: + if 'Maximum usage' in data['errorMessage']: + messages.info(self.request, f"IMDB API: {data['errorMessage']}") + return redirect('add-series') + form.add_error('imdb_id', 'ID is not correct.') + return self.form_invalid(form) + episodes = data['episodes'] episodes_count = len(episodes) if series.last_episode > episodes_count: form.add_error('last_episode', 'The episode number is not correct.') return self.form_invalid(form) + released_date = episodes[int(series.last_episode) - 1]['released'].replace('.', '') + now_date = datetime.strptime(datetime.strftime(datetime.utcnow(),'%d %b %Y'), '%d %b %Y') + try: + last_episode_date = datetime.strptime(released_date, '%d %b %Y') + if (last_episode_date - now_date).days > 0: + raise ValueError + except ValueError: + form.add_error('last_episode', 'This episode has not been published yet.') + return self.form_invalid(form) + series.save() form.save_m2m() return super().form_valid(form) diff --git a/src/series/views/new_episodes.py b/src/series/views/new_episodes.py new file mode 100644 index 0000000..e1d75dd --- /dev/null +++ b/src/series/views/new_episodes.py @@ -0,0 +1,68 @@ +from django.shortcuts import (render, + redirect) +from django.contrib.auth.decorators import login_required +from django.contrib import messages +from account.models import User +from requests import get +from datetime import datetime +from django.core.paginator import Paginator + + +def get_request(request, link): + raw_data = get(link) + + if raw_data.status_code != 200: + messages.info(request, "Can't search for TV Series. Please try again.") + return redirect('homepage') + data = raw_data.json() + + if data['errorMessage']: + messages.info(request, f"IMDB API: {data['errorMessage']}") + return redirect('homepage') + return data + +def episode_counter(request, s, data): + now_date = datetime.strptime(datetime.strftime(datetime.utcnow(),'%d %b %Y'), '%d %b %Y') + new_episodes_count = 0 + + for n in data['tvSeriesInfo']['seasons'][data['tvSeriesInfo']['seasons'].index(str(s.last_season)):]: + data = get_request(request, f"https://imdb-api.com/en/API/SeasonEpisodes/{request.user.imdb_api_key}/{s.imdb_id}/{n}") + if type(data) is not dict: return data + + episodes = data['episodes'] + for i in range(int(s.last_episode) if n == str(s.last_season) else 0, len(episodes)): + released_date = episodes[i]['released'].replace('.', '') + try: + episode_date = datetime.strptime(released_date, '%d %b %Y') + if (episode_date - now_date).days > 0: + raise ValueError + except ValueError: return new_episodes_count, last_n, last_i+1 + last_i = i + new_episodes_count += 1 + last_n = n + + return new_episodes_count, n, i+1 + +@login_required(login_url='/account/login') +def new_episodes_view(request): + series = User.objects.get(id=request.user.id).series.filter(show=True).order_by('-id') + series_new_episodes = [] + + for s in series: + data = get_request(request, f"https://imdb-api.com/en/API/Title/{request.user.imdb_api_key}/{s.imdb_id}") + if type(data) is not dict: return data + data = episode_counter(request, s, data) + if type(data) is not list: return data + if data[0]: + series_new_episodes.append([s, + {'count': data[0], + 'last_season': data[1], + 'last_episode': data[2]} + ]) + + if series_new_episodes: + page = request.GET.get('page') + paginator = Paginator(series_new_episodes, 1) + return render(request, 'new_episodes.html', context={'data': paginator.get_page(page)}) + messages.warning(request, "There are no new episodes of any series :(") + return redirect('homepage') \ No newline at end of file diff --git a/src/series/views/update_series.py b/src/series/views/update_series.py index 127ef8b..54f8545 100644 --- a/src/series/views/update_series.py +++ b/src/series/views/update_series.py @@ -6,6 +6,7 @@ from django.contrib import messages from django.shortcuts import (get_object_or_404, redirect) from requests import get +from datetime import datetime class UpdateSeriesView(LoginRequiredMixin, UpdateView): @@ -24,18 +25,22 @@ class UpdateSeriesView(LoginRequiredMixin, UpdateView): series = form.save(commit=False) series.user = self.request.user + if not {'imdb_id', 'last_season', 'last_episode'} & set(form.changed_data): + series.save() + form.save_m2m() + return super().form_valid(form) + 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 can not updated. Please try again.') - return redirect('add-series') + return redirect('update-series', self.kwargs.get('slug')) data = raw_data.json() - if 'Maximum usage' in data['errorMessage']: - messages.info(self.request, f"IMDB Key: {data['errorMessage']}") - return redirect('add-series') - if data['errorMessage']: + if 'Maximum usage' in data['errorMessage']: + messages.info(self.request, f"IMDB Key: {data['errorMessage']}") + return redirect("update-series", self.kwargs.get('slug')) form.add_error('imdb_id', 'ID is not correct.') return self.form_invalid(form) @@ -51,15 +56,32 @@ class UpdateSeriesView(LoginRequiredMixin, UpdateView): raw_data = get(f"https://imdb-api.com/en/API/SeasonEpisodes/{series.user.imdb_api_key}/{series.imdb_id}/{series.last_season}") if raw_data.status_code != 200: messages.info(self.request, 'TV Series can not added. Please try again.') - return redirect('add-series') - episodes = raw_data.json()['episodes'] + return redirect('update-series', self.kwargs.get('slug')) + data = raw_data.json() + + if data['errorMessage']: + if 'Maximum usage' in data['errorMessage']: + messages.info(self.request, f"IMDB API: {data['errorMessage']}") + return redirect('update-series', self.kwargs.get('slug')) + form.add_error('imdb_id', 'ID is not correct.') + return self.form_invalid(form) + episodes = data['episodes'] episodes_count = len(episodes) if series.last_episode > episodes_count: form.add_error('last_episode', 'The episode number is not correct.') return self.form_invalid(form) + released_date = episodes[int(series.last_episode) - 1]['released'].replace('.', '') + now_date = datetime.strptime(datetime.strftime(datetime.utcnow(),'%d %b %Y'), '%d %b %Y') + try: + last_episode_date = datetime.strptime(released_date, '%d %b %Y') + if (last_episode_date - now_date).days > 0: + raise ValueError + except ValueError: + form.add_error('last_episode', 'This episode has not been published yet.') + return self.form_invalid(form) + series.save() form.save_m2m() - return super().form_valid(form) - + return super().form_valid(form) \ No newline at end of file