Added UI features
All checks were successful
Docker hub build / docker (push) Successful in 5m11s

This commit is contained in:
Ultradesu
2025-07-21 00:52:45 +03:00
parent 67f1c4d147
commit 7efe87c1d2
2 changed files with 203 additions and 12 deletions

View File

@@ -23,11 +23,17 @@ def userPortal(request, user_hash):
# Get connection statistics for all user's links
# Count successful connections for each specific link
connection_stats = {}
recent_connection_stats = {}
usage_frequency = {}
total_connections = 0
# Get date ranges for analysis
from datetime import datetime, timedelta
now = datetime.now()
recent_date = now - timedelta(days=30)
for acl_link in acl_links:
# Count successful connections for this specific link by checking if the link appears in the access log data
# This is more accurate as it counts actual uses of the specific link
link_connections = AccessLog.objects.filter(
user=user.username,
server=acl_link.acl.server.name,
@@ -37,15 +43,55 @@ def userPortal(request, user_hash):
params=[f'%{acl_link.link}%']
).count()
# Get recent connections (last 30 days)
recent_connections = AccessLog.objects.filter(
user=user.username,
server=acl_link.acl.server.name,
action='Success',
timestamp__gte=recent_date
).extra(
where=["data LIKE %s"],
params=[f'%{acl_link.link}%']
).count()
# Calculate usage frequency (connections per week over last 30 days)
# Get daily usage for the last 7 days for mini chart
daily_usage = []
for i in range(7):
day_start = now - timedelta(days=i+1)
day_end = now - timedelta(days=i)
day_connections = AccessLog.objects.filter(
user=user.username,
server=acl_link.acl.server.name,
action='Success',
timestamp__gte=day_start,
timestamp__lt=day_end
).extra(
where=["data LIKE %s"],
params=[f'%{acl_link.link}%']
).count()
daily_usage.append(day_connections)
# Reverse to show oldest to newest
daily_usage.reverse()
# If no specific link matches found, fall back to general server connection count for this user
if link_connections == 0:
# This gives a rough estimate based on server connections divided by number of links for this server
server_connections = AccessLog.objects.filter(
user=user.username,
server=acl_link.acl.server.name,
action='Success'
).count()
server_recent_connections = AccessLog.objects.filter(
user=user.username,
server=acl_link.acl.server.name,
action='Success',
timestamp__gte=recent_date
).count()
# Get number of links for this server for this user
user_links_on_server = ACLLink.objects.filter(
acl__user=user,
@@ -55,8 +101,17 @@ def userPortal(request, user_hash):
# Distribute connections evenly among links if we can't track specific usage
if user_links_on_server > 0:
link_connections = server_connections // user_links_on_server
recent_connections = server_recent_connections // user_links_on_server
# Distribute daily usage as well
if sum(daily_usage) == 0: # If no activity, create empty chart
daily_usage = [0] * 7
else:
avg_daily = max(1, sum(daily_usage) // (user_links_on_server * 7))
daily_usage = [avg_daily if sum(daily_usage) > 0 else 0 for _ in range(7)]
connection_stats[acl_link.link] = link_connections
recent_connection_stats[acl_link.link] = recent_connections
usage_frequency[acl_link.link] = daily_usage
total_connections += link_connections
# Group links by server
@@ -92,24 +147,23 @@ def userPortal(request, user_hash):
# Add link information with connection stats
link_url = f"{EXTERNAL_ADDRESS}/ss/{link.link}#{server_name}"
connection_count = connection_stats.get(link.link, 0)
recent_count = recent_connection_stats.get(link.link, 0)
daily_usage = usage_frequency.get(link.link, [0] * 7)
servers_data[server_name]['links'].append({
'link': link,
'url': link_url,
'comment': link.comment or 'Default',
'connections': connection_count,
'recent_connections': recent_count,
'daily_usage': daily_usage,
'max_daily': max(daily_usage) if daily_usage else 0,
})
servers_data[server_name]['total_connections'] += connection_count
total_links += 1
# Get recent connection activity (last 30 days)
from datetime import datetime, timedelta
recent_date = datetime.now() - timedelta(days=30)
recent_connections = AccessLog.objects.filter(
user=user.username,
action='Success',
timestamp__gte=recent_date
).count()
# Calculate total recent connections from all links
total_recent_connections = sum(recent_connection_stats.values())
context = {
'user': user,
@@ -117,7 +171,7 @@ def userPortal(request, user_hash):
'total_servers': len(servers_data),
'total_links': total_links,
'total_connections': total_connections,
'recent_connections': recent_connections,
'recent_connections': total_recent_connections,
'external_address': EXTERNAL_ADDRESS,
}