Commit 6fe4d040 authored by Fahmi's avatar Fahmi

commit ke 3

parent 4261cddf
...@@ -2,6 +2,7 @@ from library.models import * ...@@ -2,6 +2,7 @@ from library.models import *
from .models import * from .models import *
from rest_framework import serializers from rest_framework import serializers
from django.contrib.auth import authenticate, get_user_model from django.contrib.auth import authenticate, get_user_model
from datetime import date
class UserLoginSerializer(serializers.Serializer): class UserLoginSerializer(serializers.Serializer):
username = serializers.CharField() username = serializers.CharField()
...@@ -99,11 +100,21 @@ class BookLoanSerializer(serializers.ModelSerializer): ...@@ -99,11 +100,21 @@ class BookLoanSerializer(serializers.ModelSerializer):
fields = '__all__' fields = '__all__'
class OverdueLoanSerializer(serializers.ModelSerializer): class OverdueLoanSerializer(serializers.ModelSerializer):
days_over = serializers.SerializerMethodField()
class Meta: class Meta:
model = BookLoan model = BookLoan
fields = '__all__' fields = '__all__'
def get_days_over(self, obj):
return (date.today() - obj.due_date).days
class NearOutstandingLoanSerializer(serializers.ModelSerializer): class NearOutstandingLoanSerializer(serializers.ModelSerializer):
days_left = serializers.SerializerMethodField()
class Meta: class Meta:
model = BookLoan model = BookLoan
fields = '__all__' fields = '__all__'
def get_days_left(self, obj):
return (obj.due_date - date.today()).days
\ No newline at end of file
...@@ -28,29 +28,12 @@ class MyPageNumberPagination(PageNumberPagination): ...@@ -28,29 +28,12 @@ class MyPageNumberPagination(PageNumberPagination):
#regist librarian #regist librarian
class LibrarianRegistrationAPIView(generics.CreateAPIView): class LibrarianRegistrationAPIView(generics.CreateAPIView):
queryset = CustomUser.objects.all() queryset = CustomUser.objects.all()
serializer_class = MemberRegistrationSerializer serializer_class = LibrarianRegistrationSerializer
#regist member #regist member
class MemberRegistrationAPIView(generics.ListCreateAPIView): class MemberRegistrationAPIView(generics.ListCreateAPIView):
queryset = CustomUser.objects.all() queryset = CustomUser.objects.all()
serializer_class = MemberRegistrationSerializer serializer_class = MemberRegistrationSerializer
# def create(self, request, *args, **kwargs):
# serializer = self.get_serializer(data=request.data)
# serializer.is_valid(raise_exception=True)
# user = serializer.save(is_member=True)
# login(request, user)
# response_data = {
# 'message': 'Member registered successfully',
# 'user_id': user.id,
# 'username': user.username,
# 'email': user.email,
# 'is_member': user.is_member,
# }
# return Response(response_data, status=status.HTTP_201_CREATED)
#login member #login member
class MemberLoginView(APIView): class MemberLoginView(APIView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
...@@ -273,7 +256,7 @@ class NearOutstandingLoansAPIView(APIView): ...@@ -273,7 +256,7 @@ class NearOutstandingLoansAPIView(APIView):
def get(self, request, format=None): def get(self, request, format=None):
tomorrow = date.today() + timedelta(days=1) tomorrow = date.today() + timedelta(days=1)
near_outstanding_loans = tomorrow + timedelta(days=2) near_outstanding_loans = tomorrow + timedelta(days=2)
near_date = BookLoan.objects.filter(due_date__gte=tomorrow, due_date__lte=near_outstanding_loans) near_date = BookLoan.objects.filter(due_date__gte=tomorrow, due_date__lte=near_outstanding_loans, is_returned=False)
near_outstanding_loans = near_date.annotate( near_outstanding_loans = near_date.annotate(
time_difference=ExpressionWrapper( time_difference=ExpressionWrapper(
......
from django.conf import settings from django.conf import settings
from django.forms.models import BaseModelForm
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login, update_session_auth_hash
from django.contrib.auth.views import LogoutView from django.contrib.auth.views import LogoutView
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User from django.utils.decorators import method_decorator
# from django.contrib.auth.models import CustomUser
from datetime import date, timedelta from datetime import date, timedelta
from django.db.models import F, ExpressionWrapper, fields from django.db.models import F, ExpressionWrapper, fields
from django.urls import reverse_lazy from django.urls import reverse_lazy
from .forms import * from .forms import *
from .models import Book, Member, BookLoan, Librarian, LoginHistory from .models import *
from django.views.generic import * from django.views.generic import *
from .mixins import LibrarianRequiredMixin
from rest_framework.pagination import PageNumberPagination
from django.contrib.auth.forms import AuthenticationForm
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from .decorators import librarian_required
#pagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 5
page_size_query_param = 'page_size'
# Create your views here. # Create your views here.
def homepage(request): def homepage(request):
return render(request, 'homepage.html') return render(request, 'homepage.html')
def login_view(request): #librarian Regist
login_form = LoginForm() def librarian_registration(request):
if request.method == 'POST':
form = LibrarianRegistrationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.set_password(form.cleaned_data['password1'])
user.save()
return redirect('login') # Redirect to librarian dashboard or another page
else:
form = LibrarianRegistrationForm()
return render(request, 'librarian_registration.html', {'form': form})
#Login
def Login(request):
if request.method == 'POST': if request.method == 'POST':
login_form = LoginForm(request.POST) form = CustomAuthenticationForm(request, data=request.POST)
if login_form.is_valid(): if form.is_valid():
username = login_form.cleaned_data['username'] username = form.cleaned_data['username']
password = login_form.cleaned_data['password'] password = form.cleaned_data['password']
user = authenticate(request, username=username, password=password) user = authenticate(request, username=username, password=password)
if user is not None and user.is_active: if user is not None:
login(request, user) login(request, user)
return redirect('dashboard') return redirect('dashboard')
else: else:
login_form.add_error(None, 'Invalid username or password') form = AuthenticationForm()
return render(request, 'login.html', {'login_form': login_form}) return render(request, 'login.html', {'form': form})
def register_view(request): #member regist
def member_registration(request):
if request.method == 'POST': if request.method == 'POST':
user_form = userCreat(request.POST) form = MemberRegistrationForm(request.POST)
librarian_form = LibrarianForm(request.POST) if form.is_valid():
user = form.save(commit=False)
if user_form.is_valid() and librarian_form.is_valid(): user.is_member = True
user = user_form.save() user.save()
librarian = librarian_form.save(commit=False) return redirect('login') # Redirect to member dashboard or another page
librarian.user = user
librarian.save()
return redirect('login')
else: else:
user_form = UserCreationForm() form = MemberRegistrationForm()
librarian_form = LibrarianForm()
context = {'user_form': user_form, 'librarian_form': librarian_form}
return render(request, 'register.html', context) return render(request, 'member_registration.html', {'form': form})
@login_required @login_required
def dashboard(request): def dashboard(request):
return render(request, 'dashboard.html') return render(request, 'dashboard.html')
@login_required @librarian_required
class CustomLogoutView(LogoutView):
next_page = 'homepage'
@login_required
def book_list(request):
books = Book.objects.all()
return render(request, 'book_list.html', {'books': books})
@login_required
def book_new(request):
if request.method == 'POST':
form = BookForm(request.POST)
if form.is_valid():
form.save()
return redirect('book_list')
else:
form = BookForm()
return render(request, 'book_new.html', {'form': form})
@login_required
def book_update(request, id):
context = {}
book = get_object_or_404(Book, id=id)
form = BookForm(instance=book)
context['book'] = book
if request.method == 'POST':
form = BookForm(request.POST, instance=book)
if form.is_valid():
form.save()
return redirect('book_list')
else:
form = BookForm(instance=book)
context['form'] = form
return render(request, 'book_update.html', context)
@login_required
def book_delete(request, id):
book = get_object_or_404(Book, id=id)
book.delete()
return redirect('book_list')
@login_required
def member_list(request): def member_list(request):
members = Member.objects.all() members = Member.objects.all()
return render(request, 'member_list.html', {'members': members}) return render(request, 'member_list.html', {'members': members})
@login_required @librarian_required
def member_new(request): def member_new(request):
if request.method == 'POST': if request.method == 'POST':
form = MemberForm(request.POST) form = MemberForm(request.POST)
...@@ -121,7 +95,7 @@ def member_new(request): ...@@ -121,7 +95,7 @@ def member_new(request):
form = MemberForm() form = MemberForm()
return render(request, 'member_new.html', {'form': form}) return render(request, 'member_new.html', {'form': form})
@login_required @librarian_required
def edit_member(request, id): def edit_member(request, id):
context = {} context = {}
member = get_object_or_404(Member, id=id) member = get_object_or_404(Member, id=id)
...@@ -139,18 +113,64 @@ def edit_member(request, id): ...@@ -139,18 +113,64 @@ def edit_member(request, id):
context['form'] = form context['form'] = form
return render(request, 'member_update.html', context) return render(request, 'member_update.html', context)
@login_required @librarian_required
def delete_member(request, id): def delete_member(request, id):
member = get_object_or_404(Member, id=id) member = get_object_or_404(Member, id=id)
member.delete() member.delete()
return redirect('member_list') return redirect('member_list')
@login_required @librarian_required
def librarian_list(request):
librarian = Librarian.objects.all()
return render(request, 'librarian_list.html', {'librarian': librarian})
@librarian_required
def librarian_new(request):
if request.method == 'POST':
form = LibrarianForm(request.POST)
if form.is_valid():
form.save()
return redirect('librarian_list')
else:
form = LibrarianForm()
return render(request, 'librarian_new.html', {'form': form})
@librarian_required
def librarian_update(request, id):
context = {}
librarian = get_object_or_404(Librarian, id=id)
form = LibrarianForm(instance=librarian)
context['librarian'] = librarian
if request.method == 'POST':
form = LibrarianForm(request.POST, instance=librarian)
if form.is_valid():
form.save()
return redirect(librarian_list)
else:
form = LibrarianForm(instance=librarian)
context['form'] = form
return render(request, 'librarian_update.html', context)
@librarian_required
def librarian_delete(request, pk):
librarian = Librarian.objects.get(pk=pk)
librarian.user.delete()
librarian.delete()
return redirect('librarian_list')
@librarian_required
def librarian_login_history(request):
login_history = LoginHistory.objects.all()
return render(request, 'librarian_login_history.html', {'login_history': login_history})
@librarian_required
def book_loan_list(request): def book_loan_list(request):
book_loan = BookLoan.objects.all() book_loan = BookLoan.objects.all()
return render(request, 'book_loan_list.html', {'book_loan': book_loan}) return render(request, 'book_loan_list.html', {'book_loan': book_loan})
@login_required @librarian_required
def book_loan_new(request): def book_loan_new(request):
members = Member.objects.all() members = Member.objects.all()
books = Book.objects.all() books = Book.objects.all()
...@@ -163,7 +183,7 @@ def book_loan_new(request): ...@@ -163,7 +183,7 @@ def book_loan_new(request):
form = BookLoanForm() form = BookLoanForm()
return render(request, 'book_loan_new.html', {'form': form, 'members': members, 'books': books}) return render(request, 'book_loan_new.html', {'form': form, 'members': members, 'books': books})
@login_required @librarian_required
def book_loan_update(request, id): def book_loan_update(request, id):
context = {} context = {}
...@@ -183,13 +203,30 @@ def book_loan_update(request, id): ...@@ -183,13 +203,30 @@ def book_loan_update(request, id):
return render(request, 'book_loan_update.html', context) return render(request, 'book_loan_update.html', context)
@login_required @librarian_required
def book_loan_delete(request, id): def book_loan_delete(request, id):
book_loan = get_object_or_404(BookLoan, id=id) book_loan = get_object_or_404(BookLoan, id=id)
book_loan.delete() book_loan.delete()
return redirect('book_loan_list') return redirect('book_loan_list')
@login_required @librarian_required
def near_outstanding_loans(request):
tomorow = date.today() + timedelta(days=1)
near_outstanding_loans = tomorow + timedelta(days=2)
near_date = BookLoan.objects.filter(due_date__gte=tomorow, due_date__lte=near_outstanding_loans, is_returned=False)
near_outstanding_loans = near_date.annotate(
time_difference=ExpressionWrapper(
F('due_date') - date.today(),
output_field=fields.DurationField()
)
)
context = {'near_outstanding_loan': near_outstanding_loans}
return render(request, 'near_outstanding_loans.html', context)
@librarian_required
def overdue_loans(request): def overdue_loans(request):
overdue_loans = BookLoan.objects.filter(due_date__lte=date.today()) overdue_loans = BookLoan.objects.filter(due_date__lte=date.today())
...@@ -200,125 +237,207 @@ def overdue_loans(request): ...@@ -200,125 +237,207 @@ def overdue_loans(request):
) )
).exclude(is_returned=True) ).exclude(is_returned=True)
for loan in over_due:
loan.dead = abs(loan.dead.days)
context = { context = {
'over_due': over_due, 'over_due': over_due,
} }
return render(request, 'overdue_loans.html', context) return render(request, 'overdue_loans.html', context)
@login_required @method_decorator(login_required, name='dispatch')
def near_outstanding_loans(request): class BookList(ListView):
tomorow = date.today() + timedelta(days=1) model = Book
near_outstanding_loans = tomorow + timedelta(days=2) template_name = "book_list.html"
near_date = BookLoan.objects.filter(due_date__gte=tomorow, due_date__lte=near_outstanding_loans) context_object_name = 'books'
pagination_class = MyPageNumberPagination
near_outstanding_loans = near_date.annotate( @method_decorator(login_required, name='dispatch')
time_difference=ExpressionWrapper( class BookDetail(DetailView):
F('due_date') - date.today(), model = Book
output_field=fields.DurationField() template_name = 'book_detail.html'
)
)
context = {'near_outstanding_loan': near_outstanding_loans} @method_decorator(librarian_required, name='dispatch')
class BookCreateView(View):
template_name = 'book_new.html'
return render(request, 'near_outstanding_loans.html', context) # get category list
def get(self, request):
category = Category.objects.all()
return render(request, self.template_name, {'category': category})
@login_required #form new book
def librarian_list(request): def post(self, request):
librarian = Librarian.objects.all() form = BookForm(request.POST, request.FILES)
return render(request, 'librarian_list.html', {'librarian': librarian}) form.save()
return redirect('book-list')
@method_decorator(login_required, name='dispatch')
class BookUpdateView(LibrarianRequiredMixin, UpdateView):
template_name = 'book_update.html'
#get
def get(self, request, pk):
book = get_object_or_404(Book, pk=pk)
category = Category.objects.all()
return render(request, self.template_name, {'book': book, 'category': category})
# form update book
def post(self, request, pk):
book = get_object_or_404(Book, pk=pk)
form = BookForm(request.POST, request.FILES, instance=book)
form.save()
return redirect('book-list')
@login_required @librarian_required
def librarian_new(request): def book_delete(request, id):
if request.method == 'POST': book = get_object_or_404(Book, id=id)
user_form = userCreat(request.POST) book.delete()
librarian_form = LibrarianForm(request.POST) return redirect('book-list')
if user_form.is_valid() and librarian_form.is_valid(): @method_decorator(login_required, name='dispatch')
user = user_form.save() class BookDeleteView(LibrarianRequiredMixin, DeleteView):
librarian = librarian_form.save(commit=False) model = Book
librarian.user = user template_name = 'book_delete.html'
librarian.save() success_url = reverse_lazy('book-list')
return redirect('librarian_list') @method_decorator(login_required, name='dispatch')
class CategoryListView(ListView):
model = Category
template_name = 'category_list.html'
context_object_name = 'categories'
else: @method_decorator(login_required, name='dispatch')
user_form = UserCreationForm() class CategoryCreateView(LibrarianRequiredMixin, CreateView):
librarian_form = LibrarianForm() model = Category
form_class = CategoryForm
template_name = 'category_new.html'
success_url = reverse_lazy('category_list') # Adjust the success URL as needed
def form_valid(self, form):
form.instance.owner = self.request.user
return super().form_valid(form)
@method_decorator(login_required, name='dispatch')
class CategoryUpdateView(LibrarianRequiredMixin,UpdateView):
model = Category
form_class = CategoryForm
template_name = 'category_update.html'
context_object_name = 'categories'
success_url = reverse_lazy('category_list') # Adjust the success URL as needed
context = {'user_form': user_form, 'librarian_form': librarian_form} def form_valid(self, form):
form.instance.owner = self.request.user
return super().form_valid(form)
return render(request, 'librarian_new.html', context) @login_required
def userchange_password(request):
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
confirm_password = request.POST.get('confirm_password')
# @login_required # Ensure that new password and confirm password match
# def librarian_update(request, pk): if new_password != confirm_password:
# context = {} messages.error(request, 'New password and confirm password do not match.')
# librarian = Librarian.objects.get(pk=pk) return render(request, 'update_password.html')
# context['librarian'] = librarian
# if request.method == 'POST': # Authenticate the user
# form = LibrarianForm(request.POST, instance=librarian) user = authenticate(request, username=request.user.username, password=old_password)
# if form.is_valid():
# form.save()
# return redirect('librarian_list')
# else:
# form = LibrarianForm(instance=librarian)
# context['form'] = form if user is not None:
# Set the new password
user.set_password(new_password)
user.save()
# return render(request, 'librarian_update.html', context) update_session_auth_hash(request, user)
def librarian_update(request, pk): messages.success(request, 'Password changed successfully.')
return redirect('updatepassword_success') # Redirect to the user's profile or another page
else:
messages.error(request, 'Incorrect old password. Please try again.')
librarian = get_object_or_404(librarian, pk=pk)
librarian_form = LibrarianUpdateForm(instance=librarian)
if request.method == 'POST': return render(request, 'update_password.html')
user_form = LibrarianUpdateForm(request.POST, instance=librarian.user)
librarian_form = LibrarianUpdateForm(request.POST, instance=librarian)
if user_form.is_valid() and librarian_form.is_valid(): def updatepassword_success(request):
user_form.save() return render(request, 'updatepassword_success.html')
librarian_form.save()
return redirect('librarian_list') @login_required
def update_usermember(request):
if request.method == 'POST':
form = MemberProfileUpdateForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
messages.success(request, 'Your Profile has been Update!')
return redirect('updateuser_success')
else: else:
user_form = LibrarianUpdateForm(instance=librarian.user) form = MemberProfileUpdateForm(instance=request.user)
context = {'user_form': user_form, 'librarian_form': librarian_form, 'librarian': librarian}
return render(request, 'librarian_update.html', context) return render(request, 'update_usermember.html', {'form': form})
@login_required @login_required
def librarian_delete(request, pk): def update_userlibrarian(request):
librarian = Librarian.objects.get(pk=pk)
librarian.user.delete()
librarian.delete()
return redirect('librarian_list')
@login_required if request.method == 'POST':
def librarian_login_history(request): form = LibrarianProfileUpdateForm(request.POST, instance=request.user)
login_history = LoginHistory.objects.all() if form.is_valid():
return render(request, 'librarian_login_history.html', {'login_history': login_history}) form.save()
messages.success(request, 'Your Profile has been Update!')
return redirect('updateuser_success')
else:
form = LibrarianProfileUpdateForm(instance=request.user)
return render(request, 'update_userlibrarian.html', {'form': form})
class BookList(ListView): def updateuser_success(request):
model = Book return render(request, 'updateuser_success.html')
template_name = "book_list.html"
context_object_name = 'books'
class BookCreateView(CreateView): def unauthorized(request):
model = Book return render(request, 'unauthorized.html')
form_class = BookForm
template_name = 'book_new.html'
success_url = reverse_lazy('book_list') # Adjust the success URL as needed
def form_valid(self, form): @method_decorator(login_required, name='dispatch')
form.instance.owner = self.request.user class BookLoanList(ListView):
return super().form_valid(form) model = BookLoan
template_name = 'book_loan_list.html'
context_object_name = 'bookloan'
class CategoryListView(ListView): @method_decorator(librarian_required, name='dispatch')
model = Category class BookLoanCreateView(View):
template_name = 'category_list.html' template_name = 'book_loan_new.html'
context_object_name = 'categories'
\ No newline at end of file # get book list
def get(self, request):
book = Book.objects.all()
return render(request, self.template_name, {'book': book})
# get member list
def get(self, request):
member = Member.objects.all()
return render(request, self.template_name, {'member': member})
#form new book
def post(self, request):
form = BookLoanForm(request.POST, request.FILES)
form.save()
return redirect('bookloan-list')
@method_decorator(login_required, name='dispatch')
class BookLoanUpdateView(LibrarianRequiredMixin, UpdateView):
template_name = 'book_loan_update.html'
#get
def get(self, request, pk):
bookloan = get_object_or_404(BookLoan, pk=pk)
book = Book.objects.all()
member = Member.objects.all()
return render(request, self.template_name, {'bookloan': bookloan, 'book': book, 'member': member})
# form update book
def post(self, request, pk):
book = get_object_or_404(Book, pk=pk)
form = BookForm(request.POST, request.FILES, instance=book)
form.save()
return redirect('bookloan-update')
\ No newline at end of file
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