Commit 03f0d220 authored by Nurrofimutaqin's avatar Nurrofimutaqin

menambah fitur baru

parent 809afc72
from book.models import *
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from datetime import date
class CategorySerializer(serializers.ModelSerializer):
class Meta:
......@@ -18,6 +18,32 @@ class BookLoanSerializer(serializers.ModelSerializer):
model = Peminjaman
fields = '__all__'
class BookLoanUserSerializer(serializers.ModelSerializer):
class Meta:
model = Peminjaman
fields = ['buku', 'tanggal_kembali']
class OverDueSerializer(serializers.ModelSerializer):
days_overdue = serializers.SerializerMethodField()
class Meta:
model = Peminjaman
fields = '__all__'
def get_days_overdue(self, obj):
if obj.tanggal_kembali and obj.tanggal_kembali < date.today() and not obj.status:
return (date.today() - obj.tanggal_kembali).days
return 0
class NearOverDueSerializer(serializers.ModelSerializer):
sisa_waktu = serializers.SerializerMethodField()
class Meta:
model = Peminjaman
fields = '__all__'
def get_sisa_waktu(self, obj):
if obj.tanggal_kembali and obj.tanggal_kembali > date.today() and not obj.status:
return str(( obj.tanggal_kembali - date.today()).days) + ' days'
return 0
# class UserSerializer(serializers.ModelSerializer):
......
......@@ -47,6 +47,9 @@ urlpatterns = [
#pakai rest framework aja dan tidak dipakai
path('member/login/', views.MemberLoginView.as_view(), name='member-login'),
path('member/profile/', views.MemberProfileView.as_view(), name='member-profile'),
path('member/book-loans/', views.BookLoansUser.as_view(), name='member-book-loans'),
]
urlpatterns = format_suffix_patterns(urlpatterns)
\ No newline at end of file
......@@ -27,7 +27,7 @@ from django.contrib.auth import authenticate
from rest_framework_simplejwt.tokens import RefreshToken
class LargeResultsSetPagination(PageNumberPagination):
page_size = 1
page_size = 5
page_size_query_param = 'page_size'
......@@ -75,7 +75,7 @@ class UserList(generics.ListCreateAPIView):
# serializer_class = UserSerializer
class NearOverdueViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = BookLoanSerializer
serializer_class = NearOverDueSerializer
pagination_class = LargeResultsSetPagination
def get_queryset(self):
# Ambil data peminjaman buku yang hampir deadline (misalnya, 3 hari lagi)
......@@ -86,7 +86,7 @@ class NearOverdueViewSet(viewsets.ReadOnlyModelViewSet):
return queryset
class OverdueViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = BookLoanSerializer
serializer_class = OverDueSerializer
pagination_class = LargeResultsSetPagination
def get_queryset(self):
overdue = Peminjaman.objects.filter(tanggal_kembali__lte=date.today(), status=False)
......@@ -280,3 +280,15 @@ class MemberProfileUpdateView(APIView):
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class BookLoansUser(generics.ListCreateAPIView):
queryset = Peminjaman.objects.all()
serializer_class = BookLoanUserSerializer
permission_classes = [IsAuthenticated]
def perform_create(self, serializer):
serializer.save(member=self.request.user)
def get_queryset(self):
# Mengambil data peminjaman yang sesuai dengan user yang sedang login
return Peminjaman.objects.filter(member=self.request.user)
......@@ -14,13 +14,17 @@ class formBook(ModelForm):
# 'cover' : forms.TextInput({'class' : 'form-control', 'type': 'file'}),
# }
class formLoan(forms.ModelForm):
book = forms.ModelChoiceField(queryset = Book.objects.all(), label= 'book')
member = forms.ModelChoiceField(queryset = CustomUser.objects.all(), label= 'member')
# class formLoan(forms.ModelForm):
# book = forms.ModelChoiceField(queryset = Book.objects.all(), label= 'book')
# member = forms.ModelChoiceField(queryset = CustomUser.objects.all(), label= 'member')
# class Meta:
# model = Peminjaman
# fields = ['book', 'member', 'tanggal_kembali']
class PeminjamanForm(forms.ModelForm):
class Meta:
model = Peminjaman
fields = ['book', 'member', 'tanggal_kembali']
fields = ['buku', 'tanggal_kembali']
class formCategory(ModelForm):
......
......@@ -2,7 +2,7 @@
<div class="card justify-content-center" >
<div class="card-header text-light bg-gradient-danger text-center">
<h3>DETAIL DATA {{buku.judul}}</h3>
<h3>Detail Buku {{buku.judul}}</h3>
</div>
<div class="card-body col-8 ">
<form
......@@ -12,7 +12,7 @@
<label class="col-4 col-form-label" for="judul">Cover Buku :</label>
<div class=" col-8 " >
{%if buku.cover %}
<img src="{{buku.cover.url}}" class=" border border-danger p-2">
<img src="{{buku.cover.url}}" class=" border border-danger p-2" height="500px" width="300px">
{% endif %}
</div>
......
{% extends "index.html"%} {% block content%}
<div class="card">
<div class="card-header text-light bg-gradient-danger">
<h3>Tambah Data Member</h3> </div>
<hr>
<div class="card-body">
<div class="card-body col-sm-5">
<form method="post" action="{% url 'createmember'%}" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group row">
<label class="col-4 col-form-label" for="nama">Nama</label>
<div class="col-8">
<input id="nama" name="nama" placeholder="Masukan nama" type="text" class="form-control" required="required">
</div>
</div>
<div class="form-group row">
<label for="alamat" class="col-4 col-form-label">Alamat</label>
<div class="col-8">
<input id="alamat" name="alamat" placeholder="Masukan alamat" type="text" class="form-control" required="required">
</div>
</div>
<div class="form-group row">
<label for="email" class="col-4 col-form-label">Email</label>
<div class="col-8">
<input id="email" name="email" placeholder="Masukan email" type="email" class="form-control" required="required">
</div>
</div>
<hr>
<button type="submit" name="submit" class="btn btn-primary align-items-center">Insert</button>
</form>
</div>
</div>
</div>
{% endblock content%}
\ No newline at end of file
{% extends "index.html"%} {% block content%}
<div class="card">
<div class="card-header text-light bg-gradient-danger">
<h3>Edit Data {{member.nama}}</h3> </div>
<hr>
<div class="card-body col-5">
<form method="post" action="{% url 'updatemember' member.id%}" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group row">
<label class="col-4 col-form-label" for="nama">nama member</label>
<div class="col-8">
<input id="nama" name="nama" value="{{member.nama}}" placeholder="Masukan Nama member" type="text" class="form-control" required="required">
</div>
</div>
<div class="form-group row">
<label for="alamat" class="col-4 col-form-label"> alamat</label>
<div class="col-8">
<input id="alamat" name="alamat" value="{{member.alamat}}" placeholder="Masukan Alamat Mmeber" type="text" class="form-control" required="required">
</div>
</div>
<div class="form-group row">
<label for="email" class="col-4 col-form-label"> email</label>
<div class="col-8">
<input id="email" name="email" value="{{member.email}}" placeholder="Masukan Email Member" type="text" class="form-control" required="required">
</div>
</div>
<button type="submit" name="submit" class="btn btn-primary align-items-center">Edit</button>
</form>
</div>
</div>
{% endblock content%}
\ No newline at end of file
......@@ -27,6 +27,7 @@
{% endif %}
<a href="{% url 'createpeminjaman'%}" type="button" class="btn btn-primary"><i class="fas fa-fw fa-save"></i> Tambah Data Peminjaman</a>
<a href="{% url 'loans-by-user'%}" type="button" class="btn btn-primary"><i class="fas fa-fw fa-save"></i> Tambah Data Peminjaman by user</a>
</div>
<div class="card-body">
<div class="table-responsive">
......
......@@ -3,7 +3,7 @@
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<h2 class="m-0 font-weight-bold text-primary">Data Member</h2 >
<h2 class="m-0 font-weight-bold text-primary">Data peminjaman</h2 >
<br />
{% if messages %}
{% for message in messages %}
......@@ -22,8 +22,9 @@
{{ message | safe }}
</div>
{% endfor %}
{% endif %}
<a href="{% url 'createmember'%}" type="button" class="btn btn-primary"><i class="fas fa-fw fa-save"></i> Tambah Data Member </a>
</div>
<div class="card-body">
<div class="table-responsive">
......@@ -36,33 +37,35 @@
<thead>
<tr>
<th>No</th>
<th>Nama Member</th>
<th>Alamat</th>
<th>Email</th>
<th>Nama Peminjam</th>
<th>Judul Buku</th>
<th>tanggal pinjam</th>
<th>tanggal Kembali</th>
<th>tanggal Pengembalian</th>
<th>Status Peminjaman</th>
<th>Aksi</th>
</tr>
</thead>
<tfoot>
<tr>
<th>No</th>
<th>Nama Member</th>
<th>Alamat</th>
<th>Email</th>
<th>Aksi</th>
</tr>
</tfoot>
<tbody>
{% for member in member %}
{% for peminjaman in peminjaman %}
<tr>
<td>{{member.id}}</td>
<td>{{member.nama}}</td>
<td>{{member.alamat}}</td>
<td>{{member.email}}</td>
<td>{{peminjaman.id}}</td>
<td>{{peminjaman.member.username}}</td>
<td>{{peminjaman.buku.judul}}</td>
<td>{{peminjaman.tanggal_pinjam}}</td>
<td>{{peminjaman.tanggal_kembali}}</td>
<td>{{peminjaman.tanggal_pengembalian|default:"Not Rerturned"}}</td>
<td>{% if peminjaman.status %}
Returned
{% else %}
Not Returned
{% endif %}
</td>
<td>
<a href="edit/{{member.id}}" class="btn btn-warning ">
<a href="edit/{{peminjaman.id}}" class="btn btn-warning ">
<i class="fas fa-fw fa-edit"></i><span class="text"> Edit</span>
</a>
<a href="delete/{{member.id}}" onclick="return confirm('aapakah anda yakin?')" class="btn btn-danger ">
<a href="delete/{{peminjaman.id}}" onclick="return confirm('apakah anda yakin?')" class="btn btn-danger ">
<i class="fas fa-fw fa-trash"></i><span class="text"> Delete</span>
</a>
</td>
......
{% extends "index.html"%} {% block content%}
<div class="card">
<div class="card-header text-light bg-gradient-danger">
<h3>Tambah Data Peminjaman by user</h3> </div>
<hr>
<div class="card-body">
<div class="card-body col-sm-5">
<form method="post" action="{% url 'loans-by-user'%}" enctype="multipart/form-data">
{% csrf_token %}
<!-- <div class="form-group row">
<label for="tanggal_kembali" class="col-4 col-form-label"> Tanggal Kembali</label>
<div class="col-8">
<input id="tanggal_kembali" name="tanggal_kembali" placeholder="Masukan tanggal kembali" type="date" class="form-control">
</div>
</div>
<div class="form-group row">
<label class="col-4 col-form-label" for="nama">Judul Buku</label>
<div class="col-8">
<select class="form-control" aria-label="Default select example" name="buku_id">
<option selected>Open this select menu</option>
{% for buku in buku %}
<option value="{{buku.id}}">{{buku.judul}}</option>
{%endfor%}
</select>
</div>
</div>
<div class="form-group row">
<label class="col-4 col-form-label" for="nama">Nama Peminjam</label>
<div class="col-8">
<select class="form-control" aria-label="Default select example" name="member_id">
<option selected>Open this select menu</option>
{% for member in member %}
<option value="{{member.id}}">{{member.username}}</option>
{%endfor%}
</select>
</div>
</div> -->
{{form.buku}}
<div class="form-group row">
<label for="tanggal_kembali" class="col-4 col-form-label"> Tanggal Kembali</label>
<div class="col-8">
<input id="tanggal_kembali" name="tanggal_kembali" placeholder="Masukan tanggal kembali" type="date" class="form-control">
</div>
</div>
<hr>
<a href="{% url 'datapeminjaman'%}" type="button" class="btn btn-primary">Back </a>
<button type="submit" name="submit" class="btn btn-warning align-items-center">Submit</button>
</form>
</div>
</div>
</div>
{% endblock content%}
\ No newline at end of file
......@@ -35,5 +35,8 @@ urlpatterns =[
path('categorys/create', CategoryCreateView.as_view(), name='category-create'),
path('categorys/edit/<int:pk>/', CategoryUpdateView.as_view(), name='category-update'),
path('categorys/delete/<int:pk>/', CategoryDeleteView.as_view(), name='category-delete'),
path('book-loan/by-user/', PeminjamanCreateView.as_view(), name='loans-by-user'),
path('list-book-loans/by-user/', ListPeminjamanByUser.as_view(), name='list-loan-user'),
]
......@@ -57,6 +57,32 @@ class BookCreateView(View):
messages.success(request, 'Berhasil Input Data Buku')
return redirect('book-list')
class PeminjamanCreateView(View):
template_name = 'peminjaman/tambah_peminjaman.html'
def get(self, request):
form = PeminjamanForm()
book = Book.objects.all()
return render(request, self.template_name, {'form': form, 'book': book})
def post(self, request):
form = PeminjamanForm(request.POST)
if form.is_valid():
peminjaman = form.save(commit=False)
peminjaman.member = request.user
peminjaman.save()
messages.success(request, 'Berhasil Input Data peminjaman')
return redirect('datapeminjaman')
return render(request, self.template_name, {'form': form})
class ListPeminjamanByUser(View):
template_name = 'peminjaman/list_peminjaman_user.html'
def get(self, request):
peminjaman = Peminjaman.objects.filter(member = request.user )
return render(request, self.template_name, { 'peminjaman': peminjaman})
@method_decorator(login_required, name='dispatch')
class BooksUpdateView(UpdateView):
template_name = 'buku/editbuku.html'
......@@ -67,9 +93,13 @@ class BooksUpdateView(UpdateView):
return render(request, self.template_name, {'books': books, 'categorys': categorys, 'form': form})
def post(self, request, pk):
book = get_object_or_404(Book, pk=pk)
form = formBook(request.POST, request.FILES, instance=book)
form = formBook(request.POST or None, request.FILES or None, instance=book)
if form.is_valid():
form.save()
if book.cover and form.cleaned_data['cover'] != book.cover:
book.cover.delete(save=False)
new_instance = form.save(commit=False)
new_instance.save()
# Redirect ke halaman setelah berhasil mengupdate data
messages.success(request, 'berhasil edit data member')
......@@ -80,7 +110,9 @@ class BooksUpdateView(UpdateView):
@login_required(login_url=settings.LOGIN_URL)
def deleteBook(request, id):
book = Book.objects.get(id=id)
book.cover.delete(save=False)
book.delete()
messages.success(request, 'berhasil menghapus data buku')
return redirect('book-list')
......@@ -102,11 +134,9 @@ def createpeminjaman(request):
# peminjaman = Peminjaman.objects.all()
member = CustomUser.objects.all()
buku = Book.objects.all()
peminjaman = formLoan()
context = {
'member' : member,
'buku' : buku,
'peminjaman': peminjaman
'buku' : buku
}
if request.POST:
tanggal_kembali = request.POST['tanggal_kembali']
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment