Few UI adjustments

This commit is contained in:
papi 2024-01-16 23:15:44 +03:00
parent 10c1f7aed3
commit c96a56f6c9
10 changed files with 79 additions and 124 deletions

View File

@ -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):

View File

@ -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'])]),
),
]

View File

@ -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"])
], ],

View File

@ -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

View File

@ -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 {

View File

@ -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>

View File

@ -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 %}

View File

@ -14,54 +14,26 @@
</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>
{% endblock content %} {% endblock content %}

View File

@ -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 %}