diff --git a/infoscreen/admin.py b/infoscreen/admin.py index ac777b3..65f2749 100644 --- a/infoscreen/admin.py +++ b/infoscreen/admin.py @@ -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) \ No newline at end of file +admin.site.register(ExternalWebsiteInfoItem) +admin.site.register(VideoInfoItem) \ No newline at end of file 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 04859f6..c1be742 100644 --- a/infoscreen/models.py +++ b/infoscreen/models.py @@ -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) 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 @@ + + + +
+ +
\ 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 @@ +
+
+ Create new video. Enter name and select video (.WebM) for upload +
+
+ + +
+
+ +
+ +
diff --git a/infoscreen/static/js/infoadmin_controllers.js b/infoscreen/static/js/infoadmin_controllers.js index 512bd6e..6013d16 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 d736bd6..5841531 100644 --- a/infoscreen/urls.py +++ b/infoscreen/urls.py @@ -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\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), diff --git a/infoscreen/views.py b/infoscreen/views.py index 63dd084..d447898 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 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) diff --git a/sikweb/urls.py b/sikweb/urls.py index b112e52..a35b8fc 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -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')),