Complete infoscreen video support

Closes issues #5 #7
This commit is contained in:
Joel Lavikainen
2017-05-24 16:44:59 +03:00
parent 7e2cf03ced
commit bec498bfee
10 changed files with 141 additions and 1 deletions
+3 -1
View File
@@ -1,6 +1,7 @@
from django.contrib import admin
from infoscreen.models import Rotation, InfoItem, InfoInstance, ImageInfoItem, ExternalImageInfoItem, ABBInfoItem
from infoscreen.models import ExternalWebsiteInfoItem
from infoscreen.models import VideoInfoItem
# Register your models here.
admin.site.register(Rotation)
@@ -9,4 +10,5 @@ admin.site.register(ImageInfoItem)
admin.site.register(ExternalImageInfoItem)
admin.site.register(ABBInfoItem)
admin.site.register(InfoInstance)
admin.site.register(ExternalWebsiteInfoItem)
admin.site.register(ExternalWebsiteInfoItem)
admin.site.register(VideoInfoItem)
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2017-05-10 16:54
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('infoscreen', '0003_auto_20170329_1857'),
]
operations = [
migrations.CreateModel(
name='VideoInfoItem',
fields=[
('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')),
('video', models.FileField(upload_to='infovideos/')),
],
bases=('infoscreen.infoitem',),
),
]
+20
View File
@@ -175,6 +175,21 @@ class ImageInfoItem(InfoItem):
d["options"] = {'img': self.img.url}
return d
class VideoInfoItem(InfoItem):
display_name = ("Video")
video = models.FileField(upload_to="infovideos/")
def get_template_url(self):
return "/static/html/generic_video.html?video={}".format(self.name)
@staticmethod
def get_create_template_url():
return "/static/html/generic_video_create.html"
def get_dict(self):
d = super().get_dict()
d["options"] = {'video': self.video.url}
return d
class HslInfoItem(InfoItem):
display_name = _("HSL timetables")
@@ -298,6 +313,11 @@ class ImageUploadForm(forms.Form):
name = forms.CharField()
image = forms.ImageField()
class UploadFileForm(forms.Form):
name = forms.CharField()
video = forms.FileField()
class HSLDataModel(models.Model):
data = models.TextField(default="", editable=False)
+17
View File
@@ -0,0 +1,17 @@
.fullscreen-bg {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
overflow: hidden;
z-index: -100;
}
.fullscreen-bg__video {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
@@ -0,0 +1,9 @@
<link rel="stylesheet" href="/static/css/video.css">
<div class="fullscreen-bg">
<video autoplay loop class="fullscreen-bg__video">
<source ng-src="{{ video }}" type=video/webm>
Your browser doesn't support WebM videos!
</video>
</div>
@@ -0,0 +1,13 @@
<div ng-controller="infoadmin_video_create" style="margin-top:20px;">
<div>
Create new video. Enter name and select video (.WebM) for upload
</div>
<div class="form-group">
<label>Name:</label>
<input type="text" ng-model="name"></input>
</div>
<div class="form-group">
<input type="file" ngf-select ng-model="video" name="file" required>
</div>
<input type="button" class="btn btn-success" ng-click="send(video);" value="create"></input>
</div>
@@ -145,6 +145,27 @@ app.controller('infoadmin_image_create', ['$scope', 'Upload', '$timeout',"ItemLi
}
}]);
app.controller('infoadmin_video_create', ['$scope', 'Upload', '$timeout',"ItemList", function ($scope, Upload, $timeout,ItemList) {
$scope.send = function(file) {
file.upload = Upload.upload({
url: '/infoscreen/create_video',
data: {name: $scope.name, video: file},
}).then(function (response) {
$timeout(function () {
file.result = response.data;
ItemList.loadItems();
$scope.name= ""
$scope.video = {}
});
},function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
}, function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
}]);
function itemGenerator(create_url){
return function($scope, $http, ItemList){
$scope.item = {}
+2
View File
@@ -13,6 +13,7 @@ from infoscreen.views import createInstance
from infoscreen.views import deleteInstance
from infoscreen.views import createExternalImageInfoItem
from infoscreen.views import create_image_item
from infoscreen.views import create_video_item
from infoscreen.views import createABBItem
from infoscreen.views import createSossoItem
from infoscreen.views import createHslItem
@@ -39,6 +40,7 @@ urlpatterns = [
url(r'^delete_item/(?P<type_id>\d+)/(?P<idx>\d+)$', delete_info_item),
url(r'^create_external_image$', createExternalImageInfoItem),
url(r'^create_image$', create_image_item),
url(r'^create_video$', create_video_item),
url(r'^create_abbitem$', createABBItem),
url(r'^create_sossoitem$', createSossoItem),
url(r'^create_eventitem$', createEventItem),
+19
View File
@@ -4,6 +4,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.decorators.http import require_http_methods
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import permission_required
from infoscreen.models import UploadFileForm
from infoscreen.models import Rotation, InfoItem, InfoInstance
from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem, HslInfoItem
@@ -12,7 +13,9 @@ from infoscreen.models import ExternalWebsiteInfoItem
from infoscreen.models import ImageUploadForm
from infoscreen.models import HSLDataModel
from infoscreen.models import ApyInfoItem
from infoscreen.models import VideoInfoItem
from infoscreen.hsl_fetcher import HSLFetcher
import sikweb.settings as settings
import json
import logging
@@ -155,6 +158,21 @@ def create_image_item(request, *args, **kwargs):
ImageInfoItem.objects.create(img=img, name=name)
return HttpResponse('{"status":"success"}')
@require_http_methods(["POST"])
@ensure_csrf_cookie
@permission_required('infoscreen.change_infoinstance', login_url='/login')
def create_video_item(request, *args, **kwargs):
form = UploadFileForm(request.POST, request.FILES)
print(form.errors)
print("hurdurr")
if not form.is_valid():
return HttpResponseBadRequest('{"status": "failure",'
'"error": "invalid data supplied"}')
video = form.cleaned_data['video']
name = form.cleaned_data['name']
VideoInfoItem.objects.create(video=video, name=name)
return HttpResponse('{"status": "success"}')
@require_http_methods(["POST"])
@ensure_csrf_cookie
@@ -223,3 +241,4 @@ createExternalImageInfoItem = create_item_generator(ExternalImageInfoItem)
createExternalWebsiteItem = create_item_generator(ExternalWebsiteInfoItem)
createEventItem = create_item_generator(EventInfoItem)
createApyItem = create_item_generator(ApyInfoItem)
createVideoItem = create_item_generator(VideoInfoItem)
+13
View File
@@ -26,6 +26,19 @@ import webapp.urls
import infoscreen.urls
import members.urls
# main
from webapp.views import main_index
from webapp.views import admin_index
# login
from webapp.views import login_view
from webapp.views import logout_view
#application
from members.views import application_index
from members.views import list_applications
from members.views import edit_application
from members.views import application_success_index
urlpatterns = [
url(r'', include('webapp.urls')),