From 75dbd6cadcc3d09f314f460834a07b0da9cd4e2a Mon Sep 17 00:00:00 2001 From: Michal Kunc Date: Fri, 10 Feb 2023 15:21:28 +0100 Subject: [PATCH] Add IMDB and CSFD id support to movies --- templates/watchlist/edit.html | 47 +++++++++++++++---- templates/watchlist/movie_detail.html | 5 +- watchlist/forms.py | 2 +- .../0006_movie_csfd_id_movie_imdb_id.py | 23 +++++++++ ...alter_movie_csfd_id_alter_movie_imdb_id.py | 25 ++++++++++ watchlist/models.py | 13 +++++ watchlist/views.py | 26 +++++++++- 7 files changed, 128 insertions(+), 13 deletions(-) create mode 100644 watchlist/migrations/0006_movie_csfd_id_movie_imdb_id.py create mode 100644 watchlist/migrations/0007_alter_movie_csfd_id_alter_movie_imdb_id.py diff --git a/templates/watchlist/edit.html b/templates/watchlist/edit.html index 188d50f..740bb6a 100644 --- a/templates/watchlist/edit.html +++ b/templates/watchlist/edit.html @@ -1,6 +1,7 @@ {% extends 'base.html' %} {% block content %}
+ {% if error %}
{{error}}
{% endif %}
{% csrf_token %} @@ -13,15 +14,43 @@
- +
+
+ +
+
+
+
+ +
+
+ +
ID like tt5580390 or whole URL.
+
+
+ Search +
+
+
+
+ +
+
+ +
ID like 277495 or whole URL.
+
+
+ Search +
+
diff --git a/templates/watchlist/movie_detail.html b/templates/watchlist/movie_detail.html index 19cca4d..fd88e08 100644 --- a/templates/watchlist/movie_detail.html +++ b/templates/watchlist/movie_detail.html @@ -3,7 +3,10 @@

{{ movie.name }}

Suggested by: {{movie.suggested_by.username}}

-
{% if request.user.is_staff or movie.suggested_by == request.user %}Edit{% endif %}IMDBČSFD
+
+ {% if request.user.is_staff or movie.suggested_by == request.user %}Edit{% endif %} + IMDB{% if movie.imdb_id == '' %}*{%endif%} + ČSFD{% if movie.csfd_id == '' %}*{%endif%}

Votes

{% if votes|length == 0 %}

Nobody voted yet, be first...

diff --git a/watchlist/forms.py b/watchlist/forms.py index 0d7a43e..6a3d221 100644 --- a/watchlist/forms.py +++ b/watchlist/forms.py @@ -6,4 +6,4 @@ class MovieEditForm(forms.ModelForm): class Meta: model = models.Movie - fields = ["name", "suggested_by", "watched"] \ No newline at end of file + fields = ["name", "suggested_by", "watched", "imdb_id", "csfd_id"] \ No newline at end of file diff --git a/watchlist/migrations/0006_movie_csfd_id_movie_imdb_id.py b/watchlist/migrations/0006_movie_csfd_id_movie_imdb_id.py new file mode 100644 index 0000000..0d51128 --- /dev/null +++ b/watchlist/migrations/0006_movie_csfd_id_movie_imdb_id.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.5 on 2023-02-10 12:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('watchlist', '0005_movievote_comment'), + ] + + operations = [ + migrations.AddField( + model_name='movie', + name='csfd_id', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='movie', + name='imdb_id', + field=models.CharField(blank=True, max_length=32), + ), + ] diff --git a/watchlist/migrations/0007_alter_movie_csfd_id_alter_movie_imdb_id.py b/watchlist/migrations/0007_alter_movie_csfd_id_alter_movie_imdb_id.py new file mode 100644 index 0000000..7201b0e --- /dev/null +++ b/watchlist/migrations/0007_alter_movie_csfd_id_alter_movie_imdb_id.py @@ -0,0 +1,25 @@ +# Generated by Django 4.1.5 on 2023-02-10 13:26 + +from django.db import migrations, models +import watchlist.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('watchlist', '0006_movie_csfd_id_movie_imdb_id'), + ] + + operations = [ + migrations.AlterField( + model_name='movie', + name='csfd_id', + field=models.CharField(blank=True, default='', max_length=32, validators=[watchlist.models.validate_imdb_id]), + preserve_default=False, + ), + migrations.AlterField( + model_name='movie', + name='imdb_id', + field=models.CharField(blank=True, max_length=32, validators=[watchlist.models.validate_csfd_id]), + ), + ] diff --git a/watchlist/models.py b/watchlist/models.py index 12818fe..0bc86fd 100644 --- a/watchlist/models.py +++ b/watchlist/models.py @@ -1,8 +1,19 @@ +import re + from functools import reduce from django.db import models from django.contrib.auth.models import User from django.contrib import admin +IMDB_ID_RE = re.compile(r'(?Ptt\d{7,})') +CSFD_ID_RE = re.compile(r'(?P\d+)') + +def validate_imdb_id(v: str) -> bool: + return IMDB_ID_RE.match(v) + +def validate_csfd_id(v: str) -> bool: + return CSFD_ID_RE.match(v) + class Movie(models.Model): class Meta: @@ -13,6 +24,8 @@ class Movie(models.Model): name = models.CharField(max_length=100) suggested_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) watched = models.BooleanField(default=False) + imdb_id = models.CharField(max_length=32, blank=True, validators=[validate_csfd_id]) + csfd_id = models.CharField(max_length=32, blank=True, validators=[validate_imdb_id]) @property def score(self): diff --git a/watchlist/views.py b/watchlist/views.py index 88ff034..6c138e9 100644 --- a/watchlist/views.py +++ b/watchlist/views.py @@ -71,6 +71,7 @@ class EditView(generic.DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["users"] = User.objects.all() if self.request.user.has_perm("watchlist.moderate_movies") else None + context["error"] = self.request.GET.get("error", None) return context def get(self, request, *args, **kwargs): @@ -84,7 +85,28 @@ class EditView(generic.DetailView): if not self.can_edit_movie(request): return HttpResponseForbidden("You cannot edit this object.") if "name" in request.POST: - self.object.name = request.POST["name"] + name = request.POST["name"] + if name == '': + return HttpResponseRedirect(reverse('watchlist:edit', args=(kwargs["pk"],)) + "?error=Invalid%20name") + self.object.name = name + if "imdb_id" in request.POST: + if request.POST["imdb_id"] == '': + if self.object.imdb_id != '': + self.object.imdb_id = '' + else: + match = models.IMDB_ID_RE.search(request.POST["imdb_id"]) + if not match: + return HttpResponseRedirect(reverse('watchlist:edit', args=(kwargs["pk"],)) + "?error=Invalid%20IMDB%20ID") + self.object.imdb_id = match.group() + if "csfd_id" in request.POST: + if request.POST["csfd_id"] == '': + if self.object.csfd_id != '': + self.object.csfd_id = '' + else: + match = models.CSFD_ID_RE.search(request.POST["csfd_id"]) + if not match: + return HttpResponseRedirect(reverse('watchlist:edit', args=(kwargs["pk"],)) + "?error=Invalid%20CSFD%20ID") + self.object.csfd_id = match.group() if "suggested_by" in request.POST: if request.user.has_perm('watchlist.moderate_movies'): new_suggestor = User.objects.filter(username=request.POST["suggested_by"]).first() @@ -105,7 +127,7 @@ def submit(request): return HttpResponseForbidden("You can't add new movies.") movie = models.Movie(name=request.POST["name"], suggested_by=request.user, watched=False) movie.save() - return HttpResponseRedirect(reverse("watchlist:index")) + return HttpResponseRedirect(reverse("watchlist:edit", args=(movie.id,))) @login_required @require_POST