Skip to content

Commit 7d2acdf

Browse files
author
mominur-helios
committed
add, update, delete product and user
1 parent f37f8da commit 7d2acdf

File tree

10 files changed

+942
-73
lines changed

10 files changed

+942
-73
lines changed

apps/tables/forms.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from django import forms
2+
from apps.common.models import Product
3+
4+
5+
6+
class ProductForm(forms.ModelForm):
7+
class Meta:
8+
model = Product
9+
fields = '__all__'
10+
11+
12+
def __init__(self, *args, **kwargs):
13+
super(ProductForm, self).__init__(*args, **kwargs)
14+
15+
for field_name, field in self.fields.items():
16+
self.fields[field_name].widget.attrs['placeholder'] = field.label
17+
self.fields[field_name].widget.attrs['class'] = 'bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500'
18+
self.fields[field_name].widget.attrs['required'] = False

apps/tables/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44

55
urlpatterns = [
66
path("", views.datatables, name="datatables"),
7+
path('delete-product/<int:id>/', views.delete_product, name="delete_product"),
8+
path('update-product/<int:id>/', views.update_product, name="update_product"),
79
]

apps/tables/utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
def product_filter(request):
2+
filter_string = {}
3+
filter_mappings = {
4+
'search': 'name__icontains'
5+
}
6+
for key in request.GET:
7+
if request.GET.get(key) and key != 'page':
8+
filter_string[filter_mappings[key]] = request.GET.get(key)
9+
10+
return filter_string

apps/tables/views.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,56 @@
11
from django.http import HttpResponse
2-
from django.shortcuts import render
2+
from django.shortcuts import render, redirect
3+
from apps.tables.forms import ProductForm
4+
from apps.common.models import Product
5+
from django.core.paginator import Paginator
6+
from django.contrib.auth.decorators import login_required
7+
from apps.tables.utils import product_filter
38

49
# Create your views here.
510

611
def datatables(request):
12+
filters = product_filter(request)
13+
product_list = Product.objects.filter(**filters)
14+
form = ProductForm()
15+
16+
page = request.GET.get('page', 1)
17+
paginator = Paginator(product_list, 5)
18+
products = paginator.page(page)
19+
20+
if request.method == 'POST':
21+
form = ProductForm(request.POST)
22+
if form.is_valid():
23+
return post_request_handling(request, form)
24+
725
context = {
826
'segment' : 'datatables',
927
'parent' : 'apps',
28+
'form' : form,
29+
'products' : products
1030
}
11-
return render(request, 'pages/apps/datatables.html', context)
31+
32+
return render(request, 'pages/apps/datatables.html', context)
33+
34+
35+
36+
@login_required(login_url='/users/signin/')
37+
def post_request_handling(request, form):
38+
form.save()
39+
return redirect(request.META.get('HTTP_REFERER'))
40+
41+
@login_required(login_url='/users/signin/')
42+
def delete_product(request, id):
43+
product = Product.objects.get(id=id)
44+
product.delete()
45+
return redirect(request.META.get('HTTP_REFERER'))
46+
47+
48+
@login_required(login_url='/users/signin/')
49+
def update_product(request, id):
50+
product = Product.objects.get(id=id)
51+
if request.method == 'POST':
52+
product.name = request.POST.get('name')
53+
product.price = int(request.POST.get('price'))
54+
product.info = request.POST.get('info')
55+
product.save()
56+
return redirect(request.META.get('HTTP_REFERER'))

apps/users/urls.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,10 @@
2525

2626
path('profile/', views.profile, name='profile'),
2727
path('upload-avatar/', views.upload_avatar, name='upload_avatar'),
28-
path('change-password', views.change_password, name='change_password'),
28+
path('change-password/', views.change_password, name='change_password'),
29+
30+
path('user-list/', views.user_list, name='user_list'),
31+
path('delete-user/<int:id>/', views.delete_user, name="delete_user"),
32+
path('update-user/<int:id>/', views.update_user, name="update_user"),
33+
path('user-change-password/<int:id>/', views.user_change_password, name="user_change_password"),
2934
]

apps/users/utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
def user_filter(request):
2+
filter_string = {}
3+
filter_mappings = {
4+
'search': 'username__icontains'
5+
}
6+
for key in request.GET:
7+
if request.GET.get(key) and key != 'page':
8+
filter_string[filter_mappings[key]] = request.GET.get(key)
9+
10+
return filter_string

apps/users/views.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
from django.contrib.auth.decorators import login_required
1111
from django.contrib.auth.hashers import check_password
1212
from django.contrib import messages
13+
from django.contrib.auth.models import User
14+
from django.core.paginator import Paginator
15+
from apps.users.utils import user_filter
1316

1417
# Create your views here.
1518

@@ -84,7 +87,63 @@ def change_password(request):
8487
if request.method == 'POST':
8588
if check_password(request.POST.get('current_password'), user.password):
8689
user.set_password(request.POST.get('new_password'))
90+
user.save()
8791
messages.success(request, 'Password changed successfully')
8892
else:
8993
messages.error(request, "Password doesn't match!")
94+
return redirect(request.META.get('HTTP_REFERER'))
95+
96+
97+
98+
def user_list(request):
99+
filters = user_filter(request)
100+
user_list = User.objects.filter(**filters)
101+
form = SignupForm()
102+
103+
page = request.GET.get('page', 1)
104+
paginator = Paginator(user_list, 5)
105+
users = paginator.page(page)
106+
107+
if request.method == 'POST':
108+
form = SignupForm(request.POST)
109+
if form.is_valid():
110+
return post_request_handling(request, form)
111+
112+
context = {
113+
'users': users,
114+
'form': form,
115+
}
116+
return render(request, 'pages/apps/users.html', context)
117+
118+
119+
@login_required(login_url='/users/signin/')
120+
def post_request_handling(request, form):
121+
form.save()
122+
return redirect(request.META.get('HTTP_REFERER'))
123+
124+
@login_required(login_url='/users/signin/')
125+
def delete_user(request, id):
126+
user = User.objects.get(id=id)
127+
user.delete()
128+
return redirect(request.META.get('HTTP_REFERER'))
129+
130+
131+
@login_required(login_url='/users/signin/')
132+
def update_user(request, id):
133+
user = User.objects.get(id=id)
134+
if request.method == 'POST':
135+
user.username = request.POST.get('username')
136+
user.first_name = request.POST.get('first_name')
137+
user.last_name = request.POST.get('last_name')
138+
user.email = request.POST.get('email')
139+
user.save()
140+
return redirect(request.META.get('HTTP_REFERER'))
141+
142+
143+
@login_required(login_url='/users/signin/')
144+
def user_change_password(request, id):
145+
user = User.objects.get(id=id)
146+
if request.method == 'POST':
147+
user.set_password(request.POST.get('password'))
148+
user.save()
90149
return redirect(request.META.get('HTTP_REFERER'))

templates/includes/sidebar.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939

4040
{% if request.user.is_superuser %}
4141
<li>
42-
<a href="#"
42+
<a href="{% url "user_list" %}"
4343
class="flex items-center p-2 text-base text-gray-900 rounded-lg hover:bg-gray-100 group dark:text-gray-200 dark:hover:bg-gray-700 ">
44-
<svg class="w-[17px] h-[17px] text-gray-800 dark:text-white" aria-hidden="true"
44+
<svg class="w-6 h-6 text-gray-500 dark:text-white" aria-hidden="true"
4545
xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 18">
4646
<path
4747
d="M14 2a3.963 3.963 0 0 0-1.4.267 6.439 6.439 0 0 1-1.331 6.638A4 4 0 1 0 14 2Zm1 9h-1.264A6.957 6.957 0 0 1 15 15v2a2.97 2.97 0 0 1-.184 1H19a1 1 0 0 0 1-1v-1a5.006 5.006 0 0 0-5-5ZM6.5 9a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9ZM8 10H5a5.006 5.006 0 0 0-5 5v2a1 1 0 0 0 1 1h11a1 1 0 0 0 1-1v-2a5.006 5.006 0 0 0-5-5Z" />

0 commit comments

Comments
 (0)