feat: implementacion de dashboards por rol, soporte de clases virtuales concurrentes en importador de sheets y cartelera del dia

This commit is contained in:
2026-09-18 23:04:48 -03:00
parent 47b50ede7e
commit 1080acd43a
240 changed files with 8354 additions and 8886 deletions
+181
View File
@@ -0,0 +1,181 @@
{% extends 'base.html' %}
{% block title %}Mis Materias — Edu-Space{% endblock %}
{% block content %}
<div class="container-fluid py-4">
<!-- Header -->
<div class="d-flex align-items-center justify-content-between mb-4 flex-wrap gap-2">
<div>
{% if role == 'docente' %}
<h1 class="h3 fw-bold mb-1"><i class="bi bi-person-video3 me-2 text-info"></i>Mis Materias</h1>
<p class="text-muted mb-0 small">Comisiones que tenés asignadas como docente este ciclo</p>
{% elif role == 'alumno' %}
<h1 class="h3 fw-bold mb-1"><i class="bi bi-mortarboard me-2 text-success"></i>Mis Materias</h1>
<p class="text-muted mb-0 small">Comisiones en las que estás inscripto</p>
{% else %}
<h1 class="h3 fw-bold mb-1"><i class="bi bi-diagram-3 me-2 text-primary"></i>Todas las Comisiones</h1>
<p class="text-muted mb-0 small">Vista global de comisiones activas</p>
{% endif %}
</div>
{% if role in ['admin', 'bedelia'] %}
<a href="/admin/commissions_list" class="btn btn-outline-primary btn-sm">
<i class="bi bi-gear me-1"></i>Gestionar Comisiones
</a>
{% endif %}
</div>
<!-- Flash Messages -->
{% if commissions %}
<!-- Stats summary -->
<div class="row g-3 mb-4">
<div class="col-6 col-md-3">
<div class="card border-0 shadow-sm text-center py-3">
<div class="display-6 fw-bold text-primary">{{ commissions | length }}</div>
<div class="text-muted small">Comisiones</div>
</div>
</div>
{% if role == 'docente' %}
<div class="col-6 col-md-3">
<div class="card border-0 shadow-sm text-center py-3">
<div class="display-6 fw-bold text-info">
{{ commissions | sum(attribute='current_students') or 0 }}
</div>
<div class="text-muted small">Alumnos totales</div>
</div>
</div>
{% endif %}
<div class="col-6 col-md-3">
<div class="card border-0 shadow-sm text-center py-3">
<div class="display-6 fw-bold text-success">
{{ commissions | selectattr('active') | list | length }}
</div>
<div class="text-muted small">Activas</div>
</div>
</div>
</div>
<!-- Commission Cards Grid -->
<div class="row g-3" id="commissions-grid">
{% for comm in commissions %}
<div class="col-12 col-md-6 col-xl-4">
<div class="card border-0 shadow-sm h-100 commission-card" style="transition:transform .15s,box-shadow .15s;">
<!-- Color top band based on shift -->
{% set shift_gradient = {
'Mañana': 'linear-gradient(135deg, #f59e0b, #fcd34d)',
'Tarde': 'linear-gradient(135deg, #3b82f6, #93c5fd)',
'Vespertino':'linear-gradient(135deg, #8b5cf6, #c4b5fd)',
'Noche': 'linear-gradient(135deg, #1e293b, #475569)'
} %}
{% set top_bar_bg = shift_gradient[comm.shift] or 'linear-gradient(135deg, #6366f1, #a5b4fc)' %}
<div {{ ("style=\"height:5px; background:" ~ top_bar_bg ~ "; border-radius:.5rem .5rem 0 0;\"") | safe }}></div>
<div class="card-body">
<!-- Subject + commission code -->
<div class="d-flex align-items-start justify-content-between mb-2">
<div>
<h6 class="fw-bold mb-0">{{ comm.subject.name }}</h6>
<span class="badge bg-primary-subtle text-primary font-monospace small mt-1">
{{ comm.full_code or comm.code }}
</span>
</div>
{% if not comm.active %}
<span class="badge bg-secondary-subtle text-secondary ms-2">Inactiva</span>
{% endif %}
</div>
<div class="d-flex flex-wrap gap-2 mb-3">
{% if comm.shift %}
{% set shift_colors = {'Mañana': 'warning', 'Tarde': 'info', 'Vespertino': 'secondary', 'Noche': 'dark'} %}
<span class="badge bg-{{ shift_colors[comm.shift] or 'secondary' }}-subtle text-{{ shift_colors[comm.shift] or 'secondary' }} border border-{{ shift_colors[comm.shift] or 'secondary' }}-subtle">
<i class="bi bi-clock me-1"></i>{{ comm.shift }}
</span>
{% endif %}
<span class="badge bg-secondary-subtle text-secondary">
<i class="bi bi-calendar3 me-1"></i>{{ comm.semester }} {{ comm.year }}
</span>
</div>
<ul class="list-unstyled small mb-3">
{% if comm.teacher %}
<li class="d-flex align-items-center gap-2 py-1">
<i class="bi bi-person-video3 text-info flex-shrink-0"></i>
<span>{{ comm.teacher.name }}</span>
</li>
{% else %}
<li class="d-flex align-items-center gap-2 py-1 text-warning">
<i class="bi bi-exclamation-circle flex-shrink-0"></i>
<span class="fst-italic">Sin docente asignado</span>
</li>
{% endif %}
{% if comm.schedule %}
<li class="d-flex align-items-center gap-2 py-1">
<i class="bi bi-clock-history text-muted flex-shrink-0"></i>
<span class="text-muted">{{ comm.schedule }}</span>
</li>
{% endif %}
{% if role in ['docente', 'admin', 'bedelia'] %}
<li class="d-flex align-items-center gap-2 py-1">
<i class="bi bi-people text-muted flex-shrink-0"></i>
<span class="text-muted">
{{ comm.current_students or 0 }} / {{ comm.max_students }} alumnos
</span>
</li>
{% endif %}
</ul>
{% if comm.virtual_link %}
<a href="{{ comm.virtual_link }}" target="_blank" class="btn btn-sm btn-outline-info w-100 mb-2"
id="virtual-link-{{ comm.id }}">
<i class="bi bi-camera-video me-1"></i>Acceso Virtual
</a>
{% endif %}
</div>
<div class="card-footer border-0 bg-transparent pt-0 pb-3 px-3">
<a href="/my_subjects/my_subject_detail"
class="btn btn-primary btn-sm w-100" id="view-commission-{{ comm.id }}">
<i class="bi bi-eye me-1"></i>Ver detalle
</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<!-- Empty state -->
<div class="text-center py-5 mt-4">
<div class="mb-4">
{% if role == 'docente' %}
<i class="bi bi-person-video3 display-2 text-muted opacity-30"></i>
<h5 class="mt-3 fw-semibold">No tenés comisiones asignadas</h5>
<p class="text-muted small">Cuando Bedelía te asigne una comisión, aparecerá aquí.</p>
{% elif role == 'alumno' %}
<i class="bi bi-mortarboard display-2 text-muted opacity-30"></i>
<h5 class="mt-3 fw-semibold">No estás inscripto en ninguna comisión</h5>
<p class="text-muted small">Cuando Bedelía te inscriba en una comisión, aparecerá aquí.</p>
{% else %}
<i class="bi bi-diagram-3 display-2 text-muted opacity-30"></i>
<h5 class="mt-3 fw-semibold">No hay comisiones activas</h5>
{% endif %}
</div>
<a href="/main/dashboard" class="btn btn-outline-secondary btn-sm">
<i class="bi bi-house me-1"></i>Volver al Inicio
</a>
</div>
{% endif %}
</div>
<style>
.commission-card:hover {
transform: translateY(-3px);
box-shadow: 0 .5rem 1.5rem rgba(0,0,0,.15) !important;
}
</style>
{% endblock %}