From 9cffc7ea52b2d004afb59d6d12ffa760259bcdfd Mon Sep 17 00:00:00 2001 From: Georgios Atheridis Date: Sun, 22 Jan 2023 14:03:45 +0000 Subject: [PATCH] Max clip amount implemented --- core/manager/admin.py | 3 +- core/manager/errors.py | 2 + core/manager/migrations/0004_alter_clip_id.py | 20 ++++++++ .../0005_myuser_alter_clip_account.py | 50 +++++++++++++++++++ ..._added_alter_clip_account_delete_myuser.py | 31 ++++++++++++ core/manager/migrations/0007_resettime.py | 28 +++++++++++ .../migrations/0008_resettime_clip_amount.py | 18 +++++++ ..._rename_clip_amount_resettime_max_clips.py | 18 +++++++ .../0010_rename_resettime_resetdata.py | 17 +++++++ core/manager/models.py | 9 +++- core/manager/request_clip.py | 27 ++++++++-- core/manager/views.py | 7 +++ 12 files changed, 223 insertions(+), 7 deletions(-) create mode 100644 core/manager/errors.py create mode 100644 core/manager/migrations/0004_alter_clip_id.py create mode 100644 core/manager/migrations/0005_myuser_alter_clip_account.py create mode 100644 core/manager/migrations/0006_clip_date_added_alter_clip_account_delete_myuser.py create mode 100644 core/manager/migrations/0007_resettime.py create mode 100644 core/manager/migrations/0008_resettime_clip_amount.py create mode 100644 core/manager/migrations/0009_rename_clip_amount_resettime_max_clips.py create mode 100644 core/manager/migrations/0010_rename_resettime_resetdata.py diff --git a/core/manager/admin.py b/core/manager/admin.py index 710fba1..1e32425 100644 --- a/core/manager/admin.py +++ b/core/manager/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin # Register your models here. -from .models import Clip +from .models import Clip, ResetData admin.site.register(Clip) +admin.site.register(ResetData) diff --git a/core/manager/errors.py b/core/manager/errors.py new file mode 100644 index 0000000..42e0afa --- /dev/null +++ b/core/manager/errors.py @@ -0,0 +1,2 @@ +class TooManyClips(Exception): + pass diff --git a/core/manager/migrations/0004_alter_clip_id.py b/core/manager/migrations/0004_alter_clip_id.py new file mode 100644 index 0000000..4709e22 --- /dev/null +++ b/core/manager/migrations/0004_alter_clip_id.py @@ -0,0 +1,20 @@ +# Generated by Django 4.1.5 on 2023-01-22 13:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("manager", "0003_alter_clip_account"), + ] + + operations = [ + migrations.AlterField( + model_name="clip", + name="id", + field=models.CharField( + max_length=100, primary_key=True, serialize=False, unique=True + ), + ), + ] diff --git a/core/manager/migrations/0005_myuser_alter_clip_account.py b/core/manager/migrations/0005_myuser_alter_clip_account.py new file mode 100644 index 0000000..ffebc21 --- /dev/null +++ b/core/manager/migrations/0005_myuser_alter_clip_account.py @@ -0,0 +1,50 @@ +# Generated by Django 4.1.5 on 2023-01-22 13:30 + +from django.conf import settings +import django.contrib.auth.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("auth", "0012_alter_user_first_name_max_length"), + ("manager", "0004_alter_clip_id"), + ] + + operations = [ + migrations.CreateModel( + name="MyUser", + fields=[ + ( + "user_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to=settings.AUTH_USER_MODEL, + ), + ), + ("clip_amount", models.IntegerField(default=0)), + ], + options={ + "verbose_name": "user", + "verbose_name_plural": "users", + "abstract": False, + }, + bases=("auth.user",), + managers=[ + ("objects", django.contrib.auth.models.UserManager()), + ], + ), + migrations.AlterField( + model_name="clip", + name="account", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="manager.myuser" + ), + ), + ] diff --git a/core/manager/migrations/0006_clip_date_added_alter_clip_account_delete_myuser.py b/core/manager/migrations/0006_clip_date_added_alter_clip_account_delete_myuser.py new file mode 100644 index 0000000..f523efb --- /dev/null +++ b/core/manager/migrations/0006_clip_date_added_alter_clip_account_delete_myuser.py @@ -0,0 +1,31 @@ +# Generated by Django 4.1.5 on 2023-01-22 13:42 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("manager", "0005_myuser_alter_clip_account"), + ] + + operations = [ + migrations.AddField( + model_name="clip", + name="date_added", + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="account", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL + ), + ), + migrations.DeleteModel( + name="MyUser", + ), + ] diff --git a/core/manager/migrations/0007_resettime.py b/core/manager/migrations/0007_resettime.py new file mode 100644 index 0000000..6cafcbe --- /dev/null +++ b/core/manager/migrations/0007_resettime.py @@ -0,0 +1,28 @@ +# Generated by Django 4.1.5 on 2023-01-22 13:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("manager", "0006_clip_date_added_alter_clip_account_delete_myuser"), + ] + + operations = [ + migrations.CreateModel( + name="ResetTime", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("date_time", models.DateTimeField()), + ], + ), + ] diff --git a/core/manager/migrations/0008_resettime_clip_amount.py b/core/manager/migrations/0008_resettime_clip_amount.py new file mode 100644 index 0000000..c41dc35 --- /dev/null +++ b/core/manager/migrations/0008_resettime_clip_amount.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.5 on 2023-01-22 13:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("manager", "0007_resettime"), + ] + + operations = [ + migrations.AddField( + model_name="resettime", + name="clip_amount", + field=models.IntegerField(default=2), + ), + ] diff --git a/core/manager/migrations/0009_rename_clip_amount_resettime_max_clips.py b/core/manager/migrations/0009_rename_clip_amount_resettime_max_clips.py new file mode 100644 index 0000000..d73a64e --- /dev/null +++ b/core/manager/migrations/0009_rename_clip_amount_resettime_max_clips.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.5 on 2023-01-22 14:00 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("manager", "0008_resettime_clip_amount"), + ] + + operations = [ + migrations.RenameField( + model_name="resettime", + old_name="clip_amount", + new_name="max_clips", + ), + ] diff --git a/core/manager/migrations/0010_rename_resettime_resetdata.py b/core/manager/migrations/0010_rename_resettime_resetdata.py new file mode 100644 index 0000000..f3619e5 --- /dev/null +++ b/core/manager/migrations/0010_rename_resettime_resetdata.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.5 on 2023-01-22 14:02 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("manager", "0009_rename_clip_amount_resettime_max_clips"), + ] + + operations = [ + migrations.RenameModel( + old_name="ResetTime", + new_name="ResetData", + ), + ] diff --git a/core/manager/models.py b/core/manager/models.py index f02c1aa..5a9fff4 100644 --- a/core/manager/models.py +++ b/core/manager/models.py @@ -2,9 +2,13 @@ from django.db import models from django.contrib.auth.models import User -# Create your models here. +class ResetData(models.Model): + date_time = models.DateTimeField() + max_clips = models.IntegerField(default=2) + + class Clip(models.Model): - id = models.CharField(primary_key=True, max_length=100) + id = models.CharField(primary_key=True, max_length=100, unique=True) url = models.URLField(null=True) embed_url = models.URLField(null=True) broadcaster_id = models.CharField(null=True, max_length=100) @@ -19,4 +23,5 @@ class Clip(models.Model): thumbnail_url = models.URLField(null=True) duration = models.FloatField(null=True) vod_offset = models.IntegerField(null=True) + date_added = models.DateTimeField(null=True) account = models.ForeignKey(User, on_delete=models.CASCADE) diff --git a/core/manager/request_clip.py b/core/manager/request_clip.py index 92b1913..cd5f2ec 100644 --- a/core/manager/request_clip.py +++ b/core/manager/request_clip.py @@ -1,5 +1,7 @@ import requests -from .models import Clip +import datetime +from .errors import TooManyClips +from .models import Clip, ResetData from urllib.parse import urlparse from allauth.socialaccount.models import SocialApp, SocialToken from django.contrib.auth.models import User @@ -7,6 +9,20 @@ from django.contrib.auth.models import User def request_clip(user, clip: str): id = urlparse(clip).path.split("/")[-1] + user = User.objects.get(id=user.id) + reset_data = ResetData.objects.first() + reset_time = reset_data.date_time + max_clips = reset_data.max_clips + + if ( + len( + Clip.objects.filter(account=user).filter( + date_added__gt=reset_time + ) + ) + >= max_clips + ): + raise TooManyClips social_app: SocialApp = SocialApp.objects.first() oauth = SocialToken.objects.first().token @@ -26,7 +42,7 @@ def request_clip(user, clip: str): data = r.json()["data"][0] print(data) - Clip( + clip = Clip( id=data["id"], url=data["url"], embed_url=data["embed_url"], @@ -42,7 +58,10 @@ def request_clip(user, clip: str): thumbnail_url=data["thumbnail_url"], duration=data["duration"], vod_offset=data["vod_offset"], - account=User.objects.get(id=user.id), - ).save() + date_added=datetime.datetime.now(), + account=user, + ) + clip.validate_unique() + clip.save() return diff --git a/core/manager/views.py b/core/manager/views.py index 9299a39..7e2e114 100644 --- a/core/manager/views.py +++ b/core/manager/views.py @@ -2,9 +2,11 @@ import requests from django.http import HttpResponse from django.shortcuts import render +from django.core.exceptions import ValidationError from .request_clip import request_clip from .forms import ClipForm +from .errors import TooManyClips def get_name(request): @@ -16,6 +18,11 @@ def get_name(request): if form.is_valid(): try: request_clip(user=request.user, clip=form.cleaned_data["clip"]) + except ValidationError as e: + print(e) + return HttpResponse(b"

Clip already exists

") + except TooManyClips: + return HttpResponse(b"

You have submitted the maximum number of clips

") except Exception as e: print(e) return HttpResponse(b"

NOPE

") -- 2.30.2