Commit 6d59a8ddad58e0b2bad57fac3300fd5ceddb619e

Authored by Zambom
1 parent 22a78c58

Adding ytvideo video and adjusting it's crud

amadeus/static/js/ytvideo.js 0 → 100644
... ... @@ -0,0 +1,38 @@
  1 +// Load the IFrame Player API code asynchronously.
  2 +var tag = document.createElement('script');
  3 +tag.src = "https://www.youtube.com/player_api";
  4 +var firstScriptTag = document.getElementsByTagName('script')[0];
  5 +firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
  6 +
  7 + // Replace the 'ytplayer' element with an <iframe> and
  8 + // YouTube player after the API code downloads.
  9 +var player;
  10 +function onYouTubePlayerAPIReady() {
  11 + player = new YT.Player('video');
  12 +
  13 + player.addEventListener("onStateChange", "onPlayerStateChange");
  14 +
  15 +}
  16 +
  17 +function onPlayerStateChange(event) {
  18 + switch (event.data) {
  19 + case YT.PlayerState.UNSTARTED:
  20 + console.log('unstarted');
  21 + break;
  22 + case YT.PlayerState.ENDED:
  23 + console.log('ended');
  24 + break;
  25 + case YT.PlayerState.PLAYING:
  26 + console.log('playing');
  27 + break;
  28 + case YT.PlayerState.PAUSED:
  29 + console.log('paused');
  30 + break;
  31 + case YT.PlayerState.BUFFERING:
  32 + console.log('buffering');
  33 + break;
  34 + case YT.PlayerState.CUED:
  35 + console.log('video cued');
  36 + break;
  37 + }
  38 +}
0 39 \ No newline at end of file
... ...
file_link/models.py
... ... @@ -43,3 +43,6 @@ class FileLink(Resource):
43 43  
44 44 def delete_link(self):
45 45 return 'file_links:delete'
  46 +
  47 + def delete_message(self):
  48 + return _('Are you sure you want delete the file link')
... ...
file_link/templates/file_links/delete.html
... ... @@ -1,22 +0,0 @@
1   -{% load i18n %}
2   -
3   -<div class="modal fade" id="topic" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
4   - <div class="modal-dialog" role="document">
5   - <div class="modal-content">
6   - <div class="modal-body">
7   - <form id="delete_form" action="{% url 'file_links:delete' file_link.slug %}" method="post">
8   - {% csrf_token %}
9   - <h4>{% trans 'Are you sure you want delete the file link' %}: {{ file_link }}?</h4>
10   - </form>
11   - </div>
12   - <div class="modal-footer">
13   - <div class="pull-right">
14   - <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button>
15   - </div>
16   - <div class="pull-left">
17   - <button type="submit" form="delete_form" class="btn btn-success btn-raised">{% trans "Delete" %}</button>
18   - </div>
19   - </div>
20   - </div>
21   - </div>
22   -</div>
23 0 \ No newline at end of file
file_link/views.py
... ... @@ -312,9 +312,9 @@ class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView):
312 312 login_url = reverse_lazy("users:login")
313 313 redirect_field_name = 'next'
314 314  
315   - template_name = 'file_links/delete.html'
  315 + template_name = 'resources/delete.html'
316 316 model = FileLink
317   - context_object_name = 'file_link'
  317 + context_object_name = 'resource'
318 318  
319 319 def dispatch(self, request, *args, **kwargs):
320 320 slug = self.kwargs.get('slug', '')
... ...
webpage/models.py
... ... @@ -24,3 +24,6 @@ class Webpage(Resource):
24 24  
25 25 def delete_link(self):
26 26 return 'webpages:delete'
  27 +
  28 + def delete_message(self):
  29 + return _('Are you sure you want delete the webpage')
... ...
webpage/templates/webpages/delete.html
... ... @@ -1,22 +0,0 @@
1   -{% load i18n %}
2   -
3   -<div class="modal fade" id="topic" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
4   - <div class="modal-dialog" role="document">
5   - <div class="modal-content">
6   - <div class="modal-body">
7   - <form id="delete_form" action="{% url 'webpages:delete' webpage.slug %}" method="post">
8   - {% csrf_token %}
9   - <h4>{% trans 'Are you sure you want delete the webpage' %}: {{ webpage }}?</h4>
10   - </form>
11   - </div>
12   - <div class="modal-footer">
13   - <div class="pull-right">
14   - <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button>
15   - </div>
16   - <div class="pull-left">
17   - <button type="submit" form="delete_form" class="btn btn-success btn-raised">{% trans "Delete" %}</button>
18   - </div>
19   - </div>
20   - </div>
21   - </div>
22   -</div>
23 0 \ No newline at end of file
webpage/views.py
... ... @@ -371,9 +371,9 @@ class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView):
371 371 login_url = reverse_lazy("users:login")
372 372 redirect_field_name = 'next'
373 373  
374   - template_name = 'webpages/delete.html'
  374 + template_name = 'resources/delete.html'
375 375 model = Webpage
376   - context_object_name = 'webpage'
  376 + context_object_name = 'resource'
377 377  
378 378 def dispatch(self, request, *args, **kwargs):
379 379 slug = self.kwargs.get('slug', '')
... ...
youtube_video/forms.py
... ... @@ -60,6 +60,16 @@ class YTVideoForm(forms.ModelForm):
60 60  
61 61 return name
62 62  
  63 + def clean_url(self):
  64 + url = self.cleaned_data.get('url', '')
  65 +
  66 + if not 'youtube' in url or not 'embed' in url:
  67 + self._errors['url'] = [_('Invalid URL. It should be an embed YouTube link.')]
  68 +
  69 + return ValueError
  70 +
  71 + return url
  72 +
63 73 def save(self, commit = True):
64 74 super(YTVideoForm, self).save(commit = True)
65 75  
... ... @@ -89,4 +99,4 @@ class YTVideoForm(forms.ModelForm):
89 99  
90 100 return self.instance
91 101  
92   -InlinePendenciesFormset = inlineformset_factory(YTVideo, Pendencies, form = PendenciesForm, extra = 1, max_num = 2, validate_max = True, can_delete = True)
93 102 \ No newline at end of file
  103 +InlinePendenciesFormset = inlineformset_factory(YTVideo, Pendencies, form = PendenciesForm, extra = 1, max_num = 3, validate_max = True, can_delete = True)
94 104 \ No newline at end of file
... ...
youtube_video/models.py
... ... @@ -15,12 +15,15 @@ class YTVideo(Resource):
15 15  
16 16 def access_link(self):
17 17 if self.show_window:
18   - return 'webpages:window_view'
  18 + return 'youtube:window_view'
19 19  
20   - return 'webpages:view'
  20 + return 'youtube:view'
21 21  
22 22 def update_link(self):
23 23 return 'youtube:update'
24 24  
25 25 def delete_link(self):
26 26 return 'webpages:delete'
  27 +
  28 + def delete_message(self):
  29 + return _('Are you sure you want delete the YouTube Video')
... ...
youtube_video/templates/youtube/_form.html
... ... @@ -239,7 +239,7 @@
239 239 {% endif %}
240 240 </div>
241 241  
242   - <p><em>{% trans 'Attribute students to webpage' %}:</em></p>
  242 + <p><em>{% trans 'Attribute students to YouTube Video' %}:</em></p>
243 243 {% render_field form.students class='form-control' %}
244 244  
245 245 <span id="helpBlock" class="help-block">{{ form.students.help_text }}</span>
... ... @@ -259,7 +259,7 @@
259 259  
260 260 <br clear="all" />
261 261  
262   - <p><em>{% trans 'Attribute groups to webpage' %}:</em></p>
  262 + <p><em>{% trans 'Attribute groups to YouTube Video' %}:</em></p>
263 263 {% render_field form.groups class='form-control' %}
264 264  
265 265 <span id="helpBlock" class="help-block">{{ form.groups.help_text }}</span>
... ... @@ -354,23 +354,33 @@
354 354 var checkbox = $(this).parent().parent().find('.end_date');
355 355 $(checkbox).prop('checked', true);
356 356 });
357   - subject = $("#id_control_subject").val();
358   - console.log(subject);
359   - console.log($(row).find('.pend_subj'));
  357 +
  358 + var subject = $("#id_control_subject").val();
  359 +
360 360 $(row).find('.pend_subj').val(subject);
361 361 }
362 362 });
363 363  
364   - var begin_val = $('.begin_date_input').val(),
365   - end_val = $('.end_date_input').val();
  364 + $('.begin_date_input').each(function () {
  365 + console.log($(this).val());
  366 + if ($(this).val() != '') {
  367 + $(this).parent().parent().find('.begin_date').prop('checked', true);
  368 + } else {
  369 + $(this).parent().parent().find('.begin_date').prop('checked', false);
  370 + }
  371 + });
  372 +
  373 + $('.end_date_input').each(function () {
  374 + if ($(this).val() != '') {
  375 + $(this).parent().parent().find('.end_date').prop('checked', true);
  376 + } else {
  377 + $(this).parent().parent().find('.end_date').prop('checked', false);
  378 + }
  379 + });
366 380  
367   - if (begin_val != '') {
368   - $(".begin_date").prop('checked', true);
369   - }
  381 + var subject = $("#id_control_subject").val();
370 382  
371   - if (end_val != '') {
372   - $(".end_date").prop('checked', true);
373   - }
  383 + $('.pend_subj').val(subject);
374 384  
375 385 {% if not pendencies_form.is_valid and pendencies_form.is_bound %}
376 386 $("#notifications").collapse('toggle');
... ...
youtube_video/templates/youtube/view.html 0 → 100644
... ... @@ -0,0 +1,65 @@
  1 +{% extends 'subjects/view.html' %}
  2 +
  3 +{% load static i18n pagination permissions_tags %}
  4 +{% load django_bootstrap_breadcrumbs %}
  5 +
  6 +{% block javascript%}
  7 + {{ block.super }}
  8 +{% endblock%}
  9 +
  10 +{% block breadcrumbs %}
  11 + {{ block.super }}
  12 + {% breadcrumb topic 'subjects:topic_view' subject.slug topic.slug %}
  13 + {% breadcrumb youtube 'youtube:view' youtube.slug %}
  14 +{% endblock %}
  15 +
  16 +{% block content %}
  17 + {% if messages %}
  18 + {% for message in messages %}
  19 + <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">
  20 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  21 + <span aria-hidden="true">&times;</span>
  22 + </button>
  23 + <p>{{ message }}</p>
  24 + </div>
  25 + {% endfor %}
  26 + {% endif %}
  27 +
  28 + {% subject_permissions request.user subject as has_subject_permissions %}
  29 +
  30 + {% if subject.visible %}
  31 + <div class="panel panel-info topic-panel" style="margin-bottom: 0px;">
  32 + <div class="panel-heading">
  33 + {% elif has_subject_permissions %}
  34 + <div class="panel panel-info topic-panel-invisible" style="margin-bottom: 0px;">
  35 + <div class="panel-heading panel-invisible">
  36 + {% endif %}
  37 + <div class="row">
  38 + <div class="col-md-12 category-header">
  39 + <h4 class="panel-title" style="margin-top: 10px; margin-bottom: 8px">
  40 + <span>{{ youtube }}</span>
  41 + </h4>
  42 +
  43 + <div class="col-md-5 pull-right category-card-items">
  44 + <a href=""><i class="fa fa-list" aria-hidden="true"></i></a>
  45 + </div>
  46 + </div>
  47 + </div>
  48 + </div>
  49 + <div id="{{subject.slug}}" class="panel-collapse in collapse category-panel-content" style="padding: 0px; overflow: hidden;">
  50 + <iframe src="{{ youtube.url }}?enablejsapi=1" frameborder="0" allowfullscreen id="video"></iframe>
  51 + </div>
  52 + </div>
  53 +
  54 + <script type="text/javascript" src="{% static 'js/ytvideo.js' %}"></script>
  55 + <script type="text/javascript">
  56 + $(function(){
  57 + $('#video').css({ width: $("#{{subject.slug}}").innerWidth() + 'px', height: ($(window).innerHeight() - $("#{{subject.slug}}").offset().top) + 'px' });
  58 +
  59 + // If you want to keep full screen on window resize
  60 + $(window).resize(function(){
  61 + $('#video').css({ width: $("#{{subject.slug}}").innerWidth() + 'px', height: ($(window).innerHeight() - $("#{{subject.slug}}").offset().top) + 'px' });
  62 + });
  63 + });
  64 + </script>
  65 +{% endblock %}
... ...
youtube_video/templates/youtube/window_view.html 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +<!DOCTYPE html>
  2 +
  3 +{% load static i18n %}
  4 +
  5 +<html>
  6 +<head>
  7 + <title>{{ title }} | {{ theme.title }}</title>
  8 +
  9 + <script type="text/javascript" src="{% static 'js/jquery-3.1.0.min.js' %}"></script>
  10 +
  11 + <meta http-equiv="Cache-Control" content="no-cache, no-store" />
  12 + <link href="{{ theme.favicon_url }}" rel="shortcut icon" />
  13 +
  14 + <style type="text/css">
  15 + body {
  16 + padding: 0;
  17 + margin: 0;
  18 + overflow: hidden;
  19 + }
  20 + </style>
  21 +</head>
  22 +<body>
  23 + <iframe src="{{ youtube.url }}?enablejsapi=1" frameborder="0" allowfullscreen id="video"></iframe>
  24 +
  25 + <script type="text/javascript" src="{% static 'js/ytvideo.js' %}"></script>
  26 + <script type="text/javascript">
  27 + $(function(){
  28 + $('#video').css({ width: $(window).innerWidth() + 'px', height: $(window).innerHeight() + 'px' });
  29 +
  30 + // If you want to keep full screen on window resize
  31 + $(window).resize(function(){
  32 + $('#video').css({ width: $(window).innerWidth() + 'px', height: $(window).innerHeight() + 'px' });
  33 + });
  34 + });
  35 + </script>
  36 +</body>
  37 +</html>
0 38 \ No newline at end of file
... ...
youtube_video/urls.py
... ... @@ -6,4 +6,6 @@ from . import views
6 6 urlpatterns = [
7 7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'),
8 8 url(r'^update/(?P<topic_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'),
  9 + url(r'^window_view/(?P<slug>[\w_-]+)/$', views.NewWindowView.as_view(), name = 'window_view'),
  10 + url(r'^view/(?P<slug>[\w_-]+)/$', views.InsideView.as_view(), name = 'view'),
9 11 ]
... ...
youtube_video/views.py
... ... @@ -12,6 +12,57 @@ from topics.models import Topic
12 12 from .forms import YTVideoForm, InlinePendenciesFormset
13 13 from .models import YTVideo
14 14  
  15 +class NewWindowView(LoginRequiredMixin, generic.DetailView):
  16 + login_url = reverse_lazy("users:login")
  17 + redirect_field_name = 'next'
  18 +
  19 + template_name = 'youtube/window_view.html'
  20 + model = YTVideo
  21 + context_object_name = 'youtube'
  22 +
  23 + def dispatch(self, request, *args, **kwargs):
  24 + slug = self.kwargs.get('slug', '')
  25 + youtube = get_object_or_404(YTVideo, slug = slug)
  26 +
  27 + if not has_resource_permissions(request.user, youtube):
  28 + return redirect(reverse_lazy('subjects:home'))
  29 +
  30 + return super(NewWindowView, self).dispatch(request, *args, **kwargs)
  31 +
  32 + def get_context_data(self, **kwargs):
  33 + context = super(NewWindowView, self).get_context_data(**kwargs)
  34 +
  35 + context['title'] = _("%s - Video")%(self.object.name)
  36 +
  37 + return context
  38 +
  39 +class InsideView(LoginRequiredMixin, generic.DetailView):
  40 + login_url = reverse_lazy("users:login")
  41 + redirect_field_name = 'next'
  42 +
  43 + template_name = 'youtube/view.html'
  44 + model = YTVideo
  45 + context_object_name = 'youtube'
  46 +
  47 + def dispatch(self, request, *args, **kwargs):
  48 + slug = self.kwargs.get('slug', '')
  49 + youtube = get_object_or_404(YTVideo, slug = slug)
  50 +
  51 + if not has_resource_permissions(request.user, youtube):
  52 + return redirect(reverse_lazy('subjects:home'))
  53 +
  54 + return super(InsideView, self).dispatch(request, *args, **kwargs)
  55 +
  56 + def get_context_data(self, **kwargs):
  57 + context = super(InsideView, self).get_context_data(**kwargs)
  58 +
  59 + context['title'] = self.object.name
  60 +
  61 + context['topic'] = self.object.topic
  62 + context['subject'] = self.object.topic.subject
  63 +
  64 + return context
  65 +
15 66 class CreateView(LoginRequiredMixin, generic.edit.CreateView):
16 67 login_url = reverse_lazy("users:login")
17 68 redirect_field_name = 'next'
... ... @@ -68,6 +119,9 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
68 119 return initial
69 120  
70 121 def form_invalid(self, form, pendencies_form):
  122 + for p_form in pendencies_form.forms:
  123 + p_form.fields['action'].choices = [("", "-------"),("view", _("Visualize")), ("finish", _("Finish"))]
  124 +
71 125 return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
72 126  
73 127 def form_valid(self, form, pendencies_form):
... ... @@ -111,14 +165,14 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
111 165 def get_success_url(self):
112 166 messages.success(self.request, _('The Youtube Video "%s" was added to the Topic "%s" of the virtual environment "%s" successfully!')%(self.object.name, self.object.topic.name, self.object.topic.subject.name))
113 167  
114   - #success_url = reverse_lazy('webpages:view', kwargs = {'slug': self.object.slug})
  168 + success_url = reverse_lazy('youtube:view', kwargs = {'slug': self.object.slug})
115 169  
116   - #if self.object.show_window:
117   - # self.request.session['resources'] = {}
118   - # self.request.session['resources']['new_page'] = True
119   - # self.request.session['resources']['new_page_url'] = reverse('webpages:window_view', kwargs = {'slug': self.object.slug})
  170 + if self.object.show_window:
  171 + self.request.session['resources'] = {}
  172 + self.request.session['resources']['new_page'] = True
  173 + self.request.session['resources']['new_page_url'] = reverse('youtube:window_view', kwargs = {'slug': self.object.slug})
120 174  
121   - success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
  175 + success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
122 176  
123 177 return success_url
124 178  
... ... @@ -170,6 +224,9 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
170 224 return self.form_invalid(form, pendencies_form)
171 225  
172 226 def form_invalid(self, form, pendencies_form):
  227 + for p_form in pendencies_form.forms:
  228 + p_form.fields['action'].choices = [("", "-------"),("view", _("Visualize")), ("finish", _("Finish"))]
  229 +
173 230 return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
174 231  
175 232 def form_valid(self, form, pendencies_form):
... ... @@ -207,13 +264,13 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
207 264 def get_success_url(self):
208 265 messages.success(self.request, _('The YouTube Video "%s" was updated successfully!')%(self.object.name))
209 266  
210   - #success_url = reverse_lazy('webpages:view', kwargs = {'slug': self.object.slug})
  267 + success_url = reverse_lazy('youtube:view', kwargs = {'slug': self.object.slug})
211 268  
212   - #if self.object.show_window:
213   - # self.request.session['resources'] = {}
214   - # self.request.session['resources']['new_page'] = True
215   - # self.request.session['resources']['new_page_url'] = reverse('webpages:window_view', kwargs = {'slug': self.object.slug})
  269 + if self.object.show_window:
  270 + self.request.session['resources'] = {}
  271 + self.request.session['resources']['new_page'] = True
  272 + self.request.session['resources']['new_page_url'] = reverse('youtube:window_view', kwargs = {'slug': self.object.slug})
216 273  
217   - success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
  274 + success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
218 275  
219 276 return success_url
220 277 \ No newline at end of file
... ...