settings.py

master
VARUN 2 weeks ago
parent 5bc51db1b0
commit 227755a2ff

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 KiB

@ -25,8 +25,8 @@ SECRET_KEY = 'django-insecure-r*y737z-@#o&lm&hfylvv4*h$8c_288g2m_y=e3gz%_-ig!i^_
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ["armintacareers.com","34.93.75.170:8000","34.36.25.135:8000"]
# ALLOWED_HOSTS = ["armintacareers.com","34.93.75.170:8000","34.36.25.135:8000"]
ALLOWED_HOSTS = []
# Application definition

@ -117,10 +117,6 @@ input {
cursor: pointer;
z-index: 999;
}
.emailRow:hover {
border-top: 1px solid whitesmoke;
box-shadow: 0 4px 4px -2px rgba(0, 0, 0, 0.24);
}
.emailRow__message {
display: flex;
flex: 0.8;
@ -217,10 +213,11 @@ input {
.sidebar__compose {
text-transform: capitalize;
color: gray;
padding: 15px;
padding: 13px;
border-radius: 20px;
background-color: white;
display: flex;
font-size: 14px;
align-items: center;
cursor: pointer;
outline: none;
@ -231,9 +228,9 @@ input {
/* Style for the 'add' icon */
.sidebar__compose .material-icons {
margin-right: 8px; /* Add space between the icon and text */
margin-right: 3px; /* Add space between the icon and text */
vertical-align: middle; /* Ensures the icon is vertically aligned with text */
font-size: 26px;
font-size: 22px;
color:black;
}
@ -309,16 +306,19 @@ cursor:pointer;
}
#dropdownIcon {
position: relative; /* Position it relative to its container */
position: relative;
cursor: pointer;
}
.email-input-container {
position: relative; /* The dropdown will be positioned relative to this container */
position: relative;
}
.emailRow:hover {
border-top: 1px solid whitesmoke;
box-shadow: 0 4px 4px -2px rgba(0, 0, 0, 0.24);
border: 1px solid white !important;
box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.2);
}
.emailRow:first-child {
margin-top: 10px; /* Fixes first row issue */
}
#BackToInboxButton {
margin-bottom: 10px;
@ -345,11 +345,9 @@ cursor:pointer;
padding: 2px;
transition: opacity 0.3s ease; /* Smooth opacity transition */
}
/* On hover, show the text and add background color to the arrow */
#BackToInboxButton:hover i {
background-color: #d3d3d3; /* Gray background color on hover */
border-radius: 5%; /* Round the corners of the background */
background-color: #d3d3d3;
border-radius: 5%;
}
#BackToInboxButton:hover span {
@ -425,12 +423,12 @@ cursor:pointer;
<!-- Sidebar Options -->
<div class="sidebarOption-container" style="position: sticky; top: 20px; margin-top: -140px; margin-left: 150px;">
<div class="sidebarOption sidebarOption__active" style="width: 100px;" id="inboxButton" onclick="setActiveBox(this); renderInbox(); HideMessageDetails()">
<div class="sidebarOption sidebarOption__active" style="width: 100px;" id="inboxButton" onclick="setActiveBox(this, 'inbox'); renderInbox(); HideMessageDetails()">
<span class="material-icons" style="color:black;">inbox</span>
<h3>Inbox</h3>
</div>
<div class="sidebarOption" id="sentButton" style="margin-top: -32px; margin-left: 130px;" onclick="setActiveBox(this); renderSentMessages(); HideMessageDetails()">
<div class="sidebarOption" id="sentButton" style="margin-top: -32px; margin-left: 130px;" onclick="setActiveBox(this, 'sent'); renderSentMessages(); HideMessageDetails()">
<span class="material-icons" style="color:black;">near_me</span>
<h3>Sent</h3>
</div>
@ -444,7 +442,9 @@ cursor:pointer;
<div id="InboxContainer" style="display:block;margin-left: 0px; top:100px; "></div>
<div id="SentContainer" style="display: none;">
<!-- Sent Messages -->
</div>
<div id="MessageDetailsContainer" style="display: none; height:auto; padding: 20px; border: 1px solid #ddd; margin-left: 0px; margin-top:10px; border:none; width:100%; box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px; border-radius:20px;">
<button id="BackToInboxButton" onclick="backToInbox(event)">
<i class="fa fa-arrow-left"></i> <!-- Back arrow icon -->
@ -473,7 +473,7 @@ cursor:pointer;
<div class="compose-body">
<div style="position: relative;">
<div id="emailBarsContainer" style="margin-top: 10px; display: flex; flex-wrap: wrap;"></div>
<input type="text" id="toField" placeholder="Search Emails..." style="width: 128%; text-indent: 10px; border: none; border-bottom: 1px solid #d3d3d3; height: 40px; margin-left: -50px; padding-right: 30px; cursor: pointer;">
<input type="text" id="toField" placeholder="Search Emails..." onkeyup="filterEmails()" style="width: 128%; text-indent: 10px; border: none; border-bottom: 1px solid #d3d3d3; height: 40px; margin-left: -50px; padding-right: 30px; cursor: pointer;">
<span id="dropdownIcon" class="dropdown-icon" style="position: absolute; top: 50%; left: 370px; transform: translateY(-50%); cursor: pointer;">&#9660;</span>
</div>
<div id="emailCheckbox" style="display: none; position: absolute; width: 80%; z-index: 100; background: #ffffff; border: 1px solid #d3d3d3; border-radius: 5px;

@ -156,7 +156,7 @@ a {
font-size: 1.1rem;
color: #000;
padding: 10px;
border-radius: 10px;
border-radius: 50px;
}
.sidebar--items a:hover,
.sidebar--bottom-items a:hover {
@ -221,6 +221,13 @@ a {
.main::-webkit-scrollbar-thumb:hover, .sidebar::-webkit-scrollbar-thumb:hover {
background: #555;
}
.sidebar-link.active {
background-color: #007bff;
color: white !important;
border-radius: 5px;
font-weight: bold;
}
</style>
<title>Dashboard</title>
@ -250,65 +257,55 @@ a {
<div class="sidebar">
<ul class="sidebar--items">
<li>
<a href="#" id="active--link">
<span class="icon icon-0"><i class="fas fa-tachometer-alt"></i></span>
<span class="sidebar--item">Dashboard</span>
</a>
</li>
<li>
<a href="#" id="newJobPosting" onclick="loadUserPage('/new_job_posting/', '{{ user_id }}');">
<a href="#" id="newJobPosting" class="sidebar-link" onclick="activateSidebarLink(this); loadUserPage('/new_job_posting/', '{{ user_id }}');">
<span class="icon icon-3"><i class="far fa-calendar-alt"></i></span>
<span class="sidebar--item" style="white-space: nowrap;">New Jobs Postings</span>
</a>
</li>
<!-- <li>-->
<!-- <a href="#">-->
<!-- <span class="icon icon-4"><i class="fa-solid fa-address-card"></i></span>-->
<!-- <span class="sidebar&#45;&#45;item"> Add Recruiter</span>-->
<!-- </a>-->
<!-- </li>-->
<!-- <li>-->
<!-- <a href="#">-->
<!-- <span class="icon icon-4"><i class="fa-solid fa-person"></i></span>-->
<!-- <span class="sidebar&#45;&#45;item">Recruiter List</span>-->
<!-- </a>-->
<!-- </li>-->
<li>
<a href="#" id="allJobPosting" onclick="loadUserPage('/all_job_postings/', '{{ user_id }}');">
<a href="#" id="allJobPosting" class="sidebar-link" onclick="activateSidebarLink(this); loadUserPage('/all_job_postings/', '{{ user_id }}');">
<span class="icon icon-2"><i class="far fa-calendar-alt"></i></span>
<span class="sidebar--item">All Jobs Postings</span>
</a>
</li>
<li>
<a href="#" id="Messages" onclick="loadUserPage('/messages/', '{{ user_id }}');">
<a href="#" id="Messages" class="sidebar-link" onclick="activateSidebarLink(this); loadUserPage('/messages/', '{{ user_id }}');">
<span id="messageNotificationBadge" style="position: absolute;right: 100px; background-color: red;color: white;font-size: 12px;font-weight: bold;border-radius: 50%; padding: 5px 8px;width: auto;height: auto;text-align: center;display: none;"></span>
<span class="icon icon-4"><i class="fas fa-envelope"></i></span>
<span class="sidebar--item">Messages</span>
</a>
</li>
<li>
<a href="#">
<a href="#" class="sidebar-link" >
<span class="icon icon-4"><i class="fa-regular fa-clock"></i></span>
<span class="sidebar--item">Pending Process</span>
</a>
</li>
<li>
<a href="#">
<a href="#" class="sidebar-link" >
<span class="icon icon-5"><i class="fa fa-paper-plane"></i></span>
<span class="sidebar--item">Submitted Resumes</span>
</a>
</li>
<li>
<a href="#">
<a href="#" class="sidebar-link" >
<span class="icon icon-6"><i class="fa-solid fa-person"></i></span>
<span class="sidebar--item">Client Details</span>
</a>
</li>
<li>
<a href="#">
<a href="#" class="sidebar-link" >
<span class="icon icon-6"><i class="fas fa-chart-bar"></i></span>
<span class="sidebar--item">Activity Report</span>
</a>
</li>
</ul>
<ul class="sidebar--bottom-items">
<li>
@ -328,6 +325,7 @@ a {
</div>
<div id="dynamicContentContainer">
<input type="hidden" id="user_id" name="user_id" value="{{ user_id }}">
</div>
@ -344,28 +342,41 @@ a {
</section>
<script>
function activateSidebarLink(selectedLink) {
// Remove 'active' from all sidebar links
document.querySelectorAll('.sidebar-link').forEach(link => {
link.classList.remove('active');
});
// Add 'active' class to clicked link
selectedLink.classList.add('active');
}
// messages //
document.addEventListener('DOMContentLoaded', function() {
const userId = document.getElementById('user_id').value;
fetch(`/unread_message_count/?user_id=${encodeURIComponent(userId)}`)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.json();
})
function updateMessageNotification() {
fetch(`/unread_message_count/?user_id=${userId}`)
.then(response => response.json())
.then(data => {
console.log("unread count", data);
return data
console.log(data.unread_count);
const notificationBadge = document.getElementById('messageNotificationBadge');
if (data.unread_count > 0) {
notificationBadge.textContent = data.unread_count ;
notificationBadge.style.display = 'inline-flex'; // Show badge if there are unread messages
} else {
notificationBadge.style.display = 'none'; // Hide badge if no unread messages
}
})
.catch(error => {
console.error('Error fetching main message ID:', error);
});
.catch(error => console.error('Error fetching unread message count:', error));
}
updateMessageNotification();
})
function findMainMessageId(message_id) {
console.log(message_id);
const userId = document.getElementById('user_id').value;
@ -601,12 +612,35 @@ function showMessageDetails(message_id) {
function updateMessageReadStatus(message_id) {
const messageRow = document.querySelector(`[data-message-id="${message_id}"]`);
console.log(messageRow);
if (messageRow) {
messageRow.style.backgroundColor = '#fff';
// Update background color for read messages
messageRow.style.backgroundColor = '#efeded';
// Remove bold styling from sender, subject, and timestamp
const sender = messageRow.querySelector('.emailRow__title');
const subject = messageRow.querySelector('.emailRow__message h4');
const timestamp = messageRow.querySelector('.emailRow__time');
if (sender) sender.style.fontWeight = 'normal';
if (subject) subject.style.fontWeight = 'normal';
if (timestamp) timestamp.style.fontWeight = 'normal';
}
}
fetch(`/unread_message_count/?user_id=${userId}`)
.then(response => response.json())
.then(data => {
console.log(data.unread_count);
const notificationBadge = document.getElementById('messageNotificationBadge');
if (data.unread_count > 0) {
notificationBadge.textContent = data.unread_count ;
notificationBadge.style.display = 'inline-flex'; // Show badge if there are unread messages
} else {
notificationBadge.style.display = 'none'; // Hide badge if no unread messages
}
})
.catch(error => console.error('Error fetching unread message count:', error));
const repliesContainer = document.getElementById(`replies_${parentMessageId}`);
console.log(repliesContainer);
repliesContainer.innerHTML = ''; // Clear existing replies
@ -755,6 +789,8 @@ function HideMessageDetails() {
messageDetailsContainer.style.display = 'none';
}
function backToInbox(event) {
event.preventDefault();
const inboxContainer = document.getElementById('InboxContainer');
@ -765,6 +801,8 @@ function backToInbox(event) {
messageDetailsContainer.style.display = 'none';
}
function replyMessage(event, message_id, type) {
event.preventDefault();
console.log(message_id);
@ -990,7 +1028,7 @@ function renderReplies(replies, container) {
renderReplies(reply.replies, nestedRepliesContainer);
const toggleRepliesButton = document.getElementById('toggleReplies');
console.log(toggleRepliesButton)
<!-- console.log(toggleRepliesButton)-->
toggleRepliesButton.textContent = 'View Replies';
toggleRepliesButton.style.marginTop = '20px';
toggleRepliesButton.style.padding = '5px 10px';
@ -1299,16 +1337,17 @@ function renderSentMessages() {
if (data.sent_messages.length === 0) {
inboxContainer.innerHTML = `<h2>No messages found</h2>`;
} else {
// Clear duplicates by grouping messages by the latest message ID
const uniqueMessages = {};
data.sent_messages.forEach(message => {
uniqueMessages[message.latest_message.message_id] = message;
});
// Render only the latest message for each group
Object.values(uniqueMessages).forEach(message => {
const latestMessage = message.latest_message;
const rowStyle = 'background-color: #fff;';
// ✅ Set all sent messages as read (light grey background)
const rowStyle = 'background-color: #efeded;';
const textStyle = 'font-weight: normal; color: #555;';
const emailRow = `
<div class="emailRow" data-message-id="${latestMessage.message_id}" style="border-bottom: 1px solid #ddd; padding: 10px; ${rowStyle}" onclick="showMessageDetails('${latestMessage.message_id}')">
@ -1316,17 +1355,17 @@ function renderSentMessages() {
<input type="checkbox" id="checkbox" data-message-id="${latestMessage.message_id}" onchange="toggleDeleteButton()" onclick="event.stopPropagation()" />
</div>
${latestMessage.recipient_fullnames.join(',').length > 15 ?
`<h3 class="emailRow__title" style="font-weight: bold;">To: ${latestMessage.recipient_fullnames.join(',').substring(0, 15)}...</h3>`
: `<h3 class="emailRow__title" style="font-weight: bold;">To: ${latestMessage.recipient_fullnames.join(',')}</h3>`}
<div class="emailRow__message" style="font-size: 0.9em; color: #555;">
`<h3 class="emailRow__title" style="${textStyle}">To: ${latestMessage.recipient_fullnames.join(',').substring(0, 15)}...</h3>`
: `<h3 class="emailRow__title" style="${textStyle}">To: ${latestMessage.recipient_fullnames.join(',')}</h3>`}
<div class="emailRow__message" style="font-size: 0.9em; ${textStyle}">
${latestMessage.subject ? `
<h4>${latestMessage.subject}
<h4 style="${textStyle}">${latestMessage.subject}
<span class="emailRow__description"> - ${latestMessage.body.substring(0, 50)}...</span>
</h4>`
: `<span class="emailRow__description"> ${latestMessage.body.substring(0, 50)}...</span>`}
<span id="deleteButton" class="material-icons" style="display: none; z-index: 1000;" onclick="deleteMessage(event)">delete</span>
</div>
<p class="emailRow__time" style="color: #aaa; font-size: 0.8em;">${latestMessage.sent_at}</p>
<p class="emailRow__time" style="color: black; font-size: 0.8em; ${textStyle}">${latestMessage.sent_at}</p>
</div>
`;
inboxContainer.innerHTML += emailRow;
@ -1341,6 +1380,8 @@ function renderSentMessages() {
});
}
function renderInbox() {
const inboxContainer = document.getElementById('InboxContainer');
inboxContainer.innerHTML = '';
@ -1368,25 +1409,32 @@ function renderInbox() {
// Render only the latest message for each group
Object.values(uniqueMessages).forEach(message => {
const latestMessage = message.latest_message;
const rowStyle = !latestMessage.is_read
? 'background-color: #efeded; font-weight: bold;'
: 'background-color: #fff;';
const isUnread = !latestMessage.is_read;
const rowStyle = isUnread
? 'background-color: #fff;'
: 'background-color: #efeded;';
const textStyle = isUnread ? 'font-weight: bold;' : 'font-weight: normal;';
const emailRow = `
<div class="emailRow" data-message-id="${latestMessage.message_id}" style="border-bottom: 1px solid #ddd; padding: 10px; ${rowStyle}" onclick="showMessageDetails('${latestMessage.message_id}')">
<div class="emailRow__options">
<input type="checkbox" id="checkbox" data-message-id="${latestMessage.message_id}" onchange="toggleDeleteButton()" onclick="event.stopPropagation()" />
<input type="checkbox" id="checkbox_${latestMessage.message_id}" data-message-id="${latestMessage.message_id}" onchange="toggleDeleteButton()" onclick="event.stopPropagation()" />
</div>
<h3 class="emailRow__title" style="font-weight: bold;">From: ${latestMessage.sender_fullname}</h3>
<h3 class="emailRow__title" style="${textStyle}">From: ${latestMessage.sender_fullname}</h3>
<div class="emailRow__message" style="font-size: 0.9em; color: #555;">
${latestMessage.subject ? `
<h4>${latestMessage.subject}
<h4 style="${textStyle}">${latestMessage.subject}
<span class="emailRow__description"> - ${latestMessage.body.substring(0, 50)}...</span>
</h4>`
: `<span class="emailRow__description"> ${latestMessage.body.substring(0, 50)}...</span>`}
<span id="deleteButton" class="material-icons" style="display: none; z-index: 1000;" onclick="deleteMessage(event)">delete</span>
<span id="delete_${latestMessage.message_id}" class="material-icons" style="display: none; cursor: pointer; color: gray; transition: color 0.2s ease-in-out, transform 0.2s ease-in-out; position: absolute; right: 230px;" onclick="deleteMessage(event, '${latestMessage.message_id}')"
onmouseover="this.style.color='red'; this.style.transform='scale(1.2)';" onmouseout="this.style.color='gray'; this.style.transform='scale(1)';">
delete </span>
</div>
<p class="emailRow__time" style="color: #aaa; font-size: 0.8em;">${latestMessage.sent_at}</p>
<p class="emailRow__time" style="color: black; font-size: 0.8em; ${textStyle}">${latestMessage.sent_at}</p>
</div>
`;
inboxContainer.innerHTML += emailRow;
@ -1403,27 +1451,6 @@ function renderInbox() {
function updateMessageNotification() {
const userId = document.getElementById('user_id').value;
fetch(`/unread_message_count/?user_id=${userId}`)
.then(response => response.json())
.then(data => {
console.log(data.unread_count);
const notificationBadge = document.getElementById('messageNotificationBadge');
if (data.unread_count > 0) {
notificationBadge.textContent = data.unread_count ;
notificationBadge.style.display = 'inline'; // Show badge if there are unread messages
} else {
notificationBadge.style.display = 'none'; // Hide badge if no unread messages
}
})
.catch(error => console.error('Error fetching unread message count:', error));
}
// Call updateMessageNotification every 30 seconds
<!--setInterval(updateMessageNotification, 30000);-->
function sendMessage(event) {
event.preventDefault();

@ -609,13 +609,6 @@ def send_message(request):
else:
return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)
def unread_message_count(request):
user_id = request.GET.get('user_id')
print(user_id)
user = get_object_or_404(InternalTeam, user_id=user_id)
unread_count = Message.objects.filter(recipient=user, is_read=False).count()
return JsonResponse({'unread_count': unread_count})
def render_messages(request):
current_user = request.GET.get('user_id', None)
current_user_id = get_object_or_404(InternalTeam, user_id=current_user)
@ -1170,23 +1163,23 @@ def get_main_message_id(request,message_id):
return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)
# def unread_message_count(request):
# if request.method == 'GET':
# user_id = request.GET.get('user_id')
# print(user_id)
#
# user = get_object_or_404(InternalTeam, user_id=user_id)
#
# # Get all messages that are unread in Message model
# unread = Message.objects.filter(recipient=user, is_read=False).values_list('message_id', flat=True)
# messages_in_status = MessageStatus.objects.filter(message_id__in=unread, user=user).values_list('message_id', flat=True)
#
# unread_not_in_status = set(unread) - set(messages_in_status)
# print(unread_not_in_status, 'Unread messages')
# unread_count = len(unread_not_in_status)
#
# return JsonResponse({
# 'unread_count': unread_count,
# 'unread_messages': list(unread_not_in_status) # Convert set to list for JSON response
# })
# return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)
def unread_message_count(request):
if request.method == 'GET':
user_id = request.GET.get('user_id')
print(user_id)
user = get_object_or_404(InternalTeam, user_id=user_id)
# Get all messages that are unread in Message model
unread = Message.objects.filter(recipient=user, is_read=False).values_list('message_id', flat=True)
messages_in_status = MessageStatus.objects.filter(message_id__in=unread, user=user).values_list('message_id', flat=True)
unread_not_in_status = set(unread) - set(messages_in_status)
print(unread_not_in_status, 'Unread messages')
unread_count = len(unread_not_in_status)
return JsonResponse({
'unread_count': unread_count,
'unread_messages': list(unread_not_in_status) # Convert set to list for JSON response
})
return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)
Loading…
Cancel
Save