diff --git a/.coverage b/.coverage index c03f4ed17121afd6a9e53b38c621bddf50286ad2..b52b7316149e0f56b03e30b56143a88a10e0da86 100644 Binary files a/.coverage and b/.coverage differ diff --git a/app/migrations/0001_initial.py b/app/migrations/0001_initial.py index bc8a74b085198558a9bd899e960d509f35c08b92..e696e5f4a6ab0f341fc477a193b2bb7271ac3069 100644 --- a/app/migrations/0001_initial.py +++ b/app/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.3 on 2020-04-08 12:29 +# Generated by Django 3.0.3 on 2020-04-23 06:50 from django.db import migrations, models @@ -11,13 +11,37 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20)), + ('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')), + ('user', models.CharField(default='9a6f72795672439b9734c222cbd8c4ce', max_length=100)), + ('profile', models.CharField(default='76035c', 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')), - ('cover', models.URLField()), - ('title', models.CharField(max_length=50)), - ('author', models.CharField(max_length=30)), + ('cover', models.URLField(max_length=1000)), + ('title', models.CharField(default='title', max_length=50)), + ('author', models.CharField(default='author', max_length=30)), + ('uploader', models.CharField(default='uploader', max_length=30)), + ('publisher', models.CharField(default='publiser', max_length=30)), + ('descriptions', models.TextField(default='descriptions')), + ('uploadDate', models.DateField(auto_now=True)), + ('verified', models.BooleanField(default=False, null=True)), + ('categories', models.ManyToManyField(to='app.Category')), + ('comments', models.ManyToManyField(to='app.Comment')), ], ), ] diff --git a/app/migrations/0002_auto_20200408_2115.py b/app/migrations/0002_auto_20200408_2115.py deleted file mode 100644 index 461769ec421dbd0eb403f30fffac474321131c5f..0000000000000000000000000000000000000000 --- a/app/migrations/0002_auto_20200408_2115.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-08 14:15 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='materi', - name='cover', - field=models.URLField(max_length=1000), - ), - ] diff --git a/app/migrations/0003_auto_20200418_1452.py b/app/migrations/0003_auto_20200418_1452.py deleted file mode 100644 index 46fb3cebf56ee037aecc36f88ff255d24b2b637c..0000000000000000000000000000000000000000 --- a/app/migrations/0003_auto_20200418_1452.py +++ /dev/null @@ -1,51 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-18 07:52 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0002_auto_20200408_2115'), - ] - - operations = [ - migrations.CreateModel( - name='Category', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=20)), - ('description', models.CharField(max_length=20)), - ], - ), - migrations.AddField( - model_name='materi', - name='descriptions', - field=models.CharField(default='SOME STRING', max_length=300), - ), - migrations.AddField( - model_name='materi', - name='publisher', - field=models.CharField(default='SOME STRING', max_length=30), - ), - migrations.AddField( - model_name='materi', - name='uploader', - field=models.CharField(default='SOME STRING', max_length=30), - ), - migrations.AlterField( - model_name='materi', - name='author', - field=models.CharField(default='SOME STRING', max_length=30), - ), - migrations.AlterField( - model_name='materi', - name='title', - field=models.CharField(default='SOME STRING', max_length=50), - ), - migrations.AddField( - model_name='materi', - name='categories', - field=models.ManyToManyField(to='app.Category'), - ), - ] diff --git a/app/migrations/0004_auto_20200421_1557.py b/app/migrations/0004_auto_20200421_1557.py deleted file mode 100644 index 0040574b324c057d168f4efbffc276bd4d5e1ac2..0000000000000000000000000000000000000000 --- a/app/migrations/0004_auto_20200421_1557.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-21 08:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0003_auto_20200418_1452'), - ] - - operations = [ - migrations.CreateModel( - name='Comment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('user', models.CharField(default='423a22c748b647d58f725be4ad1ffefb', max_length=100)), - ('profile', models.CharField(default='795364', max_length=100)), - ('comment', models.CharField(default='comments', max_length=200)), - ], - ), - migrations.AlterField( - model_name='materi', - name='author', - field=models.CharField(default='author', max_length=30), - ), - migrations.AlterField( - model_name='materi', - name='descriptions', - field=models.CharField(default='descriptions', max_length=300), - ), - migrations.AlterField( - model_name='materi', - name='publisher', - field=models.CharField(default='publiser', max_length=30), - ), - migrations.AlterField( - model_name='materi', - name='title', - field=models.CharField(default='title', max_length=50), - ), - migrations.AlterField( - model_name='materi', - name='uploader', - field=models.CharField(default='uploader', max_length=30), - ), - migrations.AddField( - model_name='materi', - name='comments', - field=models.ManyToManyField(to='app.Comment'), - ), - ] diff --git a/app/migrations/0005_auto_20200421_1625.py b/app/migrations/0005_auto_20200421_1625.py deleted file mode 100644 index 59f6809e7c64b9a29ae789ce6f98758c87982270..0000000000000000000000000000000000000000 --- a/app/migrations/0005_auto_20200421_1625.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-21 09:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0004_auto_20200421_1557'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='profile', - field=models.CharField(default='bdaac0', max_length=100), - ), - migrations.AlterField( - model_name='comment', - name='user', - field=models.CharField(default='22daa04c12aa4fc7878d6e3a84eec095', max_length=100), - ), - migrations.AlterField( - model_name='materi', - name='descriptions', - field=models.CharField(default='descriptions', max_length=200), - ), - ] diff --git a/app/migrations/0006_auto_20200421_1633.py b/app/migrations/0006_auto_20200421_1633.py deleted file mode 100644 index bcd0de1f2676262501b84acbc0bc060de23904df..0000000000000000000000000000000000000000 --- a/app/migrations/0006_auto_20200421_1633.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-21 09:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0005_auto_20200421_1625'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='comment', - field=models.CharField(default='comments', max_length=150), - ), - migrations.AlterField( - model_name='comment', - name='profile', - field=models.CharField(default='4cee3b', max_length=100), - ), - migrations.AlterField( - model_name='comment', - name='user', - field=models.CharField(default='b2ea05df58014e768c7bafda3140e365', max_length=100), - ), - migrations.AlterField( - model_name='materi', - name='descriptions', - field=models.TextField(default='descriptions'), - ), - ] diff --git a/app/migrations/0007_auto_20200421_2151.py b/app/migrations/0007_auto_20200421_2151.py deleted file mode 100644 index 1ba9fc211ebbadb6b9ecfb25166ccb05755a3e31..0000000000000000000000000000000000000000 --- a/app/migrations/0007_auto_20200421_2151.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-21 14:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0006_auto_20200421_1633'), - ] - - operations = [ - migrations.AddField( - model_name='materi', - name='verified', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='comment', - name='profile', - field=models.CharField(default='e0ff7f', max_length=100), - ), - migrations.AlterField( - model_name='comment', - name='user', - field=models.CharField(default='bd48a042721144bf80b64c2284c39f03', max_length=100), - ), - ] diff --git a/app/migrations/0008_auto_20200422_2202.py b/app/migrations/0008_auto_20200422_2202.py deleted file mode 100644 index 5b14ce8f01839ff8ba416738a1da64578fef8ee7..0000000000000000000000000000000000000000 --- a/app/migrations/0008_auto_20200422_2202.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-22 15:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0007_auto_20200421_2151'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='profile', - field=models.CharField(default='d91905', max_length=100), - ), - migrations.AlterField( - model_name='comment', - name='user', - field=models.CharField(default='2565edd4bdac454d9cd87e2e7d93d27f', max_length=100), - ), - ] diff --git a/app/migrations/0009_auto_20200422_2206.py b/app/migrations/0009_auto_20200422_2206.py deleted file mode 100644 index d366787dfb542e3f78268d73de263cff824e0d5c..0000000000000000000000000000000000000000 --- a/app/migrations/0009_auto_20200422_2206.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-22 15:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0008_auto_20200422_2202'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='profile', - field=models.CharField(default='cbacb3', max_length=100), - ), - migrations.AlterField( - model_name='comment', - name='user', - field=models.CharField(default='31d4991724a9498fb58b631db4636bff', max_length=100), - ), - migrations.AlterField( - model_name='materi', - name='verified', - field=models.BooleanField(default=False, null=True), - ), - ] diff --git a/app/migrations/0010_auto_20200422_2206.py b/app/migrations/0010_auto_20200422_2206.py deleted file mode 100644 index 4e614725cc6aede7efd98ed9249c41bbab27d07a..0000000000000000000000000000000000000000 --- a/app/migrations/0010_auto_20200422_2206.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.0.3 on 2020-04-22 15:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0009_auto_20200422_2206'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='profile', - field=models.CharField(default='e2db20', max_length=100), - ), - migrations.AlterField( - model_name='comment', - name='user', - field=models.CharField(default='e230956660bd4b899b4b81f03e6553a6', max_length=100), - ), - ] diff --git a/app/models.py b/app/models.py index 856a855c249f65044d7ddb6fa95711cdddd8ad57..cc3263a319e08d1137912ab2a024fe1eece5463a 100644 --- a/app/models.py +++ b/app/models.py @@ -35,6 +35,7 @@ class Materi(models.Model): uploader = models.CharField(max_length=30, default='uploader') #ubah jadi one to one ke kontributor publisher = models.CharField(max_length=30, default='publiser') descriptions = models.TextField(default='descriptions') + uploadDate = models.DateField(auto_now=True) verified = models.BooleanField(default=False, null=True) categories = models.ManyToManyField(Category) comments = models.ManyToManyField(Comment) diff --git a/authentication/templates/login.html b/authentication/templates/login.html index e577c245caa3a3b0a7126bdd9207e1e98c8aa8e3..0dfae589ed5969411d1930b21e24b16e1fc0267b 100644 --- a/authentication/templates/login.html +++ b/authentication/templates/login.html @@ -1,31 +1,48 @@ +{% load static %} + <!DOCTYPE html> <html lang="en"> <head> - <title>Login DIGIPUS</title> + <title>Login Kontributor</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <!--===============================================================================================--> - <link rel="icon" type="image/png" href="../static/images/icons/logo.ico" /> - <!--===============================================================================================--> - <link rel="stylesheet" type="text/css" href="../static/css/util.css"> - <!--===============================================================================================--> - <link rel="stylesheet" type="text/css" href="../static/css/main.css"> +<!--===============================================================================================--> +<link rel="icon" type="image/png" href="{% static 'images/icons/logo.ico' %}" /> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'vendor/bootstrap/css/bootstrap.min.css' %}"> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'fonts/font-awesome-4.7.0/css/font-awesome.min.css' %}"> +<!--===============================================================================================--> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'vendor/animate/animate.css' %}"> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'vendor/css-hamburgers/hamburgers.min.css' %}"> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'vendor/animsition/css/animsition.min.css' %}"> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'vendor/select2/select2.min.css' %}"> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'vendor/daterangepicker/daterangepicker.css' %}"> +<!--===============================================================================================--> +<link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}"> +<link rel="stylesheet" type="text/css" href="{% static 'css/util.css' %}"> +<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}"> <!--===============================================================================================--> </head> -<body style="background-color: #f7f7f7;"> +<body style="background-color: #666666;"> <div class="limiter"> <div class="container-login100"> <div class="wrap-login100"> - <form class="login100-form validate-form" method="POST" action=""> - + <form class="login100-form validate-form" method="POST"> {% csrf_token %} + <div class="login100-form-title p-b-43"> - Login Kontributor + Halo, kontributor </div> @@ -39,26 +56,28 @@ <div class="wrap-input100 validate-input" data-validate="Password is required"> <input class="input100" type="password" name="pass"> <span class="focus-input100"></span> - <span class="label-input100">Password</span> + <span class="label-input100">Kata Sandi</span> </div> <div class="flex-sb-m w-full p-t-3 p-b-32"> - <div class="contact100-form-checkbox"> - <a href="#" class="txt1"> + + <div> + <a href="/registrasi/" class="txt1"> Belum mendaftar? klik di sini </a> </div> + </div> + <div class="container-login100-form-btn"> - <button class="login100-form-btn"> + <button class="login100-form-btn" type="submit"> Login </button> </div> - </form> - <div class="login100-more" style="background-image: url('../static/images/bg-03.jpg');"> + <div class="login100-more" style="background-image: url('../../static/images/bg-03.jpg');"> </div> </div> @@ -68,6 +87,18 @@ <!--===============================================================================================--> <script src="../static/vendor/jquery/jquery-3.2.1.min.js"></script> <!--===============================================================================================--> + <script src="../static/vendor/animsition/js/animsition.min.js"></script> + <!--===============================================================================================--> + <script src="../static/vendor/bootstrap/js/popper.js"></script> + <script src="../static/../static/../static/../static/../static/../static/vendor/bootstrap/js/bootstrap.min.js"></script> + <!--===============================================================================================--> + <script src="../static/../static/../static/../static/../static/vendor/select2/select2.min.js"></script> + <!--===============================================================================================--> + <script src="../static/../static/../static/../static/vendor/daterangepicker/moment.min.js"></script> + <script src="../static/../static/../static/vendor/daterangepicker/daterangepicker.js"></script> + <!--===============================================================================================--> + <script src="../static/../static/vendor/countdowntime/countdowntime.js"></script> + <!--===============================================================================================--> <script src="../static/js/login.js"></script> </body> diff --git a/authentication/templates/login_admin.html b/authentication/templates/login_admin.html index edb0cc3e2b3a10880ff6b22e96e4348f1767fbad..b5bce529229dab01f053404646575ace9b3cebc6 100644 --- a/authentication/templates/login_admin.html +++ b/authentication/templates/login_admin.html @@ -1,3 +1,5 @@ +{% load static %} + <!doctype html> <html lang="en"> @@ -8,15 +10,28 @@ <!-- CSS --> <link rel="stylesheet" href="../static/css/login_admin.css"> - <link rel="stylesheet" type="text/css" href="../static/css/util.css"> - <link rel="stylesheet" type="text/css" href="../static/css/main.css"> <!--===============================================================================================--> - <link rel="icon" type="image/png" href="../static/images/icons/logo.ico" /> + <link rel="icon" type="image/png" href="{% static 'images/icons/logo.ico' %}" /> + <!--===============================================================================================--> + <link rel="stylesheet" type="text/css" href="{% static 'vendor/bootstrap/css/bootstrap.min.css' %}"> + <!--===============================================================================================--> + <link rel="stylesheet" type="text/css" href="{% static 'fonts/font-awesome-4.7.0/css/font-awesome.min.css' %}"> + <!--===============================================================================================--> + <!--===============================================================================================--> + <link rel="stylesheet" type="text/css" href="{% static 'vendor/animate/animate.css' %}"> + <!--===============================================================================================--> + <link rel="stylesheet" type="text/css" href="{% static 'vendor/css-hamburgers/hamburgers.min.css' %}"> + <!--===============================================================================================--> + <link rel="stylesheet" type="text/css" href="{% static 'vendor/animsition/css/animsition.min.css' %}"> + <!--===============================================================================================--> + <link rel="stylesheet" type="text/css" href="{% static 'vendor/select2/select2.min.css' %}"> <!--===============================================================================================--> - <link rel="stylesheet" type="text/css" href="../static/vendor/bootstrap/css/bootstrap.min.css"> + <link rel="stylesheet" type="text/css" href="{% static 'vendor/daterangepicker/daterangepicker.css' %}"> <!--===============================================================================================--> - <link rel="stylesheet" type="text/css" href="../static/fonts/font-awesome-4.7.0/css/font-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}"> + <link rel="stylesheet" type="text/css" href="{% static 'css/util.css' %}"> + <link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}"> <!--===============================================================================================--> </head> @@ -37,38 +52,35 @@ </div> <div class="work_info"> + <form class="login100-form validate-form" method="POST"> + {% csrf_token %} - <head> <div class="login100-form-title p-b-43"> - <img src="../static/images/logo.png" style="width:100px;height:100px;border:0;"> + Halo, Admin </div> - </head> - - - <div class="login100-form-title p-b-43"> - Halo, Admin - </div> - - <div class="wrap-input100 validate-input" data-validate="Valid email is required: ex@abc.xyz"> - <input class="input100" type="text" name="email"> - <span class="focus-input100"></span> - <span class="label-input100">Email</span> - </div> - - - <div class="wrap-input100 validate-input" data-validate="Password is required"> - <input class="input100" type="password" name="pass"> - <span class="focus-input100"></span> - <span class="label-input100">Password</span> - </div> + <div class="wrap-input100 validate-input" data-validate="Valid email is required: ex@abc.xyz"> + <input class="input100" type="text" name="email"> + <span class="focus-input100"></span> + <span class="label-input100">Email</span> + </div> + + + <div class="wrap-input100 validate-input" data-validate="Password is required"> + <input class="input100" type="password" name="pass"> + <span class="focus-input100"></span> + <span class="label-input100">Kata Sandi</span> + </div> - <div class="container-login100-form-btn"> - <button class="login100-form-btn"> - Login - </button> - </div> + <br> + </br> + <div class="container-login100-form-btn"> + <button class="login100-form-btn" type="submit"> + Login + </button> + </div> + </form> </div> </div> </div> @@ -93,7 +105,7 @@ <!--===============================================================================================--> <script src="../static/../static/vendor/countdowntime/countdowntime.js"></script> <!--===============================================================================================--> - <script src="../static/js/halaman_login.js"></script> + <script src="../static/js/login.js"></script> </body> diff --git a/authentication/tests.py b/authentication/tests.py index 95a4c45033f3ec6a6ee821b84b5e52fc12d01844..484663e49ed4cc03ad186eac46a1ab91b6501cfd 100644 --- a/authentication/tests.py +++ b/authentication/tests.py @@ -2,23 +2,48 @@ from django.test import TestCase, Client, RequestFactory from django.urls import resolve from authentication.views import Login from authentication.models import User -from .views import login_admin -class LoginPageTest(TestCase): +class LoginPageContributorTest(TestCase): def setUp(self): - User.objects._create_user(email="alice@acme.com", password="acmecorp") + User.objects._create_user(email="alice@acme.com", password="acmecorp", is_contributor=True) - def test_login_url_exists(self): + def test_login_contributor_using_login_func(self): + found = resolve('/login/') + self.assertEqual(found.func.__name__, Login.as_view().__name__) + + def test_login_contributor_url_is_exist(self): + # Positive tests response = Client().get('/login/') self.assertEqual(response.status_code, 200) - def test_template(self): + # Negative tests + response = Client().get('/fake/') + self.assertEqual(response.status_code, 404) + + def test_login_contributor_template(self): + url = "/login/" + response = Client().get(url) + expected_template_name = "login.html" + self.assertTemplateUsed(response, expected_template_name) + + def test_register_title(self): response = Client().get('/login/') - self.assertTemplateUsed(response, 'login.html') - def test_login_using_login_func(self): - found = resolve('/login/') - self.assertEqual(found.func.__name__, Login.as_view().__name__) + # Positive tests + self.assertContains(response, 'Login Kontributor') + + # Negative tests + self.assertNotContains(response, 'Fake Title') + + def test_register_form_field(self): + response = Client().get('/login/') + + # Positive tests + self.assertContains(response, 'Email') + self.assertContains(response, 'Kata Sandi') + + # Negative tests + self.assertNotContains(response, 'Jenis Kelamin') def test_user_login_missing_email_or_password(self): response = Client().post('/login/', {'email': 'alice@acme.com'}) @@ -109,41 +134,72 @@ class UserModelTest(TestCase): self.assertTrue(superuser.is_superuser) -class Login_AdminPageTest(TestCase): - def test_register_url_is_exist(self): - # Positive tests - response = Client().get('/login_admin/') - self.assertEqual(response.status_code, 200) - - # Negative tests - response = Client().get('/fake/') - self.assertEqual(response.status_code, 404) +class LoginPageAdminTest(TestCase): + def setUp(self): + User.objects._create_user(email="alice@acme.com", password="acmecorp", is_admin=True) - def test_status_using_index_func(self): - # Positive tests + def test_login_admin_using_login_func(self): found = resolve('/login_admin/') - self.assertEqual(found.func, login_admin) + self.assertEqual(found.func.__name__, Login.as_view().__name__) - # Negative tests - found = resolve('/admin/') - self.assertNotEqual(found.func, login_admin) + def test_login_admin_template(self): + url = "/login_admin/" + response = Client().get(url) + expected_template_name = "login_admin.html" + self.assertTemplateUsed(response, expected_template_name) + + def test_login_admin_url_is_exist(self): + # Positive tests + response = Client().get('/login_admin/') + self.assertEqual(response.status_code, 200) def test_register_title(self): response = Client().get('/login_admin/') # Positive tests - self.assertContains(response, 'Login Admin') - - # Negative tests - self.assertNotContains(response, 'Fake Title') + self.assertContains(response, 'Halo, Admin') - def test_register_form_field(self): + def test_login_admin_form_field(self): response = Client().get('/login_admin/') # Positive tests self.assertContains(response, 'Email') - self.assertContains(response, 'Password') + self.assertContains(response, 'Kata Sandi') - # Negative tests - self.assertNotContains(response, 'Jenis Kelamin') + def test_user_login_missing_email_or_password(self): + response = Client().post('/login_admin/', {'email': 'alice@acme.com'}) + self.assertIn('error_message', response.context_data) + self.assertIn("Email atau Password anda kosong.", + response.context_data['error_message']) + response = Client().post('/login_admin/', {'pass': 'acmecorp'}) + self.assertIn('error_message', response.context_data) + self.assertIn("Email atau Password anda kosong.", + response.context_data['error_message']) + + def test_user_login_wrong_email_or_password(self): + # Wrong password + response = Client().post( + '/login_admin/', {'email': 'alice@acme.com', 'pass': 'acmeindustry'}) + self.assertIn('error_message', response.context_data) + self.assertIn("Email atau Password anda salah.", + response.context_data['error_message']) + # Wrong email + response = Client().post( + '/login_admin/', {'email': 'alice@acme.co.id', 'pass': 'acmecorp'}) + self.assertIn('error_message', response.context_data) + self.assertIn("Email atau Password anda salah.", + response.context_data['error_message']) + # Wrong email and password + response = Client().post( + '/login_admin/', {'email': 'alice@acme.co.id', 'pass': 'acmeindustry'}) + self.assertIn('error_message', response.context_data) + self.assertIn("Email atau Password anda salah.", + response.context_data['error_message']) + + def test_user_login(self): + # 302 meaning successful login and redirected + response = Client().post( + '/login_admin/', {'email': 'alice@acme.com', 'pass': 'acmecorp'}) + self.assertEqual(302, response.status_code) + \ No newline at end of file diff --git a/authentication/urls.py b/authentication/urls.py index 49a16496c930193f30eab4451e4b9142b71cc970..6510358ff91953d94950fb2196a7658d4a09e493 100644 --- a/authentication/urls.py +++ b/authentication/urls.py @@ -1,9 +1,9 @@ from django.urls import path -from authentication.views import Login, login_admin +from authentication.views import Login from django.contrib.auth.views import LogoutView urlpatterns = [ - path('login/', Login.as_view()), - path('login_admin/', login_admin, name='login_admin'), + path('login/', Login.as_view(), name='login_admin'), + path('login_admin/', Login.as_view(), name='login_admin'), path('logout/', LogoutView.as_view()), ] \ No newline at end of file diff --git a/authentication/views.py b/authentication/views.py index ae28b170bb98308a3feeedf9db26a745fb70c02b..a0189ebab1b8c683d775f772ba57d7af0409b6df 100644 --- a/authentication/views.py +++ b/authentication/views.py @@ -6,7 +6,13 @@ from django.contrib.auth.views import LogoutView class Login(TemplateView): - template_name = 'login.html' + + def get_template_names(self): + if self.request.path == '/login_admin/': + template_name = 'login_admin.html' + else: + template_name = 'login.html' + return template_name def get_context_data(self, *args, **kwargs): context = super().get_context_data(**kwargs) @@ -33,7 +39,3 @@ class Login(TemplateView): context = self.get_context_data(*args, **kwargs) context["error_message"] = "Email atau Password anda salah." return self.render_to_response(context=context) - -# Create your views here. -def login_admin(request): - return render(request, 'login_admin.html') diff --git a/register/templates/index.html b/register/templates/index.html index f1d0836e2d15c90f911b41b50f4cbe8806420eb9..58f9a1701bec16abc14f7ca460fb5fb7c5b7690f 100644 --- a/register/templates/index.html +++ b/register/templates/index.html @@ -31,27 +31,7 @@ <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet"> </head> <body style="background-color: #666666;"> - <header class="main-header" id="main-header"> - <div> - <a href="#" class="main-header__brand"> - Diskominfo Kota Depok - </a> - </div><nav class="main-nav"> - <ul class="main-nav__items"> - <li class="main-nav__item"> - <a href="#">Unggah</a> - </li> - <li class="main-nav__item"> - <a href="#">Akun</a> - </li> - <li class="main-nav__item"> - <a href="#"> - <img src="{% static 'img/profile.jpg' %}" class="main-nav__item-img"> - </a> - </li> - </ul> - </nav> - </header> + <main> <div class="limiter"> <div class="container-login100"> @@ -111,11 +91,24 @@ <span class="focus-input100"></span> <span class="label-input100">Ketik Ulang Kata Sandi</span> </div> + + <div class="container-login100-form-btn"> <button class="login100-form-btn"> Daftar </button> </div> + + <div class="flex-sb-m w-full p-t-3 p-b-32"> + + <div> + <a href="/login/" class="txt1"> + Kembali ke halaman login + </a> + </div> + + </div> + </form> <div class="login100-more" style="background-image: url('../static/images/bg-03.jpg'); z-index: 0;"> </div> diff --git a/requirements.txt b/requirements.txt index 9a93cbdca36da21938762394a8e92274ab597194..dbfbd538dc4e054a34a216f834b2ddbf3331adba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,4 +30,5 @@ typed-ast==1.4.1 wcwidth==0.1.9 whitenoise==5.0.1 wrapt==1.11.2 -zipp==3.1.0 \ No newline at end of file +zipp==3.1.0 +Pillow==7.1.1 \ No newline at end of file diff --git a/sonar-project.properties b/sonar-project.properties index 6698a46b860b8b3dcfe38e6fa1c02369400608d4..8ef13a8bdcd322e265a0a36ff3b533387a69043a 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -9,7 +9,7 @@ sonar.projectKey=$SONARQUBE_PROJECT_KEY ## Path to sources sonar.sources=. -sonar.exclusions=**/migrations/**, **/__init__.py, digipus/**, **/test.py, manage.py, .vscode/**, static/**, staticfiles/**,static/admin/** +sonar.exclusions=**/migrations/**, **/__init__.py, digipus/**, **/test.py, manage.py, .vscode/**, static/**, staticfiles/**, static/admin/**, **/static/** # sonar.inclusions= ## Path to tests @@ -24,4 +24,4 @@ sonar.sourceEncoding=UTF-8 sonar.branch.name=$CI_COMMIT_REF_NAME ## Coverage Report -sonar.python.coverage.reportPath=coverage.xml \ No newline at end of file +sonar.python.coverage.reportPaths=coverage.xml \ No newline at end of file diff --git a/static/css/main.css b/static/css/main.css index 5b6cb549af4f995c451a98dad560dbb1bbe9bea7..9c391d674c7dba1b166775d637c900089d83b0d7 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -260,7 +260,7 @@ iframe { min-height: 100vh; display: block; background-color: #f7f7f7; - padding: 100px 55px 55px 55px; + padding: 173px 55px 55px 55px; } .login100-form-title { diff --git a/static/css/main.css.gz b/static/css/main.css.gz index 9af0aa38681d7f50a31e1c65318ccdcb7746d176..f91f45791ce19306322bf0567c3c94b67f8d501e 100644 Binary files a/static/css/main.css.gz and b/static/css/main.css.gz differ diff --git a/staticfiles/css/main.css b/staticfiles/css/main.css index 5b6cb549af4f995c451a98dad560dbb1bbe9bea7..9c391d674c7dba1b166775d637c900089d83b0d7 100644 --- a/staticfiles/css/main.css +++ b/staticfiles/css/main.css @@ -260,7 +260,7 @@ iframe { min-height: 100vh; display: block; background-color: #f7f7f7; - padding: 100px 55px 55px 55px; + padding: 173px 55px 55px 55px; } .login100-form-title {