diff --git a/infoscreen/admin.py b/infoscreen/admin.py
index 1d51a3a..b4f9217 100644
--- a/infoscreen/admin.py
+++ b/infoscreen/admin.py
@@ -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)
diff --git a/infoscreen/migrations/0004_videoinfoitem.py b/infoscreen/migrations/0004_videoinfoitem.py
new file mode 100644
index 0000000..fe2f99e
--- /dev/null
+++ b/infoscreen/migrations/0004_videoinfoitem.py
@@ -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',),
+ ),
+ ]
diff --git a/infoscreen/models.py b/infoscreen/models.py
index 1c9ec0c..def1096 100644
--- a/infoscreen/models.py
+++ b/infoscreen/models.py
@@ -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)
diff --git a/infoscreen/static/css/video.css b/infoscreen/static/css/video.css
new file mode 100644
index 0000000..ddf6269
--- /dev/null
+++ b/infoscreen/static/css/video.css
@@ -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%;
+}
\ No newline at end of file
diff --git a/infoscreen/static/html/generic_video.html b/infoscreen/static/html/generic_video.html
new file mode 100644
index 0000000..e0274af
--- /dev/null
+++ b/infoscreen/static/html/generic_video.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+ Your browser doesn't support WebM videos!
+
+
\ No newline at end of file
diff --git a/infoscreen/static/html/generic_video_create.html b/infoscreen/static/html/generic_video_create.html
new file mode 100644
index 0000000..c6b0ef6
--- /dev/null
+++ b/infoscreen/static/html/generic_video_create.html
@@ -0,0 +1,13 @@
+
diff --git a/infoscreen/static/js/infoadmin_controllers.js b/infoscreen/static/js/infoadmin_controllers.js
index 222f493..c9fa019 100644
--- a/infoscreen/static/js/infoadmin_controllers.js
+++ b/infoscreen/static/js/infoadmin_controllers.js
@@ -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 = {}
diff --git a/infoscreen/urls.py b/infoscreen/urls.py
index c31d6ab..1548bde 100644
--- a/infoscreen/urls.py
+++ b/infoscreen/urls.py
@@ -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\d+)/(?P\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),
+
]
diff --git a/infoscreen/views.py b/infoscreen/views.py
index 6585408..055cee6 100644
--- a/infoscreen/views.py
+++ b/infoscreen/views.py
@@ -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)