Staff done

main
emile 2 years ago
parent 12db849a02
commit c0437811db

Binary file not shown.

@ -11,3 +11,9 @@ class SignUpForm(forms.ModelForm):
class Meta:
model = CustomerProfile
fields = ['first_name', 'last_name', 'email', 'password', 'mobile_number', 'status', 'reference', 'personal_website', 'business']
class StaffSignUpForm(forms.ModelForm):
class Meta:
model = StaffProfile
fields = ['first_name', 'last_name', 'image', 'email', 'mobile_number', 'password', 'position', 'intern', 'active']

@ -0,0 +1,18 @@
# Generated by Django 4.2.5 on 2023-09-21 13:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0030_tag'),
]
operations = [
migrations.AlterField(
model_name='staffprofile',
name='image',
field=models.ImageField(blank=True, null=True, upload_to=''),
),
]

@ -87,16 +87,10 @@ class StaffProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
image = models.ImageField(null=True)
image = models.ImageField(null=True, blank=True)
email = models.EmailField(unique=True)
mobile_number = models.CharField(max_length=50)
password = models.CharField(max_length=128)
Staff_CHOICES = (
('Developer', 'Developer'),
('Designer', 'Designer'),
('Support', 'Support'),
('Project Manager', 'Project Manager'),
)
position = models.CharField(max_length=100)
intern = models.BooleanField(default=False)
active = models.BooleanField(default=True)

@ -8,7 +8,6 @@ from django.utils import timezone
from django.urls import reverse
from django.http import HttpResponse
from django.db.models import Q
from django.http import JsonResponse
from .models import Task, Epic
@ -223,6 +222,7 @@ def addbusiness(request):
}
return render(request, 'add-business.html', context)
@login_required
def businessdetails(request):
context = {
@ -230,6 +230,7 @@ def businessdetails(request):
}
return render(request, 'business-details.html', context)
@login_required
def businesses(request):
context = {
@ -239,32 +240,37 @@ def businesses(request):
@login_required
def adduser(request):
def addstaff(request):
context = {
}
return render(request, 'add-user.html', context)
return render(request, 'add-staff.html', context)
@login_required
def userdetails(request):
def staffdetails(request):
context = {
}
return render(request, 'user-details.html', context)
return render(request, 'staff-details.html', context)
@login_required
def users(request):
def staffs(request):
staffs = StaffProfile.objects.all().order_by('-id')
context = {
'staffs' : staffs,
}
return render(request, 'users.html', context)
return render(request, 'staffs.html', context)
@ -676,6 +682,7 @@ def save_business_modal(request):
return render(request, 'addbusiness-modal.html')
def save_customer(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
@ -709,6 +716,52 @@ def save_customer(request):
return redirect('customers')
def save_staff(request):
if request.method == 'POST':
form = StaffSignUpForm(request.POST, request.FILES)
if form.is_valid():
# Extract cleaned data from the form
email = form.cleaned_data['email']
first_name = form.cleaned_data['first_name'].replace(" ", "")
last_name = form.cleaned_data['last_name'].replace(" ", "")
username = f"{first_name.lower()}{last_name.lower()}"
original_username = username
counter = 1 # Initialize a counter to add numbers
while User.objects.filter(username=username).exists():
# If the username already exists, append the counter to it
username = f"{original_username.lower()}{counter}"
counter += 1
# Create a User instance
user = User.objects.create_user(
username=username,
email=email,
password=form.cleaned_data['password']
)
user.first_name = form.cleaned_data['first_name']
user.last_name = form.cleaned_data['last_name']
user.save()
# Create a StaffProfile instance with the associated user
staff_profile = form.save(commit=False)
staff_profile.user = user
# Attach the uploaded image to the StaffProfile instance
staff_profile.image = form.cleaned_data['image']
staff_profile.save()
else:
# Print form errors to see why it's not valid
print('Form is not valid. Errors:')
print(form.errors)
return redirect('users')
@login_required
def save_status(request):
if request.method == 'POST':

@ -34,9 +34,9 @@ urlpatterns = [
path('addbusiness/', views.addbusiness, name='addbusiness'),
path('businessdetails/', views.businessdetails, name='businessdetails'),
path('businesses/', views.businesses, name='businesses'),
path('adduser/', views.adduser, name='adduser'),
path('userdetails/', views.userdetails, name='userdetails'),
path('users/', views.users, name='users'),
path('addstaff/', views.addstaff, name='adduser'),
path('staffdetails/', views.staffdetails, name='userdetails'),
path('staffs/', views.staffs, name='users'),
path('projectdetails/<str:project_id>/', views.detailed_project, name='detailed-project'),
path('createproject/', views.create_project, name='createproject'),
path('createepic/<str:project_id>/', views.create_epic, name='createepic'),
@ -79,10 +79,12 @@ urlpatterns = [
path('save_business/', views.save_business, name='save_business'),
path('save_business_modal/', views.save_business_modal, name='save_business_modal'),
path('save_customer/', views.save_customer, name='save_customer'),
path('save_staff/', views.save_staff, name='save_staff'),
path('save_status/', views.save_status, name='save_status'),
path('save_projecttype/', views.save_projecttype, name='save_projecttype'),
path('save_reference/', views.save_reference, name='save_reference'),
path('save_tag/', views.save_tag, name='save_tag'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

@ -14,7 +14,7 @@
</div> -->
</div>
<form method="POST" action="{% url 'save_customer' %}">
<form method="POST" action="{% url 'save_staff' %}" enctype="multipart/form-data">
{% csrf_token %}
<div class="w-full flex flex-col gap-3 justify-center items-center mt-5">
<div class="w-[100px] h-[100px] rounded-full border border-gray-200" id="image-container">
@ -23,7 +23,7 @@
<div class="inbox-box border border-gray-300 py-1 px-3 w-full rounded-md">
<div class="flex items-center justify-between">
<input required name="cv" type="file" id="actual-btn" accept="image/*" hidden multiple />
<input name="image" type="file" id="actual-btn" hidden />
<span id="file-name" class="text-gray-500 text-base focus:outline-none outline-none">Upload
Profile Picture</span>
<label for="actual-btn"
@ -32,14 +32,7 @@
</div>
</div>
<input type="text" placeholder="Username"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<input type="password" placeholder="Password"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<input type="password" placeholder="Password Confirmation"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<!-- WHEN THE USER CHOOSE A FILE THE NAME OF THE FILE WILL APPEAR IN THE SPAN AND THE UPLOADED IMAGE WILL APPEAR IN THE USER PROFILE IMAGE CONTAINER -->
<script>
@ -78,18 +71,6 @@
</script>
<select id=""
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md text-gray-500">
<option value="" selected disabled>Groups</option>
<option>Group 1</option>
<option>Group 2</option>
<option>Group 3</option>
</select>
<input type="text" placeholder="Position"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<input name="first_name" type="text" placeholder="First Name"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
@ -99,19 +80,38 @@
<input name="email" type="email" placeholder="Email"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<input name="mobile" type="number" placeholder="Mobile Number"
<input name="mobile_number" type="number" placeholder="Mobile Number"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<input name="position" type="text" placeholder="Position"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<div class="w-full flex justify-start items-center gap-2">
<input type="checkbox" name="" id="">
<input name="active" type="checkbox" id="activeCheckbox" onchange="updateCheckbox('activeCheckbox')">
<p class="text-gray-500">Active</p>
</div>
<div class="w-full flex justify-start items-center gap-2">
<input type="checkbox" name="" id="">
<input name="intern" type="checkbox" id="internCheckbox" onchange="updateCheckbox('internCheckbox')">
<p class="text-gray-500">Intern</p>
</div>
<script>
function updateCheckbox(checkboxId) {
const checkbox = document.getElementById(checkboxId);
const inputName = checkbox.getAttribute('name');
const inputValue = checkbox.checked ? 'True' : 'False';
// Set the input field value based on checkbox state
const inputField = document.querySelector(`input[name="${inputName}"]`);
inputField.value = inputValue;
}
</script>
<input name="password" type="password" placeholder="Password"
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md" required>
<div class="w-full flex justify-center items-center mt-3">
<button type="submit"
class="w-fit py-1 px-3 bg-blue-500 rounded-md outline-none text-white border border-blue-500 text-xl cursor-pointer hover:bg-white hover:text-blue-500">Add Staff</button>

@ -58,7 +58,7 @@
<!-- LEFT SIDE / USERS SECTION -->
<div class="w-[74.5%]">
<div class="w-full h-fit bg-white rounded-md shadow-md p-5">
<h1 class="text-slate-800 text-[30px] font-semibold">Users</h1>
<h1 class="text-slate-800 text-[30px] font-semibold">Staffs</h1>
<!-- FILTERING -->
<div class="w-full py-4 px-3 bg-gray-200 rounded-md shadow-md mt-4 flex justify-between items-center">
@ -86,10 +86,10 @@
<div
class="w-full flex justify-between items-center h-[60px] border-b border-gray-300 rounded-t-md">
<div class="w-[40%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-slate-800">Username</p>
<p class="text-slate-800">Full Name</p>
</div>
<div class="w-[40%] h-full border-r border-gray-300 flex justify-center items-center">
<p>Group</p>
<p>Email</p>
</div>
<div class="w-[20%] h-full flex justify-center items-center">
Actions
@ -99,12 +99,22 @@
<!-- TABLE BODY -->
<div class="w-full">
<!-- 1st row -->
{% for staff in staffs %}
<div class="w-full h-[60px] flex justify-between items-center border-b border-gray-300">
<div class="w-[40%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-gray-500">Nataly.aw</p>
<div class="w-[40%] h-full border-r border-gray-300 flex justify-center gap-3 items-center">
<div class="w-[50%] flex justify-end items-center">
<div class="w-[50px] h-[50px] bg-slate-600 rounded-full">
<img src='{{request.user.staffprofile.image.url}}' alt="user-image"
class="w-full h-full object-cover rounded-full">
</div>
</div>
<div class="w-[50%] flex justify-start items-center">
<p class="text-gray-500">{{staff.first_name}} {{staff.last_name}}</p>
</div>
</div>
<div class="w-[40%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-gray-500">Group 1</p>
<p class="text-gray-500">{{staff.email}}</p>
</div>
<div class="w-[20%] h-full flex justify-center items-center gap-3">
<a href="{% url 'userdetails' %}">
@ -120,6 +130,7 @@
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
Loading…
Cancel
Save