Merge branch 'feature-videoitem' into 'develop'

Complete infoscreen video support

See merge request !26
This commit is contained in:
Jan Tuomi
2017-05-24 18:16:50 +03:00
9 changed files with 132 additions and 0 deletions
+2
View File
@@ -2,6 +2,7 @@ from django.contrib import admin
from infoscreen.models import Rotation, InfoItem, InfoInstance
from infoscreen.models import ImageInfoItem, ExternalImageInfoItem, ABBInfoItem
from infoscreen.models import ExternalWebsiteInfoItem
from infoscreen.models import VideoInfoItem
# Register your models here.
admin.site.register(Rotation)
@@ -11,3 +12,4 @@ admin.site.register(ExternalImageInfoItem)
admin.site.register(ABBInfoItem)
admin.site.register(InfoInstance)
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',),
),
]
+23
View File
@@ -183,6 +183,23 @@ class ImageInfoItem(InfoItem):
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")
@@ -307,5 +324,11 @@ class ImageUploadForm(forms.Form):
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 = {}
+3
View File
@@ -12,6 +12,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
@@ -37,6 +38,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),
@@ -48,4 +50,5 @@ urlpatterns = [
url(r'^hsl_data$', CurrentHSLView),
url(r'^hsl_data/settings$', hsl_timetable_settings),
url(r'^apyjson', get_apy_json),
]
+20
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
import sikweb.settings as settings
import json
@@ -18,6 +19,7 @@ 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
@@ -158,6 +160,23 @@ def create_image_item(request, *args, **kwargs):
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
@permission_required('infoscreen.add_rotation', login_url='/login')
@@ -226,3 +245,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)