Few UI adjustments
This commit is contained in:
parent
10c1f7aed3
commit
c96a56f6c9
@ -85,7 +85,6 @@ class UploadFormFile(forms.ModelForm):
|
|||||||
fields = (
|
fields = (
|
||||||
"title",
|
"title",
|
||||||
"file",
|
"file",
|
||||||
"course",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@ -101,7 +100,6 @@ class UploadFormVideo(forms.ModelForm):
|
|||||||
fields = (
|
fields = (
|
||||||
"title",
|
"title",
|
||||||
"video",
|
"video",
|
||||||
"course",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|||||||
@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 4.0.8 on 2024-01-16 20:14
|
||||||
|
|
||||||
|
import django.core.validators
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('course', '0006_courseoffer'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='upload',
|
||||||
|
name='file',
|
||||||
|
field=models.FileField(help_text='Valid Files: pdf, docx, doc, xls, xlsx, ppt, pptx, zip, rar, 7zip', upload_to='course_files/', validators=[django.core.validators.FileExtensionValidator(['pdf', 'docx', 'doc', 'xls', 'xlsx', 'ppt', 'pptx', 'zip', 'rar', '7zip'])]),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='uploadvideo',
|
||||||
|
name='video',
|
||||||
|
field=models.FileField(help_text='Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3', upload_to='course_videos/', validators=[django.core.validators.FileExtensionValidator(['mp4', 'mkv', 'wmv', '3gp', 'f4v', 'avi', 'mp3'])]),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -165,6 +165,7 @@ class Upload(models.Model):
|
|||||||
course = models.ForeignKey(Course, on_delete=models.CASCADE)
|
course = models.ForeignKey(Course, on_delete=models.CASCADE)
|
||||||
file = models.FileField(
|
file = models.FileField(
|
||||||
upload_to="course_files/",
|
upload_to="course_files/",
|
||||||
|
help_text="Valid Files: pdf, docx, doc, xls, xlsx, ppt, pptx, zip, rar, 7zip",
|
||||||
validators=[
|
validators=[
|
||||||
FileExtensionValidator(
|
FileExtensionValidator(
|
||||||
[
|
[
|
||||||
@ -233,6 +234,7 @@ class UploadVideo(models.Model):
|
|||||||
course = models.ForeignKey(Course, on_delete=models.CASCADE)
|
course = models.ForeignKey(Course, on_delete=models.CASCADE)
|
||||||
video = models.FileField(
|
video = models.FileField(
|
||||||
upload_to="course_videos/",
|
upload_to="course_videos/",
|
||||||
|
help_text="Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3",
|
||||||
validators=[
|
validators=[
|
||||||
FileExtensionValidator(["mp4", "mkv", "wmv", "3gp", "f4v", "avi", "mp3"])
|
FileExtensionValidator(["mp4", "mkv", "wmv", "3gp", "f4v", "avi", "mp3"])
|
||||||
],
|
],
|
||||||
|
|||||||
@ -311,10 +311,12 @@ def deallocate_course(request, pk):
|
|||||||
def handle_file_upload(request, slug):
|
def handle_file_upload(request, slug):
|
||||||
course = Course.objects.get(slug=slug)
|
course = Course.objects.get(slug=slug)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = UploadFormFile(request.POST, request.FILES, {"course": course})
|
form = UploadFormFile(request.POST, request.FILES)
|
||||||
# file_name = request.POST.get('name')
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
obj = form.save(commit=False)
|
||||||
|
obj.course = course
|
||||||
|
obj.save()
|
||||||
|
|
||||||
messages.success(
|
messages.success(
|
||||||
request, (request.POST.get("title") + " has been uploaded.")
|
request, (request.POST.get("title") + " has been uploaded.")
|
||||||
)
|
)
|
||||||
@ -369,9 +371,12 @@ def handle_file_delete(request, slug, file_id):
|
|||||||
def handle_video_upload(request, slug):
|
def handle_video_upload(request, slug):
|
||||||
course = Course.objects.get(slug=slug)
|
course = Course.objects.get(slug=slug)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = UploadFormVideo(request.POST, request.FILES, {"course": course})
|
form = UploadFormVideo(request.POST, request.FILES)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
obj = form.save(commit=False)
|
||||||
|
obj.course = course
|
||||||
|
obj.save()
|
||||||
|
|
||||||
messages.success(
|
messages.success(
|
||||||
request, (request.POST.get("title") + " has been uploaded.")
|
request, (request.POST.get("title") + " has been uploaded.")
|
||||||
)
|
)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -135,8 +135,6 @@ body {
|
|||||||
z-index: 90;
|
z-index: 90;
|
||||||
/*padding: 0.4rem 1rem;*/
|
/*padding: 0.4rem 1rem;*/
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
-webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1);
|
|
||||||
-moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1);
|
|
||||||
box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1);
|
box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1);
|
||||||
transition: 0.3s;
|
transition: 0.3s;
|
||||||
|
|
||||||
@ -213,12 +211,7 @@ body {
|
|||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
color: #666;
|
color: #666;
|
||||||
padding: 0 17px;
|
padding: 0 17px;
|
||||||
-webkit-border-radius: 3px;
|
|
||||||
-moz-border-radius: 3px;
|
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
-webkit-transition: all 0.2s ease;
|
|
||||||
-o-transition: all 0.2s ease;
|
|
||||||
-moz-transition: all 0.2s ease;
|
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
}
|
}
|
||||||
.au-input:focus {
|
.au-input:focus {
|
||||||
|
|||||||
@ -41,21 +41,9 @@
|
|||||||
<div class="title-1">{{ course }}</div>
|
<div class="title-1">{{ course }}</div>
|
||||||
<p class="small text-muted">{{ course.summary }}</p>
|
<p class="small text-muted">{{ course.summary }}</p>
|
||||||
|
|
||||||
<div class="container">
|
{% include 'snippets/messages.html' %}
|
||||||
|
|
||||||
{% if messages %}
|
<div class="container">
|
||||||
{% for message in messages %}
|
|
||||||
{% if message.tags == 'error' %}
|
|
||||||
<div class="alert alert-danger">
|
|
||||||
<i class="fas fa-exclamation-circle"></i>{{ message }}
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="alert alert-success">
|
|
||||||
<i class="fas fa-check-circle"></i>{{ message }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row mb-5">
|
<div class="row mb-5">
|
||||||
<div class="col-md-12 p-0">
|
<div class="col-md-12 p-0">
|
||||||
@ -77,9 +65,9 @@
|
|||||||
{% for video in videos %}
|
{% for video in videos %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ forloop.counter }}</td>
|
<td>{{ forloop.counter }}</td>
|
||||||
<td><a href="{{ video.get_absolute_url }}" title="{{ video }}">
|
<td>
|
||||||
<i style="font-size: 20px; padding-right: 10px;" class="fas fa-video"></i>
|
<a href="{{ video.get_absolute_url }}" title="{{ video }}" class="d-flex align-items-center">
|
||||||
{{ video.title|title }}
|
<i class="fas fa-video me-1"></i> {{ video.title|title }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>{{ video.timestamp|date }}</td>
|
<td>{{ video.timestamp|date }}</td>
|
||||||
@ -87,7 +75,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<a class="download-btn" href="{{ video.get_absolute_url }}"
|
<a class="download-btn" href="{{ video.get_absolute_url }}"
|
||||||
title="Download to your device">
|
title="Download to your device">
|
||||||
<i class="fas fa-download"></i>Get Started</a>
|
<i class="fas fa-play me-1"></i>Play now</a>
|
||||||
</div>
|
</div>
|
||||||
</th>
|
</th>
|
||||||
|
|
||||||
@ -154,9 +142,8 @@
|
|||||||
{% for file in files %}
|
{% for file in files %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ forloop.counter }}</td>
|
<td>{{ forloop.counter }}</td>
|
||||||
<td><a href="{{ file.file.url }}" title="{{ file }}">
|
<td><a href="{{ file.file.url }}" title="{{ file }}" class="d-flex align-items-center">
|
||||||
<i style="font-size: 20px; padding-right: 10px;"
|
<i class="fas fa-file-{{ file.get_extension_short }} me-1"></i>
|
||||||
class="fas fa-file-{{ file.get_extension_short }}"></i>
|
|
||||||
{{ file.title|title }}
|
{{ file.title|title }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
@ -165,7 +152,7 @@
|
|||||||
<th>
|
<th>
|
||||||
<div>
|
<div>
|
||||||
<a class="download-btn" href="{{ file.file.url }}" title="Download to your device">
|
<a class="download-btn" href="{{ file.file.url }}" title="Download to your device">
|
||||||
<i class="fas fa-download"></i>Download</a>
|
<i class="fas fa-download me-1"></i>Download</a>
|
||||||
</div>
|
</div>
|
||||||
</th>
|
</th>
|
||||||
|
|
||||||
|
|||||||
@ -14,54 +14,27 @@
|
|||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<p class="title-1">File upload for {{ course }}</p>
|
<p class="title-1">File upload for {{ course|truncatechars:25 }}</p>
|
||||||
<div class="title-line"></div><br>
|
<br><br>
|
||||||
|
|
||||||
{% if messages %}
|
{% include 'snippets/messages.html' %}
|
||||||
{% for message in messages %}
|
|
||||||
{% if message.tags == 'error' %}
|
|
||||||
<div class="alert alert-danger">
|
|
||||||
<i class="fas fa-exclamation-circle"></i>{{ message }}
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="alert alert-success">
|
|
||||||
<i class="fas fa-check-circle"></i>{{ message }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-8 p-0 mx-auto">
|
<div class="col-md-8 p-0 mx-auto">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<p class="form-title">File Upload Form</p><br>
|
<p class="form-title">File Upload Form</p>
|
||||||
<form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
|
|
||||||
<div class="container">
|
<div class="card-body">
|
||||||
|
<form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
|
||||||
|
{{ form|crispy }}
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<b>File Name</b>{{ form.title }}
|
|
||||||
<span class="danger">{{ form.title.errors }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<b>File</b><br>{{ form.file }}
|
|
||||||
<span class="danger">{{ form.file.errors }}</span>
|
|
||||||
</div>
|
|
||||||
<p class="text-orange"><b>Valid Files: </b>pdf, docx, doc, xls, xlsx, ppt, pptx, zip, rar, 7zip</p>
|
|
||||||
<div class="form-group">
|
|
||||||
<select hidden name="course" required="" id="id_course">
|
|
||||||
<option value="{{ course.pk }}" selected>{{ course }}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<button class="btn btn-primary" type="submit">Upload</button>
|
<button class="btn btn-primary" type="submit">Upload</button>
|
||||||
<a class="btn btn-danger" href="{% url 'course_detail' course.slug %}" style="float: right;">Cancel</a>
|
<a class="btn btn-danger" href="{% url 'course_detail' course.slug %}" style="float: right;">Cancel</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<div class="card">
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@ -14,53 +14,25 @@
|
|||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<p class="title-1">Video upload for {{ course }}</p>
|
<p class="title-1">Video upload for {{ course|truncatechars:25 }}</p>
|
||||||
<div class="title-line"></div><br>
|
<div class="title-line"></div><br>
|
||||||
|
|
||||||
{% if messages %}
|
{% include 'snippets/messages.html' %}
|
||||||
{% for message in messages %}
|
|
||||||
{% if message.tags == 'error' %}
|
|
||||||
<div class="alert alert-danger">
|
|
||||||
<i class="fas fa-exclamation-circle"></i>{{ message }}
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="alert alert-success">
|
|
||||||
<i class="fas fa-check-circle"></i>{{ message }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-8 p-0 mx-auto">
|
<div class="col-md-8 mx-auto">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<p class="form-title">Video Upload Form</p><br>
|
<p class="form-title">Video Upload Form</p>
|
||||||
|
<div class="card-body">
|
||||||
<form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
|
<form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
|
||||||
<div class="container">
|
{{ form|crispy }}
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<b>Video Name</b>{{ form.title }}
|
|
||||||
<span class="danger">{{ form.title.errors }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<b>Video</b><br>{{ form.video }}
|
|
||||||
<span class="danger">{{ form.video.errors }}</span>
|
|
||||||
</div>
|
|
||||||
<p class="text-orange"><b>Valid video formats: </b>'mp4', 'mkv', 'wmv', '3gp', 'f4v', 'avi', 'mp3'</p>
|
|
||||||
<div class="form-group">
|
|
||||||
<select hidden name="course" required="" id="id_course">
|
|
||||||
<option value="{{ course.pk }}" selected>{{ course }}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<button class="btn btn-primary" type="submit">Upload</button>
|
<button class="btn btn-primary" type="submit">Upload</button>
|
||||||
<a class="btn btn-danger" href="{% url 'course_detail' course.slug %}" style="float: right;">Cancel</a>
|
<a class="btn btn-danger" href="{% url 'course_detail' course.slug %}" style="float: right;">Cancel</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<div class="card">
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -15,9 +15,7 @@
|
|||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<p class="title-1">{{ video.title }}</p>
|
<p class="title-1">{{ video.title }}</p>
|
||||||
<div class="title-line"></div><br>
|
<br><br>
|
||||||
|
|
||||||
<p class="text-orange text-center">Video tutorial for course {{ video.course }}</p>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
video{
|
video{
|
||||||
@ -28,10 +26,13 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="col-md-10 mx-auto d-block">
|
<div class="col-md-10 mx-auto d-block">
|
||||||
<p><i class="fas fa-calendar"></i> {{ video.timestamp|timesince }} ago</p>
|
|
||||||
<div class=""><video src="{{ video.video.url }}" controls ></video></div>
|
<div class=""><video src="{{ video.video.url }}" controls ></video></div>
|
||||||
|
<p><i class="fas fa-calendar"></i> {{ video.timestamp|timesince }} ago</p>
|
||||||
|
{% if video.summary %}
|
||||||
|
<p class="text-orange text-center">{{ video.summary }}</p>
|
||||||
|
{% else %}
|
||||||
|
No video description set.
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="text-orange text-center">{{ video.summary }}</p>
|
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user