diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640..c7553e0 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659..04683a1 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd6..5a8ad0f 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..5f1b1e8 --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# Generated by Django 5.2.7 on 2026-02-07 03:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Dosen', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nidn', models.CharField(max_length=20, unique=True)), + ('nama', models.CharField(max_length=100)), + ], + options={ + 'verbose_name_plural': 'Dosen', + }, + ), + migrations.CreateModel( + name='Hari', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nama', models.CharField(max_length=20)), + ], + options={ + 'verbose_name_plural': 'Hari', + }, + ), + migrations.CreateModel( + name='ProgramStudi', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nama', models.CharField(max_length=100)), + ], + options={ + 'verbose_name_plural': 'Program Studi', + }, + ), + migrations.CreateModel( + name='TahunAkademik', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nama', models.CharField(max_length=20)), + ], + options={ + 'verbose_name_plural': 'Tahun Akademik', + }, + ), + ] diff --git a/core/migrations/0002_jam_kelas_ruangan_tahunakademik_is_active_matakuliah_and_more.py b/core/migrations/0002_jam_kelas_ruangan_tahunakademik_is_active_matakuliah_and_more.py new file mode 100644 index 0000000..fd80e81 --- /dev/null +++ b/core/migrations/0002_jam_kelas_ruangan_tahunakademik_is_active_matakuliah_and_more.py @@ -0,0 +1,90 @@ +# Generated by Django 5.2.7 on 2026-02-07 03:19 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Jam', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('range_waktu', models.CharField(max_length=50)), + ], + options={ + 'verbose_name_plural': 'Jam', + }, + ), + migrations.CreateModel( + name='Kelas', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nama', models.CharField(max_length=20)), + ], + options={ + 'verbose_name_plural': 'Kelas', + }, + ), + migrations.CreateModel( + name='Ruangan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nama', models.CharField(max_length=50)), + ('kapasitas', models.IntegerField()), + ], + options={ + 'verbose_name_plural': 'Ruangan', + }, + ), + migrations.AddField( + model_name='tahunakademik', + name='is_active', + field=models.BooleanField(default=False), + ), + migrations.CreateModel( + name='MataKuliah', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('kode', models.CharField(max_length=20, unique=True)), + ('nama', models.CharField(max_length=100)), + ('sks', models.IntegerField()), + ('semester', models.IntegerField()), + ('prodi', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.programstudi')), + ], + options={ + 'verbose_name_plural': 'Mata Kuliah', + }, + ), + migrations.CreateModel( + name='DosenPengampu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dosen', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.dosen')), + ('tahun_akademik', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.tahunakademik')), + ('matkul', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.matakuliah')), + ], + options={ + 'verbose_name_plural': 'Dosen Pengampu', + }, + ), + migrations.CreateModel( + name='Jadwal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dosen_pengampu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.dosenpengampu')), + ('hari', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.hari')), + ('jam', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.jam')), + ('kelas', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.kelas')), + ('ruangan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.ruangan')), + ], + options={ + 'verbose_name_plural': 'Jadwal', + }, + ), + ] diff --git a/core/migrations/0003_kelas_prodi_ruangan_prodi.py b/core/migrations/0003_kelas_prodi_ruangan_prodi.py new file mode 100644 index 0000000..987237a --- /dev/null +++ b/core/migrations/0003_kelas_prodi_ruangan_prodi.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2.7 on 2026-02-07 03:31 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0002_jam_kelas_ruangan_tahunakademik_is_active_matakuliah_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='kelas', + name='prodi', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.programstudi'), + ), + migrations.AddField( + model_name='ruangan', + name='prodi', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.programstudi'), + ), + ] diff --git a/core/migrations/0004_daftarhadir.py b/core/migrations/0004_daftarhadir.py new file mode 100644 index 0000000..db7552c --- /dev/null +++ b/core/migrations/0004_daftarhadir.py @@ -0,0 +1,27 @@ +# Generated by Django 5.2.7 on 2026-02-07 04:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_kelas_prodi_ruangan_prodi'), + ] + + operations = [ + migrations.CreateModel( + name='DaftarHadir', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tanggal', models.DateField()), + ('pertemuan_ke', models.IntegerField(default=1)), + ('keterangan', models.TextField(blank=True, null=True)), + ('jadwal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.jadwal')), + ], + options={ + 'verbose_name_plural': 'Daftar Hadir', + }, + ), + ] diff --git a/core/migrations/0005_dosenpengampu_kelas_dosenpengampu_prodi_and_more.py b/core/migrations/0005_dosenpengampu_kelas_dosenpengampu_prodi_and_more.py new file mode 100644 index 0000000..58284c9 --- /dev/null +++ b/core/migrations/0005_dosenpengampu_kelas_dosenpengampu_prodi_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.7 on 2026-02-07 04:45 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0004_daftarhadir'), + ] + + operations = [ + migrations.AddField( + model_name='dosenpengampu', + name='kelas', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.kelas'), + ), + migrations.AddField( + model_name='dosenpengampu', + name='prodi', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.programstudi'), + ), + migrations.AlterField( + model_name='matakuliah', + name='kode', + field=models.CharField(max_length=20), + ), + migrations.AlterUniqueTogether( + name='matakuliah', + unique_together={('kode', 'prodi'), ('nama', 'prodi')}, + ), + ] diff --git a/core/migrations/0006_jadwal_is_manual.py b/core/migrations/0006_jadwal_is_manual.py new file mode 100644 index 0000000..3a85d93 --- /dev/null +++ b/core/migrations/0006_jadwal_is_manual.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2026-02-07 05:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0005_dosenpengampu_kelas_dosenpengampu_prodi_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='jadwal', + name='is_manual', + field=models.BooleanField(default=False), + ), + ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000..5ec1451 Binary files /dev/null and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0002_jam_kelas_ruangan_tahunakademik_is_active_matakuliah_and_more.cpython-311.pyc b/core/migrations/__pycache__/0002_jam_kelas_ruangan_tahunakademik_is_active_matakuliah_and_more.cpython-311.pyc new file mode 100644 index 0000000..10a785b Binary files /dev/null and b/core/migrations/__pycache__/0002_jam_kelas_ruangan_tahunakademik_is_active_matakuliah_and_more.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0003_kelas_prodi_ruangan_prodi.cpython-311.pyc b/core/migrations/__pycache__/0003_kelas_prodi_ruangan_prodi.cpython-311.pyc new file mode 100644 index 0000000..965c5fc Binary files /dev/null and b/core/migrations/__pycache__/0003_kelas_prodi_ruangan_prodi.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0004_daftarhadir.cpython-311.pyc b/core/migrations/__pycache__/0004_daftarhadir.cpython-311.pyc new file mode 100644 index 0000000..64f2242 Binary files /dev/null and b/core/migrations/__pycache__/0004_daftarhadir.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0005_dosenpengampu_kelas_dosenpengampu_prodi_and_more.cpython-311.pyc b/core/migrations/__pycache__/0005_dosenpengampu_kelas_dosenpengampu_prodi_and_more.cpython-311.pyc new file mode 100644 index 0000000..6bbc985 Binary files /dev/null and b/core/migrations/__pycache__/0005_dosenpengampu_kelas_dosenpengampu_prodi_and_more.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0006_jadwal_is_manual.cpython-311.pyc b/core/migrations/__pycache__/0006_jadwal_is_manual.cpython-311.pyc new file mode 100644 index 0000000..53a3769 Binary files /dev/null and b/core/migrations/__pycache__/0006_jadwal_is_manual.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index 71a8362..d0b818f 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,122 @@ from django.db import models -# Create your models here. +class ProgramStudi(models.Model): + nama = models.CharField(max_length=100) + + def __str__(self): + return self.nama + + class Meta: + verbose_name_plural = "Program Studi" + +class Dosen(models.Model): + nidn = models.CharField(max_length=20, unique=True) + nama = models.CharField(max_length=100) + + def __str__(self): + return self.nama + + class Meta: + verbose_name_plural = "Dosen" + +class TahunAkademik(models.Model): + nama = models.CharField(max_length=20) # e.g., 2025/2026 + is_active = models.BooleanField(default=False) + + def __str__(self): + return self.nama + + class Meta: + verbose_name_plural = "Tahun Akademik" + +class Hari(models.Model): + nama = models.CharField(max_length=20) + + def __str__(self): + return self.nama + + class Meta: + verbose_name_plural = "Hari" + +class MataKuliah(models.Model): + kode = models.CharField(max_length=20) + nama = models.CharField(max_length=100) + sks = models.IntegerField() + semester = models.IntegerField() + prodi = models.ForeignKey(ProgramStudi, on_delete=models.CASCADE) + + def __str__(self): + return f"{self.kode} - {self.nama}" + + class Meta: + verbose_name_plural = "Mata Kuliah" + unique_together = [['kode', 'prodi'], ['nama', 'prodi']] + +class Ruangan(models.Model): + nama = models.CharField(max_length=50) + kapasitas = models.IntegerField() + prodi = models.ForeignKey(ProgramStudi, on_delete=models.CASCADE, null=True, blank=True) + + def __str__(self): + return self.nama + + class Meta: + verbose_name_plural = "Ruangan" + +class Kelas(models.Model): + nama = models.CharField(max_length=20) # e.g., A, B, C or 1A, 1B + prodi = models.ForeignKey(ProgramStudi, on_delete=models.CASCADE, null=True, blank=True) + + def __str__(self): + return self.nama + + class Meta: + verbose_name_plural = "Kelas" + +class Jam(models.Model): + range_waktu = models.CharField(max_length=50) # e.g., 07:00 - 08:40 + + def __str__(self): + return self.range_waktu + + class Meta: + verbose_name_plural = "Jam" + +class DosenPengampu(models.Model): + dosen = models.ForeignKey(Dosen, on_delete=models.CASCADE) + matkul = models.ForeignKey(MataKuliah, on_delete=models.CASCADE) + tahun_akademik = models.ForeignKey(TahunAkademik, on_delete=models.CASCADE) + prodi = models.ForeignKey(ProgramStudi, on_delete=models.CASCADE, null=True, blank=True) + kelas = models.ForeignKey(Kelas, on_delete=models.CASCADE, null=True, blank=True) + + def __str__(self): + return f"{self.dosen.nama} - {self.matkul.nama} ({self.kelas.nama if self.kelas else '-'})" + + class Meta: + verbose_name_plural = "Dosen Pengampu" + +class Jadwal(models.Model): + dosen_pengampu = models.ForeignKey(DosenPengampu, on_delete=models.CASCADE) + ruangan = models.ForeignKey(Ruangan, on_delete=models.CASCADE) + hari = models.ForeignKey(Hari, on_delete=models.CASCADE) + jam = models.ForeignKey(Jam, on_delete=models.CASCADE) + kelas = models.ForeignKey(Kelas, on_delete=models.CASCADE) + is_manual = models.BooleanField(default=False) + + def __str__(self): + return f"{self.dosen_pengampu.matkul.nama} - {self.hari.nama} {self.jam.range_waktu}" + + class Meta: + verbose_name_plural = "Jadwal" + +class DaftarHadir(models.Model): + jadwal = models.ForeignKey(Jadwal, on_delete=models.CASCADE) + tanggal = models.DateField() + pertemuan_ke = models.IntegerField(default=1) + keterangan = models.TextField(null=True, blank=True) + + def __str__(self): + return f"Hadir: {self.jadwal} - Tgl: {self.tanggal}" + + class Meta: + verbose_name_plural = "Daftar Hadir" diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..384ac75 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,25 +1,172 @@ -
- -