Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
L
library-app-django
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ilham Maulana
library-app-django
Commits
33a94841
Commit
33a94841
authored
Jul 15, 2024
by
Ilham Maulana
💻
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: refactor users member and librarian frontend
parent
fd77496a
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
350 additions
and
9 deletions
+350
-9
book_table_data.html
book/templates/book_table_data.html
+2
-4
urls.py
config/urls.py
+5
-0
urls.py
dashboard/urls.py
+27
-2
forms.py
users/forms.py
+44
-0
0003_alter_librarianloginhistory_librarian.py
.../migrations/0003_alter_librarianloginhistory_librarian.py
+19
-0
models.py
users/models.py
+1
-1
librarians.html
users/templates/librarians/librarians.html
+12
-0
librarians_table_data.html
users/templates/librarians/librarians_table_data.html
+46
-0
members.html
users/templates/members/members.html
+12
-0
members_table_data.html
users/templates/members/members_table_data.html
+44
-0
views.py
users/views.py
+138
-2
No files found.
book/templates/book_table_data.html
View file @
33a94841
...
...
@@ -3,9 +3,8 @@
<tr
class=
"table-primary"
>
<th
scope=
"col"
>
Title
</th>
<th
scope=
"col"
>
Category
</th>
<th
scope=
"col"
>
Stock
</th>
<th
scope=
"col"
>
Description
</th>
<th
scope=
"col"
>
Year
</th>
<th
scope=
"col"
>
Published Date
</th>
<th
scope=
"col"
>
Created At
</th>
<th
scope=
"col"
>
Updated At
</th>
<th
scope=
"col"
></th>
...
...
@@ -16,9 +15,8 @@
<tr>
<td><a
href=
"/dashboard/books/{{ book.id }}/"
>
{{ book.title }}
</a></td>
<td>
{{ book.category.name }}
</td>
<td>
{{ book.stock }}
</td>
<td>
{{ book.description }}
</td>
<td>
{{ book.publish
ed_year
}}
</td>
<td>
{{ book.publish
_date
}}
</td>
<td>
{{ book.created_at }}
</td>
<td>
{{ book.updated_at }}
</td>
<td>
...
...
config/urls.py
View file @
33a94841
...
...
@@ -17,6 +17,8 @@ Including another URLconf
from
django.contrib
import
admin
from
django.urls
import
path
,
include
from
django.conf
import
settings
from
django.conf.urls.static
import
static
urlpatterns
=
[
# local
...
...
@@ -27,3 +29,6 @@ urlpatterns = [
# 3rd party
path
(
"api-auth/"
,
include
(
"rest_framework.urls"
),
name
=
"api_auth"
),
]
if
settings
.
DEBUG
:
urlpatterns
+=
static
(
settings
.
MEDIA_URL
,
document_root
=
settings
.
MEDIA_ROOT
)
dashboard/urls.py
View file @
33a94841
from
django.urls
import
path
,
include
from
users.views
import
(
LibrarianListView
,
LibrarianCreateView
,
LibrarianDeleteView
,
LibrarianUpdateView
,
MemberListView
,
MemberCreateView
,
MemberDeleteView
,
MemberUpdateView
,
)
from
dashboard.views
import
DashboardView
urlpatterns
=
[
path
(
""
,
DashboardView
.
as_view
(),
name
=
"dashboard"
),
path
(
"books/"
,
include
(
"book.urls"
)),
# librarians
path
(
"librarians/"
,
LibrarianListView
.
as_view
(),
name
=
"librarian_lists"
),
path
(
"librarians/add/"
,
LibrarianCreateView
.
as_view
(),
name
=
"create_librarian"
),
path
(
"librarians/<int:pk>/"
,
LibrarianUpdateView
.
as_view
(),
name
=
"update_librarian"
),
path
(
"librarians/<int:pk>/delete/"
,
LibrarianDeleteView
.
as_view
(),
name
=
"delete_librarian"
,
),
# members
path
(
"members/"
,
MemberListView
.
as_view
(),
name
=
"member_lists"
),
path
(
"members/add/"
,
MemberCreateView
.
as_view
(),
name
=
"create_member"
),
path
(
"members/<int:pk>/"
,
MemberUpdateView
.
as_view
(),
name
=
"update_member"
),
path
(
"members/<int:pk>/delete/"
,
MemberDeleteView
.
as_view
(),
name
=
"delete_member"
),
# path("categories/", include("categories.urls")),
# path("members/", include("members.urls")),
# path("book-loans/", include("book_loans.urls")),
# path("librarians/", include("librarians.urls")),
# path("upcoming-loans/", UpcomingLoanView.as_view(), name="upcoming_loans"),
# path("overdued-loans/", OverduedLoanView.as_view(), name="overdued_loans"),
]
users/forms.py
0 → 100644
View file @
33a94841
from
django
import
forms
from
users.models
import
User
class
UserForm
(
forms
.
ModelForm
):
class
Meta
:
model
=
User
fields
=
[
"username"
,
"email"
,
"password"
,
"first_name"
,
"last_name"
]
widgets
=
{
"username"
:
forms
.
TextInput
(
attrs
=
{
"placeholder"
:
"Username"
,
"class"
:
"form-control"
,
}
),
"email"
:
forms
.
EmailInput
(
attrs
=
{
"placeholder"
:
"Email"
,
"class"
:
"form-control"
,
}
),
"password"
:
forms
.
PasswordInput
(
attrs
=
{
"placeholder"
:
"Password"
,
"class"
:
"form-control"
,
}
),
"first_name"
:
forms
.
TextInput
(
attrs
=
{
"placeholder"
:
"Firts Name"
,
"class"
:
"form-control"
,
}
),
"last_name"
:
forms
.
TextInput
(
attrs
=
{
"placeholder"
:
"Last Name"
,
"class"
:
"form-control"
,
}
),
}
def
__init__
(
self
,
*
args
,
**
kwargs
):
super
(
UserForm
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
self
.
fields
[
"password"
]
.
required
=
False
users/migrations/0003_alter_librarianloginhistory_librarian.py
0 → 100644
View file @
33a94841
# Generated by Django 5.0.7 on 2024-07-15 08:46
import
django.db.models.deletion
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'users'
,
'0002_initial'
),
]
operations
=
[
migrations
.
AlterField
(
model_name
=
'librarianloginhistory'
,
name
=
'librarian'
,
field
=
models
.
OneToOneField
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
to
=
'users.librarian'
),
),
]
users/models.py
View file @
33a94841
...
...
@@ -28,6 +28,6 @@ class Member(models.Model):
class
LibrarianLoginHistory
(
models
.
Model
):
librarian
=
models
.
OneToOneField
(
Librarian
,
blank
=
True
,
null
=
True
,
on_delete
=
models
.
DO_NOTHING
Librarian
,
blank
=
True
,
null
=
True
,
on_delete
=
models
.
CASCADE
)
date
=
models
.
DateTimeField
(
auto_now_add
=
True
)
users/templates/librarians/librarians.html
0 → 100644
View file @
33a94841
{% extends "layout.html" %} {% block dashboard %}
<div
style=
"max-width: 80vw"
class=
"w-100 p-4"
>
<div
class=
"d-flex gap-2 mb-4"
>
{% include "order_form.html" %}
<a
type=
"button"
class=
"btn btn-primary"
href=
"/dashboard/librarians/add/"
>
<i
class=
"bi bi-plus-circle"
></i>
Add Librarian
</a>
{% include "search_form.html" %}
</div>
{% include "librarians/librarians_table_data.html" %}
</div>
{% endblock dashboard %}
users/templates/librarians/librarians_table_data.html
0 → 100644
View file @
33a94841
<table
class=
"table table-hover"
>
<thead>
<tr
class=
"table-primary"
>
<th
scope=
"col"
>
Username
</th>
<th
scope=
"col"
>
Email
</th>
<th
scope=
"col"
>
Created At
</th>
<th
scope=
"col"
>
Updated At
</th>
<th
scope=
"col"
></th>
</tr>
</thead>
<tbody>
{% if object_list %} {% for librarian in object_list %}
<tr>
<td>
{{ librarian.user.username }}
</td>
<td>
{{ librarian.user.email }}
</td>
<td>
{{ librarian.created_at }}
</td>
<td>
{{ librarian.updated_at }}
</td>
<td
class=
"d-flex gap-2"
>
<a
class=
"btn btn-success"
href=
"/dashboard/librarians/{{ librarian.id }}/"
>
<i
class=
"bi bi-pencil-square"
></i>
</a>
<a
class=
"btn btn-danger"
href=
"/dashboard/librarians/{{ librarian.id }}/delete/"
>
<i
class=
"bi bi-trash3-fill"
></i>
</a>
</td>
</tr>
{% endfor %} {% else %}
<tr
class=
"w-100"
>
<td></td>
<td></td>
<td>
<p>
Data Empty
</p>
</td>
<td></td>
<td></td>
</tr>
{% endif %}
</tbody>
</table>
{% include "pagination.html" %}
users/templates/members/members.html
0 → 100644
View file @
33a94841
{% extends "layout.html" %} {% block dashboard %}
<div
style=
"max-width: 80vw"
class=
"w-100 p-4"
>
<div
class=
"d-flex gap-2 mb-4"
>
{% include "order_form.html" %}
<a
type=
"button"
class=
"btn btn-primary"
href=
"/dashboard/members/add/"
>
<i
class=
"bi bi-plus-circle"
></i>
Add Member
</a>
{% include "search_form.html" %}
</div>
{% include "members/members_table_data.html" %}
</div>
{% endblock dashboard %}
users/templates/members/members_table_data.html
0 → 100644
View file @
33a94841
<table
class=
"table table-hover"
>
<thead>
<tr
class=
"table-primary"
>
<th
scope=
"col"
>
Username
</th>
<th
scope=
"col"
>
Email
</th>
<th
scope=
"col"
>
Created At
</th>
<th
scope=
"col"
>
Updated At
</th>
<th
scope=
"col"
></th>
</tr>
</thead>
<tbody>
{% if object_list %} {% for member in object_list %}
<tr
class=
"text-truncate"
>
<td>
{{ member.user.username }}
</td>
<td>
{{ member.user.email }}
</td>
<td>
{{ member.created_at }}
</td>
<td>
{{ member.updated_at }}
</td>
<td
class=
"d-flex gap-2"
>
<a
class=
"btn btn-success"
href=
"/dashboard/members/{{ member.id }}/"
>
<i
class=
"bi bi-pencil-square"
></i>
</a>
<a
class=
"btn btn-danger"
href=
"/dashboard/members/{{ member.id }}/delete/"
>
<i
class=
"bi bi-trash3-fill"
></i>
</a>
</td>
</tr>
{% endfor %} {% else %}
<tr
class=
"w-100"
>
<td></td>
<td></td>
<td></td>
<td>
<p>
Data Empty
</p>
</td>
<td></td>
<td></td>
</tr>
{% endif %}
</tbody>
</table>
{% include "pagination.html" %}
users/views.py
View file @
33a94841
from
django.shortcuts
import
render
from
django.db.models
import
Q
from
django.views
import
generic
# Create your views here.
from
users.models
import
Librarian
,
Member
from
users.forms
import
UserForm
,
User
class
UserListView
(
generic
.
ListView
):
def
get_queryset
(
self
):
queryset
=
super
()
.
get_queryset
()
keyword
=
self
.
request
.
GET
.
get
(
"q"
)
order
=
self
.
request
.
GET
.
get
(
"o"
)
if
keyword
:
queryset
=
queryset
.
filter
(
Q
(
user__name__icontains
=
keyword
)
|
Q
(
user__email__icontains
=
keyword
)
)
.
order_by
(
"-created_at"
)
if
order
:
if
order
==
"new"
:
queryset
=
queryset
.
order_by
(
"-created_at"
)
elif
order
==
"old"
:
queryset
=
queryset
.
order_by
(
"created_at"
)
return
queryset
.
order_by
(
"-updated_at"
)
class
UserCreateView
(
generic
.
FormView
):
form_class
=
UserForm
template_name
=
"form/create_form.html"
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
form
=
self
.
get_form
()
if
form
.
is_valid
():
formData
=
form
.
cleaned_data
.
copy
()
user
=
self
.
model
.
objects
.
create_user
(
**
formData
,
is_staff
=
True
)
return
user
else
:
return
None
class
UserUpdateView
(
generic
.
FormView
):
form_class
=
UserForm
template_name
=
"form/update_form.html"
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
obj
=
self
.
model
.
objects
.
get
(
pk
=
kwargs
[
"pk"
])
self
.
initial
=
{
"username"
:
obj
.
user
.
username
,
"email"
:
obj
.
user
.
email
,
"password"
:
obj
.
user
.
password
,
}
return
super
()
.
get
(
request
,
*
args
,
**
kwargs
)
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
obj
=
self
.
model
.
objects
.
get
(
pk
=
kwargs
[
"pk"
])
form
=
self
.
get_form
()
if
form
.
is_valid
():
formData
=
form
.
cleaned_data
.
copy
()
User
.
objects
.
filter
(
pk
=
obj
.
user
.
id
)
.
update
(
**
formData
)
return
self
.
form_valid
(
form
)
else
:
return
self
.
form_invalid
(
form
)
class
UserDeleteView
(
generic
.
edit
.
DeleteView
):
template_name
=
"form/delete_form.html"
def
form_valid
(
self
,
form
):
user_pk
=
self
.
get_object
()
.
user
.
id
User
.
objects
.
get
(
pk
=
user_pk
)
.
delete
()
return
super
()
.
form_valid
(
form
)
class
LibrarianListView
(
UserListView
):
model
=
Librarian
template_name
=
"librarians/librarians.html"
paginate_by
=
5
class
LibrarianCreateView
(
UserCreateView
):
model
=
User
success_url
=
"/dashboard/librarians/"
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
form
=
self
.
get_form
()
if
form
.
is_valid
():
user
=
super
()
.
post
(
request
)
Librarian
.
objects
.
create
(
user
=
user
)
return
self
.
form_valid
(
form
)
else
:
return
self
.
form_invalid
(
form
)
class
LibrarianUpdateView
(
UserUpdateView
):
model
=
Librarian
success_url
=
"/dashboard/librarians"
class
LibrarianDeleteView
(
UserDeleteView
):
model
=
Librarian
success_url
=
"/dashboard/librarians"
class
MemberListView
(
UserListView
):
model
=
Member
template_name
=
"members/members.html"
paginate_by
=
5
class
MemberCreateView
(
UserCreateView
):
model
=
User
success_url
=
"/dashboard/members/"
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
form
=
self
.
get_form
()
if
form
.
is_valid
():
user
=
super
()
.
post
(
request
)
Member
.
objects
.
create
(
user
=
user
)
return
self
.
form_valid
(
form
)
else
:
return
self
.
form_invalid
(
form
)
class
MemberUpdateView
(
UserUpdateView
):
model
=
Member
success_url
=
"/dashboard/members"
class
MemberDeleteView
(
UserDeleteView
):
model
=
Member
success_url
=
"/dashboard/members"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment