New point

main
emile 2 years ago
parent 13fb9701e5
commit 2dda2c5c2e

Binary file not shown.

@ -32,5 +32,6 @@ admin.site.register(Note)
admin.site.register(Task)
admin.site.register(Status)
admin.site.register(Tag)
admin.site.register(Point)

@ -0,0 +1,23 @@
# Generated by Django 4.2.5 on 2023-09-22 17:52
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0031_alter_staffprofile_image'),
]
operations = [
migrations.CreateModel(
name='Point',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField(blank=True)),
('status', models.CharField(choices=[('Not Completed', 'Not Completed'), ('Working On', 'Working On'), ('Completed', 'Completed')], max_length=200, null=True)),
('task', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osinacore.task')),
],
),
]

@ -0,0 +1,33 @@
# Generated by Django 4.2.5 on 2023-09-22 17:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0032_point'),
]
operations = [
migrations.AddField(
model_name='point',
name='date_completed',
field=models.CharField(max_length=200, null=True),
),
migrations.AddField(
model_name='point',
name='date_workingon',
field=models.CharField(max_length=200, null=True),
),
migrations.AddField(
model_name='point',
name='time_completed',
field=models.CharField(max_length=200, null=True),
),
migrations.AddField(
model_name='point',
name='time_workingon',
field=models.CharField(max_length=200, null=True),
),
]

@ -0,0 +1,33 @@
# Generated by Django 4.2.5 on 2023-09-22 18:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0033_point_date_completed_point_date_workingon_and_more'),
]
operations = [
migrations.AlterField(
model_name='point',
name='date_completed',
field=models.CharField(blank=True, max_length=200, null=True),
),
migrations.AlterField(
model_name='point',
name='date_workingon',
field=models.CharField(blank=True, max_length=200, null=True),
),
migrations.AlterField(
model_name='point',
name='time_completed',
field=models.CharField(blank=True, max_length=200, null=True),
),
migrations.AlterField(
model_name='point',
name='time_workingon',
field=models.CharField(blank=True, max_length=200, null=True),
),
]

@ -216,6 +216,23 @@ class Task(models.Model):
return f"{parts[2]}-{parts[1]}-{parts[0]}"
class Point(models.Model):
text = models.TextField(blank=True)
STATUS_CHOICES = (
('Not Completed', 'Not Completed'),
('Working On', 'Working On'),
('Completed', 'Completed')
)
status = models.CharField(max_length=200, choices=STATUS_CHOICES, null=True)
task = models.ForeignKey(Task, on_delete=models.CASCADE, null=True)
date_workingon = models.CharField(max_length=200, null=True, blank=True)
date_completed = models.CharField(max_length=200, null=True, blank=True)
time_workingon = models.CharField(max_length=200, null=True, blank=True)
time_completed = models.CharField(max_length=200, null=True, blank=True)
class Status(models.Model):
text = models.TextField(blank=True)
date = models.CharField(max_length=40)

@ -288,9 +288,11 @@ def staffs(request):
@login_required
def detailed_task(request, task_id):
task = get_object_or_404(Task, task_id=task_id)
points = Point.objects.filter(task=task).order_by('-id')
context = {
'task': task,
'points' : points,
}
@ -371,8 +373,10 @@ def add_credentials_modal(request, *args, **kwargs):
return render(request, 'addcredentials-modal.html', context)
def add_point_modal(request, *args, **kwargs):
def add_point_modal(request, task_id):
task = get_object_or_404(Task, task_id=task_id)
context = {
'task' : task,
}
return render(request, 'addpoint-modal.html', context)
@ -389,8 +393,12 @@ def delete_task_modal(request, *args, **kwargs):
}
return render(request, 'deletetask-modal.html', context)
def show_points_modal(request, *args, **kwargs):
def show_points_modal(request, task_id):
task = get_object_or_404(Task, task_id=task_id)
points = Point.objects.filter(task=task).order_by('-id')
context = {
'task' : task,
'points' : points,
}
return render(request, 'showpoints-modal.html', context)
@ -460,6 +468,7 @@ def add_daily_report(request):
#Fetch Views
def fetch_related_tasks(request):
# Get the selected epic ID from the request
epic_id = request.GET.get("epic_id")
@ -486,6 +495,8 @@ def fetch_related_tasks(request):
#Save Functions
@login_required
def save_note(request):
if request.method == 'POST':
@ -805,8 +816,6 @@ def save_staff(request):
@login_required
def save_status(request):
if request.method == 'POST':
@ -898,6 +907,67 @@ def save_tag(request):
return redirect('tags')
@login_required
def save_point(request):
if request.method == 'POST':
text = request.POST.get('text')
task = request.POST.get('task')
taskobj = get_object_or_404(Task, id=task)
point = Point(
text = text,
task = taskobj,
status='Not Completed'
)
point.save()
return render(request, 'addpoint-modal.html')
@login_required
def mark_point_working_on(request, point_id):
point = get_object_or_404(Point, id=point_id)
point.status = 'Working On'
current_datetime = timezone.now()
point.date_workingon = current_datetime.date()
point.time_workingon = current_datetime.strftime("%I:%M %p")
point.save()
# Create a new Status object
status_text = f'Working On: {point.text}'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile)
status.save()
return redirect(request, 'showpoints-modal.html')
@login_required
def mark_point_completed(request, point_id):
point = get_object_or_404(Point, id=point_id)
point.status = 'Completed'
current_datetime = timezone.now()
point.date_completed = current_datetime.date()
point.time_completed = current_datetime.strftime("%I:%M %p")
point.save()
# Create a new Status object
status_text = f'{point.text} - Completed'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile)
status.save()
return redirect(request, 'showpoints-modal.html')
# EDIT TEMPLATES
@login_required
@ -978,6 +1048,7 @@ def edit_project_type(request, projecttype_id):
return render(request, 'edit_pages/edit-project-type.html', {'projecttype': projecttype})
@login_required
def edit_reference(request, reference_id):
reference = get_object_or_404(Reference, id=reference_id)
@ -992,6 +1063,7 @@ def edit_reference(request, reference_id):
return render(request, 'edit_pages/edit-reference.html', {'reference': reference})
@login_required
def edit_tag(request, tag_id):
tag = get_object_or_404(Tag, id=tag_id)

@ -63,8 +63,8 @@ urlpatterns = [
path('addfile/', views.add_file_modal, name='addfile'),
path('addcredentials/', views.add_credentials_modal, name='addcredentials'),
path('updatestatus/', views.update_status_modal, name='updatestatus'),
path('addpoint/', views.add_point_modal, name='addpoint'),
path('showpoints/', views.show_points_modal, name='showpoints'),
path('addpoint/<str:task_id>/', views.add_point_modal, name='addpoint'),
path('showpoints/<str:task_id>/', views.show_points_modal, name='showpoints'),
path('addtime/', views.add_time_modal, name='addtime'),
path('timeline/', views.timeline_modal, name='timeline'),
path('deletetask/', views.delete_task_modal, name='deletetask'),
@ -88,8 +88,12 @@ urlpatterns = [
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'),
path('save_point/', views.save_point, name='save_point'),
# Edit Templates
# Edit Urls
path('editproject/', views.edit_project, name='editproject'),
path('editepic/', views.edit_epic, name='editepic'),
path('edittask/', views.edit_task, name='edittask'),
@ -100,6 +104,8 @@ urlpatterns = [
path('editreference/<int:reference_id>', views.edit_reference, name='editreference'),
path('edittag/<int:tag_id>', views.edit_tag, name='edittag'),
path('editstaffposition/', views.edit_staff_position, name='editstaffposition'),
path('mark_point_working_on/<int:point_id>/', views.mark_point_working_on, name='mark_point_working_on'),
path('mark_point_completed/<int:point_id>/', views.mark_point_completed, name='mark_point_completed'),
]

@ -15,13 +15,19 @@
<body>
<div id="hiddenContent">
<form id="hiddenContent" method="POST" action="{% url 'save_point' %}">
{% csrf_token %}
<h1 class="text-slate-800 text-2xl font-semibold text-center">Add Point</h1>
<select name="task" required
class="hidden w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md text-gray-500">
<option value="{{task.id}}">{{task.name}}</option>
</select>
<div class="w-full flex justify-center items-center">
<input type="text" placeholder="Type your point here..."
<input name="text" type="text" placeholder="Type your point here..."
class="w-full p-3 border border-gray-300 rounded-md bg-transparent outline-none mt-4" id="pointInput"
required>
>
</div>
<!-- THE WARNING MESSAGE THAT APPEARS WHEN THE USER CLICKS ON THE ADD BUTTON WITH AN EMPTY INPUT FIELD -->
@ -30,13 +36,9 @@
</p>
<div class="w-full flex justify-center items-center mt-4 gap-4">
<button
<button type="submit"
class="w-fit bg-blue-500 border border-blue-500 rounded-md text-white text-xl px-3 py-2 hover:bg-white hover:text-blue-500"
id="addPointsFormButton">Add</button>
<button
class="w-fit bg-blue-500 border border-blue-500 rounded-md text-white text-xl px-3 py-2 hover:bg-white hover:text-blue-500">Save
Point(s)</button>
</div>
<div class="w-full flex flex-col" id="allPointsContainer">
@ -44,7 +46,7 @@
</div>
<script>
<!--<script>
const allPointsContainer = document.getElementById("allPointsContainer");
const pointInput = document.getElementById("pointInput");
const addButton = document.getElementById("addPointsFormButton");
@ -81,9 +83,9 @@
// Clear the input field
pointInput.value = "";
});
</script>
</script> -->
</div>
</form>
</body>
</html>

@ -161,11 +161,11 @@
</a>
<button
class="w-[33.33%] p-2 border border-gray-200 text-base h-[70px] bg-gray-300 text-gray-500 showPointsButton"
data-modal-url="{% url 'showpoints' %}">Show
data-modal-url="{% url 'showpoints' task.task_id %}">Show
Points</button>
<button
class="w-[33.33%] p-2 border border-gray-200 text-base h-[70px] bg-gray-300 text-gray-500 addPointButton"
data-modal-url="{% url 'addpoint' %}">Add
data-modal-url="{% url 'addpoint' task.task_id %}">Add
Point</button>
<a href="{% url 'detailed-task' task.task_id %}" class="w-[33.33%]">
<button

@ -19,45 +19,66 @@
<h1 class="text-slate-800 text-2xl font-semibold text-center mb-1">Points</h1>
<div class="w-full">
{% for point in points %}
{% if point.status == 'Not Completed' %}
<div class="w-full flex justify-between items-center py-2 border-b border-gray-200">
<div class="w-[380px]">
<p class="text-slate-800">Fix the LaylNhar Header Lorem ipsum dolor sit amet consectetur,
adipisicing elit. Mollitia, dolorum. Earum error atÍb dol</p>
<p class="text-slate-800">{{point.text}}</p>
</div>
<div class="flex justify-end items-center gap-2">
<button
<form method="post" action="{% url 'mark_point_working_on' point.id %}">
{% csrf_token %}
<button type="submit"
class="w-[120px] px-2 py-1 bg-transparent border border-yellow-500 rounded-md text-yellow-500 hover:bg-yellow-500 hover:text-white">Working
On</button>
</form>
<form method="post" action="{% url 'mark_point_completed' point.id %}">
{% csrf_token %}
<button type="submit"
class="w-[120px] px-2 py-1 bg-transparent border border-blue-500 rounded-md text-blue-500 hover:bg-blue-500 hover:text-white">Complete</button>
<button
class="w-[120px] px-2 py-1 bg-transparent border border-yellow-500 rounded-md text-yellow-500 hover:bg-yellow-500 hover:text-white">Working
On</button>
</form>
</div>
</div>
{% endif %}
{% if point.status == 'Completed' %}
<div class="w-full flex justify-between items-center py-2 border-b border-gray-200">
<div class="w-[380px]">
<p class="text-slate-800">Fix the LaylNhar Header</p>
<p class="text-slate-800 line-through">{{point.text}}</p>
</div>
<div class="flex justify-end items-center gap-2">
<button
class="w-[120px] px-2 py-1 bg-transparent border border-blue-500 rounded-md text-blue-500 hover:bg-blue-500 hover:text-white">Complete</button>
<button
class="w-[120px] px-2 py-1 border border-yellow-500 rounded-md bg-yellow-500 text-white opacity-40"
disabled>Working On</button>
<div class="w-[150px]">
<button class="w-full px-2 py-1 bg-blue-500 border border-blue-500 rounded-md text-white opacity-40"
value="Completed" disabled>Completed</button>
</div>
</div>
{% endif %}
{% if point.status == 'Working On' %}
<div class="w-full flex justify-between items-center py-2 border-b border-gray-200">
<div class="w-[380px]">
<p class="text-slate-800 line-through">Fix the LaylNhar Header Lorem ipsum dolor sit amet
consectetur
adipisicing elit. Autem sit esse, cupiditate voluptas, dolorem nisi sunt, molestiae eaque neque
cumque ex amet! Sequi aliquid quos ullam, sapiente iste impedit explicabo?</p>
<p class="text-slate-800">{{point.text}}</p>
</div>
<div class="w-[150px]">
<button class="w-full px-2 py-1 bg-blue-500 border border-blue-500 rounded-md text-white opacity-40"
value="Completed" disabled>Completed</button>
<div class="flex justify-end items-center gap-2">
<button
class="w-[120px] px-2 py-1 border border-yellow-500 rounded-md bg-yellow-500 text-white opacity-40"
disabled>Working On</button>
<form method="post" action="{% url 'mark_point_completed' point.id %}">
{% csrf_token %}
<button type="submit"
class="w-[120px] px-2 py-1 bg-transparent border border-blue-500 rounded-md text-blue-500 hover:bg-blue-500 hover:text-white">Complete</button>
</form>
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</body>

@ -56,9 +56,21 @@
<div class="w-full flex justify-between gap-[2.5%] px-10 pb-5">
<!-- LEFT SIDE / TASK DETAIL SECTION -->
<div class="w-[74.5%] bg-white h-fit rounded-md shadow-md p-5">
{% if task.status == 'Open' %}
<div class="w-full bg-green-700 rounded-t-md flex flex-col justify-center items-center py-3">
<h1 class="text-3xl text-white font-semibold">Task Name</h1>
<h1 class="text-3xl text-white font-semibold">{{task.name}}</h1>
</div>
{% endif %}
{% if task.status == 'Working On' %}
<div class="w-full bg-yellow-400 rounded-t-md flex flex-col justify-center items-center py-3">
<h1 class="text-3xl text-white font-semibold">{{task.name}}</h1>
</div>
{% endif %}
{% if task.status == 'Closed' %}
<div class="w-full bg-red-500 rounded-t-md flex flex-col justify-center items-center py-3">
<h1 class="text-3xl text-white font-semibold">{{task.name}}</h1>
</div>
{% endif %}
<div class="w-full h-[70px] flex justify-end items-center bg-gray-100 shadow-md rounded-md px-3 py-1 mt-4">
<div class="flex justify-end items-center gap-3">
<button
@ -74,37 +86,46 @@
<div class="w-full flex flex-col gap-4 mt-5">
<div>
<p class="text-gray-500 text-xl">Project: <span
class="text-slate-800 text-xl font-semibold">Osina</span></p>
class="text-slate-800 text-xl font-semibold">{{task.project.name}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Start Date: <span
class="text-slate-800 text-xl font-semibold">1/2/1023</span></p>
class="text-slate-800 text-xl font-semibold">{{task.formatted_start_date}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">End Date: <span
class="text-slate-800 text-xl font-semibold">15/2/1023</span></p>
class="text-slate-800 text-xl font-semibold">{{task.formatted_end_date}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Epic: <span
class="text-slate-800 text-xl font-semibold">epic</span></p>
class="text-slate-800 text-xl font-semibold">{{task.epic.title}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Assigned To: <span
class="text-slate-800 text-xl font-semibold">Nataly</span></p>
class="text-slate-800 text-xl font-semibold">{{task.assigned_to.first_name}} {{task.assigned_to.last_name}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Extra: <span
class="text-slate-800 text-xl font-semibold">Yes</span></p>
class="text-slate-800 text-xl font-semibold">{{task.extra}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Status: <span
class="text-green-700 text-xl font-semibold">Open</span></p>
<p class="text-gray-500 text-xl">Status:
{% if task.status == 'Closed' %}
<span class="text-red-500 text-xl font-semibold">{{task.status}}</span>
{% endif %}
{% if task.status == 'Open' %}
<span class="text-green-700 text-xl font-semibold">{{task.status}}</span>
{% endif %}
{% if project.status == 'Working on' %}
<span class="text-yellow-400 text-xl font-semibold">{{task.status}}</span>
{% endif %}
</p>
</div>
<div>
@ -116,49 +137,67 @@
<div>
<p class="text-gray-500 text-xl">Points:</p>
<div class="w-full px-4">
{% for point in points %}
{% if point.status == 'Not Completed' %}
<div class="w-full flex justify-between items-center py-2 border-b border-gray-200">
<div class="w-[380px]">
<p class="text-slate-800">Fix the LaylNhar Header Lorem ipsum dolor sit amet consectetur,
adipisicing elit. Mollitia, dolorum. Earum error atÍb dol</p>
<p class="text-slate-800">{{point.text}}</p>
</div>
<div class="flex justify-end items-center gap-2">
<button
<form method="post" action="{% url 'mark_point_working_on' point.id %}">
{% csrf_token %}
<button type="submit"
class="w-[120px] px-2 py-1 bg-transparent border border-yellow-500 rounded-md text-yellow-500 hover:bg-yellow-500 hover:text-white">Working
On</button>
</form>
<form method="post" action="{% url 'mark_point_completed' point.id %}">
{% csrf_token %}
<button type="submit"
class="w-[120px] px-2 py-1 bg-transparent border border-blue-500 rounded-md text-blue-500 hover:bg-blue-500 hover:text-white">Complete</button>
<button
class="w-[120px] px-2 py-1 bg-transparent border border-yellow-500 rounded-md text-yellow-500 hover:bg-yellow-500 hover:text-white">Working
On</button>
</form>
</div>
</div>
{% endif %}
{% if point.status == 'Completed' %}
<div class="w-full flex justify-between items-center py-2 border-b border-gray-200">
<div class="w-[380px]">
<p class="text-slate-800">Fix the LaylNhar Header</p>
<p class="text-slate-800 line-through">{{point.text}}</p>
</div>
<div class="flex justify-end items-center gap-2">
<button
class="w-[120px] px-2 py-1 bg-transparent border border-blue-500 rounded-md text-blue-500 hover:bg-blue-500 hover:text-white">Complete</button>
<button
class="w-[120px] px-2 py-1 border border-yellow-500 rounded-md bg-yellow-500 text-white opacity-40"
disabled>Working On</button>
<div class="w-[150px]">
<button class="w-full px-2 py-1 bg-blue-500 border border-blue-500 rounded-md text-white opacity-40"
value="Completed" disabled>Completed</button>
</div>
</div>
{% endif %}
<div class="w-full flex justify-between items-center py-2">
{% if point.status == 'Working On' %}
<div class="w-full flex justify-between items-center py-2 border-b border-gray-200">
<div class="w-[380px]">
<p class="text-slate-800 line-through">Fix the LaylNhar Header Lorem ipsum dolor sit amet
consectetur
adipisicing elit. Autem sit esse, cupiditate voluptas, dolorem nisi sunt, molestiae eaque neque
cumque ex amet! Sequi aliquid quos ullam, sapiente iste impedit explicabo?</p>
<p class="text-slate-800">{{point.text}}</p>
</div>
<div class="w-[150px]">
<button class="w-full px-2 py-1 bg-blue-500 border border-blue-500 rounded-md text-white opacity-40"
value="Completed" disabled>Completed</button>
<div class="flex justify-end items-center gap-2">
<button
class="w-[120px] px-2 py-1 border border-yellow-500 rounded-md bg-yellow-500 text-white opacity-40"
disabled>Working On</button>
<form method="post" action="{% url 'mark_point_completed' point.id %}">
{% csrf_token %}
<button type="submit"
class="w-[120px] px-2 py-1 bg-transparent border border-blue-500 rounded-md text-blue-500 hover:bg-blue-500 hover:text-white">Complete</button>
</form>
</div>
</div>
{% endif %}
{% endfor %}
</div>
<div class="w-full px-4">
<button class="w-full text-gray-500 py-3 bg-gray-100 addPointButton" data-modal-url="{% url 'addpoint' %}">ADD POINT</button>
<button class="w-full text-gray-500 py-3 bg-gray-100 addPointButton" data-modal-url="{% url 'addpoint' task.task_id %}">ADD POINT</button>
</button>
</div>
</div>
@ -284,14 +323,7 @@
<p class="text-gray-500 text-xl">Description:</p>
<div class="w-full h-fit px-4 mt-1">
<p class="text-slate-700">
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Lorem Ipsum has been the industry's standard dummy text ever since the
1500s, when an unknown printer took a galley of type and scrambled it to
make a type specimen book. It has survived not only five centuries, but also
the leap into electronic typesetting, remaining essentially unchanged. It
was popularised in the 1960s with the release of Letraset sheets containing
Lorem Ipsum passages, and more recently with desktop publishing software
like Aldus PageMaker including versions of Lorem Ipsum.
{{task.description}}
</p>
</div>
</div>

@ -118,6 +118,13 @@
<p class="text-xl text-white">{{task.name}}</p>
</div>
{% endif %}
{% if task.status == 'Closed' %}
<div
class="w-[55%] flex justify-center items-center border-r border-b border-gray-300 bg-red-500 rounded-tl-md">
<p class="text-xl text-white">{{task.name}}</p>
</div>
{% endif %}
<div class="w-[15%] flex justify-center items-center border-r border-b border-gray-300">
<p class="text-slate-700">{{task.status}}</p>
</div>
@ -182,17 +189,17 @@
<button
class="w-[33.33%] p-2 border border-gray-200 text-base h-[70px] bg-red-500 text-white deleteTaskButton"
data-modal-url="{% url 'deletetask' %}">Delete</button>
<a href="{% url 'edittask' %}" class="w-[33.33%]">
<a href="{% url 'edittask' %}" class="w-[33.33%]">
<button
class="w-full p-2 border border-gray-200 text-base h-[70px] bg-blue-500 text-white">Edit</button>
</a>
<button
class="w-[33.33%] p-2 border border-gray-200 text-base h-[70px] bg-gray-300 text-gray-500 showPointsButton"
data-modal-url="{% url 'showpoints' %}">Show
data-modal-url="{% url 'showpoints' task.task_id %}">Show
Points</button>
<button
class="w-[33.33%] p-2 border border-gray-200 text-base h-[70px] bg-gray-300 text-gray-500 addPointButton"
data-modal-url="{% url 'addpoint' %}">Add
data-modal-url="{% url 'addpoint' task.task_id %}">Add
Point</button>
<a href="{% url 'detailed-task' task.task_id %}" class="w-[33.33%]">
<button

Loading…
Cancel
Save