Squashed commit of the following:
commit 1eeea9f83ad9230a5c1f7a75662770eaab0df837 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 21:15:41 2025 +0200 Disable resuming of old time entries. commit 3e3ec2f01cb7943622b819a19179388078ae1315 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 20:59:19 2025 +0200 Refactor db migrations. commit 15a51a569da36c6b7c9e01ab17b6fdbdee6ad994 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 19:58:04 2025 +0200 Apply new style for Time Tracking view. commit 77e5278b303e060d2b03853b06277f8aa567ae68 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 18:06:04 2025 +0200 Allow direct registrations as a Company. commit 188a8772757cbef374243d3a5f29e4440ddecabe Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 18:04:45 2025 +0200 Add email invitation feature. commit d9ebaa02aa01b518960a20dccdd5a327d82f30c6 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 17:12:32 2025 +0200 Apply common style for Company, User, Team management pages. commit 81149caf4d8fc6317e2ab1b4f022b32fc5aa6d22 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 16:44:32 2025 +0200 Move export functions to own module. commit 1a26e19338e73f8849c671471dd15cc3c1b1fe82 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 15:51:15 2025 +0200 Split up models.py. commit 61f1ccd10f721b0ff4dc1eccf30c7a1ee13f204d Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 12:05:28 2025 +0200 Move utility function into own modules. commit 84b341ed35e2c5387819a8b9f9d41eca900ae79f Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 11:44:24 2025 +0200 Refactor auth functions use. commit 923e311e3da5b26d85845c2832b73b7b17c48adb Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 11:35:52 2025 +0200 Refactor route nameing and fix bugs along the way. commit f0a5c4419c340e62a2615c60b2a9de28204d2995 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 10:34:33 2025 +0200 Fix URL endpoints in announcement template. commit b74d74542a1c8dc350749e4788a9464d067a88b5 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 09:25:53 2025 +0200 Move announcements to own module. commit 9563a28021ac46c82c04fe4649b394dbf96f92c7 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 09:16:30 2025 +0200 Combine Company view and edit templates. commit 6687c373e681d54e4deab6b2582fed5cea9aadf6 Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 08:17:42 2025 +0200 Move Users, Company and System Administration to own modules. commit 8b7894a2e3eb84bb059f546648b6b9536fea724e Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 07:40:57 2025 +0200 Move Teams and Projects to own modules. commit d11bf059d99839ecf1f5d7020b8c8c8a2454c00b Author: Jens Luedicke <jens@luedicke.me> Date: Mon Jul 7 07:09:33 2025 +0200 Move Tasks and Sprints to own modules.
This commit is contained in:
102
routes/company_api.py
Normal file
102
routes/company_api.py
Normal file
@@ -0,0 +1,102 @@
|
||||
"""
|
||||
Company API endpoints
|
||||
"""
|
||||
|
||||
from flask import Blueprint, jsonify, g
|
||||
from models import db, Company, User, Role, Team, Project, TimeEntry
|
||||
from routes.auth import system_admin_required
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
company_api_bp = Blueprint('company_api', __name__, url_prefix='/api')
|
||||
|
||||
|
||||
@company_api_bp.route('/system-admin/companies/<int:company_id>/users')
|
||||
@system_admin_required
|
||||
def api_company_users(company_id):
|
||||
"""API: Get users for a specific company (System Admin only)"""
|
||||
company = Company.query.get_or_404(company_id)
|
||||
users = User.query.filter_by(company_id=company.id).order_by(User.username).all()
|
||||
|
||||
return jsonify({
|
||||
'company': {
|
||||
'id': company.id,
|
||||
'name': company.name,
|
||||
'is_personal': company.is_personal
|
||||
},
|
||||
'users': [{
|
||||
'id': user.id,
|
||||
'username': user.username,
|
||||
'email': user.email,
|
||||
'role': user.role.value,
|
||||
'is_blocked': user.is_blocked,
|
||||
'is_verified': user.is_verified,
|
||||
'created_at': user.created_at.isoformat(),
|
||||
'team_id': user.team_id
|
||||
} for user in users]
|
||||
})
|
||||
|
||||
|
||||
@company_api_bp.route('/system-admin/companies/<int:company_id>/stats')
|
||||
@system_admin_required
|
||||
def api_company_stats(company_id):
|
||||
"""API: Get detailed statistics for a specific company"""
|
||||
company = Company.query.get_or_404(company_id)
|
||||
|
||||
# User counts by role
|
||||
role_counts = {}
|
||||
for role in Role:
|
||||
count = User.query.filter_by(company_id=company.id, role=role).count()
|
||||
if count > 0:
|
||||
role_counts[role.value] = count
|
||||
|
||||
# Team and project counts
|
||||
team_count = Team.query.filter_by(company_id=company.id).count()
|
||||
project_count = Project.query.filter_by(company_id=company.id).count()
|
||||
active_projects = Project.query.filter_by(company_id=company.id, is_active=True).count()
|
||||
|
||||
# Time entries statistics
|
||||
week_ago = datetime.now() - timedelta(days=7)
|
||||
month_ago = datetime.now() - timedelta(days=30)
|
||||
|
||||
weekly_entries = TimeEntry.query.join(User).filter(
|
||||
User.company_id == company.id,
|
||||
TimeEntry.arrival_time >= week_ago
|
||||
).count()
|
||||
|
||||
monthly_entries = TimeEntry.query.join(User).filter(
|
||||
User.company_id == company.id,
|
||||
TimeEntry.arrival_time >= month_ago
|
||||
).count()
|
||||
|
||||
# Active sessions
|
||||
active_sessions = TimeEntry.query.join(User).filter(
|
||||
User.company_id == company.id,
|
||||
TimeEntry.departure_time == None,
|
||||
TimeEntry.is_paused == False
|
||||
).count()
|
||||
|
||||
return jsonify({
|
||||
'company': {
|
||||
'id': company.id,
|
||||
'name': company.name,
|
||||
'is_personal': company.is_personal,
|
||||
'is_active': company.is_active
|
||||
},
|
||||
'users': {
|
||||
'total': User.query.filter_by(company_id=company.id).count(),
|
||||
'verified': User.query.filter_by(company_id=company.id, is_verified=True).count(),
|
||||
'blocked': User.query.filter_by(company_id=company.id, is_blocked=True).count(),
|
||||
'roles': role_counts
|
||||
},
|
||||
'teams': team_count,
|
||||
'projects': {
|
||||
'total': project_count,
|
||||
'active': active_projects,
|
||||
'inactive': project_count - active_projects
|
||||
},
|
||||
'time_entries': {
|
||||
'weekly': weekly_entries,
|
||||
'monthly': monthly_entries,
|
||||
'active_sessions': active_sessions
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user