feat: gestion de materias por rol - Bedelia, Docente y Alumno
- Nuevo modelo StudentEnrollment (tabla student_enrollments)
con inscripcion unica por alumno/comision, estado y notas
- Migracion automatica en init_db.py (CREATE TABLE IF NOT EXISTS)
- Rutas /admin/commissions/ para Bedelia y Admin:
listado con filtros, detalle, asignar docente,
inscribir/dar de baja alumnos, cambiar estado
- Blueprint my_subjects_bp en /mis-materias:
Docente ve solo sus comisiones asignadas
Alumno ve solo sus inscripciones activas
Admin/Bedelia ven todo
- Templates: admin/commissions/list.html, detail.html
my_subjects/list.html, detail.html
- Navbar actualizado por rol:
Docente y Alumno: 'Mis Materias'
Bedelia y Admin: 'Gestion de Comisiones'
This commit is contained in:
@@ -0,0 +1,270 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}{{ commission.subject.name }} — {{ commission.get_full_code() }} — Edu-Space{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container-fluid py-4">
|
||||
|
||||
<!-- Breadcrumb -->
|
||||
<nav aria-label="breadcrumb" class="mb-3">
|
||||
<ol class="breadcrumb small">
|
||||
<li class="breadcrumb-item"><a href="{{ url_for('main.dashboard') }}">Inicio</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ url_for('my_subjects.my_subjects_list') }}">Mis Materias</a></li>
|
||||
<li class="breadcrumb-item active">{{ commission.get_full_code() }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<!-- Flash Messages -->
|
||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||
{% if messages %}
|
||||
{% for category, message in messages %}
|
||||
<div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show">
|
||||
{{ message }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
|
||||
<div class="row g-4">
|
||||
<!-- Left Column: Commission Info -->
|
||||
<div class="col-12 col-lg-4">
|
||||
|
||||
<!-- Header Card -->
|
||||
{% set shift_gradient = {
|
||||
'Mañana': 'linear-gradient(135deg, #f59e0b 0%, #fcd34d 100%)',
|
||||
'Tarde': 'linear-gradient(135deg, #3b82f6 0%, #93c5fd 100%)',
|
||||
'Vespertino':'linear-gradient(135deg, #8b5cf6 0%, #c4b5fd 100%)',
|
||||
'Noche': 'linear-gradient(135deg, #1e293b 0%, #475569 100%)'
|
||||
} %}
|
||||
<div class="card border-0 shadow-sm mb-4 overflow-hidden">
|
||||
<div style="background:{{ shift_gradient.get(commission.shift or '', 'linear-gradient(135deg, #6366f1, #a5b4fc)') }}; padding:1.25rem 1.25rem .5rem; color:white;">
|
||||
<div class="d-flex align-items-center gap-2 mb-1">
|
||||
<i class="bi bi-book-fill fs-5 opacity-75"></i>
|
||||
<span class="fw-bold font-monospace">{{ commission.get_full_code() }}</span>
|
||||
</div>
|
||||
<h4 class="fw-bold mb-0">{{ commission.subject.name }}</h4>
|
||||
{% if commission.subject.career_obj %}
|
||||
<small class="opacity-75">{{ commission.subject.career_obj.name }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body pt-3">
|
||||
|
||||
<div class="d-flex flex-wrap gap-2 mb-3">
|
||||
{% if commission.shift %}
|
||||
{% set shift_colors = {'Mañana': 'warning', 'Tarde': 'info', 'Vespertino': 'secondary', 'Noche': 'dark'} %}
|
||||
<span class="badge bg-{{ shift_colors.get(commission.shift, 'secondary') }}-subtle text-{{ shift_colors.get(commission.shift, 'secondary') }} border border-{{ shift_colors.get(commission.shift, 'secondary') }}-subtle">
|
||||
<i class="bi bi-sun me-1"></i>{{ commission.shift }}
|
||||
</span>
|
||||
{% endif %}
|
||||
<span class="badge bg-secondary-subtle text-secondary border border-secondary-subtle">
|
||||
<i class="bi bi-calendar3 me-1"></i>{{ commission.semester }} {{ commission.year }}
|
||||
</span>
|
||||
{% if commission.active %}
|
||||
<span class="badge bg-success-subtle text-success border border-success-subtle">Activa</span>
|
||||
{% else %}
|
||||
<span class="badge bg-secondary-subtle text-secondary">Inactiva</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Details list -->
|
||||
<ul class="list-unstyled small">
|
||||
{% if commission.schedule %}
|
||||
<li class="d-flex align-items-start gap-2 py-2 border-bottom">
|
||||
<i class="bi bi-clock-history text-primary mt-1 flex-shrink-0"></i>
|
||||
<div>
|
||||
<div class="text-muted" style="font-size:.72rem;">Horario</div>
|
||||
<div class="fw-semibold">{{ commission.schedule }}</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li class="d-flex align-items-start gap-2 py-2 border-bottom">
|
||||
<i class="bi bi-person-video3 text-info mt-1 flex-shrink-0"></i>
|
||||
<div>
|
||||
<div class="text-muted" style="font-size:.72rem;">Docente</div>
|
||||
{% if commission.teacher %}
|
||||
<div class="fw-semibold">{{ commission.teacher.name }}</div>
|
||||
<div class="text-muted" style="font-size:.75rem;">{{ commission.teacher.email }}</div>
|
||||
{% else %}
|
||||
<div class="text-warning fst-italic">Sin asignar</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</li>
|
||||
|
||||
{% if role in ['docente', 'admin', 'bedelia'] %}
|
||||
<li class="d-flex align-items-start gap-2 py-2 border-bottom">
|
||||
<i class="bi bi-people text-success mt-1 flex-shrink-0"></i>
|
||||
<div>
|
||||
<div class="text-muted" style="font-size:.72rem;">Alumnos</div>
|
||||
<div class="fw-semibold">{{ enrollments | length }} / {{ commission.max_students }}</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if commission.subject.code %}
|
||||
<li class="d-flex align-items-start gap-2 py-2 border-bottom">
|
||||
<i class="bi bi-upc text-secondary mt-1 flex-shrink-0"></i>
|
||||
<div>
|
||||
<div class="text-muted" style="font-size:.72rem;">Código asignatura</div>
|
||||
<div class="fw-semibold font-monospace">{{ commission.subject.code }}</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if commission.subject.credits %}
|
||||
<li class="d-flex align-items-start gap-2 py-2">
|
||||
<i class="bi bi-star text-warning mt-1 flex-shrink-0"></i>
|
||||
<div>
|
||||
<div class="text-muted" style="font-size:.72rem;">Créditos</div>
|
||||
<div class="fw-semibold">{{ commission.subject.credits }}</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
{% if commission.virtual_link %}
|
||||
<a href="{{ commission.virtual_link }}" target="_blank"
|
||||
class="btn btn-outline-info btn-sm w-100 mt-2" id="virtual-link-detail">
|
||||
<i class="bi bi-camera-video me-1"></i>Acceso Virtual (Zoom / Meet / Teams)
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{% if role in ['admin', 'bedelia'] %}
|
||||
<div class="mt-3">
|
||||
<a href="{{ url_for('admin.commission_detail', id=commission.id) }}"
|
||||
class="btn btn-warning btn-sm w-100" id="manage-commission-btn">
|
||||
<i class="bi bi-gear me-1"></i>Gestionar Comisión
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Classroom Info -->
|
||||
{% if classroom %}
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-header border-0 bg-transparent py-2">
|
||||
<i class="bi bi-door-open text-primary me-2"></i>
|
||||
<span class="fw-semibold small">Aula Asignada</span>
|
||||
</div>
|
||||
<div class="card-body py-3">
|
||||
<div class="fw-bold">{{ classroom.room_number }}</div>
|
||||
<div class="text-muted small">{{ classroom.building or '—' }}{% if classroom.floor %}, Piso {{ classroom.floor }}{% endif %}</div>
|
||||
{% if recent_reservation %}
|
||||
<div class="mt-2 small text-muted">
|
||||
<i class="bi bi-calendar-event me-1"></i>
|
||||
Próxima clase: {{ recent_reservation.start_time.strftime('%d/%m/%Y %H:%M') }}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="d-flex gap-2 mt-2 flex-wrap">
|
||||
{% if classroom.capacity %}
|
||||
<span class="badge bg-secondary-subtle text-secondary border border-secondary-subtle">
|
||||
<i class="bi bi-people me-1"></i>Capacidad: {{ classroom.capacity }}
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if classroom.has_projector %}
|
||||
<span class="badge bg-info-subtle text-info border border-info-subtle"><i class="bi bi-projector me-1"></i>Proyector</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Right Column: Students list (for docente/admin/bedelia) or My info (for alumno) -->
|
||||
<div class="col-12 col-lg-8">
|
||||
|
||||
{% if role in ['docente', 'admin', 'bedelia'] and enrollments %}
|
||||
<!-- Students Table -->
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-header border-0 bg-transparent py-2 d-flex align-items-center gap-2">
|
||||
<i class="bi bi-mortarboard text-success"></i>
|
||||
<span class="fw-semibold">Alumnos Inscriptos</span>
|
||||
<span class="badge bg-success-subtle text-success">{{ enrollments | length }}</span>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0 align-middle" id="students-table">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th class="ps-3">#</th>
|
||||
<th>Alumno</th>
|
||||
<th class="text-center">Estado</th>
|
||||
<th class="text-center">Desde</th>
|
||||
<th>Notas</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for e in enrollments %}
|
||||
<tr>
|
||||
<td class="ps-3 text-muted small">{{ loop.index }}</td>
|
||||
<td>
|
||||
<div class="fw-semibold small">{{ e.student.name if e.student else '—' }}</div>
|
||||
<div class="text-muted" style="font-size:.75rem;">{{ e.student.email if e.student else '' }}</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
{% set st_colors = {'activo': 'success', 'retirado': 'danger', 'condicional': 'warning'} %}
|
||||
<span class="badge bg-{{ st_colors.get(e.status, 'secondary') }}-subtle text-{{ st_colors.get(e.status, 'secondary') }} border border-{{ st_colors.get(e.status, 'secondary') }}-subtle">
|
||||
{{ e.status | capitalize }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-center small text-muted">
|
||||
{{ e.enrolled_at.strftime('%d/%m/%Y') if e.enrolled_at else '—' }}
|
||||
</td>
|
||||
<td class="small text-muted">{{ e.notes or '—' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% elif role in ['docente', 'admin', 'bedelia'] and not enrollments %}
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-body text-center py-5">
|
||||
<i class="bi bi-people display-4 text-muted opacity-40"></i>
|
||||
<p class="text-muted mt-3">No hay alumnos inscriptos en esta comisión todavía.</p>
|
||||
{% if role in ['admin', 'bedelia'] %}
|
||||
<a href="{{ url_for('admin.commission_detail', id=commission.id) }}" class="btn btn-outline-success btn-sm">
|
||||
<i class="bi bi-person-plus me-1"></i>Inscribir Alumnos
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% elif role == 'alumno' %}
|
||||
<!-- Alumno: show their own enrollment status -->
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-header border-0 bg-transparent py-2">
|
||||
<i class="bi bi-person-check text-success me-2"></i>
|
||||
<span class="fw-semibold small">Tu inscripción</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="d-flex align-items-center gap-3 p-3 rounded bg-success-subtle border border-success-subtle">
|
||||
<div class="rounded-circle bg-success d-flex align-items-center justify-content-center"
|
||||
style="width:48px;height:48px;flex-shrink:0;">
|
||||
<i class="bi bi-check-lg text-white fs-4"></i>
|
||||
</div>
|
||||
<div>
|
||||
<div class="fw-bold">Inscripto en esta comisión</div>
|
||||
<div class="text-muted small">{{ commission.subject.name }} — {{ commission.get_full_code() }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if commission.subject.description %}
|
||||
<div class="mt-4">
|
||||
<h6 class="fw-semibold mb-2">Sobre la asignatura</h6>
|
||||
<p class="text-muted small">{{ commission.subject.description }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,189 @@
|
||||
{% 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="{{ url_for('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 -->
|
||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||
{% if messages %}
|
||||
{% for category, message in messages %}
|
||||
<div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show">
|
||||
{{ message }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
|
||||
{% 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)'
|
||||
} %}
|
||||
<div style="height:5px; background:{{ shift_gradient.get(comm.shift or '', 'linear-gradient(135deg, #6366f1, #a5b4fc)') }}; border-radius:.5rem .5rem 0 0;"></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.get_full_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.get(comm.shift, 'secondary') }}-subtle text-{{ shift_colors.get(comm.shift, 'secondary') }} border border-{{ shift_colors.get(comm.shift, '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="{{ url_for('my_subjects.my_subject_detail', commission_id=comm.id) }}"
|
||||
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="{{ url_for('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 %}
|
||||
Reference in New Issue
Block a user