From 1958e8c5c0b89a7ae694f34a3ba18c53a11ff673 Mon Sep 17 00:00:00 2001 From: Ahmad Fauzan Amirul Isnain <ahmad.fauzan71@ui.ac.id> Date: Sat, 31 Oct 2020 07:57:15 +0700 Subject: [PATCH] Revert "Merge branch '1806280552-54' into 'master'" This reverts merge request !85 --- administration/migrations/0001_initial.py | 42 +-- .../0002_verificationreport_materi.py | 23 ++ .../0003_verificationreport_user.py | 24 ++ .../migrations/0004_auto_20200517_1713.py | 19 ++ .../migrations/0005_deletionhistory.py | 27 ++ .../0005_verificationsetting_archived_by.py | 21 ++ .../migrations/0006_merge_20200604_0718.py | 14 + .../migrations/0007_auto_20200929_1218.py | 18 ++ .../migrations/0008_auto_20201009_1829.py | 18 ++ app/migrations/0001_initial.py | 211 +------------ app/migrations/0002_auto_20200508_2142.py | 36 +++ app/migrations/0003_auto_20200509_2108.py | 19 ++ app/migrations/0004_like.py | 22 ++ app/migrations/0005_like_session_id.py | 19 ++ .../0006_downloadstatistics_viewstatistics.py | 30 ++ app/migrations/0007_auto_20200516_1743.py | 43 +++ app/migrations/0008_auto_20200518_1919.py | 48 +++ app/migrations/0009_auto_20200518_2245.py | 18 ++ app/migrations/0010_category_archived.py | 18 ++ app/migrations/0011_auto_20200603_1350.py | 18 ++ app/migrations/0012_category_archived_by.py | 21 ++ app/migrations/0013_auto_20200919_2055.py | 33 ++ app/migrations/0014_rating.py | 30 ++ .../0015_downloadstatistics_downloader.py | 21 ++ app/migrations/0015_reqmaterial.py | 22 ++ app/migrations/0016_ratingcontributor.py | 25 ++ app/migrations/0017_auto_20201005_2145.py | 19 ++ app/migrations/0018_merge_20201009_0700.py | 14 + app/migrations/0019_auto_20201009_1829.py | 34 ++ app/migrations/0019_materi__search_vector.py | 19 ++ app/migrations/0019_materi_yt_video_id.py | 18 ++ app/migrations/0020_merge_20201009_2039.py | 14 + .../0021_dislikecomment_likecomment.py | 33 ++ app/migrations/0021_materi_release_year.py | 19 ++ app/migrations/0022_merge_20201011_1122.py | 14 + app/migrations/0023_materi_deleted_at.py | 18 ++ app/migrations/0023_merge_20201016_1713.py | 14 + app/migrations/0024_merge_20201026_0812.py | 14 + app/migrations/0025_review.py | 30 ++ app/migrations/0026_submitvisitor.py | 24 ++ app/models.py | 25 +- app/static/images/sub-btn.png | Bin 102953 -> 0 bytes app/templates/app/emails/subscription.html | 20 -- app/templates/app/katalog_materi.html | 8 +- app/templates/subscribe.html | 12 - app/tests.py | 290 +++++++++--------- app/urls.py | 3 - app/utils/email_utility.py | 90 ------ app/utils/encryption_util.py | 37 --- app/views.py | 106 +------ authentication/migrations/0001_initial.py | 55 ++-- .../migrations/0002_auto_20200518_1752.py | 18 ++ .../migrations/0003_auto_20200519_1012.py | 23 ++ .../migrations/0004_auto_20200519_1020.py | 23 ++ .../migrations/0005_auto_20200519_1021.py | 18 ++ .../migrations/0006_auto_20200929_2125.py | 18 ++ .../migrations/0007_auto_20201009_1415.py | 18 ++ ...ser_is_subscribing_to_material_comments.py | 18 ++ digipus/settings.py | 3 +- forum/migrations/0001_initial.py | 11 +- forum/migrations/0002_auto_20201007_1903.py | 24 ++ forum/migrations/0003_auto_20201008_2056.py | 24 ++ forum/migrations/0004_discussion_materi.py | 18 ++ forum/migrations/0005_auto_20201009_0138.py | 18 ++ forum/migrations/0006_auto_20201009_0625.py | 23 ++ news/migrations/0001_initial.py | 2 +- 66 files changed, 1340 insertions(+), 689 deletions(-) create mode 100644 administration/migrations/0002_verificationreport_materi.py create mode 100644 administration/migrations/0003_verificationreport_user.py create mode 100644 administration/migrations/0004_auto_20200517_1713.py create mode 100644 administration/migrations/0005_deletionhistory.py create mode 100644 administration/migrations/0005_verificationsetting_archived_by.py create mode 100644 administration/migrations/0006_merge_20200604_0718.py create mode 100644 administration/migrations/0007_auto_20200929_1218.py create mode 100644 administration/migrations/0008_auto_20201009_1829.py create mode 100644 app/migrations/0002_auto_20200508_2142.py create mode 100644 app/migrations/0003_auto_20200509_2108.py create mode 100644 app/migrations/0004_like.py create mode 100644 app/migrations/0005_like_session_id.py create mode 100644 app/migrations/0006_downloadstatistics_viewstatistics.py create mode 100644 app/migrations/0007_auto_20200516_1743.py create mode 100644 app/migrations/0008_auto_20200518_1919.py create mode 100644 app/migrations/0009_auto_20200518_2245.py create mode 100644 app/migrations/0010_category_archived.py create mode 100644 app/migrations/0011_auto_20200603_1350.py create mode 100644 app/migrations/0012_category_archived_by.py create mode 100644 app/migrations/0013_auto_20200919_2055.py create mode 100644 app/migrations/0014_rating.py create mode 100644 app/migrations/0015_downloadstatistics_downloader.py create mode 100644 app/migrations/0015_reqmaterial.py create mode 100644 app/migrations/0016_ratingcontributor.py create mode 100644 app/migrations/0017_auto_20201005_2145.py create mode 100644 app/migrations/0018_merge_20201009_0700.py create mode 100644 app/migrations/0019_auto_20201009_1829.py create mode 100644 app/migrations/0019_materi__search_vector.py create mode 100644 app/migrations/0019_materi_yt_video_id.py create mode 100644 app/migrations/0020_merge_20201009_2039.py create mode 100644 app/migrations/0021_dislikecomment_likecomment.py create mode 100644 app/migrations/0021_materi_release_year.py create mode 100644 app/migrations/0022_merge_20201011_1122.py create mode 100644 app/migrations/0023_materi_deleted_at.py create mode 100644 app/migrations/0023_merge_20201016_1713.py create mode 100644 app/migrations/0024_merge_20201026_0812.py create mode 100644 app/migrations/0025_review.py create mode 100644 app/migrations/0026_submitvisitor.py delete mode 100644 app/static/images/sub-btn.png delete mode 100644 app/templates/app/emails/subscription.html delete mode 100644 app/templates/subscribe.html delete mode 100644 app/utils/email_utility.py delete mode 100644 app/utils/encryption_util.py create mode 100644 authentication/migrations/0002_auto_20200518_1752.py create mode 100644 authentication/migrations/0003_auto_20200519_1012.py create mode 100644 authentication/migrations/0004_auto_20200519_1020.py create mode 100644 authentication/migrations/0005_auto_20200519_1021.py create mode 100644 authentication/migrations/0006_auto_20200929_2125.py create mode 100644 authentication/migrations/0007_auto_20201009_1415.py create mode 100644 authentication/migrations/0008_user_is_subscribing_to_material_comments.py create mode 100644 forum/migrations/0002_auto_20201007_1903.py create mode 100644 forum/migrations/0003_auto_20201008_2056.py create mode 100644 forum/migrations/0004_discussion_materi.py create mode 100644 forum/migrations/0005_auto_20201009_0138.py create mode 100644 forum/migrations/0006_auto_20201009_0625.py diff --git a/administration/migrations/0001_initial.py b/administration/migrations/0001_initial.py index e936659..de7061b 100644 --- a/administration/migrations/0001_initial.py +++ b/administration/migrations/0001_initial.py @@ -1,9 +1,7 @@ -# Generated by Django 3.1 on 2020-10-30 15:29 +# Generated by Django 3.0.3 on 2020-05-08 14:42 -from django.conf import settings +import django.contrib.postgres.fields.jsonb from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone class Migration(migrations.Migration): @@ -11,40 +9,28 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('app', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ - migrations.CreateModel( - name='VerificationSetting', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=250)), - ('description', models.TextField(default='')), - ('archived', models.BooleanField(default=False)), - ('archived_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), - ], - ), migrations.CreateModel( name='VerificationReport', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('report', models.JSONField()), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('status', models.CharField(choices=[('PENDING', 'Diproses'), ('APPROVE', 'Diterima'), ('DISAPPROVE', 'Ditolak'), ('REVISION', 'Perbaikan'), ('BLOCKED', 'Diblokir')], default='PENDING', max_length=30)), - ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.materi')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ('id', models.AutoField(auto_created=True, + primary_key=True, serialize=False, verbose_name='ID')), + ('report', django.contrib.postgres.fields.jsonb.JSONField()), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('status', models.CharField(choices=[('PENDING', 'Diproses'), ('APPROVE', 'Diterima'), ( + 'DISAPPROVE', 'Ditolak'), ('REVISION', 'Perbaikan')], default='PENDING', max_length=30)), ], ), migrations.CreateModel( - name='DeletionHistory', + name='VerificationSetting', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('deleted_user_name', models.CharField(max_length=150)), - ('deleted_user_role', models.CharField(max_length=150)), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('deletor_admin', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ('id', models.AutoField(auto_created=True, + primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=250)), + ('description', models.TextField(default='')), + ('archived', models.BooleanField(default=False)), ], ), ] diff --git a/administration/migrations/0002_verificationreport_materi.py b/administration/migrations/0002_verificationreport_materi.py new file mode 100644 index 0000000..a1b8db8 --- /dev/null +++ b/administration/migrations/0002_verificationreport_materi.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.3 on 2020-05-08 14:42 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('app', '0001_initial'), + ('administration', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='verificationreport', + name='materi', + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.Materi'), + ), + ] diff --git a/administration/migrations/0003_verificationreport_user.py b/administration/migrations/0003_verificationreport_user.py new file mode 100644 index 0000000..236da3c --- /dev/null +++ b/administration/migrations/0003_verificationreport_user.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.3 on 2020-05-08 14:42 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('administration', '0002_verificationreport_materi'), + ] + + operations = [ + migrations.AddField( + model_name='verificationreport', + name='user', + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/administration/migrations/0004_auto_20200517_1713.py b/administration/migrations/0004_auto_20200517_1713.py new file mode 100644 index 0000000..8189cd9 --- /dev/null +++ b/administration/migrations/0004_auto_20200517_1713.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.3 on 2020-05-17 10:13 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('administration', '0003_verificationreport_user'), + ] + + operations = [ + migrations.AlterField( + model_name='verificationreport', + name='timestamp', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + ] diff --git a/administration/migrations/0005_deletionhistory.py b/administration/migrations/0005_deletionhistory.py new file mode 100644 index 0000000..a23c37e --- /dev/null +++ b/administration/migrations/0005_deletionhistory.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0.3 on 2020-06-03 12:57 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('administration', '0004_auto_20200517_1713'), + ] + + operations = [ + migrations.CreateModel( + name='DeletionHistory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('deleted_user_name', models.CharField(max_length=150)), + ('deleted_user_role', models.CharField(max_length=150)), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ('deletor_admin', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/administration/migrations/0005_verificationsetting_archived_by.py b/administration/migrations/0005_verificationsetting_archived_by.py new file mode 100644 index 0000000..dadfd72 --- /dev/null +++ b/administration/migrations/0005_verificationsetting_archived_by.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0.3 on 2020-06-04 00:09 + +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), + ('administration', '0004_auto_20200517_1713'), + ] + + operations = [ + migrations.AddField( + model_name='verificationsetting', + name='archived_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/administration/migrations/0006_merge_20200604_0718.py b/administration/migrations/0006_merge_20200604_0718.py new file mode 100644 index 0000000..92c7b03 --- /dev/null +++ b/administration/migrations/0006_merge_20200604_0718.py @@ -0,0 +1,14 @@ +# Generated by Django 3.0.3 on 2020-06-04 00:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('administration', '0005_deletionhistory'), + ('administration', '0005_verificationsetting_archived_by'), + ] + + operations = [ + ] diff --git a/administration/migrations/0007_auto_20200929_1218.py b/administration/migrations/0007_auto_20200929_1218.py new file mode 100644 index 0000000..735e715 --- /dev/null +++ b/administration/migrations/0007_auto_20200929_1218.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-09-29 05:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('administration', '0006_merge_20200604_0718'), + ] + + operations = [ + migrations.AlterField( + model_name='verificationreport', + name='report', + field=models.JSONField(), + ), + ] diff --git a/administration/migrations/0008_auto_20201009_1829.py b/administration/migrations/0008_auto_20201009_1829.py new file mode 100644 index 0000000..0302d90 --- /dev/null +++ b/administration/migrations/0008_auto_20201009_1829.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-09 11:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('administration', '0007_auto_20200929_1218'), + ] + + operations = [ + migrations.AlterField( + model_name='verificationreport', + name='status', + field=models.CharField(choices=[('PENDING', 'Diproses'), ('APPROVE', 'Diterima'), ('DISAPPROVE', 'Ditolak'), ('REVISION', 'Perbaikan'), ('BLOCKED', 'Diblokir')], default='PENDING', max_length=30), + ), + ] diff --git a/app/migrations/0001_initial.py b/app/migrations/0001_initial.py index 2e76e78..51a62f5 100644 --- a/app/migrations/0001_initial.py +++ b/app/migrations/0001_initial.py @@ -1,12 +1,6 @@ -# Generated by Django 3.1 on 2020-10-30 15:28 +# Generated by Django 3.0.3 on 2020-05-08 14:42 -import app.models -from django.conf import settings -import django.contrib.postgres.search -import django.core.validators from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone class Migration(migrations.Migration): @@ -14,215 +8,44 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Category', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.AutoField(auto_created=True, + primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=20)), - ('description', models.TextField(default='')), - ('archived', models.BooleanField(default=False)), - ('archived_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ('description', models.CharField(max_length=20)), ], ), migrations.CreateModel( name='Comment', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.AutoField(auto_created=True, + primary_key=True, serialize=False, verbose_name='ID')), ('username', models.CharField(max_length=100)), - ('profile', models.CharField(default=app.models.getRandomColor, max_length=100)), - ('comment', models.CharField(default='comments', max_length=240)), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ], - ), - migrations.CreateModel( - name='DownloadStatistics', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('downloader', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riwayat_unduh', to=settings.AUTH_USER_MODEL)), + ('profile', models.CharField(default='56acdf', max_length=100)), + ('comment', models.CharField(default='comments', max_length=150)), ], ), migrations.CreateModel( name='Materi', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('deleted_at', models.DateTimeField(blank=True, null=True)), + ('id', models.AutoField(auto_created=True, + primary_key=True, serialize=False, verbose_name='ID')), ('cover', models.ImageField(upload_to='')), ('content', models.FileField(upload_to='')), - ('title', models.CharField(default='Judul', max_length=50)), - ('author', models.CharField(default='Penyusun', max_length=30)), - ('publisher', models.CharField(default='Penerbit', max_length=30)), - ('release_year', models.IntegerField(default=app.models.current_year)), + ('title', models.CharField(default='title', max_length=50)), + ('author', models.CharField(default='author', max_length=30)), + ('publisher', models.CharField(default='publiser', max_length=30)), ('pages', models.IntegerField(default=0)), - ('descriptions', models.TextField(default='Deskripsi')), - ('status', models.CharField(choices=[('PENDING', 'Diproses'), ('APPROVE', 'Diterima'), ('DISAPPROVE', 'Ditolak'), ('REVISION', 'Perbaikan'), ('BLOCKED', 'Diblokir')], default='PENDING', max_length=30)), - ('date_created', models.DateTimeField(default=django.utils.timezone.now)), - ('date_modified', models.DateTimeField(auto_now=True)), - ('yt_video_id', models.CharField(blank=True, max_length=100, null=True)), - ('_search_vector', django.contrib.postgres.search.SearchVectorField(editable=False, null=True)), + ('descriptions', models.TextField(default='descriptions')), + ('status', models.CharField(choices=[('PENDING', 'Diproses'), ('APPROVE', 'Diterima'), ( + 'DISAPPROVE', 'Ditolak'), ('REVISION', 'Perbaikan')], default='PENDING', max_length=30)), + ('date_added', models.DateTimeField(auto_now_add=True)), ('categories', models.ManyToManyField(to='app.Category')), - ('uploader', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ReqMaterial', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=100)), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ], - ), - migrations.CreateModel( - name='SubmitVisitor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('user_id', models.CharField(max_length=50)), - ('email', models.CharField(max_length=50)), - ('msg', models.CharField(max_length=100)), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ], - ), - migrations.CreateModel( - name='SubscribeModel', - fields=[ - ('sys_id', models.AutoField(primary_key=True, serialize=False)), - ('email', models.EmailField(blank=True, max_length=200, unique=True)), - ('status', models.CharField(blank=True, max_length=64)), - ('created_date', models.DateTimeField(blank=True)), - ('updated_date', models.DateTimeField(blank=True)), - ], - options={ - 'db_table': 'app_subscribe', - }, - ), - migrations.CreateModel( - name='ViewStatistics', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='baca', to='app.materi')), - ], - ), - migrations.CreateModel( - name='Review', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('username', models.CharField(max_length=100)), - ('profile', models.CharField(default=app.models.getRandomColor, max_length=100)), - ('review', models.TextField(default='review')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.materi')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='RatingContributor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(auto_now=True)), - ('score', models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)])), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='LikeComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('session_id', models.CharField(max_length=32)), - ('comment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.comment')), - ], - ), - migrations.CreateModel( - name='Like', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('session_id', models.CharField(max_length=32)), - ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.materi')), - ], - ), - migrations.CreateModel( - name='LaporanMateri', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('laporan', models.TextField(default='', validators=[django.core.validators.MinValueValidator(30), django.core.validators.MaxValueValidator(120)])), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('is_rejected', models.BooleanField(default=False)), - ('materi', models.ForeignKey(max_length=120, on_delete=django.db.models.deletion.CASCADE, to='app.materi')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='DummyViewStatistics', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.viewstatistics')), - ], - ), - migrations.CreateModel( - name='DummyLike', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.like')), - ], - ), - migrations.CreateModel( - name='DummyDownloadStatistics', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.downloadstatistics')), - ], - ), - migrations.CreateModel( - name='DummyComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.comment')), - ], - ), - migrations.AddField( - model_name='downloadstatistics', - name='materi', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unduh', to='app.materi'), - ), - migrations.CreateModel( - name='DislikeComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('session_id', models.CharField(max_length=32)), - ('comment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.comment')), - ], - ), - migrations.AddField( - model_name='comment', - name='materi', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.materi'), - ), - migrations.AddField( - model_name='comment', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), - ), - migrations.CreateModel( - name='Rating', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('score', models.IntegerField()), - ('materi', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.materi')), - ('user', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], - options={ - 'unique_together': {('materi', 'user')}, - }, ), ] diff --git a/app/migrations/0002_auto_20200508_2142.py b/app/migrations/0002_auto_20200508_2142.py new file mode 100644 index 0000000..dfeeb84 --- /dev/null +++ b/app/migrations/0002_auto_20200508_2142.py @@ -0,0 +1,36 @@ +# Generated by Django 3.0.3 on 2020-05-08 14:42 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('app', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='materi', + name='uploader', + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='comment', + name='materi', + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.Materi'), + ), + migrations.AddField( + model_name='comment', + name='user', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/app/migrations/0003_auto_20200509_2108.py b/app/migrations/0003_auto_20200509_2108.py new file mode 100644 index 0000000..844d9d8 --- /dev/null +++ b/app/migrations/0003_auto_20200509_2108.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.3 on 2020-05-09 14:08 + +import app.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0002_auto_20200508_2142'), + ] + + operations = [ + migrations.AlterField( + model_name='comment', + name='profile', + field=models.CharField(default=app.models.getRandomColor, max_length=100), + ), + ] diff --git a/app/migrations/0004_like.py b/app/migrations/0004_like.py new file mode 100644 index 0000000..7240ea7 --- /dev/null +++ b/app/migrations/0004_like.py @@ -0,0 +1,22 @@ +# Generated by Django 3.0.3 on 2020-05-12 08:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0003_auto_20200509_2108'), + ] + + operations = [ + migrations.CreateModel( + name='Like', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.Materi')), + ], + ), + ] diff --git a/app/migrations/0005_like_session_id.py b/app/migrations/0005_like_session_id.py new file mode 100644 index 0000000..8520a4d --- /dev/null +++ b/app/migrations/0005_like_session_id.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.3 on 2020-05-12 09:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0004_like'), + ] + + operations = [ + migrations.AddField( + model_name='like', + name='session_id', + field=models.CharField(default='', max_length=32), + preserve_default=False, + ), + ] diff --git a/app/migrations/0006_downloadstatistics_viewstatistics.py b/app/migrations/0006_downloadstatistics_viewstatistics.py new file mode 100644 index 0000000..2b29fb1 --- /dev/null +++ b/app/migrations/0006_downloadstatistics_viewstatistics.py @@ -0,0 +1,30 @@ +# Generated by Django 3.0.3 on 2020-05-13 10:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0005_like_session_id'), + ] + + operations = [ + migrations.CreateModel( + name='ViewStatistics', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='baca', to='app.Materi')), + ], + ), + migrations.CreateModel( + name='DownloadStatistics', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unduh', to='app.Materi')), + ], + ), + ] diff --git a/app/migrations/0007_auto_20200516_1743.py b/app/migrations/0007_auto_20200516_1743.py new file mode 100644 index 0000000..5a09734 --- /dev/null +++ b/app/migrations/0007_auto_20200516_1743.py @@ -0,0 +1,43 @@ +# Generated by Django 3.0.3 on 2020-05-16 10:43 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0006_downloadstatistics_viewstatistics'), + ] + + operations = [ + migrations.RemoveField( + model_name='materi', + name='date_added', + ), + migrations.AddField( + model_name='materi', + name='date_created', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AddField( + model_name='materi', + name='date_modified', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='downloadstatistics', + name='timestamp', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='like', + name='timestamp', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='viewstatistics', + name='timestamp', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + ] diff --git a/app/migrations/0008_auto_20200518_1919.py b/app/migrations/0008_auto_20200518_1919.py new file mode 100644 index 0000000..df20b16 --- /dev/null +++ b/app/migrations/0008_auto_20200518_1919.py @@ -0,0 +1,48 @@ +# Generated by Django 3.0.3 on 2020-05-18 12:19 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0007_auto_20200516_1743'), + ] + + operations = [ + migrations.AddField( + model_name='comment', + name='timestamp', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.CreateModel( + name='DummyViewStatistics', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.ViewStatistics')), + ], + ), + migrations.CreateModel( + name='DummyLike', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Like')), + ], + ), + migrations.CreateModel( + name='DummyDownloadStatistics', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.DownloadStatistics')), + ], + ), + migrations.CreateModel( + name='DummyComment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Comment')), + ], + ), + ] diff --git a/app/migrations/0009_auto_20200518_2245.py b/app/migrations/0009_auto_20200518_2245.py new file mode 100644 index 0000000..68785da --- /dev/null +++ b/app/migrations/0009_auto_20200518_2245.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.3 on 2020-05-18 15:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0008_auto_20200518_1919'), + ] + + operations = [ + migrations.AlterField( + model_name='comment', + name='comment', + field=models.CharField(default='comments', max_length=240), + ), + ] diff --git a/app/migrations/0010_category_archived.py b/app/migrations/0010_category_archived.py new file mode 100644 index 0000000..a864e59 --- /dev/null +++ b/app/migrations/0010_category_archived.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.3 on 2020-06-03 06:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0009_auto_20200518_2245'), + ] + + operations = [ + migrations.AddField( + model_name='category', + name='archived', + field=models.BooleanField(default=False), + ), + ] diff --git a/app/migrations/0011_auto_20200603_1350.py b/app/migrations/0011_auto_20200603_1350.py new file mode 100644 index 0000000..14c0884 --- /dev/null +++ b/app/migrations/0011_auto_20200603_1350.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.3 on 2020-06-03 06:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0010_category_archived'), + ] + + operations = [ + migrations.AlterField( + model_name='category', + name='description', + field=models.TextField(default=''), + ), + ] diff --git a/app/migrations/0012_category_archived_by.py b/app/migrations/0012_category_archived_by.py new file mode 100644 index 0000000..9919bf0 --- /dev/null +++ b/app/migrations/0012_category_archived_by.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0.3 on 2020-06-04 00:09 + +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), + ('app', '0011_auto_20200603_1350'), + ] + + operations = [ + migrations.AddField( + model_name='category', + name='archived_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/app/migrations/0013_auto_20200919_2055.py b/app/migrations/0013_auto_20200919_2055.py new file mode 100644 index 0000000..7b7993c --- /dev/null +++ b/app/migrations/0013_auto_20200919_2055.py @@ -0,0 +1,33 @@ +# Generated by Django 3.0.3 on 2020-09-19 13:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0012_category_archived_by'), + ] + + operations = [ + migrations.AlterField( + model_name='materi', + name='author', + field=models.CharField(default='Penyusun', max_length=30), + ), + migrations.AlterField( + model_name='materi', + name='descriptions', + field=models.TextField(default='Deskripsi'), + ), + migrations.AlterField( + model_name='materi', + name='publisher', + field=models.CharField(default='Penerbit', max_length=30), + ), + migrations.AlterField( + model_name='materi', + name='title', + field=models.CharField(default='Judul', max_length=50), + ), + ] diff --git a/app/migrations/0014_rating.py b/app/migrations/0014_rating.py new file mode 100644 index 0000000..69ae6aa --- /dev/null +++ b/app/migrations/0014_rating.py @@ -0,0 +1,30 @@ +# Generated by Django 3.0.3 on 2020-09-29 11:30 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('app', '0013_auto_20200919_2055'), + ] + + operations = [ + migrations.CreateModel( + name='Rating', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ('score', models.IntegerField()), + ('materi', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Materi')), + ('user', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('materi', 'user')}, + }, + ), + ] diff --git a/app/migrations/0015_downloadstatistics_downloader.py b/app/migrations/0015_downloadstatistics_downloader.py new file mode 100644 index 0000000..16780d0 --- /dev/null +++ b/app/migrations/0015_downloadstatistics_downloader.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0.4 on 2020-09-30 04:50 + +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), + ('app', '0014_rating'), + ] + + operations = [ + migrations.AddField( + model_name='downloadstatistics', + name='downloader', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riwayat_unduh', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/app/migrations/0015_reqmaterial.py b/app/migrations/0015_reqmaterial.py new file mode 100644 index 0000000..197e5a1 --- /dev/null +++ b/app/migrations/0015_reqmaterial.py @@ -0,0 +1,22 @@ +# Generated by Django 3.0.3 on 2020-10-01 04:23 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0014_rating'), + ] + + operations = [ + migrations.CreateModel( + name='ReqMaterial', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), + ] diff --git a/app/migrations/0016_ratingcontributor.py b/app/migrations/0016_ratingcontributor.py new file mode 100644 index 0000000..86d787f --- /dev/null +++ b/app/migrations/0016_ratingcontributor.py @@ -0,0 +1,25 @@ +# Generated by Django 3.1.1 on 2020-10-05 14:41 + +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), + ('app', '0015_reqmaterial'), + ] + + operations = [ + migrations.CreateModel( + name='RatingContributor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(auto_now=True)), + ('score', models.IntegerField()), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/app/migrations/0017_auto_20201005_2145.py b/app/migrations/0017_auto_20201005_2145.py new file mode 100644 index 0000000..732caef --- /dev/null +++ b/app/migrations/0017_auto_20201005_2145.py @@ -0,0 +1,19 @@ +# Generated by Django 3.1.1 on 2020-10-05 14:45 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0016_ratingcontributor'), + ] + + operations = [ + migrations.AlterField( + model_name='ratingcontributor', + name='score', + field=models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)]), + ), + ] diff --git a/app/migrations/0018_merge_20201009_0700.py b/app/migrations/0018_merge_20201009_0700.py new file mode 100644 index 0000000..2e5d564 --- /dev/null +++ b/app/migrations/0018_merge_20201009_0700.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1 on 2020-10-09 00:00 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0017_auto_20201005_2145'), + ('app', '0015_downloadstatistics_downloader'), + ] + + operations = [ + ] diff --git a/app/migrations/0019_auto_20201009_1829.py b/app/migrations/0019_auto_20201009_1829.py new file mode 100644 index 0000000..15bec11 --- /dev/null +++ b/app/migrations/0019_auto_20201009_1829.py @@ -0,0 +1,34 @@ +# Generated by Django 3.1 on 2020-10-09 11:29 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('app', '0018_merge_20201009_0700'), + ] + + operations = [ + migrations.AlterField( + model_name='materi', + name='status', + field=models.CharField(choices=[('PENDING', 'Diproses'), ('APPROVE', 'Diterima'), ('DISAPPROVE', 'Ditolak'), ('REVISION', 'Perbaikan'), ('BLOCKED', 'Diblokir')], default='PENDING', max_length=30), + ), + migrations.CreateModel( + name='LaporanMateri', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('laporan', models.TextField(default='', validators=[django.core.validators.MinValueValidator(30), django.core.validators.MaxValueValidator(120)])), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ('is_rejected', models.BooleanField(default=False)), + ('materi', models.ForeignKey(max_length=120, on_delete=django.db.models.deletion.CASCADE, to='app.materi')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/app/migrations/0019_materi__search_vector.py b/app/migrations/0019_materi__search_vector.py new file mode 100644 index 0000000..bd14804 --- /dev/null +++ b/app/migrations/0019_materi__search_vector.py @@ -0,0 +1,19 @@ +# Generated by Django 3.1 on 2020-10-09 11:19 + +import django.contrib.postgres.search +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0018_merge_20201009_0700'), + ] + + operations = [ + migrations.AddField( + model_name='materi', + name='_search_vector', + field=django.contrib.postgres.search.SearchVectorField(editable=False, null=True), + ), + ] diff --git a/app/migrations/0019_materi_yt_video_id.py b/app/migrations/0019_materi_yt_video_id.py new file mode 100644 index 0000000..df8dc1a --- /dev/null +++ b/app/migrations/0019_materi_yt_video_id.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-09 13:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0018_merge_20201009_0700'), + ] + + operations = [ + migrations.AddField( + model_name='materi', + name='yt_video_id', + field=models.CharField(blank=True, max_length=100, null=True), + ), + ] diff --git a/app/migrations/0020_merge_20201009_2039.py b/app/migrations/0020_merge_20201009_2039.py new file mode 100644 index 0000000..80867b0 --- /dev/null +++ b/app/migrations/0020_merge_20201009_2039.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1 on 2020-10-09 13:39 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0019_materi__search_vector'), + ('app', '0019_auto_20201009_1829'), + ] + + operations = [ + ] diff --git a/app/migrations/0021_dislikecomment_likecomment.py b/app/migrations/0021_dislikecomment_likecomment.py new file mode 100644 index 0000000..1ce9111 --- /dev/null +++ b/app/migrations/0021_dislikecomment_likecomment.py @@ -0,0 +1,33 @@ +# Generated by Django 3.1 on 2020-10-09 16:19 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0020_merge_20201009_2039'), + ] + + operations = [ + migrations.CreateModel( + name='LikeComment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ('session_id', models.CharField(max_length=32)), + ('comment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.comment')), + ], + ), + migrations.CreateModel( + name='DislikeComment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ('session_id', models.CharField(max_length=32)), + ('comment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.comment')), + ], + ), + ] diff --git a/app/migrations/0021_materi_release_year.py b/app/migrations/0021_materi_release_year.py new file mode 100644 index 0000000..8294e44 --- /dev/null +++ b/app/migrations/0021_materi_release_year.py @@ -0,0 +1,19 @@ +# Generated by Django 3.1 on 2020-10-09 16:13 + +import app.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0020_merge_20201009_2039'), + ] + + operations = [ + migrations.AddField( + model_name='materi', + name='release_year', + field=models.IntegerField(default=app.models.current_year), + ), + ] diff --git a/app/migrations/0022_merge_20201011_1122.py b/app/migrations/0022_merge_20201011_1122.py new file mode 100644 index 0000000..4b0d5eb --- /dev/null +++ b/app/migrations/0022_merge_20201011_1122.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1 on 2020-10-11 04:22 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0021_dislikecomment_likecomment'), + ('app', '0021_materi_release_year'), + ] + + operations = [ + ] diff --git a/app/migrations/0023_materi_deleted_at.py b/app/migrations/0023_materi_deleted_at.py new file mode 100644 index 0000000..2a695fc --- /dev/null +++ b/app/migrations/0023_materi_deleted_at.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-23 03:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0022_merge_20201011_1122'), + ] + + operations = [ + migrations.AddField( + model_name='materi', + name='deleted_at', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/app/migrations/0023_merge_20201016_1713.py b/app/migrations/0023_merge_20201016_1713.py new file mode 100644 index 0000000..ecb8c79 --- /dev/null +++ b/app/migrations/0023_merge_20201016_1713.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1 on 2020-10-16 10:13 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0022_merge_20201011_1122'), + ('app', '0019_materi_yt_video_id'), + ] + + operations = [ + ] diff --git a/app/migrations/0024_merge_20201026_0812.py b/app/migrations/0024_merge_20201026_0812.py new file mode 100644 index 0000000..adc2f2f --- /dev/null +++ b/app/migrations/0024_merge_20201026_0812.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1 on 2020-10-26 01:12 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0023_merge_20201016_1713'), + ('app', '0023_materi_deleted_at'), + ] + + operations = [ + ] diff --git a/app/migrations/0025_review.py b/app/migrations/0025_review.py new file mode 100644 index 0000000..79b7b89 --- /dev/null +++ b/app/migrations/0025_review.py @@ -0,0 +1,30 @@ +# Generated by Django 3.1 on 2020-10-29 11:22 + +import app.models +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('app', '0024_merge_20201026_0812'), + ] + + operations = [ + migrations.CreateModel( + name='Review', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('username', models.CharField(max_length=100)), + ('profile', models.CharField(default=app.models.getRandomColor, max_length=100)), + ('review', models.TextField(default='review')), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ('materi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.materi')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/app/migrations/0026_submitvisitor.py b/app/migrations/0026_submitvisitor.py new file mode 100644 index 0000000..b8497c7 --- /dev/null +++ b/app/migrations/0026_submitvisitor.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1 on 2020-10-29 13:45 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0025_review'), + ] + + operations = [ + migrations.CreateModel( + name='SubmitVisitor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user_id', models.CharField(max_length=50)), + ('email', models.CharField(max_length=50)), + ('msg', models.CharField(max_length=100)), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), + ] diff --git a/app/models.py b/app/models.py index 661cde6..e531ad1 100644 --- a/app/models.py +++ b/app/models.py @@ -47,7 +47,7 @@ class MateriManager(models.Manager): if self.alive_only: return SoftDeletionQuerySet(self.model).filter(deleted_at=None) return SoftDeletionQuerySet(self.model) - + def search(self, search_text): search_vector = search.SearchVector("title", weight="A") search_query = search.SearchQuery(search_text) @@ -68,10 +68,10 @@ class SoftDeleteModel(models.Model): deleted_at = models.DateTimeField(blank=True, null=True) all_objects = MateriManager(alive_only=False) - + class Meta: abstract = True - + def soft_delete(self): self.deleted_at = timezone.now() self.save() @@ -85,7 +85,7 @@ class Materi(SoftDeleteModel): publisher = models.CharField(max_length=30, default="Penerbit") release_year = models.IntegerField(default=current_year) pages = models.IntegerField(default=0) - descriptions = models.TextField(default="Deskripsi") + descriptions = models.TextField(default="Deskripsi") status = models.CharField(max_length=30, choices=VERIFICATION_STATUS, default=VERIFICATION_STATUS[0][0]) categories = models.ManyToManyField(Category) date_created = models.DateTimeField(default=timezone.now) @@ -124,7 +124,7 @@ class Materi(SoftDeleteModel): def like_count(self): count = Like.objects.filter(materi=self).count() return count - + @property def comment_count(self): count = Comment.objects.filter(materi=self).count() @@ -157,7 +157,7 @@ class Comment(models.Model): def like_count(self): count = LikeComment.objects.filter(comment=self).count() return count - + @property def dislike_count(self): count = DislikeComment.objects.filter(comment=self).count() @@ -265,19 +265,6 @@ class RatingContributor(models.Model): class Meta: unique_together = ["contributor", "user"] -class SubscribeModel(models.Model): - sys_id = models.AutoField(primary_key=True, null=False, blank=True) - email = models.EmailField(null=False, blank=True, max_length=200, unique=True) - status = models.CharField(max_length=64, null=False, blank=True) - created_date = models.DateTimeField(null=False, blank=True) - updated_date = models.DateTimeField(null=False, blank=True) - - class Meta: - app_label = "app" - db_table = "app_subscribe" - - def __str__(self): - return self.email class LaporanMateri(models.Model): materi = models.ForeignKey(Materi, on_delete=models.CASCADE, max_length=120) diff --git a/app/static/images/sub-btn.png b/app/static/images/sub-btn.png deleted file mode 100644 index 81b0489c7c988c9769980e0bca8698a24cc3851d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102953 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	Z) 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 Og@&iApUXO@geCxJ25Pnd diff --git a/app/templates/app/emails/subscription.html b/app/templates/app/emails/subscription.html deleted file mode 100644 index 6a83c2d..0000000 --- a/app/templates/app/emails/subscription.html +++ /dev/null @@ -1,20 +0,0 @@ -<div style="padding: 20px; background: #fafafa;font-size:15px;"> - Hi<br> - Thanks for subscribing to {{ project_name }} newsletter.<br> - We will be sending you latest published articles on <a href="{{ site_url }}">{{ site_url }}</a>. Mail frequency won't be more than twice a month.<br> - We hate spamming as much as you do.<br> - <br> - To confirm your subscription, please click on the link given below. If clicking doesn't work, copy paste the URL in browser.<br> - If you think this is a mistake, just ignore this email and we won't bother you again. - <br> - <br> - <a href="{{ confirmation_url }}">{{ confirmation_url }}</a> - - <br> - <br> - <p> - Note:<br> - This is notification only email. Please do not reply on this email.<br> - You can <a href="{{ contact_us_url }}">contact us here</a>. - </p> -</div> \ No newline at end of file diff --git a/app/templates/app/katalog_materi.html b/app/templates/app/katalog_materi.html index 93c719b..224232c 100644 --- a/app/templates/app/katalog_materi.html +++ b/app/templates/app/katalog_materi.html @@ -48,7 +48,7 @@ </head> <body style="background-color: #f8f8f8;"> - + <!-- Page Content --> <div class="container"> @@ -76,14 +76,14 @@ </div> </div> </header> - + <a href="/download-history/" class="btn-history">Riwayat Unduh</a><br><br> <div id="container-materi-ordering"> <a href="?random=1" class="btn-materi-ordering">Acak Materi</a><br><br> <a href="?recommendation=1" class="btn-materi-ordering">Rekomendasi</a><br><br> </div> - + <div class="container"> <div class="row content"> <div class="col-3 sidebar"> @@ -209,4 +209,4 @@ </html> -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/app/templates/subscribe.html b/app/templates/subscribe.html deleted file mode 100644 index 566776b..0000000 --- a/app/templates/subscribe.html +++ /dev/null @@ -1,12 +0,0 @@ -<div style="border: 1px solid darkgreen; border-radius: 2px; padding:10px; text-align: center;"> - <div><strong>SUBSCRIBE</strong></div> - <div style="margin-bottom: 10px;">Please subscribe to get the latest articles in your mailbox.</div> - <div> - <form action="{% url 'subscribe' %}" method="post" class="form-horizontal"> - {% csrf_token %} - <input type="email" name="email" class="form-control" placeholder="Your Email ID Please" required> - <br> - <input type="submit" value="Subscribe" class="btn btn-primary btn-sm"> - </form> - </div> -</div> \ No newline at end of file diff --git a/app/tests.py b/app/tests.py index 2a0a6e0..9f10c73 100644 --- a/app/tests.py +++ b/app/tests.py @@ -67,9 +67,6 @@ from .views import ( ) from app.forms import SuntingProfilForm, year_choices from app.utils.fileManagementUtil import get_random_filename, remove_image_exifdata -import pandas as pd -from django.core import mail -from app.utils.email_utility import send_gmail from app.utils.PasswordValidator import PasswordPolicyValidator ERROR_403_MESSAGE = "Kamu harus login untuk mengakses halaman ini" @@ -229,7 +226,7 @@ class DaftarKatalogSortingByJumlahTampilanTest(TestCase): self.client.get(self.url) response = self.client.get("/?sort=jumlah_tampilan") self.assertRegex(str(response.content), rf'.*Materi 2.*Materi 1.*') - + class DaftarKatalogPerKontributorTest(TestCase): def setUp(self): self.client = Client() @@ -325,13 +322,13 @@ class DetailMateriTest(TestCase): "ExampleCover921.jpg", b"Test file") self.content = SimpleUploadedFile("ExampleFile921.pdf", b"Test file") - self.materi1 = Materi.objects.create(title="Materi 1", author="Agas", - uploader=self.contributor, publisher="Kelas SC", - descriptions="Deskripsi Materi 1", status="APPROVE", + self.materi1 = Materi.objects.create(title="Materi 1", author="Agas", + uploader=self.contributor, publisher="Kelas SC", + descriptions="Deskripsi Materi 1", status="APPROVE", cover=self.cover, content=self.content) - self.materi2 = Materi.objects.create(title="Materi 2", author="Agad", - uploader=self.contributor, publisher="Kelas SM", - descriptions="Deskripsi Materi 2", status="APPROVE", + self.materi2 = Materi.objects.create(title="Materi 2", author="Agad", + uploader=self.contributor, publisher="Kelas SM", + descriptions="Deskripsi Materi 2", status="APPROVE", cover=self.cover, content=self.content) self.url = "/materi/" + str(self.materi1.id) + "/" self.download_url1 = self.url + "unduh" @@ -459,10 +456,10 @@ class DetailMateriTest(TestCase): comment = Comment.objects.get(comment="This is new comment by Anonymous") response = self.client.get(url_materi) session_id = response.context["session_id"] - + payload = {"comment": comment, "session_id": session_id} self.client.post("/comment/dislike/", payload) - + self.client.post("/comment/dislike/", payload) num_of_comment_dislikes = DislikeComment.objects.filter(comment=comment, session_id=session_id).count() self.assertEqual(num_of_comment_dislikes, 0) @@ -476,10 +473,10 @@ class DetailMateriTest(TestCase): comment = Comment.objects.get(comment="This is new comment by Anonymous") response = self.client.get(url_materi) session_id = response.context["session_id"] - + payload = {"comment": comment, "session_id": session_id} self.client.post("/comment/like/", payload) - + self.client.post("/comment/like/", payload) num_of_comment_likes = LikeComment.objects.filter(comment=comment, session_id=session_id).count() self.assertEqual(num_of_comment_likes, 0) @@ -519,9 +516,9 @@ class DetailMateriTest(TestCase): is_subscribing_to_material_comments=True ) - material = Materi.objects.create(title="Materi-subscribed", author="Tester", - uploader=contributor_subscribed, publisher="Kelas PMPL", - descriptions="Deskripsi Materi subscribed", status="APPROVE", + material = Materi.objects.create(title="Materi-subscribed", author="Tester", + uploader=contributor_subscribed, publisher="Kelas PMPL", + descriptions="Deskripsi Materi subscribed", status="APPROVE", cover=self.cover, content=self.content) url = "/materi/" + str(material.id) + "/" self.client.login(**self.contributor_credential) # comment with other user @@ -546,9 +543,9 @@ class DetailMateriTest(TestCase): is_subscribing_to_material_comments=False ) - material = Materi.objects.create(title="Materi-not-subscribed", author="Tester", - uploader=contributor_not_subscribed, publisher="Kelas PMPL", - descriptions="Deskripsi Materi non-subscribed", status="APPROVE", + material = Materi.objects.create(title="Materi-not-subscribed", author="Tester", + uploader=contributor_not_subscribed, publisher="Kelas PMPL", + descriptions="Deskripsi Materi non-subscribed", status="APPROVE", cover=self.cover, content=self.content) url = "/materi/" + str(material.id) + "/" self.client.login(**self.contributor_credential) # comment with other user @@ -576,9 +573,9 @@ class DetailMateriTest(TestCase): is_subscribing_to_material_comments=True ) - material = Materi.objects.create(title="Materi-subscribed", author="Tester", - uploader=contributor_subscribed, publisher="Kelas PMPL", - descriptions="Deskripsi Materi subscribed", status="APPROVE", + material = Materi.objects.create(title="Materi-subscribed", author="Tester", + uploader=contributor_subscribed, publisher="Kelas PMPL", + descriptions="Deskripsi Materi subscribed", status="APPROVE", cover=self.cover, content=self.content) url = "/materi/" + str(material.id) + "/" self.client.login(**contributor_subscribed_credentials) # comment with the same user @@ -656,7 +653,7 @@ class DetailMateriTest(TestCase): count = Comment.objects.all().filter(comment="This is new comment by Anonymous").count() self.assertEqual(count, 1) - + def test_review_models_can_create_new_object(self): test = Review.objects.create( username="saul", profile="121212", review="232323") @@ -703,7 +700,7 @@ class DetailMateriTest(TestCase): self.client.post(url, {"review": "This is new review by Anonymous"}) response = self.client.get(url) self.assertContains(response, "Anonymous") - + def test_detail_materi_contains_review_count(self): url = self.url self.client.login(**self.contributor_credential) @@ -734,25 +731,25 @@ class DetailMateriTest(TestCase): def test_hasil_citasi_APA_materi_has_no_published_date(self): response = self.client.get(self.url) - expected = self.materi1.author + " . (n.d) . " + self.materi1.title + " . " + self.materi1.publisher + expected = self.materi1.author + " . (n.d) . " + self.materi1.title + " . " + self.materi1.publisher self.assertIn(expected, response.context["citationAPA"]) self.assertIn(expected, response.context["citationAPA"]) def test_hasil_citasi_APA_materi_has_published_date(self): response = self.client.get(self.materi_with_published_date_url) - published_date = self.materi_with_published_date.published_date.strftime("%Y-%m-%d %H:%M") - expected = ( - self.materi_with_published_date.author - + " . (" - + published_date - + ") . " - + self.materi_with_published_date.title - + " . " - + self.materi_with_published_date.publisher - ) + published_date = self.materi_with_published_date.published_date.strftime("%Y-%m-%d %H:%M") + expected = ( + self.materi_with_published_date.author + + " . (" + + published_date + + ") . " + + self.materi_with_published_date.title + + " . " + + self.materi_with_published_date.publisher + ) self.assertIn(expected, response.context["citationAPA"]) - + def test_citation_IEEE_button(self): response = self.client.get(self.url) self.assertContains(response, "Citate IEEE") @@ -764,19 +761,19 @@ class DetailMateriTest(TestCase): current_month = current_date.strftime("%b") current_year = str(current_date.year) - expected = ( - "Agas, " - + "Materi 1. " - + "Kelas SC, n.d. " - + "Accessed on: " - + current_month - + ". " - + current_day - + ", " - + current_year - + ". [Online]. " - + "Available: http://testserver" - + self.url + expected = ( + "Agas, " + + "Materi 1. " + + "Kelas SC, n.d. " + + "Accessed on: " + + current_month + + ". " + + current_day + + ", " + + current_year + + ". [Online]. " + + "Available: http://testserver" + + self.url ) self.assertIn(expected, response.context["citationIEEE"]) @@ -859,7 +856,7 @@ class DetailMateriTest(TestCase): self.assertNotEqual(context1['materi_download_count'], context2['materi_download_count']) self.assertEqual(context1['materi_download_count'], 3) self.assertEqual(context2['materi_download_count'], 2) - + def test_download_count_displayed_on_template_when_no_download(self): response = self.client.get(self.url) html = response.content.decode("utf-8") @@ -904,12 +901,12 @@ class DetailMateriTest(TestCase): self.check_materi_info_not_in_html(self.dcount_info_name, dcount_materi2, html) self.check_materi_info_in_html(self.dcount_info_name, dcount_materi2, html2) self.check_materi_info_not_in_html(self.dcount_info_name, dcount_materi1, html2) - + def test_like_count_displayed_on_template_when_no_like(self): response = self.client.get(self.url) html = response.content.decode("utf-8") self.check_materi_info_in_html(self.lcount_info_name, 0, html) - + def test_like_count_displayed_on_template_when_single_like(self): payload = { 'materi_id': self.materi1.id, @@ -919,8 +916,8 @@ class DetailMateriTest(TestCase): response = self.client.get(self.url) html = response.content.decode("utf-8") - self.check_materi_info_in_html(self.lcount_info_name, 1, html) - + self.check_materi_info_in_html(self.lcount_info_name, 1, html) + def test_like_count_displayed_on_template_when_multiple_like(self): payload1 = { 'materi_id': self.materi1.id, @@ -932,17 +929,17 @@ class DetailMateriTest(TestCase): } self.client.post(self.like_url, payload1) self.client.post(self.like_url, payload2) - + response = self.client.get(self.url) html = response.content.decode("utf-8") self.check_materi_info_in_html(self.lcount_info_name, 2, html) - + def test_like_count_displayed_on_template_when_unlike(self): payload = { 'materi_id': self.materi1.id, 'session_id': "dummysession" } - + # Like materi once self.client.post(self.like_url, payload) response = self.client.get(self.url) @@ -984,11 +981,11 @@ class PostsViewTest(TestCase): for j in range (LIKES_COUNT_PER_POST[i]): Like.objects.create( - timestamp=datetime.now(), - materi=post, + timestamp=datetime.now(), + materi=post, session_id=("dummysession-" + str(i) + '-' + str(j)) ) - + for i, post_id in enumerate(post_comment_group_dict): post = post_comment_group_dict[post_id]["data"] @@ -1130,13 +1127,13 @@ class UploadPageTest(TestCase): response = Client().get("/fake/") self.assertEqual(response.status_code, 404) - def test_upload_page_url_admin_doesnt_exist(self): + def test_upload_page_url_admin_doesnt_exist(self): self.client.login(email="admin@gov.id", password="admin") response = self.client.get("/unggah/") self.assertEqual(response.status_code, 403) - def test_upload_page_url_admin_cant_upload(self): + def test_upload_page_url_admin_cant_upload(self): self.client.login(email="admin@gov.id", password="admin") response = self.client.post("/unggah/") @@ -1274,7 +1271,7 @@ class UploadExcelPageTest(TestCase): with open(file_name, 'rb') as fp: response = self.client.post("/unggah_excel/", {'excel': fp}) - + messages = list(dj_messages.get_messages(response.wsgi_request)) msg_text = messages[0].message @@ -1292,7 +1289,7 @@ class UploadExcelPageTest(TestCase): with open(file_name, 'rb') as fp: response = self.client.post("/unggah_excel/", {'excel': fp}) - + messages = list(dj_messages.get_messages(response.wsgi_request)) msg_text = messages[0].message @@ -1311,7 +1308,7 @@ class UploadExcelPageTest(TestCase): with open(file_name, 'rb') as fp: response = self.client.post("/unggah_excel/", {'excel': fp}) - + messages = list(dj_messages.get_messages(response.wsgi_request)) msg_text = messages[0].message @@ -1330,7 +1327,7 @@ class UploadExcelPageTest(TestCase): with open(file_name, 'rb') as fp: response = self.client.post("/unggah_excel/", {'excel': fp}) - + messages = list(dj_messages.get_messages(response.wsgi_request)) msg_text = messages[0].message @@ -1351,12 +1348,12 @@ class UploadExcelPageTest(TestCase): } categories = ['Computer Science','Machine Learning','Deep Learning'] - + file_name, data_frame = self.create_dummy_excel(field_lengths=field_lengths, categories=categories) with open(file_name, 'rb') as fp: self.client.post("/unggah_excel/", {'excel': fp}) - + title = data_frame['Title'][0] materi = Materi.objects.get(title=title) default_path = 'book-cover-placeholder.png' @@ -1370,11 +1367,11 @@ class UploadExcelPageTest(TestCase): password="kontributor") response = self.client.get("/unggah_excel/?template=1") - + self.assertEquals(response['Content-Type'],'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') self.assertEquals(response['Content-Disposition'],'attachment; filename=template.xlsx') - + @@ -1481,14 +1478,14 @@ class DeleteMateriTest(TestCase): self.client.login(**self.contributor_credential) response = self.client.get(self.url) self.assertEqual(response.status_code, 302) - + def test_url_soft_delete_materi_is_success_as_admin(self): self.client.login(**self.admin_credential) response = self.client.get(self.url) - self.assertEqual(response.status_code, 302) + self.assertEqual(response.status_code, 302) self.materi1.refresh_from_db() self.assertNotEqual(self.materi1.deleted_at, None) - + def test_url_soft_delete_materi_is_success_as_superuser(self): self.client.login(**self.superuser_credential) response = self.client.get(self.url) @@ -1515,7 +1512,7 @@ class ProfilViewTest(TestCase): self.assertEqual(found.func.__name__, self.view.as_view().__name__) def _request_as_user(self, credentials): - self.client = Client() + self.client = Client() self.client.login(**credentials) return self.client.get(self.url) @@ -1557,7 +1554,7 @@ class SuntingProfilViewTest(TestCase): self.assertEqual(found.func.__name__, self.view.as_view().__name__) def _request_as_user(self, credentials): - self.client = Client() + self.client = Client() self.client.login(**credentials) return self.client.get(self.url) @@ -1938,7 +1935,7 @@ class RevisiMateriTest(TestCase): # Logout self.client.logout() - + class GenerateDummyCommandTest(TestCase): def setUp(self): @@ -2422,7 +2419,7 @@ class RatingContributorTest(TransactionTestCase): response = self.client.get(self.url) self.assertContains(response=response, text=f"Rating: {mean(avg)}", count=1) self.assertContains(response=response, text=f"oleh: {len(avg)} orang", count=1) - + def test_not_authenticated_user_should_not_able_to_add_rating(self): response_post = self.client.post(self.url, data={ "contributor":self.contributor.id, @@ -2432,11 +2429,11 @@ class RatingContributorTest(TransactionTestCase): response_get = self.client.get(self.url) self.assertEqual(response_post.status_code, 403) self.assertContains(response_get, "Kamu harus login untuk memberi rating") - + def test_not_authenticated_user_should_not_able_to_delete_rating(self): response_post = self.client.post(self.url, data={"delete":True}) self.assertEqual(response_post.status_code, 403) - + def test_authenticated_user_should_not_delete_rating_if_has_not_been_rated(self): self.client.login(**self.admin_credential) self.client.post(self.url, data={ @@ -2444,15 +2441,15 @@ class RatingContributorTest(TransactionTestCase): "user":self.admin.id, "score":3 }) - + self.assertEqual(1, RatingContributor.objects.filter(contributor=self.contributor).count()) self.client.logout() self.client.login(**self.anonymous_credential) self.client.post(self.url, data={"delete":True}) - + self.assertEqual(1, RatingContributor.objects.filter(contributor=self.contributor).count()) - + def test_authenticated_user_should_delete_rating_if_has_been_rated(self): self.client.login(**self.admin_credential) self.client.post(self.url, data={ @@ -2470,7 +2467,7 @@ class RatingContributorTest(TransactionTestCase): self.assertContains(response, 'Rating: 0') self.assertContains(response, 'oleh: 0 orang') self.assertEqual(0, RatingContributor.objects.filter(contributor=self.contributor).count()) - + def test_average_still_be_correct_when_rating_was_deleted(self): scores = [2,4] self.client.login(**self.admin_credential) @@ -2495,7 +2492,7 @@ class RatingContributorTest(TransactionTestCase): response = self.client.get(self.url) self.assertContains(response, f'Rating: {scores[0]}') self.assertContains(response, 'oleh: 1 orang') - + def test_authenticated_user_should_update_rating_if_has_been_rated(self): self.client.login(**self.anonymous_credential) self.client.post(self.url, data={ @@ -2511,7 +2508,7 @@ class RatingContributorTest(TransactionTestCase): response = self.client.get(self.url) self.assertContains(response, 'Rating: 3') self.assertContains(response, 'oleh: 1 orang') - + def test_authenticated_user_should_not_update_rating_if_has_not_been_rated(self): self.client.login(**self.anonymous_credential) response = self.client.get(self.url) @@ -2522,7 +2519,7 @@ class RatingContributorTest(TransactionTestCase): response = self.client.get(self.url) self.assertContains(response, 'Rating: 0') self.assertContains(response, 'oleh: 0 orang') - + class UserDownloadHistoryTest(TestCase): def setUp(self): @@ -2561,25 +2558,25 @@ class UserDownloadHistoryTest(TestCase): self.materi1 = Materi.objects.first() self.download_url = f"/materi/{self.materi1.id}/unduh" self.history_url = "/download-history/" - + def test_multiple_insert_download_statistic_with_user(self): DownloadStatistics(materi=self.materi1, downloader=self.user1_anonim).save() num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() self.assertEqual(num_of_downloads, 1) - + DownloadStatistics(materi=self.materi1, downloader=self.user1_anonim).save() num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() self.assertEqual(num_of_downloads, 2) - + def test_download_statistics_bound_to_specific_user(self): DownloadStatistics(materi=self.materi1, downloader=self.user1_anonim).save() num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() self.assertEqual(num_of_downloads, 1) - + DownloadStatistics(materi=self.materi1).save() num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() self.assertEqual(num_of_downloads, 1) - + DownloadStatistics(materi=self.materi1, downloader=self.user2_anonim).save() user1_num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() user2_num_of_downloads = self.user2_anonim.riwayat_unduh.all().count() @@ -2589,14 +2586,14 @@ class UserDownloadHistoryTest(TestCase): def test_registered_user_download(self): # Login self.client.login(**self.user1_credential) - + self.client.get(self.download_url) num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() self.assertEqual(num_of_downloads, 1) - + # Logout self.client.logout() - + def test_unregistered_user_download(self): self.client.get(self.download_url) downloaded_materi = self.client.session['downloaded_materi'] @@ -2614,10 +2611,10 @@ class UserDownloadHistoryTest(TestCase): self.client.get(self.download_url) num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() self.assertEqual(num_of_downloads, 2) - + # Logout self.client.logout() - + def test_unregistered_user_multiple_download(self): self.client.get(self.download_url) downloaded_materi = self.client.session['downloaded_materi'] @@ -2630,27 +2627,27 @@ class UserDownloadHistoryTest(TestCase): num_of_downloads = DownloadStatistics.objects.filter( pk__in=downloaded_materi).count() self.assertEqual(num_of_downloads, 2) - + def test_registered_user_doesnt_use_session_when_download(self): # Login self.client.login(**self.user1_credential) - + self.client.get(self.download_url) self.assertFalse('downloaded_materi' in self.client.session) - + # Logout self.client.logout() - + def test_download_history_bound_to_specific_user(self): # Login Anonym 1 self.client.login(**self.user1_credential) self.client.get(self.download_url) num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() self.assertEqual(num_of_downloads, 1) - + # Logout Anonym 1 self.client.logout() - + # Unregistered User download self.client.get(self.download_url) user1_num_of_downloads = self.user1_anonim.riwayat_unduh.all().count() @@ -2659,7 +2656,7 @@ class UserDownloadHistoryTest(TestCase): pk__in=downloaded_materi).count() self.assertEqual(user1_num_of_downloads, 1) self.assertEqual(guest_num_of_downloads, 1) - + # Login Anonym 2 self.client.login(**self.user2_credential) self.client.get(self.download_url) @@ -2668,7 +2665,7 @@ class UserDownloadHistoryTest(TestCase): self.assertEqual(user1_num_of_downloads, 1) self.assertEqual(guest_num_of_downloads, 1) self.assertEqual(user2_num_of_downloads, 1) - + # Logout Anonym 2 self.client.logout() @@ -2688,42 +2685,42 @@ class DownloadHistoryViewTest(TestCase): **self.contributor_credential, name="Kontributor", is_contributor=True ) self.client = Client() - + content1 = b"Test file" content2 = b"File Test" - + self.cover1 = SimpleUploadedFile("cover1.jpg",content1) self.content1 = SimpleUploadedFile("content1.txt",content1) - + self.cover2 = SimpleUploadedFile("cover2.jpg",content2) self.content2 = SimpleUploadedFile("content2.txt",content2) - + self.materi1 = Materi.objects.create(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="PENDING", cover=self.cover1, content=self.content1) self.materi2 = Materi.objects.create(title="Materi 2", author="Danin", uploader=self.contributor, publisher="Kelas DDP", descriptions="Deskripsi Materi 2", status="PENDING", cover=self.cover2, content=self.content2) - + self.download_url1 = f"/materi/{self.materi1.id}/unduh" self.download_url2 = f"/materi/{self.materi2.id}/unduh" self.history_url = "/download-history/" - + # Login self.client.login(**self.user_credential) def tearDown(self): # Logout self.client.logout() - + def test_allow_registered_user(self): response = self.client.get(self.history_url) self.assertEqual(response.status_code, 200) - + def test_allow_unregistered_user(self): # Forced Logout self.client.logout() - + response = self.client.get(self.history_url) self.assertEqual(response.status_code, 200) @@ -2735,14 +2732,14 @@ class DownloadHistoryViewTest(TestCase): response = self.client.get(self.history_url) resp_html = response.content.decode('utf8') self.assertIn(self.user_anonim.name, resp_html) - + def test_registered_user_download_history_correctly_displayed(self): self.client.get(self.download_url1) self.client.get(self.download_url2) self.client.get(self.download_url1) - + jkt_timezone = timezone(TIME_ZONE) - + download_history = self.user_anonim.riwayat_unduh.all() response = self.client.get(self.history_url) resp_html = response.content.decode('utf8') @@ -2750,19 +2747,19 @@ class DownloadHistoryViewTest(TestCase): downloaded_materi = riwayat.materi self.assertIn(downloaded_materi.title, resp_html) self.assertIn(downloaded_materi.author, resp_html) - + jkt_timestamp = riwayat.timestamp.astimezone(jkt_timezone) self.assertIn(jkt_timestamp.strftime("%d %B %Y %H:%M:%S"), resp_html) - + def test_unregistered_user_download_history_correctly_displayed(self): self.client.logout() self.client.get(self.download_url1) self.client.get(self.download_url2) self.client.get(self.download_url1) - + jkt_timezone = timezone(TIME_ZONE) - + response = self.client.get(self.history_url) resp_html = response.content.decode('utf8') for riwayat_id in self.client.session['downloaded_materi']: @@ -2770,19 +2767,19 @@ class DownloadHistoryViewTest(TestCase): downloaded_materi = riwayat.materi self.assertIn(downloaded_materi.title, resp_html) self.assertIn(downloaded_materi.author, resp_html) - + jkt_timestamp = riwayat.timestamp.astimezone(jkt_timezone) self.assertIn(jkt_timestamp.strftime("%d %B %Y %H:%M:%S"), resp_html) - + def test_download_history_not_display_if_user_changed(self): self.client.get(self.download_url1) self.client.get(self.download_url2) self.client.get(self.download_url1) self.client.logout() - + jkt_timezone = timezone(TIME_ZONE) - + download_history = self.user_anonim.riwayat_unduh.all() response = self.client.get(self.history_url) resp_html = response.content.decode('utf8') @@ -2790,23 +2787,23 @@ class DownloadHistoryViewTest(TestCase): downloaded_materi = riwayat.materi self.assertNotIn(downloaded_materi.title, resp_html) self.assertNotIn(downloaded_materi.author, resp_html) - + jkt_timestamp = riwayat.timestamp.astimezone(jkt_timezone) self.assertNotIn(jkt_timestamp.strftime("%d %B %Y %H:%M:%S"), resp_html) - + def test_unregistered_user_download_history_wont_be_saved_if_user_changes(self): self.client.logout() self.client.get(self.download_url1) self.client.get(self.download_url2) self.client.get(self.download_url1) - + self.client.get(self.history_url) self.client.login(**self.user_credential) self.client.logout() self.assertFalse('downloaded_materi' in self.client.session) - + def test_download_history_sorted_by_download_time(self): # download with 1 second interval to differ download time self.client.get(self.download_url1) @@ -2816,15 +2813,15 @@ class DownloadHistoryViewTest(TestCase): self.client.get(self.download_url1) sleep(1) self.client.get(self.download_url2) - + response = self.client.get(self.history_url) resp_html = response.content.decode('utf8') - + table_html = ("<table" + resp_html.split("<table")[1]).split("</table>")[0] + "</table>" soup = BeautifulSoup(table_html, 'html.parser') histories_html = soup.find('tbody').find_all('tr') prev_timestamp = None - + for riwayat_html in histories_html: materi_data = riwayat_html.find_all("td") date_format = "%d %B %Y %H:%M:%S" @@ -2832,7 +2829,7 @@ class DownloadHistoryViewTest(TestCase): if prev_timestamp: self.assertTrue(prev_timestamp > materi_timestamp) prev_timestamp = materi_timestamp - + def test_no_history_display_message(self): no_history_msg = "Anda belum mengunduh materi. Silahkan unduh materi yang anda butuhkan" response = self.client.get(self.history_url) @@ -2841,9 +2838,9 @@ class DownloadHistoryViewTest(TestCase): class MateriModelTest(TestCase): - + def setUp(self): - self.contributor = User.objects.create( + self.contributor = User.objects.create( email="kontributor@gov.id", password="passwordtest", name="kontributor", @@ -2930,7 +2927,7 @@ class RandomizedMateriTest(TestCase): response = Client().get("/?random=1") self.assertIn("Materi 1", response.content.decode()) self.assertIn("Materi 2", response.content.decode()) - + class YearChoicesTest(TestCase): def test_release_year_contains_the_right_current_year(self): now = dt.date.today().year @@ -2996,7 +2993,7 @@ class YTUrlVideoTest(TestCase): self.setUpImage() self.content = SimpleUploadedFile("ExampleFile221.pdf", b"Test file") self.category = Category.objects.create(id="1", name="medis", description="kategori medis") - + @override_settings(MEDIA_ROOT=tempfile.gettempdir()) def setUpImage(self): from django.core.files.uploadedfile import InMemoryUploadedFile @@ -3029,7 +3026,7 @@ class YTUrlVideoTest(TestCase): "yt_video_id":"jNwz4L9MGVY"} ) self.assertTrue(Materi.objects.get(title="Materi 1")) - + def test_upload_materi_with_invalid_yt_video_id(self): self.client.login(**self.contributor_credential) self.client.post( @@ -3039,7 +3036,7 @@ class YTUrlVideoTest(TestCase): "yt_video_id":"randomId"} ) self.assertEqual(Materi.objects.filter(title="Materi 2").count(), 0) - + def test_detail_materi_has_video_if_yt_video_id_not_empty(self): self.test_upload_materi_with_valid_yt_video_id() pk = Materi.objects.get(title="Materi 1").pk @@ -3090,7 +3087,7 @@ class ChangePasswordTest(TestCase): # Logout self.client.logout() - + class SeeRatedMateriByUser(TestCase): def setUp(self): self.client = Client() @@ -3265,28 +3262,28 @@ class PasswordValidatorPolicyTest(TestCase): self.password_length_lower_than_8 = "P4ss!" self.password_enforcing_policy = "Passw0rd!" self.validator = PasswordPolicyValidator() - + def test_using_password_no_lowercase(self): self.assertRaises(ValidationError, self.validator.validate, self.password_no_lowercase) def test_using_password_no_upprcase(self): self.assertRaises(ValidationError, self.validator.validate, self.password_no_uppercase) - + def test_using_password_no_digit(self): self.assertRaises(ValidationError, self.validator.validate, self.password_no_digit) def test_using_password_no_special_char(self): self.assertRaises(ValidationError, self.validator.validate, self.password_no_special_char) - + def test_using_password_with_length_less_than_8(self): self.assertRaises(ValidationError, self.validator.validate, self.password_length_lower_than_8) - + def test_using_password_using_correct_policy(self): self.assertEquals(self.validator.validate(self.password_enforcing_policy), None) - + class LandingPageNavbarTest(TestCase): - + def setUp(self): self.client = Client() self.contributor_credential = { @@ -3445,3 +3442,4 @@ class MateriRecommendationTest(TestCase): response = Client().get("/?recommendation=1") list = [int(id) for id in re.findall(r"Materi\s(\d+)[^\d]", response.content.decode())] self.assertEqual(list, [1, 2]) + diff --git a/app/urls.py b/app/urls.py index 06e7d42..a8c7281 100644 --- a/app/urls.py +++ b/app/urls.py @@ -41,7 +41,4 @@ urlpatterns = [ path("password_success/", views.password_success, name="password_success"), path("given-rating/", views.see_given_rating, name="see_given_rating"), path("submit-visitor/", SubmitVisitorView.as_view(), name="submit-visitor"), - path(r'subscribe/', views.subscribe, name='subscribe'), - path(r'subscribeform/', views.subscribeform, name='subscribeform'), - path(r'subscription_confirmation/', views.subscription_confirmation, name='subscription_confirmation'), ] diff --git a/app/utils/email_utility.py b/app/utils/email_utility.py deleted file mode 100644 index bc72075..0000000 --- a/app/utils/email_utility.py +++ /dev/null @@ -1,90 +0,0 @@ -import logging, traceback -from django.urls import reverse -import requests -from django.template.loader import get_template -from django.utils.html import strip_tags -from django.conf import settings -import smtplib -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -import email -import email.mime.application -from django.utils.html import strip_tags - - -def send_email(data): - try: - url = "https://api.mailgun.net/v3/<domain-name>/messages" - status = requests.post( - url, - auth=("api", settings.MAILGUN_API_KEY), - data={"from": "OKI <https://app.mailgun.com/app/sending/domains/sandbox34675edbad2a4ab08e896c3bd80524ec.mailgun.org>", - "to": [data["email"]], - "subject": data["subject"], - "text": data["plain_text"], - "html": data["html_text"]} - ) - logging.getLogger("info").info("Mail sent to " + data["email"] + ". status: " + str(status)) - return status - except Exception as e: - logging.getLogger("error").error(traceback.format_exc()) - return False - - -def send_subscription_email(email, subscription_confirmation_url): - data = dict() - data["confirmation_url"] = subscription_confirmation_url - data["subject"] = "Please Confirm The Subscription" - data["email"] = email - template = get_template("app/emails/subscription.html") - data["html_text"] = template.render(data) - data["plain_text"] = strip_tags(data["html_text"]) - return send_email(data) - - -def send_gmail(email, subscription_confirmation_url): - # create message - msg = MIMEMultipart('alternative') - msg['Subject'] = "Please verify your mail" - msg['From'] = "pmplmailer@gmail.com" - msg['To'] = email - - # create body - html_text = '<div style="border:1px solid black">Thanks for subscribing to Us. Please click this link to activate your subscription : ' + subscription_confirmation_url + '</div>' - plain_text = strip_tags(html_text) - - # Create the body of the message (a plain-text and an HTML version). - # Record the MIME types of both parts - text/plain and text/html. - part1 = MIMEText(plain_text, 'plain') - part2 = MIMEText(html_text, 'html') - - # Attach image if any - - # Attach parts into message container. - # According to RFC 2046, the last part of a multipart message, in this case - # the HTML message, is best and preferred. - msg.attach(part1) - msg.attach(part2) - - # Send the message via local SMTP server. - host = "smtp.gmail.com" - port = 587 - mail = smtplib.SMTP(host, port, timeout=60) - mail.ehlo() - mail.starttls() - - # Add recepiens, cc or bcc if any - recepient = [msg["To"]] - - # username and password of gmail id which will be used to send email - username = "pmplmailer@gmail.com" - password = "asdf1234$" - - # login using credentials - mail.login(username, password) - - # send email - mail.sendmail(msg["From"], recepient, msg.as_string()) - mail.quit() - - return "\nSent\n" \ No newline at end of file diff --git a/app/utils/encryption_util.py b/app/utils/encryption_util.py deleted file mode 100644 index a448767..0000000 --- a/app/utils/encryption_util.py +++ /dev/null @@ -1,37 +0,0 @@ -from cryptography.fernet import Fernet -import base64 -import logging -import traceback -from django.conf import settings - -#this is your "password/ENCRYPT_KEY". keep it in settings.py file -#key = Fernet.generate_key() - -def encrypt(txt): - try: - # convert integer etc to string first - txt = str(txt) - # get the key from settings - cipher_suite = Fernet(settings.ENCRYPT_KEY) # key should be byte - # #input should be byte, so convert the text to byte - encrypted_text = cipher_suite.encrypt(txt.encode('ascii')) - # encode to urlsafe base64 format - encrypted_text = base64.urlsafe_b64encode(encrypted_text).decode("ascii") - return encrypted_text - except Exception as e: - # log the error if any - logging.getLogger("error_logger").error(traceback.format_exc()) - return None - - -def decrypt(txt): - try: - # base64 decode - txt = base64.urlsafe_b64decode(txt) - cipher_suite = Fernet(settings.ENCRYPT_KEY) - decoded_text = cipher_suite.decrypt(txt).decode("ascii") - return decoded_text - except Exception as e: - # log the error - logging.getLogger("error_logger").error(traceback.format_exc()) - return None \ No newline at end of file diff --git a/app/views.py b/app/views.py index 306e840..a0062ed 100644 --- a/app/views.py +++ b/app/views.py @@ -1,9 +1,5 @@ import mimetypes import os -import re -import time -import logging -import traceback from io import BytesIO import django @@ -19,7 +15,8 @@ from django.core.paginator import Paginator from django.db.models import Q, Avg from django.http import (Http404, HttpResponse, HttpResponseRedirect, JsonResponse) -from django.shortcuts import get_object_or_404, redirect, render +from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import render from django.template import loader from django.urls import reverse from django.urls import reverse_lazy @@ -37,10 +34,6 @@ from app.models import ( SubmitVisitor ) from authentication.models import User -from app.utils.encryption_util import encrypt, decrypt -from app.utils.email_utility import send_subscription_email, send_gmail -from app.models import SubscribeModel -from datetime import datetime from .services import DafterKatalogService, DetailMateriService, LikeDislikeService, MateriFieldValidationHelperService, \ DownloadViewMateriHelperService, UploadMateriService, EditProfileService, RevisiMateriService, \ DownloadHistoryService, GoogleDriveUploadService @@ -212,7 +205,7 @@ class DetailMateri(TemplateView): from_email = getattr(settings, 'EMAIL_HOST_USER'), recipient_list = [materi_uploader.email,], fail_silently = False, - ) + ) elif (review_text != None): review = Review.objects.create( review=review_text, username=DetailMateriService.get_user_name(request), materi=materi, user=user_obj @@ -292,98 +285,6 @@ def add_rating_materi(request): ) return JsonResponse({"success": False, "msg": "Forbidden"}, status=403) -def subscribeform(request): - return render(request, 'subscribe.html', ) - -def subscribe(request): - post_data = request.POST.copy() - email = post_data.get("email", None) - - error_msg = validate_email(email) - if error_msg: - messages.error(request, error_msg) - return HttpResponseRedirect(reverse('subscribe')) - - token = encrypt(email + "_" + str(time.time())) - subscription_confirmation_url = request.build_absolute_uri( reverse('subscription_confirmation')) + "?token=" + token - status = send_gmail(email, subscription_confirmation_url) - save_status = save_email(email) - - if save_status: - token = encrypt(email + "_" + str(time.time())) - subscription_confirmation_url = request.build_absolute_uri(reverse('subscription_confirmation')) + "?token=" + token - status = send_gmail(email, subscription_confirmation_url) - if not status: - SubscribeModel.objects.get(email=email).delete() - logging.getLogger("info").info( - "Deleted the record from Subscribe table for " + email + " as email sending failed. status: " + str( - status)) - else: - msg = "Mail sent to email Id '" + email + "'. Please confirm your subscription by clicking on " \ - "confirmation link provided in email. " \ - "Please check your spam folder as well." - messages.success(request, msg) - return HttpResponse(msg) - else: - msg = "Some error occurred. Please try in some time. Meanwhile we are looking into it." - messages.error(request, msg) - return HttpResponse(msg) - return HttpResponseRedirect(reverse('subscribeform')) - -def subscription_confirmation(request): - if "POST" == request.method: - raise Http404 - - token = request.GET.get("token", None) - - if not token: - logging.getLogger("warning").warning("Invalid Link ") - messages.error(request, "Invalid Link") - return HttpResponseRedirect(reverse('subscribeform')) - - token = decrypt(token) - if token: - token = token.split("_") - email = token[0] - print(email) - initiate_time = token[1] # time when email was sent , in epoch format. can be used for later calculations - try: - subscribe_model_instance = SubscribeModel.objects.get(email=email) - subscribe_model_instance.status = "CONFIRMED" - subscribe_model_instance.updated_date = datetime.today() - subscribe_model_instance.save() - messages.success(request, "Subscription Confirmed. Thank you.") - except Exception as e: - logging.getLogger("warning").warning(traceback.format_exc()) - messages.error(request, "Invalid Link") - else: - logging.getLogger("warning").warning("Invalid token ") - messages.error(request, "Invalid Link") - - return HttpResponse('<h1>Thank you for subscribing us</h1>') - -def validate_email(email): - if email is None: - return "Email is required." - elif not re.match(r"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", email): - return "Invalid Email Address." - else: - return None - -def save_email(email): - try: - subscribe_model_instance = SubscribeModel.objects.get(email=email) - except Exception as e: - subscribe_model_instance = SubscribeModel() - - - # does not matter if already subscribed or not...resend the email - subscribe_model_instance.email = email - subscribe_model_instance.status = "SUBSCRIBED" - subscribe_model_instance.created_date = datetime.today() - subscribe_model_instance.updated_date = datetime.today() - subscribe_model_instance.save() - return True def download_materi(request, pk): @@ -751,7 +652,6 @@ class RevisiMateriView(TemplateView): return self.render_to_response(context) - def pages(request): context = {} # All resource paths end in .html. diff --git a/authentication/migrations/0001_initial.py b/authentication/migrations/0001_initial.py index 8dd6568..b28fe9c 100644 --- a/authentication/migrations/0001_initial.py +++ b/authentication/migrations/0001_initial.py @@ -1,8 +1,9 @@ -# Generated by Django 3.1 on 2020-10-30 15:29 +# Generated by Django 3.0.3 on 2020-05-08 14:42 -import authentication.models -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models + +import authentication.models class Migration(migrations.Migration): @@ -10,41 +11,53 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), + ('auth', '0011_update_proxy_permissions'), ] operations = [ migrations.CreateModel( name='User', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('id', models.AutoField(auto_created=True, + primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField( + max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField( + blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, + help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('first_name', models.CharField(blank=True, + max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, + max_length=150, verbose_name='last name')), + ('is_staff', models.BooleanField(default=False, + help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField( + default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField( + default=django.utils.timezone.now, verbose_name='date joined')), ('email', models.EmailField(max_length=254, unique=True)), - ('username', models.CharField(blank=True, default='', max_length=150)), + ('username', models.CharField( + blank=True, default='', max_length=150)), ('name', models.CharField(max_length=150)), ('is_admin', models.BooleanField(default=False)), ('is_contributor', models.BooleanField(default=False)), ('instansi', models.CharField(max_length=240)), - ('nik', models.CharField(max_length=16)), + ('nik', models.CharField(max_length=240)), ('alamat', models.CharField(max_length=240)), ('nomor_telpon', models.CharField(max_length=240)), ('linkedin', models.URLField(blank=True, default='')), ('facebook', models.URLField(blank=True, default='')), ('twitter', models.URLField(blank=True, default='')), ('instagram', models.URLField(blank=True, default='')), - ('biography', models.TextField(blank=True, default='', max_length=200)), - ('default_profile_picture', models.BooleanField(blank=True, default=False)), - ('profile_picture', models.ImageField(default='default-image.jpg', upload_to='')), - ('is_subscribing_to_material_comments', models.BooleanField(default=True)), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ('biography', models.TextField( + blank=True, default='', max_length=200)), + ('profile_picture', models.ImageField( + default='https://ibb.co/gv9YHt4', upload_to='profile_picture/')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', + related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', + related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ], options={ 'verbose_name': 'user', diff --git a/authentication/migrations/0002_auto_20200518_1752.py b/authentication/migrations/0002_auto_20200518_1752.py new file mode 100644 index 0000000..8e88a1b --- /dev/null +++ b/authentication/migrations/0002_auto_20200518_1752.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.3 on 2020-05-18 10:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='profile_picture', + field=models.ImageField(default='https://i.ibb.co/9wgPzyZ/default-image.png', upload_to='profile_picture/'), + ), + ] diff --git a/authentication/migrations/0003_auto_20200519_1012.py b/authentication/migrations/0003_auto_20200519_1012.py new file mode 100644 index 0000000..b705ff0 --- /dev/null +++ b/authentication/migrations/0003_auto_20200519_1012.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.3 on 2020-05-19 03:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0002_auto_20200518_1752'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='default_profile_picture', + field=models.URLField(blank=True, default="https://i.ibb.co/9wgPzyZ/default-image.png'"), + ), + migrations.AlterField( + model_name='user', + name='profile_picture', + field=models.ImageField(upload_to='', verbose_name=models.URLField(blank=True, default="https://i.ibb.co/9wgPzyZ/default-image.png'")), + ), + ] diff --git a/authentication/migrations/0004_auto_20200519_1020.py b/authentication/migrations/0004_auto_20200519_1020.py new file mode 100644 index 0000000..255dcf7 --- /dev/null +++ b/authentication/migrations/0004_auto_20200519_1020.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.3 on 2020-05-19 03:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0003_auto_20200519_1012'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='default_profile_picture', + field=models.BooleanField(blank=True, default=False), + ), + migrations.AlterField( + model_name='user', + name='profile_picture', + field=models.ImageField(upload_to='', verbose_name=models.BooleanField(blank=True, default=False)), + ), + ] diff --git a/authentication/migrations/0005_auto_20200519_1021.py b/authentication/migrations/0005_auto_20200519_1021.py new file mode 100644 index 0000000..05bf864 --- /dev/null +++ b/authentication/migrations/0005_auto_20200519_1021.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.3 on 2020-05-19 03:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0004_auto_20200519_1020'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='profile_picture', + field=models.ImageField(default='default-image.jpg', upload_to=''), + ), + ] diff --git a/authentication/migrations/0006_auto_20200929_2125.py b/authentication/migrations/0006_auto_20200929_2125.py new file mode 100644 index 0000000..a2c2da4 --- /dev/null +++ b/authentication/migrations/0006_auto_20200929_2125.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-09-29 14:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0005_auto_20200519_1021'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='first_name', + field=models.CharField(blank=True, max_length=150, verbose_name='first name'), + ), + ] diff --git a/authentication/migrations/0007_auto_20201009_1415.py b/authentication/migrations/0007_auto_20201009_1415.py new file mode 100644 index 0000000..012a5c8 --- /dev/null +++ b/authentication/migrations/0007_auto_20201009_1415.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-09 07:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0006_auto_20200929_2125'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='nik', + field=models.CharField(max_length=16), + ), + ] diff --git a/authentication/migrations/0008_user_is_subscribing_to_material_comments.py b/authentication/migrations/0008_user_is_subscribing_to_material_comments.py new file mode 100644 index 0000000..2348d49 --- /dev/null +++ b/authentication/migrations/0008_user_is_subscribing_to_material_comments.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-29 12:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0007_auto_20201009_1415'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='is_subscribing_to_material_comments', + field=models.BooleanField(default=True), + ), + ] diff --git a/digipus/settings.py b/digipus/settings.py index 3fc4cad..884c3e6 100644 --- a/digipus/settings.py +++ b/digipus/settings.py @@ -189,5 +189,4 @@ EMAIL_PORT = config('EMAIL_PORT', default=587) # use Google Mail SMTP as default EMAIL_HOST_USER = config('EMAIL_HOST_USER', default="pmplclass2020@gmail.com") EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default="pmpldigipusemail") EMAIL_USE_TLS = True -EMAIL_USE_SSL = False -ENCRYPT_KEY = b'YVLSFH4WgxkLgCOmCBchVmahU_VIF2xPFdD7GUTsvgY=' +EMAIL_USE_SSL = False \ No newline at end of file diff --git a/forum/migrations/0001_initial.py b/forum/migrations/0001_initial.py index 6522603..09be153 100644 --- a/forum/migrations/0001_initial.py +++ b/forum/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1 on 2020-10-30 15:30 +# Generated by Django 3.1 on 2020-10-06 14:39 from django.conf import settings from django.db import migrations, models @@ -11,7 +11,6 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('app', '0001_initial'), ] operations = [ @@ -20,10 +19,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.TextField()), - ('description', models.TextField(blank=True, default='')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('materi', models.ManyToManyField(blank=True, to='app.Materi')), + ('description', models.TextField(default='')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), @@ -32,10 +28,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('description', models.TextField(default='')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), ('discussion', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.discussion')), - ('materi', models.ManyToManyField(blank=True, to='app.Materi')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), diff --git a/forum/migrations/0002_auto_20201007_1903.py b/forum/migrations/0002_auto_20201007_1903.py new file mode 100644 index 0000000..f26c6ba --- /dev/null +++ b/forum/migrations/0002_auto_20201007_1903.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1 on 2020-10-07 12:03 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + dependencies = [ + ('forum', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='discussion', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='discussion', + name='updated_at', + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/forum/migrations/0003_auto_20201008_2056.py b/forum/migrations/0003_auto_20201008_2056.py new file mode 100644 index 0000000..dab5b85 --- /dev/null +++ b/forum/migrations/0003_auto_20201008_2056.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1 on 2020-10-08 13:56 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + dependencies = [ + ('forum', '0002_auto_20201007_1903'), + ] + + operations = [ + migrations.AddField( + model_name='discussioncomment', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='discussioncomment', + name='updated_at', + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/forum/migrations/0004_discussion_materi.py b/forum/migrations/0004_discussion_materi.py new file mode 100644 index 0000000..8cbd9bd --- /dev/null +++ b/forum/migrations/0004_discussion_materi.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-08 18:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('app', '0015_reqmaterial'), + ('forum', '0003_auto_20201008_2056'), + ] + + operations = [ + migrations.AddField( + model_name='discussion', + name='materi', + field=models.ManyToManyField(blank=True, null=True, to='app.Materi'), + ), + ] diff --git a/forum/migrations/0005_auto_20201009_0138.py b/forum/migrations/0005_auto_20201009_0138.py new file mode 100644 index 0000000..c4fc402 --- /dev/null +++ b/forum/migrations/0005_auto_20201009_0138.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-08 18:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('app', '0015_reqmaterial'), + ('forum', '0004_discussion_materi'), + ] + + operations = [ + migrations.AlterField( + model_name='discussion', + name='materi', + field=models.ManyToManyField(blank=True, to='app.Materi'), + ), + ] diff --git a/forum/migrations/0006_auto_20201009_0625.py b/forum/migrations/0006_auto_20201009_0625.py new file mode 100644 index 0000000..3e59801 --- /dev/null +++ b/forum/migrations/0006_auto_20201009_0625.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1 on 2020-10-08 23:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('app', '0015_reqmaterial'), + ('forum', '0005_auto_20201009_0138'), + ] + + operations = [ + migrations.AddField( + model_name='discussioncomment', + name='materi', + field=models.ManyToManyField(blank=True, to='app.Materi'), + ), + migrations.AlterField( + model_name='discussion', + name='description', + field=models.TextField(blank=True, default=''), + ), + ] diff --git a/news/migrations/0001_initial.py b/news/migrations/0001_initial.py index ed7921e..7c58464 100644 --- a/news/migrations/0001_initial.py +++ b/news/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1 on 2020-10-30 15:30 +# Generated by Django 3.1 on 2020-10-03 07:47 from django.db import migrations, models -- GitLab