emile 10 months ago
parent 2e044ece76
commit 323cfa0b9c

Binary file not shown.

@ -17,9 +17,7 @@ from django.core.files import File
def add_status_modal(request, *args, **kwargs):
if request.method == 'POST':
text = request.POST.get('text')
current_datetime = datetime.now()
date = datetime.now().date()
time = current_datetime.strftime("%I:%M %p")
date_time = datetime.now()
try:
staff_profile = StaffProfile.objects.get(user=request.user)
@ -30,8 +28,7 @@ def add_status_modal(request, *args, **kwargs):
status = Status(
text=text,
staff=staff_profile,
date=date,
time=time,
date_time=date_time,
)
status.save()

@ -6,22 +6,6 @@ from django.db.models import Max, F
from support.models import *
def calculate_time_ago(status):
# Convert status.date to a datetime.date object
status_date = datetime.strptime(status.date, '%Y-%m-%d').date()
timestamp = datetime.combine(status_date, datetime.strptime(status.time, '%I:%M %p').time())
time_difference = datetime.now() - timestamp
if time_difference.total_seconds() < 3600:
# If less than an hour, display in minutes
return f"{int(time_difference.total_seconds() / 60)}min ago"
else:
# Display in hours and remaining minutes
hours = int(time_difference.total_seconds() // 3600)
minutes = int((time_difference.total_seconds() % 3600) // 60)
return f"{hours}hr {minutes}min ago"
def utilities(request):
notes = None
@ -105,10 +89,8 @@ def utilities(request):
today = datetime.now().date()
# Fetch the latest statuses from the last 24 hours
latest_statuses = Status.objects.filter(date=today).order_by('-id')
# Calculate time ago for each status and store it in a dictionary
latest_statuses_time_ago = [{'status': status, 'time_ago': calculate_time_ago(status)} for status in latest_statuses]
latest_statuses = Status.objects.filter(date_time__date=today).order_by('-id')
last_status = Status.objects.filter(staff=request.user.staffprofile).last()
recent_logged_in_staffs = User.objects.filter(
@ -123,7 +105,7 @@ def utilities(request):
return {'total_tasks': total_tasks,
'latest_statuses' : latest_statuses,
'latest_statuses_time_ago': latest_statuses_time_ago,
'last_status': last_status,
'notes' : notes,
'recent_note' : recent_note,
'user_offline' : user_offline,
@ -132,43 +114,3 @@ def utilities(request):
'open_tickets': open_tickets,
'closed_tickets': closed_tickets
}
def last_status(request):
minutes_ago = 0
hours_ago = 0
hours_minutes_ago = ""
current_date = datetime.now().strftime('%Y-%m-%d')
if request.user.is_authenticated and StaffProfile.objects.filter(user=request.user):
last_status = Status.objects.filter(staff=request.user.staffprofile).last()
if last_status:
# Convert the 'time' field to a datetime object
status_time = datetime.strptime(last_status.time, '%I:%M %p')
# Get the current time
current_time = datetime.now().time()
# Calculate the time difference
time_difference = abs(datetime.combine(datetime.today(), current_time) - datetime.combine(datetime.today(), status_time.time()))
# Get the time difference in minutes
minutes_ago = time_difference.total_seconds() / 60
minutes_ago = int(minutes_ago)
else:
# Handle the case when the user is not logged in
last_status = None
if minutes_ago > 60:
hours_ago = minutes_ago // 60 # Calculate the number of hours
remaining_minutes = minutes_ago % 60 # Calculate the remaining minutes
hours_minutes_ago = f"{hours_ago}hr {remaining_minutes}min ago"
else:
hours_minutes_ago = f"{minutes_ago}min ago"
return {'last_status' : last_status, 'current_date' : current_date, 'minutes_ago' : minutes_ago, 'hours_minutes_ago': hours_minutes_ago}

@ -433,23 +433,23 @@ def mark_point_working_on(request, point_id, task_id):
task = get_object_or_404(Task, id=task_id)
point = get_object_or_404(Point, id=point_id)
point.status = 'Working On'
current_datetime = datetime.now()
current_datetime = timezone.now()
point.save()
activity = PointActivity(
point = point,
start_time = datetime.now(),
start_time = timezone.now(),
)
activity.save()
if PointActivity.objects.filter(point=point).count() == 1:
status_text = f'Started Working On: {point.text}'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
else:
status_text = f'Resumed Working On: {point.text}'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
@ -466,23 +466,23 @@ def mark_point_working_on_task_page(request, point_id, task_id):
task = get_object_or_404(Task, id=task_id)
point = get_object_or_404(Point, id=point_id)
point.status = 'Working On'
current_datetime = datetime.now()
current_datetime = timezone.now()
point.save()
activity = PointActivity(
point = point,
start_time = datetime.now(),
start_time = timezone.now(),
)
activity.save()
if PointActivity.objects.filter(point=point).count() == 1:
status_text = f'Started Working On: {point.text}'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
else:
status_text = f'Resumed Working On: {point.text}'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
@ -496,17 +496,17 @@ def mark_point_paused(request, point_id, task_id):
task = get_object_or_404(Task, id=task_id)
point = get_object_or_404(Point, id=point_id)
point.status = 'Paused'
current_datetime = datetime.now()
current_datetime = timezone.now()
point.save()
last_activity = PointActivity.objects.filter(point=point).last()
if last_activity:
last_activity.end_time = timezone.make_aware(current_datetime, timezone.get_current_timezone())
last_activity.end_time = current_datetime
last_activity.save()
status_text = f'{point.text} - Paused'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
@ -522,17 +522,17 @@ def mark_point_paused_task_page(request, point_id, task_id):
task = get_object_or_404(Task, id=task_id)
point = get_object_or_404(Point, id=point_id)
point.status = 'Paused'
current_datetime = datetime.now()
current_datetime = timezone.now()
point.save()
last_activity = PointActivity.objects.filter(point=point).last()
if last_activity:
last_activity.end_time = timezone.make_aware(current_datetime, timezone.get_current_timezone())
last_activity.end_time = current_datetime
last_activity.save()
status_text = f'{point.text} - Paused'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
@ -545,14 +545,14 @@ def mark_point_completed(request, point_id, task_id):
point = get_object_or_404(Point, id=point_id)
point.status = 'Completed'
current_datetime = datetime.now()
current_datetime = timezone.now()
point.save()
# Update the end time of the last activity to the current time
last_activity = PointActivity.objects.filter(point=point).last()
if last_activity:
last_activity.end_time = timezone.make_aware(current_datetime, timezone.get_current_timezone())
last_activity.end_time = current_datetime
last_activity.save()
@ -570,7 +570,7 @@ def mark_point_completed(request, point_id, task_id):
if formatted_time:
status_text += f' in {formatted_time}'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
task_id_str = task.task_id
@ -586,14 +586,14 @@ def mark_point_completed_task_page(request, point_id, task_id):
point = get_object_or_404(Point, id=point_id)
point.status = 'Completed'
current_datetime = datetime.now()
current_datetime = timezone.now()
point.save()
# Update the end time of the last activity to the current time
last_activity = PointActivity.objects.filter(point=point).last()
if last_activity:
last_activity.end_time = timezone.make_aware(current_datetime, timezone.get_current_timezone())
last_activity.end_time = current_datetime
last_activity.save()
@ -611,7 +611,7 @@ def mark_point_completed_task_page(request, point_id, task_id):
if formatted_time:
status_text += f' in {formatted_time}'
status = Status(text=status_text, date=current_datetime.date(), time=current_datetime.strftime("%I:%M %p"), staff=request.user.staffprofile, task=point.task)
status = Status(text=status_text, date_time=timezone.now(), staff=request.user.staffprofile, task=point.task)
status.save()
return redirect('detailed-task', task_id=task.task_id)

@ -0,0 +1,21 @@
# Generated by Django 4.2.5 on 2024-07-09 08:13
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0096_status_date_time'),
]
operations = [
migrations.RemoveField(
model_name='status',
name='date',
),
migrations.RemoveField(
model_name='status',
name='time',
),
]

@ -10,6 +10,7 @@ from django.db.models.signals import post_save
from django.dispatch import receiver
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from datetime import timedelta
# Create your models here.
@ -390,7 +391,7 @@ class PointActivity(models.Model):
total_time = models.DurationField(null=True, blank=True)
def save(self, *args, **kwargs):
if self.start_time and not self.end_time:
self.total_time = datetime.now() - self.start_time
self.total_time = timezone.now() - self.start_time
elif self.start_time and self.end_time:
self.total_time = self.end_time - self.start_time
super(PointActivity, self).save(*args, **kwargs)
@ -407,13 +408,28 @@ class PointActivity(models.Model):
class Status(models.Model):
text = models.TextField(blank=True)
date = models.CharField(max_length=40)
time = models.CharField(max_length=40)
staff = models.ForeignKey(StaffProfile, on_delete=models.CASCADE, null=True,blank=True, related_name='staff')
task = models.ForeignKey(Task, on_delete=models.SET_NULL ,null=True, blank=True, related_name='reference_task')
date_time = models.DateTimeField(null=True, blank=True)
def __str__(self):
return self.text
@property
def time_ago(self):
if not self.date_time:
return "No date provided"
now = timezone.now()
diff = now - self.date_time
if diff < timedelta(hours=1):
minutes = int(diff.total_seconds() / 60)
return f"{minutes}min ago"
elif diff < timedelta(days=1):
hours = int(diff.total_seconds() / 3600)
minutes = int((diff.total_seconds() % 3600) / 60)
return f"{hours}hr {minutes}min ago"
else:
return self.date_time.strftime('%d %m %Y, %I:%M %p')
@receiver(post_save, sender=Status)

@ -124,16 +124,16 @@
</div>
{% if latest_statuses_time_ago %}
{% for latest in latest_statuses_time_ago %}
<div class="w-full flex flex-col py-3 users-activities" data-userId="{{ latest.status.staff.user.id }}">
{% if latest_statuses %}
{% for status in latest_statuses %}
<div class="w-full flex flex-col py-3 users-activities" data-userId="{{ status.staff.user.id }}">
<div class="w-full flex flex-col justify-center items-start gap-3 bg-gray-50 pt-2 px-2 pb-6 rounded-md relative">
<div class="w-full flex justify-between items-center gap-2">
<div class="flex justify-start gap-2 cursor-pointer userRecentActivitiesButton"
data-modal-url="{% url 'userrecentativities' latest.status.staff.user.id %}">
data-modal-url="{% url 'userrecentativities' status.staff.user.id %}">
<div class="relative w-fit rounded-full">
<div class="w-[45px] h-[45px] rounded-full">
<img src='{{latest.status.staff.image.url}}' alt="user profile"
<img src='{{status.staff.image.url}}' alt="user profile"
class="w-full h-full object-cover rounded-full">
</div>
@ -146,19 +146,19 @@
</div>
<div class="flex flex-col">
<h1 class="text-sm text-secondosiblue font-semibold">{{latest.status.staff.user.first_name}}
{{latest.status.staff.user.last_name}}</h1>
{% if latest.time_ago == '0min ago' %}
<h1 class="text-sm text-secondosiblue font-semibold">{{status.staff.user.first_name}}
{{status.staff.user.last_name}}</h1>
{% if status.time_ago == '0min ago' %}
<p class="text-sm text-gray-500">Just Now</p>
{%else %}
<p class="text-sm text-gray-500">{{ latest.time_ago}}</p>
<p class="text-sm text-gray-500">{{status.time_ago}}</p>
{%endif%}
</div>
</div>
<div class="relative">
<div class="cursor-pointer hover:scale-105 duration-500 transition-transform emojiPicker"
data-status-id="{{latest.status.id}}">
data-status-id="{{status.id}}">
<img src="{% static 'images/icons/reactionicon.png' %}" class="w-[30px]">
</div>
</div>
@ -166,12 +166,12 @@
<!-- Status -->
<div class="w-full">
<p class="text-sm {% if 'Completed' in latest.status.text %} text-green-700 {% else %} text-secondosiblue {% endif %}">{{latest.status.text}}</p>
<p class="text-sm {% if 'Completed' in status.text %} text-green-700 {% else %} text-secondosiblue {% endif %}">{{status.text}}</p>
{% if latest.status.task.project %}
<a href="{% url 'detailed-project' latest.status.task.project.project_id %}">
{% if status.task.project %}
<a href="{% url 'detailed-project' status.task.project.project_id %}">
<div class="w-full flex justify-end items-center mt-1 text-gray-400 hover:text-secondosiblue duration-300 cursor-pointer">
<p class="text-xs font-light">{{latest.status.task.project}}</p>
<p class="text-xs font-light">{{status.task.project}}</p>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-3 h-3">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
</svg>
@ -191,10 +191,10 @@
</button>
</div>
{% if latest.status.reaction_set.all %}
{% if status.reaction_set.all %}
<div
class="w-fit h-[30px] text-[16px] rounded-full bg-white p-2 shadow-md absolute -bottom-4 right-2 flex justify-center items-center border gap-1 border-gray-100">
{% for reaction in latest.status.reaction_set.all %}
{% for reaction in status.reaction_set.all %}
<p class="mt-1 cursor-pointer reactionDetailsButton" data-modal-url="{% url 'reactiondetailsmodal' %}">{{reaction.emoji}}</p>
{% endfor %}
</div>
@ -203,7 +203,6 @@
</div>
{% endfor %}
{% else %}
<div class="w-full h-[210px] flex justify-center items-center">
<p class="text-base text-gray-500 text-center">No statuses at the moment.</p>
</div>

@ -1132,7 +1132,7 @@
<div class="w-[25%] hidden xxlg1:flex flex-col gap-3">
<div
class="hidden xxlg1:block w-full bg-white {% if latest_statuses_time_ago %}h-[1000px]{% else %}h-[305px]{%endif%} overflow-y-auto overflow-hidden rounded-md shadow-md py-5 px-3 relative">
class="hidden xxlg1:block w-full bg-white {% if latest_statuses %}h-[1000px]{% else %}h-[305px]{%endif%} overflow-y-auto overflow-hidden rounded-md shadow-md py-5 px-3 relative">
<a href="{% url 'recentactivitiespage' %}">
<div>
@ -1209,13 +1209,14 @@
<script type="module" src='{% static "js/pop-modals.js" %}'></script>
<!---------------------- JS SCRIPTS -------------------->
<!-- ONLINE CONSUMER SCRIPT -->
<script type="text/javascript" src='{% static "js/status/new-status-consumer.js" %}'></script>
<!-- SIDE BAR SCRIPT -->
<!-- ONLINE CONSUMER SCRIPT -->
<script type="text/javascript" src='{% static "js/online/online-consumer.js" %}'></script>
<!-- NEW STATUS CONSUMER -->
<script type="text/javascript" src='{% static "js/status/new-status-consumer.js" %}'></script>
<!-- SIDE BAR SCRIPT -->
<script type="text/javascript" src='{% static "js/side-bar.js" %}'></script>
@ -1237,12 +1238,6 @@
<!-- TO OPEN EMOJI PICKER TO ADD REACTIONS -->
<script type="text/javascript" src='{% static "js/emoji-picker.js" %}'></script>
<!-- TO RELOAD THE STATUS CONTAINER -->
<script type="text/javascript" src='{% static "js/api_calls/get-updated-last-status.js" %}'></script>
<!-- TO RELOAD THE USERS ACTIVITY CONTAINER -->
<script type="text/javascript" src='{% static "js/api_calls/get-updated-user-activity.js" %}'></script>
<!-- NOTIFICATIONS SIDE BAR -->
<script type="text/javascript" src='{% static "js/notifications-side-bar.js" %}'></script>

@ -6,15 +6,14 @@
</p>
<p class="text-sm text-gray-500">Last update:
{% if last_status.date == current_date %}
Today | {{last_status.time}},
{% if minutes_ago == 0 %}
{% if last_status.time_ago == '0min ago' %}
Just Now
{%else%}
{{hours_minutes_ago}}
{%endif%}
{% else %}
{{last_status.date}} | {{last_status.time}}
{%endif %}
Today | {{last_status.time_ago}}
{% endif %}
{% else %}
{{last_status.time_ago}}
{% endif %}
</p>
</div>

@ -76,14 +76,11 @@ urlpatterns = [
#Fetch urls
path('get_tasks/<int:epic_id>/', views.get_tasks, name='get_tasks'),
path('open_tasks_for_project/<int:project_id>/', views.open_tasks_for_project, name='open_tasks_for_project'),
path('getupdatedlaststatus/', views.get_updated_last_status, name='getupdatedlaststatus'),
path('getupdatedactivities/', views.get_latest_activities, name='getupdatedactivities'),
path('recent-activities-page/', views.recent_activities_page, name='recentactivitiespage'),
path('fetch_epics/', views.fetch_epics, name='fetch_epics'),
path('projects/status/<str:status>/', views.fetch_projects_by_status, name='projects_by_status'),
path('all-projects/', views.fetch_projects_by_status, name='all_projects'),
path('status-date/', views.update_all_date_time, name='update-status')
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

@ -9,7 +9,6 @@ from django.db.models import Count, Q
from django.http import JsonResponse
from .models import Task, Epic
from django.template.loader import render_to_string
from .custom_context import calculate_time_ago
from django.template.loader import get_template
from .decorators import *
from django.contrib import messages
@ -213,27 +212,8 @@ def status_mobile_modal(request, *args, **kwargs):
@staff_login_required
def user_recent_activities_modal(request, user_id):
today = datetime.now().date()
if user_id:
specific_user = get_object_or_404(User, id=user_id)
# Fetch the specific user's statuses from the last 24 hours
user_statuses = Status.objects.filter(staff__user=specific_user, date=today).order_by('-id')
# Calculate time ago for each user status and store it in a dictionary
user_statuses_time_ago = [{'status': status, 'time_ago': calculate_time_ago(status)} for status in user_statuses]
else:
# No specific user ID provided, fetch statuses for all users in the last 24 hours
all_user_statuses = Status.objects.filter(date=today).order_by('-id')
# Calculate time ago for each user status and store it in a dictionary
user_statuses_time_ago = [{'status': status, 'time_ago': calculate_time_ago(status)} for status in all_user_statuses]
context = {
'user_statuses_time_ago': user_statuses_time_ago,
}
return render(request, 'user-recent-activities.html', context)
@ -703,60 +683,6 @@ def fetch_epics(request):
# TO UPDATE THE STATUS CONTAINER
@staff_login_required
def get_updated_last_status(request):
if request.user.is_authenticated:
last_status = Status.objects.filter(staff=request.user.staffprofile).last()
if last_status:
status_time = datetime.strptime(last_status.time, '%I:%M %p')
current_time = datetime.now().time()
time_difference = abs(datetime.combine(datetime.today(), current_time) - datetime.combine(datetime.today(), status_time.time()))
minutes_ago = int(time_difference.total_seconds() / 60)
else:
minutes_ago = 0
else:
last_status = None
minutes_ago = 0
if minutes_ago > 60:
hours_ago = minutes_ago // 60
remaining_minutes = minutes_ago % 60
hours_minutes_ago = f"{hours_ago}hr {remaining_minutes}min ago"
else:
hours_minutes_ago = f"{minutes_ago}min ago"
response_data = {
'last_status': last_status,
'minutes_ago': minutes_ago,
'hours_minutes_ago': hours_minutes_ago,
}
recent_status = render_to_string('details_templates/partials/recent-status.html', response_data)
return HttpResponse(recent_status)
# TO GET USER ACTIVITIES
@staff_login_required
def get_latest_activities(request):
today = datetime.now().date()
# Fetch the latest statuses from the last 24 hours
latest_statuses = Status.objects.filter(date=today).order_by('-id')
# Calculate time ago for each status and store it in a dictionary
latest_statuses_time_ago = [{'status': status, 'time_ago': calculate_time_ago(status)} for status in latest_statuses]
response_data = {
'latest_statuses_time_ago': latest_statuses_time_ago,
}
recent_activities = render_to_string('details_pages/partials/recent-activities.html', response_data)
return HttpResponse(recent_activities)
@staff_login_required
@ -879,22 +805,3 @@ def fetch_projects_by_status(request, status=None):
from django.shortcuts import render
from django.http import HttpResponse
from django.utils.dateparse import parse_datetime
def update_all_date_time(request):
statuses = Status.objects.all()
for status in statuses:
if status.date and status.time:
date_str = f"{status.date} {status.time}"
try:
date_time_obj = datetime.strptime(date_str, "%Y-%m-%d %I:%M %p")
status.date_time = date_time_obj
status.save()
except ValueError as e:
# Handle any errors in date/time parsing
print(f"Error parsing date/time for status {status.id}: {e}")
return JsonResponse({"status": "success", "message": "DateTime fields updated for all statuses."})

@ -81,7 +81,6 @@ TEMPLATES = [
'osinacore.custom_context.utilities',
'customercore.custom_context.utilities',
'osinacore.custom_context.last_status',
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
@ -160,7 +159,7 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
EMAIL_HOST = 'osinamail.ositcom.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'osina@eositcom.com'
EMAIL_HOST_USER = 'osina@ositcom.com'
DEFAULT_FROM_EMAIL = 'osina@ositcom.com'
EMAIL_HOST_PASSWORD = 'EMILEselim!@67'
EMAIL_USE_TLS = True

@ -1,13 +0,0 @@
function refreshStatusContainer() {
$.ajax({
url: '/getupdatedlaststatus/',
method: 'GET',
dataType: 'html',
success: function(data) {
$('#statusContainer').html(data);
}
});
}
setInterval(refreshStatusContainer, 60000);

@ -1,13 +0,0 @@
function refreshUserActivityContainer() {
$.ajax({
url: '/getupdatedactivities/',
method: 'GET',
dataType: 'html',
success: function(data) {
$('#activitiesContainer').html(data);
}
});
}
setInterval(refreshUserActivityContainer, 60000);
Loading…
Cancel
Save